diff --git a/CHANGELOG.md b/CHANGELOG.md
index 96389a5165f..e24dc6cd422 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,9 @@
 # Release Notes for Craft CMS 4
 
-## Unreleased
+## 4.3.6.1 - 2023-01-09
 
 - Element edit pages now retain their previous scroll position when they’re automatically refreshed to keep up with changes from another browser tab.
+- Fixed a bug where editing certain Matrix/Neo/Super Table fields could result in content loss. ([#12445](https://github.com/craftcms/cms/issues/12445))
 
 ## 4.3.6 - 2023-01-04
 
diff --git a/src/config/app.php b/src/config/app.php
index 7d6fc2b0d5e..5f621cf83ff 100644
--- a/src/config/app.php
+++ b/src/config/app.php
@@ -3,7 +3,7 @@
 return [
     'id' => 'CraftCMS',
     'name' => 'Craft CMS',
-    'version' => '4.3.6',
+    'version' => '4.3.6.1',
     'schemaVersion' => '4.4.0.1',
     'minVersionRequired' => '3.7.11',
     'basePath' => dirname(__DIR__), // Defines the @app alias
diff --git a/src/web/assets/cp/dist/cp.js b/src/web/assets/cp/dist/cp.js
index db9faecfc3f..ac576e913ba 100644
--- a/src/web/assets/cp/dist/cp.js
+++ b/src/web/assets/cp/dist/cp.js
@@ -1,2 +1,2 @@
-(function(){var __webpack_modules__={463:function(){Craft.Accordion=Garnish.Base.extend({$trigger:null,targetSelector:null,_$target:null,init:function(t){var e=this;this.$trigger=$(t),this.$trigger.data("accordion")&&(console.warn("Double-instantiating an accordion trigger on an element"),this.$trigger.data("accordion").destroy()),this.$trigger.data("accordion",this),this.targetSelector=this.$trigger.attr("aria-controls")?"#".concat(this.$trigger.attr("aria-controls")):null,this.targetSelector&&(this._$target=$(this.targetSelector)),this.addListener(this.$trigger,"click","onTriggerClick"),this.addListener(this.$trigger,"keypress",(function(t){var i=t.keyCode;i!==Garnish.SPACE_KEY&&i!==Garnish.RETURN_KEY||(t.preventDefault(),e.onTriggerClick())}))},onTriggerClick:function(){"true"===this.$trigger.attr("aria-expanded")?this.hideTarget(this._$target):this.showTarget(this._$target)},showTarget:function(t){var e=this;if(t&&t.length){this.showTarget._currentHeight=t.height(),t.removeClass("hidden"),this.$trigger.removeClass("collapsed").addClass("expanded").attr("aria-expanded","true");for(var i=0;i<t.length;i++)!function(t){"SPAN"!==t.prop("nodeName")&&(t.height("auto"),e.showTarget._targetHeight=t.height(),t.css({height:e.showTarget._currentHeight,overflow:"hidden"}),t.velocity("stop"),t.velocity({height:e.showTarget._targetHeight},Garnish.getUserPreferredAnimationDuration("fast"),(function(){t.css({height:"",overflow:""})})))}(t.eq(i));delete this.showTarget._targetHeight,delete this.showTarget._currentHeight,Garnish.$win.trigger("resize")}},hideTarget:function(t){if(t&&t.length){this.$trigger.removeClass("expanded").addClass("collapsed").attr("aria-expanded","false");for(var e=0;e<t.length;e++)!function(t){t.hasClass("hidden")||("SPAN"===t.prop("nodeName")?t.addClass("hidden"):(t.css("overflow","hidden"),t.velocity("stop"),t.velocity({height:0},Garnish.getUserPreferredAnimationDuration("fast"),(function(){t.addClass("hidden")}))))}(t.eq(e))}},destroy:function(){this.$trigger.removeData("accordion"),this.base()}})},3839:function(){Craft.AddressesInput=Garnish.Base.extend({$container:null,$addBtn:null,$addBtnItem:null,$cards:null,init:function(t,e){var i=this;this.$container=$(t),this.setSettings(e,Craft.AddressesInput.defaults),this.$container.data("addresses")&&(console.warn("Double-instantiating an address input on an element"),this.$container.data("addresses").destroy()),this.$container.data("addresses",this),this.$addBtn=this.$container.find(".address-cards__add-btn"),this.$addBtnItem=this.$addBtn.closest("li"),this.$cards=this.$container.find("> .address-card");for(var s=0;s<this.$cards.length;s++)this.initCard(this.$cards.eq(s));this.updateAddButton(),this.addListener(this.$addBtn,"click",(function(){i.createAddress()}))},initCard:function(t){var e=this;this.addListener(t,"click",(function(i){$(i.target).closest(".menubtn").length||e.editAddress(t)}));var i=t.find(".menubtn").disclosureMenu();if(i.length){var s=i.data("trigger"),a=s.$container,n=a.find('[data-action="edit"]');this.addListener(n,"click",(function(i){i.stopPropagation(),e.editAddress(t)}));var r=a.find('[data-action="delete"]');this.addListener(r,"click",(function(i){if(i.preventDefault(),i.stopPropagation(),confirm(Craft.t("app","Are you sure you want to delete this address?"))){e.$addBtn.addClass("loading");var n=t.data("id"),r=t.data("draft-id");Craft.sendActionRequest("POST","elements/delete",{data:{elementId:n,draftId:r}}).then((function(){t.remove(),a.remove(),s.destroy(),e.$cards=e.$cards.not(t),e.updateAddButton(),e.trigger("deleteAddress",{addressId:n,draftId:r})})).finally((function(){e.$addBtn.removeClass("loading")}))}}))}},editAddress:function(t,e){var i=this;Craft.createElementEditor("craft\\elements\\Address",t,e).on("submit",(function(e){i.trigger("saveAddress",{data:e.data}),Craft.sendActionRequest("POST","addresses/card-html",{data:{addressId:e.data.id}}).then((function(e){var s=$(e.data.html);t?(t.replaceWith(s),i.$cards=i.$cards.not(t)):s.insertBefore(i.$addBtnItem),Craft.initUiElements(s),i.initCard(s),i.$cards=i.$cards.add(s),i.updateAddButton()}))}))},updateAddButton:function(){this.canCreateAddress()?this.$addBtn.removeClass("hidden"):this.$addBtn.addClass("hidden")},canCreateAddress:function(){return!this.settings.maxAddresses||this.$cards.length<this.settings.maxAddresses},createAddress:function(){var t=this;if(!this.canCreateAddress())throw"No more addresses can be created.";this.$addBtn.addClass("loading"),Craft.sendActionRequest("POST","elements/create",{data:{elementType:"craft\\elements\\Address",ownerId:this.settings.ownerId}}).then((function(e){t.editAddress(null,{elementId:e.data.element.id,draftId:e.data.element.draftId})})).finally((function(){t.$addBtn.removeClass("loading")}))},destroy:function(){this.$container.removeData("addresses"),this.base()}},{ownerId:null,defaults:{maxAddresses:null}})},7452:function(){Craft.AdminTable=Garnish.Base.extend({settings:null,totalItems:null,sorter:null,$noItems:null,$table:null,$tbody:null,$deleteBtns:null,init:function(t){var e=this;this.setSettings(t,Craft.AdminTable.defaults),this.settings.allowDeleteAll||(this.settings.minItems=1),this.$noItems=$(this.settings.noItemsSelector),this.$table=$(this.settings.tableSelector),this.$tbody=this.$table.children("tbody"),this.totalItems=this.$tbody.children().length,this.settings.sortable&&(this.sorter=new Craft.DataTableSorter(this.$table,{onSortChange:this.reorderItems.bind(this)})),this.$deleteBtns=this.$table.find(".delete:not(.disabled)"),this.addListener(this.$deleteBtns,"click","handleDeleteBtnClick"),this.addListener(this.$deleteBtns,"keydown",(function(t){t.keyCode!==Garnish.SPACE_KEY&&t.keyCode!==Garnish.RETURN_KEY||(t.preventDefault(),e.handleDeleteBtnClick(t))})),this.updateUI()},addRow:function(t){if(!(this.settings.maxItems&&this.totalItems>=this.settings.maxItems)){var e=$(t).appendTo(this.$tbody),i=e.find(".delete");this.settings.sortable&&this.sorter.addItems(e),this.$deleteBtns=this.$deleteBtns.add(i),this.addListener(i,"click","handleDeleteBtnClick"),this.totalItems++,this.updateUI()}},reorderItems:function(){var t=this;if(this.settings.sortable){for(var e=[],i=0;i<this.sorter.$items.length;i++){var s=$(this.sorter.$items[i]).attr(this.settings.idAttribute);e.push(s)}var a={ids:JSON.stringify(e)};Craft.sendActionRequest("POST",this.settings.reorderAction,{data:a}).then((function(i){t.onReorderItems(e),Craft.cp.displaySuccess(Craft.t("app",t.settings.reorderSuccessMessage))})).catch((function(e){e.response,Craft.cp.displayError(Craft.t("app",t.settings.reorderFailMessage))}))}},handleDeleteBtnClick:function(t){if(!(this.settings.minItems&&this.totalItems<=this.settings.minItems)){var e=$(t.target).closest("tr");this.confirmDeleteItem(e)&&this.deleteItem(e)}},confirmDeleteItem:function(t){if(!this.settings.confirmDeleteMessage)return!0;var e=this.getItemName(t);return confirm(Craft.t("app",this.settings.confirmDeleteMessage,{name:e}))},deleteItem:function(t){var e=this,i={id:this.getItemId(t)};Craft.sendActionRequest("POST",this.settings.deleteAction,{data:i}).then((function(i){return e.handleDeleteItemSuccess(i.data,t)})).catch((function(i){var s=i.response;return e.handleDeleteItemFailure(s.data,t)}))},handleDeleteItemFailure:function(t,e){this.getItemId(e);var i=this.getItemName(e);Craft.cp.displayError(Craft.t("app",this.settings.deleteFailMessage,{name:i}))},handleDeleteItemSuccess:function(t,e){var i=this.getItemId(e),s=this.getItemName(e);this.sorter&&this.sorter.removeItems(e),e.remove(),this.totalItems--,this.updateUI(),this.onDeleteItem(i),this.settings.deleteSuccessMessage&&Craft.cp.displaySuccess(Craft.t("app",this.settings.deleteSuccessMessage,{name:s}))},onReorderItems:function(t){this.settings.onReorderItems(t)},onDeleteItem:function(t){this.settings.onDeleteItem(t)},getItemId:function(t){return t.attr(this.settings.idAttribute)},getItemName:function(t){return Craft.escapeHtml(t.attr(this.settings.nameAttribute))},updateUI:function(){if(0===this.totalItems?(this.$table.hide(),this.$noItems.removeClass("hidden")):(this.$table.show(),this.$noItems.addClass("hidden")),this.settings.sortable){var t=this.$table.find(".move");1===this.totalItems?t.addClass("disabled"):t.removeClass("disabled")}this.settings.minItems&&this.totalItems<=this.settings.minItems?this.$deleteBtns.addClass("disabled"):this.$deleteBtns.removeClass("disabled"),this.settings.newItemBtnSelector&&(this.settings.maxItems&&this.totalItems>=this.settings.maxItems?$(this.settings.newItemBtnSelector).addClass("hidden"):$(this.settings.newItemBtnSelector).removeClass("hidden"))}},{defaults:{tableSelector:null,noItemsSelector:null,newItemBtnSelector:null,idAttribute:"data-id",nameAttribute:"data-name",sortable:!1,allowDeleteAll:!0,minItems:0,maxItems:null,reorderAction:null,deleteAction:null,reorderSuccessMessage:Craft.t("app","New order saved."),reorderFailMessage:Craft.t("app","Couldn’t save new order."),confirmDeleteMessage:Craft.t("app","Are you sure you want to delete “{name}”?"),deleteSuccessMessage:Craft.t("app","“{name}” deleted."),deleteFailMessage:Craft.t("app","Couldn’t delete “{name}”."),onReorderItems:$.noop,onDeleteItem:$.noop}})},6872:function(){Craft.AssetImageEditor=Garnish.Modal.extend({$body:null,$footer:null,$imageTools:null,$buttons:null,$cancelBtn:null,$replaceBtn:null,$saveBtn:null,$focalPointBtn:null,$editorContainer:null,$straighten:null,$croppingCanvas:null,$spinner:null,$constraintContainer:null,$constraintRadioInputs:null,$customConstraints:null,canvas:null,image:null,viewport:null,focalPoint:null,grid:null,croppingCanvas:null,clipper:null,croppingRectangle:null,cropperHandles:null,cropperGrid:null,croppingShade:null,imageStraightenAngle:0,viewportRotation:0,originalWidth:0,originalHeight:0,imageVerticeCoords:null,zoomRatio:1,animationInProgress:!1,currentView:"",assetId:null,cacheBust:null,draggingCropper:!1,scalingCropper:!1,draggingFocal:!1,previousMouseX:0,previousMouseY:0,shiftKeyHeld:!1,editorHeight:0,editorWidth:0,cropperState:!1,scaleFactor:1,flipData:{},focalPointState:!1,maxImageSize:null,lastLoadedDimensions:null,imageIsLoading:!1,mouseMoveEvent:null,croppingConstraint:!1,constraintOrientation:"landscape",showingCustomConstraint:!1,saving:!1,renderImage:null,renderCropper:null,_queue:null,init:function(t,e){var i=this;this._queue=new Craft.Queue,this.cacheBust=Date.now(),this.setSettings(e,Craft.AssetImageEditor.defaults),null===this.settings.allowDegreeFractions&&(this.settings.allowDegreeFractions=Craft.isImagick),Garnish.prefersReducedMotion()&&(this.settings.animationDuration=1),this.assetId=t,this.flipData={x:0,y:0},this.$container=$('<form class="modal fitted imageeditor"></form>').appendTo(Garnish.$bod),this.$body=$('<div class="body"></div>').appendTo(this.$container),this.$footer=$('<div class="footer"/>').appendTo(this.$container),this.base(this.$container,this.settings),this.$buttons=$('<div class="buttons right"/>').appendTo(this.$footer),this.$cancelBtn=$("<button/>",{type:"button",class:"btn cancel",text:Craft.t("app","Cancel")}).appendTo(this.$buttons),this.settings.allowSavingAsNew&&(this.$saveBtn=Craft.ui.createButton({class:"save copy",label:Craft.t("app","Save as a new asset"),spinner:!0}).appendTo(this.$buttons),this.addListener(this.$saveBtn,"activate",this.saveImage)),this.$replaceBtn=Craft.ui.createSubmitButton({class:"save replace",label:Craft.t("app","Save"),spinner:!0}).appendTo(this.$buttons),this.addListener(this.$replaceBtn,"activate",this.saveImage),this.addListener(this.$cancelBtn,"activate",this.hide),this.removeListener(this.$shade,"click"),this.maxImageSize=this.getMaxImageSize(),Craft.sendActionRequest("POST","assets/image-editor",{data:{assetId:t}}).then((function(t){return i.loadEditor(t.data)}))},getMaxImageSize:function(){var t=Garnish.$doc.get(0).documentElement.clientWidth,e=Garnish.$doc.get(0).documentElement.clientHeight;return Math.max(e,t)*(window.devicePixelRatio>1?2:1)},loadEditor:function(t){var e=this;t.html||alert(Craft.t("app","Could not load the image editor.")),this.$body.html(t.html),this.$tabs=$(".tabs li",this.$body),this.$viewsContainer=$(".views",this.$body),this.$views=$("> div",this.$viewsContainer),this.$imageTools=$(".image-container .image-tools",this.$body),this.$editorContainer=$(".image-container .image",this.$body),this.$constraintContainer=$(".constraint-group",this.$body),this.$constraintRadioInputs=$('[name="constraint"]',this.$constraintContainer),this.$focalPointBtn=$(".focal-point",this.$body),this.editorHeight=this.$editorContainer.innerHeight(),this.editorWidth=this.$editorContainer.innerWidth(),this._showSpinner(),this.updateSizeAndPosition(),$customConstraintWrapper=this.$constraintRadioInputs.filter('[value="custom"]').parent(),this.$customConstraints=$("<div/>",{class:"constraint custom hidden","data-constraint":"custom"}).append($("<input/>",{type:"text",class:"custom-constraint-w",size:3,value:1,"aria-label":Craft.t("app","Width unit")})).append($("<span/>",{class:"custom-constraint-spacer",text:"x","aria-hidden":"true"})).append($("<input/>",{type:"text",class:"custom-constraint-h",size:3,value:1,"aria-label":Craft.t("app","Height unit")})).appendTo($customConstraintWrapper),this.$constraintRadioInputs.filter((function(){var t=$(this).val();return/^\d*\.\d+$/.test(t)})).addClass("flip"),this.canvas=new fabric.StaticCanvas("image-canvas"),this.$croppingCanvas=$("#cropping-canvas",this.$editorContainer),this.$croppingCanvas.width(this.editorWidth),this.$croppingCanvas.height(this.editorHeight),this.canvas.enableRetinaScaling=!0,this.renderImage=function(){Garnish.requestAnimationFrame(e.canvas.renderAll.bind(e.canvas))};var i=Craft.getActionUrl("assets/edit-image",{assetId:this.assetId,size:this.maxImageSize,cacheBust:this.cacheBust});fabric.Image.fromURL(i,(function(i){e.image=i,e.image.set({originX:"center",originY:"center",left:e.editorWidth/2,top:e.editorHeight/2}),e.canvas.add(e.image),e.originalHeight=e.image.getHeight(),e.originalWidth=e.image.getWidth(),e.zoomRatio=1,e.lastLoadedDimensions=e.getScaledImageDimensions(),e._setFittedImageVerticeCoordinates(),e._repositionEditorElements();var s={imageDimensions:e.getScaledImageDimensions(),offsetX:0,offsetY:0},a=!1;if(t.focalPoint){var n=t.focalPoint,r=s.imageDimensions.width*n.x,o=s.imageDimensions.height*n.y;s.offsetX=r-s.imageDimensions.width/2,s.offsetY=o-s.imageDimensions.height/2,a=!0}e.storeFocalPointState(s),a&&e._createFocalPoint(),e._createViewport(),e.storeCropperState(),e._addControlListeners(),e.addListener(e.$croppingCanvas,"mousemove,touchmove",e._handleMouseMove),e.addListener(e.$croppingCanvas,"mousedown,touchstart",e._handleMouseDown),e.addListener(e.$croppingCanvas,"mouseup,touchend",e._handleMouseUp),e.addListener(e.$croppingCanvas,"mouseout,touchcancel",e._handleMouseOut),e._hideSpinner(),e.renderImage(),e.$tabs.first().trigger("click")}))},_reloadImage:function(){var t=this;if(!this.imageIsLoading){this.imageIsLoading=!0,this.maxImageSize=this.getMaxImageSize();var e=Craft.getActionUrl("assets/edit-image",{assetId:this.assetId,size:this.maxImageSize,cacheBust:this.cacheBust});this.image.setSrc(e,(function(e){t.originalHeight=e.getHeight(),t.originalWidth=e.getWidth(),t.lastLoadedDimensions={width:t.originalHeight,height:t.originalWidth},t.updateSizeAndPosition(),t.renderImage(),t.imageIsLoading=!1}))}},updateSizeAndPosition:function(){if(this.$container){var t=window.innerWidth,e=window.innerHeight;this.$container.css({width:t,"min-width":t,left:0,height:e,"min-height":e,top:0}),this.$body.css({height:e-(this.$footer.outerHeight()-1)}),t<e?this.$container.addClass("vertical"):this.$container.removeClass("vertical"),this.$editorContainer&&this.image&&this._repositionEditorElements()}},_repositionEditorElements:function(){var t={width:this.editorWidth,height:this.editorHeight};this.editorHeight=this.$editorContainer.innerHeight(),this.editorWidth=this.$editorContainer.innerWidth(),this.canvas.setDimensions({width:this.editorWidth,height:this.editorHeight});var e=this.getScaledImageDimensions();if("crop"===this.currentView){this.zoomRatio=this.getZoomToFitRatio(this.getScaledImageDimensions());var i=this._getBoundingRectangle(this.imageVerticeCoords);this._setFittedImageVerticeCoordinates(),this._repositionCropper(i)}else this.zoomRatio=this.getZoomToCoverRatio(this.getScaledImageDimensions())*this.scaleFactor;this._repositionImage(t),this._repositionViewport(),this._repositionFocalPoint(t),this._zoomImage(),this.renderImage(),(e.width/this.lastLoadedDimensions.width>1.5||e.height/this.lastLoadedDimensions.height>1.5)&&this._reloadImage()},_repositionImage:function(t){this.image.set({left:this.image.left-(t.width-this.editorWidth)/2,top:this.image.top-(t.height-this.editorHeight)/2})},_createViewport:function(){this.viewport=new fabric.Rect({width:this.image.width,height:this.image.height,fill:"rgba(127,0,0,1)",originX:"center",originY:"center",globalCompositeOperation:"destination-in",left:this.image.left,top:this.image.top}),this.canvas.add(this.viewport),this.renderImage()},_createFocalPoint:function(){var t=this.focalPointState,e=this.getScaledImageDimensions().width/t.imageDimensions.width,i=t.offsetX*e*this.zoomRatio*this.scaleFactor,s=t.offsetY*e*this.zoomRatio*this.scaleFactor;i+=this.image.left,s+=this.image.top;var a=0,n=0;this.viewport&&0===t.offsetX&&0===t.offsetY&&("crop"!==this.currentView?(a=this.viewport.left-this.image.left,n=this.viewport.top-this.image.top):(a=this.clipper.left-this.image.left,n=this.clipper.top-this.image.top),i+=a,s+=n,t.offsetX+=a/(e*this.zoomRatio*this.scaleFactor),t.offsetY+=n/(e*this.zoomRatio*this.scaleFactor)),this.focalPoint=new fabric.Group([new fabric.Circle({radius:8,fill:"rgba(0,0,0,0.5)",strokeWidth:2,stroke:"rgba(255,255,255,0.8)",left:0,top:0,originX:"center",originY:"center"}),new fabric.Circle({radius:1,fill:"rgba(255,255,255,0)",strokeWidth:2,stroke:"rgba(255,255,255,0.8)",left:0,top:0,originX:"center",originY:"center"})],{originX:"center",originY:"center",left:i,top:s}),this.storeFocalPointState(t),this.canvas.add(this.focalPoint)},toggleFocalPoint:function(){this.focalPoint?(this.canvas.remove(this.focalPoint),this.focalPoint=null,this.$focalPointBtn.attr("aria-pressed","false")):(this._createFocalPoint(),this.$focalPointBtn.attr("aria-pressed","true")),this.renderImage()},_repositionViewport:function(){if(this.viewport){var t={left:this.editorWidth/2,top:this.editorHeight/2};if("crop"===this.currentView)t.width=this.editorWidth,t.height=this.editorHeight;else if(this.cropperState){var e=this.cropperState,i=this.getScaledImageDimensions().width/e.imageDimensions.width;t.width=e.width*i*this.zoomRatio,t.height=e.height*i*this.zoomRatio,this.image.set({left:this.editorWidth/2-e.offsetX*i,top:this.editorHeight/2-e.offsetY*i})}else $.extend(t,this.getScaledImageDimensions());this.viewport.set(t)}},_repositionFocalPoint:function(t){if(this.focalPoint){var e=this.focalPoint.left-this.editorWidth/2,i=this.focalPoint.top-this.editorHeight/2,s=this.image.width,a=this.getScaledImageDimensions().width*this.zoomRatio/s/this.scaleFactor;e-=(t.width-this.editorWidth)/2,i-=(t.height-this.editorHeight)/2,e*=a,i*=a,this.focalPoint.set({left:this.editorWidth/2+e,top:this.editorHeight/2+i})}},hasOrientationChanged:function(){return this.viewportRotation%180!=0},getScaledImageDimensions:function(){return void 0===this.getScaledImageDimensions._&&(this.getScaledImageDimensions._={}),this.getScaledImageDimensions._.imageRatio=this.originalHeight/this.originalWidth,this.getScaledImageDimensions._.editorRatio=this.editorHeight/this.editorWidth,this.getScaledImageDimensions._.dimensions={},this.getScaledImageDimensions._.imageRatio>this.getScaledImageDimensions._.editorRatio?(this.getScaledImageDimensions._.dimensions.height=Math.min(this.editorHeight,this.originalHeight),this.getScaledImageDimensions._.dimensions.width=Math.round(this.originalWidth/(this.originalHeight/this.getScaledImageDimensions._.dimensions.height))):(this.getScaledImageDimensions._.dimensions.width=Math.min(this.editorWidth,this.originalWidth),this.getScaledImageDimensions._.dimensions.height=Math.round(this.originalHeight*(this.getScaledImageDimensions._.dimensions.width/this.originalWidth))),this.getScaledImageDimensions._.dimensions},_zoomImage:function(){void 0===this._zoomImage._&&(this._zoomImage._={}),this._zoomImage._.imageDimensions=this.getScaledImageDimensions(),this.image.set({width:this._zoomImage._.imageDimensions.width*this.zoomRatio,height:this._zoomImage._.imageDimensions.height*this.zoomRatio})},_getPrevTab:function(){var t,e=this._getActiveTabIndex();if(!(e<0))return t=e>0?e-1:this.$tabs.length-1,this.$tabs.eq(t)},_getNextTab:function(){var t,e=this._getActiveTabIndex();if(!(e<0))return t=e<this.$tabs.length-1?e+1:0,this.$tabs.eq(t)},_getActiveTab:function(){return this.$tabs.filter('[aria-selected="true"]')},_getActiveTabIndex:function(){var t=this._getActiveTab();if(t.length)return t.index()},_addControlListeners:function(){var t=this;this.addListener(this.$tabs,"click",this._handleTabClick),this.addListener(this.$tabs,"keydown",(function(e){switch(e.keyCode){case Garnish.LEFT_KEY:case Garnish.UP_KEY:e.preventDefault();var i=t._getPrevTab();t.activateTab(i);break;case Garnish.RIGHT_KEY:case Garnish.DOWN_KEY:e.preventDefault();var s=t._getNextTab();t.activateTab(s)}})),this.addListener(this.$focalPointBtn,"click",this.toggleFocalPoint),this.addListener($(".rotate-left"),"click",(function(){this.rotateImage(-90)})),this.addListener($(".rotate-right"),"click",(function(){this.rotateImage(90)})),this.addListener($(".flip-vertical"),"click",(function(){this.flipImage("y")})),this.addListener($(".flip-horizontal"),"click",(function(){this.flipImage("x")})),this.straighteningInput=new Craft.SlideRuleInput("slide-rule",{onStart:function(){t._showGrid()},onChange:function(e){t.straighten(e)},onEnd:function(){t._hideGrid(),t._cleanupFocalPointAfterStraighten()}}),this.addListener(Garnish.$doc,"keydown",(function(t){t.keyCode===Garnish.SHIFT_KEY&&(this.shiftKeyHeld=!0)})),this.addListener(Garnish.$doc,"keyup",(function(t){t.keyCode===Garnish.SHIFT_KEY&&(this.shiftKeyHeld=!1)})),this.addListener(this.$constraintRadioInputs,"change",this._handleConstraintChange),this.addListener($(".orientation input",this.$container),"click",this._handleOrientationClick),this.addListener($(".constraint-group .custom input",this.$container),"keyup",this._applyCustomConstraint)},_handleConstraintClick:function(t){var e=$(t.currentTarget).data("constraint"),i=$(t.currentTarget);if(i.siblings().removeClass("active"),i.addClass("active"),"custom"==e)return this._showCustomConstraint(),void this._applyCustomConstraint();this._hideCustomConstraint(),this.setCroppingConstraint(e),this.enforceCroppingConstraint()},_handleConstraintChange:function(t){var e=$(t.target).val();if("custom"==e)return this._showCustomConstraint(),void this._applyCustomConstraint();this._hideCustomConstraint(),this.setCroppingConstraint(e),this.enforceCroppingConstraint()},_handleOrientationClick:function(t){if(t.currentTarget.value!==this.constraintOrientation){this.constraintOrientation=t.currentTarget.value;for(var e=$(".flip",this.$constraintContainer),i=0;i<e.length;i++){var s=$(e[i]),a='label[for="'+s.attr("id")+'"]',n=$(a,this.$constraintContainer);s.val(1/s.val()),n.html(n.text().split(":").reverse().join(":").replace(/\s/g,""))}e.filter(":checked").trigger("change")}},_applyCustomConstraint:function(){var t=this._getCustomConstraint();t.w>0&&t.h>0&&(this.setCroppingConstraint(t.w/t.h),this.enforceCroppingConstraint())},_getCustomConstraint:function(){var t=parseFloat($(".custom-constraint-w").val()),e=parseFloat($(".custom-constraint-h").val());return{w:isNaN(t)?0:t,h:isNaN(e)?0:e}},_setCustomConstraint:function(t,e){$(".custom-constraint-w").val(parseFloat(t)),$(".custom-constraint-h").val(parseFloat(e))},_hideCustomConstraint:function(){this.showingCustomConstraint=!1,this.$customConstraints.addClass("hidden"),$(".orientation",this.$container).removeClass("hidden")},_showCustomConstraint:function(){this.showingCustomConstraint||(this.showingCustomConstraint=!0,this.$customConstraints.removeClass("hidden"),$(".orientation",this.$container).addClass("hidden"))},_handleTabClick:function(t){if(!this.animationInProgress){var e=$(t.currentTarget);this.activateTab(e)}},activateTab:function(t){var e=$(t).data("view");this.$tabs.removeClass("selected").attr({"aria-selected":"false",tabindex:"-1"}),$(t).addClass("selected").attr({"aria-selected":"true",tabindex:"0"}).trigger("focus"),this.showView(e)},showView:function(t){var e=this;this.currentView!==t&&(this.$views.addClass("hidden"),this.$views.filter('[data-view="'+t+'"]').removeClass("hidden"),"rotate"===t?this.enableSlider():this.disableSlider(),this.updateSizeAndPosition(),"crop"===this.currentView&&"crop"!==t?this._queue.push((function(){return new Promise((function(t,i){e.disableCropMode(),t()}))})):"crop"!==this.currentView&&"crop"===t&&this._queue.push((function(){return new Promise((function(t,i){e.enableCropMode(),t()}))})),this.currentView=t)},storeCropperState:function(t){void 0===this.storeCropperState._&&(this.storeCropperState._={}),t?this.cropperState=t:this.clipper?(this.storeCropperState._.zoomFactor=1/this.zoomRatio,this.cropperState={offsetX:(this.clipper.left-this.image.left)*this.storeCropperState._.zoomFactor,offsetY:(this.clipper.top-this.image.top)*this.storeCropperState._.zoomFactor,height:this.clipper.height*this.storeCropperState._.zoomFactor,width:this.clipper.width*this.storeCropperState._.zoomFactor,imageDimensions:this.getScaledImageDimensions()}):(this.storeCropperState._.dimensions=this.getScaledImageDimensions(),this.cropperState={offsetX:0,offsetY:0,height:this.storeCropperState._.dimensions.height,width:this.storeCropperState._.dimensions.width,imageDimensions:this.storeCropperState._.dimensions})},storeFocalPointState:function(t){void 0===this.storeFocalPointState._&&(this.storeFocalPointState._={}),t?this.focalPointState=t:this.focalPoint&&(this.storeFocalPointState._.zoomFactor=1/this.zoomRatio,this.focalPointState={offsetX:(this.focalPoint.left-this.image.left)*this.storeFocalPointState._.zoomFactor/this.scaleFactor,offsetY:(this.focalPoint.top-this.image.top)*this.storeFocalPointState._.zoomFactor/this.scaleFactor,imageDimensions:this.getScaledImageDimensions()})},rotateImage:function(t){var e=this;if(!this.animationInProgress){if(90!==t&&-90!==t)return!1;this.animationInProgress=!0,this.viewportRotation+=t,this.viewportRotation=parseInt((this.viewportRotation+360)%360,10);var i,s=this.image.angle+t,a=this.getScaledImageDimensions();i=this.hasOrientationChanged()?this.getZoomToCoverRatio({height:a.width,width:a.height}):this.getZoomToCoverRatio(a),this.zoomRatio>i&&(i=this.zoomRatio);var n={angle:90===t?"+=90":"-=90"},r={angle:s,width:a.width*i,height:a.height*i},o=1;this.scaleFactor<1?(o=1/this.scaleFactor,this.scaleFactor=1):(this.viewport.width>this.editorHeight?o=this.editorHeight/this.viewport.width:this.viewport.height>this.editorWidth&&(o=this.editorWidth/this.viewport.height),this.scaleFactor=o),o<1&&(r.width*=o,r.height*=o);var l=this.cropperState,h=l.offsetX,d=l.offsetY,c=t*(Math.PI/180),u=h*Math.cos(c)-d*Math.sin(c),p=h*Math.sin(c)+d*Math.cos(c),f=a.width/l.imageDimensions.width,g=u*f*this.zoomRatio*this.scaleFactor,m=p*f*this.zoomRatio*this.scaleFactor;r.left=this.editorWidth/2-g,r.top=this.editorHeight/2-m,l.offsetX=u,l.offsetY=p;var v=l.width;l.width=l.height,l.height=v,this.storeCropperState(l),this.focalPoint&&this.canvas.remove(this.focalPoint),this.viewport.animate(n,{duration:this.settings.animationDuration,onComplete:function(){var t=e.viewport.height*o;e.viewport.height=e.viewport.width*o,e.viewport.width=t,e.viewport.set({angle:0})}}),this.image.animate(r,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:function(){var i=parseFloat((e.image.angle+360)%360);e.image.set({angle:i}),e.animationInProgress=!1,e.focalPoint?(e._adjustFocalPointByAngle(t),e.straighten(e.straighteningInput),e.canvas.add(e.focalPoint)):e._resetFocalPointPosition()}})}},flipImage:function(t){var e=this;if(!this.animationInProgress){this.animationInProgress=!0,this.hasOrientationChanged()&&(t="y"===t?"x":"y"),this.focalPoint?this.canvas.remove(this.focalPoint):this._resetFocalPointPosition();var i={x:this.editorWidth/2,y:this.editorHeight/2};this.straighteningInput.setValue(-this.imageStraightenAngle),this.imageStraightenAngle=-this.imageStraightenAngle;var s,a,n={angle:this.viewportRotation+this.imageStraightenAngle},r=this.cropperState,o=this.focalPointState;"y"===t&&this.hasOrientationChanged()||"y"!==t&&!this.hasOrientationChanged()?(r.offsetX=-r.offsetX,o.offsetX=-o.offsetX,a=this.image.left-i.x,n.left=i.x-a):(r.offsetY=-r.offsetY,o.offsetY=-o.offsetY,s=this.image.top-i.y,n.top=i.y-s),"y"===t?(n.scaleY=-1*this.image.scaleY,this.flipData.y=1-this.flipData.y):(n.scaleX=-1*this.image.scaleX,this.flipData.x=1-this.flipData.x),this.storeCropperState(r),this.storeFocalPointState(o),this.image.animate(n,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:function(){e.animationInProgress=!1,e.focalPoint&&(e._adjustFocalPointByAngle(0),e.canvas.add(e.focalPoint))}})}},straighten:function(t){if(!this.animationInProgress){this.animationInProgress=!0;var e=this.image.angle;this.imageStraightenAngle=(this.settings.allowDegreeFractions?parseFloat(t.value):Math.round(parseFloat(t.value)))%360,this.image.set({angle:this.viewportRotation+this.imageStraightenAngle}),this.zoomRatio=this.getZoomToCoverRatio(this.getScaledImageDimensions())*this.scaleFactor,this._zoomImage(),this.cropperState&&this._adjustEditorElementsOnStraighten(e),this.renderImage(),this.animationInProgress=!1}},_adjustEditorElementsOnStraighten:function(t){var e,i,s,a,n,r=this.getScaledImageDimensions(),o=this.image.angle-t,l=this.cropperState,h=this.zoomRatio,d=1;do{var c=l.offsetX,u=l.offsetY,p=o*(Math.PI/180);s=c*Math.cos(p)-u*Math.sin(p),a=c*Math.sin(p)+u*Math.cos(p),e=s*h*(n=r.width/l.imageDimensions.width),i=a*h*n;var f=this.getImageVerticeCoords(h),g={width:this.viewport.width,height:this.viewport.height,left:this.editorWidth/2-this.viewport.width/2+e,top:this.editorHeight/2-this.viewport.height/2+i};h*=d=this._getZoomRatioToFitRectangle(g,f)}while(1!==d);this.image.set({left:this.editorWidth/2-e,top:this.editorHeight/2-i}),l.offsetX=s,l.offsetY=a,l.width=this.viewport.width/h/n,l.height=this.viewport.height/h/n,this.storeCropperState(l),this.zoomRatio=h,this.focalPoint?(this._adjustFocalPointByAngle(o),this._isCenterInside(this.focalPoint,this.viewport)?this.focalPoint.set({opacity:1}):this.focalPoint.set({opacity:0})):0!==o&&this._resetFocalPointPosition(),this._zoomImage()},_cleanupFocalPointAfterStraighten:function(){if(this.focalPoint&&!this._isCenterInside(this.focalPoint,this.viewport)){this.focalPoint.set({opacity:1});var t=this.focalPointState;t.offsetX=0,t.offsetY=0,this.storeFocalPointState(t),this.toggleFocalPoint()}},_resetFocalPointPosition:function(){var t=this.focalPointState;t.offsetX=0,t.offsetY=0,this.storeFocalPointState(t)},_isCenterInside:function(t,e){return t.left>e.left-e.width/2&&t.top>e.top-e.height/2&&t.left<e.left+e.width/2&&t.top<e.top+e.height/2},_adjustFocalPointByAngle:function(t){var e=t*(Math.PI/180),i=this.focalPointState,s=i.offsetX,a=i.offsetY,n=s*Math.cos(e)-a*Math.sin(e),r=s*Math.sin(e)+a*Math.cos(e),o=this.getScaledImageDimensions().width/i.imageDimensions.width,l=n*o*this.zoomRatio,h=r*o*this.zoomRatio;this.focalPoint.left=this.image.left+l,this.focalPoint.top=this.image.top+h,i.offsetX=n,i.offsetY=r,this.storeFocalPointState(i)},_getZoomRatioToFitRectangle:function(t,e){for(var i,s,a=this._getRectangleVertices(t),n=0;n<a.length&&(i=a[n],this.arePointsInsideRectangle([i],e));n++)i=!1;if(i){var r=this._getEdgeCrossed(e,i),o={x:t.left+t.width/2,y:t.top+t.height/2},l=Math.abs((r[1].y-r[0].y)*i.x-(r[1].x-r[0].x)*i.y+r[1].x*r[0].y-r[1].y*r[0].x)/Math.sqrt(Math.pow(r[1].y-r[0].y,2)+Math.pow(r[1].x-r[0].x,2)),h=Math.abs((r[1].y-r[0].y)*o.x-(r[1].x-r[0].x)*o.y+r[1].x*r[0].y-r[1].y*r[0].x)/Math.sqrt(Math.pow(r[1].y-r[0].y,2)+Math.pow(r[1].x-r[0].x,2));s=(l+h)/h}else s=1;return s},saveImage:function(t){var e=this,i=$(t.currentTarget);if(this.saving)return!1;this.saving=!0,i.addClass("loading");var s=i.hasClass("replace"),a={assetId:this.assetId,viewportRotation:this.viewportRotation,imageRotation:this.imageStraightenAngle,replace:s?1:0};if(this.cropperState){var n={};n.height=this.cropperState.height,n.width=this.cropperState.width,n.offsetX=this.cropperState.offsetX,n.offsetY=this.cropperState.offsetY,a.imageDimensions=this.cropperState.imageDimensions,a.cropData=n}else a.imageDimensions=this.getScaledImageDimensions();this.focalPoint&&(a.focalPoint=this.focalPointState),a.flipData=this.flipData,a.zoom=this.zoomRatio,Craft.sendActionRequest("POST","assets/save-image",{data:a}).then((function(t){var i=t.data;e.onSave(i),s&&Craft.broadcaster&&Craft.broadcaster.postMessage({event:"saveElement",id:e.assetId}),e.hide(),Craft.cp.runQueue(),Craft.Preview.refresh()})).catch((function(t){var e=t.response;alert(e.data.message)})).finally((function(){e.$buttons.find(".btn").removeClass("loading"),e.saving=!1}))},getZoomToCoverRatio:function(t){var e=Math.abs(this.imageStraightenAngle)*(Math.PI/180),i=Math.sin(e)*t.height+Math.cos(e)*t.width,s=Math.sin(e)*t.width+Math.cos(e)*t.height;return Math.max(i/t.width,s/t.height)},getZoomToFitRatio:function(t){var e=this._getImageBoundingBox(t),i=1;if(e.height>this.editorHeight||e.width>this.editorWidth){var s=this.editorHeight/e.height,a=this.editorWidth/e.width;i=Math.min(a,s)}return i},getCombinedZoomRatio:function(t){return this.getZoomToCoverRatio(t)/this.getZoomToFitRatio(t)},_showGrid:function(){if(!this.grid){var t,e={strokeWidth:1,stroke:"rgba(255,255,255,0.5)"},i=this.viewport.width,s=this.viewport.height,a=i/9,n=s/9,r=[new fabric.Rect({strokeWidth:2,stroke:"rgba(255,255,255,1)",originX:"center",originY:"center",width:i,height:s,left:i/2,top:s/2,fill:"rgba(255,255,255,0)"})];for(t=1;t<=8;t++)r.push(new fabric.Line([t*a,0,t*a,s],e));for(t=1;t<=8;t++)r.push(new fabric.Line([0,t*n,i,t*n],e));this.grid=new fabric.Group(r,{left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",angle:this.viewport.angle}),this.canvas.add(this.grid),this.renderImage()}},_hideGrid:function(){this.canvas.remove(this.grid),this.grid=null,this.renderImage()},onFadeOut:function(){this.destroy()},show:function(){this.base(),Garnish.$bod.addClass("no-scroll")},hide:function(){this.removeAllListeners(),this.straighteningInput.removeAllListeners(),Garnish.$bod.removeClass("no-scroll"),this.base()},onSave:function(t){this.settings.onSave(t),this.trigger("save")},enableSlider:function(){this.$imageTools.removeClass("hidden")},disableSlider:function(){this.$imageTools.addClass("hidden")},enableCropMode:function(){var t=this,e=this.getScaledImageDimensions();this.zoomRatio=this.getZoomToFitRatio(e);var i={width:this.editorWidth,height:this.editorHeight},s={width:e.width*this.zoomRatio,height:e.height*this.zoomRatio,left:this.editorWidth/2,top:this.editorHeight/2};this._editorModeTransition((function(){t._setFittedImageVerticeCoordinates();var e=t.cropperState,i=t.getScaledImageDimensions(),s=i.width/e.imageDimensions.width,a={left:t.image.left+e.offsetX*s*t.zoomRatio,top:t.image.top+e.offsetY*s*t.zoomRatio,width:e.width*s*t.zoomRatio,height:e.height*s*t.zoomRatio};t._showCropper(a),t.focalPoint&&(s=i.width/t.focalPointState.imageDimensions.width,t.focalPoint.left=t.image.left+t.focalPointState.offsetX*s*t.zoomRatio,t.focalPoint.top=t.image.top+t.focalPointState.offsetY*s*t.zoomRatio,t.canvas.add(t.focalPoint))}),s,i)},disableCropMode:function(){var t=this,e={};this._hideCropper();var i=this.getScaledImageDimensions(),s=this.getZoomToCoverRatio(i)*this.scaleFactor,a=s/this.zoomRatio;this.zoomRatio=s;var n={width:i.width*this.zoomRatio,height:i.height*this.zoomRatio,left:this.editorWidth/2,top:this.editorHeight/2},r=(this.clipper.left-this.image.left)*a,o=(this.clipper.top-this.image.top)*a;n.left=this.editorWidth/2-r,n.top=this.editorHeight/2-o,e.height=this.clipper.height*a,e.width=this.clipper.width*a,(!this.focalPoint||this.focalPoint&&!this._isCenterInside(this.focalPoint,this.clipper))&&(this.focalPoint&&this.toggleFocalPoint(),this._resetFocalPointPosition()),this._editorModeTransition((function(){if(t.focalPoint){var e=t.getScaledImageDimensions().width/t.focalPointState.imageDimensions.width;t.focalPoint.left=t.image.left+t.focalPointState.offsetX*e*t.zoomRatio,t.focalPoint.top=t.image.top+t.focalPointState.offsetY*e*t.zoomRatio,t.canvas.add(t.focalPoint)}}),n,e)},_editorModeTransition:function(t,e,i){var s=this;this._queue.pause(),this.animationInProgress||(this.animationInProgress=!0,this.focalPoint&&(this.canvas.remove(this.focalPoint),this.renderImage()),this.image.animate(e,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:function(){t(),s.animationInProgress=!1,s.renderImage(),s._queue.resume()}}),this.viewport.animate(i,{duration:this.settings.animationDuration}))},_showSpinner:function(){this.$spinner||(this.$spinner=$('<div class="spinner big spinner-absolute"/>')),this.$spinner.appendTo(this.$container.find(".image"))},_hideSpinner:function(){this.$spinner.remove()},_showCropper:function(t){this._setupCropperLayer(t),this._redrawCropperElements(),this.renderCropper()},_hideCropper:function(){this.clipper&&(this.croppingCanvas.remove(this.clipper),this.croppingCanvas.remove(this.croppingShade),this.croppingCanvas.remove(this.cropperHandles),this.croppingCanvas.remove(this.cropperGrid),this.croppingCanvas.remove(this.croppingRectangle),this.croppingCanvas=null,this.renderCropper=null)},_setupCropperLayer:function(t){var e=this;this.croppingCanvas=new fabric.StaticCanvas("cropping-canvas",{backgroundColor:"rgba(0,0,0,0)",hoverCursor:"default",selection:!1}),this.croppingCanvas.setDimensions({width:this.editorWidth,height:this.editorHeight}),this.renderCropper=function(){return Garnish.requestAnimationFrame(e.croppingCanvas.renderAll.bind(e.croppingCanvas))},$("#cropping-canvas",this.$editorContainer).css({position:"absolute",top:0,left:0}),this.croppingShade=new fabric.Rect({left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",width:this.editorWidth,height:this.editorHeight,fill:"rgba(0,0,0,0.7)"});var i=this.getScaledImageDimensions(),s=0===this.imageStraightenAngle?1:1.2*this.getCombinedZoomRatio(i),a=i.width/s,n=i.height/s;if(this.hasOrientationChanged()){var r=n;n=a,a=r}this.clipper=new fabric.Rect({left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",width:a,height:n,stroke:"black",fill:"rgba(128,0,0,1)",strokeWidth:0}),t&&this.clipper.set(t),this.clipper.globalCompositeOperation="destination-out",this.croppingCanvas.add(this.croppingShade),this.croppingCanvas.add(this.clipper)},_redrawCropperElements:function(){void 0===this._redrawCropperElements._&&(this._redrawCropperElements._={}),this.cropperHandles&&(this.croppingCanvas.remove(this.cropperHandles),this.croppingCanvas.remove(this.cropperGrid),this.croppingCanvas.remove(this.croppingRectangle)),this._redrawCropperElements._.lineOptions={strokeWidth:4,stroke:"rgb(255,255,255)",fill:!1},this._redrawCropperElements._.gridOptions={strokeWidth:2,stroke:"rgba(255,255,255,0.5)"},this._redrawCropperElements._.pathGroup=[new fabric.Path("M 0,10 L 0,0 L 10,0",this._redrawCropperElements._.lineOptions),new fabric.Path("M "+(this.clipper.width-8)+",0 L "+(this.clipper.width+4)+",0 L "+(this.clipper.width+4)+",10",this._redrawCropperElements._.lineOptions),new fabric.Path("M "+(this.clipper.width+4)+","+(this.clipper.height-8)+" L"+(this.clipper.width+4)+","+(this.clipper.height+4)+" L "+(this.clipper.width-8)+","+(this.clipper.height+4),this._redrawCropperElements._.lineOptions),new fabric.Path("M 10,"+(this.clipper.height+4)+" L 0,"+(this.clipper.height+4)+" L 0,"+(this.clipper.height-8),this._redrawCropperElements._.lineOptions)],this.cropperHandles=new fabric.Group(this._redrawCropperElements._.pathGroup,{left:this.clipper.left,top:this.clipper.top,originX:"center",originY:"center"}),this.croppingRectangle=new fabric.Rect({left:this.clipper.left,top:this.clipper.top,width:this.clipper.width,height:this.clipper.height,fill:"rgba(0,0,0,0)",stroke:"rgba(255,255,255,0.8)",strokeWidth:2,originX:"center",originY:"center"}),this.cropperGrid=new fabric.Group([new fabric.Line([.33*this.clipper.width,0,.33*this.clipper.width,this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([.66*this.clipper.width,0,.66*this.clipper.width,this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([0,.33*this.clipper.height,this.clipper.width,.33*this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([0,.66*this.clipper.height,this.clipper.width,.66*this.clipper.height],this._redrawCropperElements._.gridOptions)],{left:this.clipper.left,top:this.clipper.top,originX:"center",originY:"center"}),this._redrawCropperElements._.cropTextTop=this.croppingRectangle.top+this.clipper.height/2+12,this._redrawCropperElements._.cropTextBackgroundColor="rgba(0,0,0,0)",this._redrawCropperElements._.cropTextTop+12>this.editorHeight-2&&(this._redrawCropperElements._.cropTextTop-=24,this._redrawCropperElements._.cropTextBackgroundColor="rgba(0,0,0,0.5)"),this.croppingCanvas.add(this.cropperHandles),this.croppingCanvas.add(this.cropperGrid),this.croppingCanvas.add(this.croppingRectangle)},_repositionCropper:function(t){if(this.croppingCanvas){var e=this.clipper.left-this.croppingCanvas.width/2,i=this.clipper.top-this.croppingCanvas.height/2;this.croppingCanvas.setDimensions({width:this.editorWidth,height:this.editorHeight});var s=this._getBoundingRectangle(this.imageVerticeCoords).width/t.width;this.clipper.width=Math.round(this.clipper.width*s),this.clipper.height=Math.round(this.clipper.height*s),this.clipper.left=this.editorWidth/2+e*s,this.clipper.top=this.editorHeight/2+i*s,this.croppingShade.set({width:this.editorWidth,height:this.editorHeight,left:this.editorWidth/2,top:this.editorHeight/2}),this._redrawCropperElements(),this.renderCropper()}},_getBoundingRectangle:function(t){return{width:Math.max(t.a.x,t.b.x,t.c.x,t.d.x)-Math.min(t.a.x,t.b.x,t.c.x,t.d.x),height:Math.max(t.a.y,t.b.y,t.c.y,t.d.y)-Math.min(t.a.y,t.b.y,t.c.y,t.d.y)}},_handleMouseDown:function(t){var e=this.focalPoint&&this._isMouseOver(t,this.focalPoint),i=this.croppingCanvas&&this._isMouseOver(t,this.clipper),s=this.croppingCanvas&&this._cropperHandleHitTest(t);(s||i||e)&&(this.previousMouseX=t.pageX,this.previousMouseY=t.pageY,e?this.draggingFocal=!0:s?this.scalingCropper=s:i&&(this.draggingCropper=!0))},_handleMouseMove:function(t){null!==this.mouseMoveEvent&&Garnish.requestAnimationFrame(this._handleMouseMoveInternal.bind(this)),this.mouseMoveEvent=t},_handleMouseMoveInternal:function(){null!==this.mouseMoveEvent&&(this.focalPoint&&this.draggingFocal?(this._handleFocalDrag(this.mouseMoveEvent),this.storeFocalPointState(),this.renderImage()):this.draggingCropper||this.scalingCropper?(this.draggingCropper?this._handleCropperDrag(this.mouseMoveEvent):this._handleCropperResize(this.mouseMoveEvent),this._redrawCropperElements(),this.storeCropperState(),this.renderCropper()):this._setMouseCursor(this.mouseMoveEvent),this.previousMouseX=this.mouseMoveEvent.pageX,this.previousMouseY=this.mouseMoveEvent.pageY,this.mouseMoveEvent=null)},_handleMouseUp:function(){this.draggingCropper=!1,this.scalingCropper=!1,this.draggingFocal=!1},_handleMouseOut:function(t){this._handleMouseUp(t),this.mouseMoveEvent=t,this._handleMouseMoveInternal()},_handleCropperDrag:function(t){if(void 0===this._handleCropperDrag._&&(this._handleCropperDrag._={}),this._handleCropperDrag._.deltaX=t.pageX-this.previousMouseX,this._handleCropperDrag._.deltaY=t.pageY-this.previousMouseY,0===this._handleCropperDrag._.deltaX&&0===this._handleCropperDrag._.deltaY)return!1;if(this._handleCropperDrag._.rectangle={left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height},this._handleCropperDrag._.vertices=this._getRectangleVertices(this._handleCropperDrag._.rectangle,this._handleCropperDrag._.deltaX,this._handleCropperDrag._.deltaY),!this.arePointsInsideRectangle(this._handleCropperDrag._.vertices,this.imageVerticeCoords)){for(this._handleCropperDrag._.dxi=0,this._handleCropperDrag._.dyi=0,this._handleCropperDrag._.xStep=this._handleCropperDrag._.deltaX>0?-1:1,this._handleCropperDrag._.yStep=this._handleCropperDrag._.deltaY>0?-1:1,this._handleCropperDrag._.furthest=0,this._handleCropperDrag._.furthestDeltas={},this._handleCropperDrag._.dxi=Math.min(Math.abs(this._handleCropperDrag._.deltaX),10);this._handleCropperDrag._.dxi>=0;this._handleCropperDrag._.dxi--)for(this._handleCropperDrag._.dyi=Math.min(Math.abs(this._handleCropperDrag._.deltaY),10);this._handleCropperDrag._.dyi>=0;this._handleCropperDrag._.dyi--)this._handleCropperDrag._.vertices=this._getRectangleVertices(this._handleCropperDrag._.rectangle,this._handleCropperDrag._.dxi*(this._handleCropperDrag._.deltaX>0?1:-1),this._handleCropperDrag._.dyi*(this._handleCropperDrag._.deltaY>0?1:-1)),this.arePointsInsideRectangle(this._handleCropperDrag._.vertices,this.imageVerticeCoords)&&this._handleCropperDrag._.dxi+this._handleCropperDrag._.dyi>this._handleCropperDrag._.furthest&&(this._handleCropperDrag._.furthest=this._handleCropperDrag._.dxi+this._handleCropperDrag._.dyi,this._handleCropperDrag._.furthestDeltas={x:this._handleCropperDrag._.dxi*(this._handleCropperDrag._.deltaX>0?1:-1),y:this._handleCropperDrag._.dyi*(this._handleCropperDrag._.deltaY>0?1:-1)});if(0==this._handleCropperDrag._.furthest)return;this._handleCropperDrag._.deltaX=this._handleCropperDrag._.furthestDeltas.x,this._handleCropperDrag._.deltaY=this._handleCropperDrag._.furthestDeltas.y}this.clipper.set({left:this.clipper.left+this._handleCropperDrag._.deltaX,top:this.clipper.top+this._handleCropperDrag._.deltaY})},_handleFocalDrag:function(t){if(void 0===this._handleFocalDrag._&&(this._handleFocalDrag._={}),this.focalPoint){if(this._handleFocalDrag._.deltaX=t.pageX-this.previousMouseX,this._handleFocalDrag._.deltaY=t.pageY-this.previousMouseY,0===this._handleFocalDrag._.deltaX&&0===this._handleFocalDrag._.deltaY)return;if(this._handleFocalDrag._.newX=this.focalPoint.left+this._handleFocalDrag._.deltaX,this._handleFocalDrag._.newY=this.focalPoint.top+this._handleFocalDrag._.deltaY,"crop"===this.currentView){if(!this.arePointsInsideRectangle([{x:this._handleFocalDrag._.newX,y:this._handleFocalDrag._.newY}],this.imageVerticeCoords))return}else if(!(this.viewport.left-this.viewport.width/2-this._handleFocalDrag._.newX<0&&this.viewport.left+this.viewport.width/2-this._handleFocalDrag._.newX>0&&this.viewport.top-this.viewport.height/2-this._handleFocalDrag._.newY<0&&this.viewport.top+this.viewport.height/2-this._handleFocalDrag._.newY>0))return;this.focalPoint.set({left:this.focalPoint.left+this._handleFocalDrag._.deltaX,top:this.focalPoint.top+this._handleFocalDrag._.deltaY})}},setCroppingConstraint:function(t){switch(this.updateSizeAndPosition(),t){case"none":this.croppingConstraint=!1;break;case"original":this.croppingConstraint=this.originalWidth/this.originalHeight;break;case"current":this.croppingConstraint=this.clipper.width/this.clipper.height;break;case"custom":break;default:this.croppingConstraint=parseFloat(t)}},enforceCroppingConstraint:function(){var t=this;void 0===this.enforceCroppingConstraint._&&(this.enforceCroppingConstraint._={}),!this.animationInProgress&&this.croppingConstraint&&(this.animationInProgress=!0,this.enforceCroppingConstraint._.rectangle={left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height},this.clipper.width>this.clipper.height*this.croppingConstraint?(this.enforceCroppingConstraint._.previousHeight=this.enforceCroppingConstraint._.rectangle.height,this.enforceCroppingConstraint._.rectangle.height=this.clipper.width/this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.top-=(this.enforceCroppingConstraint._.rectangle.height-this.enforceCroppingConstraint._.previousHeight)/2,this.arePointsInsideRectangle(this._getRectangleVertices(this.enforceCroppingConstraint._.rectangle),this.imageVerticeCoords)||(this.enforceCroppingConstraint._.rectangle.width=this.clipper.height*this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.height=this.enforceCroppingConstraint._.rectangle.width/this.croppingConstraint)):(this.enforceCroppingConstraint._.previousWidth=this.enforceCroppingConstraint._.rectangle.width,this.enforceCroppingConstraint._.rectangle.width=this.clipper.height*this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.left-=(this.enforceCroppingConstraint._.rectangle.width-this.enforceCroppingConstraint._.previousWidth)/2,this.arePointsInsideRectangle(this._getRectangleVertices(this.enforceCroppingConstraint._.rectangle),this.imageVerticeCoords)||(this.enforceCroppingConstraint._.rectangle.height=this.clipper.width/this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.width=this.enforceCroppingConstraint._.rectangle.height*this.croppingConstraint)),this.enforceCroppingConstraint._.properties={height:this.enforceCroppingConstraint._.rectangle.height,width:this.enforceCroppingConstraint._.rectangle.width},this.clipper.animate(this.enforceCroppingConstraint._.properties,{onChange:function(){t._redrawCropperElements(),t.croppingCanvas.renderAll()},duration:this.settings.animationDuration,onComplete:function(){t._redrawCropperElements(),t.animationInProgress=!1,t.renderCropper(),t.storeCropperState()}}))},_handleCropperResize:function(t){void 0===this._handleCropperResize._&&(this._handleCropperResize._={}),this._handleCropperResize._.deltaX=t.pageX-this.previousMouseX,this._handleCropperResize._.deltaY=t.pageY-this.previousMouseY,"b"!==this.scalingCropper&&"t"!==this.scalingCropper||(this._handleCropperResize._.deltaX=0),"l"!==this.scalingCropper&&"r"!==this.scalingCropper||(this._handleCropperResize._.deltaY=0),0===this._handleCropperResize._.deltaX&&0===this._handleCropperResize._.deltaY||(this._handleCropperResize._.startingRectangle={left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height},this._handleCropperResize._.rectangle=this._calculateNewCropperSizeByDeltas(this._handleCropperResize._.startingRectangle,this._handleCropperResize._.deltaX,this._handleCropperResize._.deltaY,this.scalingCropper),this._handleCropperResize._.rectangle.height<30||this._handleCropperResize._.rectangle.width<30||this.arePointsInsideRectangle(this._getRectangleVertices(this._handleCropperResize._.rectangle),this.imageVerticeCoords)&&(this.clipper.set({top:this._handleCropperResize._.rectangle.top+this._handleCropperResize._.rectangle.height/2,left:this._handleCropperResize._.rectangle.left+this._handleCropperResize._.rectangle.width/2,width:this._handleCropperResize._.rectangle.width,height:this._handleCropperResize._.rectangle.height}),this._redrawCropperElements()))},_calculateNewCropperSizeByDeltas:function(t,e,i,s){if(void 0===this._calculateNewCropperSizeByDeltas._&&(this._calculateNewCropperSizeByDeltas._={}),this._calculateNewCropperSizeByDeltas._.topDelta=0,this._calculateNewCropperSizeByDeltas._.leftDelta=0,this._calculateNewCropperSizeByDeltas._.rectangle=t,this._calculateNewCropperSizeByDeltas._.deltaX=e,this._calculateNewCropperSizeByDeltas._.deltaY=i,this.croppingConstraint){switch(this._calculateNewCropperSizeByDeltas._.change=0,s){case"t":this._calculateNewCropperSizeByDeltas._.change=-this._calculateNewCropperSizeByDeltas._.deltaY;break;case"b":this._calculateNewCropperSizeByDeltas._.change=this._calculateNewCropperSizeByDeltas._.deltaY;break;case"r":this._calculateNewCropperSizeByDeltas._.change=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"l":this._calculateNewCropperSizeByDeltas._.change=-this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tr":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?-this._calculateNewCropperSizeByDeltas._.deltaY:this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tl":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?-this._calculateNewCropperSizeByDeltas._.deltaY:-this._calculateNewCropperSizeByDeltas._.deltaX;break;case"br":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?this._calculateNewCropperSizeByDeltas._.deltaY:this._calculateNewCropperSizeByDeltas._.deltaX;break;case"bl":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?this._calculateNewCropperSizeByDeltas._.deltaY:-this._calculateNewCropperSizeByDeltas._.deltaX}switch(this.croppingConstraint>1?(this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.change,this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.deltaX/this.croppingConstraint):(this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.change,this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.deltaY*this.croppingConstraint),this._calculateNewCropperSizeByDeltas._.rectangle.height+=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.width+=this._calculateNewCropperSizeByDeltas._.deltaX,s){case"t":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX/2;break;case"b":this._calculateNewCropperSizeByDeltas._.rectangle.left+=-this._calculateNewCropperSizeByDeltas._.deltaX/2;break;case"r":this._calculateNewCropperSizeByDeltas._.rectangle.top+=-this._calculateNewCropperSizeByDeltas._.deltaY/2;break;case"l":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY/2,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tr":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY;break;case"tl":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"bl":this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX}}else!this.shiftKeyHeld||"tl"!==s&&"tr"!==s&&"bl"!==s&&"br"!==s||(this._calculateNewCropperSizeByDeltas._.ratio,Math.abs(e)>Math.abs(i)?(this._calculateNewCropperSizeByDeltas._.ratio=t.width/t.height,this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.deltaX/this._calculateNewCropperSizeByDeltas._.ratio,this._calculateNewCropperSizeByDeltas._.deltaY*="tr"===s||"bl"===s?-1:1):(this._calculateNewCropperSizeByDeltas._.ratio=t.width/t.height,this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.deltaY*this._calculateNewCropperSizeByDeltas._.ratio,this._calculateNewCropperSizeByDeltas._.deltaX*="tr"===s||"bl"===s?-1:1)),s.match(/t/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.top+=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.height-=this._calculateNewCropperSizeByDeltas._.deltaY),s.match(/b/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.height+=this._calculateNewCropperSizeByDeltas._.deltaY),s.match(/r/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.width+=this._calculateNewCropperSizeByDeltas._.deltaX),s.match(/l/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.left+=this._calculateNewCropperSizeByDeltas._.deltaX,this._calculateNewCropperSizeByDeltas._.rectangle.width-=this._calculateNewCropperSizeByDeltas._.deltaX);return this._calculateNewCropperSizeByDeltas._.rectangle.top=this._calculateNewCropperSizeByDeltas._.rectangle.top,this._calculateNewCropperSizeByDeltas._.rectangle.left=this._calculateNewCropperSizeByDeltas._.rectangle.left,this._calculateNewCropperSizeByDeltas._.rectangle.width=this._calculateNewCropperSizeByDeltas._.rectangle.width,this._calculateNewCropperSizeByDeltas._.rectangle.height=this._calculateNewCropperSizeByDeltas._.rectangle.height,this._calculateNewCropperSizeByDeltas._.rectangle},_setMouseCursor:function(t){void 0===this._setMouseCursor._&&(this._setMouseCursor._={}),Garnish.isMobileBrowser(!0)||(this._setMouseCursor._.cursor="default",this._setMouseCursor._.handle=this.croppingCanvas&&this._cropperHandleHitTest(t),this.focalPoint&&this._isMouseOver(t,this.focalPoint)?this._setMouseCursor._.cursor="pointer":this._setMouseCursor._.handle?"t"===this._setMouseCursor._.handle||"b"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="ns-resize":"l"===this._setMouseCursor._.handle||"r"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="ew-resize":"tl"===this._setMouseCursor._.handle||"br"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="nwse-resize":"bl"!==this._setMouseCursor._.handle&&"tr"!==this._setMouseCursor._.handle||(this._setMouseCursor._.cursor="nesw-resize"):this.croppingCanvas&&this._isMouseOver(t,this.clipper)&&(this._setMouseCursor._.cursor="move"),$(".body").css("cursor",this._setMouseCursor._.cursor))},_cropperHandleHitTest:function(t){if(void 0===this._cropperHandleHitTest._&&(this._cropperHandleHitTest._={}),this._cropperHandleHitTest._.parentOffset=this.$croppingCanvas.offset(),this._cropperHandleHitTest._.mouseX=t.pageX-this._cropperHandleHitTest._.parentOffset.left,this._cropperHandleHitTest._.mouseY=t.pageY-this._cropperHandleHitTest._.parentOffset.top,this._cropperHandleHitTest._.lb=this.clipper.left-this.clipper.width/2,this._cropperHandleHitTest._.rb=this._cropperHandleHitTest._.lb+this.clipper.width,this._cropperHandleHitTest._.tb=this.clipper.top-this.clipper.height/2,this._cropperHandleHitTest._.bb=this._cropperHandleHitTest._.tb+this.clipper.height,this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb-3){if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.tb+10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb-3)return"tl";if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb+3&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.bb-10)return"bl"}if(this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.rb-13&&this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb+3){if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.tb+10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb-3)return"tr";if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb+2&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.bb-10)return"br"}return this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.lb+3&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb-3&&this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb-10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb+10?"l":this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb+1&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.rb-5&&this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb-10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb+10?"r":this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.tb+4&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb-2&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb-10?"t":this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb+2&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.bb-4&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb-10&&"b"},_isMouseOver:function(t,e){return void 0===this._isMouseOver._&&(this._isMouseOver._={}),this._isMouseOver._.parentOffset=this.$croppingCanvas.offset(),this._isMouseOver._.mouseX=t.pageX-this._isMouseOver._.parentOffset.left,this._isMouseOver._.mouseY=t.pageY-this._isMouseOver._.parentOffset.top,this._isMouseOver._.lb=e.left-e.width/2,this._isMouseOver._.rb=this._isMouseOver._.lb+e.width,this._isMouseOver._.tb=e.top-e.height/2,this._isMouseOver._.bb=this._isMouseOver._.tb+e.height,this._isMouseOver._.mouseX>=this._isMouseOver._.lb&&this._isMouseOver._.mouseX<=this._isMouseOver._.rb&&this._isMouseOver._.mouseY>=this._isMouseOver._.tb&&this._isMouseOver._.mouseY<=this._isMouseOver._.bb},_getRectangleVertices:function(t,e,i){return void 0===this._getRectangleVertices._&&(this._getRectangleVertices._={}),void 0===e&&(e=0),void 0===i&&(i=0),this._getRectangleVertices._.topLeft={x:t.left+e,y:t.top+i},this._getRectangleVertices._.topRight={x:this._getRectangleVertices._.topLeft.x+t.width,y:this._getRectangleVertices._.topLeft.y},this._getRectangleVertices._.bottomRight={x:this._getRectangleVertices._.topRight.x,y:this._getRectangleVertices._.topRight.y+t.height},this._getRectangleVertices._.bottomLeft={x:this._getRectangleVertices._.topLeft.x,y:this._getRectangleVertices._.bottomRight.y},[this._getRectangleVertices._.topLeft,this._getRectangleVertices._.topRight,this._getRectangleVertices._.bottomRight,this._getRectangleVertices._.bottomLeft]},_setFittedImageVerticeCoordinates:function(){this.imageVerticeCoords=this.getImageVerticeCoords("fit")},getImageVerticeCoords:function(t){var e,i=-1*((this.hasOrientationChanged()?90:0)+this.imageStraightenAngle)*(Math.PI/180),s=this.getScaledImageDimensions();e="number"==typeof t?t:"cover"===t?this.getZoomToCoverRatio(s):this.getZoomToFitRatio(s);var a=s.height*e,n=s.width*e,r=Math.cos(i)*a,o=Math.sin(i)*n,l=Math.cos(i)*n,h=Math.sin(i)*a,d=(this.editorHeight-(r+o))/2,c=(this.editorWidth-(h+l))/2;return{a:{x:c+l,y:d},b:{x:this.editorWidth-c,y:d+r},c:{x:c+h,y:this.editorHeight-d},d:{x:c,y:d+o}}},_debug:function(t){this.canvas.remove(this.debugger),this.debugger=t,this.canvas.add(this.debugger)},arePointsInsideRectangle:function(t,e){for(void 0===this.arePointsInsideRectangle._&&(this.arePointsInsideRectangle._={}),this.arePointsInsideRectangle._.ab=this._getVector(e.a,e.b),this.arePointsInsideRectangle._.bc=this._getVector(e.b,e.c),this.arePointsInsideRectangle._.scalarAbAb=this._getScalarProduct(this.arePointsInsideRectangle._.ab,this.arePointsInsideRectangle._.ab),this.arePointsInsideRectangle._.scalarBcBc=this._getScalarProduct(this.arePointsInsideRectangle._.bc,this.arePointsInsideRectangle._.bc),this.arePointsInsideRectangle._.i=0;this.arePointsInsideRectangle._.i<t.length;this.arePointsInsideRectangle._.i++)if(this.arePointsInsideRectangle._.point=t[this.arePointsInsideRectangle._.i],this.arePointsInsideRectangle._.ap=this._getVector(e.a,this.arePointsInsideRectangle._.point),this.arePointsInsideRectangle._.bp=this._getVector(e.b,this.arePointsInsideRectangle._.point),this.arePointsInsideRectangle._.scalarAbAp=this._getScalarProduct(this.arePointsInsideRectangle._.ab,this.arePointsInsideRectangle._.ap),this.arePointsInsideRectangle._.scalarBcBp=this._getScalarProduct(this.arePointsInsideRectangle._.bc,this.arePointsInsideRectangle._.bp),this.arePointsInsideRectangle._.projectsOnAB=0<=this.arePointsInsideRectangle._.scalarAbAp&&this.arePointsInsideRectangle._.scalarAbAp<=this.arePointsInsideRectangle._.scalarAbAb,this.arePointsInsideRectangle._.projectsOnBC=0<=this.arePointsInsideRectangle._.scalarBcBp&&this.arePointsInsideRectangle._.scalarBcBp<=this.arePointsInsideRectangle._.scalarBcBc,!this.arePointsInsideRectangle._.projectsOnAB||!this.arePointsInsideRectangle._.projectsOnBC)return!1;return!0},_getVector:function(t,e){return{x:e.x-t.x,y:e.y-t.y}},_getScalarProduct:function(t,e){return t.x*e.x+t.y*e.y},_getVectorMagnitude:function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},_getAngleBetweenVectors:function(t,e){return Math.round(180*Math.acos(Math.min(1,this._getScalarProduct(t,e)/(this._getVectorMagnitude(t)*this._getVectorMagnitude(e))))/Math.PI*100)/100},_getEdgeCrossed:function(t,e){for(var i=[[t.a,t.b],[t.b,t.c],[t.c,t.d],[t.d,t.a]],s={x:this.editorWidth/2,y:this.editorHeight/2},a=180,n=null,r=0;r<i.length;r++){var o=i[r],l=this._getVector(o[0],s),h=this._getVector(o[0],o[1]),d=this._getVector(o[0],e),c=Math.abs(this._getAngleBetweenVectors(l,d)-(this._getAngleBetweenVectors(l,h)+this._getAngleBetweenVectors(h,d)));c<a&&(a=c,n=o)}return n},_getImageBoundingBox:function(t){var e={},i=Math.abs(this.imageStraightenAngle)*(Math.PI/180),s=t.height/t.width;if(e.height=t.width*(Math.sin(i)+Math.cos(i)*s),e.width=t.width*(Math.cos(i)+Math.sin(i)*s),this.hasOrientationChanged()){var a=e.width;e.width=e.height,e.height=a}return e}},{defaults:{animationDuration:100,allowSavingAsNew:!0,onSave:$.noop,allowDegreeFractions:null}})},2495:function(){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}Craft.AssetIndex=Craft.BaseElementIndex.extend({$includeSubfoldersContainer:null,$includeSubfoldersCheckbox:null,showingIncludeSubfoldersCheckbox:!1,$uploadButton:null,$uploadInput:null,$progressBar:null,$folders:null,uploader:null,promptHandler:null,progressBar:null,_uploadTotalFiles:0,_uploadFileProgress:{},_currentUploaderSettings:{},_assetDrag:null,_folderDrag:null,_expandDropTargetFolderTimeout:null,_tempExpandedFolders:[],_fileConflictTemplate:{choices:[{value:"keepBoth",title:Craft.t("app","Keep both")},{value:"replace",title:Craft.t("app","Replace it")}]},_folderConflictTemplate:{choices:[{value:"replace",title:Craft.t("app","Replace the folder (all existing files will be deleted)")},{value:"merge",title:Craft.t("app","Merge the folder (any conflicting files will be replaced)")}]},init:function(t,e,i){this.base(t,e,i),"index"===this.settings.context?(this._folderDrag||this._initIndexPageMode(),this.addListener(Garnish.$win,"resize,scroll","_positionProgressBar")):(this.addListener(this.$main,"scroll","_positionProgressBar"),this.settings.modal&&this.settings.modal.on("updateSizeAndPosition",this._positionProgressBar.bind(this)))},initSources:function(){return"index"!==this.settings.context||this._folderDrag||this._initIndexPageMode(),this.base()},initSource:function(t){this.base(t),this._createFolderContextMenu(t),"index"===this.settings.context&&(this._folderDrag&&this.getSourceLevel(t)>1&&t.data("folder-id")&&this._folderDrag.addItems(t.parent()),this._assetDrag&&this._assetDrag.updateDropTargets())},deinitSource:function(t){this.base(t);var e=t.data("contextmenu");e&&e.destroy(),"index"===this.settings.context&&(this._folderDrag&&this.getSourceLevel(t)>1&&this._folderDrag.removeItems(t.parent()),this._assetDrag&&this._assetDrag.updateDropTargets())},_initIndexPageMode:function(){var t=this;this._folderDrag||(this.settings.selectable=!0,this.settings.multiSelect=!0,this._assetDrag=new Garnish.DragDrop({activeDropTargetClass:"sel",helperOpacity:.75,filter:function(){return t.view.getSelectedElements().has("div.element[data-movable]")},helper:function(e){return t._getFileDragHelper(e)},dropTargets:function(){var e;e=t._assetDrag.$draggee&&t._assetDrag.$draggee.has(".element[data-peer-file]").length?"data-can-move-peer-files-to":"data-can-move-to";for(var i=[],s=0;s<t.$sources.length;s++){var a=t.$sources.eq(s);Garnish.hasAttr(a,e)&&i.push(a)}return i},onDragStart:this._onDragStart.bind(this),onDropTargetChange:this._onDropTargetChange.bind(this),onDragStop:this._onFileDragStop.bind(this),helperBaseZindex:800}),this._folderDrag=new Garnish.DragDrop({activeDropTargetClass:"sel",helperOpacity:.75,helper:function(e){var i=$('<div class="sidebar drag-helper"/>'),s=$("<nav/>").appendTo(i),a=$("<ul/>").appendTo(s);return e.appendTo(a).removeClass("expanded"),e.children("a").addClass("sel"),e.css({"padding-top":t._folderDrag.$draggee.css("padding-top"),"padding-right":t._folderDrag.$draggee.css("padding-right"),"padding-bottom":t._folderDrag.$draggee.css("padding-bottom"),"padding-left":t._folderDrag.$draggee.css("padding-left")}),i},dropTargets:function(){var e=[],i=[];t._folderDrag.$draggee.find("a[data-key]").each((function(){i.push($(this).data("key"))}));for(var s=0;s<t.$sources.length;s++){var a=t.$sources.eq(s),n=a.data("key");t._getVolumeOrFolderUidFromSourceKey(n)&&(Craft.inArray(n,i)||e.push(a))}return e},onDragStart:this._onDragStart.bind(this),onDropTargetChange:this._onDropTargetChange.bind(this),onDragStop:this._onFolderDragStop.bind(this)}))},_onFileDragStop:function(){var t=this;if(this._assetDrag.$activeDropTarget&&this._assetDrag.$activeDropTarget[0]!==this.$source[0]){for(var e=this.$source,i=this._assetDrag.$activeDropTarget.data("folder-id"),s=[],a=0;a<this._assetDrag.$draggee.length;a++){var n=Craft.getElementInfo(this._assetDrag.$draggee[a]).id;s.push(n)}if(s.length){this.setIndexBusy(),this._positionProgressBar(),this.progressBar.resetProgressBar(),this.progressBar.setItemCount(s.length),this.progressBar.showProgressBar();var r=[];for(a=0;a<s.length;a++)r.push({action:"assets/move-asset",params:{assetId:s[a],folderId:i}});return void this._performBatchRequests(r,(function a(n){t.promptHandler.resetPrompts();for(var r=0;r<n.length;r++){var o=n[r];o.conflict&&t.promptHandler.addPrompt({assetId:o.assetId,suggestedFilename:o.suggestedFilename,prompt:{message:o.conflict,choices:t._fileConflictTemplate.choices}}),o.error&&alert(o.error)}t.setIndexAvailable(),t.progressBar.hideProgressBar();var l=!1,h=function(){this.sourceSelect.selectItem(e),this._totalVisible-=this._assetDrag.$draggee.length;for(var t=0;t<s.length;t++)$("[data-id="+s[t]+"]").remove();this.view.deselectAllElements(),this._collapseExtraExpandedFolders(i),l&&this.updateElements()};t.promptHandler.getPromptCount()?(t._assetDrag.fadeOutHelpers(),t.promptHandler.showBatchPrompts((function(e){for(var s=[],n=0;n<e.length;n++)"cancel"!==e[n].choice?("keepBoth"===e[n].choice&&s.push({action:"assets/move-asset",params:{folderId:i,assetId:e[n].assetId,filename:e[n].suggestedFilename}}),"replace"===e[n].choice&&s.push({action:"assets/move-asset",params:{folderId:i,assetId:e[n].assetId,force:!0}})):l=!0;0===s.length?h.apply(t):(t.setIndexBusy(),t.progressBar.resetProgressBar(),t.progressBar.setItemCount(t.promptHandler.getPromptCount()),t.progressBar.showProgressBar(),t._performBatchRequests(s,a))}))):(h.apply(t),t._assetDrag.fadeOutHelpers())}))}}else this.$source.addClass("sel"),this._collapseExtraExpandedFolders();this._assetDrag.returnHelpersToDraggees()},_onFolderDragStop:function(){var t=this;if(this._folderDrag.$activeDropTarget&&0===this._folderDrag.$activeDropTarget.siblings("ul").children("li").filter(this._folderDrag.$draggee).length){var e=this._folderDrag.$activeDropTarget.data("folder-id");this._collapseExtraExpandedFolders(e);for(var i=[],s=0;s<this._folderDrag.$draggee.length;s++){var a=this._folderDrag.$draggee.eq(s).children("a").data("folder-id");if(a!=e){i.push(a);break}}if(i.length){i.sort(),i.reverse(),this.setIndexBusy(),this._positionProgressBar(),this.progressBar.resetProgressBar(),this.progressBar.setItemCount(i.length),this.progressBar.showProgressBar();var n=[];for(s=0;s<i.length;s++)n.push({action:"assets/move-folder",params:{folderId:i[s],parentId:e}});this.requestId++;var r=[],o="";return void this._performBatchRequests(n,(function e(s){t.promptHandler.resetPrompts();for(var a=0;a<s.length;a++){var n=s[a];n.success&&(n.transferList&&(r=n.transferList),n.newFolderId&&(o=t._folderDrag.$activeDropTarget.data("key")+"/folder:"+n.newFolderUid)),n.conflict&&(n.prompt={message:n.conflict,choices:t._folderConflictTemplate.choices},t.promptHandler.addPrompt(n)),n.error&&alert(n.error)}t.promptHandler.getPromptCount()?(t.promptHandler.showBatchPrompts((function(s){t.promptHandler.resetPrompts();for(var a=[],l={},h=0;h<s.length;h++)"cancel"!==s[h].choice&&("replace"===s[h].choice&&(l.force=!0),"merge"===s[h].choice&&(l.merge=!0),l.folderId=n.folderId,l.parentId=n.parentId,a.push({action:"assets/move-folder",params:l}));0===a.length?t._performActualFolderMove(r,i,o):(t.setIndexBusy(),t.progressBar.resetProgressBar(),t.progressBar.setItemCount(t.promptHandler.getPromptCount()),t.progressBar.showProgressBar(),t._performBatchRequests(a,e))})),t.setIndexAvailable(),t.progressBar.hideProgressBar()):t._performActualFolderMove(r,i,o)}))}}else this.$source.addClass("sel"),this._collapseExtraExpandedFolders();this._folderDrag.returnHelpersToDraggees()},_performActualFolderMove:function(t,e,i){var s=this;this.setIndexBusy(),this.progressBar.resetProgressBar(),this.progressBar.setItemCount(1),this.progressBar.showProgressBar();var a=function(t){for(var e=0,a=t.length,n=0;n<t.length;n++){var r={folderId:t[n]};Craft.sendActionRequest("POST","assets/delete-folder",{data:r}).then((function(t){++e===a&&(s.setIndexAvailable(),s.progressBar.hideProgressBar(),s._folderDrag.returnHelpersToDraggees(),s.setInstanceState("selectedSource",i),s.refreshSources())}))}};if(t.length>0){for(var n=[],r=0;r<t.length;r++)n.push({action:"assets/move-asset",params:t[r]});this._performBatchRequests(n,(function(){a(e)}))}else a(e)},_selectSourceByFolderId:function(t){for(var e=this._getSourceByKey(t),i=e.parent().parents("li"),s=0;s<i.length;s++){var a=$(i[s]);a.hasClass("expanded")||a.children(".toggle").trigger("click")}this.selectSource(e),this.updateElements()},afterInit:function(){var t=this;this.$uploadButton||(this.$uploadButton=$("<button/>",{type:"button",class:"btn submit","data-icon":"upload",style:"position: relative; overflow: hidden;",text:Craft.t("app","Upload files")}),this.addButton(this.$uploadButton),this.$uploadInput=$('<input type="file" multiple="multiple" name="assets-upload" />').hide().insertBefore(this.$uploadButton)),this.promptHandler=new Craft.PromptHandler,this.progressBar=new Craft.ProgressBar(this.$main,!0);var e={url:Craft.getActionUrl("assets/upload"),fileInput:this.$uploadInput,dropZone:this.$container};e.events={fileuploadstart:this._onUploadStart.bind(this),fileuploadprogressall:this._onUploadProgress.bind(this),fileuploaddone:this._onUploadSuccess.bind(this),fileuploadalways:this._onUploadAlways.bind(this),fileuploadfail:this._onUploadFailure.bind(this)},this.settings.criteria&&void 0!==this.settings.criteria.kind&&(e.allowedKinds=this.settings.criteria.kind),this._currentUploaderSettings=e,this.uploader=new Craft.Uploader(this.$uploadButton,e),this.$uploadButton.on("click",(function(){t.$uploadButton.hasClass("disabled")||t.isIndexBusy||t.$uploadButton.parent().find("input[name=assets-upload]").trigger("click")})),this.base()},getDefaultSourceKey:function(){var e=this;if("index"===this.settings.context&&void 0!==window.defaultSource){var i=function(){var t=window.defaultSource.split("/"),i=e.$sources.toArray().find((function(e){return $(e).data("volume-handle")===t[0]}));if(i){for(var s=$(i),a=function(i){var a=e._getChildSources(s).toArray().find((function(e){return $("> .label",e).text()===t[i]}));if(!a)return"break";e._expandSource(s),s=$(a)},n=1;n<t.length&&"break"!==a(n);n++);return{v:s.data("key")}}}();if("object"===t(i))return i.v}return this.base()},onSelectSource:function(){var t=this._getSourceByKey(this.sourceKey);t.data("folder-id")&&Garnish.hasAttr(this.$source,"data-can-upload")?(this.uploader.setParams({folderId:this.$source.attr("data-folder-id")}),this.$uploadButton.removeClass("disabled")):this.$uploadButton.addClass("disabled"),t.length&&"index"===this.settings.context&&this._updateUrl(t),this.base()},_updateUrl:function(t){for(var e,i=[],s=t;(e=this.getParentSource(s))&&e.length;)i.unshift(s),s=e;var a="assets";s.data("volume-handle")&&(a+="/"+s.data("volume-handle"),i.forEach((function(t){a+="/"+t.children(".label").text()}))),Craft.setPath(a)},_getVolumeOrFolderUidFromSourceKey:function(t){var e=t.match(/\b(?:folder|volume):([0-9a-f\-]+)$/);return e?e[1]:null},startSearching:function(){if(!this.settings.hideSidebar&&this.$source.siblings("ul").length){if(null===this.$includeSubfoldersContainer){var t="includeSubfolders-"+Math.floor(1e9*Math.random());this.$includeSubfoldersContainer=$('<div style="margin-bottom: -25px; opacity: 0;"/>').insertAfter(this.$search);var e=$('<div style="padding-top: 5px;"/>').appendTo(this.$includeSubfoldersContainer);this.$includeSubfoldersCheckbox=$('<input type="checkbox" id="'+t+'" class="checkbox"/>').appendTo(e),$('<label class="light smalltext" for="'+t+'"/>').text(" "+Craft.t("app","Search in subfolders")).appendTo(e),this.addListener(this.$includeSubfoldersCheckbox,"change",(function(){this.setSelecetedSourceState("includeSubfolders",this.$includeSubfoldersCheckbox.prop("checked")),this.updateElements()}))}else this.$includeSubfoldersContainer.velocity("stop").removeClass("hidden");var i=this.getSelectedSourceState("includeSubfolders",!1);this.$includeSubfoldersCheckbox.prop("checked",i),this.$includeSubfoldersContainer.velocity({marginBottom:0,opacity:1},"fast"),this.showingIncludeSubfoldersCheckbox=!0}this.base()},stopSearching:function(){var t=this;this.showingIncludeSubfoldersCheckbox&&(this.$includeSubfoldersContainer.velocity("stop"),this.$includeSubfoldersContainer.velocity({marginBottom:-25,opacity:0},{duration:"fast",complete:function(){t.$includeSubfoldersContainer.addClass("hidden")}}),this.showingIncludeSubfoldersCheckbox=!1),this.base()},getViewParams:function(){var t=this.base();return this.showingIncludeSubfoldersCheckbox&&this.$includeSubfoldersCheckbox.prop("checked")&&(t.criteria.includeSubfolders=!0),t},_onUploadStart:function(){this.setIndexBusy(),this._positionProgressBar(),this.progressBar.resetProgressBar(),this.progressBar.showProgressBar(),this.promptHandler.resetPrompts()},_onUploadProgress:function(t,e){var i=parseInt(e.loaded/e.total*100,10);this.progressBar.setProgressPercentage(i)},_onUploadSuccess:function(t,e){var i=e.result;this.selectElementAfterUpdate(i.assetId),i.conflict&&(i.prompt={message:Craft.t("app",i.conflict,{file:i.filename}),choices:this._fileConflictTemplate.choices},this.promptHandler.addPrompt(i)),Craft.cp.runQueue()},_onUploadAlways:function(){this.uploader.isLastUpload()&&(this.progressBar.hideProgressBar(),this.setIndexAvailable(),this.promptHandler.getPromptCount()?this.promptHandler.showBatchPrompts(this._uploadFollowup.bind(this)):this._updateAfterUpload())},_onUploadFailure:function(t,e){var i,s=e.response(),a=(null==s||null===(i=s.jqXHR)||void 0===i?void 0:i.responseJSON)||{},n=a.message,r=a.filename;n||(n=r?Craft.t("app","Upload failed for “{filename}”.",{filename:r}):Craft.t("app","Upload failed.")),alert(n)},_updateAfterUpload:function(){"index"!==this.settings.context&&(this.clearSearch(),this.setSelectedSortAttribute("dateCreated","desc")),this.updateElements()},_uploadFollowup:function(t){var e=this;this.setIndexBusy(),this.progressBar.resetProgressBar(),this.promptHandler.resetPrompts(),this.progressBar.setItemCount(t.length),this.progressBar.showProgressBar(),function t(i,s,a){var n={},r=null,o=function(){s++,e.progressBar.incrementProcessedItemCount(1),e.progressBar.updateProgressBar(),s===i.length?a():t(i,s,a)},l=function(t){t.assetId&&e.selectElementAfterUpdate(t.assetId),o()};"replace"===i[s].choice?(r="assets/replace-file",n.sourceAssetId=i[s].assetId,i[s].conflictingAssetId?n.assetId=i[s].conflictingAssetId:n.targetFilename=i[s].filename):"cancel"===i[s].choice&&(r="assets/delete-asset",n.assetId=i[s].assetId),r?Craft.sendActionRequest("POST",r,{data:n}).then((function(t){return l(t.data)})).catch((function(t){return function(t){alert(t.message),o()}(t.response.data)})):l({assetId:i[s].assetId})}(t,0,(function(){e.progressBar.hideProgressBar(),e.setIndexAvailable(),e._updateAfterUpload()}))},onUpdateElements:function(){var t=this;this._onUpdateElements(!1,this.view.getAllElements()),this.view.on("appendElements",(function(e){t._onUpdateElements(!0,e.newElements)})),this.base()},_onUpdateElements:function(t,e){"index"===this.settings.context&&(t||this._assetDrag.removeAllItems(),this._assetDrag.addItems(e.has("div.element[data-movable]"))),this.base(t,e),this.removeListener(this.$elements,"keydown"),this.addListener(this.$elements,"keydown",this._onKeyDown.bind(this)),this.view.elementSelect.on("focusItem",this._onElementFocus.bind(this))},_onKeyDown:function(t){if(t.keyCode===Garnish.SPACE_KEY&&t.shiftKey){if(Craft.PreviewFileModal.openInstance)Craft.PreviewFileModal.openInstance.selfDestruct();else{var e=this.view.elementSelect.$focusedItem.find(".element");e.length&&this._loadPreview(e)}return t.stopPropagation(),!1}},_onElementFocus:function(t){var e=$(t.item).find(".element");Craft.PreviewFileModal.openInstance&&e.length&&this._loadPreview(e)},_loadPreview:function(t){var e={};t.data("image-width")&&(e.startingWidth=t.data("image-width"),e.startingHeight=t.data("image-height")),new Craft.PreviewFileModal(t.data("id"),this.view.elementSelect,e)},_onDragStart:function(){this._tempExpandedFolders=[]},_getFileDragHelper:function(t){var e,i;switch(this.getSelectedSourceState("mode")){case"table":e=$('<div class="elements datatablesorthelper"/>').appendTo(Garnish.$bod),i=$('<div class="tableview"/>').appendTo(e);var s=$('<table class="data"/>').appendTo(i),a=$("<tbody/>").appendTo(s);t.appendTo(a),this._$firstRowCells=this.view.$table.children("tbody").children("tr:first").children();for(var n=t.children(),r=0;r<n.length;r++){var o=$(n[r]);if(o.hasClass("checkbox-cell"))o.remove(),e.css("margin-"+Craft.left,19);else{var l=$(this._$firstRowCells[r]),h=l.width();l.width(h),o.width(h)}}return e;case"thumbs":return e=$('<div class="elements thumbviewhelper"/>').appendTo(Garnish.$bod),i=$('<ul class="thumbsview"/>').appendTo(e),t.appendTo(i),e}return $()},_onDropTargetChange:function(t){if(clearTimeout(this._expandDropTargetFolderTimeout),t){var e=t.data("folder-id");e?(this.dropTargetFolder=this._getSourceByKey(e),this._hasSubfolders(this.dropTargetFolder)&&!this._isExpanded(this.dropTargetFolder)&&(this._expandDropTargetFolderTimeout=setTimeout(this._expandFolder.bind(this),500))):this.dropTargetFolder=null}t&&t[0]!==this.$source[0]?this.$source.removeClass("sel"):this.$source.addClass("sel")},_collapseExtraExpandedFolders:function(t){var e;clearTimeout(this._expandDropTargetFolderTimeout),t&&(e=this._getSourceByKey(t).parents("li").children("a"));for(var i=this._tempExpandedFolders.length-1;i>=0;i--){var s=this._tempExpandedFolders[i];void 0!==e&&0!==e.filter('[data-key="'+s.data("key")+'"]').length||(this._collapseFolder(s),this._tempExpandedFolders.splice(i,1))}},_getSourceByKey:function(t){return this.$sources.filter('[data-key$="'+t+'"]')},_hasSubfolders:function(t){return t.siblings("ul").find("li").length},_isExpanded:function(t){return t.parent("li").hasClass("expanded")},_expandFolder:function(){this._collapseExtraExpandedFolders(this.dropTargetFolder.data("folder-id")),this.dropTargetFolder.siblings(".toggle").trigger("click"),this._tempExpandedFolders.push(this.dropTargetFolder)},_collapseFolder:function(t){t.parent().hasClass("expanded")&&t.siblings(".toggle").trigger("click")},getSourceActions:function(){var t=this,e=this.base();return this._getVolumeOrFolderUidFromSourceKey(this.sourceKey)&&(e.push({label:Craft.t("app","New subfolder"),onSelect:function(){t._createSubfolder(t.$source)}}),this.getSourceLevel(this.$source)>1&&(e.push({label:Craft.t("app","Rename folder"),onSelect:function(){t._renameFolder(t.$source)}}),e.push({label:Craft.t("app","Delete folder"),destructive:!0,onSelect:function(){t._deleteFolder(t.$source)}}))),e},_createFolderContextMenu:function(t){var e=this;if(this._getVolumeOrFolderUidFromSourceKey(t.data("key"))){var i=[{label:Craft.t("app","New subfolder"),onClick:function(){e._createSubfolder(t)}}];"index"===this.settings.context&&this.getSourceLevel(t)>1&&(i.push({label:Craft.t("app","Rename folder"),onClick:function(){e._renameFolder(t)}}),i.push({label:Craft.t("app","Delete folder"),onClick:function(){e._deleteFolder(t)}})),new Garnish.ContextMenu(t,i,{menuClass:"menu"})}},_createSubfolder:function(t){var e=this,i=prompt(Craft.t("app","Enter the name of the folder"));if(i){var s={parentId:t.data("folder-id"),folderName:i};this.setIndexBusy(),Craft.sendActionRequest("POST","assets/create-folder",{data:s}).then((function(i){var s=i.data;e.setIndexAvailable(),e._prepareParentForChildren(t);var a=$("<li>"+'<a data-key="'.concat(t.data("key"),"/folder:").concat(s.folderUid,'" data-default-sort="').concat(t.data("default-sort"),'"')+(Garnish.hasAttr(t,"data-has-thumbs")?" data-has-thumbs":"")+' data-folder-id="'.concat(s.folderId,'"')+(Garnish.hasAttr(t,"data-can-upload")?" data-can-upload":"")+(Garnish.hasAttr(t,"data-can-move-to")?" data-can-move-to":"")+(Garnish.hasAttr(t,"data-can-move-peer-files-to")?" data-can-move-peer-files-to":"")+">"+'<span class="label">'.concat(s.folderName,"</span>")+"</a></li>"),n=a.children("a:first");e._appendSubfolder(t,a),e.initSource(n),Craft.cp.displayNotice(Craft.t("app","Folder created."))})).catch((function(t){var i=t.response;e.setIndexAvailable(),alert(i.data.message)}))}},_deleteFolder:function(t){var e=this;if(confirm(Craft.t("app","Really delete folder “{folder}”?",{folder:$.trim(t.text())}))){var i={folderId:t.data("folder-id")};this.setIndexBusy(),Craft.sendActionRequest("POST","assets/delete-folder",{data:i}).then((function(i){e.setIndexAvailable();var s=e.getParentSource(t);e.deinitSource(t),t.parent().remove(),e._cleanUpTree(s),Craft.cp.displayNotice(Craft.t("app","Folder deleted."))})).catch((function(t){var i=t.response;e.setIndexAvailable(),alert(i.data.message)}))}},_renameFolder:function(t){var e=this,i=t.children(".label"),s=Craft.trim(i.text()),a=prompt(Craft.t("app","Rename folder"),s);a&&a!==s&&(this.setIndexBusy(),Craft.sendActionRequest("POST","assets/rename-folder",{data:{folderId:t.data("folder-id"),newName:a}}).then((function(s){i.text(s.data.newName),t.data("key")===e.$source.data("key")&&(e.updateElements(),Craft.cp.displayNotice(Craft.t("app","Folder renamed.")),"index"===e.settings.context&&e._updateUrl(t))})).catch((function(t){var i=t.response;e.setIndexAvailable(),alert(i.data.message)})))},_prepareParentForChildren:function(t){this._hasSubfolders(t)||(t.parent().addClass("expanded").append('<div class="toggle"></div><ul class="nested"></ul>'),this.initSourceToggle(t))},_appendSubfolder:function(t,e){for(var i=t.siblings("ul").children("li"),s=$.trim(e.children("a:first").text()),a=!1,n=0;n<i.length;n++){var r=$(i[n]);if($.trim(r.children("a:first").text())>s){r.before(e),a=!0;break}}a||t.siblings("ul").append(e)},_cleanUpTree:function(t){null!==t&&0===t.siblings("ul").children("li").length&&(this.deinitSourceToggle(t),t.siblings("ul").remove(),t.siblings(".toggle").remove(),t.parent().removeClass("expanded"))},_positionProgressBar:function(){this.progressBar||(this.progressBar=new Craft.ProgressBar(this.$main,!0));var t=$(),e=0,i=0;"index"===this.settings.context?(t=this.progressBar.$progressBar.closest("#content"),e=Garnish.$win.scrollTop()):(t=this.progressBar.$progressBar.closest(".main"),e=this.$main.scrollTop());var s=e-t.offset().top,a=Garnish.$win.height();i=t.height()>a?a/2-6+s:t.height()/2-6,"index"!==this.settings.context&&(i=e+(t.height()/2-6)),this.progressBar.$progressBar.css({top:i})},_performBatchRequests:function(t,e){for(var i=this,s=[],a=t.length;t.length;){var n=t.shift();Craft.sendActionRequest("POST",n.action,{data:n.params}).then((function(t){s.push(t.data)})).finally((function(){i.progressBar.incrementProcessedItemCount(1),i.progressBar.updateProgressBar(),0==--a&&(Craft.cp.runQueue(),e(s))}))}}}),Craft.registerElementIndexClass("craft\\elements\\Asset",Craft.AssetIndex)},5077:function(){Craft.AssetSelectInput=Craft.BaseElementSelectInput.extend({requestId:0,hud:null,$uploadBtn:null,uploader:null,progressBar:null,openPreviewTimeout:null,init:function(){this.base.apply(this,arguments),this.settings.canUpload&&this._attachUploader(),this.updateAddElementsBtn(),this.addListener(this.$elementsContainer,"keydown",this._onKeyDown.bind(this)),this.elementSelect.on("focusItem",this._onElementFocus.bind(this))},_onKeyDown:function(t){if(t.keyCode===Garnish.SPACE_KEY&&t.shiftKey)return this.openPreview(),t.stopPropagation(),!1},onAddElements:function(){var t=this;this.$elements.find(".elementthumb").addClass("open-preview").on("click",(function(e){t.clearOpenPreviewTimeout(),t.openPreviewTimeout=setTimeout((function(){t.openPreview(),t.openPreviewTimeout=null}),500)})).on("dblclick",(function(e){t.clearOpenPreviewTimeout()})),this.base()},clearOpenPreviewTimeout:function(){this.openPreviewTimeout&&(clearTimeout(this.openPreviewTimeout),this.openPreviewTimeout=null)},openPreview:function(){if(Craft.PreviewFileModal.openInstance)Craft.PreviewFileModal.openInstance.selfDestruct();else{var t=this.elementSelect.$focusedItem;t.length&&this._loadPreview(t)}},_onElementFocus:function(t){var e=$(t.item);Craft.PreviewFileModal.openInstance&&e.length&&this._loadPreview(e)},_loadPreview:function(t){var e={minGutter:50};t.data("image-width")&&(e.startingWidth=t.data("image-width"),e.startingHeight=t.data("image-height")),new Craft.PreviewFileModal(t.data("id"),this.elementSelect,e)},_attachUploader:function(){var t=this;this.progressBar=new Craft.ProgressBar($('<div class="progress-shade"></div>').appendTo(this.$container));var e={url:Craft.getActionUrl("assets/upload"),dropZone:this.$container,formData:{fieldId:this.settings.fieldId}};this.settings.sourceElementId&&(e.formData.elementId=this.settings.sourceElementId),this.settings.criteria.siteId&&(e.formData.siteId=this.settings.criteria.siteId),this.$addElementBtn&&(this.$uploadBtn=$("<button/>",{type:"button",class:"btn dashed","data-icon":"upload","aria-label":1==this.settings.limit?Craft.t("app","Upload a file"):Craft.t("app","Upload files"),"aria-describedby":this.settings.describedBy,text:1==this.settings.limit?Craft.t("app","Upload a file"):Craft.t("app","Upload files")}).insertAfter(this.$addElementBtn),e.fileInput=$("<input/>",{type:"file",class:"hidden",multiple:1!=this.settings.limit}).insertAfter(this.$uploadBtn),Garnish.$win.trigger("resize")),void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(e.formData[Craft.csrfTokenName]=Craft.csrfTokenValue),void 0!==this.settings.criteria.kind&&(e.allowedKinds=this.settings.criteria.kind),e.canAddMoreFiles=this.canAddMoreFiles.bind(this),e.events={},e.events.fileuploadstart=this._onUploadStart.bind(this),e.events.fileuploadprogressall=this._onUploadProgress.bind(this),e.events.fileuploaddone=this._onUploadComplete.bind(this),e.events.fileuploadfail=this._onUploadFailure.bind(this),this.uploader=new Craft.Uploader(this.$container,e),this.$uploadBtn&&this.$uploadBtn.on("click",(function(e){t.$uploadBtn.next("input[type=file]").trigger("click")}))},enableAddElementsBtn:function(){this.$uploadBtn&&this.$uploadBtn.removeClass("hidden"),this.base()},disableAddElementsBtn:function(){this.$uploadBtn&&this.$uploadBtn.addClass("hidden"),this.base()},selectUploadedFile:function(t){if(this.canAddMoreElements()){var e=t.$element;e.addClass("removable"),e.prepend('<input type="hidden" name="'+this.settings.name+'[]" value="'+t.id+'"><a class="delete icon" title="'+Craft.t("app","Remove")+'"></a>'),e.appendTo(this.$elementsContainer);var i=-(e.outerWidth()+10);this.$addElementBtn.css("margin-"+Craft.left,i+"px");var s={};s["margin-"+Craft.left]=0,this.$addElementBtn.velocity(s,"fast"),this.addElements(e),delete this.modal}},_onUploadStart:function(){this.progressBar.$progressBar.css({top:Math.round(this.$container.outerHeight()/2)-6}),this.$container.addClass("uploading"),this.progressBar.resetProgressBar(),this.progressBar.showProgressBar()},_onUploadProgress:function(t,e){var i=parseInt(e.loaded/e.total*100,10);this.progressBar.setProgressPercentage(i)},_onUploadComplete:function(t,e){var i=this;if(e.result.error)alert(e.result.error),this.progressBar.hideProgressBar(),this.$container.removeClass("uploading");else{var s={elementId:e.result.assetId,siteId:this.settings.criteria.siteId,thumbSize:this.settings.viewMode};Craft.sendActionRequest("POST","elements/get-element-html",{data:s}).then((function(t){var e=$(t.data.html);Craft.appendHeadHtml(t.data.headHtml),i.selectUploadedFile(Craft.getElementInfo(e)),i.uploader.isLastUpload()&&(i.progressBar.hideProgressBar(),i.$container.removeClass("uploading"),i.$container.trigger("change"))})).catch((function(t){var e=t.response;alert(e.data.message)})),Craft.cp.runQueue()}},_onUploadFailure:function(t,e){var i,s=e.response(),a=(null==s||null===(i=s.jqXHR)||void 0===i?void 0:i.responseJSON)||{},n=a.message,r=a.filename;n||(n=r?Craft.t("app","Upload failed for “{filename}”.",{filename:r}):Craft.t("app","Upload failed.")),alert(n),this.progressBar.hideProgressBar(),this.$container.removeClass("uploading")},canAddMoreFiles:function(t){return!this.settings.limit||this.$elements.length+t<this.settings.limit}})},4606:function(){Craft.AssetSelectorModal=Craft.BaseElementSelectorModal.extend({$selectTransformBtn:null,_selectedTransform:null,init:function(t,e){e=$.extend({},Craft.AssetSelectorModal.defaults,e),this.base(t,e),e.transforms.length&&this.createSelectTransformButton(e.transforms)},createSelectTransformButton:function(t){if(t&&t.length){var e=$('<div class="btngroup"/>').appendTo(this.$primaryButtons);this.$selectBtn.appendTo(e),this.$selectTransformBtn=$("<button/>",{type:"button",class:"btn menubtn disabled",text:Craft.t("app","Select transform")}).appendTo(e);for(var i=$('<div class="menu" data-align="right"></div>').insertAfter(this.$selectTransformBtn),s=$("<ul></ul>").appendTo(i),a=0;a<t.length;a++)$('<li><a data-transform="'+t[a].handle+'">'+t[a].name+"</a></li>").appendTo(s);var n=new Garnish.MenuBtn(this.$selectTransformBtn,{onOptionSelect:this.onSelectTransform.bind(this)});n.disable(),this.$selectTransformBtn.data("menuButton",n)}},onSelectionChange:function(t){var e=this.elementIndex.getSelectedElements(),i=!1;if(e.length&&this.settings.transforms.length){i=!0;for(var s=0;s<e.length&&$(".element.hasthumb:first",e[s]).length;s++);}var a=null;this.$selectTransformBtn&&(a=this.$selectTransformBtn.data("menuButton")),i?(a&&a.enable(),this.$selectTransformBtn.removeClass("disabled")):this.$selectTransformBtn&&(a&&a.disable(),this.$selectTransformBtn.addClass("disabled")),this.base()},onSelectTransform:function(t){var e=$(t).data("transform");this.selectImagesWithTransform(e)},selectImagesWithTransform:function(t){var e=this;void 0===Craft.AssetSelectorModal.transformUrls[t]&&(Craft.AssetSelectorModal.transformUrls[t]={});for(var i=this.elementIndex.getSelectedElements(),s=[],a=0;a<i.length;a++){var n=$(i[a]),r=Craft.getElementInfo(n).id;void 0===Craft.AssetSelectorModal.transformUrls[t][r]&&s.push(r)}s.length?(this.showFooterSpinner(),this.fetchMissingTransformUrls(s,t,(function(){e.hideFooterSpinner(),e.selectImagesWithTransform(t)}))):(this._selectedTransform=t,this.selectElements(),this._selectedTransform=null)},fetchMissingTransformUrls:function(t,e,i){var s=this,a=t.pop(),n={assetId:a,handle:e};Craft.sendActionRequest("POST","assets/generate-transform",{data:n}).then((function(t){Craft.AssetSelectorModal.transformUrls[e][a]=!1,t.data.url&&(Craft.AssetSelectorModal.transformUrls[e][a]=t.data.url)})).catch((function(n){n.response,Craft.AssetSelectorModal.transformUrls[e][a]=!1,t.length?s.fetchMissingTransformUrls(t,e,i):i()}))},getElementInfo:function(t){var e=this.base(t);if(this._selectedTransform)for(var i=0;i<e.length;i++){var s=e[i].id;void 0!==Craft.AssetSelectorModal.transformUrls[this._selectedTransform][s]&&!1!==Craft.AssetSelectorModal.transformUrls[this._selectedTransform][s]&&(e[i].url=Craft.AssetSelectorModal.transformUrls[this._selectedTransform][s])}return e},onSelect:function(t){this.settings.onSelect(t,this._selectedTransform)}},{defaults:{canSelectImageTransforms:!1,transforms:[]},transformUrls:{}}),Craft.registerElementSelectorModalClass("craft\\elements\\Asset",Craft.AssetSelectorModal)},9222:function(){Craft.AuthManager=Garnish.Base.extend({remainingSessionTime:null,checkRemainingSessionTimer:null,showLoginModalTimer:null,decrementLogoutWarningInterval:null,showingLogoutWarningModal:!1,showingLoginModal:!1,logoutWarningModal:null,loginModal:null,$logoutWarningPara:null,$passwordInput:null,$loginBtn:null,$loginErrorPara:null,submitLoginIfLoggedOut:!1,init:function(){Craft.username&&this.updateRemainingSessionTime(Craft.remainingSessionTime)},setCheckRemainingSessionTimer:function(t){this.checkRemainingSessionTimer&&clearTimeout(this.checkRemainingSessionTimer),this.checkRemainingSessionTimer=setTimeout(this.checkRemainingSessionTime.bind(this),1e3*t)},checkRemainingSessionTime:function(t){var e=this;$.ajax({url:Craft.getActionUrl("users/session-info",t?null:"dontExtendSession=1"),type:"GET",dataType:"json",complete:function(t,i){"success"===i?(void 0!==t.responseJSON.csrfTokenValue&&void 0!==Craft.csrfTokenValue&&(Craft.csrfTokenValue=t.responseJSON.csrfTokenValue),e.updateRemainingSessionTime(t.responseJSON.timeout),e.submitLoginIfLoggedOut=!1):e.updateRemainingSessionTime(-1)}})},updateRemainingSessionTime:function(t){this.remainingSessionTime=parseInt(t),-1!==this.remainingSessionTime&&this.remainingSessionTime<Craft.AuthManager.minSafeSessionTime?(this.remainingSessionTime?(this.showingLogoutWarningModal||this.showLogoutWarningModal(),this.remainingSessionTime<Craft.AuthManager.checkInterval&&(this.showLoginModalTimer&&clearTimeout(this.showLoginModalTimer),this.showLoginModalTimer=setTimeout(this.showLoginModal.bind(this),1e3*this.remainingSessionTime))):this.showingLoginModal?this.submitLoginIfLoggedOut&&this.submitLogin():this.showLoginModal(),this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval)):(this.hideLogoutWarningModal(),this.hideLoginModal(),-1!==this.remainingSessionTime&&this.remainingSessionTime<Craft.AuthManager.minSafeSessionTime+Craft.AuthManager.checkInterval?this.setCheckRemainingSessionTimer(this.remainingSessionTime-Craft.AuthManager.minSafeSessionTime+1):this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval))},showLogoutWarningModal:function(){var t;if(this.showingLoginModal?(this.hideLoginModal(!0),t=!0):t=!1,this.showingLogoutWarningModal=!0,!this.logoutWarningModal){var e=$('<form id="logoutwarningmodal" class="modal alert fitted"/>'),i=$('<div class="body"/>').appendTo(e),s=$('<div class="buttons right"/>').appendTo(i),a=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Sign out now")}).appendTo(s),n=$("<button/>",{type:"submit",class:"btn submit",text:Craft.t("app","Keep me signed in")}).appendTo(s);this.$logoutWarningPara=$("<p/>").prependTo(i),this.logoutWarningModal=new Garnish.Modal(e,{autoShow:!1,closeOtherModals:!1,hideOnEsc:!1,hideOnShadeClick:!1,shadeClass:"modal-shade dark logoutwarningmodalshade",onFadeIn:function(){Garnish.isMobileBrowser(!0)||setTimeout((function(){n.trigger("focus")}),100)}}),this.addListener(a,"activate","logout"),this.addListener(e,"submit","renewSession")}t?this.logoutWarningModal.quickShow():this.logoutWarningModal.show(),this.updateLogoutWarningMessage(),this.decrementLogoutWarningInterval=setInterval(this.decrementLogoutWarning.bind(this),1e3)},updateLogoutWarningMessage:function(){this.$logoutWarningPara.text(Craft.t("app","Your session will expire in {time}.",{time:Craft.secondsToHumanTimeDuration(this.remainingSessionTime)})),this.logoutWarningModal.updateSizeAndPosition()},decrementLogoutWarning:function(){this.remainingSessionTime>0&&(this.remainingSessionTime--,this.updateLogoutWarningMessage()),0===this.remainingSessionTime&&clearInterval(this.decrementLogoutWarningInterval)},hideLogoutWarningModal:function(t){this.showingLogoutWarningModal=!1,this.logoutWarningModal&&(t?this.logoutWarningModal.quickHide():this.logoutWarningModal.hide(),this.decrementLogoutWarningInterval&&clearInterval(this.decrementLogoutWarningInterval))},showLoginModal:function(){var t,e=this;if(this.showingLogoutWarningModal?(this.hideLogoutWarningModal(!0),t=!0):t=!1,this.showingLoginModal=!0,!this.loginModal){var i=$('<form id="loginmodal" class="modal alert fitted"/>'),s=$('<div class="body"><h2>'+Craft.t("app","Your session has ended.")+"</h2><p>"+Craft.t("app","Enter your password to log back in.")+"</p></div>").appendTo(i),a=$('<div class="inputcontainer">').appendTo(s),n=$('<div class="flex"/>').appendTo(a),r=$('<div class="flex-grow"/>').appendTo(n),o=$("<div/>").appendTo(n),l=$('<div class="passwordwrapper"/>').appendTo(r);this.$passwordInput=$('<input type="password" class="text password fullwidth" autocomplete="current-password" placeholder="'+Craft.t("app","Password")+'"/>').appendTo(l),this.$loginBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Sign in"),spinner:!0}).attr("aria-disabled","true").appendTo(o),this.$loginErrorPara=$('<p class="error"/>').appendTo(s),this.loginModal=new Garnish.Modal(i,{autoShow:!1,closeOtherModals:!1,hideOnEsc:!1,hideOnShadeClick:!1,shadeClass:"modal-shade dark loginmodalshade",onFadeIn:function(){Garnish.isMobileBrowser(!0)||setTimeout((function(){e.$passwordInput.trigger("focus")}),100)},onFadeOut:function(){e.$passwordInput.val("")}}),new Craft.PasswordInput(this.$passwordInput,{onToggleInput:function(t){e.$passwordInput=t}}),this.addListener(this.$passwordInput,"input","validatePassword"),this.addListener(i,"submit","login")}t?this.loginModal.quickShow():this.loginModal.show()},hideLoginModal:function(t){this.showingLoginModal=!1,this.loginModal&&(t?this.loginModal.quickHide():this.loginModal.hide())},logout:function(){$.get({url:Craft.getActionUrl("users/logout"),dataType:"json",success:function(){Craft.redirectTo("")}})},renewSession:function(t){t&&t.preventDefault(),this.hideLogoutWarningModal(),this.checkRemainingSessionTime(!0)},validatePassword:function(){return this.$passwordInput.val().length>=6?(this.$loginBtn.removeClass("disabled"),this.$loginBtn.removeAttr("aria-disabled"),!0):(this.$loginBtn.addClass("disabled"),this.$loginBtn.attr("aria-disabled","true"),!1)},login:function(t){t&&t.preventDefault(),this.validatePassword()&&(this.$loginBtn.addClass("loading"),this.clearLoginError(),void 0!==Craft.csrfTokenValue?(this.submitLoginIfLoggedOut=!0,this.checkRemainingSessionTime()):this.submitLogin())},submitLogin:function(){var t=this,e={loginName:Craft.username,password:this.$passwordInput.val()};Craft.sendActionRequest("POST","users/login",{data:e}).then((function(e){t.$loginBtn.removeClass("loading"),t.hideLoginModal(),t.checkRemainingSessionTime()})).catch((function(e){var i=e.response;t.$loginBtn.removeClass("loading"),t.showLoginError(i.data.message||null),Garnish.shake(t.loginModal.$container),Garnish.isMobileBrowser(!0)||t.$passwordInput.trigger("focus")}))},showLoginError:function(t){null==t&&(t=Craft.t("app","A server error occurred.")),this.$loginErrorPara.text(t),this.loginModal.updateSizeAndPosition()},clearLoginError:function(){this.showLoginError("")}},{checkInterval:60,minSafeSessionTime:120})},5774:function(){function t(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);e&&(s=s.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,s)}return i}function e(e){for(var s=1;s<arguments.length;s++){var a=null!=arguments[s]?arguments[s]:{};s%2?t(Object(a),!0).forEach((function(t){i(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):t(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function s(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(t,e)||function(t,e){if(t){if("string"==typeof t)return a(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}Craft.BaseElementIndex=Garnish.Base.extend({initialized:!1,elementType:null,idPrefix:null,instanceState:null,sourceStates:null,sourceStatesStorageKey:null,searchTimeout:null,sourceSelect:null,$container:null,$main:null,isIndexBusy:!1,$sidebar:null,showingSidebar:null,sourceKey:null,rootSourceKey:null,sourceViewModes:null,$source:null,$rootSource:null,sourcesByKey:null,$visibleSources:null,$sourceActionsContainer:null,$sourceActionsBtn:null,$toolbar:null,toolbarOffset:null,$searchContainer:null,$search:null,$filterBtn:null,searching:!1,searchText:null,sortByScore:null,trashed:!1,drafts:!1,$clearSearchBtn:null,$statusMenuBtn:null,$statusMenuContainer:null,statusMenu:null,status:null,$siteMenuBtn:null,siteMenu:null,siteId:null,$elements:null,$updateSpinner:null,$viewModeBtnContainer:null,viewModeBtns:null,viewMode:null,view:null,_autoSelectElements:null,$countSpinner:null,$countContainer:null,$actionsContainer:null,page:1,resultSet:null,totalResults:null,$exportBtn:null,actions:null,actionsHeadHtml:null,actionsBodyHtml:null,$selectAllContainer:null,$selectAllCheckbox:null,showingActionTriggers:!1,exporters:null,exportersByType:null,_$triggers:null,_ignoreFailedRequest:!1,_cancelToken:null,viewMenus:null,activeViewMenu:null,filterHuds:null,init:function(t,e,i){var s=this;if(this.elementType=t,this.$container=e,this.setSettings(i,Craft.BaseElementIndex.defaults),this.idPrefix=Craft.randomString(10),this.instanceState=this.getDefaultInstanceState(),this.sourceStates={},this.settings.storageKey&&$.extend(this.instanceState,Craft.getLocalStorage(this.settings.storageKey),{}),this.sourceStatesStorageKey="BaseElementIndex."+this.elementType+"."+this.settings.context,$.extend(this.sourceStates,Craft.getLocalStorage(this.sourceStatesStorageKey,{})),this.$main=this.$container.find(".main"),this.$toolbar=this.$container.find(this.settings.toolbarSelector),this.$statusMenuBtn=this.$toolbar.find(".statusmenubtn:first"),this.$statusMenuContainer=this.$statusMenuBtn.parent(),this.$siteMenuBtn=this.$container.find(".sitemenubtn:first"),this.$searchContainer=this.$toolbar.find(".search:first"),this.$search=this.$searchContainer.children("input:first"),this.$filterBtn=this.$searchContainer.children(".filter-btn:first"),this.$clearSearchBtn=this.$searchContainer.children(".clear-btn:first"),this.$sidebar=this.$container.find(".sidebar:first"),this.$sourceActionsContainer=this.$sidebar.find("#source-actions"),this.$elements=this.$container.find(".elements:first"),this.$updateSpinner=this.$elements.find(".spinner"),this.$updateSpinner.length||(this.$updateSpinner=$("<div/>",{class:"update-spinner spinner spinner-absolute"}).appendTo(this.$elements)),this.$countSpinner=this.$container.find("#count-spinner"),this.$countContainer=this.$container.find("#count-container"),this.$actionsContainer=this.$container.find("#actions-container"),this.$exportBtn=this.$container.find("#export-btn"),this.settings.hideSidebar&&(this.$sidebar.hide(),$(".body, .content",this.$container).removeClass("has-sidebar")),this.initSources()){if(this.$statusMenuBtn.length&&(this.statusMenu=this.$statusMenuBtn.menubtn().data("menubtn").menu,this.statusMenu.on("optionselect",this._handleStatusChange.bind(this))),this.$siteMenuBtn.length){this.siteMenu=this.$siteMenuBtn.menubtn().data("menubtn").menu;var a=this.siteMenu.$options.filter(".sel:first");if(a.length||(a=this.siteMenu.$options.first()),a.length?this._setSite(a.data("site-id")):this.settings.criteria={id:"0"},this.siteMenu.on("optionselect",this._handleSiteChange.bind(this)),this.siteId){var n=this.settings.defaultSiteId||Craft.cp.getSiteId();if(n&&n!=this.siteId){var r=this.siteMenu.$options.filter('[data-site-id="'+n+'"]:first');r.length&&r.trigger("click")}}}else this.settings.criteria&&this.settings.criteria.siteId&&"*"!==this.settings.criteria.siteId?this._setSite(this.settings.criteria.siteId):this._setSite(Craft.siteId);this.settings.criteria&&this.settings.criteria.siteId&&delete this.settings.criteria.siteId,this.addListener(this.$search,"input",(function(){!s.searching&&s.$search.val()?s.startSearching():s.searching&&!s.$search.val()&&s.stopSearching(),s.searchTimeout&&clearTimeout(s.searchTimeout),s.searchTimeout=setTimeout(s.updateElementsIfSearchTextChanged.bind(s),500)})),this.addListener(this.$search,"keypress",(function(t){t.keyCode===Garnish.RETURN_KEY&&(t.preventDefault(),s.searchTimeout&&clearTimeout(s.searchTimeout),s.updateElementsIfSearchTextChanged())})),this.addListener(this.$clearSearchBtn,"click",(function(){s.clearSearch(!0),Garnish.isMobileBrowser(!0)||s.$search.trigger("focus")})),Garnish.isMobileBrowser(!0)||this.$search.trigger("focus"),this.viewMenus={},this.filterHuds={},this.addListener(this.$filterBtn,"click","showFilterHud");var o=Craft.getQueryParams();if(o.status){var l;switch(o.status){case"trashed":l="[data-trashed]";break;case"drafts":l="[data-drafts]";break;default:l='[data-status="'.concat(o.status,'"]')}var h=this.statusMenu.$options.filter(l);h.length?this.statusMenu.selectOption(h[0]):this.setQueryParam("status",null)}if(this.addListener(this.$exportBtn,"click","_showExportHud"),this.initialized=!0,this.afterInit(),this.selectDefaultSource(),o.sort){var d=o.sort.lastIndexOf("-");if(-1!==d){var c=o.sort.substring(0,d),u=o.sort.substring(d+1);this.setSelectedSortAttribute(c,u)}}this.setPage(Craft.pageNum),this.updateElements(!0)}},afterInit:function(){this.onAfterInit()},_createCancelToken:function(){return this._cancelToken=axios.CancelToken.source(),this._cancelToken.token},_cancelRequests:function(){var t=this;this._cancelToken&&(this._ignoreFailedRequest=!0,this._cancelToken.cancel(),Garnish.requestAnimationFrame((function(){t._ignoreFailedRequest=!1})))},getSourceContainer:function(){return this.$sidebar.find("nav > ul")},get $sources(){if(this.sourceSelect)return this.sourceSelect.$items},getSite:function(){var t=this;if(this.siteId)return Craft.sites.find((function(e){return e.id==t.siteId}))},initSources:function(){var t=this._getSourcesInList(this.getSourceContainer(),!0);if(0===t.length)return!1;this.sourceSelect||(this.sourceSelect=new Garnish.Select(this.$sidebar.find("nav"),{multi:!1,allowEmpty:!1,vertical:!0,onSelectionChange:this._handleSourceSelectionChange.bind(this)})),this.sourcesByKey={};for(var e=0;e<t.length;e++)this.initSource($(t[e]));return!0},selectDefaultSource:function(){var t,e;return"index"===this.settings.context&&(t=Craft.getQueryParam("source")),t||(t=this.getDefaultSourceKey()),t&&(e=this.getSourceByKey(t),-1===this.$visibleSources.index(e)&&(e=null)),t&&e||(e=this.$visibleSources.first()),this.selectSource(e)},refreshSources:function(){var t=this;this.sourceSelect.removeAllItems(),this.setIndexBusy(),Craft.sendActionRequest("POST",this.settings.refreshSourcesAction,{data:{context:this.settings.context,elementType:this.elementType}}).then((function(e){t.setIndexAvailable(),t.getSourceContainer().replaceWith(e.data.html),t.initSources(),t.selectDefaultSource()})).catch((function(){t.setIndexAvailable(),t._ignoreFailedRequest||Craft.cp.displayError(Craft.t("app","A server error occurred."))}))},initSource:function(t){this.sourceSelect.addItems(t),this.initSourceToggle(t),this.sourcesByKey[t.data("key")]=t,t.data("hasNestedSources")&&-1!==this.instanceState.expandedSources.indexOf(t.data("key"))&&this._expandSource(t)},initSourceToggle:function(t){this.deinitSourceToggle(t);var e=this._getSourceToggle(t);e.length?(this.addListener(t,"dblclick","_handleSourceDblClick"),this.addListener(e,"click","_handleSourceToggleClick"),t.data("hasNestedSources",!0)):t.data("hasNestedSources",!1)},deinitSource:function(t){this.sourceSelect.removeItems(t),this.deinitSourceToggle(t),delete this.sourcesByKey[t.data("key")]},deinitSourceToggle:function(t){t.data("hasNestedSources")&&(this.removeListener(t,"dblclick"),this.removeListener(this._getSourceToggle(t),"click")),t.removeData("hasNestedSources")},getDefaultInstanceState:function(){return{selectedSource:null,expandedSources:[]}},getDefaultSourceKey:function(){if(this.settings.defaultSource){for(var t=this.settings.defaultSource.split("/"),e="",i=0;i<t.length;i++){e+=t[i];var s=this.getSourceByKey(e);if(!s)return this.instanceState.selectedSource;this._expandSource(s),e+="/"}return this._setSite(this.siteId),this.settings.defaultSource}return this.instanceState.selectedSource},getDefaultExpandedSources:function(){return this.instanceState.expandedSources},startSearching:function(){this.$clearSearchBtn.removeClass("hidden"),this.searching=!0,this.sortByScore=!0,this.activeViewMenu&&this.activeViewMenu.updateSortField()},clearSearch:function(t){this.searching&&(this.$search.val(""),this.searchTimeout&&clearTimeout(this.searchTimeout),this.stopSearching(),t?this.updateElementsIfSearchTextChanged():this.searchText=null)},stopSearching:function(){this.$clearSearchBtn.addClass("hidden"),this.searching=!1,this.sortByScore=!1,this.activeViewMenu&&this.activeViewMenu.updateSortField()},setInstanceState:function(t,e){"object"===n(t)?$.extend(this.instanceState,t):this.instanceState[t]=e,this.storeInstanceState()},storeInstanceState:function(){this.settings.storageKey&&Craft.setLocalStorage(this.settings.storageKey,this.instanceState)},getSourceState:function(t,e,i){return t=t.replace(/\/.*/,""),void 0===this.sourceStates[t]&&(this.sourceStates[t]={}),void 0===e?this.sourceStates[t]:void 0!==this.sourceStates[t][e]?this.sourceStates[t][e]:void 0!==i?i:null},getSelectedSourceState:function(t,e){return this.getSourceState(this.instanceState.selectedSource,t,e)},setSelecetedSourceState:function(t,e){var i=this.getSelectedSourceState();if("object"===n(t))for(var s in t)t.hasOwnProperty(s)&&(null!==t[s]?i[s]=t[s]:delete i[s]);else null!==e?i[t]=e:delete i[t];var a=this.instanceState.selectedSource.replace(/\/.*/,"");for(var r in this.sourceStates[a]=i,this.sourceStates)this.sourceStates.hasOwnProperty(r)&&r.includes("/")&&delete this.sourceStates[r];Craft.setLocalStorage(this.sourceStatesStorageKey,this.sourceStates)},storeSortAttributeAndDirection:function(){},setPage:function(t){if("index"===this.settings.context){t=Math.max(t,1),this.page=t;var e=Craft.getPageUrl(this.page);history.replaceState({},"",e)}},_resetCount:function(){this.resultSet=null,this.totalResults=null},updateSourceMenu:function(){var t=this;if(this.$sourceActionsContainer.length){this.$sourceActionsBtn&&(this.$sourceActionsBtn.data("trigger").destroy(),this.$sourceActionsContainer.empty(),$("#source-actions-menu").remove(),this.$sourceActionsBtn=null);var e=this.getSourceActions();if(e.length){var i=[e.filter((function(t){return!t.destructive&&!t.administrative})),e.filter((function(t){return t.destructive&&!t.administrative})),e.filter((function(t){return t.administrative}))].filter((function(t){return t.length}));this.$sourceActionsBtn=$("<button/>",{type:"button",class:"btn settings icon menubtn",title:Craft.t("app","Source settings"),"aria-label":Craft.t("app","Source settings"),"aria-controls":"source-actions-menu"}).appendTo(this.$sourceActionsContainer);var s=$("<div/>",{id:"source-actions-menu",class:"menu menu--disclosure"}).appendTo(this.$sourceActionsContainer);i.forEach((function(e,i){0!==i&&$("<hr/>").appendTo(s),t._buildActionList(e).appendTo(s)})),this.$sourceActionsBtn.disclosureMenu()}}},_buildActionList:function(t){var e=this,i=$("<ul/>");return t.forEach((function(t){var s=$("<button/>",{type:"button",class:"menu-option",text:t.label}).on("click",(function(){e.$sourceActionsBtn.data("trigger").hide(),t.onSelect&&t.onSelect()}));t.destructive&&s.addClass("error"),$("<li/>").append(s).appendTo(i)})),i},getSourceActions:function(){var t=this,e=[];return Craft.userIsAdmin&&Craft.allowAdminChanges&&e.push({label:Craft.t("app","Customize sources"),administrative:!0,onSelect:function(){t.createCustomizeSourcesModal()}}),e},updateViewMenu:function(){this.activeViewMenu&&this.activeViewMenu===this.viewMenus[this.rootSourceKey]||(this.activeViewMenu&&this.activeViewMenu.hideTrigger(),this.viewMenus[this.rootSourceKey]||(this.viewMenus[this.rootSourceKey]=new r(this,this.$rootSource)),this.activeViewMenu=this.viewMenus[this.rootSourceKey],this.activeViewMenu.showTrigger())},getViewParams:function(){var t={siteId:this.siteId,search:this.searchText,offset:this.settings.batchSize*(this.page-1),limit:this.settings.batchSize};this.settings.canHaveDrafts&&(this.drafts||"index"===this.settings.context&&!this.status)&&(t.drafts=this.drafts||null,t.savedDraftsOnly=!0,this.drafts||(t.draftOf=!1)),this.trashed&&(t.trashed=!0),Garnish.hasAttr(this.$source,"data-override-status")||(t.status=this.status),$.extend(t,this.settings.criteria);var e={context:this.settings.context,elementType:this.elementType,source:this.instanceState.selectedSource,condition:this.settings.condition,criteria:t,disabledElementIds:this.settings.disabledElementIds,viewState:$.extend({},this.getSelectedSourceState()),paginated:this._isViewPaginated()?1:0},i=s(this.getSortAttributeAndDirection(),2),a=i[0],n=i[1];return e.viewState.order=a,e.viewState.sort=n,"structure"===a&&(void 0===this.instanceState.collapsedElementIds&&(this.instanceState.collapsedElementIds=[]),e.collapsedElementIds=this.instanceState.collapsedElementIds),this.filterHuds[this.siteId]&&this.filterHuds[this.siteId][this.sourceKey]&&this.filterHuds[this.siteId][this.sourceKey].serialized&&(e.filters=this.filterHuds[this.siteId][this.sourceKey].serialized),this.trigger("registerViewParams",{params:e}),e},updateElements:function(t,e){var i=this;if(this.initialized){this._cancelRequests(),this.setIndexBusy(),this.view&&(this.view.destroy(),delete this.view),!0!==t&&(this.setPage(1),this._resetCount());var s=this.getViewParams();Craft.sendActionRequest("POST",this.settings.updateElementsAction,{data:s,cancelToken:this._createCancelToken()}).then((function(t){if(i.setIndexAvailable(),("index"===i.settings.context?Garnish.$scrollContainer:i.$main).scrollTop(0),i._updateView(s,t.data),e){var a=i.view.getElementContainer();Garnish.firstFocusableElement(a).trigger("focus")}})).catch((function(t){i.setIndexAvailable(),i._ignoreFailedRequest||Craft.cp.displayError(Craft.t("app","A server error occurred."))}))}},updateElementsIfSearchTextChanged:function(){this.searchText!==(this.searchText=this.searching?this.$search.val():null)&&this.updateElements()},showActionTriggers:function(){this.showingActionTriggers||(this._$triggers?this._$triggers.appendTo(this.$actionsContainer):this._createTriggers(),this.showingActionTriggers=!0)},submitAction:function(t,e){var i=this,s=this.view.getSelectedElementIds();if(0!==s.length&&("string"==typeof t&&(t=this._findAction(t)),!t.confirm||confirm(t.confirm))){this._cancelRequests();var a=this.getViewParams();e=e?Craft.expandPostArray(e):{};var n=$.extend(a,t.settings||{},e,{elementAction:t.type,elementIds:s});this.setIndexBusy(),this._autoSelectElements=s,t.download?(Craft.csrfTokenName&&(n[Craft.csrfTokenName]=Craft.csrfTokenValue),Craft.downloadFromUrl("POST",Craft.getActionUrl(this.settings.submitActionsAction),n).then((function(t){i.setIndexAvailable()})).catch((function(t){i.setIndexAvailable()}))):Craft.sendActionRequest("POST",this.settings.submitActionsAction,{data:n,cancelToken:this._createCancelToken()}).then((function(e){i._resetCount(),i._updateView(a,e.data),void 0!==e.data.badgeCounts&&i._updateBadgeCounts(e.data.badgeCounts),e.data.message&&Craft.cp.displaySuccess(e.data.message),i.afterAction(t,n)})).catch((function(t){var e=t.response;Craft.cp.displayError(e.data.message)})).finally((function(){i.setIndexAvailable()}))}},_findAction:function(t){for(var e=0;e<this.actions.length;e++)if(this.actions[e].type===t)return this.actions[e];throw"Invalid element action: ".concat(t)},afterAction:function(t,e){Craft.cp.runQueue(),this.onAfterAction(t,e)},hideActionTriggers:function(){this.showingActionTriggers&&(this._$triggers.detach(),this.showingActionTriggers=!1)},updateActionTriggers:function(){if(this.actions){var t=this.view.getSelectedElements().length;0!==t?(t===this.view.getEnabledElements().length?(this.$selectAllCheckbox.removeClass("indeterminate"),this.$selectAllCheckbox.addClass("checked"),this.$selectAllCheckbox.attr("aria-checked","true")):(this.$selectAllCheckbox.addClass("indeterminate"),this.$selectAllCheckbox.removeClass("checked"),this.$selectAllCheckbox.attr("aria-checked","mixed")),this.showActionTriggers()):(this.$selectAllCheckbox.removeClass("indeterminate checked"),this.$selectAllCheckbox.attr("aria-checked","false"),this.hideActionTriggers())}},getSelectedElements:function(){return this.view?this.view.getSelectedElements():$()},getSelectedElementIds:function(){return this.view?this.view.getSelectedElementIds():[]},setStatus:function(t){var e=this.statusMenu.$options.filter('a[data-status="'+t+'"]:first');e.length&&this.statusMenu.selectOption(e[0])},getSelectedSortAttribute:function(t){if(t=t||this.$source){var e=this.getSourceState(t.data("key"),"order");if(this.getSortOption(e,t))return e}return this.getDefaultSort()[0]},getSelectedSortDirection:function(t){if(t=t||this.$source){var e=this.getSourceState(t.data("key"),"sort");if(["asc","desc"].includes(e))return e}return this.getDefaultSort()[1]},setSortAttribute:function(t){this.setSelectedSortAttribute(t)},setSelectedSortAttribute:function(t,e){if("score"===t)return this.sortByScore=!0,void(this.activeViewMenu&&this.activeViewMenu.updateSortField());this.sortByScore=!1;var i=this.getSortOption(t);if(i){e="structure"===t?"asc":e||i.defaultDir;var a=[],n=[t],r=this.getSelectedSourceState("order");r&&r!==t&&(a.push([r,this.getSelectedSourceState("sort")]),n.push(r));for(var o=this.getSelectedSourceState("orderHistory",[]),l=0;l<o.length;l++){var h=s(o[l],1)[0];if(!h||n.includes(h))break;a.push(o[l]),n.push(h)}this.setSelecetedSourceState({order:t,sort:e,orderHistory:a}),this.activeViewMenu&&this.activeViewMenu.updateSortField(),Craft.setQueryParam("sort","".concat(t,"-").concat(e))}else console.warn("Invalid sort option: ".concat(t))},setSortDirection:function(t){this.setSelectedSortDirection(t)},setSelectedSortDirection:function(t){this.setSelectedSortAttribute(this.getSelectedSortAttribute(),t)},canSortByStructure:function(){return!(this.trashed||this.drafts||this.searching||this.sortByScore)},getSortAttributeAndDirection:function(){if(this.searching&&this.sortByScore)return["score","desc"];var t=this.getSelectedSortAttribute(),e=this.getSelectedSortDirection();if("structure"===t)if(this.canSortByStructure())e="asc";else{var i=this.getSortOptions().find((function(t){return"structure"!==t.attr}));t=i.attr,e=i.defaultDir}return[t,e]},getSortLabel:function(t){var e=this.getSortOption(t);return e?e.label:null},getSelectedViewMode:function(){return this.getSelectedSourceState("mode")||"table"},getSourceLevel:function(t){return t.parentsUntil("nav","ul.nested").length+1},getParentSource:function(t){var e=t.parent().parent().siblings("a");return e.length?e:null},getRootSource:function(t){for(var e;e=this.getParentSource(t);)t=e;return t},getSourceByKey:function(t){return this.sourcesByKey[t]||null},selectSource:function(t){var e=$(t);if(!this.sourcesByKey||!Object.keys(this.sourcesByKey).length)return!1;if(this.$source&&this.$source[0]&&this.$source[0]===e[0]&&e.data("key")===this.sourceKey)return!1;if(this.hideActionTriggers(),this.$source=e,this.$rootSource=this.getRootSource(e),this.sourceKey=e.data("key"),this.rootSourceKey=this.$rootSource.data("key"),this.setInstanceState("selectedSource",this.sourceKey),this.sourceSelect.selectItem(e),Craft.cp.updateContentHeading(),this.searching&&(this.searchText=null,this.$search.val(""),this.stopSearching()),this.$statusMenuBtn.length&&(Garnish.hasAttr(this.$source,"data-override-status")?this.$statusMenuContainer.addClass("hidden"):this.$statusMenuContainer.removeClass("hidden"),this.trashed)){var i=this.statusMenu.$options.first();this.setStatus(i.data("status"))}if(this.$viewModeBtnContainer&&this.$viewModeBtnContainer.remove(),this.viewModeBtns={},this.viewMode=null,this.sourceViewModes=this.getViewModesForSource(),this.sourceViewModes.length>1){this.$viewModeBtnContainer=$('<section class="btngroup btngroup--exclusive"/>').attr("aria-label",Craft.t("app","View")),this.activeViewMenu?this.$viewModeBtnContainer.insertBefore(this.activeViewMenu.$trigger):this.$viewModeBtnContainer.appendTo(this.$toolbar);for(var s=0;s<this.sourceViewModes.length;s++){var a=this.sourceViewModes[s],n=$("<button/>",{type:"button",class:"btn"+(void 0!==a.className?" ".concat(a.className):""),"data-view":a.mode,"data-icon":a.icon,"aria-label":a.title,"aria-pressed":"false",title:a.title}).appendTo(this.$viewModeBtnContainer);this.viewModeBtns[a.mode]=n,this.addListener(n,"click",{mode:a.mode},(function(t){this.selectViewMode(t.data.mode),this.updateElements()}))}}var r=this.getSelectedViewMode();if(r&&this.doesSourceHaveViewMode(r)||(r=this.viewMode&&this.doesSourceHaveViewMode(this.viewMode)?this.viewMode:this.sourceViewModes[0].mode),this.selectViewMode(r),this.updateSourceMenu(),this.updateViewMenu(),this.updateFilterBtn(),this.onSelectSource(),"index"===this.settings.context){var o=Craft.getQueryParams();o.source=this.sourceKey,Craft.setUrl(Craft.getUrl(Craft.path,o))}return!0},selectSourceByKey:function(t){var e=this.getSourceByKey(t);return!!e&&this.selectSource(e)},getSortOptions:function(t){var e=((t=t||this.$rootSource)?t.data("sort-opts"):null)||[];return e.find((function(t){return"structure"!==t.attr}))||e.push({label:Craft.t("app","Title"),attr:"title",defaultDir:"asc"}),e},getSortOption:function(t,e){return this.getSortOptions(e).find((function(e){return e.attr===t}))||null},getDefaultSort:function(t){if(t=t||this.$rootSource){var e=t.data("default-sort");if(e){"string"==typeof e&&(e=[e]);var i=this.getSortOption(e[0],t);if(i)return e[1]||(e[1]=i.defaultDir),e}}var s=this.getSortOptions(t);return[s[0].attr,s[0].defaultDir]},getTableColumnOptions:function(t){return((t=t||this.$rootSource)?t.data("table-col-opts"):null)||[]},getTableColumnOption:function(t,e){return this.getTableColumnOptions(e).find((function(e){return e.attr===t}))||null},getDefaultTableColumns:function(t){return((t=t||this.$rootSource)?t.data("default-table-cols"):null)||[]},getSelectedTableColumns:function(t){var e=this;if(t=t||this.$rootSource){var i=this.getSourceState(t.data("key"),"tableColumns");if(i)return i.filter((function(i){return!!e.getTableColumnOption(i,t)}))}return this.getDefaultTableColumns(t)},setSelectedTableColumns:function(t){this.setSelecetedSourceState({tableColumns:t}),this.activeViewMenu&&this.activeViewMenu.updateTableColumnField()},getViewModesForSource:function(){var t=[{mode:"table",title:Craft.t("app","Display in a table"),icon:"list"}];return this.$source&&Garnish.hasAttr(this.$source,"data-has-thumbs")&&t.push({mode:"thumbs",title:Craft.t("app","Display as thumbnails"),icon:"grid"}),t},doesSourceHaveViewMode:function(t){for(var e=0;e<this.sourceViewModes.length;e++)if(this.sourceViewModes[e].mode===t)return!0;return!1},selectViewMode:function(t,e){e||this.doesSourceHaveViewMode(t)||(t=this.sourceViewModes[0].mode),t!==this.viewMode&&(this.viewMode&&void 0!==this.viewModeBtns[this.viewMode]&&this.viewModeBtns[this.viewMode].removeClass("active").attr("aria-pressed","false"),this.viewMode=t,this.setSelecetedSourceState("mode",this.viewMode),void 0!==this.viewModeBtns[this.viewMode]&&this.viewModeBtns[this.viewMode].addClass("active").attr("aria-pressed","true"))},createView:function(t,e){return new(this.getViewClass(t))(this,this.$elements,e)},getViewClass:function(t){switch(t){case"table":return Craft.TableElementIndexView;case"thumbs":return Craft.ThumbsElementIndexView;default:throw'View mode "'.concat(t,'" not supported.')}},rememberDisabledElementId:function(t){-1===$.inArray(t,this.settings.disabledElementIds)&&this.settings.disabledElementIds.push(t)},forgetDisabledElementId:function(t){var e=$.inArray(t,this.settings.disabledElementIds);-1!==e&&this.settings.disabledElementIds.splice(e,1)},enableElements:function(t){t.removeClass("disabled").parents(".disabled").removeClass("disabled");for(var e=0;e<t.length;e++){var i=$(t[e]).data("id");this.forgetDisabledElementId(i)}this.onEnableElements(t)},disableElements:function(t){t.removeClass("sel").addClass("disabled");for(var e=0;e<t.length;e++){var i=$(t[e]).data("id");this.rememberDisabledElementId(i)}this.onDisableElements(t)},getElementById:function(t){return this.view.getElementById(t)},enableElementsById:function(t){t=$.makeArray(t);for(var e=0;e<t.length;e++){var i=t[e],s=this.getElementById(i);s&&s.length?this.enableElements(s):this.forgetDisabledElementId(i)}},disableElementsById:function(t){t=$.makeArray(t);for(var e=0;e<t.length;e++){var i=t[e],s=this.getElementById(i);s&&s.length?this.disableElements(s):this.rememberDisabledElementId(i)}},selectElementAfterUpdate:function(t){null===this._autoSelectElements&&(this._autoSelectElements=[]),this._autoSelectElements.push(t)},addButton:function(t){this.getButtonContainer().append(t)},isShowingSidebar:function(){return null===this.showingSidebar&&(this.showingSidebar=this.$sidebar.length&&!this.$sidebar.hasClass("hidden")),this.showingSidebar},getButtonContainer:function(){if(this.settings.buttonContainer)return $(this.settings.buttonContainer);var t=$("#action-buttons");return t.length||(t=$('<div id="action-buttons"/>').appendTo($("#header"))),t},setIndexBusy:function(){this.$elements.addClass("busy"),this.$updateSpinner.appendTo(this.$elements),this.isIndexBusy=!0},setIndexAvailable:function(){this.$elements.removeClass("busy"),this.$updateSpinner.remove(),this.isIndexBusy=!1},createCustomizeSourcesModal:function(){var t=new Craft.CustomizeSourcesModal(this,{onHide:function(){t.destroy()}});return t},disable:function(){this.sourceSelect&&this.sourceSelect.disable(),this.view&&this.view.disable(),this.base()},enable:function(){this.sourceSelect&&this.sourceSelect.enable(),this.view&&this.view.enable(),this.base()},onAfterInit:function(){this.settings.onAfterInit(),this.trigger("afterInit")},onSelectSource:function(){this.settings.onSelectSource(this.sourceKey),this.trigger("selectSource",{sourceKey:this.sourceKey})},onSelectSite:function(){this.settings.onSelectSite(this.siteId),this.trigger("selectSite",{siteId:this.siteId})},onUpdateElements:function(){this.settings.onUpdateElements(),this.trigger("updateElements")},onSelectionChange:function(){this.settings.onSelectionChange(),this.trigger("selectionChange")},onEnableElements:function(t){this.settings.onEnableElements(t),this.trigger("enableElements",{elements:t})},onDisableElements:function(t){this.settings.onDisableElements(t),this.trigger("disableElements",{elements:t})},onAfterAction:function(t,e){this.settings.onAfterAction(t,e),this.trigger("afterAction",{action:t,params:e})},_handleSourceSelectionChange:function(){this.sourceSelect.totalSelected?this.selectSource(this.sourceSelect.$selectedItems)&&this.updateElements():this.sourceSelect.selectItem(this.$visibleSources.first())},_handleActionTriggerSubmit:function(t){t.preventDefault();var e=$(t.currentTarget);e.hasClass("disabled")||e.data("custom-handler")||this.submitAction(e.data("action"),Garnish.getPostData(e))},_handleMenuActionTriggerSubmit:function(t){var e=$(t.option);e.hasClass("disabled")||e.data("custom-handler")||this.submitAction(e.data("action"))},_handleStatusChange:function(t){this.statusMenu.$options.removeClass("sel");var e=$(t.selectedOption).addClass("sel");this.$statusMenuBtn.html(e.html()),this.trashed=!1,this.drafts=!1,this.status=null;var i=null;Garnish.hasAttr(e,"data-trashed")?(this.trashed=!0,i="trashed"):Garnish.hasAttr(e,"data-drafts")?(this.drafts=!0,i="drafts"):this.status=i=e.data("status")||null,this.activeViewMenu&&this.activeViewMenu.updateSortField(),Craft.setQueryParam("status",i),this.updateElements()},_handleSiteChange:function(t){this.siteMenu.$options.removeClass("sel");var e=$(t.selectedOption).addClass("sel");this.$siteMenuBtn.html(e.html()),this._setSite(e.data("site-id")),this.onSelectSite()},_setSite:function(t){var e=null===this.siteId;this.siteId=t,this.updateSourceVisibility(),!this.initialized||e||this.$source&&this.$source.length||!this.$visibleSources.length||this.selectSource(this.$visibleSources[0]);for(var i,s=this.getSourceContainer().children(".heading"),a=0;a<s.length;a++)0!==(i=s.eq(a)).has("> ul > li:not(.hidden)").length?i.removeClass("hidden"):i.addClass("hidden");this.initialized&&("index"===this.settings.context&&Craft.cp.setSiteId(t),this.updateElements(),this.updateFilterBtn())},updateSourceVisibility:function(){this.$visibleSources=$();for(var t=0;t<this.$sources.length;t++){var e=this.$sources.eq(t);Garnish.hasAttr(e,"data-disabled")||void 0!==e.data("sites")&&-1===e.data("sites").toString().split(",").indexOf(this.siteId.toString())?(e.parent().addClass("hidden"),this.$source&&this.$source.get(0)===e.get(0)&&(this.$source=null,this.$rootSource=null,this.sourceKey=null,this.rootSourceKey=null)):(e.parent().removeClass("hidden"),this.$visibleSources=this.$visibleSources.add(e))}},_handleSelectionChange:function(){this.updateActionTriggers(),this.onSelectionChange()},_handleSourceDblClick:function(t){this._toggleSource($(t.currentTarget)),t.stopPropagation()},_handleSourceToggleClick:function(t){this._toggleSource($(t.currentTarget).prev("a")),t.stopPropagation()},_getSourcesInList:function(t,e){var i=t.find("> li:not(.heading) > a");return e&&(i=i.add(t.find("> li.heading > ul > li > a"))),i},_getChildSources:function(t){var e=t.siblings("ul");return this._getSourcesInList(e)},_getSourceToggle:function(t){return t.siblings(".toggle")},_toggleSource:function(t){t.parent("li").hasClass("expanded")?this._collapseSource(t):this._expandSource(t)},_expandSource:function(t){t.next(".toggle").attr({"aria-expanded":"true","aria-label":Craft.t("app","Hide nested sources")}),t.parent("li").addClass("expanded");for(var e=this._getChildSources(t),i=0;i<e.length;i++)this.initSource($(e[i])),this.$visibleSources&&(this.$visibleSources=this.$visibleSources.add(e[i]));var s=t.data("key");-1===this.instanceState.expandedSources.indexOf(s)&&(this.instanceState.expandedSources.push(s),this.storeInstanceState())},_collapseSource:function(t){t.next(".toggle").attr({"aria-expanded":"false","aria-label":Craft.t("app","Show nested sources")}),t.parent("li").removeClass("expanded");for(var e=this._getChildSources(t),i=0;i<e.length;i++)this.deinitSource($(e[i])),this.$visibleSources=this.$visibleSources.not(e[i]);var s=this.instanceState.expandedSources.indexOf(t.data("key"));-1!==s&&(this.instanceState.expandedSources.splice(s,1),this.storeInstanceState())},_isViewPaginated:function(){return"index"===this.settings.context&&"structure"!==this.getSortAttributeAndDirection()[0]},_updateView:function(t,e){var i=this;this.actions&&(this.hideActionTriggers(),this.actions=this.actionsHeadHtml=this.actionsBodyHtml=this._$triggers=null);var s=document.activeElement;this.$countContainer.length&&(this.$countSpinner.removeClass("hidden"),this.$countContainer.html(""),this._countResults().then((function(t){i.$countSpinner.addClass("hidden");var e=Craft.elementTypeNames[i.elementType]?Craft.elementTypeNames[i.elementType][2]:i.settings.elementTypeName.toLowerCase(),s=Craft.elementTypeNames[i.elementType]?Craft.elementTypeNames[i.elementType][3]:i.settings.elementTypePluralName.toLowerCase();if(i._isViewPaginated()){var a=Math.min(i.settings.batchSize*(i.page-1)+1,t),n=Math.min(a+(i.settings.batchSize-1),t),r=Craft.t("app","{first, number}-{last, number} of {total, number} {total, plural, =1{{item}} other{{items}}}",{first:a,last:n,total:t,item:e,items:s}),o=$('<div class="flex pagination"/>').appendTo(i.$countContainer),l=Math.max(Math.ceil(t/i.settings.batchSize),1),h=$("<nav/>",{class:"flex","aria-label":Craft.t("app","{element} pagination",{element:e})}).appendTo(o),d=$("<button/>",{role:"button",class:"page-link prev-page"+(i.page>1?"":" disabled"),disabled:1===i.page,title:Craft.t("app","Previous Page")}).appendTo(h),c=$("<button/>",{role:"button",class:"page-link next-page"+(i.page<l?"":" disabled"),disabled:i.page===l,title:Craft.t("app","Next Page")}).appendTo(h);$("<div/>",{class:"page-info",text:r}).appendTo(o),i.page>1&&i.addListener(d,"click",(function(){this.removeListener(d,"click"),this.removeListener(c,"click"),this.setPage(this.page-1),this.updateElements(!0,!0)})),i.page<l&&i.addListener(c,"click",(function(){this.removeListener(d,"click"),this.removeListener(c,"click"),this.setPage(this.page+1),this.updateElements(!0,!0)}))}else{var u=Craft.t("app","{total, number} {total, plural, =1{{item}} other{{items}}}",{total:t,item:e,items:s});i.$countContainer.text(u)}})).catch((function(){i.$countSpinner.addClass("hidden")}))),this.$elements.html(e.html),Craft.appendHeadHtml(e.headHtml),Craft.appendBodyHtml(e.bodyHtml),this.$selectAllContainer=this.$elements.find(".selectallcontainer:first"),e.actions&&e.actions.length?this.$selectAllContainer.length&&(this.actions=e.actions,this.actionsHeadHtml=e.actionsHeadHtml,this.actionsBodyHtml=e.actionsBodyHtml,this.$selectAllCheckbox=$('<div class="checkbox"/>').prependTo(this.$selectAllContainer).attr({role:"checkbox",tabindex:"0","aria-checked":"false","aria-label":Craft.t("app","Select all")}),this.addListener(this.$selectAllCheckbox,"click",(function(){0===this.view.getSelectedElements().length?this.view.selectAllElements():this.view.deselectAllElements()})),this.addListener(this.$selectAllCheckbox,"keydown",(function(t){t.keyCode===Garnish.SPACE_KEY&&(t.preventDefault(),$(t.currentTarget).trigger("click"))}))):(this.$selectAllContainer.siblings().length||this.$selectAllContainer.parent(".header").remove(),this.$selectAllContainer.remove()),this.exporters=e.exporters,this.exportersByType=Craft.index(this.exporters||[],(function(t){return t.type})),this.exporters&&this.exporters.length?this.$exportBtn.removeClass("hidden"):this.$exportBtn.addClass("hidden");var a=this.actions||this.settings.selectable;if(this.view=this.createView(this.getSelectedViewMode(),{context:this.settings.context,batchSize:"index"!==this.settings.context||"structure"===this.getSortAttributeAndDirection()[0]?this.settings.batchSize:null,params:t,selectable:a,multiSelect:this.actions||this.settings.multiSelect,checkboxMode:!!this.actions,onSelectionChange:this._handleSelectionChange.bind(this)}),s&&s.id&&!document.body.contains(s)&&$("#".concat(s.id)).focus(),this._autoSelectElements){if(a)for(var n=0;n<this._autoSelectElements.length;n++)this.view.selectElementById(this._autoSelectElements[n]);this._autoSelectElements=null}this.onUpdateElements()},_updateBadgeCounts:function(t){for(var e in t)if(t.hasOwnProperty(e)){var i=this.getSourceByKey(e);if(i){var s=i.children(".badge");null!==t[e]?(s.length||(s=$('<span class="badge"/>').appendTo(i)),s.text(t[e])):s&&s.remove()}}},_countResults:function(){var t=this;return new Promise((function(e,i){if(null!==t.totalResults)e(t.totalResults);else{var s=t.getViewParams();delete s.criteria.offset,delete s.criteria.limit,null===t.resultSet&&(t.resultSet=Math.floor(1e8*Math.random())),s.resultSet=t.resultSet,Craft.sendActionRequest("POST",t.settings.countElementsAction,{data:s,cancelToken:t._createCancelToken()}).then((function(s){s.data.resultSet==t.resultSet?(t.totalResults=s.data.count,e(s.data.count)):i()})).catch(i)}}))},_createTriggers:function(){var t,e,i=[],s=[],a=[];for(t=0;t<this.actions.length;t++){var n=this.actions[t];if(n.trigger){var r=$('<form id="'+Craft.formatInputId(n.type)+'-actiontrigger"/>').data("action",n).append(n.trigger);this.addListener(r,"submit","_handleActionTriggerSubmit"),i.push(r)}else n.destructive?a.push(n):s.push(n)}if(s.length||a.length){var o=$("<form/>");e=$("<button/>",{type:"button",class:"btn menubtn","data-icon":"settings",title:Craft.t("app","Actions")}).appendTo(o);var l=$('<ul class="menu"/>').appendTo(o),h=this._createMenuTriggerList(s,!1),d=this._createMenuTriggerList(a,!0);h&&h.appendTo(l),h&&d&&$("<hr/>").appendTo(l),d&&d.appendTo(l),i.push(o)}for(this._$triggers=$(),t=0;t<i.length;t++){var c=$("<div/>").append(i[t]);this._$triggers=this._$triggers.add(c)}this._$triggers.appendTo(this.$actionsContainer),Craft.appendHeadHtml(this.actionsHeadHtml),Craft.appendBodyHtml(this.actionsBodyHtml),Craft.initUiElements(this._$triggers),e&&e.data("menubtn").on("optionSelect",this._handleMenuActionTriggerSubmit.bind(this))},_showExportHud:function(){var t=this;this.$exportBtn.addClass("active"),this.$exportBtn.attr("aria-expanded","true");for(var e=$("<form/>",{class:"export-form"}),i=[],s=0;s<this.exporters.length;s++)i.push({label:this.exporters[s].name,value:this.exporters[s].type});var a=Craft.ui.createSelectField({label:Craft.t("app","Export Type"),options:i,class:"fullwidth"}).appendTo(e),n=Craft.ui.createSelectField({label:Craft.t("app","Format"),options:[{label:"CSV",value:"csv"},{label:"JSON",value:"json"},{label:"XML",value:"xml"}],class:"fullwidth"}).appendTo(e),r=a.find("select");this.addListener(r,"change",(function(){var e=r.val();t.exportersByType[e].formattable?n.removeClass("hidden"):n.addClass("hidden")})),r.trigger("change");var o=this.view.getSelectedElementIds();if(!o.length)var l=Craft.ui.createTextField({label:Craft.t("app","Limit"),placeholder:Craft.t("app","No limit"),type:"number",min:1}).appendTo(e);var h=Craft.ui.createSubmitButton({class:"fullwidth",label:Craft.t("app","Export"),spinner:!0}).appendTo(e);new Garnish.HUD(this.$exportBtn,e).on("hide",(function(){t.$exportBtn.removeClass("active"),t.$exportBtn.attr("aria-expanded","false")}));var d=!1;this.addListener(e,"submit",(function(t){var e=this;if(t.preventDefault(),!d){d=!0,h.addClass("loading");var i=this.getViewParams();if(delete i.criteria.offset,delete i.criteria.limit,delete i.collapsedElementIds,i.type=a.find("select").val(),i.format=n.find("select").val(),o.length)i.criteria.id=o;else{var s=parseInt(l.find("input").val());s&&!isNaN(s)&&(i.criteria.limit=s)}Craft.csrfTokenValue&&(i[Craft.csrfTokenName]=Craft.csrfTokenValue),Craft.downloadFromUrl("POST",Craft.getActionUrl("element-indexes/export"),i).catch((function(){e._ignoreFailedRequest||Craft.cp.displayError(Craft.t("app","A server error occurred."))})).finally((function(){d=!1,h.removeClass("loading")}))}}))},_createMenuTriggerList:function(t,e){if(t&&t.length){for(var i=$("<ul/>"),s=0;s<t.length;s++)$("<li/>").append($("<a/>",{id:Craft.formatInputId(t[s].type)+"-actiontrigger",class:e?"error":null,data:{action:t[s]},text:t[s].name})).appendTo(i);return i}},showFilterHud:function(){this.filterHuds[this.siteId]||(this.filterHuds[this.siteId]={}),this.filterHuds[this.siteId][this.sourceKey]?this.filterHuds[this.siteId][this.sourceKey].show():(this.filterHuds[this.siteId][this.sourceKey]=new o(this,this.sourceKey,this.siteId),this.updateFilterBtn())},updateFilterBtn:function(){this.$filterBtn.removeClass("active"),this.filterHuds[this.siteId]&&this.filterHuds[this.siteId][this.sourceKey]?(this.$filterBtn.attr("aria-controls",this.filterHuds[this.siteId][this.sourceKey].id).attr("aria-expanded",this.filterHuds[this.siteId][this.sourceKey].showing?"true":"false"),(this.filterHuds[this.siteId][this.sourceKey].showing||this.filterHuds[this.siteId][this.sourceKey].hasRules())&&this.$filterBtn.addClass("active")):this.$filterBtn.attr("aria-controls",null)}},{defaults:{context:"index",modal:null,storageKey:null,condition:null,criteria:null,batchSize:100,disabledElementIds:[],selectable:!1,multiSelect:!1,buttonContainer:null,hideSidebar:!1,toolbarSelector:".toolbar:first",refreshSourcesAction:"element-indexes/get-source-tree-html",updateElementsAction:"element-indexes/get-elements",countElementsAction:"element-indexes/count-elements",submitActionsAction:"element-indexes/perform-action",defaultSiteId:null,defaultSource:null,canHaveDrafts:!1,elementTypeName:Craft.t("app","Element"),elementTypePluralName:Craft.t("app","Elements"),onAfterInit:$.noop,onSelectSource:$.noop,onSelectSite:$.noop,onUpdateElements:$.noop,onSelectionChange:$.noop,onEnableElements:$.noop,onDisableElements:$.noop,onAfterAction:$.noop}});var r=Garnish.Base.extend({elementIndex:null,$source:null,sourceKey:null,menu:null,id:null,$trigger:null,$container:null,$sortAttributeSelect:null,$sortDirectionPicker:null,sortDirectionListbox:null,$tableColumnsContainer:null,$revertContainer:null,$revertBtn:null,$closeBtn:null,init:function(t,e){var i=this;this.elementIndex=t,this.$source=e,this.sourceKey=e.data("key"),this.id="view-menu-".concat(Math.floor(1e9*Math.random())),this.$trigger=$("<button/>",{type:"button",class:"btn menubtn hidden",text:Craft.t("app","View"),"aria-label":Craft.t("app","View settings"),"aria-controls":this.id,"data-icon":"sliders"}).appendTo(this.elementIndex.$toolbar),this.$container=$("<div/>",{id:this.id,class:"menu menu--disclosure element-index-view-menu","data-align":"right"}).appendTo(Garnish.$bod),this._buildMenu(),this.addListener(this.$container,"mousedown",(function(t){t.stopPropagation()})),this.menu=new Garnish.DisclosureMenu(this.$trigger),this.menu.on("show",(function(){i.$trigger.addClass("active")})),this.menu.on("hide",(function(){i.$trigger.removeClass("active"),setTimeout((function(){i.tidyTableColumnField()}),Garnish.FX_DURATION)}))},showTrigger:function(){this.$trigger.removeClass("hidden")},hideTrigger:function(){this.$trigger.data("trigger").hide(),this.$trigger.addClass("hidden"),this.menu.hide()},updateSortField:function(){var t=s(this.elementIndex.getSortAttributeAndDirection(),2),e=t[0],i=t[1],a=this.$sortAttributeSelect.children('option[value="score"]');this.elementIndex.searching?a.length||this.$sortAttributeSelect.prepend($("<option/>",{value:"score",text:Craft.t("app","Score")})):a.length&&a.remove(),this.$sortAttributeSelect.val(e),this.sortDirectionListbox.select("asc"===i?0:1),["structure","score"].includes(e)?(this.sortDirectionListbox.disable(),this.$sortDirectionPicker.addClass("disabled")):(this.sortDirectionListbox.enable(),this.$sortDirectionPicker.removeClass("disabled")),this.elementIndex.canSortByStructure()?this.$sortAttributeSelect.children('option[value="structure"]').removeAttr("disabled"):this.$sortAttributeSelect.children('option[value="structure"]').attr("disabled","disabled")},updateTableColumnField:function(){var t,e,i=this,s=this.elementIndex.getSelectedTableColumns();s.forEach((function(s){var a=i.$tableColumnsContainer.find('input[value="'.concat(s,'"]'));a.prop("checked")||a.prop("checked",!0);var n=a.parent();t&&n.index()<e&&n.insertAfter(t),t=n,e=n.index()}));for(var a=this._getTableColumnCheckboxes(),n=0;n<a.length;n++){var r=a.eq(n);r.prop("checked")&&!s.includes(r.val())&&r.prop("checked",!1)}},tidyTableColumnField:function(){var t=this.elementIndex.getTableColumnOptions(this.$source).map((function(t){return t.attr})).reduce((function(t,s,a){return e(e({},t),{},i({},s,a))}),{});this.$tableColumnsContainer.children().sort((function(e,i){var s=$(e).children('input[type="checkbox"]')[0],a=$(i).children('input[type="checkbox"]')[0];return s.checked&&a.checked?0:s.checked||a.checked?s.checked?-1:1:t[s.value]<t[a.value]?-1:1})).appendTo(this.$tableColumnsContainer)},revert:function(){this.elementIndex.setSelecetedSourceState({order:null,sort:null,tableColumns:null}),this.updateSortField(),this.updateTableColumnField(),this.tidyTableColumnField(),this.$revertBtn.remove(),this.$revertBtn=null,this.$closeBtn.focus(),this.elementIndex.updateElements()},_buildMenu:function(){var t=this,e=$('<div class="meta"/>').appendTo(this.$container);this._createSortField().appendTo(e),this._createTableColumnsField().appendTo(e),this.$sortAttributeSelect.focus();var i=$("<div/>",{class:"flex menu-footer"}).appendTo(this.$container);this.$revertContainer=$("<div/>",{class:"flex-grow"}).appendTo(i),(this.elementIndex.getSelectedSourceState("order")||this.elementIndex.getSelectedSourceState("sort")||this.elementIndex.getSelectedSourceState("tableColumns"))&&this._createRevertBtn(),this.$closeBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Close")}).appendTo(i).on("click",(function(){t.menu.hide()}))},_createSortField:function(){var t=this,e=$('<div class="flex"/>'),i=Craft.ui.createSelect({options:this.elementIndex.getSortOptions(this.$source).map((function(t){return{label:t.label,value:t.attr}}))}).addClass("fullwidth").appendTo($('<div class="flex-grow"/>').appendTo(e));this.$sortAttributeSelect=i.children("select").attr({"aria-label":Craft.t("app","Sort attribute")}),this.$sortDirectionPicker=$("<section/>",{class:"btngroup btngroup--exclusive","aria-label":Craft.t("app","Sort direction")}).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort ascending"),"aria-label":Craft.t("app","Sort ascending"),"aria-pressed":"false","data-icon":"asc","data-dir":"asc"})).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort descending"),"aria-label":Craft.t("app","Sort descending"),"aria-pressed":"false","data-icon":"desc","data-dir":"desc"})).appendTo(e),this.sortDirectionListbox=new Craft.Listbox(this.$sortDirectionPicker,{onChange:function(e){e.data("dir")!==t.elementIndex.getSelectedSortDirection()&&(t.elementIndex.setSelectedSortAttribute(t.$sortAttributeSelect.val(),e.data("dir")),t.elementIndex.updateElements(),t._createRevertBtn())}}),this.$sortAttributeSelect.on("change",(function(){t.elementIndex.setSelectedSortAttribute(t.$sortAttributeSelect.val(),null,!1),t.elementIndex.updateElements(),t._createRevertBtn()})),this.updateSortField();var s=Craft.ui.createField(e,{label:Craft.t("app","Sort by"),fieldset:!0});return s.addClass("sort-field"),s},_getTableColumnCheckboxes:function(){return this.$tableColumnsContainer.find('input[type="checkbox"]')},_createTableColumnsField:function(){var t=this,e=this.elementIndex.getTableColumnOptions(this.$source);if(!e.length)return $();this.$tableColumnsContainer=$("<div/>"),e.forEach((function(e){$('<div class="element-index-view-menu-table-column"/>').append('<div class="icon move"/>').append(Craft.ui.createCheckbox({label:Craft.escapeHtml(e.label),value:e.attr})).appendTo(t.$tableColumnsContainer)})),this.updateTableColumnField(),this.tidyTableColumnField(),new Garnish.DragSort(this.$tableColumnsContainer.children(),{handle:".move",axis:"y",onSortChange:function(){t._onTableColumnChange()}}),this._getTableColumnCheckboxes().on("change",(function(e){t._onTableColumnChange()}));var i=Craft.ui.createField(this.$tableColumnsContainer,{label:Craft.t("app","Table Columns"),fieldset:!0});return i.addClass("table-columns-field"),i},_onTableColumnChange:function(){for(var t=[],e=this._getTableColumnCheckboxes().filter(":checked"),i=0;i<e.length;i++)t.push(e.eq(i).val());Craft.compare(t,this.elementIndex.getSelectedTableColumns(this.$source))||(this.elementIndex.setSelectedTableColumns(t,!1),this.elementIndex.updateElements(),this._createRevertBtn())},_createRevertBtn:function(){var t=this;this.$revertBtn||(this.$revertBtn=$("<button/>",{type:"button",class:"light",text:Craft.t("app","Use defaults")}).appendTo(this.$revertContainer).on("click",(function(){t.revert()})))},destroy:function(){this.menu.destroy(),delete this.menu,this.base()}}),o=Garnish.HUD.extend({elementIndex:null,sourceKey:null,siteId:null,id:null,loading:!0,serialized:null,$clearBtn:null,cleared:!1,init:function(t,e,i){var s=this;this.elementIndex=t,this.sourceKey=e,this.siteId=i,this.id="filter-".concat(Math.floor(1e9*Math.random()));var a=$("<div/>").append($("<div/>",{class:"spinner"})).append($("<div/>",{text:Craft.t("app","Loading"),class:"visually-hidden","aria-role":"alert"}));this.base(this.elementIndex.$filterBtn,a,{hudClass:"hud element-filter-hud loading"}),this.$hud.attr({id:this.id,"aria-live":"polite","aria-busy":"false"}),this.$tip.remove(),this.$tip=null,this.$body.on("submit",(function(t){t.preventDefault(),s.hide()})),Craft.sendActionRequest("POST","element-indexes/filter-hud",{data:{elementType:this.elementIndex.elementType,source:this.sourceKey,condition:this.elementIndex.settings.condition,id:"".concat(this.id,"-filters")}}).then((function(t){s.loading=!1,s.$hud.removeClass("loading"),a.remove(),s.$main.append(t.data.hudHtml),Craft.appendHeadHtml(t.data.headHtml),Craft.appendBodyHtml(t.data.bodyHtml);var e=$("<div/>",{class:"flex flex-nowrap"}).appendTo(s.$main);$("<div/>",{class:"flex-grow"}).appendTo(e),s.$clearBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(e),$("<button/>",{type:"submit",class:"btn secondary",text:Craft.t("app","Apply")}).appendTo(e),s.$clearBtn.on("click",(function(){s.clear()})),s.$hud.find(".condition-container").on("htmx:beforeRequest",(function(){s.setBusy()})),s.$hud.find(".condition-container").on("htmx:load",(function(){s.setReady()})),s.setFocus()})).catch((function(){Craft.cp.displayError(Craft.t("app","A server error occurred."))})),this.$hud.css("position","fixed"),this.addListener(Garnish.$win,"scroll,resize",(function(){s.updateSizeAndPosition(!0)}))},addListener:function(t,e,i,s){t===this.$main&&"resize"===e||this.base(t,e,i,s)},setBusy:function(){this.$hud.attr("aria-busy","true"),$("<div/>",{class:"visually-hidden",text:Craft.t("app","Loading")}).insertAfter(this.$main.find(".htmx-indicator"))},setReady:function(){this.$hud.attr("aria-busy","false")},setFocus:function(){Garnish.setFocusWithin(this.$main)},clear:function(){this.cleared=!0,this.hide()},updateSizeAndPositionInternal:function(){var t=this.elementIndex.$searchContainer[0].getBoundingClientRect();this.$hud.css({width:this.elementIndex.$searchContainer.outerWidth()-2,top:t.top+this.elementIndex.$searchContainer.outerHeight(),left:t.left+1})},onShow:function(){this.base(),this.$clearBtn&&this.$clearBtn.text(Craft.t("app","Clear")),this.elementIndex.updateFilterBtn(),this.setFocus()},onHide:function(){this.base(),this.serialized!==(this.serialized=this.serialize())&&this.elementIndex.updateElements(),this.cleared?this.destroy():(this.$hud.detach(),this.$shade.detach()),this.elementIndex.updateFilterBtn(),this.elementIndex.$filterBtn.focus()},hasRules:function(){return 0!==this.$main.has(".condition-rule").length},serialize:function(){return!this.cleared&&this.hasRules()?this.$body.serialize():null},destroy:function(){this.base(),delete this.elementIndex.filterHuds[this.siteId][this.sourceKey]}})},8495:function(){Craft.BaseElementIndexView=Garnish.Base.extend({$container:null,$loadingMoreSpinner:null,$elementContainer:null,$scroller:null,elementIndex:null,thumbLoader:null,elementSelect:null,loadingMore:!1,_totalVisible:null,_morePending:null,_handleEnableElements:null,_handleDisableElements:null,init:function(t,e,i){var s=this;this.elementIndex=t,this.$container=$(e),this.setSettings(i,Craft.BaseElementIndexView.defaults),this.$loadingMoreSpinner=$('<div class="centeralign hidden"><div class="spinner loadingmore"></div></div>').insertAfter(this.$container),this.$elementContainer=this.getElementContainer();var a=this.$elementContainer.children();this.setTotalVisible(a.length),this.setMorePending(this.settings.batchSize&&a.length==this.settings.batchSize),this.thumbLoader=new Craft.ElementThumbLoader,this.thumbLoader.load(a),this.settings.selectable&&(this.elementSelect=new Garnish.Select(this.$elementContainer,a.filter(":not(.disabled)"),{multi:this.settings.multiSelect,vertical:this.isVerticalList(),handle:"index"===this.settings.context?".checkbox, .element:first":null,filter:":not(a):not(.toggle)",checkboxMode:this.settings.checkboxMode,onSelectionChange:this.onSelectionChange.bind(this)}),this._handleEnableElements=function(t){s.elementSelect.addItems(t.elements)},this._handleDisableElements=function(t){s.elementSelect.removeItems(t.elements)},this.elementIndex.on("enableElements",this._handleEnableElements),this.elementIndex.on("disableElements",this._handleDisableElements)),"index"===this.settings.context&&(this._handleElementEditing=function(t){var e=$(t.target);if("A"!==e.prop("nodeName")){var i;if(e.hasClass("element"))i=e;else if(!(i=e.closest(".element")).length)return;Garnish.hasAttr(i,"data-editable")&&Craft.createElementEditor(i.data("type"),i)}},this.elementIndex.trashed||(this.addListener(this.$elementContainer,"dblclick",this._handleElementEditing),$.isTouchCapable()&&this.addListener(this.$elementContainer,"taphold",this._handleElementEditing))),this.afterInit(),this.settings.batchSize&&("index"===this.settings.context?this.$scroller=Garnish.$scrollContainer:this.$scroller=this.elementIndex.$main,this.$scroller.scrollTop(0),this.addListener(this.$scroller,"scroll","maybeLoadMore"),this.maybeLoadMore())},getElementContainer:function(){throw"Classes that extend Craft.BaseElementIndexView must supply a getElementContainer() method."},afterInit:function(){},getAllElements:function(){return this.$elementContainer.children()},getEnabledElements:function(){return this.$elementContainer.children(":not(.disabled)")},getElementById:function(t){var e=this.$elementContainer.children('[data-id="'+t+'"]:first');return e.length?e:null},getSelectedElements:function(){if(!this.elementSelect)throw"This view is not selectable.";return this.elementSelect.$selectedItems},getSelectedElementIds:function(){var t;try{t=this.getSelectedElements()}catch(t){}var e=[];if(t)for(var i=0;i<t.length;i++)e.push(t.eq(i).data("id"));return e},selectElement:function(t){if(!this.elementSelect)throw"This view is not selectable.";return this.elementSelect.selectItem(t,!0),!0},selectElementById:function(t){if(!this.elementSelect)throw"This view is not selectable.";var e=this.getElementById(t);return!!e&&(this.elementSelect.selectItem(e,!0),!0)},selectAllElements:function(){this.elementSelect.selectAll()},deselectAllElements:function(){this.elementSelect.deselectAll()},isVerticalList:function(){return!1},getTotalVisible:function(){return this._totalVisible},setTotalVisible:function(t){this._totalVisible=t},getMorePending:function(){return this._morePending},setMorePending:function(t){this._morePending=t},maybeLoadMore:function(){this.canLoadMore()&&this.loadMore()},canLoadMore:function(){return!(!this.getMorePending()||!this.settings.batchSize)&&(this.$scroller[0]===Garnish.$win[0]?Garnish.$win.innerHeight()+Garnish.$win.scrollTop()>=this.$container.offset().top+this.$container.height():this.$scroller.prop("scrollHeight")-this.$scroller.scrollTop()<=this.$scroller.outerHeight()+15)},loadMore:function(){var t=this;this.getMorePending()&&!this.loadingMore&&this.settings.batchSize&&(this.loadingMore=!0,this.$loadingMoreSpinner.removeClass("hidden"),this.removeListener(this.$scroller,"scroll"),Craft.sendActionRequest("POST",this.settings.loadMoreElementsAction,{data:this.getLoadMoreParams()}).then((function(e){t.loadingMore=!1,t.$loadingMoreSpinner.addClass("hidden");var i=$(e.data.html);t.appendElements(i),Craft.appendHeadHtml(e.data.headHtml),Craft.appendBodyHtml(e.data.bodyHtml),t.elementSelect&&(t.elementSelect.addItems(i.filter(":not(.disabled)")),t.elementIndex.updateActionTriggers()),t.setTotalVisible(t.getTotalVisible()+i.length),t.setMorePending(i.length==t.settings.batchSize),t.addListener(t.$scroller,"scroll","maybeLoadMore"),t.maybeLoadMore()})).catch((function(e){t.loadingMore=!1,t.$loadingMoreSpinner.addClass("hidden")})))},getLoadMoreParams:function(){var t=$.extend(!0,{},this.settings.params);return t.criteria.offset=this.getTotalVisible(),t},appendElements:function(t){t.appendTo(this.$elementContainer),this.thumbLoader.load(t),this.onAppendElements(t)},onAppendElements:function(t){this.settings.onAppendElements(t),this.trigger("appendElements",{newElements:t})},onSelectionChange:function(){this.settings.onSelectionChange(),this.trigger("selectionChange")},disable:function(){this.elementSelect&&this.elementSelect.disable()},enable:function(){this.elementSelect&&this.elementSelect.enable()},destroy:function(){this.$loadingMoreSpinner.remove(),this.thumbLoader.destroy(),delete this.thumbLoader,this.elementSelect&&(this.elementIndex.off("enableElements",this._handleEnableElements),this.elementIndex.off("disableElements",this._handleDisableElements),this.elementSelect.destroy(),delete this.elementSelect),this.base()}},{defaults:{context:"index",batchSize:null,params:null,selectable:!1,multiSelect:!1,checkboxMode:!1,loadMoreElementsAction:"element-indexes/get-more-elements",onAppendElements:$.noop,onSelectionChange:$.noop}})},5970:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.BaseElementSelectInput=Garnish.Base.extend({thumbLoader:null,elementSelect:null,elementSort:null,modal:null,elementEditor:null,fieldLabel:null,$container:null,$form:null,$elementsContainer:null,$elements:null,$addElementBtn:null,$spinner:null,_initialized:!1,init:function(t){var e=this;if(!$.isPlainObject(t)){for(var i={},s=["id","name","elementType","sources","criteria","sourceElementId","limit","modalStorageKey","fieldId"],a=0;a<s.length&&void 0!==arguments[a];a++)i[s[a]]=arguments[a];t=i}this.setSettings(t,Craft.BaseElementSelectInput.defaults),this.settings.modalStorageKey&&(this.modalStorageKey="BaseElementSelectInput."+this.settings.modalStorageKey),(1==this.settings.limit||this.settings.maintainHierarchy)&&(this.settings.sortable=!1),this.$container=this.getContainer(),this.$form=this.$container.closest("form"),this.fieldLabel=this.getFieldLabel(),this.$container.data("elementSelect",this),this.$elementsContainer=this.getElementsContainer(),this.$addElementBtn=this.getAddElementsBtn(),this.$spinner=this.getSpinner(),this.thumbLoader=new Craft.ElementThumbLoader,this.initElementSelect(),this.initElementSort(),this.resetElements(),this.$addElementBtn&&this.addListener(this.$addElementBtn,"activate","showModal"),Garnish.requestAnimationFrame((function(){e._initialized=!0}))},get totalSelected(){return this.$elements.length},getContainer:function(){return $("#"+this.settings.id)},getFieldLabel:function(){if(this.$container)return this.$container.closest("fieldset").find("legend").first().data("label")},getElementsContainer:function(){return this.$container.children(".elements")},getElements:function(){return this.$elementsContainer.find(".element")},getAddElementsBtn:function(){return this.$container.find(".btn.add:first")},getSpinner:function(){return this.$container.find(".spinner")},initElementSelect:function(){this.settings.selectable&&(this.elementSelect=new Garnish.Select({multi:this.settings.sortable,filter:":not(.delete)"}))},initElementSort:function(){var t=this;this.settings.sortable&&(this.elementSort=new Garnish.DragSort({container:this.$elementsContainer,filter:this.settings.selectable?function(){return t.elementSort.$targetItem.hasClass("sel")?t.elementSelect.getSelectedItems():t.elementSort.$targetItem}:null,ignoreHandleSelector:".delete",axis:this.getElementSortAxis(),collapseDraggees:!0,magnetStrength:4,helperLagBase:1.5,onSortChange:this.settings.selectable?function(){t.elementSelect.resetItemOrder()}:null}))},getElementSortAxis:function(){return"list"===this.settings.viewMode?"y":null},canAddMoreElements:function(){return!this.settings.limit||this.$elements.length<this.settings.limit},updateAddElementsBtn:function(){this.canAddMoreElements()?this.enableAddElementsBtn():this.disableAddElementsBtn()},enableAddElementsBtn:function(){this.$addElementBtn&&this.$addElementBtn.removeClass("hidden"),this.updateButtonContainer()},disableAddElementsBtn:function(){this.$addElementBtn&&this.$addElementBtn.addClass("hidden"),this.updateButtonContainer()},showSpinner:function(){this.$spinner&&this.$spinner.removeClass("hidden"),this.updateButtonContainer()},hideSpinner:function(){this.$spinner&&this.$spinner.addClass("hidden"),this.updateButtonContainer()},updateButtonContainer:function(){var t=this.$addElementBtn&&this.$addElementBtn.parent(".flex");t&&t.length&&(t.children(":not(.hidden)").length?t.removeClass("hidden"):t.addClass("hidden"))},focusNextLogicalElement:function(){if(this.canAddMoreElements()){var t=this.$addElementBtn;t&&t.get(0).focus()}else this.focusLastRemoveBtn()},focusLastRemoveBtn:function(){var t=this.$container.find(".delete");t.length&&t.last()[0].focus()},resetElements:function(){null!==this.$elements?this.removeElements(this.$elements):this.$elements=$(),this.addElements(this.getElements())},addElements:function(t){var e=this;this.thumbLoader.load(t),this.settings.selectable&&this.elementSelect.addItems(t),this.settings.sortable&&this.elementSort.addItems(t),this.settings.editable&&(this._handleShowElementEditor=function(t){var i=$(t.currentTarget);!Garnish.hasAttr(i,"data-editable")||i.hasClass("disabled")||i.hasClass("loading")||(e.elementEditor=e.createElementEditor(i))},this.addListener(t,"dblclick",this._handleShowElementEditor),$.isTouchCapable()&&this.addListener(t,"taphold",this._handleShowElementEditor)),t.find(".delete").on("click dblclick",(function(t){e.removeElement($(t.currentTarget).closest(".element")),t.stopPropagation()})),t.on("keydown",(function(t){if([Garnish.BACKSPACE_KEY,Garnish.DELETE_KEY].includes(t.keyCode)){t.stopPropagation(),t.preventDefault();for(var i=e.elementSelect.getSelectedItems(),s=0;s<i.length;s++)e.removeElement(i.eq(s))}})),this.$elements=this.$elements.add(t),this.updateAddElementsBtn(),this.onAddElements()},createElementEditor:function(t,e){return e=Object.assign({elementSelectInput:this,prevalidate:this.settings.prevalidate},e),Craft.createElementEditor(this.settings.elementType,t,e)},replaceElement:function(t,e){var i=this;return new Promise((function(s,a){var n=i.$elements.filter('[data-id="'.concat(t,'"]'));if(n.length){i.showSpinner();var r={elementId:e,siteId:i.settings.criteria.siteId,thumbSize:i.settings.viewMode};Craft.sendActionRequest("POST","elements/get-element-html",{data:r}).then((function(t){i.removeElement(n);var e=Craft.getElementInfo(t.data.html);i.selectElements([e]),s()})).catch((function(t){var e=t.response;e&&e.data&&e.data.message?alert(e.data.message):Craft.cp.displayError(),a(e.data.message)})).finally((function(){i.hideSpinner()}))}else a("No element selected with an ID of ".concat(t,"."))}))},removeElements:function(t){if(this.settings.selectable&&this.elementSelect.removeItems(t),this.modal){for(var e=[],i=0;i<t.length;i++){var s=t.eq(i).data("id");s&&e.push(s)}e.length&&this.modal.elementIndex.enableElementsById(e)}var a;if(t.children("input").prop("disabled",!0),this.settings.selectable){var n=this.$elements.index(t.last());a=this.$elements.eq(n+1).find(".delete")}a.length?a.focus():this.focusNextLogicalElement(),this.$elements=this.$elements.not(t),this.updateAddElementsBtn(),this.onRemoveElements()},removeElement:function(t){if(this.settings.maintainHierarchy){var e=t.add(t.parent().siblings("ul").find(".element"));$("[name]",e).removeAttr("name"),this.removeElements(e);for(var i=0;i<e.length;i++)this._animateStructureElementAway(e,i)}else $("[name]",t).removeAttr("name"),this.removeElements(t),this.animateElementAway(t,(function(){t.remove()}))},animateElementAway:function(t,e){t.css("z-index",0);var i={opacity:-1};i["margin-"+Craft.left]=-(t.outerWidth()+parseInt(t.css("margin-"+Craft.right))),"list"!==this.settings.viewMode&&0!==this.$elements.length||(i["margin-bottom"]=-(t.outerHeight()+parseInt(t.css("margin-bottom")))),t.velocity(i,Craft.BaseElementSelectInput.REMOVE_FX_DURATION,(function(){e&&e()}))},showModal:function(){this.canAddMoreElements()&&(this.modal?this.modal.show():this.modal=this.createModal())},createModal:function(){return Craft.createElementSelectorModal(this.settings.elementType,this.getModalSettings())},getModalSettings:function(){return $.extend({closeOtherModals:!1,storageKey:this.modalStorageKey,sources:this.settings.sources,condition:this.settings.condition,criteria:this.settings.criteria,multiSelect:1!=this.settings.limit,hideOnSelect:!this.settings.maintainHierarchy,showSiteMenu:this.settings.showSiteMenu,disabledElementIds:this.getDisabledElementIds(),onSelect:this.onModalSelect.bind(this),onHide:this.onModalHide.bind(this),triggerElement:this.$addElementBtn,modalTitle:Craft.t("app","Select {element}",{element:this.fieldLabel})},this.settings.modalSettings)},getSelectedElementIds:function(){for(var t=[],e=0;e<this.$elements.length;e++)t.push(this.$elements.eq(e).data("id"));return t},getDisabledElementIds:function(){var e,i=this.getSelectedElementIds();return!this.settings.allowSelfRelations&&this.settings.sourceElementId&&i.push(this.settings.sourceElementId),this.settings.disabledElementIds&&i.push.apply(i,function(e){if(Array.isArray(e))return t(e)}(e=this.settings.disabledElementIds)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(e)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),i},onModalSelect:function(t){if(this.settings.maintainHierarchy)this.selectStructuredElements(t);else{if(this.settings.limit){var e=this.settings.limit-this.$elements.length;t.length>e&&(t=t.slice(0,e))}this.selectElements(t),this.updateDisabledElementsInModal()}},onModalHide:function(){var t=this;this.canAddMoreElements()||setTimeout((function(){t.focusNextLogicalElement()}),200)},selectElements:function(t){for(var e=0;e<t.length;e++){var i=t[e],s=this.createNewElement(i);this.appendElement(s),this.addElements(s),this.animateElementIntoPlace(i.$element,s),i.$element=s}this.onSelectElements(t)},selectStructuredElements:function(t){var e=this;this.modal.disable(),this.modal.disableCancelBtn(),this.modal.disableSelectBtn(),this.modal.showFooterSpinner();for(var i=this.getSelectedElementIds(),s=0;s<t.length;s++)i.push(t[s].id);var a={elementIds:i,siteId:t[0].siteId,containerId:this.settings.id,name:this.settings.name,branchLimit:this.settings.branchLimit,selectionLabel:this.settings.selectionLabel,elementType:this.settings.elementType},n=function(){e.modal.enable(),e.modal.enableCancelBtn(),e.modal.enableSelectBtn(),e.modal.hideFooterSpinner()};Craft.sendActionRequest("POST","relational-fields/structured-input-html",{data:a}).then((function(i){n();var s=$(i.data.html).children(".elements");e.$elementsContainer.replaceWith(s),e.$elementsContainer=s,e.resetElements();for(var a=[],r=0;r<t.length;r++){var o=t[r],l=e.getElementById(o.id);l&&(e.animateElementIntoPlace(o.$element,l),a.push(o))}e.updateDisabledElementsInModal(),e.modal.hide(),e.onSelectElements(a)})).catch((function(t){t.response,n()}))},createNewElement:function(t){var e=t.$element.clone(),i=Craft.t("app","Remove {label}",{label:Craft.escapeHtml(t.label)});return Craft.setElementSize(e,"large"===this.settings.viewMode?"large":"small"),e.addClass("removable").prepend($("<input/>",{type:"hidden",name:this.settings.name+(this.settings.single?"":"[]"),value:t.id})).prepend($("<button/>",{type:"button",class:"delete icon",title:Craft.t("app","Remove"),"aria-label":i})),e},appendElement:function(t){t.appendTo(this.$elementsContainer)},animateElementIntoPlace:function(t,e){var i=t.offset(),s=e.offset(),a=e.clone().appendTo(Garnish.$bod);e.css("visibility","hidden"),a.css({position:"absolute",zIndex:1e4,top:i.top,left:i.left});var n={top:s.top,left:s.left};a.velocity(n,Craft.BaseElementSelectInput.ADD_FX_DURATION,(function(){a.remove(),e.css("visibility","visible")}))},updateDisabledElementsInModal:function(){this.modal.elementIndex&&this.modal.elementIndex.disableElementsById(this.getDisabledElementIds())},getElementById:function(t){for(var e=0;e<this.$elements.length;e++){var i=this.$elements.eq(e);if(i.data("id")==t)return i}},onSelectElements:function(t){this.trigger("selectElements",{elements:t}),this.settings.onSelectElements(t),this.$container.trigger("change")},onAddElements:function(){this.trigger("addElements"),this.settings.onAddElements(),this.$container.trigger("change")},onRemoveElements:function(){this.trigger("removeElements"),this.settings.onRemoveElements(),this.$container.trigger("change")},_animateStructureElementAway:function(t,e){var i,s=this;e===t.length-1&&(i=function(){var e=t.first().parent().parent(),i=e.parent();i[0]===s.$elementsContainer[0]||e.siblings().length?e.remove():i.remove()});var a=function(){s.animateElementAway(t.eq(e),i)};0===e?a():setTimeout(a,100*e)}},{ADD_FX_DURATION:200,REMOVE_FX_DURATION:200,defaults:{id:null,name:null,fieldId:null,elementType:null,sources:null,condition:null,criteria:{},allowSelfRelations:!1,sourceElementId:null,disabledElementIds:null,viewMode:"list",single:!1,maintainHierarchy:!1,branchLimit:null,limit:null,showSiteMenu:!1,modalStorageKey:null,modalSettings:{},onAddElements:$.noop,onSelectElements:$.noop,onRemoveElements:$.noop,sortable:!0,selectable:!0,editable:!0,prevalidate:!1,editorSettings:{}}})},4993:function(){Craft.BaseElementSelectorModal=Garnish.Modal.extend({elementType:null,elementIndex:null,supportSidebarToggleView:!1,$body:null,$content:null,$footer:null,$selectBtn:null,$sidebar:null,$sources:null,$sourceToggles:null,$sidebarToggleBtn:null,$sidebarCloseBtn:null,$mainHeading:null,$main:null,$search:null,$elements:null,$tbody:null,$primaryButtons:null,$secondaryButtons:null,$cancelBtn:null,init:function(t,e){this.elementType=t,this.setSettings(e,Craft.BaseElementSelectorModal.defaults);var i="elementSelectorModalHeading-"+Date.now(),s=$('<div class="modal elementselectormodal" aria-labelledby="'+i+'"></div>').appendTo(Garnish.$bod),a=($('<h1 id="'+i+'" class="visually-hidden">'+this.settings.modalTitle+"</h1>").appendTo(s),$('<div class="body"><div class="spinner big"></div></div>').appendTo(s));this.$footer=$('<div class="footer"/>').appendTo(s),this.settings.fullscreen&&(s.addClass("fullscreen"),this.settings.minGutter=0),this.base(s,this.settings),this.$secondaryButtons=$('<div class="buttons left secondary-buttons"/>').appendTo(this.$footer),this.$primaryButtons=$('<div class="buttons right"/>').appendTo(this.$footer),this.$cancelBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(this.$primaryButtons),this.$selectBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Select"),spinner:!0}).attr("aria-disabled","true").appendTo(this.$primaryButtons),this.$body=a,this.addListener(this.$cancelBtn,"activate","cancel"),this.addListener(this.$selectBtn,"activate","selectElements")},updateModalBottomPadding:function(){var t=this.$footer.outerHeight();t!==parseInt(this.$container.css("padding-bottom"))&&this.$container.css("padding-bottom",t)},updateSidebarView:function(){this.supportSidebarToggleView&&(this.sidebarShouldBeHidden()?this.$sidebarToggleBtn||this.buildSidebarToggleView():this.$sidebarToggleBtn&&this.resetView())},sidebarShouldBeHidden:function(){return this.$container.outerWidth()<550},resetView:function(){this.$mainHeader&&this.$mainHeader.remove(),this.$sidebarHeader&&this.$sidebarHeader.remove(),this.$sidebarToggleBtn=null,this.$body.addClass("has-sidebar"),this.$content.addClass("has-sidebar"),this.$sidebar.removeClass("hidden")},buildSidebarToggleView:function(){var t=this;!this.$sidebarToggleBtn&&this.sidebarShouldBeHidden()&&(this.$sidebarHeader=$('<div class="sidebar-header"/>').prependTo(this.$sidebar),this.$sidebarCloseBtn=Craft.ui.createButton({class:"nav-close close-btn"}).attr("aria-label",Craft.t("app","Close")).removeClass("btn").appendTo(this.$sidebarHeader),this.$mainHeader=$('<div class="main-header"/>').prependTo(this.$main),this.$mainHeading=$('<h2 class="main-heading">'.concat(this.getActiveSourceName(),"</h2>")).appendTo(this.$mainHeader),this.$sidebarToggleBtn=Craft.ui.createButton({toggle:!0,controls:"modal-sidebar",class:"nav-toggle"}).removeClass("btn").attr("aria-label",Craft.t("app","Show sidebar")).appendTo(this.$mainHeader),this.$sidebar.attr("id","modal-sidebar"),this.closeSidebar(),this.addListener(this.$sidebarToggleBtn,"click",(function(){t.toggleSidebar()})),this.addListener(this.$sidebarCloseBtn,"click",(function(){t.toggleSidebar()})))},sidebarIsOpen:function(){return"true"===this.$sidebarToggleBtn.attr("aria-expanded")},toggleSidebar:function(){this.sidebarIsOpen()?this.closeSidebar():this.openSidebar()},openSidebar:function(){var t=this;this.$body.addClass("has-sidebar"),this.$content.addClass("has-sidebar"),this.$sidebar.removeClass("hidden"),this.$sidebarToggleBtn.attr("aria-expanded","true"),this.$sidebar.find(":focusable").first().focus(),Garnish.uiLayerManager.addLayer(this.$sidebar),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.closeSidebar();var e=Garnish.getFocusedElement();$.contains(t.$sidebar.get(0),e.get(0))&&t.$sidebarToggleBtn.focus()}))},closeSidebar:function(){this.$sidebarToggleBtn&&(this.sidebarIsOpen()&&(Garnish.uiLayerManager.removeLayer(),this.$sidebar.addClass("hidden"),this.$sidebarToggleBtn.attr("aria-expanded","false")),this.$body.removeClass("has-sidebar"),this.$content.removeClass("has-sidebar"))},getActiveSourceName:function(){return this.$sidebar.find(".sel").text()},onFadeIn:function(){this.elementIndex?Garnish.isMobileBrowser(!0)||this.elementIndex.$search.trigger("focus"):this._createElementIndex(),this.base()},onSelectionChange:function(){this.updateSelectBtnState()},onSelectSource:function(){this.updateHeading(),this.updateModalBottomPadding()},updateHeading:function(){this.$mainHeading&&this.$mainHeading.text(this.getActiveSourceName())},updateSelectBtnState:function(){this.$selectBtn&&(this.elementIndex.getSelectedElements().length?this.enableSelectBtn():this.disableSelectBtn())},enableSelectBtn:function(){this.$selectBtn.removeClass("disabled").attr("aria-disabled","false")},disableSelectBtn:function(){this.$selectBtn.addClass("disabled").attr("aria-disabled","true")},enableCancelBtn:function(){this.$cancelBtn.removeClass("disabled")},disableCancelBtn:function(){this.$cancelBtn.addClass("disabled")},showFooterSpinner:function(){this.$selectBtn.addClass("loading")},hideFooterSpinner:function(){this.$selectBtn.removeClass("loading")},cancel:function(){this.$cancelBtn.hasClass("disabled")||this.hide()},selectElements:function(){if(this.elementIndex&&this.elementIndex.getSelectedElements().length){this.elementIndex.view.elementSelect.clearMouseUpTimeout();var t=this.elementIndex.getSelectedElements(),e=this.getElementInfo(t);this.onSelect(e),this.settings.disableElementsOnSelect&&this.elementIndex.disableElements(this.elementIndex.getSelectedElements()),this.settings.hideOnSelect&&this.hide()}},getElementInfo:function(t){for(var e=[],i=0;i<t.length;i++){var s=$(t[i]),a=Craft.getElementInfo(s);e.push(a)}return e},onShow:function(){this.updateSelectBtnState(),this.addListener(Garnish.$win,"resize",this.updateSidebarView),this.addListener(Garnish.$win,"resize",this.updateModalBottomPadding),this.updateModalBottomPadding(),this.updateSidebarView(),this.base()},onHide:function(){this.closeSidebar(),this.base()},onSelect:function(t){this.settings.onSelect(t)},disable:function(){this.elementIndex&&this.elementIndex.disable(),this.base()},enable:function(){this.elementIndex&&this.elementIndex.enable(),this.base()},_createElementIndex:function(){var t=this,e={context:"modal",elementType:this.elementType,sources:this.settings.sources};null!==this.settings.showSiteMenu&&"auto"!==this.settings.showSiteMenu&&(e.showSiteMenu=this.settings.showSiteMenu?"1":"0"),Craft.sendActionRequest("POST",this.settings.bodyAction,{data:e}).then((function(e){t.$body.html(e.data.html),t.$body.has(".sidebar:not(.hidden)").length&&(t.$body.addClass("has-sidebar"),t.supportSidebarToggleView=!0),t.elementIndex=Craft.createElementIndex(t.elementType,t.$body,Object.assign({context:"modal",modal:t,storageKey:t.settings.storageKey,condition:t.settings.condition,criteria:t.settings.criteria,disabledElementIds:t.settings.disabledElementIds,selectable:!0,multiSelect:t.settings.multiSelect,buttonContainer:t.$secondaryButtons,onSelectionChange:t.onSelectionChange.bind(t),onSelectSource:t.onSelectSource.bind(t),hideSidebar:t.settings.hideSidebar,defaultSiteId:t.settings.defaultSiteId,defaultSource:t.settings.defaultSource},t.settings.indexSettings)),t.$main=t.elementIndex.$main,t.$sidebar=t.elementIndex.$sidebar,t.$content=t.$body.find(".content"),t.updateSidebarView(),t.updateModalBottomPadding(),t.addListener(t.elementIndex.$elements,"doubletap",(function(t,e){e.firstTap.target===e.secondTap.target&&this.selectElements()}))}))}},{defaults:{fullscreen:!1,resizable:!0,storageKey:null,sources:null,condition:null,criteria:null,multiSelect:!1,showSiteMenu:null,disabledElementIds:[],disableElementsOnSelect:!1,hideOnSelect:!0,modalTitle:Craft.t("app","Select element"),onCancel:$.noop,onSelect:$.noop,hideSidebar:!1,defaultSiteId:null,defaultSource:null,bodyAction:"element-selector-modals/body",indexSettings:{}}})},8843:function(){Craft.BaseInputGenerator=Garnish.Base.extend({$source:null,$target:null,$form:null,settings:null,listening:null,timeout:null,init:function(t,e,i){this.$source=$(t),this.$target=$(e),this.$form=this.$source.closest("form"),this.setSettings(i),this.startListening()},setNewSource:function(t){var e=this.listening;this.stopListening(),this.$source=$(t),e&&this.startListening()},startListening:function(){this.listening||(this.listening=!0,this.addListener(this.$source,"input","onSourceTextChange"),this.addListener(this.$target,"input","onTargetTextChange"),this.addListener(this.$form,"submit","onFormSubmit"))},stopListening:function(){this.listening&&(this.listening=!1,this.timeout&&clearTimeout(this.timeout),this.removeAllListeners(this.$source),this.removeAllListeners(this.$target),this.removeAllListeners(this.$form))},onSourceTextChange:function(){this.timeout&&clearTimeout(this.timeout),this.timeout=setTimeout(this.updateTarget.bind(this),250)},onTargetTextChange:function(){this.$target.get(0)===document.activeElement&&this.stopListening()},onFormSubmit:function(){this.timeout&&clearTimeout(this.timeout),this.updateTarget()},updateTarget:function(){if(this.$target.is(":visible")){var t=this.$source.val();if(void 0!==t){var e=this.generateTargetValue(t);this.$target.val(e);for(var i=0;i<this.$target.length;i++)this.$target[i].dispatchEvent(new InputEvent("input",{inputType:"insertText"})),this.$target[i].dispatchEvent(new Event("input"));this.$target.is(":focus")&&Craft.selectFullValue(this.$target)}}},generateTargetValue:function(t){return t}})},3778:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.CategoryIndex=Craft.BaseElementIndex.extend({editableGroups:null,$newCategoryBtnGroup:null,$newCategoryBtn:null,init:function(t,e,i){this.editableGroups=[],this.on("selectSource",this.updateButton.bind(this)),this.on("selectSite",this.updateButton.bind(this)),this.base(t,e,i)},afterInit:function(){var t=this;this.editableGroups=Craft.editableCategoryGroups.filter((function(e){return!!t.getSourceByKey("group:".concat(e.uid))})),this.base()},getDefaultSourceKey:function(){if("index"===this.settings.context&&"undefined"!=typeof defaultGroupHandle)for(var t=0;t<this.$sources.length;t++){var e=$(this.$sources[t]);if(e.data("handle")===defaultGroupHandle)return e.data("key")}return this.base()},updateButton:function(){var e=this;if(this.$source){var i=this.$source.data("handle");if(this.editableGroups.length&&function(){e.$newCategoryBtnGroup&&e.$newCategoryBtnGroup.remove();var s,a=e.editableGroups.find((function(t){return t.handle===i}));e.$newCategoryBtnGroup=$('<div class="btngroup submit" data-wrapper/>');var n="new-category-menu-"+Craft.randomString(10);if(a){var r="index"===e.settings.context?Craft.t("app","New category"):Craft.t("app","New {group} category",{group:a.name}),o="index"===e.settings.context?Craft.t("app","New category in the {group} category group",{group:a.name}):r,l="index"===e.settings.context?"link":null;e.$newCategoryBtn=Craft.ui.createButton({label:r,ariaLabel:o,spinner:!0,role:l}).addClass("submit add icon").appendTo(e.$newCategoryBtnGroup),e.addListener(e.$newCategoryBtn,"click mousedown",(function(t){"index"===e.settings.context&&("click"===t.type&&Garnish.isCtrlKeyPressed(t)||"mousedown"===t.type&&1===t.originalEvent.button)?window.open(Craft.getUrl("categories/".concat(a.handle,"/new"))):"click"===t.type&&e._createCategory(a.id)})),e.editableGroups.length>1&&(s=$("<button/>",{type:"button",class:"btn submit menubtn btngroup-btn-last","aria-controls":n,"data-disclosure-trigger":"","aria-label":Craft.t("app","New category, choose a category group")}).appendTo(e.$newCategoryBtnGroup))}else e.$newCategoryBtn=s=Craft.ui.createButton({label:Craft.t("app","New category"),ariaLabel:Craft.t("app","New category, choose a category group"),spinner:!0}).addClass("submit add icon menubtn btngroup-btn-last").attr("aria-controls",n).attr("data-disclosure-trigger","").appendTo(e.$newCategoryBtnGroup);if(e.addButton(e.$newCategoryBtnGroup),s){var h,d=$("<div/>",{id:n,class:"menu menu--disclosure"}).appendTo(e.$newCategoryBtnGroup),c=$("<ul/>").appendTo(d),u=function(e,i){var s="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!s){if(Array.isArray(e)||(s=function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e))||i&&e&&"number"==typeof e.length){s&&(e=s);var a=0,n=function(){};return{s:n,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){s=s.call(e)},n:function(){var t=s.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==s.return||s.return()}finally{if(l)throw r}}}}(e.editableGroups);try{var p=function(){var t=h.value,i="index"===e.settings.context?"link":"button";if("index"===e.settings.context||t!==a){var n=$("<li/>").appendTo(c),r=$("<a/>",{role:"button"===i?"button":null,href:"#",type:"button"===i?"button":null,text:Craft.t("app","New {group} category",{group:t.name})}).appendTo(n);e.addListener(r,"click",(function(){s.data("trigger").hide(),e._createCategory(t.id)})),"button"===i&&e.addListener(r,"keydown",(function(i){i.keyCode===Garnish.SPACE_KEY&&(i.preventDefault(),s.data("trigger").hide(),e._createCategory(t.id))}))}};for(u.s();!(h=u.n()).done;)p()}catch(t){u.e(t)}finally{u.f()}new Garnish.DisclosureMenu(s)}}(),"index"===this.settings.context){var s="categories";i&&(s+="/"+i),Craft.setPath(s)}}},_createCategory:function(t){var e=this;if(this.$newCategoryBtn.hasClass("loading"))console.warn("New category creation already in progress.");else{var i=this.editableGroups.find((function(e){return e.id===t}));if(!i)throw"Invalid category group ID: ".concat(t);this.$newCategoryBtn.addClass("loading"),Craft.sendActionRequest("POST","elements/create",{data:{elementType:this.elementType,siteId:this.siteId,groupId:t}}).then((function(t){"index"===e.settings.context?document.location.href=Craft.getUrl(t.data.cpEditUrl,{fresh:1}):Craft.createElementEditor(e.elementType,{siteId:e.siteId,elementId:t.data.element.id,draftId:t.data.element.draftId,params:{fresh:1}}).on("submit",(function(){var s="group:".concat(i.uid);e.sourceKey!==s&&e.selectSourceByKey(s),e.clearSearch(),e.selectElementAfterUpdate(t.data.element.id),e.updateElements()}))})).finally((function(){e.$newCategoryBtn.removeClass("loading")}))}}}),Craft.registerElementIndexClass("craft\\elements\\Category",Craft.CategoryIndex)},6617:function(){Craft.CategorySelectInput=Craft.BaseElementSelectInput.extend({setSettings:function(){this.base.apply(this,arguments),this.settings.sortable=!1},getModalSettings:function(){var t=this.base();return t.hideOnSelect=!1,t},getElements:function(){return this.$elementsContainer.find(".element")},onModalSelect:function(t){var e=this;this.modal.disable(),this.modal.disableCancelBtn(),this.modal.disableSelectBtn(),this.modal.showFooterSpinner();for(var i=this.getSelectedElementIds(),s=0;s<t.length;s++)i.push(t[s].id);var a={categoryIds:i,siteId:t[0].siteId,id:this.settings.id,name:this.settings.name,branchLimit:this.settings.branchLimit,selectionLabel:this.settings.selectionLabel},n=function(){e.modal.enable(),e.modal.enableCancelBtn(),e.modal.enableSelectBtn(),e.modal.hideFooterSpinner()};Craft.sendActionRequest("POST","categories/input-html",{data:a}).then((function(i){n();var s=$(i.data.html).children(".elements");e.$elementsContainer.replaceWith(s),e.$elementsContainer=s,e.resetElements();for(var a=[],r=0;r<t.length;r++){var o=t[r],l=e.getElementById(o.id);l&&(e.animateElementIntoPlace(o.$element,l),a.push(o))}e.updateDisabledElementsInModal(),e.modal.hide(),e.onSelectElements(a)})).catch((function(t){t.response,n()}))},removeElement:function(t){var e=t.add(t.parent().siblings("ul").find(".element"));this.removeElements(e);for(var i=0;i<e.length;i++)this._animateCategoryAway(e,i)},_animateCategoryAway:function(t,e){var i,s=this;e===t.length-1&&(i=function(){var e=t.first().parent().parent(),i=e.parent();i[0]===s.$elementsContainer[0]||e.siblings().length?e.remove():i.remove()});var a=function(){s.animateElementAway(t.eq(e),i)};0===e?a():setTimeout(a,100*e)}})},9482:function(){Craft.charts={},Craft.charts.DataTable=Garnish.Base.extend({columns:null,rows:null,init:function(t){var e=t.columns,i=t.rows;i.forEach((function(t){$.each(t,(function(i){var s;switch(e[i].type){case"date":s=d3.timeParse("%Y-%m-%d"),t[i]=s(t[i]);break;case"datetime":s=d3.timeParse("%Y-%m-%d %H:00:00"),t[i]=s(t[i]);break;case"percent":t[i]=t[i]/100;break;case"number":t[i]=+t[i]}}))})),this.columns=e,this.rows=i}}),Craft.charts.Tip=Garnish.Base.extend({$container:null,$tip:null,init:function(t){this.$container=t,this.$tip=$('<div class="tooltip"></div>').appendTo(this.$container),this.hide()},setContent:function(t){this.$tip.html(t)},setPosition:function(t){this.$tip.css("left","".concat(t.left,"px")),this.$tip.css("top","".concat(t.top,"px"))},show:function(){this.$tip.css("display","block")},hide:function(){this.$tip.css("display","none")}}),Craft.charts.BaseChart=Garnish.Base.extend({$container:null,$chart:null,chartBaseClass:"cp-chart",dataTable:null,formatLocale:null,timeFormatLocale:null,orientation:null,svg:null,width:null,height:null,init:function(t,e){var i=this;this.$container=t,this.setSettings(Craft.charts.BaseChart.defaults),this.setSettings(e);var s={formats:window.d3Formats,formatLocaleDefinition:window.d3FormatLocaleDefinition,timeFormatLocaleDefinition:window.d3TimeFormatLocaleDefinition};this.setSettings(s),d3.select(window).on("resize",(function(){i.resize()}))},setSettings:function(t,e){var i=void 0===this.settings?{}:this.settings;this.settings=$.extend(!0,{},i,e,t)},draw:function(t,e){this.setSettings(e),this.dataTable=t,this.formatLocale=d3.formatLocale(this.settings.formatLocaleDefinition),this.timeFormatLocale=d3.timeFormatLocale(this.settings.timeFormatLocaleDefinition),this.orientation=this.settings.orientation,this.$chart&&this.$chart.remove();var i=this.chartBaseClass;this.settings.chartClass&&(i+=" "+this.settings.chartClass),this.$chart=$('<div class="'.concat(i,'" />')).appendTo(this.$container)},resize:function(){this.draw(this.dataTable,this.settings)},onAfterDrawTicks:function(){$(".tick",this.$chart).each((function(t,e){var i=$("text",e);i.clone().appendTo(e),i.attr("stroke","#ffffff"),i.attr("stroke-width",3)}))}},{defaults:{formatLocaleDefinition:null,timeFormatLocaleDefinition:null,formats:{numberFormat:",.2f",percentFormat:",.2%",currencyFormat:"$,.2f",shortDateFormats:{day:"%-m/%-d",month:"%-m/%y",year:"%Y"}},margin:{top:0,right:0,bottom:0,left:0},chartClass:null,colors:["#0594D1","#DE3800","#FF9A00","#009802","#9B009B"]}}),Craft.charts.Area=Craft.charts.BaseChart.extend({tip:null,drawingArea:null,init:function(t,e){this.base(t,Craft.charts.Area.defaults),this.setSettings(e)},draw:function(t,e){this.base(t,e),this.tip&&(this.tip=null);var i=this.getChartMargin();this.width=this.$chart.width()-i.left-i.right,this.height=this.$chart.height()-i.top-i.bottom;var s={width:this.width+(i.left+i.right),height:this.height+(i.top+i.bottom),translateX:"rtl"!==this.orientation?i.left:i.right,translateY:i.top};this.svg=d3.select(this.$chart.get(0)).append("svg").attr("width",s.width).attr("height",s.height),this.drawingArea=this.svg.append("g").attr("transform","translate(".concat(s.translateX,",").concat(s.translateY,")")),this.drawTicks(),this.drawAxes(),this.drawChart(),this.drawTipTriggers()},drawTicks:function(){var t=this.getX(!0),e=d3.axisBottom(t).tickFormat(this.getXFormatter()).ticks(3);this.drawingArea.append("g").attr("class","x ticks-axis").attr("transform","translate(0, ".concat(this.height,")")).call(e);var i,s=this.getY();"rtl"!==this.orientation?(i=d3.axisLeft(s).tickFormat(this.getYFormatter()).tickValues(this.getYTickValues()).ticks(2),this.drawingArea.append("g").attr("class","y ticks-axis").call(i)):(i=d3.axisRight(s).tickFormat(this.getYFormatter()).tickValues(this.getYTickValues()).ticks(2),this.drawingArea.append("g").attr("class","y ticks-axis").attr("transform","translate(".concat(this.width,",0)")).call(i)),this.onAfterDrawTicks()},drawAxes:function(){if(this.settings.xAxis.showAxis){var t=this.getX(),e=d3.axisBottom(t).ticks(0).tickSizeOuter(0);this.drawingArea.append("g").attr("class","x axis").attr("transform","translate(0, ".concat(this.height,")")).call(e)}if(this.settings.yAxis.showAxis){var i,s=this.getY();"rtl"===this.orientation?(i=d3.axisLeft(s).ticks(0),this.drawingArea.append("g").attr("class","y axis").attr("transform","translate(".concat(this.width-0,", 0)")).call(i)):(i=d3.axisRight(s).ticks(0),this.drawingArea.append("g").attr("class","y axis").attr("transform","translate(".concat(0,", 0)")).call(i))}},drawChart:function(){var t=this.getX(!0),e=this.getY();if(this.settings.xAxis.gridlines){var i=d3.axisBottom(t);this.drawingArea.append("g").attr("class","x grid-line").attr("transform","translate(0,".concat(this.height,")")).call(i.tickSize(-this.height,0,0).tickFormat(""))}if(this.settings.yAxis.gridlines){var s=d3.axisLeft(e);this.drawingArea.append("g").attr("class","y grid-line").attr("transform","translate(0 , 0)").call(s.tickSize(-this.width,0).tickFormat("").tickValues(this.getYTickValues()).ticks(2))}var a=d3.line().x((function(e){return t(e[0])})).y((function(t){return e(t[1])}));this.drawingArea.append("g").attr("class","chart-line").append("path").datum(this.dataTable.rows).style("fill","none").style("stroke",this.settings.colors[0]).style("stroke-width","3px").attr("d",a);var n=d3.area().x((function(e){return t(e[0])})).y0(this.height).y1((function(t){return e(t[1])}));this.drawingArea.append("g").attr("class","chart-area").append("path").datum(this.dataTable.rows).style("fill",this.settings.colors[0]).style("fill-opacity","0.3").attr("d",n),this.settings.plots&&this.drawingArea.append("g").attr("class","plots").selectAll("circle").data(this.dataTable.rows).enter().append("circle").style("fill",this.settings.colors[0]).attr("class",(function(t,e){return"plot plot-".concat(e)})).attr("r",4).attr("cx",(function(e){return t(e[0])})).attr("cy",(function(t){return e(t[1])}))},drawTipTriggers:function(){var t=this;if(this.settings.tips){this.tip||(this.tip=new Craft.charts.Tip(this.$chart));var e=this.getChartMargin(),i=(this.drawingArea.select(".x path.domain").node().getTotalLength()-e.left-e.right-12)/(this.dataTable.rows.length-1),s=Math.max(0,i),a=this.getX(!0),n=this.getY();this.drawingArea.append("g").attr("class","tip-triggers").selectAll("rect").data(this.dataTable.rows).enter().append("rect").attr("class","tip-trigger").style("fill","transparent").style("fill-opacity","1").attr("width",s).attr("height",this.height).attr("x",(function(t){return a(t[0])-s/2})).on("mouseover",(function(e,i){t.drawingArea.select(".plot-"+i).attr("r",5);var s=$("<div />"),r=$('<div class="x-value" />').appendTo(s),o=$('<div class="y-value" />').appendTo(s);r.html(t.getXFormatter()(e[0])),o.html(t.getYFormatter()(e[1]));var l=s.get(0);t.tip.setContent(l);var h,d=t.getChartMargin(),c=24,u=n(e[1])+c;"rtl"!==t.orientation?(h=a(e[0])+d.left+c,t.$chart.offset().left+h+t.tip.$tip.width()>t.$chart.offset().left+t.$chart.width()-c&&(h=a(e[0])-(t.tip.$tip.width()+c))):h=a(e[0])-(t.tip.$tip.width()+d.left+c),h<0&&(h=a(e[0])+d.left+c);var p={top:u,left:h};t.tip.setPosition(p),t.tip.show()})).on("mouseout",(function(e,i){t.drawingArea.select(".plot-"+i).attr("r",4),t.tip.hide()}))}},getChartMargin:function(){var t=this,e=this.settings.margin,i=this.getYTickValues(),s=0;return $.each(i,(function(e,i){var a=8*t.getYFormatter()(i).length;a>s&&(s=a)})),s+=10,e.left=s,e},getX:function(t){var e=d3.min(this.dataTable.rows,(function(t){return t[0]})),i=d3.max(this.dataTable.rows,(function(t){return t[0]})),s=[e,i];"rtl"===this.orientation&&(s=[i,e]);var a=0,n=0;t&&(a=0,n=0);var r=d3.scaleTime().range([a,this.width-n]);return r.domain(s),r},getY:function(){var t=[0,this.getYMaxValue()],e=d3.scaleLinear().range([this.height,0]);return e.domain(t),e},getXFormatter:function(){return this.settings.xAxis.formatter!==$.noop?this.settings.xAxis.formatter(this):Craft.charts.utils.getTimeFormatter(this.timeFormatLocale,this.settings)},getYFormatter:function(){return this.settings.yAxis.formatter!==$.noop?this.settings.yAxis.formatter(this):Craft.charts.utils.getNumberFormatter(this.formatLocale,this.dataTable.columns[1].type,this.settings)},getYMaxValue:function(){return d3.max(this.dataTable.rows,(function(t){return t[1]}))},getYTickValues:function(){var t=this.getYMaxValue();return t>1?[t/2,t]:[0,t]}},{defaults:{chartClass:"area",margin:{top:25,right:5,bottom:25,left:0},plots:!0,tips:!0,xAxis:{gridlines:!1,showAxis:!0,formatter:$.noop},yAxis:{gridlines:!0,showAxis:!1,formatter:$.noop}}}),Craft.charts.utils={getDuration:function(t){var e=parseInt(t,10),i={hours:Math.floor(e/3600),minutes:Math.floor((e-3600*i.hours)/60),seconds:e-3600*i.hours-60*i.minutes};return i.hours<10&&(i.hours="0".concat(i.hours)),i.minutes<10&&(i.minutes="0".concat(i.minutes)),i.seconds<10&&(i.seconds="0".concat(i.seconds)),"".concat(i.hours,":").concat(i.minutes,":").concat(i.seconds)},getTimeFormatter:function(t,e){switch(e.dataScale){case"year":return t.format("%Y");case"month":return t.format(e.formats.shortDateFormats.month);case"hour":return t.format("".concat(e.formats.shortDateFormats.day," %H:00:00"));default:return t.format(e.formats.shortDateFormats.day)}},getNumberFormatter:function(t,e,i){switch(e){case"currency":return t.format(i.formats.currencyFormat);case"percent":return t.format(i.formats.percentFormat);case"time":return Craft.charts.utils.getDuration;case"number":return t.format(i.formats.numberFormat)}}}},3352:function(){Craft.ColorInput=Garnish.Base.extend({$container:null,$input:null,$colorContainer:null,$colorPreview:null,$colorInput:null,init:function(t){this.$container=$(t),this.$input=this.$container.find(".color-input"),this.$colorContainer=this.$container.children(".color"),this.$colorPreview=this.$colorContainer.children(".color-preview"),this.createColorInput(),this.handleTextChange(),this.addListener(this.$input,"input","handleTextChange")},createColorInput:function(){var t=document.createElement("input");t.setAttribute("type","color"),"color"===t.type&&(this.$colorContainer.removeClass("static"),this.$colorInput=$(t).addClass("color-preview-input").attr({"aria-controls":this.$input.attr("id"),"aria-label":Craft.t("app","Color picker")}).appendTo(this.$colorPreview),this.addListener(this.$colorInput,"click",(function(t){t.stopPropagation()})),this.addListener(this.$colorContainer,"click",(function(){this.$colorInput.trigger("click")})),this.addListener(this.$colorInput,"input","updateColor"))},updateColor:function(){this.$input.val(this.$colorInput.val()),this.handleTextChange()},handleTextChange:function(){var t=this.$input.val();t!==(t=Craft.trim(t))&&this.$input.val(t),t.length&&"#"===t[0]&&(t=t.substring(1),this.$input.val(t)),t.length?(3===t.length&&(t=t[0].repeat(2)+t[1].repeat(2)+t[2].repeat(2)),t.match(/^[0-9a-f]{6}$/i)?(this.$colorPreview.css("background-color","#".concat(t)),this.$colorInput&&this.$colorInput.val("#".concat(t))):this.$colorPreview.css("background-color","")):this.$colorPreview.css("background-color","")}},{_browserSupportsColorInputs:null,doesBrowserSupportColorInputs:function(){return Craft.ColorInput._browserSupportsColorInputs,Craft.ColorInput._browserSupportsColorInputs}})},8167:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function e(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}Craft.CpScreenSlideout=Craft.Slideout.extend({action:null,namespace:null,showingLoadSpinner:!1,hasTabs:!1,hasCpLink:!1,hasSidebar:!1,$header:null,$toolbar:null,$tabContainer:null,$loadSpinner:null,$editLink:null,$sidebarBtn:null,$body:null,$content:null,$sidebar:null,$footer:null,$noticeContainer:null,$cancelBtn:null,$saveBtn:null,tabManager:null,showingSidebar:!1,cancelToken:null,ignoreFailedRequest:!1,fieldsWithErrors:null,init:function(t,e){var i=this;this.action=t,this.setSettings(e,Craft.CpScreenSlideout.defaults),this.fieldsWithErrors=[],this.$header=$("<header/>",{class:"pane-header"}),this.$toolbar=$("<div/>",{class:"so-toolbar"}).appendTo(this.$header),this.$tabContainer=$("<div/>",{class:"pane-tabs"}).appendTo(this.$toolbar),this.$loadSpinner=$("<div/>",{class:"spinner",title:Craft.t("app","Loading"),"aria-label":Craft.t("app","Loading")}).appendTo(this.$toolbar),this.$editLink=$("<a/>",{target:"_blank",class:"btn header-btn hidden",title:Craft.t("app","Open the full edit page in a new tab"),"aria-label":Craft.t("app","Open the full edit page in a new tab"),"data-icon":"external"}).appendTo(this.$toolbar),this.$sidebarBtn=$("<button/>",{type:"button",class:"btn header-btn hidden sidebar-btn",title:Craft.t("app","Show sidebar"),"aria-label":Craft.t("app","Show sidebar"),"data-icon":"sidebar-".concat(Garnish.ltr?"right":"left"),"aria-expanded":"false"}).appendTo(this.$toolbar),this.addListener(this.$sidebarBtn,"click",(function(t){t.preventDefault(),i.showingSidebar?i.hideSidebar():i.showSidebar()})),this.$body=$("<div/>",{class:"so-body"}),this.$content=$("<div/>",{class:"so-content"}).appendTo(this.$body),this.$sidebar=$("<div/>",{class:"so-sidebar details hidden"}).appendTo(this.$body),this.$footer=$("<div/>",{class:"so-footer hidden"}),this.$noticeContainer=$("<div/>",{class:"so-notice"}).appendTo(this.$footer),$("<div/>",{class:"flex-grow"}).appendTo(this.$footer);var s=$("<div/>",{class:"flex flex-nowrap"}).appendTo(this.$footer);this.$cancelBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(s),this.$saveBtn=Craft.ui.createSubmitButton({label:Craft.t("app","Save"),spinner:!0}).appendTo(s);var a=this.$header.add(this.$body).add(this.$footer);this.base(a,{containerElement:"form",containerAttributes:{id:"cp-screen-".concat(Math.floor(1e8*Math.random())),action:"",method:"post",novalidate:"",class:"cp-screen"},closeOnEsc:!1,closeOnShadeClick:!1}),this.$container.data("cpScreen",this),this.on("beforeClose",(function(){i.hideSidebar()})),Garnish.uiLayerManager.registerShortcut({keyCode:Garnish.S_KEY,ctrl:!0},(function(t){i.handleSubmit(t)})),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){i.closeMeMaybe()})),this.addListener(this.$cancelBtn,"click",(function(){i.closeMeMaybe()})),this.addListener(this.$shade,"click",(function(){i.closeMeMaybe()})),this.addListener(this.$container,"click",(function(t){var e=$(event.target);!i.showingSidebar||e.closest(i.$sidebarBtn).length||e.closest(i.$sidebar).length||i.hideSidebar()})),this.addListener(this.$container,"submit","handleSubmit"),this.load()},load:function(t,e){var i=this;return new Promise((function(t,s){i.trigger("beforeLoad"),i.showLoadSpinner(),i.cancelToken&&(i.ignoreFailedRequest=!0,i.cancelToken.cancel()),i.cancelToken=axios.CancelToken.source(),Craft.sendActionRequest("GET",i.action,$.extend({params:Object.assign({},i.getParams(),i.settings.params),cancelToken:i.cancelToken.token,headers:{"X-Craft-Container-Id":i.$container.attr("id")}},i.settings.requestOptions)).then((function(a){i.update(a.data).then((function(){!1!==e&&(i.$container.data("delta-names",a.data.deltaNames),i.$container.data("initial-delta-values",a.data.initialDeltaValues),i.$container.data("initialSerializedValue",i.$container.serialize())),t()})).catch((function(t){s(t)}))})).catch((function(t){i.ignoreFailedRequest||(Craft.cp.displayError(),s(t)),i.ignoreFailedRequest=!1})).finally((function(){i.hideLoadSpinner(),i.cancelToken=null}))}))},getParams:function(){return{}},updateHeaderVisibility:function(){var t=this.settings.showHeader||this.hasTabs||this.hasCpLink||this.showingLoadSpinner;t||this.hasSidebar?this.$header.removeClass("hidden"):this.$header.addClass("hidden"),t?this.$header.addClass("so-visible"):this.$header.removeClass("so-visible")},showLoadSpinner:function(){this.$loadSpinner.removeClass("hidden"),this.showingLoadSpinner=!0,this.updateHeaderVisibility()},hideLoadSpinner:function(){this.$loadSpinner.addClass("hidden"),this.showingLoadSpinner=!1,this.updateHeaderVisibility()},update:function(t){var e=this;return new Promise((function(i){e.namespace=t.namespace,e.$content.html(t.content),t.submitButtonLabel&&e.$saveBtn.text(t.submitButtonLabel),e.updateTabs(t.tabs),t.formAttributes&&Craft.setElementAttributes(e.$container,t.formAttributes),t.editUrl?(e.$editLink.removeClass("hidden").attr("href",t.editUrl),e.hasCpLink=!0):(e.$editLink.addClass("hidden"),e.hasCpLink=!1),t.sidebar?(e.$container.addClass("has-sidebar"),e.$sidebarBtn.removeClass("hidden"),e.$sidebar.html(t.sidebar),e.$sidebar.find("a").each((function(){this.hostname.length&&void 0===$(this).attr("target")&&$(this).attr("target","_blank")})),e.hasSidebar=!0):(e.$container.removeClass("has-sidebar"),e.$sidebarBtn.addClass("hidden"),e.$sidebar.addClass("hidden").html(""),e.hasSidebar=!1),t.notice?e.$noticeContainer.html(t.notice):e.$noticeContainer.empty(),e.updateHeaderVisibility(),e.$footer.removeClass("hidden"),Garnish.requestAnimationFrame((function(){Craft.appendHeadHtml(t.headHtml),Craft.appendBodyHtml(t.bodyHtml),Craft.initUiElements(e.$content),(new Craft.ElementThumbLoader).load($(e.$content)),t.sidebar&&(Craft.initUiElements(e.$sidebar),(new Craft.ElementThumbLoader).load(e.$sidebar)),Garnish.isMobileBrowser()||Craft.setFocusWithin(e.$content),i(),e.trigger("load")}))}))},updateTabs:function(t){var e=this;if(this.tabManager&&(this.tabManager.destroy(),this.tabManager=null,this.$tabContainer.html("")),this.hasTabs=!!t,this.hasTabs){var i=$(t);this.$tabContainer.replaceWith(i),this.$tabContainer=i,this.tabManager=new Craft.Tabs(this.$tabContainer),this.tabManager.on("deselectTab",(function(t){$(t.$tab.attr("href")).addClass("hidden")})),this.tabManager.on("selectTab",(function(t){$(t.$tab.attr("href")).removeClass("hidden"),Garnish.$win.trigger("resize"),e.$body.trigger("scroll")}))}},showSidebar:function(){var t=this;this.showingSidebar||(this.$body.scrollTop(0).addClass("no-scroll"),this.$sidebar.off("transitionend.so").css(this._closedSidebarStyles()).removeClass("hidden"),this.$sidebar[0].offsetWidth,this.$sidebar.css(this._openedSidebarStyles()),Garnish.isMobileBrowser()||this.$sidebar.one("transitionend.so",(function(){Craft.setFocusWithin(t.$sidebar)})),Craft.trapFocusWithin(this.$sidebar),this.$sidebarBtn.addClass("active").attr({"aria-expanded":"true"}),Garnish.$win.trigger("resize"),this.$sidebar.trigger("scroll"),Garnish.uiLayerManager.addLayer(),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.hideSidebar()})),this.showingSidebar=!0)},hideSidebar:function(){var t=this;this.showingSidebar&&(this.$body.removeClass("no-scroll"),this.$sidebar.off("transitionend.so").css(this._closedSidebarStyles()).one("transitionend.so",(function(){t.$sidebar.addClass("hidden"),t.$sidebarBtn.focus()})),this.$sidebarBtn.removeClass("active").attr({"aria-expanded":"false"}),Garnish.uiLayerManager.removeLayer(),this.showingSidebar=!1)},_openedSidebarStyles:function(){return e({},Garnish.ltr?"right":"left","0")},_closedSidebarStyles:function(){return e({},Garnish.ltr?"right":"left","-350px")},showSubmitSpinner:function(){this.$saveBtn.addClass("loading")},hideSubmitSpinner:function(){this.$saveBtn.removeClass("loading")},handleSubmit:function(t){t.preventDefault(),this.submit()},submit:function(){var t=this;this.showSubmitSpinner();var e=Craft.findDeltaData(this.$container.data("initialSerializedValue"),this.$container.serialize(),this.$container.data("delta-names"),null,this.$container.data("initial-delta-values"));Craft.sendActionRequest("POST",null,{data:e,headers:{"X-Craft-Namespace":this.namespace}}).then((function(e){t.handleSubmitResponse(e)})).catch((function(e){t.handleSubmitError(e)})).finally((function(){t.hideSubmitSpinner()}))},handleSubmitResponse:function(t){this.clearErrors();var e=t.data||{};e.message&&Craft.cp.displaySuccess(e.message,e.notificationSettings),this.trigger("submit",{response:t,data:e.modelName&&e[e.modelName]||{}}),this.settings.closeOnSubmit&&this.close()},handleSubmitError:function(t){if(!t.isAxiosError||!t.response||400===!t.response.status)throw Craft.cp.displayError(),t;var e=t.response.data||{};Craft.cp.displayError(e.message),e.errors&&this.showErrors(e.errors)},showErrors:function(e){var i=this;this.clearErrors(),Object.entries(e).forEach((function(e){var s,a,n=(a=2,function(t){if(Array.isArray(t))return t}(s=e)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(s,a)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(s,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),r=n[0],o=n[1],l=i.$container.find('[data-attribute="'.concat(r,'"]'));l&&(Craft.ui.addErrorsToField(l,o),i.fieldsWithErrors.push(l))}))},clearErrors:function(){this.fieldsWithErrors.forEach((function(t){Craft.ui.clearErrorsFromField(t)}))},isDirty:function(){return void 0!==this.$container.data("initialSerializedValue")&&this.$container.serialize()!==this.$container.data("initialSerializedValue")},closeMeMaybe:function(){this.isOpen&&(this.isDirty()&&!confirm(Craft.t("app","Are you sure you want to close this screen? Any changes will be lost."))||this.close())},close:function(){this.base(),this.cancelToken&&(this.ignoreFailedRequest=!0,this.cancelToken.cancel())}},{defaults:{params:{},requestOptions:{},showHeader:null,closeOnSubmit:!0}})},587:function(){function t(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=s(t))||e&&t&&"number"==typeof t.length){i&&(t=i);var a=0,n=function(){};return{s:n,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function(t){function e(e){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(t){throw t})),f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return o=t.done,t},e:function(t){function e(e){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(t){l=!0,r=t})),f:function(){try{o||null==i.return||i.return()}finally{if(l)throw r}}}}function i(t){return function(t){if(Array.isArray(t))return a(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||s(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(t,e){if(t){if("string"==typeof t)return a(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(t,e):void 0}}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var r=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi;if(jQuery.htmlPrefilter=function(t){return t.replace(r,"<$1></$2>")},$.extend(Craft,{navHeight:48,index:function(t,e){if(!$.isArray(t))throw"The first argument passed to Craft.index() must be an array.";return t.reduce((function(t,i,s){return t["string"==typeof e?i[e]:e(i,s)]=i,t}),{})},group:function(t,e){if(!$.isArray(t))throw"The first argument passed to Craft.group() must be an array.";var i={};return t.reduce((function(t,s,a){var n="string"==typeof e?s[e]:e(s,a);return i.hasOwnProperty(n)||(i[n]=[[],n],t.push(i[n])),i[n][0].push(s),t}),[])},t:function(t,e,i){return void 0!==Craft.translations[t]&&void 0!==Craft.translations[t][e]&&(e=Craft.translations[t][e]),i?this.formatMessage(e,i):e},formatMessage:function(t,e){var i;if(!1===(i=this._tokenizePattern(t)))throw"Message pattern is invalid.";for(var s=0;s<i.length;s++){var a=i[s];if("object"===n(a)&&!1===(i[s]=this._parseToken(a,e)))throw"Message pattern is invalid."}return i.join("")},_tokenizePattern:function(t){var e,s,a=1,n=i(t);if(-1===(e=s=n.indexOf("{")))return[t];for(var r=[n.slice(0,s).join("")];;){var o=n.indexOf("{",s+1),l=n.indexOf("}",s+1);if(-1===o&&(o=!1),-1===l&&(l=!1),!1===o&&!1===l)break;if(!1===o&&(o=n.length),l>o?(a++,s=o):(a--,s=l),0===a&&(r.push(n.slice(e+1,s).join("").split(",",3)),e=s+1,r.push(n.slice(e,o).join("")),e=o),0!==a&&(!1===o||!1===l))break}return 0===a&&r},_parseToken:function(t,e){var s=this,a=Craft.trim(t[0]);if(void 0===e[a])return"{".concat(t.join(","),"}");var r=e[a],o=void 0!==t[1]?Craft.trim(t[1]):"none";switch(o){case"number":return function(){var e=void 0!==t[2]?Craft.trim(t[2]):null;if(null!==e&&"integer"!==e)throw"Message format 'number' is only supported for integer values.";var i,s=Craft.formatNumber(r);return null===e&&-1!==(i="".concat(r).indexOf("."))&&(s+=".".concat(r.substring(i+1))),s}();case"none":return r;case"select":return function(){if(void 0===t[2])return!1;for(var i=s._tokenizePattern(t[2]),a=i.length,n=!1,o=0;o+1<a;o++){if(Garnish.isArray(i[o])||!Garnish.isArray(i[o+1]))return!1;var l=Craft.trim(i[o++]);(!1===n&&"other"===l||l==r)&&(n=i[o].join(","))}return!1!==n&&s.formatMessage(n,e)}();case"plural":return function(){if(void 0===t[2])return!1;for(var a=s._tokenizePattern(t[2]),o=a.length,l=!1,h=0,d=0;d+1<o;d++){if("object"===n(a[d])||"object"!==n(a[d+1]))return!1;var c=Craft.trim(a[d++]),u=i(c);if(1===d&&"offset:"===c.substring(0,7)){var p=i(c.replace(/[\n\r\t]/g," ")).indexOf(" ",7);if(-1===p)throw"Message pattern is invalid.";h=parseInt(Craft.trim(u.slice(7,p).join(""))),c=Craft.trim(u.slice(p+1,p+1+u.length).join(""))}(!1===l&&"other"===c||"="===c[0]&&parseInt(u.slice(1,1+u.length).join(""))===r||"one"===c&&r-h==1)&&(l=("string"==typeof a[d]?[a[d]]:a[d]).map((function(t){return t.replace("#",r-h)})).join(","))}return!1!==l&&s.formatMessage(l,e)}();default:throw"Message format '".concat(o,"' is not supported.")}},formatDate:function(t){return"object"!==n(t)&&(t=new Date(t)),$.datepicker.formatDate(Craft.datepickerOptions.dateFormat,t)},formatNumber:function(t,e){return void 0===e&&(e=",.0f"),d3.formatLocale(d3FormatLocaleDefinition).format(e)(t)},shortcutText:function(t,e,i){return"Mac"===Craft.clientOs?(i?"⌥":"")+(e?"⇧":"")+"⌘"+t:"Ctrl+"+(i?"Alt+":"")+(e?"Shift+":"")+t},escapeHtml:function(t){return $("<div/>").text(t).html()},escapeRegex:function(t){return t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},getText:function(t){return $("<div/>").html(t).text()},encodeUriComponent:function(t){t=encodeURIComponent(t);var e={"!":"%21","*":"%2A","'":"%27","(":"%28",")":"%29"};for(var i in e){var s=new RegExp("\\"+i,"g");t=t.replace(s,e[i])}return t},selectFullValue:function(t){var e=$(t),i=e.val();if(void 0!==e[0].setSelectionRange){var s=2*i.length;e[0].setSelectionRange(0,s)}else e.val(i)},formatInputId:function(t){return this.rtrim(t.replace(/[^\w\-]+/g,"-"),"-")},getUrl:function(t,e,i){"string"!=typeof t&&(t="");var s=null;if($.isPlainObject(e))void 0!==e["#"]&&(s=e["#"],delete e["#"]);else if("string"==typeof e){var a=e.indexOf("#");-1!==a&&(s=e.substring(a+1),e=e.substring(0,a)),e=Object.fromEntries(new URLSearchParams(e).entries())}else e={};var n=t.indexOf("#");-1!==n&&(s||(s=t.substring(n+1)),t=t.substring(0,n));var r,o=t.indexOf("?");if(-1!==o&&(e=$.extend(Object.fromEntries(new URLSearchParams(t.substring(o+1)).entries()),e),t=t.substring(0,o)),-1!==t.search("://")||"/"===t[0])return t+($.isEmptyObject(e)?"":"?".concat($.param(e)))+(s?"#".concat(s):"");if(t=Craft.trim(t,"/"),i){if(r=i,t&&Craft.pathParam){var l=r.match(new RegExp("[&?]"+Craft.escapeRegex(Craft.pathParam)+"=[^&]+"));l&&(r=r.replace(l[0],Craft.rtrim(l[0],"/")+"/"+t),t="")}}else r=Craft.baseUrl;return-1!==(o=r.indexOf("?"))&&(e=$.extend(Object.fromEntries(new URLSearchParams(r.substring(o+1)).entries()),e),r=r.substring(0,o)),!Craft.omitScriptNameInUrls&&t&&(Craft.usePathInfo||!Craft.pathParam?-1===r.search(Craft.scriptName)&&(r=Craft.rtrim(r,"/")+"/"+Craft.scriptName):(void 0!==e[Craft.pathParam]&&(t=Craft.rtrim(e[Craft.pathParam])+(t?"/"+t:"")),e[Craft.pathParam]=t,t=null)),t&&(r=Craft.rtrim(r,"/")+"/"+t),$.isEmptyObject(e)||(r+="?".concat($.param(e))),s&&(r+="#".concat(s)),r},getCpUrl:function(t,e){return this.getUrl(t,e,Craft.baseCpUrl)},getSiteUrl:function(t,e){return this.getUrl(t,e,Craft.baseSiteUrl)},getActionUrl:function(t,e){return Craft.getUrl(t,e,Craft.actionUrl)},redirectTo:function(t){document.location.href=this.getUrl(t)},setUrl:function(t){"undefined"!=typeof history&&(t.match(/#/)||(t+=document.location.hash),history.replaceState({},"",t))},setPath:function(t){this.path=t,this.setUrl(Craft.getUrl(t,document.location.search))},setQueryParam:function(t,e){var i=document.location.origin+document.location.pathname,s=this.getQueryParams();null!=e&&!1!==e?s[t]=e:delete s[t],this.setUrl(Craft.getUrl(i,s))},getPageUrl:function(t){var e=document.location.origin+document.location.pathname;e=Craft.rtrim(e,"/");var i=document.location.search?document.location.search.substring(1):"";if("?"===Craft.pageTrigger[0]){var s=Craft.pageTrigger.substring(1);if(document.location.search){var a=Object.fromEntries(new URLSearchParams(i).entries());delete a[s],i=$.param(a)}1!==t&&(i+=(""!==i?"&":"")+"".concat(s,"=").concat(t))}else e=e.replace(new RegExp("/"+Craft.escapeRegex(Craft.pageTrigger)+"\\d+$"),""),1!==t&&(e+="/".concat(Craft.pageTrigger).concat(t));return e+(i?"?".concat(i):"")+document.location.hash},getCsrfInput:function(){return Craft.csrfTokenName?'<input type="hidden" name="'+Craft.csrfTokenName+'" value="'+Craft.csrfTokenValue+'"/>':""},postActionRequest:function(t,e,i,s){"function"==typeof e&&(s=i,i=e,e={}),(s=s||{}).contentType&&s.contentType.match(/\bjson\b/)&&("object"===n(e)&&(e=JSON.stringify(e)),s.contentType="application/json; charset=utf-8");var a=$.ajax($.extend({url:Craft.getActionUrl(t),type:"POST",dataType:"json",headers:this._actionHeaders(),data:e,success:i,error:function(t,e,s){4===t.readyState&&(400!==t.status&&(void 0!==Craft.cp?Craft.cp.displayError():alert(Craft.t("app","A server error occurred."))),i&&i(400===t.status?t.responseJSON:null,e,t))}},s));return"function"==typeof s.send&&s.send(a),a},_actionHeaders:function(){var t={"X-Registered-Asset-Bundles":Object.keys(Craft.registeredAssetBundles).join(","),"X-Registered-Js-Files":Object.keys(Craft.registeredJsFiles).join(",")};return Craft.csrfTokenValue&&(t["X-CSRF-Token"]=Craft.csrfTokenValue),t},sendActionRequest:function(t,e){var i=this,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if($.isPlainObject(e)&&(s=e,e=null),"POST"===t.toUpperCase()&&e&&s.data)if("string"==typeof s.data){var a=s&&s.headers&&s.headers["X-Craft-Namespace"],n=this.namespaceInputName("action",a);s.data+="&".concat(n,"=").concat(e)}else delete s.data.action;return new Promise((function(a,n){(s=s?$.extend({},s):{}).method=t,s.url=e?Craft.getActionUrl(e):Craft.getCpUrl(),s.headers=$.extend({"X-Requested-With":"XMLHttpRequest"},s.headers||{},i._actionHeaders()),s.params=$.extend({},s.params||{},{v:(new Date).getTime()}),axios.request(s).then(a).catch(n)}))},sendApiRequest:function(t,e,i){var s=this;return new Promise((function(a,n){var r=(i=i?$.extend({},i):{}).cancelToken||null;s._getApiHeaders(r).then((function(o){i.method=t,i.baseURL=Craft.baseApiUrl,i.url=e,i.headers=$.extend(o,i.headers||{}),i.params=$.extend(Craft.apiParams||{},i.params||{},{v:(new Date).getTime()}),s._apiHeaders||(i.params.processCraftHeaders=1),Craft.httpProxy&&(i.proxy=Craft.httpProxy),axios.request(i).then((function(t){s._processApiHeaders(t.headers,r).then((function(){a(t.data)})).catch(n)})).catch(n)})).catch(n)}))},_loadingApiHeaders:!1,_apiHeaders:null,_apiHeaderWaitlist:[],_getApiHeaders:function(t){var i=this;return new Promise((function(s,a){i._loadingApiHeaders?i._apiHeaderWaitlist.push([s,a]):i._apiHeaders?s(i._apiHeaders):(i._loadingApiHeaders=!0,i.sendActionRequest("POST","app/api-headers",{cancelToken:t}).then((function(t){i._loadingApiHeaders?s(t.data):a(e)})).catch((function(t){i._rejectApiRequests(a,t)})))}))},_processApiHeaders:function(t,i){var s=this;return new Promise((function(a,n){s._apiHeaders?a():s.sendActionRequest("POST","app/process-api-response-headers",{data:{headers:t},cancelToken:i}).then((function(t){if(s._loadingApiHeaders)for(s._apiHeaders=t.data,s._loadingApiHeaders=!1,a();s._apiHeaderWaitlist.length;)s._apiHeaderWaitlist.shift()[0](s._apiHeaders);else n(e)})).catch((function(t){s._rejectApiRequests(n,t)}))}))},_rejectApiRequests:function(t,e){for(this._loadingApiHeaders=!1,t(e);this._apiHeaderWaitlist.length;)this._apiHeaderWaitlist.shift()[1](e)},clearCachedApiHeaders:function(){for(this._apiHeaders=null,this._loadingApiHeaders=!1;this._apiHeaderWaitlist.length;)this._apiHeaderWaitlist.shift()[1]()},downloadFromUrl:function(t,e,i){return new Promise((function(s,a){var r=new XMLHttpRequest;r.open(t,e,!0),"object"===n(i)?(r.setRequestHeader("Content-Type","application/json; charset=UTF-8"),i=JSON.stringify(i)):r.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"),r.responseType="blob",r.onload=function(){if(200===r.status){var t=r.getResponseHeader("content-disposition"),e=/"([^"]*)"/.exec(t),i=null!=e&&e[1]?e[1]:"Download",n=r.getResponseHeader("content-type"),o=new Blob([r.response],{type:n}),l=document.createElement("a");l.href=window.URL.createObjectURL(o),l.download=i,document.body.appendChild(l),l.click(),document.body.removeChild(l),s()}else a()},r.send(i)}))},stringToArray:function(t){if("string"!=typeof t)return t;for(var e=t.split(","),i=0;i<e.length;i++)e[i]=$.trim(e[i]);return e},findDeltaData:function(t,e,i,s,a,r){t="string"==typeof t?t:"",e="string"==typeof e?e:"",i=$.isArray(i)?i:[],a=$.isPlainObject(a)?a:{},r=$.isArray(r)?r:[],i.sort((function(t,e){return t.length===e.length?0:t.length>e.length?1:-1}));for(var o=this._groupParamsByDeltaNames(t.split("&"),i,!1,a),l=this._groupParamsByDeltaNames(e.split("&"),i,!0,!1),h=l.__root__,d=0;d<i.length;d++)(Craft.inArray(i[d],r)||"object"===n(l[i[d]])&&("object"!==n(o[i[d]])||JSON.stringify(o[i[d]])!==JSON.stringify(l[i[d]])))&&((h=h.concat(l[i[d]])).push("modifiedDeltaNames[]="+i[d]),s&&s(i[d],l[i[d]]));return h.join("&")},_groupParamsByDeltaNames:function(t,e,i,s){var a={};i&&(a.__root__=[]);var n=function(t){return encodeURIComponent(t).replace("%3D","=")};t=t.map((function(t){return decodeURIComponent(t)}));t:for(var r=0;r<t.length;r++){for(var o=e.length-1;o>=0;o--){var l=t[r].substring(0,e[o].length+1);if(l===e[o]+"="||l===e[o]+"["){void 0===a[e[o]]&&(a[e[o]]=[]),a[e[o]].push(n(t[r]));continue t}}i&&a.__root__.push(n(t[r]))}if(s){var h=function(t,e){return $.isArray(e)||$.isPlainObject(e)?e=$.param(e):"string"==typeof e?e=encodeURIComponent(e):null===e&&(e=""),"".concat(encodeURIComponent(t),"=").concat(e)};for(var d in s)if(s.hasOwnProperty(d))if($.isPlainObject(s[d]))for(var c in a[d]=[],s[d])s[d].hasOwnProperty(c)&&a[d].push(h("".concat(d,"[").concat(c,"]"),s[d][c]));else a[d]=[h(d,s[d])]}return a},expandPostArray:function(t){var e,i={};for(var s in t)if(t.hasOwnProperty(s)){var a,r=t[s],o=s.match(/^(\w+)(\[.*)?/);if(o[2])for(a=o[2].match(/\[[^\[\]]*\]/g),e=0;e<a.length;e++)a[e]=a[e].substring(1,a[e].length-1);else a=[];a.unshift(o[1]);var l=i;for(e=0;e<a.length;e++)e<a.length-1?("object"!==n(l[a[e]])&&(a[e+1]&&parseInt(a[e+1])!=a[e+1]?l[a[e]]={}:l[a[e]]=[]),l=l[a[e]]):(a[e]||(a[e]=l.length),l[a[e]]=r)}return i},createForm:function(t){var e=$("<form/>",{attr:{method:"post",action:"","accept-charset":"UTF-8"}});if("string"==typeof t)for(var i,s=t.split("&"),a=0;a<s.length;a++)i=s[a].split("=",2),$("<input/>",{type:"hidden",name:decodeURIComponent(i[0]),value:decodeURIComponent(i[1]||"")}).appendTo(e);return e},compare:function(t,e,i){if(n(t)!==n(e))return!1;if("object"===n(t)){if(t.length!==e.length)return!1;if(t instanceof Array!=e instanceof Array)return!1;if(!(t instanceof Array))if(void 0===i||!0===i){if(!Craft.compare(Craft.getObjectKeys(t).sort(),Craft.getObjectKeys(e).sort()))return!1}else if(!Craft.compare(Craft.getObjectKeys(t),Craft.getObjectKeys(e)))return!1;for(var s in t)if(t.hasOwnProperty(s)&&!Craft.compare(t[s],e[s]))return!1;return!0}return t===e},getObjectKeys:function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(i);return e},escapeChars:function(t){Garnish.isArray(t)||(t=t.split());for(var e="",i=0;i<t.length;i++)e+="\\"+t[i];return e},ltrim:function(t,e){if(!t)return t;void 0===e&&(e=" \t\n\r\0\v");var i=new RegExp("^["+Craft.escapeChars(e)+"]+");return t.replace(i,"")},rtrim:function(t,e){if(!t)return t;void 0===e&&(e=" \t\n\r\0\v");var i=new RegExp("["+Craft.escapeChars(e)+"]+$");return t.replace(i,"")},trim:function(t,e){return t=Craft.ltrim(t,e),Craft.rtrim(t,e)},startsWith:function(t,e){return t.substring(0,e.length)===e},filterArray:function(t,e){for(var i=[],s=0;s<t.length;s++)("function"==typeof e?e(t[s],s):t[s])&&i.push(t[s]);return i},inArray:function(t,e){return $.isPlainObject(e)&&(e=Object.values(e)),e.includes(t)},removeFromArray:function(t,e){var i=$.inArray(t,e);return-1!==i&&(e.splice(i,1),!0)},getLast:function(t){return t.length?t[t.length-1]:null},uppercaseFirst:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},lowercaseFirst:function(t){return t.charAt(0).toLowerCase()+t.slice(1)},parseUrl:function(t){var e=t.match(/^(?:(https?):\/\/|\/\/)([^\/\:]*)(?:\:(\d+))?(\/[^\?]*)?(?:\?([^#]*))?(#.*)?/);return e?{scheme:e[1],host:e[2]+(e[3]?":"+e[3]:""),hostname:e[2],port:e[3]||null,path:e[4]||"/",query:e[5]||null,hash:e[6]||null}:{}},getQueryParams:function(){return Object.fromEntries(new URLSearchParams(window.location.search).entries())},getQueryParam:function(t){return new Proxy(new URLSearchParams(window.location.search),{get:function(t,e){return t.get(e)}})[t]},isSameHost:function(t){var e=this.parseUrl(document.location.href);if(!e)return!1;var i=this.parseUrl(t);return!!i&&e.host===i.host},secondsToHumanTimeDuration:function(t,e){void 0===e&&(e=!0);var i=604800,s=Math.floor(t/i);t%=i;var a=Math.floor(t/86400);t%=86400;var n,r=Math.floor(t/3600);t%=3600,e?(n=Math.floor(t/60),t%=60):(n=Math.round(t/60),t=0);var o=[];return s&&o.push(s+" "+(1===s?Craft.t("app","week"):Craft.t("app","weeks"))),a&&o.push(a+" "+(1===a?Craft.t("app","day"):Craft.t("app","days"))),r&&o.push(r+" "+(1===r?Craft.t("app","hour"):Craft.t("app","hours"))),!n&&(e||s||a||r)||o.push(n+" "+(1===n?Craft.t("app","minute"):Craft.t("app","minutes"))),!t&&(!e||s||a||r||n)||o.push(t+" "+(1===t?Craft.t("app","second"):Craft.t("app","seconds"))),o.join(", ")},asciiString:function(t,e){t=t.normalize("NFC");for(var i,s="",a=0;a<t.length;a++)i=t.charAt(a),s+="string"==typeof(e||Craft.asciiCharMap)[i]?(e||Craft.asciiCharMap)[i]:i;return s},uuid:function(){return"function"==typeof crypto.randomUUID?crypto.randomUUID():([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(function(t){return(t^crypto.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)}))},namespaceInputName:function(t,e){return e?t.replace(/([^'"\[\]]+)([^'"]*)/,"".concat(e,"[$1]$2")):t},namespaceId:function(t,e){return Craft.formatInputId(e?"".concat(e,"-").concat(t):t)},randomString:function(t){for(var e="",i=0;i<t;i++)e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(62*Math.random()));return e},createErrorList:function(t){for(var e=$(document.createElement("ul")).addClass("errors"),i=0;i<t.length;i++){var s=$(document.createElement("li"));s.appendTo(e),s.html(t[i])}return e},appendHeadHtml:function(t){if(t){var e=$("link[href]");if(e.length){for(var i,s=[],a=0;a<e.length;a++)i=e.eq(a).attr("href").replace(/&/g,"&amp;"),s.push(Craft.escapeRegex(i));var n=new RegExp('<link\\s[^>]*href="(?:'+s.join("|")+')".*?></link>',"g");t=t.replace(n,"")}$("head").append(t)}},appendBodyHtml:function(t){if(t){var e=$("script[src]");if(e.length){for(var i,s=[],a=0;a<e.length;a++)i=e.eq(a).attr("src").replace(/&/g,"&amp;"),s.push(Craft.escapeRegex(i));var n=new RegExp('<script\\s[^>]*src="(?:'+s.join("|")+')".*?><\/script>',"g");t=t.replace(n,"")}Garnish.$bod.append(t)}},appendFootHtml:function(t){console.warn("Craft.appendFootHtml() is deprecated. Craft.appendBodyHtml() should be used instead."),this.appendBodyHtml(t)},initUiElements:function(t){$(".grid",t).grid(),$(".info",t).infoicon(),$(".checkbox-select",t).checkboxselect(),$(".fieldtoggle",t).fieldtoggle(),$(".lightswitch",t).lightswitch(),$(".nicetext",t).nicetext(),$(".formsubmit",t).formsubmit(),$(".menubtn:not([data-disclosure-trigger])",t).menubtn(),$("[data-disclosure-trigger]",t).disclosureMenu(),$(".datetimewrapper",t).datetime(),$('.datewrapper > input[type="date"], .timewrapper > input[type="time"]',t).datetimeinput(),$("a",t).each((function(){this.hostname.length&&this.hostname!==location.hostname&&void 0===$(this).attr("target")&&$(this).attr("rel","noopener").attr("target","_blank")}))},_elementIndexClasses:{},_elementSelectorModalClasses:{},_elementEditorClasses:{},registerElementIndexClass:function(t,e){if(void 0!==this._elementIndexClasses[t])throw"An element index class has already been registered for the element type “"+t+"”.";this._elementIndexClasses[t]=e},registerElementSelectorModalClass:function(t,e){if(void 0!==this._elementSelectorModalClasses[t])throw"An element selector modal class has already been registered for the element type “"+t+"”.";this._elementSelectorModalClasses[t]=e},registerElementEditorClass:function(t,e){if(void 0!==this._elementEditorClasses[t])throw"An element editor class has already been registered for the element type “"+t+"”.";this._elementEditorClasses[t]=e},createElementIndex:function(t,e,i){return new(void 0!==this._elementIndexClasses[t]?this._elementIndexClasses[t]:Craft.BaseElementIndex)(t,e,i)},createElementSelectorModal:function(t,e){return new(void 0!==this._elementSelectorModalClasses[t]?this._elementSelectorModalClasses[t]:Craft.BaseElementSelectorModal)(t,e)},createElementEditor:function(t,e,i){return void 0===i&&$.isPlainObject(e)?(i=e,e=null):"object"!==n(i)&&(i={}),i.elementType||(i.elementType=t),new Craft.ElementEditorSlideout(e,i)},getLocalStorage:function(t,e){return t="Craft-"+Craft.systemUid+"."+t,"undefined"!=typeof localStorage&&void 0!==localStorage[t]?JSON.parse(localStorage[t]):e},setLocalStorage:function(t,e){if("undefined"!=typeof localStorage){t="Craft-"+Craft.systemUid+"."+t;try{localStorage[t]=JSON.stringify(e)}catch(t){}}},removeLocalStorage:function(t){"undefined"!=typeof localStorage&&localStorage.removeItem("Craft-".concat(Craft.systemUid,".").concat(t))},getCookie:function(t){return document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)Craft-".concat(Craft.systemUid,":").concat(t,"\\s*\\=\\s*([^;]*).*$)|^.*$")),"$1")},setCookie:function(t,e,i){i=$.extend({},this.defaultCookieOptions,i);var s="Craft-".concat(Craft.systemUid,":").concat(t,"=").concat(encodeURIComponent(e));i.path&&(s+=";path=".concat(i.path)),i.domain&&(s+=";domain=".concat(i.domain)),i.maxAge?s+=";max-age-in-seconds=".concat(i.maxAge):i.expires&&(s+=";expires=".concat(i.expires.toUTCString())),i.secure&&(s+=";secure"),document.cookie=s},removeCookie:function(t){this.setCookie(t,"",new Date("1970-01-01T00:00:00"))},getElementInfo:function(t){var e=$(t);return e.hasClass("element")||(e=e.find(".element:first")),{id:e.data("id"),siteId:e.data("site-id"),label:e.data("label"),status:e.data("status"),url:e.data("url"),hasThumb:e.hasClass("hasthumb"),$element:e}},setElementSize:function(t,e){var i=$(t);if("small"!==e&&"large"!==e&&(e="small"),!i.hasClass(e)){var s="small"===e?"large":"small";if(i.addClass(e).removeClass(s),i.hasClass("hasthumb")){var a=i.find("> .elementthumb > img"),n=$("<img/>",{sizes:("small"===e?"30":"100")+"px",srcset:a.attr("srcset")||a.attr("data-pfsrcset")});a.replaceWith(n),picturefill({elements:[n[0]]})}}},submitForm:function(t,e){if(void 0===e&&(e={}),!e.confirm||confirm(e.confirm)){if(e.action&&$("<input/>",{type:"hidden",name:"action",val:e.action}).appendTo(t),e.redirect&&$("<input/>",{type:"hidden",name:"redirect",val:e.redirect}).appendTo(t),e.params)for(var i in e.params){var s=e.params[i];$("<input/>",{type:"hidden",name:i,val:s}).appendTo(t)}e.retainScroll&&this.setLocalStorage("scrollY",window.scrollY),t.trigger($.extend({type:"submit"},e.data))}},trapFocusWithin:function(t){Garnish.trapFocusWithin(t)},setFocusWithin:function(t){Garnish.setFocusWithin(t)},filterInputVal:function(t,e){for(var i=$(t),s=i.val(),a=i[0].selectionStart,n="",r=0;r<s.length;r++)s[r].match(e)?n+=s[r]:r<a&&a--;n!==s&&(i.val(n),i[0].setSelectionRange(a,a))},filterNumberInputVal:function(t){this.filterInputVal(t,/[0-9.,\-]/)},setElementAttributes:function(e,i){var s=$(e);for(var a in i)if(i.hasOwnProperty(a)){var n=i[a];if(null===n||!1===n)s.removeAttr(a);else if(!0===n)s.attr(a,"");else if($.isArray(n)||$.isPlainObject(n))if(Craft.dataAttributes.includes(a)){for(var r in n=Object.assign({},n))if(n.hasOwnProperty(r)){var o=n[r];null!==o&&!1!==o&&(o=$.isPlainObject(o)||$.isArray(o)?JSON.stringify(o):!0===o?"":this.escapeHtml(o),s.attr("".concat(a,"-").concat(r),o))}}else if("class"===a){$.isPlainObject(n)&&(n=Object.values(n));var l,h=t(n);try{for(h.s();!(l=h.n()).done;){var d=l.value;s.addClass(d)}}catch(t){h.e(t)}finally{h.f()}}else"style"===a?s.css(n):s.attr(a,JSON.stringify(n));else s.attr(a,this.escapeHtml(n))}},isVisible:function(){return void 0===document.visibilityState||"visible"===document.visibilityState},useMobileStyles:function(){return Garnish.isMobileBrowser()||document.body.clientWidth<600}}),Craft.pageId=Craft.uuid(),"undefined"!=typeof BroadcastChannel){var o="CraftCMS:".concat(Craft.appId);Craft.broadcaster=new BroadcastChannel(o),Craft.messageReceiver=new BroadcastChannel(o),Craft.messageReceiver.addEventListener("message",(function(e){if("saveElement"===e.data.event){var i=$('div.element[data-id="'.concat(e.data.id,'"][data-settings]'));if(!i.length)return;for(var s={type:i.data("type"),id:e.data.id,instances:[]},a=0;a<i.length;a++){var n=i.eq(a);s.instances.push(Object.assign({siteId:n.data("site-id")},n.data("settings")))}Craft.sendActionRequest("POST","app/render-element",{data:s}).then((function(e){for(var s=e.data,a=0;a<i.length;a++){var n=i.eq(a);if(s.elementHtml[a]){var r,o=$(s.elementHtml[a]),l=t(o[0].attributes);try{for(l.s();!(r=l.n()).done;){var h=r.value;"class"===h.name?n.addClass(h.value):n.attr(h.name,h.value)}}catch(t){l.e(t)}finally{l.f()}var d=n.find("input,button").detach();n.html(o.html()),d.length&&d.prependTo(n)}}(new Craft.ElementThumbLoader).load(i)}))}}))}$.extend($.fn,{animateLeft:function(t,e,i,s){return"ltr"===Craft.orientation?this.velocity({left:t},e,i,s):this.velocity({right:t},e,i,s)},animateRight:function(t,e,i,s){return"ltr"===Craft.orientation?this.velocity({right:t},e,i,s):this.velocity({left:t},e,i,s)},disable:function(){return this.each((function(){var t=$(this);t.addClass("disabled"),t.data("activatable")&&t.removeAttr("tabindex")}))},enable:function(){return this.each((function(){var t=$(this);t.removeClass("disabled"),t.data("activatable")&&t.attr("tabindex","0")}))},grid:function(){return this.each((function(){var t=$(this),e={};t.data("item-selector")&&(e.itemSelector=t.data("item-selector")),t.data("cols")&&(e.cols=parseInt(t.data("cols"))),t.data("max-cols")&&(e.maxCols=parseInt(t.data("max-cols"))),t.data("min-col-width")&&(e.minColWidth=parseInt(t.data("min-col-width"))),t.data("mode")&&(e.mode=t.data("mode")),t.data("fill-mode")&&(e.fillMode=t.data("fill-mode")),t.data("col-class")&&(e.colClass=t.data("col-class")),t.data("snap-to-grid")&&(e.snapToGrid=!!t.data("snap-to-grid")),new Craft.Grid(this,e)}))},infoicon:function(){return this.each((function(){new Craft.InfoIcon(this)}))},checkboxselect:function(){return this.each((function(){$.data(this,"checkboxselect")||new Garnish.CheckboxSelect(this)}))},fieldtoggle:function(){return this.each((function(){$.data(this,"fieldtoggle")||new Craft.FieldToggle(this)}))},lightswitch:function(t,e,i){return"settings"===t?("string"==typeof e?(t={})[e]=i:t=e,this.each((function(){var e=$.data(this,"lightswitch");e&&e.setSettings(t)}))):($.isPlainObject(t)||(t={}),this.each((function(){var e=$.extend({},t);Garnish.hasAttr(this,"data-value")&&(e.value=$(this).attr("data-value")),Garnish.hasAttr(this,"data-indeterminate-value")&&(e.indeterminateValue=$(this).attr("data-indeterminate-value")),$.data(this,"lightswitch")||new Craft.LightSwitch(this,e)})))},nicetext:function(){return this.each((function(){$.data(this,"nicetext")||new Garnish.NiceText(this)}))},formsubmit:function(){return this.on("click",(function(t){var e=$(t.currentTarget),i=e.data("params")||{};e.data("param")&&(i[e.data("param")]=e.data("value"));var s=e.data("menu")?e.data("menu").$anchor:e,a=s.attr("data-form")?$("#"+s.attr("data-form")):s.closest("form");Craft.submitForm(a,{confirm:e.data("confirm"),action:e.data("action"),redirect:e.data("redirect"),params:i,data:$.extend({customTrigger:e},e.data("event-data"))})}))},menubtn:function(){return this.each((function(){var t=$(this);if(!t.data("menubtn")&&t.next().hasClass("menu")){var e={};t.data("menu-anchor")&&(e.menuAnchor=t.data("menu-anchor")),new Garnish.MenuBtn(t,e)}}))},disclosureMenu:function(){return this.each((function(){var t=$(this);!t.data("trigger")&&t.attr("aria-controls")&&new Garnish.DisclosureMenu(t)}))},datetime:function(){return this.each((function(){var t=$(this),e=t.find('input:not([name$="[timezone]"])'),i=function(){for(var i=!1,s=0;s<e.length;s++)if(e.eq(s).val()){i=!0;break}if(i){if(!t.children(".clear-btn").length)var a=$("<button/>",{type:"button",class:"clear-btn",title:Craft.t("app","Clear"),"aria-label":Craft.t("app","Clear")}).appendTo(t).on("click",(function(){for(var t=0;t<e.length;t++)e.eq(t).val("").trigger("input").trigger("change");a.remove(),e.first().filter('[type="text"]').focus()}))}else t.children(".clear-btn").remove()};e.on("change",i),i()}))},datetimeinput:function(){return this.each((function(){var t=$(this),e=function(){""===t.val()?t.addClass("empty-value"):t.removeClass("empty-value")};t.on("input",e),e()}))}}),Garnish.NiceText.charsLeftHtml=function(t){return Craft.t("app",'<span class="visually-hidden">Characters left:</span> {chars, number}',{chars:t})},Garnish.$doc.ready((function(){Craft.initUiElements()}))},691:function(){function t(t){return function(t){if(Array.isArray(t))return s(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||i(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(t,e)||i(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(t,e){if(t){if("string"==typeof t)return s(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?s(t,e):void 0}}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.CustomizeSourcesModal=Garnish.Modal.extend({elementIndex:null,$elementIndexSourcesContainer:null,$sidebar:null,$sidebarToggleBtn:null,$sourcesContainer:null,$sourcesHeader:null,$sourcesHeading:null,$sourceSettingsContainer:null,$sourceSettingsHeader:null,$addSourceMenu:null,addSourceMenu:null,$footer:null,$footerBtnContainer:null,$saveBtn:null,$cancelBtn:null,$loadingSpinner:null,sourceSort:null,sources:null,selectedSource:null,elementTypeName:null,baseSortOptions:null,availableTableAttributes:null,customFieldAttributes:null,conditionBuilderHtml:null,conditionBuilderJs:null,userGroups:null,init:function(t,e){var i=this;this.base(),this.setSettings(e,{resizable:!0}),this.elementIndex=t,this.$elementIndexSourcesContainer=this.elementIndex.$sidebar.children("nav").children("ul");var s=$('<form class="modal customize-sources-modal"/>').appendTo(Garnish.$bod);this.$sidebar=$('<div class="cs-sidebar block-types"/>').appendTo(s).attr({role:"navigation","aria-label":Craft.t("app","Source")}),this.$sourcesContainer=$('<div class="sources">').appendTo(this.$sidebar),this.$sourceSettingsContainer=$('<div class="source-settings">').appendTo(s),this.$footer=$('<div class="footer"/>').appendTo(s),this.$footerBtnContainer=$('<div class="buttons right"/>').appendTo(this.$footer),this.$cancelBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(this.$footerBtnContainer),this.$saveBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Save"),spinner:!0}).appendTo(this.$footerBtnContainer),this.$loadingSpinner=$('<div class="spinner"/>').appendTo(this.$sourceSettingsContainer),this.setContainer(s),this.show(),Craft.sendActionRequest("POST","element-index-settings/get-customize-sources-modal-data",{data:{elementType:this.elementIndex.elementType}}).then((function(t){i.$saveBtn.removeClass("disabled"),i.buildModal(t.data)})).finally((function(){i.$loadingSpinner.remove(),Garnish.setFocusWithin(i.$sidebar)})),this.addListener(this.$cancelBtn,"click","hide"),this.addListener(this.$saveBtn,"click","save"),this.addListener(this.$container,"submit","save")},buildModal:function(t){var e=this;this.baseSortOptions=t.baseSortOptions,this.defaultSortOptions=t.defaultSortOptions,this.availableTableAttributes=t.availableTableAttributes,this.customFieldAttributes=t.customFieldAttributes,this.elementTypeName=t.elementTypeName,this.conditionBuilderHtml=t.conditionBuilderHtml,this.conditionBuilderJs=t.conditionBuilderJs,this.userGroups=t.userGroups,t.headHtml&&Craft.appendHeadHtml(t.headHtml),t.bodyHtml&&Craft.appendBodyHtml(t.bodyHtml),this.sourceSort=new Garnish.DragSort({handle:".move",axis:"y"}),this.sources=[];for(var i=0;i<t.sources.length;i++)this.sources.push(this.addSource(t.sources[i]));this.selectedSource||void 0===this.sources[0]||this.sources[0].select();var s=$('<div class="buttons left" data-wrapper/>').appendTo(this.$footer),a=$("<button/>",{type:"button",class:"btn menubtn add icon","aria-label":Craft.t("app","Add…"),"aria-controls":"add-source-menu",title:Craft.t("app","Add…"),"data-disclosure-trigger":""}).appendTo(s);this.$addSourceMenu=$("<div/>",{id:"add-source-menu",class:"menu menu--disclosure"}).appendTo(s);var n=function(t){var i=e.addSource(t,!0);Garnish.scrollContainerToElement(e.$sidebar,i.$item),i.select(),e.addSourceMenu.hide()},r=$("<button/>",{type:"button",class:"menu-option",text:Craft.t("app","New heading")}).on("click",(function(){n({type:"heading"}),e.focusLabelInput()})),o=$("<button/>",{type:"button",class:"menu-option",text:Craft.t("app","New custom source"),"data-type":"custom"}).on("click",(function(){var t=e.baseSortOptions.slice(0);t.push(e.defaultSortOptions),n({type:"custom",key:"custom:".concat(Craft.uuid()),sortOptions:t,defaultSort:[t[0].attr,t[1].defaultDir],tableAttributes:[],availableTableAttributes:[]}),e.focusLabelInput()})),l=$("<ul/>").append($("<li/>").append(r)).appendTo(this.$addSourceMenu);t.conditionBuilderHtml&&$("<li/>").append(o).appendTo(l),Craft.useMobileStyles()&&this.buildSidebarToggleView(),this.addListener(Garnish.$win,"resize",this.updateSidebarView),this.addSourceMenu=new Garnish.DisclosureMenu(a)},focusLabelInput:function(){this.selectedSource.$labelInput.trigger("focus")},getSourceName:function(){return this.selectedSource?this.selectedSource.sourceData.label:this.sources[0].sourceData.label},updateSidebarView:function(){Craft.useMobileStyles()?this.$sidebarToggleBtn||this.buildSidebarToggleView():this.$sidebarToggleBtn&&this.resetView()},resetView:function(){this.$sourceSettingsHeader&&this.$sourceSettingsHeader.remove(),this.$sourcesHeader&&this.$sourcesHeader.remove(),this.$sidebarToggleBtn=null,this.$container.removeClass("sidebar-hidden")},updateHeading:function(){this.$sourcesHeading&&this.$sourcesHeading.text(this.getSourceName())},buildSidebarToggleView:function(){var t=this;this.$sourcesHeader=$('<div class="sources-header"/>').addClass("sidebar-header").prependTo(this.$sourcesContainer),this.$sidebarCloseBtn=Craft.ui.createButton({class:"nav-close close-btn"}).attr("aria-label",Craft.t("app","Close")).removeClass("btn").appendTo(this.$sourcesHeader),this.$sourcesHeading=$('<h1 class="main-heading"/>').text(this.getSourceName()),this.$sourceSettingsHeader=$('<div class="source-settings-header"/>').addClass("main-header").append(this.$sourcesHeading).prependTo(this.$sourceSettingsContainer),this.$sidebarToggleBtn=Craft.ui.createButton({toggle:!0,controls:"modal-sidebar",class:"nav-toggle"}).removeClass("btn").attr("aria-label",Craft.t("app","Show sidebar")).appendTo(this.$sourceSettingsHeader),this.closeSidebar(),this.addListener(this.$sidebarToggleBtn,"click",(function(){t.toggleSidebar()})),this.addListener(this.$sidebarCloseBtn,"click",(function(){t.toggleSidebar(),t.$sidebarToggleBtn.trigger("focus")}))},toggleSidebar:function(){this.sidebarIsOpen()?this.closeSidebar():this.openSidebar()},openSidebar:function(){var t=this;this.$container.removeClass("sidebar-hidden"),this.$sidebarToggleBtn.attr("aria-expanded","true"),this.$sidebar.find(":focusable").first().focus(),Garnish.uiLayerManager.addLayer(this.$sidebar),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.closeSidebar(),Garnish.focusIsInside(t.$sidebar)&&t.$sidebarToggleBtn.focus()}))},closeSidebar:function(){this.$container.addClass("sidebar-hidden"),this.$sidebarToggleBtn&&this.$sidebarToggleBtn.attr("aria-expanded","false"),Garnish.uiLayerManager.currentLayer.$container.hasClass("cs-sidebar")&&Garnish.uiLayerManager.removeLayer()},sidebarIsOpen:function(){return"true"===this.$sidebarToggleBtn.attr("aria-expanded")},addSource:function(t,e){var i,s=$('<div class="customize-sources-item"/>').appendTo(this.$sourcesContainer),a=$('<div class="label customize-sources-item__btn"/>').attr({tabindex:"0",role:"button"}).appendTo(s),n=$('<input type="hidden"/>').appendTo(s);return $('<a class="move icon customize-sources-item__move" title="'.concat(Craft.t("app","Reorder"),'" role="button"></a>')).appendTo(s),"heading"===t.type?(s.addClass("heading"),n.attr("name","sourceOrder[][heading]"),(i=new Craft.CustomizeSourcesModal.Heading(this,s,a,n,t,e)).updateItemLabel(t.heading)):(n.attr("name","sourceOrder[][key]").val(t.key),(i="native"===t.type?new Craft.CustomizeSourcesModal.Source(this,s,a,n,t,e):new Craft.CustomizeSourcesModal.CustomSource(this,s,a,n,t,e)).updateItemLabel(t.label),t.key===this.elementIndex.rootSourceKey&&i.select()),this.sourceSort.addItems(s),i},save:function(t){var e=this;t&&t.preventDefault(),this.$saveBtn.hasClass("disabled")||this.$saveBtn.hasClass("loading")||(this.$saveBtn.addClass("loading"),Craft.sendActionRequest("POST","element-index-settings/save-customize-sources-modal-settings",{data:this.$container.serialize()+"&elementType=".concat(this.elementIndex.elementType)}).then((function(t){var i=t.data,s=null;e.selectedSource&&e.selectedSource.sourceData.key&&!i.disabledSourceKeys.includes(e.selectedSource.sourceData.key)?s=e.selectedSource.sourceData.key:e.elementIndex.sourceKey||(s=e.elementIndex.$visibleSources.first().data("key")),s&&e.elementIndex.selectSourceByKey(s),window.location.reload()})).catch((function(){Craft.cp.displayError(Craft.t("app","A server error occurred."))})).finally((function(){e.$saveBtn.removeClass("loading")})))},appendIndexSourceItem:function(t,e){if(e){var i=t.hasClass("heading");if(e.hasClass("heading")&&!i)t.appendTo(e.children("ul"));else{if(i){var s=e.parentsUntil(this.$elementIndexSourcesContainer,"li").last();s.length&&(e=s)}t.insertAfter(e)}}else t.prependTo(this.$elementIndexSourcesContainer)},destroy:function(){for(var t=0;t<this.sources.length;t++)this.sources[t].destroy();this.addSourceMenu&&(this.addSourceMenu.destroy(),this.$addSourceMenu.remove()),delete this.sources,this.base()}}),Craft.CustomizeSourcesModal.BaseSource=Garnish.Base.extend({modal:null,$item:null,$itemLabel:null,$itemInput:null,$settingsContainer:null,sourceData:null,isNew:null,init:function(t,e,i,s,a,n){var r=this;this.modal=t,this.$item=e,this.$itemLabel=i,this.$itemInput=s,this.sourceData=a,this.isNew=n,this.$item.data("source",this),this.addListener(this.$itemLabel,"click","select"),this.addListener(this.$itemLabel,"keypress",(function(t){return Garnish.handleActivatingKeypress(t,r.select.bind(r))}))},isHeading:function(){return!1},isNative:function(){return!1},isSelected:function(){return this.modal.selectedSource===this},select:function(){this.isSelected()||(this.modal.selectedSource&&this.modal.selectedSource.deselect(),this.$item.addClass("sel"),this.$itemLabel.attr({"aria-current":"true"}),this.modal.selectedSource=this,this.modal.updateHeading(),this.$settingsContainer?this.$settingsContainer.removeClass("hidden"):(this.$settingsContainer=$("<div/>").appendTo(this.modal.$sourceSettingsContainer),this.createSettings(this.$settingsContainer)),this.modal.$sourceSettingsContainer.scrollTop(0))},createSettings:function(){},getIndexSourceItem:function(){},deselect:function(){this.$item.removeClass("sel"),this.$itemLabel.attr({"aria-current":"false"}),this.modal.selectedSource=null,this.$settingsContainer.addClass("hidden")},updateItemLabel:function(t){t?this.$itemLabel.text(t):this.$itemLabel.html("&nbsp;")},destroy:function(){this.modal.sourceSort.removeItems(this.$item),this.modal.sources.splice($.inArray(this,this.modal.sources),1),this.isSelected()&&(this.deselect(),this.modal.sources.length&&this.modal.sources[0].select(),Garnish.setFocusWithin(this.modal.$sourceSettingsContainer)),this.$item.data("source",null),this.$item.remove(),this.$settingsContainer&&this.$settingsContainer.remove(),this.base()}}),Craft.CustomizeSourcesModal.Source=Craft.CustomizeSourcesModal.BaseSource.extend({$sortAttributeSelect:null,$sortDirectionPicker:null,$sortDirectionInput:null,sortDirectionListbox:null,isNative:function(){return!0},createSettings:function(t){Craft.ui.createLightswitchField({label:Craft.t("app","Enabled"),name:"sources[".concat(this.sourceData.key,"][enabled]"),on:!this.sourceData.disabled}).appendTo(t),this.createSortField(t),this.createTableAttributesField(t)},createSortField:function(t){var e=this,i=$('<div class="flex"/>'),s=Craft.ui.createSelect({name:"sources[".concat(this.sourceData.key,"][defaultSort][0]"),options:this.sourceData.sortOptions.map((function(t){return{label:t.label,value:t.attr}})),value:this.sourceData.defaultSort[0]}).addClass("fullwidth").appendTo($("<div/>").appendTo(i));this.$sortAttributeSelect=s.children("select").attr("aria-label",Craft.t("app","Sort attribute")),this.$sortDirectionPicker=$("<section/>",{class:"btngroup btngroup--exclusive","aria-label":Craft.t("app","Sort direction")}).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort ascending"),"aria-label":Craft.t("app","Sort ascending"),"aria-pressed":"false","data-icon":"asc","data-dir":"asc"})).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort descending"),"aria-label":Craft.t("app","Sort descending"),"aria-pressed":"false","data-icon":"desc","data-dir":"desc"})).appendTo(i),this.$sortDirectionInput=$("<input/>",{type:"hidden",name:"sources[".concat(this.sourceData.key,"][defaultSort][1]")}).appendTo(i),this.sortDirectionListbox=new Craft.Listbox(this.$sortDirectionPicker,{onChange:function(t){e.$sortDirectionInput.val(t.data("dir"))}}),this.$sortAttributeSelect.on("change",(function(){e.handleSortAttributeChange()})),this.handleSortAttributeChange(!0),Craft.ui.createField(i,{label:Craft.t("app","Default Sort"),fieldset:!0}).appendTo(t).addClass("sort-field")},handleSortAttributeChange:function(t){var e=this.$sortAttributeSelect.val();if("structure"===e)this.sortDirectionListbox.select(0),this.sortDirectionListbox.disable(),this.$sortDirectionPicker.addClass("disabled");else{this.sortDirectionListbox.enable(),this.$sortDirectionPicker.removeClass("disabled");var i=t?this.sourceData.defaultSort[1]:this.sourceData.sortOptions.find((function(t){return t.attr===e})).defaultDir;this.sortDirectionListbox.select("asc"===i?0:1)}},createTableAttributesField:function(t){var i=this.availableTableAttributes();if(this.sourceData.tableAttributes.length||i.length){var s=$("<div/>"),a=[];$('<input type="hidden" name="sources['.concat(this.sourceData.key,'][tableAttributes][]" value=""/>')).appendTo(s);for(var n=0;n<this.sourceData.tableAttributes.length;n++){var r=e(this.sourceData.tableAttributes[n],2),o=r[0],l=r[1];s.append(this.createTableColumnOption(o,l,!0)),a.push(o)}for(var h=0;h<i.length;h++){var d=e(i[h],2),c=d[0],u=d[1];Craft.inArray(c,a)||s.append(this.createTableColumnOption(c,u,!1))}new Garnish.DragSort(s.children(),{handle:".move",axis:"y"}),Craft.ui.createField(s,{label:Craft.t("app","Default Table Columns"),instructions:Craft.t("app","Choose which table columns should be visible for this source by default.")}).appendTo(t)}},availableTableAttributes:function(){var e=this.modal.availableTableAttributes.slice(0);return e.push.apply(e,t(this.sourceData.availableTableAttributes)),e},createTableColumnOption:function(t,e,i){return $('<div class="customize-sources-table-column"/>').append('<div class="icon move"/>').append(Craft.ui.createCheckbox({label:Craft.escapeHtml(e),name:"sources[".concat(this.sourceData.key,"][tableAttributes][]"),value:t,checked:i}))},getIndexSourceItem:function(){var t=this.modal.elementIndex.getSourceByKey(this.sourceData.key);if(t)return t.closest("li")}}),Craft.CustomizeSourcesModal.CustomSource=Craft.CustomizeSourcesModal.Source.extend({$labelInput:null,createSettings:function(t){var e=this,i=Craft.ui.createTextField({label:Craft.t("app","Label"),name:"sources[".concat(this.sourceData.key,"][label]"),value:this.sourceData.label}).appendTo(t);this.$labelInput=i.find(".text");var s="condition".concat(Math.floor(1e6*Math.random())),a=function(t){return t.replace(/__ID__/g,s).replace(/__SOURCE_KEY__(?=-)/g,Craft.formatInputId(e.sourceData.key)).replace(/__SOURCE_KEY__/g,e.sourceData.key)},n=this.sourceData.conditionBuilderHtml||a(this.modal.conditionBuilderHtml),r=this.sourceData.conditionBuilderJs||a(this.modal.conditionBuilderJs);Craft.ui.createField($("<div/>").append(n),{id:"criteria",label:Craft.t("app","{type} Criteria",{type:this.modal.elementTypeName})}).appendTo(t),Craft.appendBodyHtml(r),this.createSortField(t),this.createTableAttributesField(t),this.modal.userGroups.length&&Craft.ui.createCheckboxSelectField({label:Craft.t("app","User Groups"),instructions:Craft.t("app","Choose which user groups should have access to this source."),name:"sources[".concat(this.sourceData.key,"][userGroups]"),options:this.modal.userGroups,values:this.sourceData.userGroups||"*",showAllOption:!0}).appendTo(t),t.append("<hr/>"),this.$deleteBtn=$('<a class="error delete"/>').attr({role:"button",tabindex:"0"}).text(Craft.t("app","Delete custom source")).appendTo(t),this.addListener(this.$labelInput,"input","handleLabelInputChange"),this.addListener(this.$deleteBtn,"click","destroy"),this.addListener(this.$deleteBtn,"keypress",(function(t){Garnish.handleActivatingKeypress(t,e.destroy.bind(e))}))},availableTableAttributes:function(){var e=this.base();return this.isNew&&e.push.apply(e,t(this.modal.customFieldAttributes)),e},handleLabelInputChange:function(){this.updateItemLabel(this.$labelInput.val())},getIndexSourceItem:function(){var t,e=this.base();if(e?t=e.find(".label"):(t=$("<span/>",{class:"label"}),e=$("<li/>").append($("<a/>",{"data-key":this.sourceData.key}).append(t))),this.$labelInput){var i=Craft.trim(this.$labelInput.val());""===i&&(i=Craft.t("app","(blank)")),t.text(i)}return e}}),Craft.CustomizeSourcesModal.Heading=Craft.CustomizeSourcesModal.BaseSource.extend({$labelInput:null,$deleteBtn:null,isHeading:function(){return!0},createSettings:function(t){var e=this,i=Craft.ui.createTextField({label:Craft.t("app","Heading"),instructions:Craft.t("app","This can be left blank if you just want an unlabeled separator."),value:this.sourceData.heading||""}).appendTo(t);this.$labelInput=i.find(".text"),t.append("<hr/>"),this.$deleteBtn=$('<a class="error delete"/>').text(Craft.t("app","Delete heading")).attr({role:"button",tabindex:"0"}).appendTo(t),this.addListener(this.$labelInput,"input","handleLabelInputChange"),this.addListener(this.$deleteBtn,"click","destroy"),this.addListener(this.$deleteBtn,"keypress",(function(t){Garnish.handleActivatingKeypress(t,e.destroy.bind(e))}))},handleLabelInputChange:function(){this.updateItemLabel(this.$labelInput.val())},updateItemLabel:function(t){this.$itemLabel.html((t?Craft.escapeHtml(t):"<em>".concat(Craft.t("app","(blank)"),"</em>"))+"&nbsp;"),this.$itemInput.val(t)},getIndexSourceItem:function(){var t=(this.$labelInput?this.$labelInput.val():null)||this.sourceData.heading||"";return $('<li class="heading"/>').append($("<span/>").text(t)).append("<ul/>")}})},1519:function(){Craft.DataTableSorter=Garnish.DragSort.extend({$table:null,init:function(t,e){this.$table=$(t);var i=this.$table.children("tbody").children(":not(.filler)");(e=$.extend({},Craft.DataTableSorter.defaults,e)).container=this.$table.children("tbody"),e.helper=this.getHelper.bind(this),e.caboose="<tr/>",e.axis=Garnish.Y_AXIS,e.magnetStrength=4,e.helperLagBase=1.5,this.base(i,e)},getHelper:function(t){var e=$('<div class="'+this.settings.helperClass+'"/>').appendTo(Garnish.$bod),i=$("<table/>").appendTo(e),s=$("<tbody/>").appendTo(i);t.appendTo(s),i.width(this.$table.width()),i.prop("className",this.$table.prop("className"));for(var a=this.$table.find("tr:first").children(),n=t.children(),r=0;r<n.length;r++)$(n[r]).width($(a[r]).width());return e}},{defaults:{handle:".move",helperClass:"datatablesorthelper"}})},501:function(){Craft.DeleteUserModal=Garnish.Modal.extend({id:null,userId:null,$deleteActionRadios:null,$deleteSubmitBtn:null,userSelect:null,_deleting:!1,init:function(t,e){var i=this;this.id=Math.floor(1e9*Math.random()),this.userId=t,e=$.extend(Craft.DeleteUserModal.defaults,e);var s,a=$('<form class="modal fitted deleteusermodal" method="post" accept-charset="UTF-8">'+Craft.getCsrfInput()+'<input type="hidden" name="action" value="users/delete-user"/>'+(Garnish.isArray(this.userId)?"":'<input type="hidden" name="userId" value="'+this.userId+'"/>')+(e.redirect?'<input type="hidden" name="redirect" value="'+e.redirect+'"/>':"")+"</form>").appendTo(Garnish.$bod),n=$('<div class="body"><div class="content-summary"><p>'+Craft.t("app","What do you want to do with their content?")+'</p><ul class="bullets"></ul></div><div class="options"><label><input type="radio" name="contentAction" value="transfer"/> '+Craft.t("app","Transfer it to:")+'</label><div id="transferselect'+this.id+'" class="elementselect"><div class="elements"></div><button type="button" class="btn add icon dashed">'+Craft.t("app","Choose a user")+'</button></div></div><div><label class="error"><input type="radio" name="contentAction" value="delete"/> '+Craft.t("app","Delete their content")+"</label></div></div>").appendTo(a),r=$('<div class="buttons right"/>').appendTo(n),o=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(r);if(e.contentSummary.length)for(var l=0;l<e.contentSummary.length;l++)n.find("ul").append($("<li/>",{text:e.contentSummary[l]}));else n.find("ul").remove();if(this.$deleteActionRadios=n.find("input[type=radio]"),this.$deleteSubmitBtn=Craft.ui.createSubmitButton({class:"disabled",label:this._submitBtnLabel(!1),spinner:!0}).appendTo(r),Garnish.isArray(this.userId)){s=["and"];for(var h=0;h<this.userId.length;h++)s.push("not "+this.userId[h])}else s="not "+this.userId;this.userSelect=new Craft.BaseElementSelectInput({id:"transferselect"+this.id,name:"transferContentTo",elementType:"craft\\elements\\User",criteria:{id:s},limit:1,modalSettings:{closeOtherModals:!1},onSelectElements:function(){i.updateSizeAndPosition(),i.$deleteActionRadios.first().prop("checked")?i.validateDeleteInputs():i.$deleteActionRadios.first().trigger("click")},onRemoveElements:this.validateDeleteInputs.bind(this),selectable:!1,editable:!1}),this.addListener(o,"click","hide"),this.addListener(this.$deleteActionRadios,"change","validateDeleteInputs"),this.addListener(a,"submit","handleSubmit"),this.base(a,e)},_submitBtnLabel:function(t){var e=t?"Delete {num, plural, =1{user} other{users}} and content":"Delete {num, plural, =1{user} other{users}}";return Craft.t("app",e,{num:Garnish.isArray(this.userId)?this.userId.length:1})},validateDeleteInputs:function(){var t=!1;return this.$deleteActionRadios.eq(1).prop("checked")?(t=!0,this.$deleteSubmitBtn.find(".label").text(this._submitBtnLabel(!0))):(this.$deleteSubmitBtn.find(".label").text(this._submitBtnLabel(!1)),this.$deleteActionRadios.eq(0).prop("checked")&&(t=!!this.userSelect.totalSelected)),this.updateSizeAndPosition(),t?this.$deleteSubmitBtn.removeClass("disabled"):this.$deleteSubmitBtn.addClass("disabled"),t},handleSubmit:function(t){if(!this._deleting&&this.validateDeleteInputs()){this.$deleteSubmitBtn.addClass("loading"),this.disable(),this.userSelect.disable(),this._deleting=!0;try{!1===this.settings.onSubmit()&&t.preventDefault()}catch(e){throw t.preventDefault(),this.$deleteSubmitBtn.removeClass("loading"),e}}else t.preventDefault()},onFadeIn:function(){Garnish.isMobileBrowser(!0)||this.$deleteActionRadios.first().trigger("focus"),this.base()}},{defaults:{contentSummary:[],onSubmit:$.noop,redirect:null}})},2318:function(){Craft.DynamicGenerator=Craft.BaseInputGenerator.extend({callback:$.noop,init:function(t,e,i){this.callback=i,this.base(t,e)},generateTargetValue:function(t){return this.callback(t)}})},4755:function(){Craft.EditableTable=Garnish.Base.extend({initialized:!1,id:null,baseName:null,columns:null,sorter:null,biggestId:-1,$table:null,$tbody:null,$addRowBtn:null,$tableParent:null,$statusMessage:null,rowCount:0,hasMaxRows:!1,hasMinRows:!1,radioCheckboxes:null,init:function(t,e,i,s){var a=this;if(this.id=t,this.baseName=e,this.columns=i,this.setSettings(s,Craft.EditableTable.defaults),this.radioCheckboxes={},this.$table=$("#"+t),this.$tbody=this.$table.children("tbody"),this.$tableParent=this.$table.parent(),this.$statusMessage=this.$tableParent.find("[data-status-message]"),this.rowCount=this.$tbody.find("tr").length,this.$table.data("editable-table")&&(console.warn("Double-instantiating an editable table on an element"),this.$table.data("editable-table").destroy()),this.$table.data("editable-table",this),this.sorter=new Craft.DataTableSorter(this.$table,{helperClass:"editabletablesorthelper",copyDraggeeInputValuesToHelper:!0,onSortChange:function(){a.updateAllRows()}}),this.isVisible()?this.initialize():window.setTimeout(this.initializeIfVisible.bind(this),500),this.settings.minRows&&this.rowCount<this.settings.minRows)for(var n=this.rowCount;n<this.settings.minRows;n++)this.addRow()},isVisible:function(){return this.$table.parent().height()>0},initialize:function(){if(this.initialized)return!1;this.initialized=!0,this.removeListener(Garnish.$win,"resize");for(var t=this.$tbody.children(),e=0;e<t.length;e++)this.createRowObj(t[e]);var i=this.$table.parent(".input");return i.length&&this.$table.width()>i.width()&&i.css("overflow-x","auto"),this.$addRowBtn=this.$table.next(".add"),this.updateAddRowButton(),this.addListener(this.$addRowBtn,"activate","addRow"),!0},initializeIfVisible:function(){this.removeListener(Garnish.$win,"resize"),this.isVisible()?this.initialize():this.addListener(Garnish.$win,"resize","initializeIfVisible")},updateAddRowButton:function(){this.canAddRow()?(this.$addRowBtn.css("opacity","1"),this.$addRowBtn.css("pointer-events","auto"),this.$addRowBtn.attr("aria-disabled","false")):(this.$addRowBtn.css("opacity","0.2"),this.$addRowBtn.css("pointer-events","none"),this.$addRowBtn.attr("aria-disabled","true"))},updateAllRows:function(){if(!this.settings.staticRows)for(var t=this.$table.find("> tbody > tr"),e=0;e<t.length;e++)this.updateRow(t.eq(e))},updateRow:function(t){if(!this.settings.staticRows){var e=t.find("button.delete");e.length&&(e.attr("aria-label",Craft.t("app","Delete row {index}",{index:t.index()+1})),this.canDeleteRow()?e.removeAttr("disabled").removeClass("disabled"):e.attr("disabled","disabled").addClass("disabled"))}},updateDeleteRowButton:function(t){this.updateRow(this.$table.find('tr[data-id="'.concat(t,'"]')))},updateStatusMessage:function(){var t,e=this;this.$statusMessage.empty(),t=this.canAddRow()?Craft.t("app","Row could not be deleted. Minimum number of rows reached."):Craft.t("app","Row could not be added. Maximum number of rows reached."),setTimeout((function(){e.$statusMessage.text(t)}),250)},canDeleteRow:function(){return!!this.settings.allowDelete&&this.rowCount>this.settings.minRows},deleteRow:function(t){this.canDeleteRow()?(this.sorter.removeItems(t.$tr),t.$tr.remove(),this.rowCount--,this.updateAllRows(),this.updateAddRowButton(),0===this.rowCount?(this.$table.addClass("hidden"),this.$addRowBtn.trigger("focus")):this.$tbody.find(":focusable").last().trigger("focus"),this.settings.onDeleteRow(t.$tr),t.destroy()):this.updateStatusMessage()},canAddRow:function(){return!!this.settings.allowAdd&&(!this.settings.maxRows||this.rowCount<this.settings.maxRows)},addRow:function(t,e){if(this.canAddRow()){var i=this.settings.rowIdPrefix+(this.biggestId+1),s=this.createRow(i,this.columns,this.baseName,$.extend({},this.settings.defaultValues));e?s.prependTo(this.$tbody):s.appendTo(this.$tbody);var a=this.createRowObj(s);return this.sorter.addItems(s),!1!==t&&s.find("input:visible,textarea:visible,select:visible").first().trigger("focus"),this.rowCount++,this.updateAllRows(),this.updateAddRowButton(),this.$table.removeClass("hidden"),this.settings.onAddRow(s),a}this.updateStatusMessage()},createRow:function(t,e,i,s){return Craft.EditableTable.createRow(t,e,i,s,this.settings.allowReorder,this.settings.allowDelete)},createRowObj:function(t){return new Craft.EditableTable.Row(this,t)},focusOnPrevRow:function(t,e,i){var s,a=t.prev("tr");if((s=a.length?a.data("editable-table-row"):this.addRow(!1,!0))&&s.$tds[e])if($(s.$tds[e]).hasClass("disabled"))a&&this.focusOnPrevRow(a,e,i);else{var n=$("textarea,input.text",s.$tds[e]);n.length&&($(i).trigger("blur"),n.trigger("focus"))}},focusOnNextRow:function(t,e,i){var s,a=t.next("tr");if((s=a.length?a.data("editable-table-row"):this.addRow(!1))&&s.$tds[e])if($(s.$tds[e]).hasClass("disabled"))a&&this.focusOnNextRow(a,e,i);else{var n=$("textarea,input.text",s.$tds[e]);n.length&&($(i).trigger("blur"),n.trigger("focus"))}},importData:function(t,e,i){for(var s=t.split(/\r?\n|\r/),a=0;a<s.length;a++){for(var n=s[a].split("\t"),r=0;r<n.length;r++){var o=n[r];e.$tds.eq(i+r).find("textarea,input[type!=hidden]").val(o).trigger("input")}var l=e.$tr.next("tr");e=l.length?l.data("editable-table-row"):this.addRow(!1)}},destroy:function(){this.$table.removeData("editable-table"),this.base()}},{textualColTypes:["autosuggest","color","date","email","multiline","number","singleline","template","time","url"],defaults:{rowIdPrefix:"",defaultValues:{},allowAdd:!1,allowReorder:!1,allowDelete:!1,minRows:null,maxRows:null,onAddRow:$.noop,onDeleteRow:$.noop},createRow:function(t,e,i,s,a,n){var r=$("<tr/>",{"data-id":t});for(var o in e)if(e.hasOwnProperty(o)){var l,h=e[o],d=void 0!==s[o]?s[o]:"";if("heading"===h.type)l=$("<th/>",{scope:"row",class:h.class,html:d});else{var c=i+"["+t+"]["+o+"]";switch(l=$("<td/>",{class:"".concat(h.class," ").concat(h.type,"-cell"),width:h.width}),Craft.inArray(h.type,Craft.EditableTable.textualColTypes)&&l.addClass("textual"),h.code&&l.addClass("code"),h.type){case"checkbox":$('<div class="checkbox-wrapper"/>').append(Craft.ui.createCheckbox({name:c,value:h.value||"1",checked:!!d})).appendTo(l);break;case"color":Craft.ui.createColorInput({name:c,value:d,small:!0}).appendTo(l);break;case"date":Craft.ui.createDateInput({name:c,value:d}).appendTo(l);break;case"lightswitch":Craft.ui.createLightswitch({name:c,value:h.value||"1",on:!!d,small:!0}).appendTo(l);break;case"select":Craft.ui.createSelect({name:c,options:h.options,value:d||function(){for(var t in h.options)if(h.options.hasOwnProperty(t)&&h.options[t].default)return void 0!==h.options[t].value?h.options[t].value:t;return null}(),class:"small"}).appendTo(l);break;case"time":Craft.ui.createTimeInput({name:c,value:d}).appendTo(l);break;case"email":case"url":Craft.ui.createTextInput({name:c,value:d,type:h.type,placeholder:h.placeholder||null}).appendTo(l);break;default:$("<textarea/>",{name:c,rows:h.rows||1,val:d,placeholder:h.placeholder}).appendTo(l)}}l.appendTo(r)}return a&&$("<td/>",{class:"thin action"}).append($("<a/>",{class:"move icon",title:Craft.t("app","Reorder"),role:"button",type:"button"})).appendTo(r),n&&$("<td/>",{class:"thin action"}).append($("<button/>",{class:"delete icon",title:Craft.t("app","Delete"),type:"button"})).appendTo(r),r}}),Craft.EditableTable.Row=Garnish.Base.extend({table:null,id:null,niceTexts:null,$tr:null,$tds:null,tds:null,$textareas:null,$deleteBtn:null,init:function(t,e){this.table=t,this.$tr=$(e),this.$tds=this.$tr.children(),this.tds=[],this.id=this.$tr.attr("data-id"),this.$tr.data("editable-table-row",this);var i=parseInt(this.id.substring(this.table.settings.rowIdPrefix.length));i>this.table.biggestId&&(this.table.biggestId=i),this.$textareas=$(),this.niceTexts=[];var s,a,n,r,o,l={},h=0;for(s in this.table.columns)this.table.columns.hasOwnProperty(s)&&(a=this.table.columns[s],n=this.tds[s]=this.$tds[h],Craft.inArray(a.type,Craft.EditableTable.textualColTypes)?(r=$("textarea",n),this.$textareas=this.$textareas.add(r),this.addListener(r,"focus","onTextareaFocus"),this.addListener(r,"mousedown","ignoreNextTextareaFocus"),this.niceTexts.push(new Garnish.NiceText(r,{onHeightChange:this.onTextareaHeightChange.bind(this)})),this.addListener(r,"keypress",{tdIndex:h,type:a.type},"handleKeypress"),this.addListener(r,"input",{type:a.type},"validateValue"),r.trigger("input"),"multiline"!==a.type&&this.addListener(r,"paste",{tdIndex:h,type:a.type},"handlePaste"),l[s]=r):"checkbox"===a.type&&(o=$('input[type="checkbox"]',n),a.radioMode&&(void 0===this.table.radioCheckboxes[s]&&(this.table.radioCheckboxes[s]=[]),this.table.radioCheckboxes[s].push(o[0]),this.addListener(o,"change",{colId:s},"onRadioCheckboxChange")),a.toggle&&this.addListener(o,"change",{colId:s},(function(t){this.applyToggleCheckbox(t.data.colId)}))),$(n).hasClass("disabled")||this.addListener(n,"click",{td:n},(function(t){t.target===t.data.td&&$(t.data.td).find("textarea,input,select,.lightswitch").focus()})),h++);for(s in this.onTextareaHeightChange(),this.table.columns)this.table.columns.hasOwnProperty(s)&&"checkbox"===(a=this.table.columns[s]).type&&a.toggle&&this.applyToggleCheckbox(s);for(s in this.table.columns)this.table.columns.hasOwnProperty(s)&&(a=this.table.columns[s]).autopopulate&&void 0!==l[a.autopopulate]&&!l[s].val()&&new Craft.HandleGenerator(l[s],l[a.autopopulate],{allowNonAlphaStart:!0});var d=this.$tr.children().last().find(".delete");this.addListener(d,"click","deleteRow");var c=this.$tr.find("input,textarea,select,.lightswitch");this.addListener(c,"focus",(function(t){$(t.currentTarget).closest("td:not(.disabled)").addClass("focus")})),this.addListener(c,"blur",(function(t){$(t.currentTarget).closest("td").removeClass("focus")}))},onTextareaFocus:function(t){this.onTextareaHeightChange();var e=$(t.currentTarget);e.data("ignoreNextFocus")?e.data("ignoreNextFocus",!1):window.setTimeout((function(){Craft.selectFullValue(e)}),0)},onRadioCheckboxChange:function(t){if(t.currentTarget.checked)for(var e=0;e<this.table.radioCheckboxes[t.data.colId].length;e++){var i=this.table.radioCheckboxes[t.data.colId][e];i.checked=i===t.currentTarget}},applyToggleCheckbox:function(t){for(var e,i,s=this.table.columns[t],a=$('input[type="checkbox"]',this.tds[t]).prop("checked"),n=0;n<s.toggle.length;n++)e=s.toggle[n],this.table.colum,(i="!"===e[0])&&(e=e.substring(1)),a&&!i||!a&&i?$(this.tds[e]).removeClass("disabled").find("textarea, input").prop("disabled",!1):$(this.tds[e]).addClass("disabled").find("textarea, input").prop("disabled",!0)},ignoreNextTextareaFocus:function(t){$.data(t.currentTarget,"ignoreNextFocus",!0)},handleKeypress:function(t){var e=t.keyCode?t.keyCode:t.charCode,i=Garnish.isCtrlKeyPressed(t);if(e===Garnish.RETURN_KEY&&("multiline"!==t.data.type||i))return t.preventDefault(),void(t.shiftKey?this.table.focusOnPrevRow(this.$tr,t.data.tdIndex,t.currentTarget):this.table.focusOnNextRow(this.$tr,t.data.tdIndex,t.currentTarget))},handlePaste:function(t){var e=Craft.trim(t.originalEvent.clipboardData.getData("Text")," \n\r");e.match(/[\t\r\n]/)&&(t.preventDefault(),this.table.importData(e,this,t.data.tdIndex))},validateValue:function(t){if("multiline"!==t.data.type)if("number"!==t.data.type){var e=t.currentTarget.value.replace(/[\r\n]/g,"");e!==t.currentTarget.value&&(t.currentTarget.value=e)}else Craft.filterNumberInputVal(t.currentTarget)},onTextareaHeightChange:function(){for(var t=-1,e=0;e<this.niceTexts.length;e++)this.niceTexts[e].height>t&&(t=this.niceTexts[e].height);this.$textareas.css("min-height",t);var i=this.$textareas.filter(":visible").first().parent().height();i>t&&this.$textareas.css("min-height",i)},deleteRow:function(){this.table.deleteRow(this)}},{numericKeyCodes:[9,8,37,38,39,40,45,91,46,190,48,49,50,51,52,53,54,55,56,57]})},8468:function(){Craft.ElementActionTrigger=Garnish.Base.extend({maxLevels:null,newChildUrl:null,$trigger:null,$selectedItems:null,triggerEnabled:!0,init:function(t){$.isPlainObject(t)||(t={}),void 0!==t.batch&&(t.bulk=t.batch,delete t.batch),Object.defineProperty(t,"batch",{get:function(){return this.bulk},set:function(t){this.bulk=t}}),this.setSettings(t,Craft.ElementActionTrigger.defaults),this.$trigger=$("#"+t.type.replace(/[\[\]\\]+/g,"-")+"-actiontrigger"),this.settings.activate&&(this.$trigger.data("custom-handler",!0),"FORM"===this.$trigger.prop("nodeName")?this.addListener(this.$trigger,"submit","handleTriggerActivation"):this.addListener(this.$trigger,"click","handleTriggerActivation")),this.updateTrigger(),Craft.elementIndex.on("selectionChange",this.updateTrigger.bind(this))},updateTrigger:function(){0!==Craft.elementIndex.getSelectedElements().length&&(this.validateSelection()?this.enableTrigger():this.disableTrigger())},validateSelection:function(){var t=!0;return this.$selectedItems=Craft.elementIndex.getSelectedElements(),!this.settings.bulk&&this.$selectedItems.length>1?t=!1:"function"==typeof this.settings.validateSelection&&(t=this.settings.validateSelection(this.$selectedItems)),t},enableTrigger:function(){this.triggerEnabled||(this.$trigger.removeClass("disabled"),this.triggerEnabled=!0)},disableTrigger:function(){this.triggerEnabled&&(this.$trigger.addClass("disabled"),this.triggerEnabled=!1)},handleTriggerActivation:function(t){t.preventDefault(),t.stopPropagation(),this.triggerEnabled&&this.settings.activate(this.$selectedItems)}},{defaults:{type:null,bulk:!0,validateSelection:null,activate:null}})},5049:function(){function t(t,i){if(t){if("string"==typeof t)return e(t,i);var s=Object.prototype.toString.call(t).slice(8,-1);return"Object"===s&&t.constructor&&(s=t.constructor.name),"Map"===s||"Set"===s?Array.from(t):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?e(t,i):void 0}}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.ElementEditor=Garnish.Base.extend({isFullPage:null,$container:null,$tabContainer:null,$contentContainer:null,$revisionBtn:null,$revisionLabel:null,$spinner:null,$expandSiteStatusesBtn:null,$statusIcon:null,$previewBtn:null,$editMetaBtn:null,metaHud:null,$nameTextInput:null,$saveMetaBtn:null,$siteStatusPane:null,$globalLightswitch:null,$siteLightswitches:null,$additionalSiteField:null,siteIds:null,newSiteIds:null,enableAutosave:null,lastSerializedValue:null,listeningForChanges:!1,pauseLevel:0,timeout:null,cancelToken:null,ignoreFailedRequest:!1,queue:null,submittingForm:!1,duplicatedElements:null,failed:!1,httpStatus:null,httpError:null,openingPreview:!1,preview:null,activatedPreviewToken:!1,previewTokenQueue:null,previewLinks:null,scrollY:null,hiddenTipsStorageKey:"Craft-"+Craft.systemUid+".TipField.hiddenTips",get tipDismissBtn(){return this.$container.find(".tip-dismiss-btn")},get slideout(){return this.$container.data("slideout")},init:function(e,i){var s=this;if(this.$container=$(e),"FORM"!==this.$container.prop("tagName"))throw"Element editors may only be used with forms.";this.$container.data("elementEditor")&&(console.warn("Double-instantiating an element editor on an element."),this.$container.data("elementEditor").destroy()),this.$container.data("elementEditor",this),this.$container.attr("data-element-editor",""),this.setSettings(i,Craft.ElementEditor.defaults),this.isFullPage=this.$container[0]===Craft.cp.$primaryForm[0],this.isFullPage?(this.$tabContainer=$("#tabs"),this.$contentContainer=$("#content")):(this.$tabContainer=this.slideout.$tabContainer,this.$contentContainer=this.slideout.$content),this.queue=this._createQueue(),this.previewTokenQueue=this._createQueue(),this.duplicatedElements={},this.enableAutosave=Craft.autosaveDrafts,this.previewLinks=[],this.siteIds=Object.keys(this.settings.siteStatuses).map((function(t){return parseInt(t)})),this.$revisionBtn=this.$container.find(".context-btn"),this.$revisionLabel=this.$container.find(".revision-label"),this.$previewBtn=this.$container.find(".preview-btn");var a,n,r=this.isFullPage?$("#page-title"):this.slideout.$toolbar;if(this.$spinner=$("<div/>",{class:"revision-spinner spinner hidden",title:Craft.t("app","Saving")}).appendTo(r),this.$statusIcon=$("<div/>",{class:"revision-status ".concat(this.isFullPage?"invisible":"hidden")}).appendTo(r),this.$statusMessage=$("<div/>",{class:"revision-status-message visually-hidden","aria-live":"polite"}).appendTo(r),this.$expandSiteStatusesBtn=$(".expand-status-btn"),this.settings.canEditMultipleSites&&this.addListener(this.$expandSiteStatusesBtn,"click","expandSiteStatuses"),this.settings.previewTargets.length&&this.isFullPage){this.settings.enablePreview&&this.addListener(this.$previewBtn,"click","openPreview");var o=this.$container.find(".preview-btn-container");if(1===this.settings.previewTargets.length){var l=(a=this.settings.previewTargets,n=1,function(t){if(Array.isArray(t))return t}(a)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(a,n)||t(a,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];this.createPreviewLink(l).addClass("view-btn btn").attr("aria-label",Craft.t("app","View")).appendTo(o)}else this.createShareMenu(o)}this.settings.revisionId||(this.$container.data("serializer",(function(){return s.serializeForm(!0)})),this.$container.data("initialSerializedValue",this.serializeForm(!0)),this.isFullPage&&this.addListener(this.$container,"submit","handleSubmit"),this.settings.isProvisionalDraft?this.initForProvisionalDraft():this.settings.draftId&&!this.settings.isUnpublishedDraft?this.initForDraft():this.settings.canSaveCanonical||this.addListener(this.$container,"submit.saveShortcut",(function(t){t.saveShortcut&&(t.preventDefault(),s.createDraft(),s.removeListener(s.$container,"submit.saveShortcut"))})),this.listenForChanges(),this.addListener(this.$statusIcon,"click",(function(){s.showStatusHud(s.$statusIcon)})),this.handleDismissibleTips(),this.isFullPage&&Craft.messageReceiver&&Craft.broadcaster.addEventListener("message",(function(t){if("saveDraft"===t.data.event&&t.data.canonicalId===s.settings.canonicalId&&(t.data.draftId===s.settings.draftId||t.data.isProvisionalDraft&&!s.settings.draftId)||"saveElement"===t.data.event&&t.data.id===s.settings.canonicalId&&!s.settings.draftId)Craft.setLocalStorage("scrollY",window.scrollY),window.location.reload();else if("deleteDraft"===t.data.event&&t.data.canonicalId===s.settings.canonicalId&&t.data.draftId===s.settings.draftId){var e=new URL(window.location.href);e.searchParams.delete("draftId"),e.href!==document.location.href?window.location.href=e:(Craft.setLocalStorage("scrollY",window.scrollY),window.location.reload())}})))},_createQueue:function(){var t=this,e=new Craft.Queue;return e.on("beforeRun",(function(){t.showSpinner()})),e.on("afterRun",(function(){t.hideSpinner()})),e},get namespace(){return this.isFullPage?null:this.slideout.namespace},namespaceInputName:function(t){return Craft.namespaceInputName(t,this.namespace)},namespaceId:function(t){return Craft.namespaceId(t,this.namespace)},listenForChanges:function(){var t=this;if(!(this.listeningForChanges||this.pauseLevel>0)&&this.enableAutosave&&this.settings.canCreateDrafts){this.listeningForChanges=!0;var e=this.isFullPage?Garnish.$bod:this.$container;this.addListener(e,"keypress,keyup,change,focus,blur,click,mousedown,mouseup",(function(e){$(e.target).is(t.statusIcons())||(clearTimeout(t.timeout),["keypress","keyup","change"].includes(e.type)?t.timeout=setTimeout(t.checkForm.bind(t),500):t.checkForm())}))}},stopListeningForChanges:function(){this.listeningForChanges&&(this.removeListener(Garnish.$bod,"keypress,keyup,change,focus,blur,click,mousedown,mouseup"),clearTimeout(this.timeout),this.listeningForChanges=!1)},pause:function(){this.pauseLevel++,this.stopListeningForChanges()},resume:function(){if(0===this.pauseLevel)throw"Craft.ElementEditor::resume() should only be called after pause().";this.pauseLevel--,0===this.pauseLevel&&this.enableAutosave&&(this.checkForm(),this.listenForChanges())},initForProvisionalDraft:function(){var t=this,e=this.$container.find(".discard-changes-btn");if(!e.length){var i,s,a;this.isFullPage?(i=$("#content").height(),s=Garnish.$win.scrollTop(),a=Craft.cp.$noticeContainer):a=this.$container.find(".so-notice");var n=$("<div/>",{class:"draft-notice"}).append($("<div/>",{class:"draft-icon","aria-hidden":"true","data-icon":"edit"})).append($("<p/>",{text:Craft.t("app","Showing your unsaved changes.")})).appendTo(a);if(e=$("<button/>",{type:"button",class:"discard-changes-btn btn",text:Craft.t("app","Discard")}).appendTo(n),this.isFullPage){var r=$("#content").height()-i;if(Garnish.$win.scrollTop(s+r),Garnish.$win.scrollTop()===s){Craft.cp.$contentContainer.css("pointer-events","none"),$("#content-header").css("min-height","auto");var o=a.height();a.css({height:o-r,overflow:"hidden"}).velocity({height:o},"fast",(function(){$("#content-header").css("min-height",""),a.css({height:"",overflow:""}),setTimeout((function(){Craft.cp.$contentContainer.css("pointer-events","")}),300)}))}}}this.addListener(e,"keypress,keyup,change,focus,blur,click,mousedown,mouseup",(function(t){t.stopPropagation()})),this.addListener(e,"click",(function(){confirm(Craft.t("app","Are you sure you want to discard your changes?"))&&t.queue.unshift((function(){return new Promise((function(e,i){t.isFullPage?Craft.submitForm(t.$container,{action:"elements/delete-draft",redirect:t.settings.hashedCpEditUrl,params:{draftId:t.settings.draftId,provisional:1}}):Craft.sendActionRequest("POST","elements/delete-draft",{data:{elementId:t.settings.canonicalId,draftId:t.settings.draftId,provisional:1}}).then((function(e){Craft.cp.displaySuccess(e.data.message),t.slideout.close()})).catch(i)}))}))}))},initForDraft:function(){var t=this;this.createEditMetaBtn(),this.settings.canSaveCanonical&&Garnish.uiLayerManager.registerShortcut({keyCode:Garnish.S_KEY,ctrl:!0,alt:!0},(function(){Craft.submitForm(t.$container,{action:"elements/apply-draft",redirect:t.settings.hashedCpEditUrl})}),0)},expandSiteStatuses:function(){var t=this;this.removeListener(this.$expandSiteStatusesBtn,"click"),this.$expandSiteStatusesBtn.velocity({opacity:0},"fast",(function(){t.$expandSiteStatusesBtn.remove()}));var e=this.$container.find(".enabled-for-site-".concat(this.settings.siteId,"-field"));if(this.$siteStatusPane=e.parent(),this.settings.revisionId)this._getOtherSupportedSites().forEach((function(e){return t._createSiteStatusField(e)}));else{e.addClass("nested");var i=Craft.ui.createLightswitchField({label:Craft.t("app","Enabled for all sites"),name:this.namespaceInputName("enabled")}).insertBefore(e);i.find("label").css("font-weight","bold"),this.$globalLightswitch=i.find(".lightswitch"),this.settings.revisionId||this._showField(i);var s=Object.values(this.settings.siteStatuses),a=s.includes(!0),n=s.includes(!1),r=a&&n?"-":a?"1":"",o=encodeURIComponent(this.namespaceInputName("enabledForSite[".concat(this.settings.siteId,"]")))+"="+(this.settings.enabledForSite?"1":"");this.$siteLightswitches=e.find(".lightswitch").on("change",this._updateGlobalStatus.bind(this)),this._getOtherSupportedSites().forEach((function(e){return t._createSiteStatusField(e)}));for(var l=encodeURIComponent(this.namespaceInputName("enabled"))+"=".concat(r),h=0;h<this.$siteLightswitches.length;h++){var d=this.$siteLightswitches.eq(h).data("lightswitch").$input;l+="&"+encodeURIComponent(d.attr("name"))+"="+d.val()}this.$container.data("initialSerializedValue",this.$container.data("initialSerializedValue").replace(o,l)),this.lastSerializedValue&&(this.lastSerializedValue=this.lastSerializedValue.replace(o,l)),this.settings.additionalSites&&this.settings.additionalSites.length&&this.isFullPage&&this._createAddlSiteField(),this.$globalLightswitch.focus(),this.$globalLightswitch.on("change",this._updateSiteStatuses.bind(this)),this._updateGlobalStatus()}},_getOtherSupportedSites:function(){var t=this;return Craft.sites.filter((function(e){return e.id!=t.settings.siteId&&t.siteIds.includes(e.id)}))},_showField:function(t){var e=t.height();t.css({overflow:"hidden","min-height":"auto"}).height(0).velocity({height:e},"fast",(function(){t.css({overflow:"",height:"","min-height":""})}))},_removeField:function(t){t.css({overflow:"hidden","min-height":"auto"}).velocity({height:0},"fast",(function(){t.remove()}))},_updateGlobalStatus:function(){var t=!0,e=!0;this.$siteLightswitches.each((function(){if($(this).data("lightswitch").on?e=!1:t=!1,!t&&!e)return!1})),t?this.$globalLightswitch.data("lightswitch").turnOn(!0):e?this.$globalLightswitch.data("lightswitch").turnOff(!0):this.$globalLightswitch.data("lightswitch").turnIndeterminate(!0)},_updateSiteStatuses:function(){var t=this.$globalLightswitch.data("lightswitch").on;this.$siteLightswitches.each((function(){t?$(this).data("lightswitch").turnOn(!0):$(this).data("lightswitch").turnOff(!0)}))},_createSiteStatusField:function(t,e){var i=Craft.ui.createLightswitchField({fieldClass:"enabled-for-site-".concat(t.id,"-field"),label:t.name,name:this.namespaceInputName("enabledForSite[".concat(t.id,"]")),on:void 0!==e?e:!this.settings.siteStatuses.hasOwnProperty(t.id)||this.settings.siteStatuses[t.id],disabled:!!this.settings.revisionId});if(this.$additionalSiteField?i.insertBefore(this.$additionalSiteField):i.appendTo(this.$siteStatusPane),!this.settings.revisionId){i.addClass("nested");var s=i.find(".lightswitch").on("change",this._updateGlobalStatus.bind(this));this.$siteLightswitches=this.$siteLightswitches.add(s)}return this._showField(i),i},_createAddlSiteField:function(){var i,s=this,a=Craft.sites.filter((function(t){return!s.siteIds.includes(t.id)&&s.settings.additionalSites.some((function(e){return e.siteId==t.id}))}));if(a.length){var n="add-site-label",r=$("<span/>",{text:Craft.t("app","Add a site..."),class:"visually-hidden",id:n}),o=Craft.ui.createSelect({options:[{label:Craft.t("app","Add a site…")}].concat((i=a.map((function(t){return{label:t.name,value:t.id}})),function(t){if(Array.isArray(t))return e(t)}(i)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(i)||t(i)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())),labelledBy:n}).addClass("fullwidth");this.$additionalSiteField=Craft.ui.createField(o,{}).addClass("nested add").appendTo(this.$siteStatusPane),r.prependTo(this.$additionalSiteField);var l=o.find("select");l.on("change",(function(){var t=parseInt(l.val()),e=Craft.sites.find((function(e){return e.id===t}));if(e){var i=s.settings.additionalSites.find((function(t){return t.siteId==e.id}));s._createSiteStatusField(e,i.enabledByDefault),s._updateGlobalStatus(),l.val("").find('option[value="'.concat(t,'"]')).remove(),null===s.newSiteIds&&(s.newSiteIds=[]),s.siteIds.push(t),s.newSiteIds.push(t),1===l.find("option").length&&s._removeField(s.$additionalSiteField)}})),this._showField(this.$additionalSiteField)}},showStatusHud:function(t){var e;this.failed?(e='<p class="error"><strong>'.concat(this._saveFailMessage(),"</strong></p>"),this.httpError&&(e+='<p class="http-error code">'.concat(Craft.escapeHtml(this.httpError),"</p>")),400===this.httpStatus&&(e+='<button class="btn refresh-btn">'.concat(Craft.t("app","Refresh"),"</button>"))):e="<p>".concat(this._saveSuccessMessage(),"</p>");var i=new Garnish.HUD(t,e,{hudClass:"hud revision-status-hud",onHide:function(){i.destroy()}});i.$mainContainer.find(".refresh-btn").on("click",(function(){window.location.reload()}))},_saveSuccessMessage:function(){return this.settings.isProvisionalDraft||this.settings.isUnpublishedDraft?Craft.t("app","Your changes have been stored."):Craft.t("app","The draft has been saved.")},_saveFailMessage:function(){return this.settings.isProvisionalDraft||this.settings.isUnpublishedDraft?Craft.t("app","Your changes could not be stored."):Craft.t("app","The draft could not be saved.")},spinners:function(){return this.preview?this.$spinner.add(this.preview.$spinner):this.$spinner},showSpinner:function(){this.spinners().removeClass("hidden")},hideSpinner:function(){this.spinners().addClass("hidden")},statusIcons:function(){return this.preview?this.$statusIcon.add(this.preview.$statusIcon):this.$statusIcon},statusMessage:function(){return this.preview?this.$statusMessage.add(this.preview.$statusMessage):this.$statusMessage},createEditMetaBtn:function(){var t=this.$container.find(".context-btngroup");this.$editMetaBtn=$("<button/>",{type:"button",class:"btn edit icon","aria-expanded":"false","aria-label":Craft.t("app","Edit draft settings"),title:Craft.t("app","Edit draft settings")}).appendTo(t),t.find(".btngroup-btn-last").removeClass("btngroup-btn-last"),this.addListener(this.$editMetaBtn,"click","showMetaHud")},createPreviewLink:function(t,e){var i=this,s=$("<a/>",{href:this.getTokenizedPreviewUrl(t.url,null,!1),text:e||Craft.t("app","View"),target:"_blank",data:{targetUrl:t.url,targetLabel:t.label}});return this.addListener(s,"click",(function(){setTimeout((function(){i.activatePreviewToken()}),1)})),this.previewLinks.push(s),s},updatePreviewLinks:function(){var t=this;this.previewLinks.forEach((function(e){t.updatePreviewLinkHref(e),t.activatedPreviewToken&&t.removeListener(e,"click")}))},updatePreviewLinkHref:function(t){t.attr("href",this.getTokenizedPreviewUrl(t.data("targetUrl"),null,!1))},activatePreviewToken:function(){this.settings.isLive||(this.activatedPreviewToken=!0,this.updatePreviewLinks())},createShareMenu:function(t){var e=this,i=$("<button/>",{type:"button",class:"view-btn btn menubtn",text:Craft.t("app","View")}).appendTo(t),s=$("<div/>",{class:"menu"}).appendTo(t),a=$("<ul/>").appendTo(s);this.settings.previewTargets.forEach((function(t){$("<li/>").append(e.createPreviewLink(t,t.label)).appendTo(a)})),new Garnish.MenuBtn(i)},getPreviewTokenParams:function(){var t={elementType:this.settings.elementType,canonicalId:this.settings.canonicalId,siteId:this.settings.siteId,revisionId:this.settings.revisionId,previewToken:this.settings.previewToken};return this.settings.draftId&&!this.settings.isProvisionalDraft&&(t.draftId=this.settings.draftId),t},getPreviewToken:function(){var t=this;return this.previewTokenQueue.push((function(){return new Promise((function(e,i){t.activatedPreviewToken?e(t.settings.previewToken):Craft.sendActionRequest("POST","preview/create-token",{data:t.getPreviewTokenParams()}).then((function(){t.activatePreviewToken(),e(t.settings.previewToken)})).catch(i)}))}))},getTokenizedPreviewUrl:function(t,e,i){var s=this;void 0===i&&(i=!0);var a={};if(!e&&this.settings.isLive||(a[e||"x-craft-preview"]=Craft.randomString(10)),this.settings.siteToken&&(a[Craft.siteToken]=this.settings.siteToken),this.settings.isLive){var n=Craft.getUrl(t,a);return i?new Promise((function(t){t(n)})):n}if(!this.settings.previewToken)throw"Missing preview token";a[Craft.tokenParam]=this.settings.previewToken;var r=Craft.getUrl(t,a);if(this.activatedPreviewToken)return i?new Promise((function(t){t(r)})):r;if(i)return new Promise((function(t,e){s.getPreviewToken().then((function(){t(r)})).catch(e)}));var o=this.getPreviewTokenParams();return o.redirect=r,Craft.getActionUrl("preview/create-token",o)},getPreview:function(){var t=this;return this.preview||(this.preview=new Craft.Preview(this),this.enableAutosave||(this.preview.on("open",(function(){t.enableAutosave=!0,t.listenForChanges()})),this.preview.on("close",(function(){t.enableAutosave=!1,t.stopListeningForChanges();var e=t.statusIcons();e.hasClass("checkmark-icon")&&e.addClass("hidden")}))),this.preview.on("close",(function(){t.scrollY&&(window.scrollTo(0,t.scrollY),t.scrollY=null)}))),this.preview},openPreview:function(){var t=this;Garnish.hasAttr(this.$previewBtn,"aria-disabled")||(this.$previewBtn.attr("aria-disabled",!0),this.$previewBtn.addClass("loading"),this.queue.push((function(){return new Promise((function(e,i){t.openingPreview=!0,t.ensureIsDraftOrRevision(!0).then((function(){t.scrollY=window.scrollY,t.$previewBtn.removeAttr("aria-disabled"),t.$previewBtn.removeClass("loading"),t.getPreview().open(),t.openingPreview=!1,e()})).catch(i)}))})))},ensureIsDraftOrRevision:function(t){var e=this;return new Promise((function(i,s){if(e.settings.draftId||e.settings.revisionId)i();else{if(t&&e.serializeForm(!0)===e.$container.data("initialSerializedValue"))return void i();e.createDraft().then(i).catch(s)}}))},serializeForm:function(t){var e=this.$container.serialize();if(this.isPreviewActive()&&(e=e.replace("__PREVIEW_FIELDS__=1",this.preview.$editor.serialize())),t&&!this.settings.isUnpublishedDraft){var i=this.namespaceInputName("action"),s=this.namespaceInputName("redirect");e=(e=e.replace(new RegExp("&".concat(Craft.escapeRegex(i),"=[^&]*")),"")).replace(new RegExp("&".concat(Craft.escapeRegex(s),"=[^&]*")),"")}return e},checkForm:function(t){var e=this;return this.queue.push((function(){return new Promise((function(i,s){if(e.settings.revisionId||e.pauseLevel>0||!e.enableAutosave||!e.settings.canCreateDrafts)i();else if(clearTimeout(e.timeout),e.timeout=null,void 0!==e.$container.data("initialSerializedValue")){var a=e.serializeForm(!0);t||a!==(e.lastSerializedValue||e.$container.data("initialSerializedValue"))?e.saveDraft(a).then(i).catch((function(t){console.warn("Couldn’t save draft:",t),s(t)})):i()}else e.timeout=setTimeout(e.checkForm.bind(e),500)}))}))},isPreviewActive:function(){return this.preview&&this.preview.isActive},createDraft:function(){var t=this;return this.queue.push((function(){return new Promise((function(e,i){t.saveDraft(t.serializeForm(!0)).then(e).catch(i)}))}))},saveDraft:function(t){var e=this;return new Promise((function(i,s){if(e.submittingForm)s("Form already being submitted.");else{e.lastSerializedValue=t,e.failed=!1,e.httpStatus=null,e.httpError=null,e.cancelToken=axios.CancelToken.source(),e.statusIcons().velocity("stop").css("opacity","").removeClass("hidden invisible checkmark-icon alert-icon fade-out").addClass("hidden"),e.statusMessage().empty(),e.$saveMetaBtn&&e.$saveMetaBtn.addClass("active");var a,n,r,o=[],l=e.prepareData(t,e.settings.isUnpublishedDraft?null:function(t,e){e.length&&o.push(decodeURIComponent(e[0].split("=")[0]))}),h=(a={},n=e.namespaceInputName("visibleLayoutElements"),r=e.settings.visibleLayoutElements,n in a?Object.defineProperty(a,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):a[n]=r,a);!e.settings.isProvisionalDraft&&e.settings.draftId||(h[e.namespaceInputName("provisional")]=1);var d=e.$contentContainer.children("[data-layout-tab]:not(.hidden)").data("id");d&&(h[e.namespaceInputName("selectedTab")]=d),l+="&".concat($.param(h)),Craft.sendActionRequest("POST","elements/save-draft",{cancelToken:e.cancelToken.token,headers:e._saveHeaders,data:l}).then((function(s){e._afterSaveDraft();var a=!e.settings.draftId;a&&(e.settings.isProvisionalDraft=!0,e.$revisionLabel.append($("<span/>",{text:" — ".concat(Craft.t("app","Edited"))}))),e.isFullPage&&(s.data.title&&e.$container.find(".screen-title").text(s.data.title),s.data.docTitle&&(document.title=s.data.docTitle)),e.settings.isProvisionalDraft||(e.$revisionLabel.text(s.data.draftName),e.settings.draftName=s.data.draftName);var n=e.$revisionBtn.data("menubtn")?e.$revisionBtn.data("menubtn").menu:null;for(var r in e.newSiteIds&&(n||(e.$revisionBtn.removeClass("disabled").addClass("menubtn"),new Garnish.MenuBtn(e.$revisionBtn),(n=e.$revisionBtn.data("menubtn").menu).$container.removeClass("hidden")),e.newSiteIds.forEach((function(t){var i=n.$options.filter("[data-site-id=".concat(t,"]")),s=e.settings.additionalSites.find((function(e){return e.siteId==t}));s&&void 0!==s.enabledByDefault&&!s.enabledByDefault||i.find(".status").removeClass("disabled").addClass("enabled"),i.parent().removeClass("hidden").closest(".site-group").removeClass("hidden")})),n.$container.find(".revision-hr").removeClass("hidden"),e.newSiteIds=null),e.settings.isProvisionalDraft?a&&(e.$container.find("input.action-input").attr("value","elements/apply-draft"),e.settings.draftId=s.data.draftId,e.settings.isLive=!1,e.previewToken=null,e.initForProvisionalDraft()):n&&(n.$options.filter(".sel").find(".draft-name").text(s.data.draftName),n.$options.filter(".sel").find(".draft-meta").text(s.data.creator?Craft.t("app","Saved {timestamp} by {creator}",{timestamp:s.data.timestamp,creator:s.data.creator}):Craft.t("app","Saved {timestamp}",{timestamp:s.data.timestamp}))),s.data.previewTargets&&JSON.stringify(s.data.previewTargets)!==JSON.stringify(e.settings.previewTargets)&&e.updatePreviewTargets(s.data.previewTargets),a&&(e.updatePreviewLinks(),e.trigger("createProvisionalDraft")),e.$nameTextInput&&e.checkMetaValues(),s.data.duplicatedElements)r!=e.settings.canonicalId&&s.data.duplicatedElements.hasOwnProperty(r)&&(e.duplicatedElements[r]=s.data.duplicatedElements[r]);for(var l=s.data.modifiedAttributes.map((function(t){return t=e.namespaceInputName(t),'[name="'.concat(t,'"],[name^="').concat(t,'["]')})).concat(o.map((function(t){return'[name="'.concat(t,'"]')}))),h=$(l.join(",")).parents().filter(".field:not(:has(> .status-badge))"),c=0;c<h.length;c++)h.eq(c).prepend($("<div/>",{class:"status-badge modified",title:Craft.t("app","This field has been modified.")}).append($("<span/>",{class:"visually-hidden",html:Craft.t("app","This field has been modified.")})));for(var u=e.serializeForm(!0)===t,p=$(),f={},g=!1,m=0;m<s.data.missingElements.length;m++){var v=s.data.missingElements[m],b=e.$contentContainer.children('[data-layout-tab="'.concat(v.uid,'"]'));b.length||(b=$("<div/>",{id:e.namespaceId(v.id),class:"flex-fields","data-id":v.id,"data-layout-tab":v.uid}),v.id!==d&&b.addClass("hidden"),b.appendTo(e.$contentContainer)),p=p.add(b);for(var C=0;C<v.elements.length;C++){var _=v.elements[C];if(!1!==_.html){if(f[v.uid]||(f[v.uid]=[]),f[v.uid].push(_.uid),"string"==typeof _.html){var w=b.children('[data-layout-element="'.concat(_.uid,'"]')),S=$(_.html);w.length?w.replaceWith(S):S.appendTo(b),Craft.initUiElements(S),g=!0}}else{var y=b.children('[data-layout-element="'.concat(_.uid,'"]'));if(!y.length||!Garnish.hasAttr(y,"data-layout-element-placeholder")){var T=$("<div/>",{class:"hidden","data-layout-element":_.uid,"data-layout-element-placeholder":""});y.length?y.replaceWith(T):T.appendTo(b),g=!0}}}}var I=e.$contentContainer.children("[data-layout-tab]").not(p).not('[data-layout-tab=""]');I.length&&(I.remove(),g=!0),p.filter(":not(.hidden)").length||p.first().removeClass("hidden"),e.settings.visibleLayoutElements=f,e.isFullPage?Craft.cp.updateTabs(s.data.tabs):e.slideout.updateTabs(s.data.tabs),Craft.appendHeadHtml(s.data.headHtml),Craft.appendBodyHtml(s.data.bodyHtml),g&&(s.data.initialDeltaValues&&Object.assign(e.$container.data("initial-delta-values"),s.data.initialDeltaValues),u&&(e.lastSerializedValue=e.serializeForm(!0))),e.handleDismissibleTips(),e.afterUpdate(t),Craft.broadcaster&&Craft.broadcaster.postMessage({pageId:Craft.pageId,event:"saveDraft",canonicalId:e.settings.canonicalId,draftId:e.settings.draftId,isProvisionalDraft:e.settings.isProvisionalDraft}),i()})).catch((function(t){e._afterSaveDraft(),e.ignoreFailedRequest||(e.failed=!0,t&&t.response&&(e.httpStatus=t.response.status,e.httpError=t.response.data?t.response.data.message:null),e._showFailStatus(),s(t)),e.ignoreFailedRequest=!1}))}}))},_afterSaveDraft:function(){this.$saveMetaBtn&&this.$saveMetaBtn.removeClass("active")},_showFailStatus:function(){this.statusIcons().velocity("stop").css("opacity","").removeClass("hidden checkmark-icon").addClass("alert-icon"),this.setStatusMessage(this._saveFailMessage())},prepareData:function(t,e){t=Craft.findDeltaData(this.$container.data("initialSerializedValue"),t,this.$container.data("delta-names"),e,this.$container.data("initial-delta-values"),this.$container.data("modified-delta-names")),t=this.swapDuplicatedElementIds(t);var i={};return this.settings.draftId&&(i[this.namespaceInputName("draftId")]=this.settings.draftId,this.settings.isProvisionalDraft&&(i[this.namespaceInputName("provisional")]=1)),null!==this.settings.draftName&&(i[this.namespaceInputName("draftName")]=this.settings.draftName),$.isEmptyObject(i)||(t+="&".concat($.param(i))),t},get _saveHeaders(){var t={"content-type":"application/x-www-form-urlencoded"};return this.namespace&&(t["X-Craft-Namespace"]=this.namespace),t},swapDuplicatedElementIds:function(t){var e=this,i=Object.keys(this.duplicatedElements).join("|");if(""===i)return t;var s=encodeURIComponent("["),a=encodeURIComponent("]"),n=this.namespaceInputName("fields");for(n=this.isFullPage?Craft.escapeRegex(n):encodeURIComponent(n);t!==(t=t.replace(new RegExp("(&".concat(n).concat(s,"[^=]+").concat(a).concat(s,")(").concat(i,")(").concat(a,")"),"g"),(function(t,i,s,a){var n=!1;try{n=e._filterFieldInputName(i)}catch(e){console.warn("Unexpected input name: ".concat(t))}return n?i+e.duplicatedElements[s]+a:t})).replace(new RegExp("&(".concat(n).concat(s,"[^=]+)=(").concat(i,")\\b"),"g"),(function(t,i,n){var r=!1;try{r=e._filterFieldInputName(i)&&!i.match(new RegExp("".concat(s,"(enabled|sortOrder|type|typeId)").concat(a,"$")))}catch(e){console.warn("Unexpected input name: ".concat(t))}return r?"&".concat(i,"=").concat(e.duplicatedElements[n]):t}))););return t},_filterFieldInputName:function(t){var e=encodeURIComponent("["),i=encodeURIComponent("]"),s=t.match(new RegExp("(\\bfields|".concat(e,"fields").concat(i,")").concat(e,"[^").concat(i,"]+").concat(i),"g"));if(!s)throw"Unexpected input name: ".concat(t);var a=s[s.length-1].match(new RegExp("(?:\\bfields|".concat(e,"fields").concat(i,")").concat(e,"([^").concat(i,"]+)").concat(i)))[1];return Craft.fieldsWithoutContent.includes(a)},updatePreviewTargets:function(t){var e=this;t.forEach((function(t){var i=e.settings.previewTargets.find((function(e){return e.label===t.label}));i&&(i.url=t.url);var s=e.previewLinks.find((function(e){return e.data("targetLabel")===t.label}));s&&(s.data("targetUrl",t.url),e.updatePreviewLinkHref(s))}))},afterUpdate:function(t){this.$container.data("initialSerializedValue",t),this.$container.data("initial-delta-values",{});var e=this.statusIcons().velocity("stop").css("opacity","").removeClass("hidden").addClass("checkmark-icon");this.setStatusMessage(this._saveSuccessMessage()),Craft.autosaveDrafts||e.velocity("stop").velocity({opacity:0},{delay:2e3,complete:function(){e.addClass("hidden")}}),this.trigger("update")},setStatusMessage:function(t){this.statusIcons().attr("title",t),this.statusMessage().empty().append($("<span/>",{class:"visually-hidden",text:t}))},showMetaHud:function(){this.metaHud?this.metaHud.show():(this.createMetaHud(),this.onMetaHudShow()),Garnish.isMobileBrowser(!0)||this.$nameTextInput.trigger("focus")},createMetaHud:function(){var t=$("<div/>"),e=$('<div class="field"><div class="heading"><label for="draft-name">'+Craft.t("app","Draft Name")+"</label></div></div>").appendTo(t),i=$('<div class="input"/>').appendTo(e);this.$nameTextInput=$('<input type="text" class="text fullwidth" id="draft-name"/>').appendTo(i).val(this.settings.draftName);var s=$('<div class="hud-footer flex flex-center"/>').appendTo(t);$('<div class="flex-grow"></div>').appendTo(s),this.$saveMetaBtn=$("<button/>",{type:"submit",class:"btn submit disabled","aria-disabled":"true",text:Craft.t("app","Save")}).appendTo(s),this.metaHud=new Garnish.HUD(this.$editMetaBtn,t,{onSubmit:this.saveMeta.bind(this)}),this.addListener(this.$nameTextInput,"input","checkMetaValues"),this.metaHud.on("show",this.onMetaHudShow.bind(this)),this.metaHud.on("hide",this.onMetaHudHide.bind(this)),this.metaHud.on("escape",this.onMetaHudEscape.bind(this))},onMetaHudShow:function(){this.$editMetaBtn.addClass("active"),this.$editMetaBtn.attr("aria-expanded","true")},onMetaHudHide:function(){this.$editMetaBtn.removeClass("active"),this.$editMetaBtn.attr("aria-expanded","false"),Garnish.focusIsInside(this.metaHud.$body)&&this.$editMetaBtn.trigger("focus")},onMetaHudEscape:function(){this.$nameTextInput.val(this.settings.draftName)},checkMetaValues:function(){return this.$nameTextInput.val()&&this.$nameTextInput.val()!==this.settings.draftName?(this.$saveMetaBtn.removeClass("disabled"),this.$saveMetaBtn.removeAttr("aria-disabled"),!0):(this.$saveMetaBtn.addClass("disabled"),this.$saveMetaBtn.attr("aria-disabled","true"),!1)},shakeMetaHud:function(){Garnish.shake(this.metaHud.$hud)},saveMeta:function(){var t=this;return new Promise((function(e,i){if(!t.checkMetaValues())return t.shakeMetaHud(),void i();t.settings.draftName=t.$nameTextInput.val(),t.metaHud.hide(),t.checkForm(!0).then(e).catch(i)}))},handleSubmit:function(t){var e=this;if(t.preventDefault(),t.stopPropagation(),!this.submittingForm)if(!this.settings.draftId||this.settings.isUnpublishedDraft||this.settings.isProvisionalDraft||void 0!==t.autosave&&!t.autosave||!(t.saveShortcut||t.customTrigger&&"elements/save-draft"===t.customTrigger.data("action"))||!this.enableAutosave){this.submittingForm=!0,Craft.cp.$confirmUnloadForms=Craft.cp.$confirmUnloadForms.not(this.$container),this.cancelToken&&(this.ignoreFailedRequest=!0,this.cancelToken.cancel()),this.trigger("beforeSubmit");var i=this.prepareData(this.serializeForm(!1));if(this.isFullPage){this.stopListeningForChanges();var s=Craft.createForm(i);s.appendTo(Garnish.$bod),s.submit()}else this.slideout.showSubmitSpinner(),Craft.sendActionRequest("POST",null,{headers:this._saveHeaders,data:i}).then((function(t){e.slideout.handleSubmitResponse(t)})).catch((function(t){e.slideout.handleSubmitError(t)})).finally((function(){e.submittingForm=!1,e.slideout.hideSubmitSpinner()}))}else this.checkForm(!0)},handleDismissibleTips:function(){var t=this;this.addListener(this.tipDismissBtn,"click",(function(e){t.hideTip(e)}))},getHiddenTipsUids:function(){return Craft.getLocalStorage("dismissedTips",[])},setHiddenTipsUids:function(t){Craft.setLocalStorage("dismissedTips",t)},hideTip:function(t){var e=t.target;if(e){var i=$(e).closest(".readable");if(i.length){var s=i.data("layout-element");if(i.remove(),"undefined"!=typeof Storage){var a=this.getHiddenTipsUids();a.includes(s)||(a.push(s),this.setHiddenTipsUids(a))}}}}},{defaults:{additionalSites:[],canCreateDrafts:!1,canEditMultipleSites:!1,canSaveCanonical:!1,canonicalId:null,draftId:null,draftName:null,elementType:null,enablePreview:!1,enabled:!1,enabledForSite:!1,hashedCpEditUrl:null,isLive:!1,isProvisionalDraft:!1,isUnpublishedDraft:!1,previewTargets:[],previewToken:null,revisionId:null,siteId:null,siteStatuses:null,siteToken:null,visibleLayoutElements:{}}})},4211:function(){Craft.ElementEditorSlideout=Craft.CpScreenSlideout.extend({$element:null,init:function(t,e){var i=this;this.$element=$(t),e=Object.assign({},Craft.ElementEditorSlideout.defaults,e,{showHeader:!0}),this.base("elements/edit",e),this.on("load",(function(){var t=i.$container.data("elementEditor");t&&t.on("beforeSubmit",(function(){Object.keys(i.settings.saveParams).forEach((function(e){$("<input/>",{class:"hidden",name:t.namespaceInputName(e),value:i.settings.saveParams[e]}).appendTo(i.$container)}))}))})),this.on("submit",(function(t){if(Craft.broadcaster&&Craft.broadcaster.postMessage({event:"saveElement",id:t.response.data.element.id}),i.settings.onSaveElement){var e=Object.assign({},t.response.data,t.response.data.element);delete e.element,delete e.modelName,delete e.message,i.settings.onSaveElement(e)}Craft.Preview.refresh()}))},getParams:function(){var t={};return this.settings.elementType&&(t.elementType=this.settings.elementType),this.settings.elementId?t.elementId=this.settings.elementId:this.$element&&this.$element.data("id")&&(t.elementId=this.$element.data("id")),this.settings.draftId?t.draftId=this.settings.draftId:this.$element&&this.$element.data("draft-id")?t.draftId=this.$element.data("draft-id"):this.settings.revisionId?t.revisionId=this.settings.revisionId:this.$element&&this.$element.data("revision-id")&&(t.revisionId=this.$element.data("revision-id")),this.settings.siteId?t.siteId=this.settings.siteId:this.$element&&this.$element.data("site-id")&&(t.siteId=this.$element.data("site-id")),this.settings.prevalidate&&(t.prevalidate=1),t},handleSubmit:function(t){this.$container.data("elementEditor").handleSubmit(t)}},{defaults:{elementId:null,draftId:null,revisionId:null,elementType:null,siteId:null,prevalidate:!1,saveParams:{},onSaveElement:null,validators:[]}})},7998:function(){Craft.ElementFieldSettings=Garnish.Base.extend({allowMultipleSources:null,$maintainHierarchyField:null,$maintainHierarchyInput:null,$sourcesField:null,$sourceSelect:null,$branchLimitField:null,$maxRelationsField:null,$minRelationsField:null,init:function(t,e,i,s,a,n){this.allowMultipleSources=t,this.$maintainHierarchyField=$("#".concat(e)),this.$maintainHierarchyInput=this.$maintainHierarchyField.find('input[type="checkbox"]'),this.$sourcesField=$("#".concat(i)),this.allowMultipleSources||(this.$sourceSelect=this.$sourcesField.find("select")),this.$branchLimitField=$("#".concat(s)),this.$minRelationsField=$("#".concat(a)),this.$maxRelationsField=$("#".concat(n)),this.updateLimitFields(),this.addListener(this.$maintainHierarchyInput,"change","updateLimitFields"),this.allowMultipleSources?this.$sourcesField.find("[type=checkbox]").each(function(t,e){this.addListener($(e),"change","updateMaintainHierarchyField")}.bind(this)):this.addListener(this.$sourceSelect,"change","updateMaintainHierarchyField"),this.updateMaintainHierarchyField()},updateLimitFields:function(){!this.$maintainHierarchyField.hasClass("hidden")&&this.$maintainHierarchyInput.is(":checked")?(this.$minRelationsField.addClass("hidden"),this.$maxRelationsField.addClass("hidden"),this.$branchLimitField.removeClass("hidden")):(this.$branchLimitField.addClass("hidden"),this.$minRelationsField.removeClass("hidden"),this.$maxRelationsField.removeClass("hidden"))},updateMaintainHierarchyField:function(){var t;if(this.allowMultipleSources){var e=this.$sourcesField.find('[type="checkbox"]:checked');t=1===e.length&&e.data("structure-id")}else t=this.$sourceSelect.children("option:selected").data("structure-id");t?this.$maintainHierarchyField.removeClass("hidden"):this.$maintainHierarchyField.addClass("hidden"),this.updateLimitFields()}})},8895:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.ElementThumbLoader=Garnish.Base.extend({queue:null,workers:[],init:function(){this.queue=[];for(var t=0;t<3;t++)this.workers.push(new Craft.ElementThumbLoader.Worker(this))},load:function(t){for(var e=this,i=t.find(".elementthumb"),s=function(t){var s=i.eq(t),a=s.scrollParent();if("FIELDSET"===a.prop("nodeName")&&(a=a.scrollParent()),a[0]===document.body&&(a=Garnish.$doc),e.isVisible(s,a))e.addToQueue(s[0]);else{var n="thumb"+Math.floor(1e6*Math.random());Craft.ElementThumbLoader.invisibleThumbs[n]=[e,s,a],a.on("scroll.".concat(n),{$thumb:s,$scrollParent:a,key:n},(function(t){e.isVisible(t.data.$thumb,t.data.$scrollParent)&&(delete Craft.ElementThumbLoader.invisibleThumbs[t.data.key],a.off("scroll.".concat(t.data.key)),e.addToQueue(t.data.$thumb[0]))}))}},a=0;a<i.length;a++)s(a)},addToQueue:function(t){this.queue.push(t);for(var e=0;e<this.workers.length;e++)this.workers[e].active||this.workers[e].loadNext()},isVisible:function(t,e){var i,s,a=t.offset().top;return e[0]===document?(i=e.scrollTop(),s=Garnish.$win.height()):(i=e.offset().top,s=e.height()),a>i&&a<i+s+1e3},destroy:function(){for(var t=0;t<this.workers.length;t++)this.workers[t].destroy();this.base()}},{invisibleThumbs:{},retryAll:function(){for(var e in Craft.ElementThumbLoader.invisibleThumbs){var i=(r=Craft.ElementThumbLoader.invisibleThumbs[e],o=3,function(t){if(Array.isArray(t))return t}(r)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(r,o)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(r,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=i[0],a=i[1],n=i[2];delete Craft.ElementThumbLoader.invisibleThumbs[e],n.off("scroll.".concat(e)),s.load(a.parent())}var r,o}}),Craft.ElementThumbLoader.Worker=Garnish.Base.extend({loader:null,active:!1,init:function(t){this.loader=t},loadNext:function(){var t=this.loader.queue.shift();if(void 0!==t){this.active=!0;var e=$(t);if(e.find("img").length)this.loadNext();else{var i=$("<img/>",{sizes:e.attr("data-sizes"),srcset:e.attr("data-srcset"),alt:e.attr("data-alt")||""});this.addListener(i,"load,error","loadNext"),i.appendTo(e),picturefill({elements:[i[0]]})}}else this.active=!1}})},4233:function(){Craft.ElevatedSessionForm=Garnish.Base.extend({$form:null,inputs:null,init:function(t,e){if(this.$form=$(t),void 0!==e){this.inputs=[],e=$.makeArray(e);for(var i=0;i<e.length;i++)for(var s=$(e[i]),a=0;a<s.length;a++){var n=s.eq(a);this.inputs.push({input:n,val:Garnish.getInputPostVal(n)})}}this.addListener(this.$form,"submit","handleFormSubmit")},handleFormSubmit:function(t){if(Craft.elevatedSessionManager.fetchingTimeout)return t.preventDefault(),void t.stopImmediatePropagation();if(this.inputs){for(var e,i=!1,s=0;s<this.inputs.length;s++)if((e=this.inputs[s].input).data("passwordInput")&&(e=e.data("passwordInput").$currentInput),Garnish.getInputPostVal(e)!==this.inputs[s].val){i=!0;break}if(!i)return}t.preventDefault(),t.stopImmediatePropagation(),Craft.elevatedSessionManager.requireElevatedSession(this.submitForm.bind(this))},submitForm:function(){this.disable(),this.$form.trigger("submit"),this.enable()}})},9699:function(){Craft.ElevatedSessionManager=Garnish.Base.extend({fetchingTimeout:!1,passwordModal:null,$passwordInput:null,$submitBtn:null,$errorPara:null,callback:null,requireElevatedSession:function(t){var e=this;this.callback=t,this.fetchingTimeout=!0,Craft.sendActionRequest("POST","users/get-elevated-session-timeout").then((function(t){e.fetchingTimeout=!1,!1===t.data.timeout||t.data.timeout>=Craft.ElevatedSessionManager.minSafeElevatedSessionTimeout?e.callback():e.showPasswordModal()})).catch((function(){e.fetchingTimeout=!1}))},showPasswordModal:function(){var t=this;if(this.passwordModal)this.passwordModal.show();else{var e=$('<form id="elevatedsessionmodal" class="modal secure fitted"/>'),i=$('<div class="body"><p>'+Craft.t("app","Enter your password to continue.")+"</p></div>").appendTo(e),s=$('<div class="inputcontainer">').appendTo(i),a=$('<div class="flex"/>').appendTo(s),n=$('<div class="flex-grow"/>').appendTo(a),r=$("<td/>").appendTo(a),o=$('<div class="passwordwrapper"/>').appendTo(n);this.$passwordInput=$('<input type="password" class="text password fullwidth" placeholder="'+Craft.t("app","Password")+'" autocomplete="current-password"/>').appendTo(o),this.$submitBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Submit"),spinner:!0}).appendTo(r),this.$errorPara=$('<p class="error"/>').appendTo(i),this.passwordModal=new Garnish.Modal(e,{closeOtherModals:!1,onFadeIn:function(){setTimeout(t.focusPasswordInput.bind(t),100)},onFadeOut:function(){t.$passwordInput.val("")}}),new Craft.PasswordInput(this.$passwordInput,{onToggleInput:function(e){t.$passwordInput=e}}),this.addListener(this.$passwordInput,"input","validatePassword"),this.addListener(e,"submit","submitPassword")}},focusPasswordInput:function(){Garnish.isMobileBrowser(!0)||this.$passwordInput.trigger("focus")},validatePassword:function(){return this.$passwordInput.val().length>=6?(this.$submitBtn.removeClass("disabled"),!0):(this.$submitBtn.addClass("disabled"),!1)},submitPassword:function(t){var e=this;if(t&&t.preventDefault(),this.validatePassword()){this.$submitBtn.addClass("loading"),this.clearLoginError();var i={currentPassword:this.$passwordInput.val()};Craft.sendActionRequest("POST","users/start-elevated-session",{data:i}).then((function(t){e.$submitBtn.removeClass("loading"),e.passwordModal.hide(),e.callback()})).catch((function(t){var i=t.response;e.$submitBtn.removeClass("loading"),e.showPasswordError(i.data.message||Craft.t("app","Incorrect password.")),Garnish.shake(e.passwordModal.$container),e.focusPasswordInput()}))}},showPasswordError:function(t){null==t&&(t=Craft.t("app","A server error occurred.")),this.$errorPara.text(t),this.passwordModal.updateSizeAndPosition()},clearLoginError:function(){this.showPasswordError("")}},{minSafeElevatedSessionTimeout:5}),Craft.elevatedSessionManager=new Craft.ElevatedSessionManager},1402:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.EntryIndex=Craft.BaseElementIndex.extend({publishableSections:null,$newEntryBtnGroup:null,$newEntryBtn:null,init:function(t,e,i){this.publishableSections=[],this.on("selectSource",this.updateButton.bind(this)),this.on("selectSite",this.updateButton.bind(this)),this.base(t,e,i)},afterInit:function(){var t=this;this.publishableSections=Craft.publishableSections.filter((function(e){return!!t.getSourceByKey("section:".concat(e.uid))})),this.base()},getDefaultSourceKey:function(){if("index"===this.settings.context&&"undefined"!=typeof defaultSectionHandle){if("singles"===defaultSectionHandle)return"singles";for(var t=0;t<this.$sources.length;t++){var e=$(this.$sources[t]);if(e.data("handle")===defaultSectionHandle)return e.data("key")}}return this.base()},updateButton:function(){var e,i=this;if(this.$source&&(e="singles"===this.$source.data("key")?"singles":this.$source.data("handle"),this.publishableSections.length&&function(){i.$newEntryBtnGroup&&i.$newEntryBtnGroup.remove();var s,a=i.publishableSections.find((function(t){return t.handle===e}));i.$newEntryBtnGroup=$('<div class="btngroup submit" data-wrapper/>');var n="new-entry-menu-"+Craft.randomString(10);if(a){var r="index"===i.settings.context?Craft.t("app","New entry"):Craft.t("app","New {section} entry",{section:a.name}),o="index"===i.settings.context?Craft.t("app","New entry in the {section} section",{section:a.name}):r,l="index"===i.settings.context?"link":null;i.$newEntryBtn=Craft.ui.createButton({label:r,ariaLabel:o,spinner:!0,role:l}).addClass("submit add icon").appendTo(i.$newEntryBtnGroup),i.addListener(i.$newEntryBtn,"click mousedown",(function(t){"index"===i.settings.context&&("click"===t.type&&Garnish.isCtrlKeyPressed(t)||"mousedown"===t.type&&1===t.originalEvent.button)?window.open(Craft.getUrl("entries/".concat(a.handle,"/new"))):"click"===t.type&&i._createEntry(a.id)})),i.publishableSections.length>1&&(s=$("<button/>",{type:"button",class:"btn submit menubtn btngroup-btn-last","aria-controls":n,"data-disclosure-trigger":"","aria-label":Craft.t("app","New entry, choose a section")}).appendTo(i.$newEntryBtnGroup))}else i.$newEntryBtn=s=Craft.ui.createButton({label:Craft.t("app","New entry"),ariaLabel:Craft.t("app","New entry, choose a section"),spinner:!0}).addClass("submit add icon menubtn btngroup-btn-last").attr("aria-controls",n).attr("data-disclosure-trigger","").appendTo(i.$newEntryBtnGroup);if(i.addButton(i.$newEntryBtnGroup),s){var h,d=$("<div/>",{id:n,class:"menu menu--disclosure"}).appendTo(i.$newEntryBtnGroup),c=$("<ul/>").appendTo(d),u=function(e,i){var s="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!s){if(Array.isArray(e)||(s=function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e))||i&&e&&"number"==typeof e.length){s&&(e=s);var a=0,n=function(){};return{s:n,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){s=s.call(e)},n:function(){var t=s.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==s.return||s.return()}finally{if(l)throw r}}}}(i.publishableSections);try{var p=function(){var t=h.value,e="index"===i.settings.context?"link":"button";if("index"===i.settings.context&&-1!==$.inArray(i.siteId,t.sites)||"index"!==i.settings.context&&t!==a){var n=$("<li/>").appendTo(c),r=$("<a/>",{role:"button"===e?"button":null,href:"#",type:"button"===e?"button":null,text:Craft.t("app","New {section} entry",{section:t.name})}).appendTo(n);i.addListener(r,"click",(function(){s.data("trigger").hide(),i._createEntry(t.id)})),"button"===e&&i.addListener(r,"keydown",(function(e){e.keyCode===Garnish.SPACE_KEY&&(e.preventDefault(),s.data("trigger").hide(),i._createEntry(t.id))}))}};for(u.s();!(h=u.n()).done;)p()}catch(t){u.e(t)}finally{u.f()}new Garnish.DisclosureMenu(s)}}(),"index"===this.settings.context)){var s="entries";e&&(s+="/"+e),Craft.setPath(s)}},_createEntry:function(t){var e=this;if(this.$newEntryBtn.hasClass("loading"))console.warn("New entry creation already in progress.");else{var i=this.publishableSections.find((function(e){return e.id===t}));if(!i)throw"Invalid section ID: ".concat(t);this.$newEntryBtn.addClass("loading"),Craft.sendActionRequest("POST","entries/create",{data:{siteId:this.siteId,section:i.handle}}).then((function(t){var s=t.data;"index"===e.settings.context?document.location.href=Craft.getUrl(s.cpEditUrl,{fresh:1}):Craft.createElementEditor(e.elementType,{siteId:e.siteId,elementId:s.entry.id,draftId:s.entry.draftId,params:{fresh:1}}).on("submit",(function(){var t="section:".concat(i.uid);e.sourceKey!==t&&e.selectSourceByKey(t),e.clearSearch(),e.setSelectedSortAttribute("dateCreated","desc"),e.selectElementAfterUpdate(s.entry.id),e.updateElements()}))})).finally((function(){e.$newEntryBtn.removeClass("loading")}))}}}),Craft.registerElementIndexClass("craft\\elements\\Entry",Craft.EntryIndex)},8201:function(){Craft.FieldLayoutDesigner=Garnish.Base.extend({$container:null,$configInput:null,$tabContainer:null,$newTabBtn:null,$sidebar:null,$libraryToggle:null,$selectedLibrary:null,$fieldLibrary:null,$uiLibrary:null,$uiLibraryElements:null,$fieldSearch:null,$clearFieldSearchBtn:null,$fieldGroups:null,$fields:null,tabGrid:null,elementDrag:null,_config:null,init:function(t,e){var i=this;this.$container=$(t),this.setSettings(e,Craft.FieldLayoutDesigner.defaults),this.$configInput=this.$container.children("input[data-config-input]"),this._config=JSON.parse(this.$configInput.val()),this._config.tabs||(this._config.tabs=[]);var s=this.$container.children(".fld-workspace");this.$tabContainer=s.children(".fld-tabs"),this.$newTabBtn=s.children(".fld-new-tab-btn"),this.$sidebar=this.$container.children(".fld-sidebar"),this.$fieldLibrary=this.$selectedLibrary=this.$sidebar.children(".fld-field-library");var a=this.$fieldLibrary.children(".search");this.$fieldSearch=a.children("input"),this.$clearFieldSearchBtn=a.children(".clear"),this.$fieldGroups=this.$sidebar.find(".fld-field-group"),this.$fields=this.$fieldGroups.children(".fld-element"),this.$uiLibrary=this.$sidebar.children(".fld-ui-library"),this.$uiLibraryElements=this.$uiLibrary.children(),this.tabGrid=new Craft.Grid(this.$tabContainer,{itemSelector:".fld-tab",minColWidth:264,fillMode:"grid",snapToGrid:24});for(var n=this.$tabContainer.children(),r=0;r<n.length;r++)this.initTab($(n[r]));if(this.elementDrag=new Craft.FieldLayoutDesigner.ElementDrag(this),this.settings.customizableTabs&&(this.tabDrag=new Craft.FieldLayoutDesigner.TabDrag(this),this.addListener(this.$newTabBtn,"activate","addTab")),this.settings.customizableUi){var o=this.$sidebar.children(".btngroup");new Craft.Listbox(o,{onChange:function(t){i.$selectedLibrary.addClass("hidden"),i.$selectedLibrary=i["$".concat(t.data("library"),"Library")].removeClass("hidden")}})}this.addListener(this.$fieldSearch,"input",(function(){var t=i.$fieldSearch.val().toLowerCase().replace(/['"]/g,"");if(!t)return i.$fieldLibrary.find(".filtered").removeClass("filtered"),void i.$clearFieldSearchBtn.addClass("hidden");i.$clearFieldSearchBtn.removeClass("hidden");var e=i.$fields.filter('[data-keywords*="'.concat(t,'"]')).add(i.$fieldGroups.filter('[data-name*="'.concat(t,'"]')).children(".fld-element")).removeClass("filtered");i.$fields.not(e).addClass("filtered");for(var s=0;s<i.$fieldGroups.length;s++){var a=i.$fieldGroups.eq(s);a.find(".fld-element:not(.hidden):not(.filtered)").length?a.removeClass("filtered"):a.addClass("filtered")}})),this.addListener(this.$fieldSearch,"keydown",(function(t){switch(t.keyCode){case Garnish.ESC_KEY:i.$fieldSearch.val("").trigger("input");break;case Garnish.RETURN_KEY:t.preventDefault()}})),this.addListener(this.$clearFieldSearchBtn,"click",(function(){i.$fieldSearch.val("").trigger("input")}))},initTab:function(t){return new Craft.FieldLayoutDesigner.Tab(this,t)},removeFieldByHandle:function(t){this.$fields.filter('[data-attribute="'.concat(t,'"]:first')).removeClass("hidden").closest(".fld-field-group").removeClass("hidden")},addTab:function(){if(this.settings.customizableTabs){var t=Craft.escapeHtml(prompt(Craft.t("app","Give your tab a name.")));if(t){var e=$('\n<div class="fld-tab">\n  <div class="tabs">\n    <div class="tab sel draggable">\n      <span>'.concat(t,'</span>\n      <a class="settings icon" title="').concat(Craft.t("app","Settings"),'"></a>\n    </div>\n  </div>\n  <div class="fld-tabcontent"></div>\n</div>\n')).appendTo(this.$tabContainer);this.tabGrid.addItems(e),this.tabDrag.addItems(e),this.initTab(e).updatePositionInConfig()}}},get config(){return this._config},set config(t){this._config=t,this.$configInput.val(JSON.stringify(t))},updateConfig:function(t){var e=t(this.config);!1!==e&&(this.config=e)}},{defaults:{customizableTabs:!0,customizableUi:!0},createSlideout:function createSlideout(contents,js){var $body=$("<div/>",{class:"fld-element-settings-body"});$("<div/>",{class:"fields",html:contents}).appendTo($body);var $footer=$("<div/>",{class:"fld-element-settings-footer"});$("<div/>",{class:"flex-grow"}).appendTo($footer);var $cancelBtn=Craft.ui.createButton({label:Craft.t("app","Close"),spinner:!0}).appendTo($footer);Craft.ui.createSubmitButton({class:"secondary",label:Craft.t("app","Apply"),spinner:!0}).appendTo($footer);var $contents=$body.add($footer),slideout=new Craft.Slideout($contents,{containerElement:"form",containerAttributes:{action:"",method:"post",novalidate:"",class:"fld-element-settings"}});return slideout.on("open",(function(){Garnish.requestAnimationFrame((function(){slideout.$container.find(".text:first").trigger("focus")}))})),$cancelBtn.on("click",(function(){slideout.close()})),js&&eval(js),Craft.initUiElements(slideout.$container),slideout}}),Craft.FieldLayoutDesigner.Tab=Garnish.Base.extend({designer:null,uid:null,$container:null,slideout:null,destroyed:!1,init:function(t,e){this.designer=t,this.$container=e,this.$container.data("fld-tab",this),this.uid=this.$container.data("uid"),this.uid||(this.uid=Craft.uuid(),this.config={uid:this.uid,name:this.$container.find(".tabs .tab span").text(),elements:[]},this.$container.data("settings-namespace",this.designer.$container.data("new-tab-settings-namespace").replace(/\bTAB_UID\b/g,this.uid)),this.$container.data("settings-html",this.designer.$container.data("new-tab-settings-html").replace(/\bTAB_UID\b/g,this.uid).replace(/\bTAB_NAME\b/g,this.config.name)),this.$container.data("settings-js",this.designer.$container.data("new-tab-settings-js").replace(/\bTAB_UID\b/g,this.uid))),this.designer.settings.customizableTabs&&(this.settingsNamespace=this.$container.data("settings-namespace"),this.createMenu());for(var i=this.$container.children(".fld-tabcontent").children(),s=0;s<i.length;s++)this.initElement($(i[s]))},createMenu:function(){var t=this,e=this.$container.find(".tabs .settings");$('<div class="menu" data-align="center"/>').insertAfter(e).append($("<ul/>").append($("<li/>").append($("<a/>",{"data-action":"settings",text:Craft.t("app","Settings")}))).append($("<li/>").append($("<a/>",{"data-action":"remove",text:Craft.t("app","Remove")})))).append($("<hr/>")).append($("<ul/>").append($("<li/>").append($("<a/>",{"data-action":"moveLeft",text:Craft.t("app","Move to the left")}))).append($("<li/>").append($("<a/>",{"data-action":"moveRight",text:Craft.t("app","Move to the right")}))));var i=new Garnish.MenuBtn(e,{onOptionSelect:this.onTabOptionSelect.bind(this)});i.menu.on("show",(function(){t.$container.prev(".fld-tab").length?i.menu.$container.find("[data-action=moveLeft]").removeClass("disabled"):i.menu.$container.find("[data-action=moveLeft]").addClass("disabled"),t.$container.next(".fld-tab").length?i.menu.$container.find("[data-action=moveRight]").removeClass("disabled"):i.menu.$container.find("[data-action=moveRight]").addClass("disabled")}))},onTabOptionSelect:function(t){if(this.designer.settings.customizableTabs)switch($(t).data("action")){case"settings":this.slideout?this.slideout.open():this.createSettings();break;case"remove":this.destroy();break;case"moveLeft":var e=this.$container.prev(".fld-tab");e.length&&(this.$container.insertBefore(e),this.updatePositionInConfig());break;case"moveRight":var i=this.$container.next(".fld-tab");i.length&&(this.$container.insertAfter(i),this.updatePositionInConfig())}},createSettings:function(){var t=this,e=this.$container.data("settings-html"),i=this.$container.data("settings-js");this.slideout=Craft.FieldLayoutDesigner.createSlideout(e,i),this.slideout.$container.on("submit",(function(e){e.preventDefault(),t.applySettings()}))},applySettings:function(){var t=this;if(this.slideout.$container.find('[name$="[name]"]').val()){var e=this.slideout.$container.find("button[type=submit]").addClass("loading"),i=$.extend({},this.config);delete i.elements,Craft.sendActionRequest("POST","fields/apply-layout-tab-settings",{data:{config:i,settingsNamespace:this.settingsNamespace,settings:this.slideout.$container.serialize()}}).then((function(e){t.updateConfig((function(t){return $.extend(e.data.config,{elements:t.elements})}));var i=t.$container.find(".tabs .tab span"),s=i.children(".fld-indicator");e.data.hasConditions?s.length||i.append($("<div/>",{class:"fld-indicator",title:Craft.t("app","This tab is conditional"),"aria-label":Craft.t("app","This tab is conditional"),"data-icon":"condition"})):s.length&&s.remove(),t.slideout.close()})).catch((function(t){Craft.cp.displayError(),console.error(t)})).finally((function(){e.removeClass("loading"),t.slideout.close()}))}else alert(Craft.t("app","You must specify a tab name."))},initElement:function(t){return new Craft.FieldLayoutDesigner.Element(this,t)},get index(){var t=this;return this.designer.config.tabs.findIndex((function(e){return e.uid===t.uid}))},get config(){var t=this;if(!this.uid)throw"Tab is missing its UID";var e=this.designer.config.tabs.find((function(e){return e.uid===t.uid}));return e||(e={uid:this.uid,elements:[]},this.config=e),e},set config(t){if(!this.destroyed){t.name&&t.name!==this.config.name&&this.$container.find(".tabs .tab span").text(t.name);var e=this.designer.config,i=this.index;if(-1!==i)e.tabs[i]=t;else{var s=$.inArray(this.$container[0],this.$container.parent().children(".fld-tab"));e.tabs.splice(s,0,t)}this.designer.config=e}},updateConfig:function(t){if(!this.destroyed){var e=t(this.config);!1!==e&&(this.config=e)}},updatePositionInConfig:function(){var t=this;this.destroyed||this.designer.updateConfig((function(e){var i=t.config,s=t.index,a=$.inArray(t.$container[0],t.$container.parent().children(".fld-tab"));return-1!==s&&e.tabs.splice(s,1),e.tabs.splice(a,0,i),e}))},destroy:function(){var t=this;if(!this.destroyed){this.destroyed=!0,this.designer.updateConfig((function(e){var i=t.index;return-1!==i&&(e.tabs.splice(i,1),e)}));for(var e=this.$container.find(".fld-element"),i=0;i<e.length;i++)e.eq(i).data("fld-element").destroy();this.designer.tabGrid.removeItems(this.$container),this.designer.tabDrag.removeItems(this.$container),this.$container.remove(),this.base()}}}),Craft.FieldLayoutDesigner.Element=Garnish.Base.extend({tab:null,$container:null,$settingsContainer:null,$editBtn:null,uid:null,isField:!1,attribute:null,requirable:!1,hasCustomWidth:!1,hasSettings:!1,settingsNamespace:null,slideout:null,init:function(t,e){var i=this;this.tab=t,this.$container=e,this.$container.data("fld-element",this),this.uid=this.$container.data("uid"),this.uid||(this.uid=Craft.uuid(),this.config=$.extend(this.$container.data("config"),{uid:this.uid})),this.isField=this.$container.hasClass("fld-field"),this.requirable=this.isField&&Garnish.hasAttr(this.$container,"data-requirable"),this.isField&&(this.attribute=this.$container.data("attribute")),this.settingsNamespace=this.$container.data("settings-namespace").replace(/\bELEMENT_UID\b/g,this.uid);var s=(this.$container.data("settings-html")||"").replace(/\bELEMENT_UID\b/g,this.uid),a=this.requirable&&this.$container.hasClass("fld-required");if(this.hasCustomWidth=this.tab.designer.settings.customizableUi&&Garnish.hasAttr(this.$container,"data-has-custom-width"),this.hasSettings=s||this.requirable,this.hasSettings){this.$settingsContainer=$("<div/>",{class:"hidden"}),this.$editBtn=$("<a/>",{role:"button",tabindex:0,class:"settings icon",title:Craft.t("app","Edit")});var n=function(){i.slideout?i.slideout.open():i.createSettings(s,a)};this.$editBtn.on("click",n),this.$container.on("dblclick",n)}this.initUi(),this.$container.attr("data-keywords",null),this.$container.attr("data-settings-html",null)},initUi:function(){var t=this;this.hasCustomWidth&&new Craft.SlidePicker(this.config.width||100,{min:25,max:100,step:25,valueLabel:function(t){return Craft.t("app","{pct} width",{pct:"".concat(t,"%")})},onChange:function(e){t.updateConfig((function(t){return t.width=e,t}))}}).$container.appendTo(this.$container),this.hasSettings&&this.$editBtn.appendTo(this.$container)},createSettings:function(t,e){var i=this,s=(this.$container.data("settings-js")||"").replace(/\bELEMENT_UID\b/g,this.uid);if(this.slideout=Craft.FieldLayoutDesigner.createSlideout(t,s),this.slideout.$container.on("submit",(function(t){t.preventDefault(),i.applySettings()})),this.requirable){var a=this.slideout.$container.find(".fields:first");Craft.ui.createLightswitchField({label:Craft.t("app","Required"),name:"".concat(this.settingsNamespace,"[required]"),on:e}).prependTo(a)}this.trigger("createSettings")},applySettings:function(){var t=this,e=this.slideout.$container.find("button[type=submit]").addClass("loading");Craft.sendActionRequest("POST","fields/apply-layout-element-settings",{data:{config:this.config,settingsNamespace:this.settingsNamespace,settings:this.slideout.$container.serialize()}}).then((function(e){t.config=e.data.config,t.$editBtn.detach(),t.$container.html($(e.data.selectorHtml).html()),t.initUi()})).catch((function(t){Craft.cp.displayError(),console.error(t)})).finally((function(){e.removeClass("loading"),t.updateRequiredClass(),t.slideout.close()}))},updateRequiredClass:function(){this.requirable&&(this.config.required?this.$container.addClass("fld-required"):this.$container.removeClass("fld-required"))},get index(){var t=this,e=this.tab.config;return void 0===e?-1:e.elements.findIndex((function(e){return e.uid===t.uid}))},get config(){var t=this;if(!this.uid)throw"Tab is missing its UID";var e=this.tab.config.elements.find((function(e){return e.uid===t.uid}));return e||(e={uid:this.uid},this.config=e),e},set config(t){var e=this.tab.config,i=this.index;if(-1!==i)e.elements[i]=t;else{var s=$.inArray(this.$container[0],this.$container.parent().children(".fld-element"));e.elements.splice(s,0,t)}this.tab.config=e},updateConfig:function(t){var e=t(this.config);!1!==e&&(this.config=e)},updatePositionInConfig:function(){var t=this;this.tab.updateConfig((function(e){var i=t.config,s=t.index,a=$.inArray(t.$container[0],t.$container.parent().children(".fld-element"));return-1!==s&&e.elements.splice(s,1),e.elements.splice(a,0,i),e}))},destroy:function(){var t=this;this.tab.updateConfig((function(e){var i=t.index;return-1!==i&&(e.elements.splice(i,1),e)})),this.tab.designer.elementDrag.removeItems(this.$container),this.$container.remove(),this.isField&&this.tab.designer.removeFieldByHandle(this.attribute),this.base()}}),Craft.FieldLayoutDesigner.BaseDrag=Garnish.Drag.extend({designer:null,$insertion:null,showingInsertion:!1,$caboose:null,init:function(t,e){this.designer=t,this.base(this.findItems(),e)},onDragStart:function(){this.base(),this.$insertion=this.createInsertion(),this.$caboose=this.createCaboose(),this.$items=$().add(this.$items.add(this.$caboose)),Garnish.$bod.addClass("dragging")},removeCaboose:function(){this.$items=this.$items.not(this.$caboose),this.$caboose.remove()},swapDraggeeWithInsertion:function(){this.$insertion.insertBefore(this.$draggee),this.$draggee.detach(),this.$items=$().add(this.$items.not(this.$draggee).add(this.$insertion)),this.showingInsertion=!0},swapInsertionWithDraggee:function(){this.$insertion.replaceWith(this.$draggee),this.$items=$().add(this.$items.not(this.$insertion).add(this.$draggee)),this.showingInsertion=!1},setMidpoints:function(){for(var t=0;t<this.$items.length;t++){var e=$(this.$items[t]),i=e.offset();e.hasClass("unused")||e.data("midpoint",{left:i.left+e.outerWidth()/2,top:i.top+e.outerHeight()/2})}},getClosestItem:function(){for(this.getClosestItem._closestItem=null,this.getClosestItem._closestItemMouseDiff=null,this.getClosestItem._i=0;this.getClosestItem._i<this.$items.length;this.getClosestItem._i++)this.getClosestItem._$item=$(this.$items[this.getClosestItem._i]),this.getClosestItem._midpoint=this.getClosestItem._$item.data("midpoint"),this.getClosestItem._midpoint&&(this.getClosestItem._mouseDiff=Garnish.getDist(this.getClosestItem._midpoint.left,this.getClosestItem._midpoint.top,this.mouseX,this.mouseY),(null===this.getClosestItem._closestItem||this.getClosestItem._mouseDiff<this.getClosestItem._closestItemMouseDiff)&&(this.getClosestItem._closestItem=this.getClosestItem._$item[0],this.getClosestItem._closestItemMouseDiff=this.getClosestItem._mouseDiff));return this.getClosestItem._closestItem},checkForNewClosestItem:function(){this.checkForNewClosestItem._closestItem=this.getClosestItem(),this.checkForNewClosestItem._closestItem!==this.$insertion[0]&&(this.showingInsertion&&$.inArray(this.$insertion[0],this.$items)<$.inArray(this.checkForNewClosestItem._closestItem,this.$items)&&-1===$.inArray(this.checkForNewClosestItem._closestItem,this.$caboose)?this.$insertion.insertAfter(this.checkForNewClosestItem._closestItem):this.$insertion.insertBefore(this.checkForNewClosestItem._closestItem),this.$items=$().add(this.$items.add(this.$insertion)),this.showingInsertion=!0,this.designer.tabGrid.refreshCols(!0),this.setMidpoints())},onDragStop:function(){var t=this;this.showingInsertion&&this.swapInsertionWithDraggee(),this.removeCaboose(),this.designer.tabGrid.refreshCols(!0);var e=this.$draggee.offset();!e||0===e.top&&0===e.left?(this.$draggee.css({display:this.draggeeDisplay,visibility:"visible",opacity:0}).velocity({opacity:1},Garnish.FX_DURATION),this.helpers[0].velocity({opacity:0},Garnish.FX_DURATION,(function(){t._showDraggee()}))):this.returnHelpersToDraggees(),this.base(),Garnish.$bod.removeClass("dragging")}}),Craft.FieldLayoutDesigner.TabDrag=Craft.FieldLayoutDesigner.BaseDrag.extend({init:function(t){this.base(t,{handle:".tab"})},findItems:function(){return this.designer.$tabContainer.find("> div.fld-tab")},onDragStart:function(){this.base(),this.swapDraggeeWithInsertion(),this.setMidpoints()},swapDraggeeWithInsertion:function(){this.base(),this.designer.tabGrid.removeItems(this.$draggee),this.designer.tabGrid.addItems(this.$insertion)},swapInsertionWithDraggee:function(){this.base(),this.designer.tabGrid.removeItems(this.$insertion),this.designer.tabGrid.addItems(this.$draggee)},onDrag:function(){this.checkForNewClosestItem(),this.base()},onDragStop:function(){this.base(),this.$draggee.css({display:this.draggeeDisplay,visibility:"hidden"}),this.$draggee.data("fld-tab").updatePositionInConfig()},createCaboose:function(){var t=$('<div class="fld-tab fld-tab-caboose"/>').appendTo(this.designer.$tabContainer);return this.designer.tabGrid.addItems(t),t},removeCaboose:function(){this.base(),this.designer.tabGrid.removeItems(this.$caboose)},createInsertion:function(){var t=this.$draggee.find(".tab");return $('\n<div class="fld-tab fld-insertion" style="height: '.concat(this.$draggee.height(),'px;">\n  <div class="tabs"><div class="tab sel draggable" style="width: ').concat(t.width(),"px; height: ").concat(t.height(),'px;"></div></div>\n  <div class="fld-tabcontent" style="height: ').concat(this.$draggee.find(".fld-tabcontent").height(),'px;"></div>\n</div>\n'))}}),Craft.FieldLayoutDesigner.ElementDrag=Craft.FieldLayoutDesigner.BaseDrag.extend({draggingLibraryElement:!1,draggingField:!1,originalTab:null,onDragStart:function(){this.base(),this.draggingLibraryElement=this.$draggee.hasClass("unused"),this.draggingField=this.$draggee.hasClass("fld-field"),this.draggingLibraryElement&&!this.draggingField&&this.$draggee.css({display:this.draggeeDisplay,visibility:"visible"}),this.draggingLibraryElement?this.originalTab=null:(this.originalTab=this.$draggee.closest(".fld-tab").data("fld-tab"),this.swapDraggeeWithInsertion()),this.setMidpoints()},onDrag:function(){this.isDraggeeMandatory()||this.isHoveringOverTab()?this.checkForNewClosestItem():this.showingInsertion&&(this.$insertion.remove(),this.$items=$().add(this.$items.not(this.$insertion)),this.showingInsertion=!1,this.designer.tabGrid.refreshCols(!0),this.setMidpoints()),this.base()},isDraggeeMandatory:function(){return Garnish.hasAttr(this.$draggee,"data-mandatory")},isHoveringOverTab:function(){for(var t=0;t<this.designer.tabGrid.$items.length;t++)if(Garnish.hitTest(this.mouseX,this.mouseY,this.designer.tabGrid.$items.eq(t)))return!0;return!1},findItems:function(){return this.designer.$tabContainer.find(".fld-element").add(this.designer.$sidebar.find(".fld-element"))},createCaboose:function(){for(var t=$(),e=this.designer.$tabContainer.find("> .fld-tab > .fld-tabcontent"),i=0;i<e.length;i++)t=t.add($("<div/>").appendTo(e[i]));return t},createInsertion:function(){return $('<div class="fld-element fld-insertion" style="height: '.concat(this.$draggee.outerHeight(),'px;"/>'))},onDragStop:function(){var t=this.showingInsertion;if(t){if(this.draggingLibraryElement){var e=this.$draggee.clone().removeClass("unused");this.draggingField&&(this.$draggee.css({visibility:"inherit",display:"field"}).addClass("hidden"),0===this.$draggee.siblings(".fld-field:not(.hidden)").length&&this.$draggee.closest(".fld-field-group").addClass("hidden")),this.$draggee=e,this.addItems(e)}}else if(!this.draggingLibraryElement){var i=this.draggingField?this.designer.$fields.filter('[data-attribute="'.concat(this.$draggee.data("attribute"),'"]:first')):this.designer.$uiLibraryElements.filter('[data-type="'.concat(this.$draggee.data("type"),'"]:first'));this.draggingField&&(i.removeClass("hidden"),i.closest(".fld-field-group").removeClass("hidden")),this.$draggee.data("fld-element").destroy(),this.$draggee=i}if(this.base(),this.$draggee.css({display:this.draggeeDisplay,visibility:this.draggingField||t?"hidden":"visible"}),t){var s,a=this.$draggee.closest(".fld-tab").data("fld-tab");if(this.draggingLibraryElement)s=a.initElement(this.$draggee);else if(s=this.$draggee.data("fld-element"),a!==this.originalTab){var n=s.config;this.originalTab.updateConfig((function(t){var e=s.index;return-1!==e&&(t.elements.splice(e,1),t)})),this.$draggee.data("fld-element").tab=a,s.config=n}s.updatePositionInConfig()}}})},3347:function(){Craft.FieldToggle=Garnish.Base.extend({$toggle:null,targetPrefix:null,targetSelector:null,reverseTargetSelector:null,_$target:null,_$reverseTarget:null,type:null,init:function(t){switch(this.$toggle=$(t),this.$toggle.data("fieldtoggle")&&(console.warn("Double-instantiating a field toggle on an element"),this.$toggle.data("fieldtoggle").destroy()),this.$toggle.data("fieldtoggle",this),this.type=this.getType(),"select"===this.type||"fieldset"===this.type?this.targetPrefix=this.$toggle.attr("data-target-prefix")||"":(this.targetSelector=this.normalizeTargetSelector(this.$toggle.data("target")),this.reverseTargetSelector=this.normalizeTargetSelector(this.$toggle.data("reverse-target"))),this.findTargets(),this.type){case"link":this.addListener(this.$toggle,"click","onToggleChange");break;case"fieldset":this.addListener(this.$toggle.find("input"),"change","onToggleChange");break;default:this.addListener(this.$toggle,"change","onToggleChange"),this.onToggleChange()}},normalizeTargetSelector:function(t){return t&&!t.match(/^[#\.]/)&&(t="#"+t),t},getType:function(){var t=this.$toggle.prop("nodeName");if("INPUT"===t&&"checkbox"===this.$toggle.attr("type")||"checkbox"===this.$toggle.attr("role")||"switch"===this.$toggle.attr("role"))return"checkbox";switch(t){case"SELECT":return Garnish.hasAttr(this.$toggle,"data-boolean-menu")?"booleanMenu":"select";case"A":return"link";default:return"fieldset"}},findTargets:function(){"select"===this.type||"fieldset"===this.type?(this.getToggleVal(),this._$target=$(this.normalizeTargetSelector(this.targetPrefix+this.getToggleVal()))):(this.targetSelector&&(this._$target=$(this.targetSelector)),this.reverseTargetSelector&&(this._$reverseTarget=$(this.reverseTargetSelector)))},getToggleVal:function(){switch(this.type){case"checkbox":return void 0!==this.$toggle.prop("checked")?this.$toggle.prop("checked"):"true"===this.$toggle.attr("aria-checked");case"booleanMenu":var t=this.$toggle.data("boolean");if(void 0!==t)return t;var e=this.$toggle.val();return e&&"0"!==e;default:var i;return null==(i="fieldset"===this.type?this.$toggle.find("input:checked:first").val():Garnish.getInputPostVal(this.$toggle))?null:i.replace(/[^\w]+/g,"-")}},onToggleChange:function(){"select"===this.type||"fieldset"===this.type?(this.hideTarget(this._$target),this.findTargets(),this.showTarget(this._$target)):(this.findTargets(),"link"===this.type?this.onToggleChange._show=this.$toggle.hasClass("collapsed")||!this.$toggle.hasClass("expanded"):this.onToggleChange._show=!!this.getToggleVal(),this.onToggleChange._show?(this.showTarget(this._$target),this.hideTarget(this._$reverseTarget)):(this.hideTarget(this._$target),this.showTarget(this._$reverseTarget)),delete this.onToggleChange._show)},showTarget:function(t){var e=this;if(t&&t.length){if(this.showTarget._currentHeight=t.height(),t.removeClass("hidden"),"select"!==this.type&&"fieldset"!==this.type){"link"===this.type&&(this.$toggle.removeClass("collapsed"),this.$toggle.addClass("expanded"));for(var i=0;i<t.length;i++)!function(t){"SPAN"!==t.prop("nodeName")&&(t.height("auto"),e.showTarget._targetHeight=t.height(),t.css({height:e.showTarget._currentHeight,overflow:"hidden"}),t.velocity("stop"),t.velocity({height:e.showTarget._targetHeight},"fast",(function(){t.css({height:"",overflow:""})})))}(t.eq(i));delete this.showTarget._targetHeight}delete this.showTarget._currentHeight,Garnish.$win.trigger("resize")}},hideTarget:function(t){if(t&&t.length)if("select"===this.type||"fieldset"===this.type)t.addClass("hidden");else{"link"===this.type&&(this.$toggle.removeClass("expanded"),this.$toggle.addClass("collapsed"));for(var e=0;e<t.length;e++)!function(t){t.hasClass("hidden")||("SPAN"===t.prop("nodeName")?t.addClass("hidden"):(t.css("overflow","hidden"),t.velocity("stop"),t.velocity({height:0},"fast",(function(){t.addClass("hidden")}))))}(t.eq(e))}},destroy:function(){this.$toggle.removeData("fieldtoggle"),this.base()}})},9478:function(){Craft.Grid=Garnish.Base.extend({$container:null,$items:null,items:null,totalCols:null,colGutterDrop:null,colPctWidth:null,possibleItemColspans:null,possibleItemPositionsByColspan:null,itemPositions:null,itemColspansByPosition:null,layouts:null,layout:null,itemHeights:null,leftPadding:null,_refreshingCols:!1,_refreshColsAfterRefresh:!1,_forceRefreshColsAfterRefresh:!1,init:function(t,e){var i=this;this.$container=$(t),this.$container.data("grid")&&(console.warn("Double-instantiating a grid on an element"),this.$container.data("grid").destroy()),this.$container.data("grid",this),this.setSettings(e,Craft.Grid.defaults),this.handleContainerHeightProxy=function(){i.refreshCols(!1,!0)},this.$items=this.$container.children(this.settings.itemSelector),this.setItems(),this.refreshCols(!0,!1),Garnish.$doc.ready((function(){i.refreshCols(!1,!1)}))},addItems:function(t){this.$items=$().add(this.$items.add(t)),this.setItems(),this.refreshCols(!0,!0)},removeItems:function(t){this.$items=$().add(this.$items.not(t)),this.setItems(),this.refreshCols(!0,!0)},resetItemOrder:function(){this.$items=$().add(this.$items),this.setItems(),this.refreshCols(!0,!0)},setItems:function(){for(this.setItems._={},this.items=[],this.setItems._.i=0;this.setItems._.i<this.$items.length;this.setItems._.i++)this.items.push($(this.$items[this.setItems._.i]));delete this.setItems._},refreshCols:function(t){if(this._refreshingCols)return this._refreshColsAfterRefresh=!0,void(t&&(this._forceRefreshColsAfterRefresh=!0));if(this._refreshingCols=!0,this.items.length)if(this.refreshCols._={},this.refreshCols._.oldHeight=this.$container[0].style.height,this.$container[0].style.height=1,this.refreshCols._.scrollHeight=this.$container[0].scrollHeight,this.$container[0].style.height=this.refreshCols._.oldHeight,0!==this.refreshCols._.scrollHeight)if(this.settings.cols?this.refreshCols._.totalCols=this.settings.cols:(this.refreshCols._.totalCols=Math.floor(this.$container.width()/this.settings.minColWidth),null!==this.totalCols&&this.refreshCols._.totalCols>this.totalCols&&(this.refreshCols._.totalCols=Math.floor((this.$container.width()-20)/this.settings.minColWidth)),this.settings.maxCols&&this.refreshCols._.totalCols>this.settings.maxCols&&(this.refreshCols._.totalCols=this.settings.maxCols)),0===this.refreshCols._.totalCols&&(this.refreshCols._.totalCols=1),!0===t||this.totalCols!==this.refreshCols._.totalCols){if(this.totalCols=this.refreshCols._.totalCols,this.colGutterDrop=this.settings.gutter*(this.totalCols-1)/this.totalCols,this.removeListener(this.$container,"resize"),"grid"===this.settings.fillMode)for(this.refreshCols._.itemIndex=0;this.refreshCols._.itemIndex<this.items.length;){for(this.refreshCols._.tallestItemHeight=-1,this.refreshCols._.colIndex=0,this.refreshCols._.i=this.refreshCols._.itemIndex;this.refreshCols._.i<this.refreshCols._.itemIndex+this.totalCols&&this.refreshCols._.i<this.items.length;this.refreshCols._.i++)this.refreshCols._.itemHeight=this.items[this.refreshCols._.i].height("auto").height(),this.refreshCols._.itemHeight>this.refreshCols._.tallestItemHeight&&(this.refreshCols._.tallestItemHeight=this.refreshCols._.itemHeight),this.refreshCols._.colIndex++;for(this.settings.snapToGrid&&(this.refreshCols._.remainder=this.refreshCols._.tallestItemHeight%this.settings.snapToGrid,this.refreshCols._.remainder&&(this.refreshCols._.tallestItemHeight+=this.settings.snapToGrid-this.refreshCols._.remainder)),this.refreshCols._.i=this.refreshCols._.itemIndex;this.refreshCols._.i<this.refreshCols._.itemIndex+this.totalCols&&this.refreshCols._.i<this.items.length;this.refreshCols._.i++)this.items[this.refreshCols._.i].height(this.refreshCols._.tallestItemHeight);this.refreshCols._.itemIndex+=this.totalCols}else if(this.removeListener(this.$items,"resize"),1===this.totalCols)this.$container.height("auto"),this.$items.show().css({position:"relative",width:"auto",top:0}).css(Craft.left,0);else{for(this.$items.css("position","absolute"),this.colPctWidth=100/this.totalCols,this.layouts=[],this.itemPositions=[],this.itemColspansByPosition=[],this.possibleItemColspans=[],this.possibleItemPositionsByColspan=[],this.itemHeightsByColspan=[],this.refreshCols._.item=0;this.refreshCols._.item<this.items.length;this.refreshCols._.item++)for(this.possibleItemColspans[this.refreshCols._.item]=[],this.possibleItemPositionsByColspan[this.refreshCols._.item]={},this.itemHeightsByColspan[this.refreshCols._.item]={},this.refreshCols._.$item=this.items[this.refreshCols._.item].show(),this.refreshCols._.positionRight="right"===this.refreshCols._.$item.data("position"),this.refreshCols._.positionLeft="left"===this.refreshCols._.$item.data("position"),this.refreshCols._.minColspan=this.refreshCols._.$item.data("colspan")?this.refreshCols._.$item.data("colspan"):this.refreshCols._.$item.data("min-colspan")?this.refreshCols._.$item.data("min-colspan"):1,this.refreshCols._.maxColspan=this.refreshCols._.$item.data("colspan")?this.refreshCols._.$item.data("colspan"):this.refreshCols._.$item.data("max-colspan")?this.refreshCols._.$item.data("max-colspan"):this.totalCols,this.refreshCols._.minColspan>this.totalCols&&(this.refreshCols._.minColspan=this.totalCols),this.refreshCols._.maxColspan>this.totalCols&&(this.refreshCols._.maxColspan=this.totalCols),this.refreshCols._.colspan=this.refreshCols._.minColspan;this.refreshCols._.colspan<=this.refreshCols._.maxColspan;this.refreshCols._.colspan++)for(this.refreshCols._.$item.css("width",this.getItemWidthCss(this.refreshCols._.colspan)),this.itemHeightsByColspan[this.refreshCols._.item][this.refreshCols._.colspan]=this.refreshCols._.$item.outerHeight(),this.possibleItemColspans[this.refreshCols._.item].push(this.refreshCols._.colspan),this.possibleItemPositionsByColspan[this.refreshCols._.item][this.refreshCols._.colspan]=[],this.refreshCols._.positionLeft?(this.refreshCols._.minPosition=0,this.refreshCols._.maxPosition=0):this.refreshCols._.positionRight?(this.refreshCols._.minPosition=this.totalCols-this.refreshCols._.colspan,this.refreshCols._.maxPosition=this.refreshCols._.minPosition):(this.refreshCols._.minPosition=0,this.refreshCols._.maxPosition=this.totalCols-this.refreshCols._.colspan),this.refreshCols._.position=this.refreshCols._.minPosition;this.refreshCols._.position<=this.refreshCols._.maxPosition;this.refreshCols._.position++)this.possibleItemPositionsByColspan[this.refreshCols._.item][this.refreshCols._.colspan].push(this.refreshCols._.position);for(this.refreshCols._.colHeights=[],this.refreshCols._.i=0;this.refreshCols._.i<this.totalCols;this.refreshCols._.i++)this.refreshCols._.colHeights.push(0);for(this.createLayouts(0,[],[],this.refreshCols._.colHeights,0),this.refreshCols._.layoutTotalCols=[],this.refreshCols._.i=0;this.refreshCols._.i<this.layouts.length;this.refreshCols._.i++)for(this.refreshCols._.layoutTotalCols[this.refreshCols._.i]=0,this.refreshCols._.j=0;this.refreshCols._.j<this.totalCols;this.refreshCols._.j++)this.layouts[this.refreshCols._.i].colHeights[this.refreshCols._.j]&&this.refreshCols._.layoutTotalCols[this.refreshCols._.i]++;for(this.refreshCols._.highestTotalCols=Math.max.apply(null,this.refreshCols._.layoutTotalCols),this.refreshCols._.i=this.layouts.length-1;this.refreshCols._.i>=0;this.refreshCols._.i--)this.refreshCols._.layoutTotalCols[this.refreshCols._.i]!==this.refreshCols._.highestTotalCols&&this.layouts.splice(this.refreshCols._.i,1);for(this.refreshCols._.layoutHeights=[],this.refreshCols._.i=0;this.refreshCols._.i<this.layouts.length;this.refreshCols._.i++)this.refreshCols._.layoutHeights.push(Math.max.apply(null,this.layouts[this.refreshCols._.i].colHeights));for(this.refreshCols._.shortestHeight=Math.min.apply(null,this.refreshCols._.layoutHeights),this.refreshCols._.shortestLayouts=[],this.refreshCols._.emptySpaces=[],this.refreshCols._.i=0;this.refreshCols._.i<this.refreshCols._.layoutHeights.length;this.refreshCols._.i++)if(this.refreshCols._.layoutHeights[this.refreshCols._.i]===this.refreshCols._.shortestHeight){for(this.refreshCols._.shortestLayouts.push(this.layouts[this.refreshCols._.i]),this.refreshCols._.emptySpace=this.layouts[this.refreshCols._.i].emptySpace,this.refreshCols._.j=0;this.refreshCols._.j<this.totalCols;this.refreshCols._.j++)this.refreshCols._.emptySpace+=this.refreshCols._.shortestHeight-this.layouts[this.refreshCols._.i].colHeights[this.refreshCols._.j];this.refreshCols._.emptySpaces.push(this.refreshCols._.emptySpace)}for(this.layout=this.refreshCols._.shortestLayouts[$.inArray(Math.min.apply(null,this.refreshCols._.emptySpaces),this.refreshCols._.emptySpaces)],this.refreshCols._.i=0;this.refreshCols._.i<this.items.length;this.refreshCols._.i++)this.refreshCols._.css={width:this.getItemWidthCss(this.layout.colspans[this.refreshCols._.i])},this.refreshCols._.css[Craft.left]=this.getItemLeftPosCss(this.layout.positions[this.refreshCols._.i]),this.items[this.refreshCols._.i].css(this.refreshCols._.css);this.isSimpleLayout()?(this.$container.height("auto"),this.$items.css({position:"relative",top:0,"margin-bottom":this.settings.gutter+"px"})):(this.$items.css("position","absolute"),this.positionItems(),this.addListener(this.$items,"resize","onItemResize"))}this.completeRefreshCols(),this.addListener(this.$container,"resize",this.handleContainerHeightProxy),this.onRefreshCols()}else this.completeRefreshCols();else this.completeRefreshCols();else this.completeRefreshCols()},completeRefreshCols:function(){var t=this;if(void 0!==this.refreshCols._&&delete this.refreshCols._,this._refreshingCols=!1,this._refreshColsAfterRefresh){var e=this._forceRefreshColsAfterRefresh;this._refreshColsAfterRefresh=!1,this._forceRefreshColsAfterRefresh=!1,Garnish.requestAnimationFrame((function(){t.refreshCols(e)}))}},getItemWidth:function(t){return this.colPctWidth*t},getItemWidthCss:function(t){return"calc("+this.getItemWidth(t)+"% - "+this.colGutterDrop+"px)"},getItemWidthInPx:function(t){return this.getItemWidth(t)/100*this.$container.width()-this.colGutterDrop},getItemLeftPosCss:function(t){return"calc(("+this.getItemWidth(1)+"% + "+(this.settings.gutter-this.colGutterDrop)+"px) * "+t+")"},getItemLeftPosInPx:function(t){return(this.getItemWidth(1)/100*this.$container.width()+(this.settings.gutter-this.colGutterDrop))*t},createLayouts:function(t,e,i,s,a){new Craft.Grid.LayoutGenerator(this).createLayouts(t,e,i,s,a)},isSimpleLayout:function(){for(this.isSimpleLayout._={},this.isSimpleLayout._.i=0;this.isSimpleLayout._.i<this.layout.positions.length;this.isSimpleLayout._.i++)if(0!==this.layout.positions[this.isSimpleLayout._.i])return delete this.isSimpleLayout._,!1;return delete this.isSimpleLayout._,!0},positionItems:function(){for(this.positionItems._={},this.positionItems._.colHeights=[],this.positionItems._.i=0;this.positionItems._.i<this.totalCols;this.positionItems._.i++)this.positionItems._.colHeights.push(0);for(this.positionItems._.i=0;this.positionItems._.i<this.items.length;this.positionItems._.i++){for(this.positionItems._.endingCol=this.layout.positions[this.positionItems._.i]+this.layout.colspans[this.positionItems._.i]-1,this.positionItems._.affectedColHeights=[],this.positionItems._.col=this.layout.positions[this.positionItems._.i];this.positionItems._.col<=this.positionItems._.endingCol;this.positionItems._.col++)this.positionItems._.affectedColHeights.push(this.positionItems._.colHeights[this.positionItems._.col]);for(this.positionItems._.top=Math.max.apply(null,this.positionItems._.affectedColHeights),this.positionItems._.top>0&&(this.positionItems._.top+=this.settings.gutter),this.items[this.positionItems._.i].css("top",this.positionItems._.top),this.positionItems._.col=this.layout.positions[this.positionItems._.i];this.positionItems._.col<=this.positionItems._.endingCol;this.positionItems._.col++)this.positionItems._.colHeights[this.positionItems._.col]=this.positionItems._.top+this.itemHeightsByColspan[this.positionItems._.i][this.layout.colspans[this.positionItems._.i]]}this.$container.height(Math.max.apply(null,this.positionItems._.colHeights)),delete this.positionItems._},onItemResize:function(t){this.onItemResize._={},t.stopPropagation(),this.onItemResize._.item=$.inArray(t.currentTarget,this.$items),-1!==this.onItemResize._.item&&(this.onItemResize._.newHeight=this.items[this.onItemResize._.item].outerHeight(),this.onItemResize._.newHeight!==this.itemHeightsByColspan[this.onItemResize._.item][this.layout.colspans[this.onItemResize._.item]]&&(this.itemHeightsByColspan[this.onItemResize._.item][this.layout.colspans[this.onItemResize._.item]]=this.onItemResize._.newHeight,this.positionItems(!1))),delete this.onItemResize._},onRefreshCols:function(){this.trigger("refreshCols"),this.settings.onRefreshCols()},destroy:function(){this.$container.removeData("grid"),this.base()}},{defaults:{itemSelector:".item",cols:null,maxCols:null,minColWidth:320,gutter:14,fillMode:"top",colClass:"col",snapToGrid:null,onRefreshCols:$.noop}}),Craft.Grid.LayoutGenerator=Garnish.Base.extend({grid:null,_:null,init:function(t){this.grid=t},createLayouts:function(t,e,i,s,a){for(this._={},this._.c=0;this._.c<this.grid.possibleItemColspans[t].length;this._.c++){for(this._.colspan=this.grid.possibleItemColspans[t][this._.c],this._.tallestColHeightsByPosition=[],this._.p=0;this._.p<this.grid.possibleItemPositionsByColspan[t][this._.colspan].length;this._.p++){for(this._.position=this.grid.possibleItemPositionsByColspan[t][this._.colspan][this._.p],this._.colHeightsForPosition=[],this._.endingCol=this._.position+this._.colspan-1,this._.col=this._.position;this._.col<=this._.endingCol;this._.col++)this._.colHeightsForPosition.push(s[this._.col]);this._.tallestColHeightsByPosition[this._.p]=Math.max.apply(null,this._.colHeightsForPosition)}for(this._.p=$.inArray(Math.min.apply(null,this._.tallestColHeightsByPosition),this._.tallestColHeightsByPosition),this._.position=this.grid.possibleItemPositionsByColspan[t][this._.colspan][this._.p],this._.positions=e.slice(0),this._.colspans=i.slice(0),this._.colHeights=s.slice(0),this._.emptySpace=a,this._.positions.push(this._.position),this._.colspans.push(this._.colspan),this._.tallestColHeight=this._.tallestColHeightsByPosition[this._.p],this._.endingCol=this._.position+this._.colspan-1,this._.col=this._.position;this._.col<=this._.endingCol;this._.col++)this._.emptySpace+=this._.tallestColHeight-this._.colHeights[this._.col],this._.colHeights[this._.col]=this._.tallestColHeight+this.grid.itemHeightsByColspan[t][this._.colspan];t===this.grid.items.length-1?this.grid.layouts.push({positions:this._.positions,colspans:this._.colspans,colHeights:this._.colHeights,emptySpace:this._.emptySpace}):this.grid.createLayouts(t+1,this._.positions,this._.colspans,this._.colHeights,this._.emptySpace)}delete this._}})},2387:function(){Craft.HandleGenerator=Craft.BaseInputGenerator.extend({generateTargetValue:function(t){var e=t.replace("/<(.*?)>/g","");e=(e=e.replace(/['"‘’“”\[\]\(\)\{\}:]/g,"")).toLowerCase(),e=Craft.asciiString(e),this.settings.allowNonAlphaStart||(e=e.replace(/^[^a-z]+/,""));var i=Craft.filterArray(e.split(/[^a-z0-9]+/));if(e="","snake"===Craft.handleCasing)return i.join("_");for(var s=0;s<i.length;s++)"pascal"!==Craft.handleCasing&&0===s?e+=i[s]:e+=i[s].charAt(0).toUpperCase()+i[s].substring(1);return e}})},7966:function(){Craft.ImageUpload=Garnish.Base.extend({$container:null,progressBar:null,uploader:null,init:function(t){this.setSettings(t,Craft.ImageUpload.defaults),this.initImageUpload()},initImageUpload:function(){this.$container=$(this.settings.containerSelector),this.progressBar=new Craft.ProgressBar($('<div class="progress-shade"></div>').appendTo(this.$container));var t={url:Craft.getActionUrl(this.settings.uploadAction),formData:this.settings.postParameters,fileInput:this.$container.find(this.settings.fileInputSelector),paramName:this.settings.uploadParamName};void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(t.formData[Craft.csrfTokenName]=Craft.csrfTokenValue),t.events={},t.events.fileuploadstart=this._onUploadStart.bind(this),t.events.fileuploadprogressall=this._onUploadProgress.bind(this),t.events.fileuploaddone=this._onUploadComplete.bind(this),t.events.fileuploadfail=this._onUploadFailure.bind(this),this.uploader=new Craft.Uploader(this.$container,t),this.initButtons()},initButtons:function(){var t=this;this.$container.find(this.settings.uploadButtonSelector).on("click",(function(e){t.$container.find(t.settings.fileInputSelector).trigger("click")})),this.$container.find(this.settings.deleteButtonSelector).on("click",(function(e){confirm(Craft.t("app","Are you sure you want to delete this image?"))&&($(e.currentTarget).parent().append('<div class="blocking-modal"></div>'),Craft.sendActionRequest("POST",t.settings.deleteAction,{data:t.settings.postParameters}).then((function(e){var i=e.data;t.refreshImage(i)})))}))},refreshImage:function(t){$(this.settings.containerSelector).replaceWith(t.html),this.settings.onAfterRefreshImage(t),this.initImageUpload()},_onUploadStart:function(t){this.progressBar.$progressBar.css({top:Math.round(this.$container.outerHeight()/2)-6}),this.$container.addClass("uploading"),this.progressBar.resetProgressBar(),this.progressBar.showProgressBar()},_onUploadProgress:function(t,e){var i=parseInt(e.loaded/e.total*100,10);this.progressBar.setProgressPercentage(i)},_onUploadComplete:function(t,e){e.result.error?alert(e.result.error):($(e.result.html),this.refreshImage(e.result)),this.uploader.isLastUpload()&&(this.progressBar.hideProgressBar(),this.$container.removeClass("uploading"))},_onUploadFailure:function(t,e){var i,s=e.response(),a=(null==s||null===(i=s.jqXHR)||void 0===i?void 0:i.responseJSON)||{},n=a.message,r=a.filename;n||(n=r?Craft.t("app","Upload failed for “{filename}”.",{filename:r}):Craft.t("app","Upload failed.")),alert(n),this.progressBar.hideProgressBar(),this.$container.removeClass("uploading")}},{defaults:{postParameters:{},uploadAction:"",deleteAction:"",fileInputSelector:"",onAfterRefreshImage:$.noop,containerSelector:null,uploadButtonSelector:null,deleteButtonSelector:null,uploadParamName:"files"}})},657:function(){Craft.InfoIcon=Garnish.Base.extend({$container:null,$icon:null,$liveRegion:null,content:null,hud:null,init:function(t){var e=this;if(this.$icon=$(t),this.$liveRegion=$("<span/>",{role:"status",class:"visually-hidden"}),this.$icon.data("infoicon")?(console.warn("Double-instantiating an info icon on an element"),this.content=this.$icon.data("infoicon").content,this.$icon.data("infoicon").destroy()):(this.content=this.$icon.html(),this.$icon.html("").attr({tabindex:0,role:"button",type:"button","aria-label":Craft.t("app","More info")}).wrap($("<span/>",{class:"infoicon-container"})),this.$container=this.$icon.parent(),this.$container.append(this.$liveRegion)),this.$icon.data("infoicon",this),this.$icon[0].previousSibling&&this.$icon[0].previousSibling.nodeType===Node.TEXT_NODE&&!this.$icon.parent().hasClass("nowrap")){var i=this.$icon[0].previousSibling.nodeValue.match(/[^\s\-]+\s*$/);i&&(this.$icon[0].previousSibling.nodeValue=this.$icon[0].previousSibling.nodeValue.substring(0,i.index),$("<span/>",{class:"nowrap",html:i[0].replace(/\s+$/,"")+" "}).insertAfter(this.$icon[0].previousSibling).append(this.$icon))}this.addListener(this.$icon,"click",(function(t){t.preventDefault(),t.stopPropagation(),e.showHud()})),this.addListener(this.$icon,"keydown",(function(t){e.hud&&e.hud.showing||![Garnish.SPACE_KEY,Garnish.RETURN_KEY].includes(t.keyCode)||(t.preventDefault(),t.stopPropagation(),e.showHud())}))},showHud:function(t){var e=this;this.hud?this.hud.show():(this.hud=new Garnish.HUD(this.$icon,this.content,{hudClass:"hud info-hud",closeOtherHUDs:!1,onShow:function(){Garnish.uiLayerManager.registerShortcut(Garnish.SPACE_KEY,(function(){e.hud.hide()})),e.$liveRegion.html(""),setTimeout((function(){e.$liveRegion.html(e.content)}),200)},onHide:function(){e.$liveRegion.html("")}}),Craft.initUiElements(this.hud.$body))},destroy:function(){this.$icon.removeData("infoicon"),this.base()}})},4487:function(){Craft.LightSwitch=Garnish.Base.extend({settings:null,$outerContainer:null,$innerContainer:null,$input:null,small:!1,on:!1,indeterminate:!1,dragger:null,dragStartMargin:null,init:function(t,e){if(this.$outerContainer=$(t),this.$outerContainer.data("lightswitch")&&(console.warn("Double-instantiating a lightswitch on an element"),this.$outerContainer.data("lightswitch").destroy()),this.$outerContainer.data("lightswitch",this),this.small=this.$outerContainer.hasClass("small"),this.setSettings(e,Craft.LightSwitch.defaults),this.$innerContainer=this.$outerContainer.find(".lightswitch-container:first"),this.$input=this.$outerContainer.find("input:first"),!this.$input.prop("disabled")){this.on=this.$outerContainer.hasClass("on"),this.indeterminate=this.$outerContainer.hasClass("indeterminate"),this.addListener(this.$outerContainer,"mousedown","_onMouseDown"),this.addListener(this.$outerContainer,"keydown","_onKeyDown"),this.dragger=new Garnish.BaseDrag(this.$outerContainer,{axis:Garnish.X_AXIS,ignoreHandleSelector:null,onDragStart:this._onDragStart.bind(this),onDrag:this._onDrag.bind(this),onDragStop:this._onDragStop.bind(this)});var i=this.$outerContainer.parent(".lightswitch-inner-container");i.length&&(this.addListener(i.children('span[data-toggle="off"]'),"click",this.turnOff),this.addListener(i.children('span[data-toggle="on"]'),"click",this.turnOn))}},turnOn:function(t){var e=!this.on;if(this.on=!0,this.indeterminate=!1,this.$outerContainer.addClass("dragging"),Garnish.prefersReducedMotion())this.$innerContainer.css("margin-"+Craft.left,0);else{var i={};i["margin-"+Craft.left]=0,this.$innerContainer.velocity("stop").velocity(i,Craft.LightSwitch.animationDuration,this._onSettle.bind(this))}this.$input.val(this.settings.value),this.$outerContainer.addClass("on"),this.$outerContainer.removeClass("indeterminate"),this.$outerContainer.attr("aria-checked","true"),e&&!0!==t&&this.onChange()},turnOff:function(t){var e=this.on||this.indeterminate;if(this.on=!1,this.indeterminate=!1,this.$outerContainer.addClass("dragging"),Garnish.prefersReducedMotion())this.$innerContainer.css("margin-"+Craft.left,this._getOffMargin());else{var i={};i["margin-"+Craft.left]=this._getOffMargin(),this.$innerContainer.velocity("stop").velocity(i,Craft.LightSwitch.animationDuration,this._onSettle.bind(this))}this.$input.val(""),this.$outerContainer.removeClass("on"),this.$outerContainer.removeClass("indeterminate"),this.$outerContainer.attr("aria-checked","false"),e&&!0!==t&&this.onChange()},turnIndeterminate:function(t){var e=!this.indeterminate;this.on=!1,this.indeterminate=!0,this.$outerContainer.addClass("dragging");var i={};i["margin-"+Craft.left]=this._getOffMargin()/2,this.$innerContainer.velocity("stop").velocity(i,Craft.LightSwitch.animationDuration,this._onSettle.bind(this)),this.$input.val(this.settings.indeterminateValue),this.$outerContainer.removeClass("on"),this.$outerContainer.addClass("indeterminate"),this.$outerContainer.attr("aria-checked","mixed"),e&&!0!==t&&this.onChange()},toggle:function(){this.indeterminate||!this.on?this.turnOn():this.turnOff()},onChange:function(){this.trigger("change"),this.settings.onChange(this.on),this.$outerContainer.trigger("change")},_onMouseDown:function(){this.addListener(Garnish.$doc,"mouseup","_onMouseUp")},_onMouseUp:function(){this.removeListener(Garnish.$doc,"mouseup"),this.dragger.dragging||this.toggle()},_onKeyDown:function(t){switch(t.keyCode){case Garnish.SPACE_KEY:this.toggle(),t.preventDefault();break;case Garnish.RIGHT_KEY:"ltr"===Craft.orientation?this.turnOn():this.turnOff(),t.preventDefault();break;case Garnish.LEFT_KEY:"ltr"===Craft.orientation?this.turnOff():this.turnOn(),t.preventDefault()}},_getMargin:function(){return parseInt(this.$innerContainer.css("margin-"+Craft.left))},_onDragStart:function(){this.$outerContainer.addClass("dragging"),this.dragStartMargin=this._getMargin()},_onDrag:function(){var t;(t="ltr"===Craft.orientation?this.dragStartMargin+this.dragger.mouseDistX:this.dragStartMargin-this.dragger.mouseDistX)<this._getOffMargin()?t=this._getOffMargin():t>0&&(t=0),this.$innerContainer.css("margin-"+Craft.left,t)},_onDragStop:function(){this._getMargin()>this._getOffMargin()/2?this.turnOn():this.turnOff()},_onSettle:function(){this.$outerContainer.removeClass("dragging")},destroy:function(){this.$outerContainer.removeData("lightswitch"),this.base(),this.dragger.destroy()},_getOffMargin:function(){return this.small?-10:-12}},{animationDuration:100,defaults:{value:"1",indeterminateValue:"-",onChange:$.noop}})},6966:function(){Craft.Listbox=Garnish.Base.extend({$container:null,$options:null,$selectedOption:null,selectedOptionIndex:null,init:function(t,e){var i=this;this.$container=$(t),this.setSettings(e,Craft.Listbox.defaults),this.$container.data("listbox")&&(console.warn("Double-instantiating a listbox on an element"),this.$container.data("listbox").destroy()),this.$container.data("listbox",this),this.$options=this.$container.find("button,[role=option]"),this.$selectedOption=this.$options.filter("[aria-pressed=true],[aria-selected=true]").removeAttr("aria-selected").attr("aria-pressed","true"),this.$selectedOption.length?this.selectedOptionIndex=this.$options.index(this.$selectedOption):this.$selectedOption=null,this.addListener(this.$options,"click",(function(t){i.select(i.$options.index($(t.currentTarget))),t.preventDefault()}))},select:function(t){t<0||t>=this.$options.length||t===this.selectedOptionIndex||(this.$selectedOption&&this.$selectedOption.removeClass(this.settings.selectedClass).attr("aria-pressed","false"),this.$selectedOption=this.$options.eq(t).addClass(this.settings.selectedClass).attr("aria-pressed","true"),this.selectedOptionIndex=t,this.settings.onChange(this.$selectedOption,t),this.trigger("change",{$selectedOption:this.$selectedOption,selectedOptionIndex:t}))},disable:function(){this.base(),this.$container.attr("aria-disabled","true")},enable:function(){this.base(),this.$container.removeAttr("aria-disabled")},destroy:function(){this.$container.removeData("listbox"),this.base()}},{defaults:{selectedClass:"active",focusClass:"focus",onChange:$.noop}})},5080:function(){Craft.LivePreview=Garnish.Base.extend({$extraFields:null,$trigger:null,$shade:null,$editorContainer:null,$editor:null,$dragHandle:null,$previewContainer:null,$iframeContainer:null,$iframe:null,$fieldPlaceholder:null,previewUrl:null,token:null,basePostData:null,inPreviewMode:!1,fields:null,lastPostData:null,updateIframeInterval:null,loading:!1,checkAgain:!1,dragger:null,dragStartEditorWidth:null,_slideInOnIframeLoad:!1,_scrollX:null,_scrollY:null,_editorWidth:null,_editorWidthInPx:null,init:function(t){var e=this;this.setSettings(t,Craft.LivePreview.defaults),this.settings.previewUrl?this.previewUrl=this.settings.previewUrl:this.previewUrl=Craft.baseSiteUrl.replace(/\/+$/,"")+"/","https:"===document.location.protocol&&(this.previewUrl=this.previewUrl.replace(/^http:/,"https:")),this.basePostData=$.extend({},this.settings.previewParams),this.$extraFields=$(this.settings.extraFields),this.$trigger=$(this.settings.trigger),this.$fieldPlaceholder=$("<div/>"),this.editorWidth=Craft.getLocalStorage("LivePreview.editorWidth",Craft.LivePreview.defaultEditorWidth),this.addListener(this.$trigger,"activate","toggle"),Craft.cp.on("beforeSaveShortcut",(function(){e.inPreviewMode&&e.moveFieldsBack()})),Craft.Preview.instances.push(this)},get editorWidth(){return this._editorWidth},get editorWidthInPx(){return this._editorWidthInPx},set editorWidth(t){var e;t>=1?(e=t,t/=Garnish.$win.width()):e=Math.round(t*Garnish.$win.width()),e<Craft.LivePreview.minEditorWidthInPx&&(t=(e=Craft.LivePreview.minEditorWidthInPx)/Garnish.$win.width()),this._editorWidth=t,this._editorWidthInPx=e},toggle:function(){this.inPreviewMode?this.exit():this.enter()},enter:function(){var t=this;if(!this.inPreviewMode)if(this.token){if(this.trigger("beforeEnter"),$(document.activeElement).trigger("blur"),!this.$editor){this.$shade=$("<div/>",{class:"modal-shade dark"}).appendTo(Garnish.$bod),this.$previewContainer=$("<div/>",{class:"lp-preview-container"}).appendTo(Garnish.$bod),this.$iframeContainer=$("<div/>",{class:"lp-iframe-container"}).appendTo(this.$previewContainer),this.$editorContainer=$("<div/>",{class:"lp-editor-container"}).appendTo(Garnish.$bod);var e=$("<header/>",{class:"flex"}).appendTo(this.$editorContainer);this.$editor=$("<form/>",{class:"lp-editor"}).appendTo(this.$editorContainer),this.$dragHandle=$("<div/>",{class:"lp-draghandle"}).appendTo(this.$editorContainer);var i=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Close Preview")}).appendTo(e);$("<div/>",{class:"flex-grow"}).appendTo(e);var s=$("<button/>",{type:"button",class:"btn submit",text:Craft.t("app","Save")}).appendTo(e);this.dragger=new Garnish.BaseDrag(this.$dragHandle,{axis:Garnish.X_AXIS,onDragStart:this._onDragStart.bind(this),onDrag:this._onDrag.bind(this),onDragStop:this._onDragStop.bind(this)}),this.addListener(i,"click","exit"),this.addListener(s,"click","save")}this.handleWindowResize(),this.addListener(Garnish.$win,"resize","handleWindowResize"),this.$editorContainer.css(Craft.left,-this.editorWidthInPx+"px"),this.$previewContainer.css(Craft.right,-this.getIframeWidth()),this.fields=[];for(var a=$(this.settings.fields),n=0;n<a.length;n++){var r=$(a[n]),o=this._getClone(r);this.$fieldPlaceholder.insertAfter(r),r.detach(),this.$fieldPlaceholder.replaceWith(o),r.appendTo(this.$editor),this.fields.push({$field:r,$clone:o})}this.updateIframe()?this._slideInOnIframeLoad=!0:this.slideIn(),Craft.ElementThumbLoader.retryAll(),Garnish.uiLayerManager.addLayer(this.$sidebar),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.exit()})),this.inPreviewMode=!0,this.trigger("enter")}else this.createToken()},createToken:function(){var t=this,e={previewAction:this.settings.previewAction};Craft.sendActionRequest("POST","live-preview/create-token",{data:e}).then((function(e){t.token=e.data.token,t.enter()}))},save:function(){Craft.cp.submitPrimaryForm()},handleWindowResize:function(){this.editorWidth=this.editorWidth,this.updateWidths()},slideIn:function(){var t=this;$("html").addClass("noscroll"),this.$shade.velocity("fadeIn"),this.$editorContainer.show().velocity("stop").animateLeft(0,"slow",(function(){t.trigger("slideIn"),Garnish.$win.trigger("resize")})),this.$previewContainer.show().velocity("stop").animateRight(0,"slow",(function(){t.updateIframeInterval=setInterval(t.updateIframe.bind(t),1e3)}))},exit:function(){var t=this;this.inPreviewMode&&(this.trigger("beforeExit"),$("html").removeClass("noscroll"),this.removeListener(Garnish.$win,"resize"),Garnish.uiLayerManager.removeLayer(),this.updateIframeInterval&&clearInterval(this.updateIframeInterval),this.moveFieldsBack(),this.$shade.delay(200).velocity("fadeOut"),this.$editorContainer.velocity("stop").animateLeft(-this.editorWidthInPx,"slow",(function(){for(var e=0;e<t.fields.length;e++)t.fields[e].$newClone.remove();t.$editorContainer.hide(),t.trigger("slideOut")})),this.$previewContainer.velocity("stop").animateRight(-this.getIframeWidth(),"slow",(function(){t.$previewContainer.hide()})),Craft.ElementThumbLoader.retryAll(),this.inPreviewMode=!1,this.trigger("exit"))},moveFieldsBack:function(){for(var t=0;t<this.fields.length;t++){var e=this.fields[t];e.$newClone=this._getClone(e.$field),this.$fieldPlaceholder.insertAfter(e.$field),e.$field.detach(),this.$fieldPlaceholder.replaceWith(e.$newClone),e.$clone.replaceWith(e.$field)}Garnish.$win.trigger("resize")},getIframeWidth:function(){return Garnish.$win.width()-this.editorWidthInPx},updateWidths:function(){this.$editorContainer.css("width",this.editorWidthInPx+"px"),this.$previewContainer.width(this.getIframeWidth())},updateIframe:function(t){if(t&&(this.lastPostData=null),!this.inPreviewMode)return!1;if(this.loading)return this.checkAgain=!0,!1;var e=$.extend(Garnish.getPostData(this.$editor),Garnish.getPostData(this.$extraFields));if(this.lastPostData&&Craft.compare(e,this.lastPostData,!1))return!1;this.lastPostData=e,this.loading=!0;var i=this.$iframe?$(this.$iframe[0].contentWindow.document):null;return this._scrollX=i?i.scrollLeft():0,this._scrollY=i?i.scrollTop():0,$.ajax({url:this.previewUrl+(-1!==this.previewUrl.indexOf("?")?"&":"?")+Craft.tokenParam+"="+this.token,method:"POST",data:$.extend({},e,this.basePostData),headers:{"X-Craft-Token":this.token},xhrFields:{withCredentials:!0},crossDomain:!0,success:this.handleSuccess.bind(this),error:this.handleError.bind(this)}),!0},forceUpdateIframe:function(){return this.updateIframe(!0)},handleSuccess:function(t){var e=this,i=t+'<script type="text/javascript">window.scrollTo('+this._scrollX+", "+this._scrollY+");<\/script>",s=$('<iframe class="lp-preview" frameborder="0"/>');this.$iframe?s.insertBefore(this.$iframe):s.appendTo(this.$iframeContainer),this.addListener(s,"load",(function(){this.$iframe&&this.$iframe.remove(),this.$iframe=s,this._slideInOnIframeLoad&&(this.slideIn(),this._slideInOnIframeLoad=!1),this.removeListener(s,"load")})),Garnish.requestAnimationFrame((function(){s[0].contentWindow.document.open(),s[0].contentWindow.document.write(i),s[0].contentWindow.document.close(),e.onResponse()}))},handleError:function(){this.onResponse()},onResponse:function(){this.loading=!1,this.checkAgain&&(this.checkAgain=!1,this.updateIframe())},_getClone:function(t){var e=t.clone();return Garnish.copyInputValues(t,e),e.attr("id",""),e.find("[id]").attr("id",""),e},_onDragStart:function(){this.dragStartEditorWidth=this.editorWidthInPx,this.$previewContainer.addClass("dragging")},_onDrag:function(){"ltr"===Craft.orientation?this.editorWidth=this.dragStartEditorWidth+this.dragger.mouseDistX:this.editorWidth=this.dragStartEditorWidth-this.dragger.mouseDistX,this.updateWidths()},_onDragStop:function(){this.$previewContainer.removeClass("dragging"),Craft.setLocalStorage("LivePreview.editorWidth",this.editorWidth)},destroy:function(){var t=this;Craft.Preview.instances=Craft.Preview.instances.filter((function(e){return e!==t})),this.base()}},{defaultEditorWidth:.33,minEditorWidthInPx:320,instances:[],defaults:{trigger:".livepreviewbtn",fields:null,extraFields:null,previewUrl:null,previewAction:null,previewParams:{}}}),Craft.LivePreview.init=function(t){Craft.livePreview=new Craft.LivePreview(t)}},7439:function(){Craft.PasswordInput=Garnish.Base.extend({$passwordWrapper:null,$passwordInput:null,$textInput:null,$currentInput:null,$showPasswordToggle:null,showingPassword:null,init:function(t,e){this.$passwordInput=$(t),this.$passwordWrapper=this.$passwordInput.parent(".passwordwrapper"),this.settings=$.extend({},Craft.PasswordInput.defaults,e),this.$passwordInput.data("passwordInput")&&(console.warn("Double-instantiating a password input on an element"),this.$passwordInput.data("passwordInput").destroy()),this.$passwordInput.data("passwordInput",this),this.$showPasswordToggle=$('<button type="button" class="invisible" />'),this.$showPasswordToggle.addClass("password-toggle"),this.$showPasswordToggle.insertAfter(this.$passwordInput),this.initInputFocusEvents(this.$passwordInput),this.addListener(this.$showPasswordToggle,"click","onClick"),this.hidePassword(),this.addListener(this.$passwordWrapper.closest("form"),"submit","hidePassword")},setCurrentInput:function(t){this.$currentInput&&(t.insertAfter(this.$currentInput),this.$currentInput.detach(),t.trigger("focus"),t.val(this.$currentInput.val())),this.$currentInput=t,this.addListener(this.$currentInput,"keypress,keyup,change,blur","onInputChange")},updateToggleLabel:function(t){this.$showPasswordToggle.text(t)},initInputFocusEvents:function(t){this.addListener(t,"focus",(function(){this.$passwordWrapper.addClass("focus")})),this.addListener(t,"blur",(function(){this.$passwordWrapper.removeClass("focus")}))},showPassword:function(){this.showingPassword||(this.$textInput||(this.$textInput=this.$passwordInput.clone(!0),this.$textInput.attr({type:"text",autocapitalize:"off"}),this.initInputFocusEvents(this.$textInput)),this.setCurrentInput(this.$textInput),this.updateToggleLabel(Craft.t("app","Hide")),this.showingPassword=!0)},hidePassword:function(){!1!==this.showingPassword&&(this.setCurrentInput(this.$passwordInput),this.updateToggleLabel(Craft.t("app","Show")),this.showingPassword=!1)},togglePassword:function(){this.showingPassword?this.hidePassword():this.showPassword(),this.settings.onToggleInput(this.$currentInput)},onInputChange:function(){this.$currentInput.val()?this.$showPasswordToggle.removeClass("invisible"):this.$showPasswordToggle.addClass("invisible")},onClick:function(t){if(this.$currentInput[0].setSelectionRange){var e=this.$currentInput[0].selectionStart,i=this.$currentInput[0].selectionEnd;this.togglePassword(),this.$currentInput[0].setSelectionRange(e,i)}else this.togglePassword()},destroy:function(){this.$passwordInput.removeData("passwordInput"),this.base()}},{defaults:{onToggleInput:$.noop}})},5328:function(){function t(t,i){var s="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!s){if(Array.isArray(t)||(s=function(t,i){if(t){if("string"==typeof t)return e(t,i);var s=Object.prototype.toString.call(t).slice(8,-1);return"Object"===s&&t.constructor&&(s=t.constructor.name),"Map"===s||"Set"===s?Array.from(t):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?e(t,i):void 0}}(t))||i&&t&&"number"==typeof t.length){s&&(t=s);var a=0,n=function(){};return{s:n,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){s=s.call(t)},n:function(){var t=s.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==s.return||s.return()}finally{if(l)throw r}}}}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function i(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);e&&(s=s.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,s)}return i}function s(t){for(var e=1;e<arguments.length;e++){var s=null!=arguments[e]?arguments[e]:{};e%2?i(Object(s),!0).forEach((function(e){a(t,e,s[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(s)):i(Object(s)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(s,e))}))}return t}function a(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}Craft.Preview=Garnish.Base.extend({elementEditor:null,$shade:null,$editorContainer:null,$editor:null,$spinner:null,$statusIcon:null,$dragHandle:null,$previewWrapper:null,$previewContainer:null,$previewSkipLink:null,$bumperLink:null,$notifier:null,$iframeContainer:null,$previewHeader:null,$targetBtn:null,$targetMenu:null,$deviceTypeContainer:null,$orientationBtn:null,$refreshBtn:null,$deviceMask:null,$devicePreviewContainer:null,$iframe:null,iframeLoaded:!1,$tempInput:null,$fieldPlaceholder:null,isActive:!1,isVisible:!1,activeTarget:0,animationDuration:"slow",currentDeviceType:"desktop",deviceOrientation:null,deviceWidth:"",deviceHeight:"",deviceMaskDimensions:{phone:{width:375,height:753},tablet:{width:768,height:1110}},draftId:null,url:null,fields:null,iframeHeight:null,scrollTop:null,dragger:null,dragStartEditorWidth:null,_updateIframeProxy:null,_editorWidth:null,_editorWidthInPx:null,init:function(t){this.elementEditor=t,this._updateIframeProxy=this.updateIframe.bind(this),this.$tempInput=$("<input/>",{type:"hidden",name:"__PREVIEW_FIELDS__",value:"1"}),this.$fieldPlaceholder=$("<div/>"),this.editorWidth=Craft.getLocalStorage("LivePreview.editorWidth",Craft.Preview.defaultEditorWidth),Craft.Preview.instances.push(this)},get editorWidth(){return this._editorWidth},get editorWidthInPx(){return this._editorWidthInPx},set editorWidth(t){var e;t>=1?(e=t,t/=Garnish.$win.width()):e=Math.round(t*Garnish.$win.width()),e<Craft.Preview.minEditorWidthInPx&&(t=(e=Craft.Preview.minEditorWidthInPx)/Garnish.$win.width()),this._editorWidth=t,this._editorWidthInPx=e},open:function(){var t=this;if(!this.isActive){if(this.isActive=!0,this.trigger("beforeOpen"),$(document.activeElement).trigger("blur"),!this.$editor){var e=Craft.t("app","Skip to {title}",{title:Craft.t("app","Top of preview")});this.$shade=$("<div/>",{class:"modal-shade dark"}).appendTo(Garnish.$bod),this.$previewWrapper=$("<div/>",{role:"dialog","aria-modal":"true","aria-labelledby":"lp-preview-heading"}).appendTo(Garnish.$bod),this.$modalLabel=$("<h2/>",{id:"lp-preview-heading",class:"visually-hidden",html:Craft.t("app","Preview")}).appendTo(this.$previewWrapper),this.$editorContainer=$("<div/>",{class:"lp-editor-container"}).appendTo(this.$previewWrapper),this.$previewContainer=$("<div/>",{class:"lp-preview-container",id:"lp-preview-container"}).appendTo(this.$previewWrapper),this.$notifier=$("<span/>",{class:"visually-hidden","aria-live":"assertive"}).appendTo(this.$previewContainer);var i=$("<header/>",{class:"flex"}).appendTo(this.$editorContainer);this.$editor=$("<form/>",{class:"lp-editor"}).appendTo(this.$editorContainer),this.$dragHandle=$("<div/>",{class:"lp-draghandle"}).appendTo(this.$editorContainer);var s=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Close Preview")}).appendTo(i);if($("<div/>",{class:"flex-grow"}).appendTo(i),this.$spinner=$("<div/>",{class:"spinner hidden",title:Craft.t("app","Saving")}).appendTo(i),this.$statusIcon=$("<div/>",{class:"invisible"}).appendTo(i),this.$statusMessage=$("<span/>",{class:"visually-hidden","aria-live":"polite"}).appendTo(i),this.$previewSkipLink=$("<a/>",{class:"skip-link btn",href:"#lp-preview-container",html:e}).appendTo(i),Craft.Pro){if(this.$previewHeader=$("<header/>",{class:"lp-preview-header"}).appendTo(this.$previewContainer),this.elementEditor.settings.previewTargets.length>1){this.$targetBtn=$("<button/>",{type:"button",class:"btn menubtn",text:this.elementEditor.settings.previewTargets[0].label}).appendTo(this.$previewHeader),this.$targetMenu=$("<div/>",{class:"menu lp-target-menu"}).insertAfter(this.$targetBtn);for(var a,n=$("<ul/>",{class:"padded"}).appendTo(this.$targetMenu),r=0;r<this.elementEditor.settings.previewTargets.length;r++)a=$("<li/>").appendTo(n),$("<a/>",{data:{target:r},text:this.elementEditor.settings.previewTargets[r].label,class:0===r?"sel":null}).appendTo(a);new Garnish.MenuBtn(this.$targetBtn,{onOptionSelect:function(e){t.switchTarget($(e).data("target"))}}),$('<div class="flex-grow"/>').appendTo(this.$previewHeader)}this._buildDeviceTypeFieldset(),$('<div class="flex-grow"/>').appendTo(this.$previewHeader);var o=$('<div class="buttons"/>').appendTo(this.$previewHeader);this.$orientationBtn=$("<button/>",{type:"button",class:"btn disabled","data-icon":"rotate","aria-disabled":"true",text:Craft.t("app","Rotate"),"aria-label":Craft.t("app","Rotate")}).appendTo(o),this.addListener(this.$orientationBtn,"click","switchOrientation"),this.$refreshBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Refresh"),"data-icon":"refresh"}).appendTo(o),this.addListener(this.$refreshBtn,"click",(function(){t.updateIframe(!1,!0)})),this.deviceOrientation=Craft.getLocalStorage("LivePreview.orientation")}this.$iframeContainer=$("<div/>",{class:"lp-iframe-container"}).appendTo(this.$previewContainer),this.$devicePreviewContainer=$("<div/>",{class:"lp-device-preview-container"}).appendTo(this.$iframeContainer),this.$deviceMask=$("<div/>",{class:"lp-device-mask"}).appendTo(this.$iframeContainer),this.$bumperLink=$("<a/>",{class:"skip-link btn lp-preview-container__bumper-link",html:e,href:"#lp-preview-container"}),this.$bumperLink.appendTo(this.$previewContainer),this.dragger=new Garnish.BaseDrag(this.$dragHandle,{axis:Garnish.X_AXIS,onDragStart:this._onDragStart.bind(this),onDrag:this._onDrag.bind(this),onDragStop:this._onDragStop.bind(this)}),this.addListener(s,"click","close"),this.addListener(this.$statusIcon,"click",(function(){t.elementEditor.showStatusHud(t.$statusIcon)}))}this.handleWindowResize(),this.addListener(Garnish.$win,"resize","handleWindowResize"),this.$editorContainer.css(Craft.left,-this.editorWidthInPx+"px"),this.$previewContainer.css(Craft.right,-this.getIframeWidth()),this.fields=[];var l=$("#content .field").not($("#content .field .field"));if(l.length){this.$tempInput.insertBefore(l.get(0));for(var h=0;h<l.length;h++){var d=$(l[h]),c=this._getClone(d);this.$fieldPlaceholder.insertAfter(d),d.detach(),this.$fieldPlaceholder.replaceWith(c),d.appendTo(this.$editor),this.fields.push({$field:d,$clone:c})}}this.updateIframe(),this.elementEditor.on("update",this._updateIframeProxy),Craft.ElementThumbLoader.retryAll(),this.trigger("open")}},_getDeviceTypeTranslation:function(t){var e;switch(t){case"phone":e=Craft.t("app","Mobile");break;case"tablet":e=Craft.t("app","Tablet");break;default:e=Craft.t("app","Desktop")}return e},_getDeviceOrientationTranslation:function(t){return"portrait"===t?Craft.t("app","Portrait"):Craft.t("app","Landscape")},_buildDeviceTypeFieldset:function(){var t=this;this.$deviceTypeContainer=$("<section/>",{class:"btngroup lp-device-type","aria-label":Craft.t("app","Device type")}).appendTo(this.$previewHeader),$("<button/>",{type:"button",class:"btn lp-device-type-btn--desktop active",title:Craft.t("app","Desktop"),"aria-label":Craft.t("app","Desktop"),"aria-pressed":"true",data:{width:"",height:"",deviceType:"desktop"}}).appendTo(this.$deviceTypeContainer),$("<button/>",{type:"button",class:"btn lp-device-type-btn--tablet",title:Craft.t("app","Tablet"),"aria-label":Craft.t("app","Tablet"),"aria-pressed":"false",data:{width:768,height:1024,deviceType:"tablet"}}).appendTo(this.$deviceTypeContainer),$("<button/>",{type:"button",class:"btn lp-device-type-btn--phone",title:Craft.t("app","Mobile"),"aria-label":Craft.t("app","Mobile"),"aria-pressed":"false",data:{width:375,height:667,deviceType:"phone"}}).appendTo(this.$deviceTypeContainer),this.deviceBtnGroup=new Craft.Listbox(this.$deviceTypeContainer,{onChange:function(e){t.switchDeviceType(e)}})},_activeTarget:function(){return this.elementEditor.settings.previewTargets[this.activeTarget]},_autoRefresh:function(){var t=this._activeTarget();return void 0===n(t.refresh)||!!t.refresh},switchTarget:function(t){this.activeTarget=t,this.$targetBtn.text(this.elementEditor.settings.previewTargets[t].label),this.$targetMenu.find("a.sel").removeClass("sel"),this.$targetMenu.find("a").eq(t).addClass("sel"),this.updateIframe(!0),this.trigger("switchTarget",{previewTarget:this.elementEditor.settings.previewTargets[t]})},handleWindowResize:function(){this.editorWidth=this.editorWidth,this.updateWidths()},slideIn:function(){var t=this;this.isActive&&!this.isVisible&&($("html").addClass("noscroll"),this.$shade.velocity("fadeIn"),this.$editorContainer.show().velocity("stop").animateLeft(0,Garnish.getUserPreferredAnimationDuration(this.animationDuration),(function(){t.trigger("slideIn"),Garnish.$win.trigger("resize")})),this.$previewContainer.show().velocity("stop").animateRight(0,Garnish.getUserPreferredAnimationDuration(this.animationDuration)),this.isVisible=!0,Garnish.uiLayerManager.addLayer(this.$previewWrapper),Garnish.hideModalBackgroundLayers(),Craft.setFocusWithin(this.$previewWrapper),Craft.trapFocusWithin(this.$previewWrapper),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.close()})))},close:function(){var t=this;this.isActive&&this.isVisible&&(this.trigger("beforeClose"),$("html").removeClass("noscroll"),this.removeListener(Garnish.$win,"resize"),Garnish.uiLayerManager.removeLayer(),Garnish.resetModalBackgroundLayerVisibility(),this.$tempInput.detach(),this.moveFieldsBack(),Garnish.prefersReducedMotion()?this.$shade.velocity("fadeOut"):this.$shade.delay(200).velocity("fadeOut"),this.$editorContainer.velocity("stop").animateLeft(-this.editorWidthInPx,Garnish.getUserPreferredAnimationDuration(this.animationDuration),(function(){for(var e=0;e<t.fields.length;e++)t.fields[e].$newClone.remove();t.$editorContainer.hide(),t.trigger("slideOut")})),this.$previewContainer.velocity("stop").animateRight(-this.getIframeWidth(),Garnish.getUserPreferredAnimationDuration(this.animationDuration),(function(){t.$iframeContainer.removeClass("lp-iframe-container--rotating"),t.$previewContainer.hide()})),this.elementEditor.off("update",this._updateIframeProxy),Craft.ElementThumbLoader.retryAll(),this.elementEditor.$previewBtn&&this.elementEditor.$previewBtn.focus(),this.isActive=!1,this.isVisible=!1,this.trigger("close"))},moveFieldsBack:function(){for(var t=0;t<this.fields.length;t++){var e=this.fields[t];e.$newClone=this._getClone(e.$field),this.$fieldPlaceholder.insertAfter(e.$field),e.$field.detach(),this.$fieldPlaceholder.replaceWith(e.$newClone),e.$clone.replaceWith(e.$field)}Garnish.$win.trigger("resize"),Garnish.$doc.trigger("scroll")},getIframeWidth:function(){return Garnish.$win.width()-this.editorWidthInPx},updateWidths:function(){this.$editorContainer.css("width",this.editorWidthInPx+"px"),this.$previewContainer.width(this.getIframeWidth()),this._devicePreviewIsActive()&&this.updateDevicePreview()},_useIframeResizer:function(){return!1!==Craft.previewIframeResizerOptions},updateIframe:function(t,e){var i=this;if(!this.isActive)return!1;t=!0===t,this.draftId===(this.draftId=this.elementEditor.settings.draftId)&&this.$iframe||(e=!0);var s=this._activeTarget();void 0===e&&(e=t||this._autoRefresh()),this.trigger("beforeUpdateIframe",{previewTarget:s,resetScroll:t,refresh:e}),e?this.elementEditor.getTokenizedPreviewUrl(s.url,"x-craft-live-preview").then((function(e){var s;t?i.scrollTop=null:i.iframeLoaded&&i.$iframe&&(i._useIframeResizer()?(i.iframeHeight=i.$iframe.height(),i.scrollTop=i.$iframeContainer.scrollTop()):(s=Craft.isSameHost(e))&&i.$iframe[0].contentWindow&&(i.scrollTop=$(i.$iframe[0].contentWindow.document).scrollTop())),i.iframeLoaded=!1;var a=$("<iframe/>",{class:"lp-preview",frameborder:0,src:e,title:Craft.t("app","Preview")});i.$iframe?i.$iframe.replaceWith(a):a.appendTo(i.$devicePreviewContainer),i._useIframeResizer()?(t||null===i.iframeHeight||(a.height(i.iframeHeight),i.$iframeContainer.scrollTop(i.scrollTop)),iFrameResize($.extend({checkOrigin:!1,scrolling:!0,onInit:function(t){i.iframeLoaded=!0,i.iframeHeight=null,i.scrollTop=null,t.scrolling="no"}},Craft.previewIframeResizerOptions||{}),a[0])):a.on("load",(function(){i.iframeLoaded=!0,!t&&s&&null!==i.scrollTop&&$(a[0].contentWindow.document).scrollTop(i.scrollTop)})),i.url=e,i.$iframe=a,i._devicePreviewIsActive()&&i.updateDevicePreview(),i.trigger("afterUpdateIframe",{previewTarget:i.elementEditor.settings.previewTargets[i.activeTarget],$iframe:i.$iframe}),i.slideIn()})):this.slideIn()},_devicePreviewIsActive:function(){return"desktop"!==this.currentDeviceType},_updateNotifier:function(){var t=this;this.$notifier.html="";var e="desktop"===this.currentDeviceType?"Previewing {type} device":"Previewing {type} device in {orientation}",i={type:this._getDeviceTypeTranslation(this.currentDeviceType)};"desktop"!==this.currentDeviceType&&(i=s(s({},i),{orientation:this._getDeviceOrientationTranslation(this.deviceOrientation)}));var a=Craft.t("app",e,i);setTimeout((function(){t.$notifier.text(a)}),200)},switchDeviceType:function(t){this.$iframeContainer.removeClass("lp-iframe-container--rotating");var e=t.data("deviceType");if(e===this.currentDeviceType)return!1;this.currentDeviceType=e,this.deviceWidth=t.data("width"),this.deviceHeight=t.data("height"),"desktop"===this.currentDeviceType?(this.$orientationBtn.addClass("disabled").attr("aria-disabled","true"),this.$iframeContainer.removeClass("lp-iframe-container--has-device-preview")):(this.$orientationBtn.removeClass("disabled").removeAttr("aria-disabled"),this.$iframeContainer.addClass("lp-iframe-container--has-device-preview")),"tablet"===this.currentDeviceType?this.$iframeContainer.addClass("lp-iframe-container--tablet"):this.$iframeContainer.removeClass("lp-iframe-container--tablet"),this._updateNotifier(),"desktop"!==this.currentDeviceType&&this.updateDevicePreview()},switchOrientation:function(){var t=this;if(!this._devicePreviewIsActive())return!1;this.deviceOrientation&&"portrait"!==this.deviceOrientation?this.deviceOrientation="portrait":this.deviceOrientation="landscape",Craft.setLocalStorage("LivePreview.orientation",this.deviceOrientation),this.$iframeContainer.addClass("lp-iframe-container--rotating"),this.updateDevicePreview(),this._updateNotifier(),setTimeout((function(){t.$iframeContainer.removeClass("lp-iframe-container--rotating")}),300)},updateDevicePreview:function(){var t=1,e=1,i=1,s=this.$previewContainer.height()-50-48,a=this.$previewContainer.width()-48,n=this.deviceMaskDimensions[this.currentDeviceType].height,r=this.deviceMaskDimensions[this.currentDeviceType].width;"landscape"===this.deviceOrientation?(a<n&&(t=a/n),s<r&&(e=s/r)):(s<n&&(t=s/n),a<r&&(e=a/r)),i=t,e<t&&(i=e);var o=-100/i/2,l="landscape"===this.deviceOrientation?"-90deg":"0deg";this.$deviceMask.css({width:this.deviceMaskDimensions[this.currentDeviceType].width+"px",height:this.deviceMaskDimensions[this.currentDeviceType].height+"px",transform:"scale("+i+") translate("+o+"%, "+o+"%) rotate("+l+")"}),"landscape"===this.deviceOrientation?this.$devicePreviewContainer.css({width:this.deviceHeight+"px",height:this.deviceWidth+"px",transform:"scale("+i+") translate("+o+"%, "+o+"%)",marginTop:0,marginLeft:"-"+12*i+"px"}):this.$devicePreviewContainer.css({width:this.deviceWidth+"px",height:this.deviceHeight+"px",transform:"scale("+i+") translate("+o+"%, "+o+"%)",marginTop:"-"+12*i+"px",marginLeft:0})},_getClone:function(t){var e=t.clone();return Garnish.copyInputValues(t,e),e.attr("id",""),e.find("[id]").attr("id",""),e.find("[name]").prop("disabled",!0),e},_onDragStart:function(){this.dragStartEditorWidth=this.editorWidthInPx,this.$previewContainer.addClass("dragging")},_onDrag:function(){"ltr"===Craft.orientation?this.editorWidth=this.dragStartEditorWidth+this.dragger.mouseDistX:this.editorWidth=this.dragStartEditorWidth-this.dragger.mouseDistX,this.updateWidths()},_onDragStop:function(){this.$previewContainer.removeClass("dragging"),Craft.setLocalStorage("LivePreview.editorWidth",this.editorWidth)},destroy:function(){var t=this;Craft.Preview.instances=Craft.Preview.instances.filter((function(e){return e!==t})),this.base()}},{defaultEditorWidth:.33,minEditorWidthInPx:320,instances:[],refresh:function(){var e,i=t(Craft.Preview.instances);try{for(i.s();!(e=i.n()).done;)preview=e.value,preview.updateIframe()}catch(t){i.e(t)}finally{i.f()}var s,a=t(Craft.LivePreview.instances);try{for(a.s();!(s=a.n()).done;)preview=s.value,preview.forceUpdateIframe()}catch(t){a.e(t)}finally{a.f()}}})},6419:function(){Craft.PreviewFileModal=Garnish.Modal.extend({assetId:null,$spinner:null,$triggerElement:null,$bumperButtonStart:null,$bumperButtonEnd:null,elementSelect:null,type:null,loaded:null,requestId:0,init:function(t,e,i){var s=this;if(i=$.extend(this.defaultSettings,i),this.$triggerElement=Garnish.getFocusedElement(),i.onHide=this._onHide.bind(this),Craft.PreviewFileModal.openInstance){var a=Craft.PreviewFileModal.openInstance;return a.assetId!==t&&(a.loadAsset(t,i.startingWidth,i.startingHeight),a.elementSelect=e),this.destroy()}Craft.PreviewFileModal.openInstance=this,this.elementSelect=e,this.$container=$('<div class="modal previewmodal loading"/>').appendTo(Garnish.$bod),this.base(this.$container,$.extend({resizable:!0},i)),this.$container&&(this.$container.velocity("stop"),this.$container.show().css("opacity",1),this.$shade.velocity("stop"),this.$shade.show().css("opacity",1),Garnish.setFocusWithin(this.$container)),this.$bumperButtonStart=Craft.ui.createButton({html:Craft.t("app","Close Preview"),class:"skip-link"}),this.addListener(this.$bumperButtonStart,"click",(function(){s.hide()})),this.$bumperButtonEnd=this.$bumperButtonStart.clone(!0),this.loadAsset(t,i.startingWidth,i.startingHeight)},_onHide:function(){return Craft.PreviewFileModal.openInstance=null,this.elementSelect?this.elementSelect.focusItem(this.elementSelect.$focusedItem):this.$triggerElement&&this.$triggerElement.length&&this.$triggerElement.trigger("focus"),this.$shade.remove(),this.destroy()},_addBumperButtons:function(){this.$container.prepend(this.$bumperButtonStart).append(this.$bumperButtonEnd)},_addModalName:function(){var t="preview-heading";this.$container.prepend($("h1").attr({class:"visually-hidden",id:t}).text(Craft.t("app","Preview file"))).attr("aria-labelledby",t)},selfDestruct:function(){var t=Craft.PreviewFileModal.openInstance;return t.hide(),t.$shade.remove(),t.destroy(),Craft.PreviewFileModal.openInstance=null,Craft.focalPoint.destruct(),Craft.focalPoint=null,!0},loadAsset:function(t,e,i){var s=this;this.assetId=t,this.$container.empty(),this.loaded=!1,this.desiredHeight=null,this.desiredWidth=null;var a=.66*Garnish.$win.height(),n=Math.min(a/3*4,Garnish.$win.width()-2*this.settings.minGutter);if(a=n/4*3,e&&i){var r=e/i;n=Math.min(e,Garnish.$win.width()-2*this.settings.minGutter),(n=(a=Math.min(n/r,Garnish.$win.height()-2*this.settings.minGutter))*r)>Math.min(e,Garnish.$win.width()-2*this.settings.minGutter)&&(a=(n=Math.min(e,Garnish.$win.width()-2*this.settings.minGutter))/r)}this._resizeContainer(n,a),this.$spinner=$('<div class="spinner centeralign"></div>').appendTo(this.$container);var o=this.$container.height()/2-this.$spinner.height()/2+"px",l=this.$container.width()/2-this.$spinner.width()/2+"px";this.$spinner.css({left:l,top:o,position:"absolute"}),this.requestId++;var h={assetId:t,requestId:this.requestId},d=function(){s.$container.removeClass("loading"),s.$spinner.remove(),s.loaded=!0};Craft.sendActionRequest("POST","assets/preview-file",{data:h}).then((function(t){if(d(),t.data.requestId==s.requestId){if(!t.data.previewHtml)return s.$container.addClass("zilch"),s.$container.append($("<p/>",{text:Craft.t("app","No preview available.")})),void s._addBumperButtons();s.$container.removeClass("zilch"),s.$container.attr("data-asset-id",s.assetId),s.$container.append(t.data.previewHtml),s._addBumperButtons(),s._addModalName(),Craft.appendHeadHtml(t.data.headHtml),Craft.appendBodyHtml(t.data.bodyHtml)}})).catch((function(t){var e=t.response;d(),alert(e.data.message),s.hide()}))},_resizeContainer:function(t,e){this.$container.css({width:t,"min-width":t,"max-width":t,height:e,"min-height":e,"max-height":e,top:(Garnish.$win.height()-e)/2,left:(Garnish.$win.width()-t)/2})}},{defaultSettings:{startingWidth:null,startingHeight:null}})},872:function(){Craft.ProgressBar=Garnish.Base.extend({$progressBar:null,$innerProgressBar:null,$progressBarStatus:null,_itemCount:0,_processedItemCount:0,_displaySteps:!1,init:function(t,e){e&&(this._displaySteps=!0),this.$progressBar=$('<div class="progressbar pending hidden"/>').appendTo(t),this.$innerProgressBar=$('<div class="progressbar-inner"/>').appendTo(this.$progressBar),this.$progressBarStatus=$('<div class="progressbar-status hidden" />').insertAfter(this.$progressBar),this.resetProgressBar()},resetProgressBar:function(){this.setProgressPercentage(100),this.$progressBar.addClass("pending"),this.setItemCount(1),this.setProcessedItemCount(0),this.$progressBarStatus.html(""),this._displaySteps&&this.$progressBar.addClass("has-status")},hideProgressBar:function(){var t=this;this.$progressBar.fadeTo("fast",.01,(function(){t.$progressBar.addClass("hidden").fadeTo(1,1,$.noop)})),this.$progressBarStatus.fadeTo("fast",.01,(function(){t.$progressBarStatus.addClass("hidden").fadeTo(1,1,$.noop)}))},showProgressBar:function(){this.$progressBar.removeClass("hidden"),this.$progressBarStatus.removeClass("hidden")},setItemCount:function(t){this._itemCount=t},incrementItemCount:function(t){this._itemCount+=t},setProcessedItemCount:function(t){this._processedItemCount=t},incrementProcessedItemCount:function(t){this._processedItemCount+=t},updateProgressBar:function(){this._itemCount=Math.max(this._itemCount,1);var t=Math.min(100,Math.round(100*this._processedItemCount/this._itemCount));this.setProgressPercentage(t),this._displaySteps&&this.$progressBarStatus.html(this._processedItemCount+" / "+this._itemCount)},setProgressPercentage:function(t,e){0===t?this.$progressBar.addClass("pending"):(this.$progressBar.removeClass("pending"),e?this.$innerProgressBar.velocity("stop").velocity({width:t+"%"},"fast"):this.$innerProgressBar.velocity("stop").width(t+"%"))}})},1396:function(){Craft.PromptHandler=Garnish.Base.extend({modal:null,$modalContainerDiv:null,$prompt:null,$promptApplyToRemainingContainer:null,$promptApplyToRemainingCheckbox:null,$promptApplyToRemainingLabel:null,$pomptChoices:null,_prompts:[],_promptBatchCallback:$.noop,_promptBatchReturnData:[],_promptBatchNum:0,resetPrompts:function(){this._prompts=[],this._promptBatchCallback=$.noop,this._promptBatchReturnData=[],this._promptBatchNum=0},addPrompt:function(t){this._prompts.push(t)},getPromptCount:function(){return this._prompts.length},showBatchPrompts:function(t){this._promptBatchCallback=t,this._promptBatchReturnData=[],this._promptBatchNum=0,this._showNextPromptInBatch()},_showNextPromptInBatch:function(){var t=this._prompts[this._promptBatchNum].prompt,e=this._prompts.length-(this._promptBatchNum+1);this._showPrompt(t.message,t.choices,this._handleBatchPromptSelection.bind(this),e)},_handleBatchPromptSelection:function(t,e){var i=this._prompts[this._promptBatchNum],s=this._prompts.length-(this._promptBatchNum+1),a=$.extend(i,{choice:t});this._promptBatchReturnData.push(a),s?(this._promptBatchNum++,e?this._handleBatchPromptSelection(t,!0):this._showNextPromptInBatch()):"function"==typeof this._promptBatchCallback&&this._promptBatchCallback(this._promptBatchReturnData)},_showPrompt:function(t,e,i,s){this._promptCallback=i,null===this.modal&&(this.modal=new Garnish.Modal({closeOtherModals:!1})),null===this.$modalContainerDiv&&(this.$modalContainerDiv=$('<div class="modal fitted prompt-modal"></div>').addClass().appendTo(Garnish.$bod)),this.$prompt=$('<div class="body"></div>').appendTo(this.$modalContainerDiv.empty()),this.$promptMessage=$('<p class="prompt-msg"/>').appendTo(this.$prompt),this.$promptChoices=$('<div class="options"></div>').appendTo(this.$prompt),this.$promptApplyToRemainingContainer=$('<label class="assets-applytoremaining"/>').appendTo(this.$prompt).hide(),this.$promptApplyToRemainingCheckbox=$('<input type="checkbox"/>').appendTo(this.$promptApplyToRemainingContainer),this.$promptApplyToRemainingLabel=$("<span/>").appendTo(this.$promptApplyToRemainingContainer),this.$promptButtons=$('<div class="buttons right"/>').appendTo(this.$prompt),this.modal.setContainer(this.$modalContainerDiv),this.$promptMessage.html(t);for(var a=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(this.$promptButtons),n=$("<button/>",{type:"submit",class:"btn submit disabled",text:Craft.t("app","OK")}).appendTo(this.$promptButtons),r=0;r<e.length;r++){var o=$('<div><label><input type="radio" name="promptAction" value="'+e[r].value+'"/> '+e[r].title+"</label></div>").appendTo(this.$promptChoices).find("input");this.addListener(o,"click",(function(){n.removeClass("disabled")}))}this.addListener(n,"activate",(function(t){var e=$(t.currentTarget).parents(".modal").find("input[name=promptAction]:checked").val(),i=this.$promptApplyToRemainingCheckbox.prop("checked");this._selectPromptChoice(e,i)})),this.addListener(a,"activate",(function(){var t=this.$promptApplyToRemainingCheckbox.prop("checked");this._selectPromptChoice("cancel",t)})),s&&(this.$promptApplyToRemainingContainer.show(),this.$promptApplyToRemainingLabel.html(" "+Craft.t("app","Apply this to the {number} remaining conflicts?",{number:s}))),this.modal.show(),this.modal.removeListener(Garnish.Modal.$shade,"click"),this.addListener(Garnish.Modal.$shade,"click","_cancelPrompt")},_selectPromptChoice:function(t,e){var i=this;this.$prompt.fadeOut("fast",(function(){i.modal.hide(),i._promptCallback(t,e)}))},_cancelPrompt:function(){this._selectPromptChoice("cancel",!0)}})},8960:function(){Craft.Queue=Garnish.Base.extend({running:!1,paused:!1,pausedForVisibility:!1,jobs:null,get length(){return this.jobs.length},get isPaused(){return this.paused||this.pausedForVisibility},init:function(){var t=this;this.jobs=[],Garnish.$doc.on("visibilitychange",(function(){t.pausedForVisibility&&Craft.isVisible()&&(t.pausedForVisibility=!1,t._resume())}))},push:function(t){return this._add(t,"push")},unshift:function(t){return this._add(t,"unshift")},pause:function(){this.paused||(this.paused=!0,this.pausedForVisibility||this.trigger("pause"))},resume:function(){this.paused&&(this.paused=!1,this._resume())},_add:function(t,e){var i=this;return new Promise((function(s,a){i.jobs[e]((function(){return new Promise((function(e,i){t().then((function(t){s(t),e()})).catch((function(t){a(t),i()}))}))})),i.running||(i.trigger("beforeRun"),i.running=!0,i._exec())}))},clear:function(){this.jobs.length=0},_exec:function(){var t=this;if(!this.jobs.length)return this.running=!1,void this.trigger("afterRun");this.pausedForVisibility||Craft.isVisible()||(this.pausedForVisibility=!0,this.paused||this.trigger("pause")),this.paused||this.pausedForVisibility||(this.trigger("beforeExec"),this.jobs.shift()().finally((function(){t.trigger("afterExec"),t._exec()})))},_resume:function(){this.isPaused||(this.trigger("resume"),this._exec())}}),Craft.queue=new Craft.Queue},4070:function(){!function(t){Craft.SlidePicker=Garnish.Base.extend({min:null,max:null,totalSteps:null,value:null,label:null,describedBy:null,$container:null,$buttons:null,init:function(e,i){var s=this;this.setSettings(i,Craft.SlidePicker.defaults),this.$container=t("<div/>",{class:"slide-picker",role:"slider",tabindex:0}),this.refresh(),this.setValue(e,!1),this.addListener(this.$container,"keydown",(function(t){switch(t.keyCode){case Garnish.UP_KEY:s.setValue(s.value+s.settings.step),t.preventDefault();break;case Garnish.DOWN_KEY:s.setValue(s.value-s.settings.step),t.preventDefault();break;case Garnish.RIGHT_KEY:"ltr"===Craft.orientation?s.setValue(s.value+s.settings.step):s.setValue(s.value-s.settings.step),t.preventDefault();break;case Garnish.LEFT_KEY:"ltr"===Craft.orientation?s.setValue(s.value-s.settings.step):s.setValue(s.value+s.settings.step),t.preventDefault();break;case Garnish.HOME_KEY:s.setValue(s.min),t.preventDefault();break;case Garnish.END_KEY:s.setValue(s.max),t.preventDefault()}}))},refresh:function(){var e=this;if(this.min=this._min(),this.max=this._max(),this.totalSteps=(this.max-this.min)/this.settings.step,this.label=this.settings.label,this.describedBy=this.settings.describedBy,!Number.isInteger(this.totalSteps))throw"Invalid SlidePicker config";this.$buttons&&this.$buttons.remove(),this.$container.attr("aria-valuemin",this.min),this.$container.attr("aria-valuemax",this.max),this.label&&this.$container.attr("aria-label",this.label),this.describedBy&&this.$container.attr("aria-describedby",this.describedBy),this.$buttons=t();for(var i=this.min;i<=this.max;i+=this.settings.step)this.$buttons=this.$buttons.add(t("<a/>",{title:this.settings.valueLabel(i),data:{value:i}}));if(this.$buttons.appendTo(this.$container),null!==this.value){var s=this.value;this.value=null,this.setValue(s,!1)}this.addListener(this.$buttons,"mouseover",(function(i){e.$buttons.removeClass("active-hover last-active-hover"),t(i.currentTarget).addClass("active-hover last-active-hover").prevAll().addClass("active-hover")})),this.addListener(this.$buttons,"mouseout",(function(){e.$buttons.removeClass("active-hover")})),this.addListener(this.$buttons,"click",(function(i){e.setValue(t.data(i.currentTarget,"value")),i.stopPropagation(),e.$container.focus()}))},setValue:function(t,e){if(t=Math.max(Math.min(t,this.max),this.min),this.value!==(this.value=t)){this.$container.attr({"aria-valuenow":this.value,"aria-valuetext":this.settings.valueLabel(this.value)}),this.$buttons.removeClass("last-active active");var i=this.$buttons.eq((this.value-this.min)/this.settings.step);i.add(i.prevAll()).addClass("active"),i.addClass("last-active"),!1!==e&&this.settings.onChange(t)}},_min:function(){return"function"==typeof this.settings.min?this.settings.min():this.settings.min},_max:function(){return"function"==typeof this.settings.max?this.settings.max():this.settings.max}},{defaults:{min:0,max:100,step:10,valueLabel:null,onChange:t.noop}})}(jQuery)},5763:function(){Craft.SlideRuleInput=Garnish.Base.extend({$container:null,$options:null,$selectedOption:null,$input:null,value:null,startPositionX:null,init:function(t,e){var i=this;this.setSettings(e,Craft.SlideRuleInput.defaultSettings),this.value=0,this.graduationsMin=-70,this.graduationsMax=70,this.slideMin=-45,this.slideMax=45,this.$container=$("#"+t),this.$overlay=$('<div class="overlay"></div>').appendTo(this.$container),this.$cursor=$('<div class="cursor"></div>').appendTo(this.$container),this.$graduations=$('<div class="graduations"></div>').appendTo(this.$container),this.$graduationsUl=$("<ul></ul>").appendTo(this.$graduations),this.$container.attr({role:"slider",tabindex:"0","aria-valuemin":this.slideMin,"aria-valuemax":this.slideMax,"aria-valuenow":"0","aria-valuetext":Craft.t("app","{num, number} {num, plural, =1{degree} other{degrees}}",{num:0})});for(var s=this.graduationsMin;s<=this.graduationsMax;s++){var a=$('<li class="graduation" data-graduation="'+s+'"><div class="label">'+s+"</div></li>").appendTo(this.$graduationsUl);s%5==0&&a.addClass("main-graduation"),0===s&&a.addClass("selected")}this.$options=this.$container.find(".graduation"),this.addListener(this.$container,"resize",this._handleResize.bind(this)),this.addListener(this.$container,"tapstart",this._handleTapStart.bind(this)),this.addListener(Garnish.$bod,"tapmove",this._handleTapMove.bind(this)),this.addListener(Garnish.$bod,"tapend",this._handleTapEnd.bind(this)),this.addListener(this.$container,"keydown",this._handleKeypress.bind(this)),setTimeout((function(){i.graduationsCalculatedWidth=10*(i.$options.length-1),i.$graduationsUl.css("left",-i.graduationsCalculatedWidth/2+i.$container.width()/2)}),50)},_handleResize:function(){var t=this.valueToPosition(this.value);this.$graduationsUl.css("left",t)},_handleKeypress:function(t){var e=parseInt(this.$container.attr("aria-valuenow"),10);switch(t.keyCode){case Garnish.UP_KEY:case Garnish.RIGHT_KEY:this.setValue(e+1);break;case Garnish.DOWN_KEY:case Garnish.LEFT_KEY:this.setValue(e-1);break;case Garnish.PAGE_UP_KEY:this.setValue(e+10);break;case Garnish.PAGE_DOWN_KEY:this.setValue(e-10);break;case Garnish.HOME_KEY:this.setValue(this.slideMin);break;case Garnish.END_KEY:this.setValue(this.slideMax)}this.onChange()},_handleTapStart:function(t,e){t.preventDefault(),this.startPositionX=e.position.x,this.startLeft=this.$graduationsUl.position().left,this.dragging=!0,this.onStart()},_handleTapMove:function(t,e){if(this.dragging){t.preventDefault();var i=this.startPositionX-e.position.x,s=this.startLeft-i,a=this.positionToValue(s);this.setValue(a),this.onChange()}},setValue:function(t){var e=this.valueToPosition(t);t<this.slideMin?(t=this.slideMin,e=this.valueToPosition(t)):t>this.slideMax&&(t=this.slideMax,e=this.valueToPosition(t)),this.$graduationsUl.css("left",e),t>=this.slideMin&&t<=this.slideMax&&(this.$options.removeClass("selected"),$.each(this.$options,(function(e,i){$(i).data("graduation")>0&&$(i).data("graduation")<=t&&$(i).addClass("selected"),$(i).data("graduation")<0&&$(i).data("graduation")>=t&&$(i).addClass("selected"),0==$(i).data("graduation")&&$(i).addClass("selected")}))),this.$container.attr({"aria-valuenow":t,"aria-valuetext":Craft.t("app","{num, number} {num, plural, =1{degree} other{degrees}}",{num:parseInt(t,10)})}),this.value=t},_handleTapEnd:function(t){this.dragging&&(t.preventDefault(),this.dragging=!1,this.onEnd())},positionToValue:function(t){var e=-1*this.graduationsMin,i=-1*(this.graduationsMin-this.graduationsMax);return(this.$graduations.width()/2+-1*t)/this.graduationsCalculatedWidth*i-e},valueToPosition:function(t){var e=-1*this.graduationsMin,i=-1*(this.graduationsMin-this.graduationsMax);return-((t+e)*this.graduationsCalculatedWidth/i-this.$graduations.width()/2)},onStart:function(){"function"==typeof this.settings.onChange&&this.settings.onStart(this)},onChange:function(){"function"==typeof this.settings.onChange&&this.settings.onChange(this)},onEnd:function(){"function"==typeof this.settings.onChange&&this.settings.onEnd(this)},defaultSettings:{onStart:$.noop,onChange:$.noop,onEnd:$.noop}})},5759:function(){!function(t){Craft.Slideout=Garnish.Base.extend({$outerContainer:null,$container:null,$shade:null,isOpen:!1,init:function(e,i){var s=this;this.setSettings(i,Craft.Slideout.defaults),Craft.useMobileStyles()||(this.$shade=t('<div class="slideout-shade"/>').appendTo(Garnish.$bod),this.settings.closeOnShadeClick&&this.addListener(this.$shade,"click",(function(t){t.stopPropagation(),s.close()}))),this.$outerContainer=t("<div/>",{class:"slideout-container hidden"}),this.$container=t("<".concat(this.settings.containerElement,"/>"),this.settings.containerAttributes).attr("data-slideout","").addClass("slideout").append(e).data("slideout",this).appendTo(this.$outerContainer),Garnish.addModalAttributes(this.$outerContainer),Craft.useMobileStyles()&&this.$container.addClass("so-mobile"),Craft.trapFocusWithin(this.$container),this.settings.autoOpen&&this.open()},open:function(){var t=this;this.isOpen||(this.setTriggerElement(document.activeElement),this._cancelTransitionListeners(),this.$shade&&this.$shade.appendTo(Garnish.$bod).show(),this.$outerContainer.appendTo(Garnish.$bod).removeClass("hidden"),Craft.useMobileStyles()?this.$container.css("top","100vh"):this.$container.css(Garnish.ltr?"left":"right","100vw"),this.$container.one("transitionend.slideout",(function(){Craft.setFocusWithin(t.$container)})),this.$shade&&(this.$shade[0].offsetWidth,this.$shade.addClass("so-visible")),this.$container[0].offsetWidth,Craft.Slideout.addPanel(this),this.enable(),Garnish.uiLayerManager.addLayer(this.$outerContainer),Garnish.hideModalBackgroundLayers(),this.settings.closeOnEsc&&Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.close()})),this.isOpen=!0,this.trigger("open"))},setTriggerElement:function(t){this.settings.triggerElement=t},close:function(){var t=this;this.isOpen&&(this.trigger("beforeClose"),this.disable(),this.isOpen=!1,this._cancelTransitionListeners(),this.$shade&&this.$shade.removeClass("so-visible").one("transitionend.slideout",(function(){t.$shade.hide()})),Craft.Slideout.removePanel(this),Garnish.uiLayerManager.removeLayer(),Garnish.resetModalBackgroundLayerVisibility(),this.$container.one("transitionend.slideout",(function(){t.$outerContainer.addClass("hidden"),t.trigger("close")})),this.settings.triggerElement&&this.settings.triggerElement.focus())},_cancelTransitionListeners:function(){this.$shade&&this.$shade.off("transitionend.slideout"),this.$container.off("transitionend.slideout")},destroy:function(){this.$shade&&(this.$shade.remove(),this.$shade=null),this.$outerContainer.remove(),this.$outerContainer=null,this.$container=null,this.base()}},{defaults:{containerElement:"div",containerAttributes:{},autoOpen:!0,closeOnEsc:!0,closeOnShadeClick:!0,triggerElement:null},openPanels:[],addPanel:function(t){Craft.Slideout.openPanels.unshift(t),Craft.useMobileStyles()?t.$container.css("top",0):Craft.Slideout.updateStyles()},removePanel:function(t){Craft.Slideout.openPanels=Craft.Slideout.openPanels.filter((function(e){return e!==t})),Craft.useMobileStyles()?t.$container.css("top","100vh"):(t.$container.css(Garnish.ltr?"left":"right","100vw"),Craft.Slideout.updateStyles())},updateStyles:function(){var t=Craft.Slideout.openPanels.length;Craft.Slideout.openPanels.forEach((function(e,i){e.$container.css(Garnish.ltr?"left":"right","".concat((t-i)/t*50,"vw"))})),0!==t?Garnish.$bod.addClass("no-scroll"):Garnish.$bod.removeClass("no-scroll")}})}(jQuery)},5185:function(){Craft.SlugGenerator=Craft.BaseInputGenerator.extend({generateTargetValue:function(t){t=(t=t.replace(/<(.*?)>/g,"")).replace(/['"‘’“”\[\]\(\)\{\}:]/g,""),Craft.allowUppercaseInSlug||(t=t.toLowerCase()),Craft.limitAutoSlugsToAscii&&(t=Craft.asciiString(t,this.settings.charMap));var e=Craft.filterArray(XRegExp.matchChain(t,[XRegExp("[\\p{L}\\p{N}\\p{M}]+")]));return e.length?e.join(Craft.slugWordSeparator):""}})},8030:function(){Craft.Structure=Garnish.Base.extend({id:null,$container:null,state:null,structureDrag:null,init:function(t,e,i){this.id=t,this.$container=$(e),this.setSettings(i,Craft.Structure.defaults),this.$container.data("structure")&&(console.warn("Double-instantiating a structure on an element"),this.$container.data("structure").destroy()),this.$container.data("structure",this),this.state={},this.settings.storageKey&&$.extend(this.state,Craft.getLocalStorage(this.settings.storageKey,{})),void 0===this.state.collapsedElementIds&&(this.state.collapsedElementIds=[]);for(var s=this.$container.find("ul").prev(".row"),a=0;a<s.length;a++){var n=$(s[a]),r=n.parent(),o=$('<div class="toggle" title="'+Craft.t("app","Show/hide children")+'"/>').prependTo(n);-1!==$.inArray(n.children(".element").data("id"),this.state.collapsedElementIds)&&r.addClass("collapsed"),this.initToggle(o)}this.settings.sortable&&(this.structureDrag=new Craft.StructureDrag(this,this.settings.maxLevels)),this.settings.newChildUrl&&this.initNewChildMenus(this.$container.find(".add"))},initToggle:function(t){var e=this;t.on("click",(function(t){var i=$(t.currentTarget).closest("li"),s=i.children(".row").find(".element:first").data("id"),a=$.inArray(s,e.state.collapsedElementIds);i.hasClass("collapsed")?(i.removeClass("collapsed"),-1!==a&&e.state.collapsedElementIds.splice(a,1)):(i.addClass("collapsed"),-1===a&&e.state.collapsedElementIds.push(s)),e.settings.storageKey&&Craft.setLocalStorage(e.settings.storageKey,e.state)}))},initNewChildMenus:function(t){this.addListener(t,"click","onNewChildMenuClick")},onNewChildMenuClick:function(t){var e=$(t.currentTarget);if(!e.data("menubtn")){var i=e.parent().children(".element").data("id"),s=Craft.getUrl(this.settings.newChildUrl,"parentId="+i);$('<div class="menu"><ul><li><a href="'+s+'">'+Craft.t("app","New child")+"</a></li></ul></div>").insertAfter(e),new Garnish.MenuBtn(e).showMenu()}},getIndent:function(t){return Craft.Structure.baseIndent+(t-1)*Craft.Structure.nestedIndent},addElement:function(t){var e=$('<li data-level="1"/>').appendTo(this.$container),i=$('<div class="row" style="margin-'+Craft.left+": -"+Craft.Structure.baseIndent+"px; padding-"+Craft.left+": "+Craft.Structure.baseIndent+'px;">').appendTo(e);if(i.append(t),this.settings.sortable&&(i.append('<a class="move icon" title="'+Craft.t("app","Move")+'"></a>'),this.structureDrag.addItems(e)),this.settings.newChildUrl){var s=$('<a class="add icon" title="'+Craft.t("app","New child")+'"></a>').appendTo(i);this.initNewChildMenus(s)}i.css("margin-bottom",-30),i.velocity({"margin-bottom":0},"fast")},removeElement:function(t){var e,i=this,s=t.parent().parent();this.settings.sortable&&this.structureDrag.removeItems(s),s.siblings().length||(e=s.parent()),s.css("visibility","hidden").velocity({marginBottom:-s.height()},"fast",(function(){s.remove(),void 0!==e&&i._removeUl(e)}))},_removeUl:function(t){t.siblings(".row").children(".toggle").remove(),t.remove()},destroy:function(){this.$container.removeData("structure"),this.base()}},{baseIndent:8,nestedIndent:35,defaults:{storageKey:null,sortable:!1,newChildUrl:null,maxLevels:null}})},3096:function(){Craft.StructureDrag=Garnish.Drag.extend({structure:null,maxLevels:null,draggeeLevel:null,$helperLi:null,$targets:null,draggeeHeight:null,init:function(t,e){this.structure=t,this.maxLevels=e,this.$insertion=$('<li class="draginsertion"/>');var i=this.structure.$container.find("li");this.base(i,{handle:".element:first, .move:first",helper:this.getHelper.bind(this)})},getHelper:function(t){this.$helperLi=t;var e=$('<ul class="structure draghelper"/>').append(t);return t.css("padding-"+Craft.left,this.$draggee.css("padding-"+Craft.left)),t.find(".move").removeAttr("title"),e},onDragStart:function(){var t=this;this.$targets=$(),this.findTargets(this.structure.$container),this.draggeeLevel=0;var e=this.$draggee;do{this.draggeeLevel++,e=e.find("> ul > li")}while(e.length);this.draggeeHeight=this.$draggee.height(),this.$draggee.velocity({height:0},"fast",(function(){t.$draggee.addClass("hidden")})),this.base(),this.addListener(Garnish.$doc,"keydown",(function(t){t.keyCode===Garnish.ESC_KEY&&this.cancelDrag()}))},findTargets:function(t){for(var e=t.children().not(this.$draggee),i=0;i<e.length;i++){var s=$(e[i]);this.$targets=this.$targets.add(s.children(".row")),s.hasClass("collapsed")||this.findTargets(s.children("ul"))}},onDrag:function(){for(this._.$closestTarget&&(this._.$closestTarget.removeClass("draghover"),this.$insertion.remove()),this._.$closestTarget=null,this._.closestTargetPos=null,this._.closestTargetYDiff=null,this._.closestTargetOffset=null,this._.closestTargetHeight=null,this._.i=0;this._.i<this.$targets.length&&(this._.$target=$(this.$targets[this._.i]),this._.targetOffset=this._.$target.offset(),this._.targetHeight=this._.$target.outerHeight(),this._.targetYMidpoint=this._.targetOffset.top+this._.targetHeight/2,this._.targetYDiff=Math.abs(this.mouseY-this._.targetYMidpoint),0===this._.i||this.mouseY>=this._.targetOffset.top+5&&this._.targetYDiff<this._.closestTargetYDiff);this._.i++)this._.$closestTarget=this._.$target,this._.closestTargetPos=this._.i,this._.closestTargetYDiff=this._.targetYDiff,this._.closestTargetOffset=this._.targetOffset,this._.closestTargetHeight=this._.targetHeight;if(this._.$closestTarget)if(0===this._.closestTargetPos&&this.mouseY<this._.closestTargetOffset.top+5)this.$insertion.prependTo(this.structure.$container);else if(this._.$closestTargetLi=this._.$closestTarget.parent(),this._.closestTargetLevel=this._.$closestTargetLi.data("level"),this._.closestTargetPos<this.$targets.length-1?(this._.$nextTargetLi=$(this.$targets[this._.closestTargetPos+1]).parent(),this._.nextTargetLevel=this._.$nextTargetLi.data("level")):(this._.$nextTargetLi=null,this._.nextTargetLevel=null),this._.hoveringBetweenRows=this.mouseY>=this._.closestTargetOffset.top+this._.closestTargetHeight-5,this._.$nextTargetLi&&this._.nextTargetLevel==this._.closestTargetLevel)this._.hoveringBetweenRows?(!this.maxLevels||this.maxLevels>=this._.closestTargetLevel+this.draggeeLevel-1)&&this.$insertion.insertAfter(this._.$closestTargetLi):(!this.maxLevels||this.maxLevels>=this._.closestTargetLevel+this.draggeeLevel)&&this._.$closestTarget.addClass("draghover");else if(this._.$nextTargetLi&&this._.nextTargetLevel>this._.closestTargetLevel)(!this.maxLevels||this.maxLevels>=this._.nextTargetLevel+this.draggeeLevel-1)&&(this._.hoveringBetweenRows?this.$insertion.insertBefore(this._.$nextTargetLi):(this._.$closestTarget.addClass("draghover"),this.$insertion.appendTo(this._.$closestTargetLi.children("ul"))));else if(this._.hoveringBetweenRows){for(this._.draggeeX=this.mouseX-this.targetItemMouseDiffX,"rtl"===Craft.orientation&&(this._.draggeeX+=this.$helperLi.width()),this._.$parentLis=this._.$closestTarget.parentsUntil(this.structure.$container,"li"),this._.$closestParentLi=null,this._.closestParentLiXDiff=null,this._.closestParentLevel=null,this._.i=0;this._.i<this._.$parentLis.length;this._.i++)this._.$parentLi=$(this._.$parentLis[this._.i]),this._.parentLiX=this._.$parentLi.offset().left,"rtl"===Craft.orientation&&(this._.parentLiX+=this._.$parentLi.width()),this._.parentLiXDiff=Math.abs(this._.parentLiX-this._.draggeeX),this._.parentLevel=this._.$parentLi.data("level"),(!this.maxLevels||this.maxLevels>=this._.parentLevel+this.draggeeLevel-1)&&(!this._.$closestParentLi||this._.parentLiXDiff<this._.closestParentLiXDiff&&(!this._.$nextTargetLi||this._.parentLevel>=this._.nextTargetLevel))&&(this._.$closestParentLi=this._.$parentLi,this._.closestParentLiXDiff=this._.parentLiXDiff,this._.closestParentLevel=this._.parentLevel);this._.$closestParentLi&&this.$insertion.insertAfter(this._.$closestParentLi)}else(!this.maxLevels||this.maxLevels>=this._.closestTargetLevel+this.draggeeLevel)&&this._.$closestTarget.addClass("draghover")},cancelDrag:function(){this.$insertion.remove(),this._.$closestTarget&&this._.$closestTarget.removeClass("draghover"),this.onMouseUp()},onDragStop:function(){var t=this;if(this._.$closestTarget&&(this.$insertion.parent().length||this._.$closestTarget.hasClass("draghover"))){var e,i;if(this.$draggee.siblings().length||(e=this.$draggee.parent()),this.$insertion.parent().length){var s=this.$insertion.next().add(this.$insertion.prev());-1===$.inArray(this.$draggee[0],s)?(this.$insertion.replaceWith(this.$draggee),i=!0):(this.$insertion.remove(),i=!1)}else{var a=this._.$closestTargetLi.children("ul");if(e&&a.length&&a[0]===e[0])i=!1;else{if(a.length)this._.$closestTargetLi.hasClass("collapsed")&&this._.$closestTarget.children(".toggle").trigger("click");else{var n=$('<div class="toggle" title="'+Craft.t("app","Show/hide children")+'"/>').prependTo(this._.$closestTarget);this.structure.initToggle(n),a=$("<ul>").appendTo(this._.$closestTargetLi)}this.$draggee.appendTo(a),i=!0}}if(this._.$closestTarget.removeClass("draghover"),i){e&&this.structure._removeUl(e);var r,o=this.$draggee.parentsUntil(this.structure.$container,"li").length+1;o!=this.$draggee.data("level")&&(1==this.$draggee.data("level")?((r={})["padding-"+Craft.left]=38,this.$helperLi.velocity(r,"fast")):1==o&&((r={})["padding-"+Craft.left]=Craft.Structure.baseIndent,this.$helperLi.velocity(r,"fast")),this.setLevel(this.$draggee,o));var l=this.$draggee.children(".row").children(".element"),h={structureId:this.structure.id,elementId:l.data("id"),siteId:l.data("site-id"),prevId:this.$draggee.prev().children(".row").children(".element").data("id"),parentId:this.$draggee.parent("ul").parent("li").children(".row").children(".element").data("id")};Craft.sendActionRequest("POST","structures/move-element",{data:h}).then((function(t){Craft.cp.displaySuccess(Craft.t("app","New order saved."))}))}}this.$draggee.velocity("stop").removeClass("hidden").velocity({height:this.draggeeHeight},"fast",(function(){t.$draggee.css("height","auto")})),this.returnHelpersToDraggees(),this.base()},setLevel:function(t,e){t.data("level",e);var i=this.structure.getIndent(e),s={};s["margin-"+Craft.left]="-"+i+"px",s["padding-"+Craft.left]=i+"px",this.$draggee.children(".row").css(s);for(var a=t.children("ul").children(),n=0;n<a.length;n++)this.setLevel($(a[n]),e+1)}})},3331:function(){Craft.StructureTableSorter=Garnish.DragSort.extend({tableView:null,structureId:null,maxLevels:null,_basePadding:null,_helperMargin:null,_$firstRowCells:null,_$titleHelperCell:null,_titleHelperCellOuterWidth:null,_ancestors:null,_updateAncestorsFrame:null,_draggeeLevel:null,_draggeeLevelDelta:null,draggingLastElements:null,_loadingDraggeeLevelDelta:!1,_targetLevel:null,_targetLevelBounds:null,_positionChanged:null,init:function(t,e,i){this.tableView=t,this.structureId=this.tableView.$table.data("structure-id"),this.maxLevels=parseInt(this.tableView.$table.attr("data-max-levels")),this._basePadding=14+(this.tableView.elementIndex.actions?34:24),this._helperMargin=this.tableView.elementIndex.actions?54:0,i=$.extend({},Craft.StructureTableSorter.defaults,i,{handle:".move",collapseDraggees:!0,singleHelper:!0,helperSpacingY:2,magnetStrength:4,helper:this.getHelper.bind(this),helperLagBase:1.5,axis:Garnish.Y_AXIS}),this.base(e,i)},findDraggee:function(){var t=this;this._draggeeLevel=this._targetLevel=this.$targetItem.data("level"),this._draggeeLevelDelta=0;for(var e=$(this.$targetItem),i=this.$targetItem.next();i.length;){var s=i.data("level");if(s<=this._draggeeLevel)break;var a=s-this._draggeeLevel;a>this._draggeeLevelDelta&&(this._draggeeLevelDelta=a),e=e.add(i),i=i.next()}if(this.draggingLastElements=!i.length,this.maxLevels&&this.draggingLastElements&&this.tableView.getMorePending()){this._loadingDraggeeLevelDelta=!0;var n=this._getAjaxBaseData(this.$targetItem);Craft.sendActionRequest("POST","structures/get-element-level-delta",{data:n}).then((function(e){t._loadingDraggeeLevelDelta=!1,t.dragging&&(t._draggeeLevelDelta=e.data.delta,t.drag(!1))}))}return e},getHelper:function(t){var e=$('<div class="elements datatablesorthelper"/>').appendTo(Garnish.$bod),i=$('<div class="tableview"/>').appendTo(e),s=$('<table class="data"/>').appendTo(i),a=$("<tbody/>").appendTo(s);t.appendTo(a),this._$firstRowCells=this.tableView.$elementContainer.children("tr:first").children();for(var n=t.children(),r=0;r<n.length;r++){var o=$(n[r]);if(o.hasClass("checkbox-cell"))o.remove();else{var l=$(this._$firstRowCells[r]),h=l[0].getBoundingClientRect().width;l.css("width",h+"px"),o.css("width",h+"px"),Garnish.hasAttr(l,"data-titlecell")&&(this._$titleHelperCell=o,parseInt(l.css("padding-"+Craft.left)),this._titleHelperCellOuterWidth=h,o.css("padding-"+Craft.left,this._basePadding))}}return e},canInsertBefore:function(t){return!this._loadingDraggeeLevelDelta&&!1!==this._getLevelBounds(t.prev(),t)},canInsertAfter:function(t){return!this._loadingDraggeeLevelDelta&&!1!==this._getLevelBounds(t,t.next())},onDragStart:function(){this._ancestors=this._getAncestors(this.$targetItem,this.$targetItem.data("level")),this._setTargetLevelBounds(),this.tableView.maybeLoadMore(),this.base()},onDrag:function(){this.base(),this._updateIndent()},onInsertionPointChange:function(){this._setTargetLevelBounds(),this._updateAncestorsBeforeRepaint(),this.base()},onDragStop:function(){var t=this;if(this._positionChanged=!1,this.base(),this._targetLevel!=this._draggeeLevel){for(var e=this._targetLevel-this._draggeeLevel,i=0;i<this.$draggee.length;i++){var s=$(this.$draggee[i]),a=s.data("level")+e,n=this._basePadding+this._getLevelIndent(a);s.data("level",a),s.find(".element").data("level",a),s.children("[data-titlecell]:first").css("padding-"+Craft.left,n)}this._positionChanged=!0}if(this._positionChanged){for(var r=this._getAjaxBaseData(this.$draggee),o=this.$draggee.first().prev();o.length;){var l=o.data("level");if(l==this._targetLevel){r.prevId=o.data("id");break}if(l<this._targetLevel){r.parentId=o.data("id");var h=o.find("> th > .toggle");if(!h.hasClass("expanded")){h.addClass("expanded");var d=this.tableView._createSpinnerRowAfter(o);this.tableView.elementSelect&&this.tableView.elementSelect.removeItems(this.$targetItem),this.removeItems(this.$targetItem),this.$targetItem.remove(),this.tableView._totalVisible--}break}o=o.prev()}Craft.sendActionRequest("POST","structures/move-element",{data:r}).then((function(e){Craft.cp.displaySuccess(Craft.t("app","New position saved.")),t.onPositionChange(),d&&d.parent().length&&(d.remove(),t.tableView._expandElement(h,!0)),Craft.cp.runQueue()})).catch((function(e){e.response,Craft.cp.displayError(Craft.t("app","A server error occurred.")),t.tableView.elementIndex.updateElements()}))}},onSortChange:function(){this.tableView.elementSelect&&this.tableView.elementSelect.resetItemOrder(),this._positionChanged=!0,this.base()},onPositionChange:function(){var t=this;Garnish.requestAnimationFrame((function(){t.trigger("positionChange"),t.settings.onPositionChange()}))},onReturnHelpersToDraggees:function(){if(this._$firstRowCells.css("width",""),this.draggingLastElements&&this.tableView.getMorePending()){this.tableView._totalVisible+=this.newDraggeeIndexes[0]-this.oldDraggeeIndexes[0];var t=this.$draggee.last().nextAll();t.length&&(this.removeItems(t),t.remove(),this.tableView.maybeLoadMore())}this.base()},_getLevelBounds:function(t,e){if(e&&e.length?this._getLevelBounds._minLevel=e.data("level"):this._getLevelBounds._minLevel=1,t&&t.length?this._getLevelBounds._maxLevel=t.data("level")+1:this._getLevelBounds._maxLevel=1,this.maxLevels){if(1!=this._getLevelBounds._minLevel&&this._getLevelBounds._minLevel+this._draggeeLevelDelta>this.maxLevels)return!1;this._getLevelBounds._maxLevel+this._draggeeLevelDelta>this.maxLevels&&(this._getLevelBounds._maxLevel=this.maxLevels-this._draggeeLevelDelta,this._getLevelBounds._maxLevel<this._getLevelBounds._minLevel&&(this._getLevelBounds._maxLevel=this._getLevelBounds._minLevel))}return{min:this._getLevelBounds._minLevel,max:this._getLevelBounds._maxLevel}},_setTargetLevelBounds:function(){this._targetLevelBounds=this._getLevelBounds(this.$draggee.first().prev(),this.$draggee.last().next())},_updateIndent:function(t){this._updateIndent._mouseDist=this.realMouseX-this.mousedownX,"rtl"===Craft.orientation&&(this._updateIndent._mouseDist*=-1),this._updateIndent._indentationDist=Math.round(this._updateIndent._mouseDist/Craft.StructureTableSorter.LEVEL_INDENT),this._updateIndent._targetLevel=this._draggeeLevel+this._updateIndent._indentationDist,this._updateIndent._targetLevel<this._targetLevelBounds.min?(this._updateIndent._indentationDist+=this._targetLevelBounds.min-this._updateIndent._targetLevel,this._updateIndent._targetLevel=this._targetLevelBounds.min):this._updateIndent._targetLevel>this._targetLevelBounds.max&&(this._updateIndent._indentationDist-=this._updateIndent._targetLevel-this._targetLevelBounds.max,this._updateIndent._targetLevel=this._targetLevelBounds.max),this._targetLevel!==(this._targetLevel=this._updateIndent._targetLevel)&&this._updateAncestorsBeforeRepaint(),this._updateIndent._targetLevelMouseDiff=this._updateIndent._mouseDist-this._updateIndent._indentationDist*Craft.StructureTableSorter.LEVEL_INDENT,this._updateIndent._magnetImpact=Math.round(this._updateIndent._targetLevelMouseDiff/15),Math.abs(this._updateIndent._magnetImpact)>Craft.StructureTableSorter.MAX_GIVE&&(this._updateIndent._magnetImpact=(this._updateIndent._magnetImpact>0?1:-1)*Craft.StructureTableSorter.MAX_GIVE),this._updateIndent._closestLevelMagnetIndent=this._getLevelIndent(this._targetLevel)+this._updateIndent._magnetImpact,this.helpers[0].css("margin-"+Craft.left,this._updateIndent._closestLevelMagnetIndent+this._helperMargin),this._$titleHelperCell.css("width",this._titleHelperCellOuterWidth-this._updateIndent._closestLevelMagnetIndent)},_getLevelIndent:function(t){return(t-1)*Craft.StructureTableSorter.LEVEL_INDENT},_getAjaxBaseData:function(t){return{structureId:this.structureId,elementId:t.data("id"),siteId:t.find(".element:first").data("site-id")}},_getAncestors:function(t,e){if(this._getAncestors._ancestors=[],0!=e)for(this._getAncestors._level=e,this._getAncestors._$prevRow=t.prev();this._getAncestors._$prevRow.length&&!(this._getAncestors._$prevRow.data("level")<this._getAncestors._level&&(this._getAncestors._ancestors.unshift(this._getAncestors._$prevRow),this._getAncestors._level=this._getAncestors._$prevRow.data("level"),0==this._getAncestors._level));)this._getAncestors._$prevRow=this._getAncestors._$prevRow.prev();return this._getAncestors._ancestors},_updateAncestorsBeforeRepaint:function(){this._updateAncestorsFrame&&Garnish.cancelAnimationFrame(this._updateAncestorsFrame),this._updateAncestorsFrame=Garnish.requestAnimationFrame(this._updateAncestors.bind(this))},_updateAncestors:function(){for(this._updateAncestorsFrame=null,this._updateAncestors._i=0;this._updateAncestors._i<this._ancestors.length;this._updateAncestors._i++)this._updateAncestors._$ancestor=this._ancestors[this._updateAncestors._i],this._updateAncestors._$ancestor.data("descendants",this._updateAncestors._$ancestor.data("descendants")-1),0==this._updateAncestors._$ancestor.data("descendants")&&this._updateAncestors._$ancestor.find("> th > .toggle:first").remove();for(this._updateAncestors._newAncestors=this._getAncestors(this.$targetItem,this._targetLevel),this._updateAncestors._i=0;this._updateAncestors._i<this._updateAncestors._newAncestors.length;this._updateAncestors._i++)if(this._updateAncestors._$ancestor=this._updateAncestors._newAncestors[this._updateAncestors._i],this._updateAncestors._$ancestor.data("descendants",this._updateAncestors._$ancestor.data("descendants")+1),1==this._updateAncestors._$ancestor.data("descendants")){var t=this._updateAncestors._$ancestor.data("title");$('<button class="toggle expanded" type="button" aria-expanded="true" title="'+Craft.t("app","Show/hide children")+'" aria-label="'+Craft.t("app","Show {title} children",{title:t})+'"></button>').insertAfter(this._updateAncestors._$ancestor.find("> th .move:first"))}this._ancestors=this._updateAncestors._newAncestors,delete this._updateAncestors._i,delete this._updateAncestors._$ancestor,delete this._updateAncestors._newAncestors}},{HELPER_MARGIN:0,LEVEL_INDENT:44,MAX_GIVE:22,defaults:{onPositionChange:$.noop}})},53:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.TableElementIndexView=Craft.BaseElementIndexView.extend({$table:null,$tableCaption:null,$selectedSortHeader:null,$statusMessage:null,structureTableSort:null,_totalVisiblePostStructureTableDraggee:null,_morePendingPostStructureTableDraggee:!1,_broadcastListener:null,getElementContainer:function(){return this.$table=this.$container.find("table:first"),this.$table.children("tbody:first")},afterInit:function(){var t=this;this.$tableCaption=this.$table.find("caption"),this.$statusMessage=this.$table.parent().find("[data-status-message]"),this.initTableHeaders(),this.elementIndex.on("updateElements",(function(){t._updateScreenReaderStatus()})),"index"===this.elementIndex.settings.context&&"structure"===this.elementIndex.getSelectedSortAttribute()&&Garnish.hasAttr(this.$table,"data-structure-id")?this.structureTableSort=new Craft.StructureTableSorter(this,this.getAllElements()):this.structureTableSort=null,"structure"===this.elementIndex.getSelectedSortAttribute()&&this.addListener(this.$elementContainer,"click",(function(t){var e=$(t.target);e.hasClass("toggle")&&!1===this._collapseElement(e)&&this._expandElement(e)})),Craft.messageReceiver&&(this._broadcastListener=function(e){if("saveElement"===e.data.event){var i=t.$table.find('> tbody > tr[data-id="'.concat(e.data.id,'"]'));if(i.length){var s={elementType:t.elementIndex.elementType,source:t.elementIndex.sourceKey,id:e.data.id,siteId:t.elementIndex.siteId};Craft.sendActionRequest("POST","element-indexes/element-table-html",{data:s}).then((function(t){for(var e=t.data,s=0;s<i.length;s++){var a=i.eq(s);for(var n in a.find("> th[data-titlecell] .element").replaceWith(e.elementHtml),e.attributeHtml)e.attributeHtml.hasOwnProperty(n)&&a.find('> td[data-attr="'.concat(n,'"]')).html(e.attributeHtml[n])}(new Craft.ElementThumbLoader).load(i)}))}}},Craft.messageReceiver.addEventListener("message",this._broadcastListener))},initTableHeaders:function(){for(var e=function(e,i){return function(t){if(Array.isArray(t))return t}(e)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(e,i)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(this.elementIndex.getSortAttributeAndDirection(),1)[0],i=this.$table.children("thead").children().children("[data-attribute]"),s=0;s<i.length;s++){var a=i.eq(s),n=a.attr("data-attribute"),r="none";if(n===e){this.$selectedSortHeader=a;var o=this.elementIndex.getSelectedSortDirection();r="asc"===o?"ascending":"descending",a.addClass("ordered "+o),this.makeColumnSortable(a,!0)}else this.elementIndex.getSortOption(n)&&this.makeColumnSortable(a);a.attr("aria-sort",r)}},makeColumnSortable:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t.addClass("orderable");var i=t.html(),s=this.$tableCaption.find("[data-sort-instructions]"),a=$("<button/>",{id:"".concat(this.elementIndex.idPrefix,"-").concat(t.attr("data-attribute")),type:"button","aria-pressed":"false"}).html(i);s.length&&a.attr("aria-describedby",s.attr("id")),e?(a.attr("aria-pressed","true"),a.on("click",this._handleSelectedSortHeaderClick.bind(this))):a.on("click",this._handleUnselectedSortHeaderClick.bind(this)),t.empty().append(a)},isVerticalList:function(){return!0},getTotalVisible:function(){return this._isStructureTableDraggingLastElements()?this._totalVisiblePostStructureTableDraggee:this._totalVisible},setTotalVisible:function(t){this._isStructureTableDraggingLastElements()?this._totalVisiblePostStructureTableDraggee=t:this._totalVisible=t},getMorePending:function(){return this._isStructureTableDraggingLastElements()?this._morePendingPostStructureTableDraggee:this._morePending},setMorePending:function(t){this._isStructureTableDraggingLastElements()?this._morePendingPostStructureTableDraggee=t:this._morePending=this._morePendingPostStructureTableDraggee=t},getLoadMoreParams:function(){var t=this.base();return this._isStructureTableDraggingLastElements()&&(t.criteria.positionedAfter=this.structureTableSort.$targetItem.data("id")),t},appendElements:function(t){this.base(t),this.structureTableSort&&this.structureTableSort.addItems(t),Craft.cp.updateResponsiveTables()},_collapseElement:function(t,e){if(!e&&!t.hasClass("expanded"))return!1;t.removeClass("expanded"),t.attr("aria-expanded","false");for(var i=t.parent().parent(),s=i.data("id"),a=i.data("level"),n=i.next();n.length;){if(!Garnish.hasAttr(n,"data-spinnerrow")){if(n.data("level")<=a)break;this.elementSelect&&this.elementSelect.removeItems(n),this.structureTableSort&&this.structureTableSort.removeItems(n),this._totalVisible--}var r=n.next();n.remove(),n=r}this.elementIndex.instanceState.collapsedElementIds||(this.elementIndex.instanceState.collapsedElementIds=[]),this.elementIndex.instanceState.collapsedElementIds.push(s),this.elementIndex.setInstanceState("collapsedElementIds",this.elementIndex.instanceState.collapsedElementIds),this.maybeLoadMore()},_expandElement:function(t,e){var i=this;if(!e&&t.hasClass("expanded"))return!1;if(t.addClass("expanded"),t.attr("aria-expanded","true"),this.elementIndex.instanceState.collapsedElementIds){var s=t.parent().parent(),a=s.data("id"),n=$.inArray(a,this.elementIndex.instanceState.collapsedElementIds);if(-1!==n){this.elementIndex.instanceState.collapsedElementIds.splice(n,1),this.elementIndex.setInstanceState("collapsedElementIds",this.elementIndex.instanceState.collapsedElementIds);var r=this._createSpinnerRowAfter(s),o=$.extend(!0,{},this.settings.params);o.criteria.descendantOf=a,Craft.sendActionRequest("POST",this.settings.loadMoreElementsAction,{data:o}).then((function(t){if(r.parent().length){var e=$(t.data.html),s=i._totalVisible+e.length,a=i.settings.batchSize&&e.length===i.settings.batchSize;if(a){var n=r.nextAll();i.elementSelect&&i.elementSelect.removeItems(n),i.structureTableSort&&i.structureTableSort.removeItems(n),n.remove(),s-=n.length}else a=i._morePending;r.replaceWith(e),i.thumbLoader.load(e),(i.elementIndex.actions||i.settings.selectable)&&(i.elementSelect.addItems(e.filter(":not(.disabled)")),i.elementIndex.updateActionTriggers()),i.structureTableSort&&i.structureTableSort.addItems(e),Craft.appendHeadHtml(t.data.headHtml),Craft.appendBodyHtml(t.data.bodyHtml),Craft.cp.updateResponsiveTables(),i.setTotalVisible(s),i.setMorePending(a),i.maybeLoadMore()}})).catch((function(t){Craft.cp.displayError(),r.parent().length}))}}},_createSpinnerRowAfter:function(t){return $('<tr data-spinnerrow><td class="centeralign" colspan="'+t.children().length+'"><div class="spinner"/></td></tr>').insertAfter(t)},_isStructureTableDraggingLastElements:function(){return this.structureTableSort&&this.structureTableSort.dragging&&this.structureTableSort.draggingLastElements},_handleSelectedSortHeaderClick:function(t){var e=$(t.currentTarget).closest("th");if(!e.hasClass("loading")){var i="asc"===this.elementIndex.getSelectedSortDirection()?"desc":"asc";this.elementIndex.setSelectedSortDirection(i),this._handleSortHeaderClick(t,e)}},_handleUnselectedSortHeaderClick:function(t){var e=$(t.currentTarget).closest("th");if(!e.hasClass("loading")){var i=e.attr("data-attribute");this.elementIndex.setSelectedSortAttribute(i),this._handleSortHeaderClick(t,e)}},_handleSortHeaderClick:function(t,e){this.$selectedSortHeader&&this.$selectedSortHeader.removeClass("ordered asc desc"),e.addClass("ordered loading"),this.elementIndex.updateElements(),this.elementIndex.setIndexAvailable()},_updateScreenReaderStatus:function(){var t=this.elementIndex.getSelectedSortAttribute(),e="asc"===this.elementIndex.getSelectedSortDirection()?Craft.t("app","Ascending"):Craft.t("app","Descending"),i=this.elementIndex.getSortLabel(t);if(t||e||i){var s=Craft.t("app","Table {name} sorted by {attribute}, {direction}",{name:this.$table.attr("data-name"),attribute:i,direction:e});this.$statusMessage.empty(),this.$statusMessage.text(s)}},_updateTableAttributes:function(t,e){var i=t.closest("tr");for(var s in e)e.hasOwnProperty(s)&&i.children('[data-attr="'+s+'"]:first').html(e[s])},destroy:function(){this._broadcastListener&&(Craft.messageReceiver.removeEventListener("message",this._broadcastListener),delete this._broadcastListener),this.base()}})},7745:function(){Craft.Tabs=Garnish.Base.extend({$container:null,$tablist:null,$menuBtn:null,$tabs:null,$firstTab:null,$lastTab:null,$selectedTab:null,$focusableTab:null,menu:null,init:function(t){var e=this;this.$container=$(t),this.$tablist=this.$container.find('> [role="tablist"]:first'),this.$tabs=this.$tablist.find('> [role="tab"]'),this.$firstTab=this.$tabs.first(),this.$lastTab=this.$tabs.last(),this.$selectedTab=this.$tabs.filter(".sel:first"),this.$focusableTab=this.$tabs.filter("[tabindex=0]:first"),this.$menuBtn=this.$container.find("> .menubtn:first").menubtn(),this.menu=this.$menuBtn.data("menubtn").menu,this.$container.data("tabs")&&(console.warn("Double-instantiating a tab manager on an element"),this.$container.data("tabs").destroy()),this.$container.data("tabs",this);for(var i=0;i<this.$tabs.length;i++){var s=this.$tabs.eq(i),a=s.attr("href");a&&"#"===a.charAt(0)&&(this.addListener(s,"keydown",(function(t){[Garnish.SPACE_KEY,Garnish.RETURN_KEY].includes(t.keyCode)&&(t.preventDefault(),e.selectTab(t.currentTarget))})),this.addListener(s,"click",(function(t){t.preventDefault(),e.selectTab(t.currentTarget)}))),this.addListener(s,"keydown",(function(t){var i;[Garnish.LEFT_KEY,Garnish.RIGHT_KEY].includes(t.keyCode)&&$.contains(e.$tablist[0],t.currentTarget)?i=t.keyCode===("ltr"===Craft.orientation?Garnish.LEFT_KEY:Garnish.RIGHT_KEY)?(i=$(t.currentTarget).prevAll('[role="tab"]:not(.hidden):first')).length?i:e.$lastTab:(i=$(t.currentTarget).nextAll('[role="tab"]:not(.hidden):first')).length?i:e.$firstTab:t.keyCode!==Garnish.HOME_KEY&&t.keyCode!==Garnish.END_KEY||(i=t.keyCode===Garnish.HOME_KEY?e.$firstTab:e.$lastTab),i&&(t.preventDefault(),e.makeTabFocusable(i),i.focus(),e.scrollToTab(i))}))}this.updateMenuBtn(),Garnish.$win.on("resize",(function(){e.updateMenuBtn()})),this.menu.$options.on("click",(function(t){var e=$(t.currentTarget).attr("href");e&&"#"===e.charAt(0)&&t.preventDefault()})),this.menu.on("optionselect",(function(t){e.selectTab($(t.selectedOption).data("id"))}))},selectTab:function(t){var e=this._getTab(t);e[0]!==this.$selectedTab[0]&&(this.deselectTab(),this.$selectedTab=e.addClass("sel").attr("aria-selected","true"),this.makeTabFocusable(e),e.focus(),this.scrollToTab(e),this.menu.$options.removeClass("sel"),this.menu.$options.filter('[data-id="'.concat(e.data("id"),'"]')).addClass("sel"),this.trigger("selectTab",{$tab:e}),$("#content").trigger("scroll"))},deselectTab:function(){var t=this.$selectedTab.removeClass("sel").attr("aria-selected","false");this.$selectedTab=null,this.trigger("deselectTab",{$tab:t})},makeTabFocusable:function(t){var e=this._getTab(t);e[0]!==this.$focusableTab[0]&&(this.$focusableTab.attr("tabindex","-1"),this.$focusableTab=e.attr("tabindex","0"))},scrollToTab:function(t){var e=this._getTab(t),i=this.$tablist.scrollLeft(),s=e.offset().left-this.$tablist.offset().left,a=!1;if(s<0)a=i+s-24;else{var n=e.outerWidth(),r=this.$tablist.prop("clientWidth");s+n>r&&(a=i+(s-(r-n))+24)}!1!==a&&this.$tablist.scrollLeft(a)},updateMenuBtn:function(){Math.floor(this.$tablist.prop("scrollWidth")-48)>this.$container.prop("clientWidth")?(this.$tablist.addClass("scrollable"),this.$menuBtn.removeClass("hidden")):(this.$tablist.removeClass("scrollable"),this.$menuBtn.addClass("hidden"))},_getTab:function(t){if(t instanceof jQuery)return t;if(t instanceof HTMLElement)return $(t);if("string"!=typeof t)throw"Invalid tab ID";var e=this.$tabs.filter('[data-id="'.concat(t,'"]'));if(!e.length)throw"Invalid tab ID: ".concat(t);return e},destroy:function(){this.$container.removeData("tabs"),this.base()}})},5074:function(){Craft.TagSelectInput=Craft.BaseElementSelectInput.extend({searchTimeout:null,searchMenu:null,$container:null,$elementsContainer:null,$elements:null,$addTagInput:null,$spinner:null,_ignoreBlur:!1,init:function(t){var e=this;if(!$.isPlainObject(t)){for(var i={},s=["id","name","tagGroupId","sourceElementId"],a=0;a<s.length&&void 0!==arguments[a];a++)i[s[a]]=arguments[a];t=i}this.base($.extend({},Craft.TagSelectInput.defaults,t)),this.$addTagInput=this.$container.children(".add").children(".text"),this.$spinner=this.$addTagInput.next(),this.addListener(this.$addTagInput,"input",(function(){e.searchTimeout&&clearTimeout(e.searchTimeout),e.searchTimeout=setTimeout(e.searchForTags.bind(e),500)})),this.addListener(this.$addTagInput,"keydown",(function(t){switch(t.keyCode===Garnish.RETURN_KEY&&t.preventDefault(),t.keyCode){case Garnish.RETURN_KEY:return t.preventDefault(),void(this.searchMenu&&this.selectTag(this.searchMenu.$options.filter(".hover")));case Garnish.DOWN_KEY:if(t.preventDefault(),this.searchMenu){var e=this.searchMenu.$options.filter(".hover");if(e.length){var i=e.parent().nextAll().find("a:not(.disabled)").first();i.length&&this.focusOption(i)}else this.focusOption(this.searchMenu.$options.eq(0))}return;case Garnish.UP_KEY:if(t.preventDefault(),this.searchMenu){var s=this.searchMenu.$options.filter(".hover");if(s.length){var a=s.parent().prevAll().find("a:not(.disabled)").last();a.length&&this.focusOption(a)}else this.focusOption(this.searchMenu.$options.eq(this.searchMenu.$options.length-1))}return}})),this.addListener(this.$addTagInput,"focus",(function(){this.searchMenu&&this.searchMenu.show()})),this.addListener(this.$addTagInput,"blur",(function(){var t=this;this._ignoreBlur?this._ignoreBlur=!1:setTimeout((function(){t.searchMenu&&t.searchMenu.hide()}),1)}))},focusOption:function(t){this.searchMenu.$options.removeClass("hover"),t.addClass("hover"),this.searchMenu.$menuList.attr("aria-activedescendant",t.attr("id"))},getAddElementsBtn:$.noop,getElementSortAxis:function(){return null},searchForTags:function(){var t=this;if(this.searchMenu&&this.killSearchMenu(),this.$addTagInput.val()){this.$spinner.removeClass("hidden");for(var e=[],i=0;i<this.$elements.length;i++){var s=$(this.$elements[i]).data("id");s&&e.push(s)}this.settings.sourceElementId&&e.push(this.settings.sourceElementId);var a={search:this.$addTagInput.val(),tagGroupId:this.settings.tagGroupId,excludeIds:e};Craft.sendActionRequest("POST","tags/search-for-tags",{data:a}).then((function(e){t.searchMenu&&t.killSearchMenu(),t.$spinner.addClass("hidden");for(var i,s=$('<div class="menu tagmenu"/>').appendTo(Garnish.$bod),n=$("<ul/>").appendTo(s),r=0;r<e.data.tags.length;r++)i=$("<li/>").appendTo(n),$('<a data-icon="tag"/>').appendTo(i).text(e.data.tags[r].title).data("id",e.data.tags[r].id).addClass(e.data.tags[r].exclude?"disabled":"");e.data.exactMatch||(i=$("<li/>").appendTo(n),$('<a data-icon="plus"/>').appendTo(i).text(a.search)),n.find("a:not(.disabled):first").addClass("hover"),t.searchMenu=new Garnish.Menu(s,{attachToElement:t.$addTagInput,onOptionSelect:t.selectTag.bind(t)}),t.addListener(s,"mousedown",(function(){t._ignoreBlur=!0})),t.searchMenu.show()})).catch((function(e){e.response,t.searchMenu&&t.killSearchMenu(),t.$spinner.addClass("hidden")}))}else this.$spinner.addClass("hidden")},selectTag:function(t){var e=this,i=$(t);if(!i.hasClass("disabled")){var s=i.data("id"),a=i.text(),n=$("<div/>",{class:"element small removable","data-id":s,"data-site-id":this.settings.targetSiteId,"data-label":a,"data-editable":"1"}).appendTo(this.$elementsContainer),r=$("<input/>",{type:"hidden",name:this.settings.name+"[]",value:s}).appendTo(n);$("<button/>",{class:"delete icon",title:Craft.t("app","Remove"),type:"button","aria-label":Craft.t("app","Remove {label}",{label:a})}).appendTo(n);var o=$("<div/>",{class:"label"}).appendTo(n);$("<span/>",{class:"title",text:a}).appendTo(o);var l=-(n.outerWidth()+10);this.$addTagInput.css("margin-"+Craft.left,l+"px");var h={};if(h["margin-"+Craft.left]=0,this.$addTagInput.velocity(h,"fast"),this.$elements=this.$elements.add(n),this.addElements(n),this.killSearchMenu(),this.$addTagInput.val(""),this.$addTagInput.trigger("focus"),!s){n.addClass("loading disabled");var d={groupId:this.settings.tagGroupId,title:a};Craft.sendActionRequest("POST","tags/create-tag",{data:d}).then((function(t){n.attr("data-id",t.data.id),r.val(t.data.id),n.removeClass("loading disabled")})).catch((function(t){t.response,e.removeElement(n),Craft.cp.displayError(Craft.t("app","A server error occurred."))}))}}},killSearchMenu:function(){this.searchMenu.hide(),this.searchMenu.destroy(),this.searchMenu=null}},{defaults:{tagGroupId:null}})},3958:function(){Craft.ThumbsElementIndexView=Craft.BaseElementIndexView.extend({getElementContainer:function(){return this.$container.children("ul")}})},1592:function(){Craft.ui={createButton:function(t){var e=$("<button/>",{type:t.type||"button",class:"btn"});return t.id&&e.attr("id",t.id),t.class&&e.addClass(t.class),t.ariaLabel&&e.attr("aria-label",t.ariaLabel),t.role&&e.attr("role",t.role),t.html?e.html(t.html):t.label?e.append($('<div class="label"/>').text(t.label)):e.addClass("btn-empty"),t.toggle&&e.attr("aria-expanded","false"),t.controls&&e.attr("aria-controls",t.controls),t.spinner&&e.append($('<div class="spinner spinner-absolute"/>')),e},createSubmitButton:function(t){var e=this.createButton(Object.assign({},t,{type:"submit",label:t.label||Craft.t("app","Submit")}));return e.addClass("submit"),e},createTextInput:function(t){t=$.extend({autocomplete:!1},t);var e=$("<input/>",{attr:{class:"text",type:t.type||"text",inputmode:t.inputmode,id:t.id,size:t.size,name:t.name,value:t.value,maxlength:t.maxlength,autofocus:this.getAutofocusValue(t.autofocus),autocomplete:"boolean"==typeof t.autocomplete?t.autocomplete?"on":"off":t.autocomplete,disabled:this.getDisabledValue(t.disabled),readonly:t.readonly,title:t.title,placeholder:t.placeholder,step:t.step,min:t.min,max:t.max}});return t.class&&e.addClass(t.class),t.placeholder&&e.addClass("nicetext"),"password"===t.type&&e.addClass("password"),t.disabled&&e.addClass("disabled"),t.size||e.addClass("fullwidth"),t.showCharsLeft&&t.maxlength&&e.attr("data-show-chars-left").css("padding-"+("ltr"===Craft.orientation?"right":"left"),7.2*t.maxlength.toString().length+14+"px"),(t.placeholder||t.showCharsLeft)&&new Garnish.NiceText(e),"password"===t.type?$('<div class="passwordwrapper"/>').append(e):e},createTextField:function(t){return t.id||(t.id="text"+Math.floor(1e9*Math.random())),this.createField(this.createTextInput(t),t)},createCopyTextInput:function(t){var e=t.id||"copytext"+Math.floor(1e9*Math.random()),i=t.buttonId||"".concat(e,"-btn"),s=$("<div/>",{class:"copytext"}),a=this.createTextInput($.extend({},t,{readonly:!0})).appendTo(s);return $("<button/>",{type:"button",id:i,class:"btn","data-icon":"clipboard",title:Craft.t("app","Copy to clipboard"),"aria-label":Craft.t("app","Copy to clipboard")}).appendTo(s).on("click",(function(){a[0].select(),document.execCommand("copy"),Craft.cp.displayNotice(Craft.t("app","Copied to clipboard.")),s.trigger("copy"),a[0].setSelectionRange(0,0)})),s},createCopyTextBtn:function(t){var e=t.id||"copytext"+Math.floor(1e9*Math.random()),i=t.value,s=$("<div/>",{id:e,class:"copytextbtn",role:"button",title:Craft.t("app","Copy to clipboard"),"aria-label":Craft.t("app","Copy to clipboard"),tabindex:"0"});t.class&&s.addClass(t.class);var a=$("<input/>",{value:i,readonly:!0,size:i.length,tabindex:"-1"}).appendTo(s),n=($("<span/>",{"data-icon":"clipboard","aria-hidden":"true"}).appendTo(s),function(){a[0].select(),document.execCommand("copy"),Craft.cp.displayNotice(Craft.t("app","Copied to clipboard.")),s.trigger("copy"),a[0].setSelectionRange(0,0),s.focus()});return s.on("click",(function(){n()})),s.on("keydown",(function(t){t.keyCode===Garnish.SPACE_KEY&&(n(),t.preventDefault())})),s},createCopyTextField:function(t){return t.id||(t.id="copytext"+Math.floor(1e9*Math.random())),this.createField(this.createCopyTextInput(t),t)},createCopyTextPrompt:function(t){var e=$("<div/>",{class:"modal fitted"}),i=$("<div/>",{class:"body"}).appendTo(e);this.createCopyTextField($.extend({size:Math.max(Math.min(t.value.length,50),25)},t)).appendTo(i);var s=i.find("label");s.length>0&&s.attr("id")&&e.attr("aria-labelledby",s.attr("id"));var a=new Garnish.Modal(e,{closeOtherModals:!1});return e.on("copy",(function(){a.hide()})),e},createTextarea:function(t){var e=$("<textarea/>",{class:"text",rows:t.rows||2,cols:t.cols||50,id:t.id,name:t.name,maxlength:t.maxlength,autofocus:t.autofocus&&!Garnish.isMobileBrowser(!0),disabled:!!t.disabled,placeholder:t.placeholder,html:t.value});return t.showCharsLeft&&e.attr("data-show-chars-left",""),t.class&&e.addClass(t.class),t.size||e.addClass("fullwidth"),e},createTextareaField:function(t){return t.id||(t.id="textarea"+Math.floor(1e9*Math.random())),this.createField(this.createTextarea(t),t)},createSelect:function(t){var e=$("<div/>",{class:"select"});t.class&&e.addClass(t.class);var i=$("<select/>",{id:t.id,name:t.name,autofocus:t.autofocus&&Garnish.isMobileBrowser(!0),disabled:t.disabled,"data-target-prefix":t.targetPrefix,"aria-labelledby":t.labelledBy}).appendTo(e);if($.isPlainObject(t.options)){var s=[];for(var a in t.options)if(t.options.hasOwnProperty(a)){var n=t.options[a];$.isPlainObject(n)?void 0!==n.optgroup?s.push(n):s.push({label:n.label,value:void 0!==n.value?n.value:a,disabled:void 0!==n.disabled&&n.disabled}):s.push({label:n,value:a})}t.options=s}for(var r=null,o=0;o<t.options.length;o++){var l=t.options[o];void 0!==l.optgroup?r=$("<optgroup/>",{label:l.label}).appendTo(i):$("<option/>",{value:l.value,selected:l.value==t.value,disabled:void 0!==l.disabled&&l.disabled,html:l.label}).appendTo(r||i)}return t.toggle&&(i.addClass("fieldtoggle"),new Craft.FieldToggle(i)),e},createSelectField:function(t){return t.id||(t.id="select"+Math.floor(1e9*Math.random())),this.createField(this.createSelect(t),t)},createCheckbox:function(t){var e=t.id||"checkbox"+Math.floor(1e9*Math.random()),i=$("<input/>",{type:"checkbox",value:void 0!==t.value?t.value:"1",id:e,class:"checkbox",name:t.name,checked:t.checked?"checked":null,autofocus:this.getAutofocusValue(t.autofocus),disabled:this.getDisabledValue(t.disabled),"data-target":t.toggle,"data-reverse-target":t.reverseToggle});t.class&&i.addClass(t.class),(t.toggle||t.reverseToggle)&&(i.addClass("fieldtoggle"),new Craft.FieldToggle(i));var s=$("<label/>",{for:e,html:t.label});return t.name&&(t.name.length<3||"[]"!==t.name.slice(-2))?$([$("<input/>",{type:"hidden",name:t.name,value:""})[0],i[0],s[0]]):$([i[0],s[0]])},createCheckboxField:function(t){t.id||(t.id="checkbox"+Math.floor(1e9*Math.random()));var e=$('<div class="field checkboxfield"/>',{id:"".concat(t.id,"-field")});return t.first&&e.addClass("first"),t.instructions&&e.addClass("has-instructions"),this.createCheckbox(t).appendTo(e),t.instructions&&$('<div class="instructions"/>').text(t.instructions).appendTo(e),e},createCheckboxSelect:function(t){var e,i,s=$('<fieldset class="checkbox-select"/>');t.class&&s.addClass(t.class),t.showAllOption?(e=t.allValue||"*",i=t.values==e,$("<div/>").appendTo(s).append(this.createCheckbox({id:t.id,class:"all",label:"<b>"+(t.allLabel||Craft.t("app","All"))+"</b>",name:t.name,value:e,checked:i,autofocus:t.autofocus}))):i=!1;for(var a=0;a<t.options.length;a++){var n=t.options[a];n.value!=e&&$("<div/>").appendTo(s).append(this.createCheckbox({label:n.label,name:t.name?t.name+"[]":null,value:n.value,checked:i||(t.values||[]).includes(n.value),disabled:i}))}return new Garnish.CheckboxSelect(s),s},createCheckboxSelectField:function(t){return t.fieldset=!0,t.id||(t.id="checkboxselect"+Math.floor(1e9*Math.random())),this.createField(this.createCheckboxSelect(t),t)},createLightswitch:function(t){var e=t.value||"1",i=t.indeterminateValue||"-",s=$("<button/>",{type:"button",class:"lightswitch","data-value":e,"data-indeterminate-value":i,id:t.id,role:"switch","aria-checked":t.on?"true":t.indeterminate?"mixed":"false","aria-labelledby":t.labelId,"data-target":t.toggle,"data-reverse-target":t.reverseToggle});return t.on?s.addClass("on"):t.indeterminate&&s.addClass("indeterminate"),t.small&&s.addClass("small"),t.disabled&&s.addClass("disabled"),$('<div class="lightswitch-container"><div class="handle"></div></div>').appendTo(s),t.name&&$("<input/>",{type:"hidden",name:t.name,value:t.on?e:t.indeterminate?i:"",disabled:t.disabled}).appendTo(s),(t.toggle||t.reverseToggle)&&(s.addClass("fieldtoggle"),new Craft.FieldToggle(s)),new Craft.LightSwitch(s,{onChange:t.onChange||$.noop}),s},createLightswitchField:function(t){return t.id||(t.id="lightswitch"+Math.floor(1e9*Math.random())),t.labelId||(t.labelId="".concat(t.id,"-label")),this.createField(this.createLightswitch(t),t).addClass("lightswitch-field")},createColorInput:function(t){var e=t.id||"color"+Math.floor(1e9*Math.random()),i=t.containerId||e+"-container",s=t.name||null,a=t.value||null,n=t.small||!1,r=t.autofocus&&Garnish.isMobileBrowser(!0),o=t.disabled||!1,l=$("<div/>",{id:i,class:"flex color-container"}),h=$("<div/>",{class:"color static"+(n?" small":"")}).appendTo(l),d=($("<div/>",{class:"color-preview",style:t.value?{backgroundColor:t.value}:null}).appendTo(h),$("<div/>",{class:"color-input-container"}).append($("<div/>",{class:"color-hex-indicator light code","aria-hidden":"true",text:"#"})).appendTo(l));return this.createTextInput({id:e,name:s,value:Craft.ltrim(a,"#"),size:10,class:"color-input",autofocus:r,disabled:o,"aria-label":Craft.t("app","Color hex value")}).appendTo(d),new Craft.ColorInput(l),l},createColorField:function(t){return t.fieldset=!0,o,t.id||(t.id="color"+Math.floor(1e9*Math.random())),this.createField(this.createColorInput(t),t)},createDateInput:function(t){var e=Garnish.isMobileBrowser(),i=(t.id||"date"+Math.floor(1e9*Math.random()))+"-date",s=t.name||null,a=s?s+"[date]":null,n=t.value&&"function"==typeof t.value.getMonth?t.value:null,r=t.autofocus&&Garnish.isMobileBrowser(!0),o=t.disabled||!1,l=$("<div/>",{class:"datewrapper"}),h=this.createTextInput({id:i,type:e?"date":"text",class:!(!e||n)&&"empty-value",name:a,value:n?e?n.toISOString().split("T")[0]:Craft.formatDate(n):"",placeholder:" ",autocomplete:!1,autofocus:r,disabled:o}).appendTo(l);return $('<div data-icon="date"></div>').appendTo(l),s&&$("<input/>",{type:"hidden",name:s+"[timezone]",val:Craft.timezone}).appendTo(l),e?h.datetimeinput():h.datepicker($.extend({defaultDate:n||new Date},Craft.datepickerOptions)),t.hasOuterContainer?l:$('<div class="datetimewrapper"/>').append(l).datetime()},createDateField:function(t){return t.id||(t.id="date"+Math.floor(1e9*Math.random())),this.createField(this.createDateInput(t),t)},createDateRangePicker:function(t){var e=new Date,i=new Date(e.getFullYear(),e.getMonth(),e.getDate());t=$.extend({class:"",options:["today","thisWeek","thisMonth","thisYear","past7Days","past30Days","past90Days","pastYear"],onChange:$.noop,selected:null,startDate:null,endDate:null},t);var s,a,n=$("<div/>",{class:"menu"}),r=$("<ul/>",{class:"padded"}).appendTo(n),o=$("<a/>").addClass("sel").text(Craft.t("app","All")).data("handle","all");$("<li/>").append(o).appendTo(r);for(var l=0;l<t.options.length;l++){var h=t.options[l];switch(h){case"today":s={label:Craft.t("app","Today"),startDate:i,endDate:i};break;case"thisWeek":var d=e.getDay()-Craft.datepickerOptions.firstDay;d<0&&(d+=7),s={label:Craft.t("app","This week"),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-d),endDate:i};break;case"thisMonth":s={label:Craft.t("app","This month"),startDate:new Date(e.getFullYear(),e.getMonth()),endDate:i};break;case"thisYear":s={label:Craft.t("app","This year"),startDate:new Date(e.getFullYear(),0),endDate:i};break;case"past7Days":s={label:Craft.t("app","Past {num} days",{num:7}),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-7),endDate:i};break;case"past30Days":s={label:Craft.t("app","Past {num} days",{num:30}),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-30),endDate:i};break;case"past90Days":s={label:Craft.t("app","Past {num} days",{num:90}),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-90),endDate:i};break;case"pastYear":s={label:Craft.t("app","Past year"),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-365),endDate:i}}var c=$("<li/>"),u=$("<a/>",{text:s.label}).data("handle",h).data("startDate",s.startDate).data("endDate",s.endDate).data("startTime",s.startDate?s.startDate.getTime():null).data("endTime",s.endDate?s.endDate.getTime():null);t.selected&&h==t.selected&&(a=u[0]),c.append(u),c.appendTo(r)}$("<hr/>").appendTo(n);var p=$("<div/>",{class:"flex flex-nowrap padded"}).appendTo(n),f=this.createDateField({label:Craft.t("app","From")}).appendTo(p).find("input"),g=this.createDateField({label:Craft.t("app","To")}).appendTo(p).find("input"),m=f.add(g);m.on("keyup",(function(t){t.keyCode===Garnish.ESC_KEY&&$(this).data("datepicker")&&$(this).data("datepicker").dpDiv.is(":visible")&&t.stopPropagation()})),f.data("datepicker")&&f.data("datepicker").dpDiv.on("mousedown",(function(t){t.stopPropagation()})),g.data("datepicker")&&g.data("datepicker").dpDiv.on("mousedown",(function(t){t.stopPropagation()}));var v=new Garnish.Menu(n,{onOptionSelect:function(e){var i=$(e);C.text(i.text()),v.setPositionRelativeToAnchor(),n.find(".sel").removeClass("sel"),i.addClass("sel"),f.datepicker("setDate",i.data("startDate")),g.datepicker("setDate",i.data("endDate")),t.onChange(i.data("startDate")||null,i.data("endDate")||null,i.data("handle"))}});m.on("change",(function(){for(var e,i=f.datepicker("getDate"),s=g.datepicker("getDate"),a=i?i.getTime():null,o=s?s.getTime():null,l=r.find("a"),h=!1,d=0;d<l.length;d++)if(a===((e=l.eq(d)).data("startTime")||null)&&o===(e.data("endTime")||null)){v.selectOption(e[0]),h=!0,t.onChange(null,null,e.data("handle"));break}h||(n.find(".sel").removeClass("sel"),p.addClass("sel"),a||o?a&&o?C.text(f.val()+" - "+g.val()):a?C.text(Craft.t("app","From {date}",{date:f.val()})):C.text(Craft.t("app","To {date}",{date:g.val()})):C.text(Craft.t("app","All")),v.setPositionRelativeToAnchor(),t.onChange(i,s,"custom"))})),v.on("hide",(function(){f.datepicker("hide"),g.datepicker("hide")}));var b="btn menubtn";t.class&&(b=b+" "+t.class);var C=$("<button/>",{type:"button",class:b,"data-icon":"date",text:Craft.t("app","All")});return new Garnish.MenuBtn(C,v),a&&v.selectOption(a),t.startDate&&f.datepicker("setDate",t.startDate),t.endDate&&g.datepicker("setDate",t.endDate),(t.startDate||t.endDate)&&m.trigger("change"),C},createTimeInput:function(t){var e=Garnish.isMobileBrowser(),i=(t.id||"time"+Math.floor(1e9*Math.random()))+"-time",s=t.name||null,a=s?s+"[time]":null,n=t.value&&"function"==typeof t.value.getMonth?t.value:null,r=t.autofocus&&Garnish.isMobileBrowser(!0),o=t.disabled||!1,l=$("<div/>",{class:"timewrapper"}),h=this.createTextInput({id:i,type:e?"time":"text",class:!(!e||n)&&"empty-value",name:a,placeholder:" ",autocomplete:!1,autofocus:r,disabled:o}).appendTo(l);return $('<div data-icon="time"></div>').appendTo(l),s&&$("<input/>",{type:"hidden",name:s+"[timezone]",val:Craft.timezone}).appendTo(l),e?(n&&h.val(n.toISOString().split("T")[1]),h.datetimeinput()):(h.timepicker(Craft.timepickerOptions),n&&h.timepicker("setTime",3600*n.getHours()+60*n.getMinutes()+n.getSeconds())),t.hasOuterContainer?l:$('<div class="datetimewrapper"/>').append(l).datetime()},createTimeField:function(t){return t.id||(t.id="time"+Math.floor(1e9*Math.random())),this.createField(this.createTimeInput(t),t)},createField:function(t,e){var i=e.label&&"__blank__"!==e.label?e.label:null,s=$(e.fieldset?"<fieldset/>":"<div/>",{class:"field",id:e.fieldId||(e.id?e.id+"-field":null)});if(e.first&&s.addClass("first"),e.fieldClass&&s.addClass(e.fieldClass),i&&e.fieldset&&$("<legend/>",{text:i,class:"visually-hidden","data-label":i}).appendTo(s),i){var a=$('<div class="heading"/>').appendTo(s);$(e.fieldset?"<legend/>":"<label/>",{id:e.labelId||(e.id?"".concat(e.id,"-").concat(e.fieldset?"legend":"label"):null),class:e.required?"required":null,for:!e.fieldset&&e.id||null,text:i}).appendTo(a)}if(e.instructions&&$('<div class="instructions"/>').text(e.instructions).appendTo(s),$('<div class="input"/>').append(t).appendTo(s),e.tip){var n=$('<p class="notice has-icon"/>');$('<span class="icon" aria-hidden="true"/>').appendTo(n),$('<span class="visually-hidden"/>').text(Craft.t("app","Tip")+": ").appendTo(n),$("<span/>").text(e.tip).appendTo(n),n.appendTo(s)}if(e.warning){var r=$('<p class="warning has-icon"/>');$('<span class="icon" aria-hidden="true"/>').appendTo(r),$('<span class="visually-hidden"/>').text(Craft.t("app","Warning")+": ").appendTo(r),$("<span/>").text(e.warning).appendTo(r),r.appendTo(s)}return e.errors&&this.addErrorsToField(s,e.errors),s},createErrorList:function(t){var e=$('<ul class="errors"/>');return t&&this.addErrorsToList(e,t),e},addErrorsToList:function(t,e){for(var i=0;i<e.length;i++)$("<li/>").text(e[i]).appendTo(t)},addErrorsToField:function(t,e){if(e){t.addClass("has-errors"),t.children(".input").addClass("errors");var i=t.children("ul.errors");i.length||(i=this.createErrorList().appendTo(t)),this.addErrorsToList(i,e)}},clearErrorsFromField:function(t){t.removeClass("has-errors"),t.children(".input").removeClass("errors"),t.children("ul.errors").remove()},getAutofocusValue:function(t){return t&&!Garnish.isMobileBrowser(!0)?"autofocus":null},getDisabledValue:function(t){return t?"disabled":null}}},1752:function(){Craft.Uploader=Garnish.Base.extend({uploader:null,allowedKinds:null,$element:null,settings:null,_rejectedFiles:{},_extensionList:null,_totalFileCounter:0,_validFileCounter:0,init:function(t,e){this._rejectedFiles={size:[],type:[],limit:[]},this.$element=t,this.allowedKinds=null,this._extensionList=null,this._totalFileCounter=0,this._validFileCounter=0;var i=(e=$.extend({},Craft.Uploader.defaults,e)).events;for(var s in delete e.events,e.allowedKinds&&e.allowedKinds.length&&("string"==typeof e.allowedKinds&&(e.allowedKinds=[e.allowedKinds]),this.allowedKinds=e.allowedKinds,delete e.allowedKinds),e.autoUpload=!1,this.uploader=this.$element.fileupload(e),i)i.hasOwnProperty(s)&&this.uploader.on(s,i[s]);this.settings=e,this.uploader.on("fileuploadadd",this.onFileAdd.bind(this))},setParams:function(t){void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(t[Craft.csrfTokenName]=Craft.csrfTokenValue),this.uploader.fileupload("option",{formData:t})},getInProgress:function(){return this.uploader.fileupload("active")},isLastUpload:function(){return this.getInProgress()<2},onFileAdd:function(t,e){var i=this;t.stopPropagation();var s=!1;return this.allowedKinds&&(this._extensionList||this._createExtensionList(),s=!0),e.process().done((function(){var t=e.files[0],a=!0;if(s){var n=t.name.match(/\.([a-z0-4_]+)$/i)[1];-1===$.inArray(n.toLowerCase(),i._extensionList)&&(a=!1,i._rejectedFiles.type.push("“"+t.name+"”"))}t.size>i.settings.maxFileSize&&(i._rejectedFiles.size.push("“"+t.name+"”"),a=!1),a&&"function"==typeof i.settings.canAddMoreFiles&&!i.settings.canAddMoreFiles(i._validFileCounter)&&(i._rejectedFiles.limit.push("“"+t.name+"”"),a=!1),a&&(i._validFileCounter++,e.submit()),++i._totalFileCounter===e.originalFiles.length&&(i._totalFileCounter=0,i._validFileCounter=0,i.processErrorMessages())})),!0},processErrorMessages:function(){var t;this._rejectedFiles.type.length&&(t=1===this._rejectedFiles.type.length?"The file {files} could not be uploaded. The allowed file kinds are: {kinds}.":"The files {files} could not be uploaded. The allowed file kinds are: {kinds}.",t=Craft.t("app",t,{files:this._rejectedFiles.type.join(", "),kinds:this.allowedKinds.join(", ")}),this._rejectedFiles.type=[],alert(t)),this._rejectedFiles.size.length&&(t=1===this._rejectedFiles.size.length?"The file {files} could not be uploaded, because it exceeds the maximum upload size of {size}.":"The files {files} could not be uploaded, because they exceeded the maximum upload size of {size}.",t=Craft.t("app",t,{files:this._rejectedFiles.size.join(", "),size:this.humanFileSize(Craft.maxUploadSize)}),this._rejectedFiles.size=[],alert(t)),this._rejectedFiles.limit.length&&(t=1===this._rejectedFiles.limit.length?"The file {files} could not be uploaded, because the field limit has been reached.":"The files {files} could not be uploaded, because the field limit has been reached.",t=Craft.t("app",t,{files:this._rejectedFiles.limit.join(", ")}),this._rejectedFiles.limit=[],alert(t))},humanFileSize:function(t){var e=1024;if(t<e)return t+" B";var i=-1;do{t/=e,++i}while(t>=e);return t.toFixed(1)+" "+["kB","MB","GB","TB","PB","EB","ZB","YB"][i]},_createExtensionList:function(){this._extensionList=[];for(var t=0;t<this.allowedKinds.length;t++){var e=this.allowedKinds[t];if(void 0!==Craft.fileKinds[e])for(var i=0;i<Craft.fileKinds[e].extensions.length;i++){var s=Craft.fileKinds[e].extensions[i];this._extensionList.push(s)}}},destroy:function(){this.$element.fileupload("destroy"),this.base()}},{defaults:{dropZone:null,pasteZone:null,fileInput:null,sequentialUploads:!0,maxFileSize:Craft.maxUploadSize,allowedKinds:null,events:{},canAddMoreFiles:null,headers:{Accept:"application/json;q=0.9,*/*;q=0.8"},paramName:"assets-upload"}})},7e3:function(){Craft.UriFormatGenerator=Craft.BaseInputGenerator.extend({generateTargetValue:function(t){t=(t=t.replace("/<(.*?)>/g","")).toLowerCase(),t=(t=(t=Craft.asciiString(t)).replace(/^[^a-z]+/,"")).replace(/[^a-z0-9]+$/,"");var e=Craft.filterArray(t.split(/[^a-z0-9]+/)).join(Craft.slugWordSeparator);return e&&this.settings.suffix&&(e+=this.settings.suffix),e}})},8654:function(){Craft.UserIndex=Craft.BaseElementIndex.extend({init:function(t,e,i){this.on("selectSource",this.updateUrl.bind(this)),this.base(t,e,i)},getDefaultSourceKey:function(){if("index"===this.settings.context&&"undefined"!=typeof defaultSourceSlug)for(var t=0;t<this.$sources.length;t++){var e=$(this.$sources[t]);if(e.data("slug")===defaultSourceSlug)return e.data("key")}return this.base()},updateUrl:function(){if("index"===this.settings.context){var t="users",e=this.$source.data("slug");e&&(t+="/".concat(e)),Craft.setPath(t)}}}),Craft.registerElementIndexClass("craft\\elements\\User",Craft.UserIndex)},5537:function(){},9383:function(){},6558:function(t,e,i){var s=i(5537);s.__esModule&&(s=s.default),"string"==typeof s&&(s=[[t.id,s,""]]),s.locals&&(t.exports=s.locals),(0,i(9673).Z)("3790022a",s,!0,{})},2179:function(t,e,i){var s=i(9383);s.__esModule&&(s=s.default),"string"==typeof s&&(s=[[t.id,s,""]]),s.locals&&(t.exports=s.locals),(0,i(9673).Z)("80058a3c",s,!0,{})},9673:function(t,e,i){"use strict";function s(t,e){for(var i=[],s={},a=0;a<e.length;a++){var n=e[a],r=n[0],o={id:t+":"+a,css:n[1],media:n[2],sourceMap:n[3]};s[r]?s[r].parts.push(o):i.push(s[r]={id:r,parts:[o]})}return i}i.d(e,{Z:function(){return f}});var a="undefined"!=typeof document;if("undefined"!=typeof DEBUG&&DEBUG&&!a)throw new Error("vue-style-loader cannot be used in a non-browser environment. Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.");var n={},r=a&&(document.head||document.getElementsByTagName("head")[0]),o=null,l=0,h=!1,d=function(){},c=null,u="data-vue-ssr-id",p="undefined"!=typeof navigator&&/msie [6-9]\b/.test(navigator.userAgent.toLowerCase());function f(t,e,i,a){h=i,c=a||{};var r=s(t,e);return g(r),function(e){for(var i=[],a=0;a<r.length;a++){var o=r[a];(l=n[o.id]).refs--,i.push(l)}for(e?g(r=s(t,e)):r=[],a=0;a<i.length;a++){var l;if(0===(l=i[a]).refs){for(var h=0;h<l.parts.length;h++)l.parts[h]();delete n[l.id]}}}}function g(t){for(var e=0;e<t.length;e++){var i=t[e],s=n[i.id];if(s){s.refs++;for(var a=0;a<s.parts.length;a++)s.parts[a](i.parts[a]);for(;a<i.parts.length;a++)s.parts.push(v(i.parts[a]));s.parts.length>i.parts.length&&(s.parts.length=i.parts.length)}else{var r=[];for(a=0;a<i.parts.length;a++)r.push(v(i.parts[a]));n[i.id]={id:i.id,refs:1,parts:r}}}}function m(){var t=document.createElement("style");return t.type="text/css",r.appendChild(t),t}function v(t){var e,i,s=document.querySelector("style["+u+'~="'+t.id+'"]');if(s){if(h)return d;s.parentNode.removeChild(s)}if(p){var a=l++;s=o||(o=m()),e=C.bind(null,s,a,!1),i=C.bind(null,s,a,!0)}else s=m(),e=_.bind(null,s),i=function(){s.parentNode.removeChild(s)};return e(t),function(s){if(s){if(s.css===t.css&&s.media===t.media&&s.sourceMap===t.sourceMap)return;e(t=s)}else i()}}var b,$=(b=[],function(t,e){return b[t]=e,b.filter(Boolean).join("\n")});function C(t,e,i,s){var a=i?"":s.css;if(t.styleSheet)t.styleSheet.cssText=$(e,a);else{var n=document.createTextNode(a),r=t.childNodes;r[e]&&t.removeChild(r[e]),r.length?t.insertBefore(n,r[e]):t.appendChild(n)}}function _(t,e){var i=e.css,s=e.media,a=e.sourceMap;if(s&&t.setAttribute("media",s),c.ssrId&&t.setAttribute(u,e.id),a&&(i+="\n/*# sourceURL="+a.sources[0]+" */",i+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(a))))+" */"),t.styleSheet)t.styleSheet.cssText=i;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(i))}}}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var i=__webpack_module_cache__[t]={id:t,exports:{}};return __webpack_modules__[t](i,i.exports,__webpack_require__),i.exports}__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return __webpack_require__.d(e,{a:e}),e},__webpack_require__.d=function(t,e){for(var i in e)__webpack_require__.o(e,i)&&!__webpack_require__.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)};var __webpack_exports__={};!function(){"use strict";__webpack_require__(2179),__webpack_require__(6558),__webpack_require__(587),__webpack_require__(8960),__webpack_require__(5774),__webpack_require__(8495),__webpack_require__(5970),__webpack_require__(4993),__webpack_require__(8843),__webpack_require__(5759),__webpack_require__(8167),__webpack_require__(4211),__webpack_require__(7745),__webpack_require__(463),__webpack_require__(3839),__webpack_require__(7452),__webpack_require__(6872),__webpack_require__(2495),__webpack_require__(5077),__webpack_require__(4606),__webpack_require__(9222);var t=jQuery,e=__webpack_require__.n(t);function i(t){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i(t)}function s(t,e){if(t){if("string"==typeof t)return a(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(t,e):void 0}}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.CP=Garnish.Base.extend({authManager:null,$nav:null,$navToggle:null,$globalSidebar:null,$globalContainer:null,$mainContainer:null,$alerts:null,$crumbs:null,$breadcrumbList:null,$breadcrumbItems:null,$notificationContainer:null,$main:null,$primaryForm:null,$headerContainer:null,$header:null,$mainContent:null,$details:null,$sidebarContainer:null,$sidebarToggle:null,$sidebar:null,$contentContainer:null,$edition:null,$confirmUnloadForms:null,$deltaForms:null,$collapsibleTables:null,isMobile:null,fixedHeader:!1,breadcrumbListWidth:0,breadcrumbDisclosureItem:'<li class="breadcrumb-toggle-wrapper" data-disclosure-item><button data-disclosure-trigger aria-controls="breadcrumb-disclosure" aria-haspopup="true">'.concat(Craft.t("app","More…"),'</button><div id="breadcrumb-disclosure" class="menu menu--disclosure" data-disclosure-menu><ul></ul></div></li>'),tabManager:null,enableQueue:!0,totalJobs:0,jobInfo:null,displayedJobInfo:null,displayedJobInfoUnchanged:1,trackJobProgressTimeout:null,jobProgressIcon:null,checkingForUpdates:!1,forcingRefreshOnUpdatesCheck:!1,includingDetailsOnUpdatesCheck:!1,checkForUpdatesCallbacks:null,resizeTimeout:null,init:function(){var t=this;0!==Craft.remainingSessionTime&&(this.authManager=new Craft.AuthManager),this.$nav=e()("#nav"),this.$navToggle=e()("#primary-nav-toggle"),this.$globalSidebar=e()("#global-sidebar"),this.$globalContainer=e()("#global-container"),this.$mainContainer=e()("#main-container"),this.$alerts=e()("#alerts"),this.$crumbs=e()("#crumbs"),this.$breadcrumbList=e()(".breadcrumb-list"),this.$breadcrumbItems=e()(".breadcrumb-list li"),this.$notificationContainer=e()("#notifications"),this.$main=e()("#main"),this.$primaryForm=e()("#main-form"),this.$headerContainer=e()("#header-container"),this.$header=e()("#header"),this.$mainContent=e()("#main-content"),this.$details=e()("#details"),this.$sidebarContainer=e()("#sidebar-container"),this.$sidebarToggle=e()("#sidebar-toggle"),this.$sidebar=e()("#sidebar"),this.$contentContainer=e()("#content-container"),this.$collapsibleTables=e()("table.collapsible"),this.isMobile=Garnish.isMobileBrowser(),this.updateContentHeading();for(var i=this.$details.find(".meta > .field > .instructions"),a=0;a<i.length;a++){var n=i.eq(a),r=n.siblings(".heading").children("label");e()("<span/>",{class:"info",html:n.children().html()}).appendTo(r),n.remove()}if(!this.isMobile&&this.$header.length&&(this.addListener(Garnish.$win,"scroll","updateFixedHeader"),this.updateFixedHeader()),Garnish.$doc.ready((function(){t.addListener(Garnish.$win,"resize",(function(e){if(e.target===window){t.handleWindowResize(),clearTimeout(t.resizeTimeout);var i=t;t.resizeTimeout=setTimeout((function(){i.setSidebarNavAttributes()}),100)}})),t.handleWindowResize(),t.setSidebarNavAttributes(),Garnish.requestAnimationFrame(t.initSpecialForms.bind(t))})),this.$alerts.length&&this.initAlerts(),this.addListener(this.$navToggle,"click","toggleNav"),this.addListener(this.$sidebarToggle,"click","toggleSidebar"),this.$primaryForm.length||(this.$primaryForm=e()("form[data-saveshortcut]:first")),this.$primaryForm.length&&Garnish.hasAttr(this.$primaryForm,"data-saveshortcut")&&function(){var e=[],i=t.$primaryForm.data("actions");if(void 0===i)e.push([{keyCode:Garnish.S_KEY,ctrl:!0},{redirect:t.$primaryForm.data("saveshortcut-redirect"),retainScroll:Garnish.hasAttr(t.$primaryForm,"saveshortcut-scroll")}]);else for(var s=0;s<i.length;s++){var a=i[s];a.shortcut&&e.push([{keyCode:Garnish.S_KEY,ctrl:!0,shift:!!a.shift},{action:a.action,redirect:a.redirect,confirm:a.confirm,params:a.params,data:a.data,retainScroll:a.retainScroll}])}for(var n=function(i){Garnish.uiLayerManager.registerShortcut(e[i][0],(function(){t.submitPrimaryForm(e[i][1])}))},r=0;r<e.length;r++)n(r)}(),this.initTabs(),this.tabManager&&window.LOCATION_HASH){var o=this.tabManager.$tabs.filter('[href="#'.concat(window.LOCATION_HASH,'"]'));o.length&&this.tabManager.selectTab(o)}var l=Craft.getLocalStorage("scrollY");if(void 0!==l&&(Craft.removeLocalStorage("scrollY"),Garnish.$doc.ready((function(){Garnish.requestAnimationFrame((function(){window.scrollTo(0,l)}))}))),e().isTouchCapable()&&(this.$mainContainer.on("focus","input, textarea, .focusable-input",this._handleInputFocus.bind(this)),this.$mainContainer.on("blur","input, textarea, .focusable-input",this._handleInputBlur.bind(this))),Craft.announcements.length){var h,d,c=e()("#announcements-btn").removeClass("hidden"),u=Craft.announcements.some((function(t){return t.unread}));u&&(h=e()("<span/>",{class:"visually-hidden",html:Craft.t("app","Unread messages")}),c.addClass("unread").append(h)),this.addListener(c,"click",(function(){if(d)d.show();else{var t="";Craft.announcements.forEach((function(e){t+='<div class="announcement '.concat(e.unread?"unread":"",'" role="listitem">')+'<div class="announcement__header">'+'<h3 class="announcement__heading h2">'.concat(e.heading,"</h3>")+'<div class="announcement-label-container">'+'<div class="announcement-icon" aria-hidden="true">'.concat(e.icon,"</div>")+'<div class="announcement-label">'.concat(e.label,"</div>")+"</div></div>"+"<p>".concat(e.body,"</p>")+"</div>"})),d=new Garnish.HUD(c,'<h2 class="visually-hidden">'.concat(Craft.t("app","Announcements"),'</h2><div id="announcements" role="list">').concat(t,"</div>"),{onShow:function(){c.addClass("active")},onHide:function(){c.removeClass("active")}}),e()("a",d.$main).each((function(){this.hostname.length&&this.hostname!==location.hostname&&void 0===e()(this).attr("target")&&e()(this).attr("rel","noopener").attr("target","_blank")})),u&&(c.removeClass("unread"),h.remove(),Craft.sendActionRequest("POST","users/mark-announcements-as-read",{data:{ids:Craft.announcements.map((function(t){return t.id}))}}))}}))}var p=document.getElementById("footer");p&&new IntersectionObserver((function(t){var e=function(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(t,e)||s(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(t,1)[0];e.target.classList.toggle("stuck",e.intersectionRatio<1)}),{rootMargin:"0px 0px -1px 0px",threshold:[1]}).observe(p)},get $contentHeader(){var t=e()("#content-header");return t.length?t:e()("<header/>",{id:"content-header",class:"pane-header"}).prependTo(e()("#content"))},get $noticeContainer(){var t=e()("#content-notice");return t.length?t:e()('<div id="content-notice"/>').attr("role","status").prependTo(this.$contentHeader)},initSpecialForms:function(){var t=this;if(this.$confirmUnloadForms=e()("form[data-confirm-unload]"),this.$deltaForms=e()("form[data-delta]"),this.$confirmUnloadForms.length){for(var i=this.$confirmUnloadForms.add(this.$deltaForms),s=function(e){var s=i.eq(e),a=void 0;s.data("initialSerializedValue")||(a="function"==typeof s.data("serializer")?s.data("serializer")():s.serialize(),s.data("initialSerializedValue",a)),t.addListener(s,"submit",(function(t){if(Garnish.hasAttr(s,"data-confirm-unload")&&this.removeListener(Garnish.$win,"beforeunload"),Garnish.hasAttr(s,"data-delta")){var e;t.preventDefault(),e="function"==typeof s.data("serializer")?s.data("serializer")():s.serialize();var i=Craft.findDeltaData(s.data("initialSerializedValue"),e,s.data("delta-names"),null,s.data("initial-delta-values"),s.data("modified-delta-names"));Craft.createForm(i).appendTo(Garnish.$bod).submit()}}))},a=0;a<i.length;a++)s(a);this.addListener(Garnish.$win,"beforeunload",(function(t){var e=!1;if(void 0!==Craft.livePreview&&Craft.livePreview.inPreviewMode)e=!0;else for(var i=0;i<this.$confirmUnloadForms.length;i++){var s,a=this.$confirmUnloadForms.eq(i);if(s="function"==typeof a.data("serializer")?a.data("serializer")():a.serialize(),a.data("initialSerializedValue")!==s){e=!0;break}}if(e){var n=Craft.t("app","Any changes will be lost if you leave this page.");return t?t.originalEvent.returnValue=n:window.event.returnValue=n,n}}))}},_handleInputFocus:function(){this.updateFixedHeader()},_handleInputBlur:function(){this.updateFixedHeader()},submitPrimaryForm:function(t){this.trigger("beforeSaveShortcut"),"object"===i(t)&&e().isPlainObject(t)||(t={}),t.redirect||(t.redirect=this.$primaryForm.data("saveshortcut-redirect")),t.data||(t.data={}),t.data.saveShortcut=!0,Craft.submitForm(this.$primaryForm,t)},updateSidebarMenuLabel:function(){this.updateContentHeading()},updateContentHeading:function(){var t=this.$sidebar.find("a.sel:first"),i=t.children(".label");e()("#content-heading").text(i.length?i.text():t.text()),Garnish.$bod.removeClass("showing-sidebar")},toggleNav:function(){var t=this.navIsExpanded();null!==t&&(t?(this.disableGlobalSidebarLinks(),this.$navToggle.focus(),this.$navToggle.attr("aria-expanded","false"),Garnish.$bod.removeClass("showing-nav")):(this.enableGlobalSidebarLinks(),this.$globalSidebar.find(":focusable")[0].focus(),this.$navToggle.attr("aria-expanded","true"),Garnish.$bod.addClass("showing-nav")))},enableGlobalSidebarLinks:function(){var t=this.$globalSidebar.find(":focusable");e()(t).each((function(){e()(this).attr("tabindex","0")}))},disableGlobalSidebarLinks:function(){var t=this.$globalSidebar.find(":focusable");e()(t).each((function(){e()(this).attr("tabindex","-1")}))},setSidebarNavAttributes:function(){var t=this.navIsExpanded();null!==t&&(t?this.enableGlobalSidebarLinks():this.disableGlobalSidebarLinks())},navIsExpanded:function(){if(!this.$globalSidebar[0])return null;var t=getComputedStyle(this.$globalSidebar[0]).getPropertyValue("--is-always-visible").trim();return"true"===this.$navToggle.attr("aria-expanded")||"true"===t},toggleSidebar:function(){var t="true"===this.$sidebarToggle.attr("aria-expanded")?"false":"true";this.$sidebarToggle.attr("aria-expanded",t),Garnish.$bod.toggleClass("showing-sidebar")},initTabs:function(){this.tabManager&&(this.tabManager.destroy(),this.tabManager=null);var t=e()("#tabs");t.length&&(this.tabManager=new Craft.Tabs(t),this.tabManager.on("selectTab",(function(t){var i=t.$tab.attr("href");if(i&&"#"===i.charAt(0)&&e()(i).removeClass("hidden"),Garnish.$win.trigger("resize"),Garnish.$doc.trigger("scroll"),i&&"#"===i.charAt(0)){var s=e()("#context-btn").menubtn().data("menubtn");if(s)for(var a=0;a<s.menu.$options.length;a++){var n=s.menu.$options[a];n.href&&(n.href=n.href.match(/^[^#]*/)[0]+i)}}"undefined"!=typeof history&&Garnish.requestAnimationFrame((function(){history.replaceState(void 0,void 0,i)}))})),this.tabManager.on("deselectTab",(function(t){var i=t.$tab.attr("href");i&&"#"===i.charAt(0)&&e()(t.$tab.attr("href")).addClass("hidden")})))},updateTabs:function(t){if(t){var i=e()(t).attr("id","tabs");this.tabManager?this.tabManager.$container.replaceWith(i):i.appendTo(this.$contentHeader),this.initTabs()}else this.tabManager&&(this.tabManager.$container.siblings().length?this.tabManager.$container.remove():this.tabManager.$container.parent().remove(),this.tabManager.destroy(),this.tabManager=null)},get $tabsContainer(){return this.tabManager?this.tabManager.$container:void 0},get $tabsList(){return this.tabManager?this.tabManager.$tablist:void 0},get $tabs(){return this.tabManager?this.tabManager.$tablist.find("> a"):void 0},get $selectedTab(){return this.tabManager?this.tabManager.$selectedTab:void 0},get selectedTabIndex(){return this.tabManager?this.tabManager.$tabs.index(this.tabManager.$selectedTab):void 0},get $focusableTab(){return this.tabManager?this.tabManager.$focusableTab:void 0},selectTab:function(t){this.tabManager&&this.tabManager.selectTab(t)},deselectTab:function(){this.tabManager&&this.tabManager.deselectTab()},handleWindowResize:function(){this.updateResponsiveTables(),this.handleBreadcrumbVisibility()},breadcrumbItemsWrap:function(){if(this.$breadcrumbItems[0]){this.$breadcrumbList.css("ltr"===Craft.orientation?"margin-right":"margin-left","");for(var t=this.$breadcrumbList[0].getBoundingClientRect().width,e=0,i=this.$breadcrumbList.find("li"),s=0;s<i.length;s++)e+=i.get(s).getBoundingClientRect().width;return this.breadcrumbListWidth=t,!(e<=t||e<t+1&&(this.$breadcrumbList.css("ltr"===Craft.orientation?"margin-right":"margin-left","-1px"),1))}},handleBreadcrumbVisibility:function(){if(this.breadcrumbItemsWrap()){0===this.$breadcrumbList.find("[data-disclosure-item]").length&&this.$breadcrumbList.append(this.breadcrumbDisclosureItem);var t,e=this.$breadcrumbList.find("[data-disclosure-item]")[0].offsetWidth,i=this.breadcrumbListWidth;this.$breadcrumbItems.each((function(s){if(!(e+this.offsetWidth<i))return!1;t=s,e+=this.offsetWidth}));var s=this.$breadcrumbItems.slice(0,t+1),a=this.$breadcrumbItems.slice(t+1);this.$breadcrumbList.html(""),this.$breadcrumbList.append(s),this.$breadcrumbList.append(this.breadcrumbDisclosureItem),this.$breadcrumbList.find("[data-disclosure-menu] ul").append(a),this.$breadcrumbList.find("[data-disclosure-trigger]").disclosureMenu()}},updateResponsiveTables:function(){for(this.updateResponsiveTables._i=0;this.updateResponsiveTables._i<this.$collapsibleTables.length;this.updateResponsiveTables._i++)this.updateResponsiveTables._$table=this.$collapsibleTables.eq(this.updateResponsiveTables._i),this.updateResponsiveTables._containerWidth=this.updateResponsiveTables._$table.parent().width(),this.updateResponsiveTables._check=!1,this.updateResponsiveTables._containerWidth>0&&(void 0===this.updateResponsiveTables._$table.data("lastContainerWidth")?this.updateResponsiveTables._check=!0:(this.updateResponsiveTables._isCollapsed=this.updateResponsiveTables._$table.hasClass("collapsed"),this.updateResponsiveTables._containerWidth>this.updateResponsiveTables._$table.data("lastContainerWidth")?this.updateResponsiveTables._isCollapsed&&(this.updateResponsiveTables._$table.removeClass("collapsed"),this.updateResponsiveTables._check=!0):this.updateResponsiveTables._isCollapsed||(this.updateResponsiveTables._check=!0)),this.updateResponsiveTables._check&&this.updateResponsiveTables._$table.width()-30>this.updateResponsiveTables._containerWidth&&this.updateResponsiveTables._$table.addClass("collapsed"),this.updateResponsiveTables._$table.data("lastContainerWidth",this.updateResponsiveTables._containerWidth))},updateFixedHeader:function(){if(!this.isMobile)if(this.$main.length&&this.$headerContainer[0].getBoundingClientRect().top<0){if(!this.fixedHeader){var t=this.$headerContainer.height();this.$contentContainer.css("min-height","calc(100vh - "+(t+14+48-1)+"px)"),this.$headerContainer.height(t),Garnish.$bod.addClass("fixed-header"),this.$contentContainer.outerHeight(),this.$details.outerHeight();var e={top:t+"px","max-height":"calc(100vh - "+t+"px)"};this.$sidebar.addClass("fixed").css(e),this.$details.addClass("fixed").css(e),this.fixedHeader=!0}}else this.fixedHeader&&(this.$headerContainer.height("auto"),Garnish.$bod.removeClass("fixed-header"),this.$contentContainer.css("min-height",""),this.$sidebar.removeClass("fixed").css({top:"","max-height":""}),this.$details.removeClass("fixed").css({top:"","max-height":""}),this.fixedHeader=!1)},displayNotification:function(t,e,i){var s=new Craft.CP.Notification(t,e,i);return this.trigger("displayNotification",{notificationType:t,message:e,notification:s}),s},displayNotice:function(t,e){return this.displayNotification("notice",t,Object.assign({icon:"info",iconLabel:Craft.t("app","Notice")},e))},displaySuccess:function(t,e){return this.displayNotification("success",t,Object.assign({icon:"check",iconLabel:Craft.t("app","Success")},e))},displayError:function(t,e){return t&&"object"!==i(t)||(e=t,t=Craft.t("app","A server error occurred.")),this.displayNotification("error",t,Object.assign({icon:"alert",iconLabel:Craft.t("app","Error")},e))},fetchAlerts:function(){return Craft.queue.push((function(){return new Promise((function(t,e){var i={path:Craft.path};Craft.sendActionRequest("POST","app/get-cp-alerts",{data:i}).then((function(e){var i=e.data;t(i.alerts)})).catch(e)}))}))},displayAlerts:function(t){if(this.$alerts.remove(),Garnish.isArray(t)&&t.length){this.$alerts=e()('<ul id="alerts"/>').prependTo(e()("#page-container"));for(var i=0;i<t.length;i++)e()('<li><span data-icon="alert" aria-label="'.concat(Craft.t("app","Error"),'"></span> ').concat(t[i],"</li>")).appendTo(this.$alerts);var s=this.$alerts.outerHeight();this.$alerts.css("margin-top",-s).velocity({"margin-top":0},"fast"),this.initAlerts()}},initAlerts:function(){for(var t=this,i=this.$alerts.find('a[class^="shun:"]'),s=0;s<i.length;s++)this.addListener(i[s],"click",(function(i){i.preventDefault(),Craft.queue.push((function(){return new Promise((function(s,a){var n=e()(i.currentTarget),r={message:n.prop("className").substring(5)};Craft.sendActionRequest("POST","app/shun-cp-alert",{data:r}).then((function(){n.parent().remove(),s()})).catch((function(e){var i=e.response;t.displayError(i.data.message),a()}))}))}))}))},checkForUpdates:function(t,e,i){var s=this;if("function"==typeof e&&(i=e,e=!1),this.checkingForUpdates&&(!0===t&&!this.forcingRefreshOnUpdatesCheck||!0===e&&!this.includingDetailsOnUpdatesCheck)){var a=i;i=function(){s.checkForUpdates(t,e,a)}}"function"==typeof i&&(Garnish.isArray(this.checkForUpdatesCallbacks)||(this.checkForUpdatesCallbacks=[]),this.checkForUpdatesCallbacks.push(i)),this.checkingForUpdates||(this.checkingForUpdates=!0,this.forcingRefreshOnUpdatesCheck=!0===t,this.includingDetailsOnUpdatesCheck=!0===e,this._checkForUpdates(t,e).then((function(t){if(s.updateUtilitiesBadge(),s.checkingForUpdates=!1,Garnish.isArray(s.checkForUpdatesCallbacks)){var e=s.checkForUpdatesCallbacks;s.checkForUpdatesCallbacks=null;for(var i=0;i<e.length;i++)e[i](t)}s.trigger("checkForUpdates",{updateInfo:t})})))},_checkForUpdates:function(t,e){var i=this;return new Promise((function(s,a){t?i._getUpdates(e).then(s).catch(a):i._checkForCachedUpdates(e).then((function(t){t.cached?s(t):i._getUpdates(e).then((function(t){s(t)}))})).catch(a)}))},_checkForCachedUpdates:function(t){return new Promise((function(e,i){var s={onlyIfCached:!0,includeDetails:t};Craft.sendActionRequest("POST","app/check-for-updates",{data:s}).then((function(t){var i=t.data;e(i)})).catch((function(){e({cached:!1})}))}))},_getUpdates:function(t){var e=this;return new Promise((function(i,s){Craft.sendApiRequest("GET","updates").then((function(s){e._cacheUpdates(s,t).then((function(t){i(t)}))})).catch(s)}))},_cacheUpdates:function(t,e){return new Promise((function(i,s){var a={updates:t,includeDetails:e};Craft.sendActionRequest("POST","app/cache-updates",{data:a}).then((function(t){var e=t.data;i(e)})).catch(s)}))},updateUtilitiesBadge:function(){var t=e()("#nav-utilities").find("> a:not(.sel)");t.length&&Craft.queue.push((function(){return new Promise((function(i,s){Craft.sendActionRequest("POST","app/get-utilities-badge-count").then((function(s){var a=s.data,n=t.children(".badge"),r=t.children("[data-notification]");a.badgeCount?(n.length||(n=e()('<span class="badge" aria-hidden="true"/>').appendTo(t)),r.length||(r=e()('<span class="visually-hidden" data-notification/>').appendTo(t)),n.text(a.badgeCount),r.text(Craft.t("app","{num, number} {num, plural, =1{notification} other{notifications}}",{num:a.badgeCount}))):n.length&&r.length&&(n.remove(),r.remove()),i()})).catch(s)}))}))},runQueue:function(){var t=this;this.enableQueue&&(Craft.runQueueAutomatically?Craft.queue.push((function(){return new Promise((function(e,i){Craft.sendActionRequest("POST","queue/run").then((function(){t.trackJobProgress(!1,!0),e()})).catch(i)}))})):this.trackJobProgress(!1,!0))},trackJobProgress:function(t,e){if(e&&this.trackJobProgressTimeout&&(clearTimeout(this.trackJobProgressTimeout),this.trackJobProgressTimeout=null),!this.trackJobProgressTimeout&&this.enableQueue)if(!0===t){var i=Math.min(6e4,500*this.displayedJobInfoUnchanged);this.trackJobProgressTimeout=setTimeout(this._trackJobProgressInternal.bind(this),i)}else this._trackJobProgressInternal()},_trackJobProgressInternal:function(){var t=this;Craft.queue.push((function(){return new Promise((function(e,i){Craft.sendActionRequest("POST","queue/get-job-info?limit=50&dontExtendSession=1").then((function(i){var s=i.data;t.trackJobProgressTimeout=null,t.totalJobs=s.total,t.setJobInfo(s.jobs),t.jobInfo.length&&t.trackJobProgress(!0),e()})).catch(i)}))}))},setJobInfo:function(t){if(this.enableQueue){this.jobInfo=t;var e=this.displayedJobInfo;this.displayedJobInfo=this.getDisplayedJobInfo(),e&&this.displayedJobInfo&&e.id===this.displayedJobInfo.id&&e.progress===this.displayedJobInfo.progress&&e.progressLabel===this.displayedJobInfo.progressLabel&&e.status===this.displayedJobInfo.status?this.displayedJobInfoUnchanged++:this.displayedJobInfoUnchanged=1,this.updateJobIcon(),this.trigger("setJobInfo")}},getDisplayedJobInfo:function(){if(!this.enableQueue)return null;for(var t=[Craft.CP.JOB_STATUS_RESERVED,Craft.CP.JOB_STATUS_FAILED,Craft.CP.JOB_STATUS_WAITING],e=0;e<t.length;e++)for(var i=0;i<this.jobInfo.length;i++)if(this.jobInfo[i].status===t[e]&&(t[e]!==Craft.CP.JOB_STATUS_WAITING||!this.jobInfo[i].delay))return this.jobInfo[i];return null},updateJobIcon:function(){this.enableQueue&&this.$nav.length&&(this.displayedJobInfo?(this.jobProgressIcon||(this.jobProgressIcon=new n),this.displayedJobInfo.status===Craft.CP.JOB_STATUS_RESERVED||this.displayedJobInfo.status===Craft.CP.JOB_STATUS_WAITING?(this.jobProgressIcon.hideFailMode(),this.jobProgressIcon.setDescription(this.displayedJobInfo.description,this.displayedJobInfo.progressLabel),this.jobProgressIcon.setProgress(this.displayedJobInfo.progress)):this.displayedJobInfo.status===Craft.CP.JOB_STATUS_FAILED&&this.jobProgressIcon.showFailMode(Craft.t("app","Failed"))):this.jobProgressIcon&&(this.jobProgressIcon.hideFailMode(),this.jobProgressIcon.complete(),delete this.jobProgressIcon))},getSiteId:function(){var t=Craft.getLocalStorage("BaseElementIndex.siteId");if(void 0!==t){Craft.removeLocalStorage("BaseElementIndex.siteId");try{this.setSiteId(t)}catch(t){}}return Craft.siteId},setSiteId:function(t){var i=Craft.sites.find((function(e){return e.id===t}));if(!i)throw"Invalid site ID: ".concat(t);Craft.siteId=t,Craft.actionUrl=Craft.getUrl(Craft.actionUrl,{site:i.handle}),Craft.baseCpUrl=Craft.getUrl(Craft.baseCpUrl,{site:i.handle}),Craft.baseUrl=Craft.getUrl(Craft.baseUrl,{site:i.handle});var a=Craft.getUrl(document.location.href,{site:i.handle});history.replaceState({},"",a);var n,r=function(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=s(t))){i&&(t=i);var a=0,n=function(){};return{s:n,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==i.return||i.return()}finally{if(l)throw r}}}}(document.body.classList);try{for(r.s();!(n=r.n()).done;){var o=n.value;o.match(/^site--/)&&document.body.classList.remove(o)}}catch(t){r.e(t)}finally{r.f()}document.body.classList.add("site--".concat(i.handle)),e()("a").each((function(){this.hostname.length&&this.hostname===location.hostname&&-1!==this.href.indexOf(Craft.cpTrigger)&&(this.href=Craft.getUrl(this.href,{site:i.handle}))}))}},{notificationDuration:5e3,JOB_STATUS_WAITING:1,JOB_STATUS_RESERVED:2,JOB_STATUS_DONE:3,JOB_STATUS_FAILED:4}),Craft.CP.Notification=Garnish.Base.extend({type:null,message:null,settings:null,closing:!1,closeTimeout:null,_preventDelayedClose:!1,$container:null,$closeBtn:null,originalActiveElement:null,init:function(t,i,s){var a=this;this.type=t,this.message=i,this.settings=s||{},this.$container=e()("<div/>",{class:"notification","data-type":this.type}).appendTo(Craft.cp.$notificationContainer);var n=e()('<div class="notification-body"/>').appendTo(this.$container).attr("role","status");if(this.settings.icon){var r=e()("<span/>",{class:"notification-icon","data-icon":this.settings.icon}).appendTo(n);this.settings.iconLabel?r.attr({"aria-label":this.settings.iconLabel,role:"img"}):r.attr("aria-hidden","true")}var o=e()('<div class="notification-main"/>').appendTo(n);e()("<div/>",{class:"notification-message",text:this.message}).appendTo(o);var l=e()("<div/>").appendTo(this.$container);this.$closeBtn=e()("<button/>",{type:"button",class:"notification-close-btn","aria-label":Craft.t("app","Close"),"data-icon":"remove"}).appendTo(l),this.settings.details&&e()('<div class="notification-details"/>').append(this.settings.details).appendTo(o).find("button,input").length&&(Garnish.uiLayerManager.addLayer(this.$container),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){a.close()})),this.originalActiveElement=document.activeElement,this.$container.attr("tabindex","-1").focus(),this.$container.on("keydown",(function(t){t.keyCode===Garnish.ESC_KEY&&(t.stopPropagation(),a.close())}))),this.$container.css({opacity:0,"margin-bottom":this._negMargin()}).velocity({opacity:1,"margin-bottom":0},{duration:"fast"}),Craft.initUiElements(this.$container),this.addListener(this.$closeBtn,"click","close"),Craft.notificationDuration&&this._initDelayedClose()},_initDelayedClose:function(){var t=this;this._preventDelayedClose||(Craft.isVisible()?(this.delayedClose(),this.$container.on("keypress keyup change focus blur click mousedown mouseup",(function(e){e.target!=t.$closeBtn[0]&&(t.$container.off("keypress keyup change focus blur click mousedown mouseup"),t.preventDelayedClose())}))):Garnish.$doc.one("visibilitychange",(function(){t._initDelayedClose()})))},_negMargin:function(){return"-".concat(this.$container.outerHeight()+12,"px")},close:function(){var t=this;this.closing||(this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null),this.closing=!0,this.originalActiveElement&&document.activeElement&&(document.activeElement===this.$container[0]||e().contains(this.$container[0],document.activeElement))&&e()(this.originalActiveElement).focus(),this.$container.velocity({opacity:0,"margin-bottom":this._negMargin()},{duration:"fast",complete:function(){t.$container.remove()}}))},delayedClose:function(){var t=this;this.closeTimeout=setTimeout((function(){t.close()}),Craft.notificationDuration),this.$container.one("mouseover",(function(){clearTimeout(t.closeTimeout),t.closeTimeout=null,t.$container.on("mouseout",(function(e){e.target==t.$container[0]&&(t.$container.off("mouseout"),t.delayedClose())}))}))},preventDelayedClose:function(){this._preventDelayedClose=!0,this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null),this.$container.off("mouseover mouseout")}}),Garnish.$scrollContainer=Garnish.$win,Craft.cp=new Craft.CP;var n=Garnish.Base.extend({$li:null,$a:null,$label:null,$progressLabel:null,progress:null,failMode:!1,_$bgCanvas:null,_$staticCanvas:null,_$hoverCanvas:null,_$failCanvas:null,_staticCtx:null,_hoverCtx:null,_canvasSize:null,_arcPos:null,_arcRadius:null,_lineWidth:null,_arcStartPos:0,_arcEndPos:0,_arcStartStepSize:null,_arcEndStepSize:null,_arcStep:null,_arcStepTimeout:null,_arcAnimateCallback:null,_progressBar:null,init:function(){this.$li=e()("<li/>").appendTo(Craft.cp.$nav.children("ul")),this.$a=e()("<a/>",{id:"job-icon",href:Craft.canAccessQueueManager?Craft.getUrl("utilities/queue-manager"):null}).appendTo(this.$li),this.$canvasContainer=e()('<span class="icon"/>').appendTo(this.$a);var t=e()('<span class="label"/>').appendTo(this.$a);this.$label=e()("<span/>").appendTo(t),this.$progressLabel=e()('<span class="progress-label"/>').appendTo(t).hide();var i=window.devicePixelRatio>1?2:1;this._canvasSize=18*i,this._arcPos=this._canvasSize/2,this._arcRadius=7*i,this._lineWidth=3*i,this._$bgCanvas=this._createCanvas("bg","#61666b"),this._$staticCanvas=this._createCanvas("static","#d7d9db"),this._$hoverCanvas=this._createCanvas("hover","#fff"),this._$failCanvas=this._createCanvas("fail","#da5a47").hide(),this._staticCtx=this._$staticCanvas[0].getContext("2d"),this._hoverCtx=this._$hoverCanvas[0].getContext("2d"),this._drawArc(this._$bgCanvas[0].getContext("2d"),0,1),this._drawArc(this._$failCanvas[0].getContext("2d"),0,1)},setDescription:function(t,e){this.$a.attr("title",t),this.$label.text(t),e?this.$progressLabel.text(e).show():this.$progressLabel.hide()},setProgress:function(t){0==t?(this._$staticCanvas.hide(),this._$hoverCanvas.hide()):(this._$staticCanvas.show(),this._$hoverCanvas.show(),this.progress&&t>this.progress?this._animateArc(0,t/100):this._setArc(0,t/100)),this.progress=t},complete:function(){var t=this;this._animateArc(0,1,(function(){t._$bgCanvas.velocity("fadeOut"),t._animateArc(1,1,(function(){t.$a.remove(),t.destroy()}))}))},showFailMode:function(t){this.failMode||(this.failMode=!0,this.progress=null,this._$bgCanvas.hide(),this._$staticCanvas.hide(),this._$hoverCanvas.hide(),this._$failCanvas.show(),this.setDescription(t))},hideFailMode:function(){this.failMode&&(this.failMode=!1,this._$bgCanvas.show(),this._$staticCanvas.show(),this._$hoverCanvas.show(),this._$failCanvas.hide())},_createCanvas:function(t,i){var s=e()('<canvas id="job-icon-'+t+'" width="'+this._canvasSize+'" height="'+this._canvasSize+'"/>').appendTo(this.$canvasContainer),a=s[0].getContext("2d");return a.strokeStyle=i,a.lineWidth=this._lineWidth,a.lineCap="round",s},_setArc:function(t,e){this._arcStartPos=t,this._arcEndPos=e,this._drawArc(this._staticCtx,t,e),this._drawArc(this._hoverCtx,t,e)},_drawArc:function(t,e,i){t.clearRect(0,0,this._canvasSize,this._canvasSize),t.beginPath(),t.arc(this._arcPos,this._arcPos,this._arcRadius,(1.5+2*e)*Math.PI,(1.5+2*i)*Math.PI),t.stroke(),t.closePath()},_animateArc:function(t,e,i){this._arcStepTimeout&&clearTimeout(this._arcStepTimeout),this._arcStep=0,this._arcStartStepSize=(t-this._arcStartPos)/10,this._arcEndStepSize=(e-this._arcEndPos)/10,this._arcAnimateCallback=i,this._takeNextArcStep()},_takeNextArcStep:function(){this._setArc(this._arcStartPos+this._arcStartStepSize,this._arcEndPos+this._arcEndStepSize),this._arcStep++,this._arcStep<10?this._arcStepTimeout=setTimeout(this._takeNextArcStep.bind(this),50):this._arcAnimateCallback&&this._arcAnimateCallback()}});__webpack_require__(3778),__webpack_require__(6617),__webpack_require__(9482),__webpack_require__(3352),__webpack_require__(691),__webpack_require__(1519),__webpack_require__(501),__webpack_require__(2318),__webpack_require__(4755),__webpack_require__(8468),__webpack_require__(5049),__webpack_require__(7998),__webpack_require__(8895),__webpack_require__(4233),__webpack_require__(9699),__webpack_require__(1402),__webpack_require__(8201),__webpack_require__(3347),__webpack_require__(9478),__webpack_require__(2387),__webpack_require__(7966),__webpack_require__(657),__webpack_require__(4487),__webpack_require__(6966),__webpack_require__(5080),__webpack_require__(7439),__webpack_require__(5328),__webpack_require__(6419),__webpack_require__(872),__webpack_require__(1396),__webpack_require__(4070),__webpack_require__(5763),__webpack_require__(5185),__webpack_require__(8030),__webpack_require__(3096),__webpack_require__(3331),__webpack_require__(53),__webpack_require__(5074),__webpack_require__(3958),__webpack_require__(1592),__webpack_require__(1752),__webpack_require__(7e3),__webpack_require__(8654)}()})();
+(function(){var __webpack_modules__={463:function(){Craft.Accordion=Garnish.Base.extend({$trigger:null,targetSelector:null,_$target:null,init:function(t){var e=this;this.$trigger=$(t),this.$trigger.data("accordion")&&(console.warn("Double-instantiating an accordion trigger on an element"),this.$trigger.data("accordion").destroy()),this.$trigger.data("accordion",this),this.targetSelector=this.$trigger.attr("aria-controls")?"#".concat(this.$trigger.attr("aria-controls")):null,this.targetSelector&&(this._$target=$(this.targetSelector)),this.addListener(this.$trigger,"click","onTriggerClick"),this.addListener(this.$trigger,"keypress",(function(t){var i=t.keyCode;i!==Garnish.SPACE_KEY&&i!==Garnish.RETURN_KEY||(t.preventDefault(),e.onTriggerClick())}))},onTriggerClick:function(){"true"===this.$trigger.attr("aria-expanded")?this.hideTarget(this._$target):this.showTarget(this._$target)},showTarget:function(t){var e=this;if(t&&t.length){this.showTarget._currentHeight=t.height(),t.removeClass("hidden"),this.$trigger.removeClass("collapsed").addClass("expanded").attr("aria-expanded","true");for(var i=0;i<t.length;i++)!function(t){"SPAN"!==t.prop("nodeName")&&(t.height("auto"),e.showTarget._targetHeight=t.height(),t.css({height:e.showTarget._currentHeight,overflow:"hidden"}),t.velocity("stop"),t.velocity({height:e.showTarget._targetHeight},Garnish.getUserPreferredAnimationDuration("fast"),(function(){t.css({height:"",overflow:""})})))}(t.eq(i));delete this.showTarget._targetHeight,delete this.showTarget._currentHeight,Garnish.$win.trigger("resize")}},hideTarget:function(t){if(t&&t.length){this.$trigger.removeClass("expanded").addClass("collapsed").attr("aria-expanded","false");for(var e=0;e<t.length;e++)!function(t){t.hasClass("hidden")||("SPAN"===t.prop("nodeName")?t.addClass("hidden"):(t.css("overflow","hidden"),t.velocity("stop"),t.velocity({height:0},Garnish.getUserPreferredAnimationDuration("fast"),(function(){t.addClass("hidden")}))))}(t.eq(e))}},destroy:function(){this.$trigger.removeData("accordion"),this.base()}})},3839:function(){Craft.AddressesInput=Garnish.Base.extend({$container:null,$addBtn:null,$addBtnItem:null,$cards:null,init:function(t,e){var i=this;this.$container=$(t),this.setSettings(e,Craft.AddressesInput.defaults),this.$container.data("addresses")&&(console.warn("Double-instantiating an address input on an element"),this.$container.data("addresses").destroy()),this.$container.data("addresses",this),this.$addBtn=this.$container.find(".address-cards__add-btn"),this.$addBtnItem=this.$addBtn.closest("li"),this.$cards=this.$container.find("> .address-card");for(var s=0;s<this.$cards.length;s++)this.initCard(this.$cards.eq(s));this.updateAddButton(),this.addListener(this.$addBtn,"click",(function(){i.createAddress()}))},initCard:function(t){var e=this;this.addListener(t,"click",(function(i){$(i.target).closest(".menubtn").length||e.editAddress(t)}));var i=t.find(".menubtn").disclosureMenu();if(i.length){var s=i.data("trigger"),a=s.$container,n=a.find('[data-action="edit"]');this.addListener(n,"click",(function(i){i.stopPropagation(),e.editAddress(t)}));var r=a.find('[data-action="delete"]');this.addListener(r,"click",(function(i){if(i.preventDefault(),i.stopPropagation(),confirm(Craft.t("app","Are you sure you want to delete this address?"))){e.$addBtn.addClass("loading");var n=t.data("id"),r=t.data("draft-id");Craft.sendActionRequest("POST","elements/delete",{data:{elementId:n,draftId:r}}).then((function(){t.remove(),a.remove(),s.destroy(),e.$cards=e.$cards.not(t),e.updateAddButton(),e.trigger("deleteAddress",{addressId:n,draftId:r})})).finally((function(){e.$addBtn.removeClass("loading")}))}}))}},editAddress:function(t,e){var i=this;Craft.createElementEditor("craft\\elements\\Address",t,e).on("submit",(function(e){i.trigger("saveAddress",{data:e.data}),Craft.sendActionRequest("POST","addresses/card-html",{data:{addressId:e.data.id}}).then((function(e){var s=$(e.data.html);t?(t.replaceWith(s),i.$cards=i.$cards.not(t)):s.insertBefore(i.$addBtnItem),Craft.initUiElements(s),i.initCard(s),i.$cards=i.$cards.add(s),i.updateAddButton()}))}))},updateAddButton:function(){this.canCreateAddress()?this.$addBtn.removeClass("hidden"):this.$addBtn.addClass("hidden")},canCreateAddress:function(){return!this.settings.maxAddresses||this.$cards.length<this.settings.maxAddresses},createAddress:function(){var t=this;if(!this.canCreateAddress())throw"No more addresses can be created.";this.$addBtn.addClass("loading"),Craft.sendActionRequest("POST","elements/create",{data:{elementType:"craft\\elements\\Address",ownerId:this.settings.ownerId}}).then((function(e){t.editAddress(null,{elementId:e.data.element.id,draftId:e.data.element.draftId})})).finally((function(){t.$addBtn.removeClass("loading")}))},destroy:function(){this.$container.removeData("addresses"),this.base()}},{ownerId:null,defaults:{maxAddresses:null}})},7452:function(){Craft.AdminTable=Garnish.Base.extend({settings:null,totalItems:null,sorter:null,$noItems:null,$table:null,$tbody:null,$deleteBtns:null,init:function(t){var e=this;this.setSettings(t,Craft.AdminTable.defaults),this.settings.allowDeleteAll||(this.settings.minItems=1),this.$noItems=$(this.settings.noItemsSelector),this.$table=$(this.settings.tableSelector),this.$tbody=this.$table.children("tbody"),this.totalItems=this.$tbody.children().length,this.settings.sortable&&(this.sorter=new Craft.DataTableSorter(this.$table,{onSortChange:this.reorderItems.bind(this)})),this.$deleteBtns=this.$table.find(".delete:not(.disabled)"),this.addListener(this.$deleteBtns,"click","handleDeleteBtnClick"),this.addListener(this.$deleteBtns,"keydown",(function(t){t.keyCode!==Garnish.SPACE_KEY&&t.keyCode!==Garnish.RETURN_KEY||(t.preventDefault(),e.handleDeleteBtnClick(t))})),this.updateUI()},addRow:function(t){if(!(this.settings.maxItems&&this.totalItems>=this.settings.maxItems)){var e=$(t).appendTo(this.$tbody),i=e.find(".delete");this.settings.sortable&&this.sorter.addItems(e),this.$deleteBtns=this.$deleteBtns.add(i),this.addListener(i,"click","handleDeleteBtnClick"),this.totalItems++,this.updateUI()}},reorderItems:function(){var t=this;if(this.settings.sortable){for(var e=[],i=0;i<this.sorter.$items.length;i++){var s=$(this.sorter.$items[i]).attr(this.settings.idAttribute);e.push(s)}var a={ids:JSON.stringify(e)};Craft.sendActionRequest("POST",this.settings.reorderAction,{data:a}).then((function(i){t.onReorderItems(e),Craft.cp.displaySuccess(Craft.t("app",t.settings.reorderSuccessMessage))})).catch((function(e){e.response,Craft.cp.displayError(Craft.t("app",t.settings.reorderFailMessage))}))}},handleDeleteBtnClick:function(t){if(!(this.settings.minItems&&this.totalItems<=this.settings.minItems)){var e=$(t.target).closest("tr");this.confirmDeleteItem(e)&&this.deleteItem(e)}},confirmDeleteItem:function(t){if(!this.settings.confirmDeleteMessage)return!0;var e=this.getItemName(t);return confirm(Craft.t("app",this.settings.confirmDeleteMessage,{name:e}))},deleteItem:function(t){var e=this,i={id:this.getItemId(t)};Craft.sendActionRequest("POST",this.settings.deleteAction,{data:i}).then((function(i){return e.handleDeleteItemSuccess(i.data,t)})).catch((function(i){var s=i.response;return e.handleDeleteItemFailure(s.data,t)}))},handleDeleteItemFailure:function(t,e){this.getItemId(e);var i=this.getItemName(e);Craft.cp.displayError(Craft.t("app",this.settings.deleteFailMessage,{name:i}))},handleDeleteItemSuccess:function(t,e){var i=this.getItemId(e),s=this.getItemName(e);this.sorter&&this.sorter.removeItems(e),e.remove(),this.totalItems--,this.updateUI(),this.onDeleteItem(i),this.settings.deleteSuccessMessage&&Craft.cp.displaySuccess(Craft.t("app",this.settings.deleteSuccessMessage,{name:s}))},onReorderItems:function(t){this.settings.onReorderItems(t)},onDeleteItem:function(t){this.settings.onDeleteItem(t)},getItemId:function(t){return t.attr(this.settings.idAttribute)},getItemName:function(t){return Craft.escapeHtml(t.attr(this.settings.nameAttribute))},updateUI:function(){if(0===this.totalItems?(this.$table.hide(),this.$noItems.removeClass("hidden")):(this.$table.show(),this.$noItems.addClass("hidden")),this.settings.sortable){var t=this.$table.find(".move");1===this.totalItems?t.addClass("disabled"):t.removeClass("disabled")}this.settings.minItems&&this.totalItems<=this.settings.minItems?this.$deleteBtns.addClass("disabled"):this.$deleteBtns.removeClass("disabled"),this.settings.newItemBtnSelector&&(this.settings.maxItems&&this.totalItems>=this.settings.maxItems?$(this.settings.newItemBtnSelector).addClass("hidden"):$(this.settings.newItemBtnSelector).removeClass("hidden"))}},{defaults:{tableSelector:null,noItemsSelector:null,newItemBtnSelector:null,idAttribute:"data-id",nameAttribute:"data-name",sortable:!1,allowDeleteAll:!0,minItems:0,maxItems:null,reorderAction:null,deleteAction:null,reorderSuccessMessage:Craft.t("app","New order saved."),reorderFailMessage:Craft.t("app","Couldn’t save new order."),confirmDeleteMessage:Craft.t("app","Are you sure you want to delete “{name}”?"),deleteSuccessMessage:Craft.t("app","“{name}” deleted."),deleteFailMessage:Craft.t("app","Couldn’t delete “{name}”."),onReorderItems:$.noop,onDeleteItem:$.noop}})},6872:function(){Craft.AssetImageEditor=Garnish.Modal.extend({$body:null,$footer:null,$imageTools:null,$buttons:null,$cancelBtn:null,$replaceBtn:null,$saveBtn:null,$focalPointBtn:null,$editorContainer:null,$straighten:null,$croppingCanvas:null,$spinner:null,$constraintContainer:null,$constraintRadioInputs:null,$customConstraints:null,canvas:null,image:null,viewport:null,focalPoint:null,grid:null,croppingCanvas:null,clipper:null,croppingRectangle:null,cropperHandles:null,cropperGrid:null,croppingShade:null,imageStraightenAngle:0,viewportRotation:0,originalWidth:0,originalHeight:0,imageVerticeCoords:null,zoomRatio:1,animationInProgress:!1,currentView:"",assetId:null,cacheBust:null,draggingCropper:!1,scalingCropper:!1,draggingFocal:!1,previousMouseX:0,previousMouseY:0,shiftKeyHeld:!1,editorHeight:0,editorWidth:0,cropperState:!1,scaleFactor:1,flipData:{},focalPointState:!1,maxImageSize:null,lastLoadedDimensions:null,imageIsLoading:!1,mouseMoveEvent:null,croppingConstraint:!1,constraintOrientation:"landscape",showingCustomConstraint:!1,saving:!1,renderImage:null,renderCropper:null,_queue:null,init:function(t,e){var i=this;this._queue=new Craft.Queue,this.cacheBust=Date.now(),this.setSettings(e,Craft.AssetImageEditor.defaults),null===this.settings.allowDegreeFractions&&(this.settings.allowDegreeFractions=Craft.isImagick),Garnish.prefersReducedMotion()&&(this.settings.animationDuration=1),this.assetId=t,this.flipData={x:0,y:0},this.$container=$('<form class="modal fitted imageeditor"></form>').appendTo(Garnish.$bod),this.$body=$('<div class="body"></div>').appendTo(this.$container),this.$footer=$('<div class="footer"/>').appendTo(this.$container),this.base(this.$container,this.settings),this.$buttons=$('<div class="buttons right"/>').appendTo(this.$footer),this.$cancelBtn=$("<button/>",{type:"button",class:"btn cancel",text:Craft.t("app","Cancel")}).appendTo(this.$buttons),this.settings.allowSavingAsNew&&(this.$saveBtn=Craft.ui.createButton({class:"save copy",label:Craft.t("app","Save as a new asset"),spinner:!0}).appendTo(this.$buttons),this.addListener(this.$saveBtn,"activate",this.saveImage)),this.$replaceBtn=Craft.ui.createSubmitButton({class:"save replace",label:Craft.t("app","Save"),spinner:!0}).appendTo(this.$buttons),this.addListener(this.$replaceBtn,"activate",this.saveImage),this.addListener(this.$cancelBtn,"activate",this.hide),this.removeListener(this.$shade,"click"),this.maxImageSize=this.getMaxImageSize(),Craft.sendActionRequest("POST","assets/image-editor",{data:{assetId:t}}).then((function(t){return i.loadEditor(t.data)}))},getMaxImageSize:function(){var t=Garnish.$doc.get(0).documentElement.clientWidth,e=Garnish.$doc.get(0).documentElement.clientHeight;return Math.max(e,t)*(window.devicePixelRatio>1?2:1)},loadEditor:function(t){var e=this;t.html||alert(Craft.t("app","Could not load the image editor.")),this.$body.html(t.html),this.$tabs=$(".tabs li",this.$body),this.$viewsContainer=$(".views",this.$body),this.$views=$("> div",this.$viewsContainer),this.$imageTools=$(".image-container .image-tools",this.$body),this.$editorContainer=$(".image-container .image",this.$body),this.$constraintContainer=$(".constraint-group",this.$body),this.$constraintRadioInputs=$('[name="constraint"]',this.$constraintContainer),this.$focalPointBtn=$(".focal-point",this.$body),this.editorHeight=this.$editorContainer.innerHeight(),this.editorWidth=this.$editorContainer.innerWidth(),this._showSpinner(),this.updateSizeAndPosition(),$customConstraintWrapper=this.$constraintRadioInputs.filter('[value="custom"]').parent(),this.$customConstraints=$("<div/>",{class:"constraint custom hidden","data-constraint":"custom"}).append($("<input/>",{type:"text",class:"custom-constraint-w",size:3,value:1,"aria-label":Craft.t("app","Width unit")})).append($("<span/>",{class:"custom-constraint-spacer",text:"x","aria-hidden":"true"})).append($("<input/>",{type:"text",class:"custom-constraint-h",size:3,value:1,"aria-label":Craft.t("app","Height unit")})).appendTo($customConstraintWrapper),this.$constraintRadioInputs.filter((function(){var t=$(this).val();return/^\d*\.\d+$/.test(t)})).addClass("flip"),this.canvas=new fabric.StaticCanvas("image-canvas"),this.$croppingCanvas=$("#cropping-canvas",this.$editorContainer),this.$croppingCanvas.width(this.editorWidth),this.$croppingCanvas.height(this.editorHeight),this.canvas.enableRetinaScaling=!0,this.renderImage=function(){Garnish.requestAnimationFrame(e.canvas.renderAll.bind(e.canvas))};var i=Craft.getActionUrl("assets/edit-image",{assetId:this.assetId,size:this.maxImageSize,cacheBust:this.cacheBust});fabric.Image.fromURL(i,(function(i){e.image=i,e.image.set({originX:"center",originY:"center",left:e.editorWidth/2,top:e.editorHeight/2}),e.canvas.add(e.image),e.originalHeight=e.image.getHeight(),e.originalWidth=e.image.getWidth(),e.zoomRatio=1,e.lastLoadedDimensions=e.getScaledImageDimensions(),e._setFittedImageVerticeCoordinates(),e._repositionEditorElements();var s={imageDimensions:e.getScaledImageDimensions(),offsetX:0,offsetY:0},a=!1;if(t.focalPoint){var n=t.focalPoint,r=s.imageDimensions.width*n.x,o=s.imageDimensions.height*n.y;s.offsetX=r-s.imageDimensions.width/2,s.offsetY=o-s.imageDimensions.height/2,a=!0}e.storeFocalPointState(s),a&&e._createFocalPoint(),e._createViewport(),e.storeCropperState(),e._addControlListeners(),e.addListener(e.$croppingCanvas,"mousemove,touchmove",e._handleMouseMove),e.addListener(e.$croppingCanvas,"mousedown,touchstart",e._handleMouseDown),e.addListener(e.$croppingCanvas,"mouseup,touchend",e._handleMouseUp),e.addListener(e.$croppingCanvas,"mouseout,touchcancel",e._handleMouseOut),e._hideSpinner(),e.renderImage(),e.$tabs.first().trigger("click")}))},_reloadImage:function(){var t=this;if(!this.imageIsLoading){this.imageIsLoading=!0,this.maxImageSize=this.getMaxImageSize();var e=Craft.getActionUrl("assets/edit-image",{assetId:this.assetId,size:this.maxImageSize,cacheBust:this.cacheBust});this.image.setSrc(e,(function(e){t.originalHeight=e.getHeight(),t.originalWidth=e.getWidth(),t.lastLoadedDimensions={width:t.originalHeight,height:t.originalWidth},t.updateSizeAndPosition(),t.renderImage(),t.imageIsLoading=!1}))}},updateSizeAndPosition:function(){if(this.$container){var t=window.innerWidth,e=window.innerHeight;this.$container.css({width:t,"min-width":t,left:0,height:e,"min-height":e,top:0}),this.$body.css({height:e-(this.$footer.outerHeight()-1)}),t<e?this.$container.addClass("vertical"):this.$container.removeClass("vertical"),this.$editorContainer&&this.image&&this._repositionEditorElements()}},_repositionEditorElements:function(){var t={width:this.editorWidth,height:this.editorHeight};this.editorHeight=this.$editorContainer.innerHeight(),this.editorWidth=this.$editorContainer.innerWidth(),this.canvas.setDimensions({width:this.editorWidth,height:this.editorHeight});var e=this.getScaledImageDimensions();if("crop"===this.currentView){this.zoomRatio=this.getZoomToFitRatio(this.getScaledImageDimensions());var i=this._getBoundingRectangle(this.imageVerticeCoords);this._setFittedImageVerticeCoordinates(),this._repositionCropper(i)}else this.zoomRatio=this.getZoomToCoverRatio(this.getScaledImageDimensions())*this.scaleFactor;this._repositionImage(t),this._repositionViewport(),this._repositionFocalPoint(t),this._zoomImage(),this.renderImage(),(e.width/this.lastLoadedDimensions.width>1.5||e.height/this.lastLoadedDimensions.height>1.5)&&this._reloadImage()},_repositionImage:function(t){this.image.set({left:this.image.left-(t.width-this.editorWidth)/2,top:this.image.top-(t.height-this.editorHeight)/2})},_createViewport:function(){this.viewport=new fabric.Rect({width:this.image.width,height:this.image.height,fill:"rgba(127,0,0,1)",originX:"center",originY:"center",globalCompositeOperation:"destination-in",left:this.image.left,top:this.image.top}),this.canvas.add(this.viewport),this.renderImage()},_createFocalPoint:function(){var t=this.focalPointState,e=this.getScaledImageDimensions().width/t.imageDimensions.width,i=t.offsetX*e*this.zoomRatio*this.scaleFactor,s=t.offsetY*e*this.zoomRatio*this.scaleFactor;i+=this.image.left,s+=this.image.top;var a=0,n=0;this.viewport&&0===t.offsetX&&0===t.offsetY&&("crop"!==this.currentView?(a=this.viewport.left-this.image.left,n=this.viewport.top-this.image.top):(a=this.clipper.left-this.image.left,n=this.clipper.top-this.image.top),i+=a,s+=n,t.offsetX+=a/(e*this.zoomRatio*this.scaleFactor),t.offsetY+=n/(e*this.zoomRatio*this.scaleFactor)),this.focalPoint=new fabric.Group([new fabric.Circle({radius:8,fill:"rgba(0,0,0,0.5)",strokeWidth:2,stroke:"rgba(255,255,255,0.8)",left:0,top:0,originX:"center",originY:"center"}),new fabric.Circle({radius:1,fill:"rgba(255,255,255,0)",strokeWidth:2,stroke:"rgba(255,255,255,0.8)",left:0,top:0,originX:"center",originY:"center"})],{originX:"center",originY:"center",left:i,top:s}),this.storeFocalPointState(t),this.canvas.add(this.focalPoint)},toggleFocalPoint:function(){this.focalPoint?(this.canvas.remove(this.focalPoint),this.focalPoint=null,this.$focalPointBtn.attr("aria-pressed","false")):(this._createFocalPoint(),this.$focalPointBtn.attr("aria-pressed","true")),this.renderImage()},_repositionViewport:function(){if(this.viewport){var t={left:this.editorWidth/2,top:this.editorHeight/2};if("crop"===this.currentView)t.width=this.editorWidth,t.height=this.editorHeight;else if(this.cropperState){var e=this.cropperState,i=this.getScaledImageDimensions().width/e.imageDimensions.width;t.width=e.width*i*this.zoomRatio,t.height=e.height*i*this.zoomRatio,this.image.set({left:this.editorWidth/2-e.offsetX*i,top:this.editorHeight/2-e.offsetY*i})}else $.extend(t,this.getScaledImageDimensions());this.viewport.set(t)}},_repositionFocalPoint:function(t){if(this.focalPoint){var e=this.focalPoint.left-this.editorWidth/2,i=this.focalPoint.top-this.editorHeight/2,s=this.image.width,a=this.getScaledImageDimensions().width*this.zoomRatio/s/this.scaleFactor;e-=(t.width-this.editorWidth)/2,i-=(t.height-this.editorHeight)/2,e*=a,i*=a,this.focalPoint.set({left:this.editorWidth/2+e,top:this.editorHeight/2+i})}},hasOrientationChanged:function(){return this.viewportRotation%180!=0},getScaledImageDimensions:function(){return void 0===this.getScaledImageDimensions._&&(this.getScaledImageDimensions._={}),this.getScaledImageDimensions._.imageRatio=this.originalHeight/this.originalWidth,this.getScaledImageDimensions._.editorRatio=this.editorHeight/this.editorWidth,this.getScaledImageDimensions._.dimensions={},this.getScaledImageDimensions._.imageRatio>this.getScaledImageDimensions._.editorRatio?(this.getScaledImageDimensions._.dimensions.height=Math.min(this.editorHeight,this.originalHeight),this.getScaledImageDimensions._.dimensions.width=Math.round(this.originalWidth/(this.originalHeight/this.getScaledImageDimensions._.dimensions.height))):(this.getScaledImageDimensions._.dimensions.width=Math.min(this.editorWidth,this.originalWidth),this.getScaledImageDimensions._.dimensions.height=Math.round(this.originalHeight*(this.getScaledImageDimensions._.dimensions.width/this.originalWidth))),this.getScaledImageDimensions._.dimensions},_zoomImage:function(){void 0===this._zoomImage._&&(this._zoomImage._={}),this._zoomImage._.imageDimensions=this.getScaledImageDimensions(),this.image.set({width:this._zoomImage._.imageDimensions.width*this.zoomRatio,height:this._zoomImage._.imageDimensions.height*this.zoomRatio})},_getPrevTab:function(){var t,e=this._getActiveTabIndex();if(!(e<0))return t=e>0?e-1:this.$tabs.length-1,this.$tabs.eq(t)},_getNextTab:function(){var t,e=this._getActiveTabIndex();if(!(e<0))return t=e<this.$tabs.length-1?e+1:0,this.$tabs.eq(t)},_getActiveTab:function(){return this.$tabs.filter('[aria-selected="true"]')},_getActiveTabIndex:function(){var t=this._getActiveTab();if(t.length)return t.index()},_addControlListeners:function(){var t=this;this.addListener(this.$tabs,"click",this._handleTabClick),this.addListener(this.$tabs,"keydown",(function(e){switch(e.keyCode){case Garnish.LEFT_KEY:case Garnish.UP_KEY:e.preventDefault();var i=t._getPrevTab();t.activateTab(i);break;case Garnish.RIGHT_KEY:case Garnish.DOWN_KEY:e.preventDefault();var s=t._getNextTab();t.activateTab(s)}})),this.addListener(this.$focalPointBtn,"click",this.toggleFocalPoint),this.addListener($(".rotate-left"),"click",(function(){this.rotateImage(-90)})),this.addListener($(".rotate-right"),"click",(function(){this.rotateImage(90)})),this.addListener($(".flip-vertical"),"click",(function(){this.flipImage("y")})),this.addListener($(".flip-horizontal"),"click",(function(){this.flipImage("x")})),this.straighteningInput=new Craft.SlideRuleInput("slide-rule",{onStart:function(){t._showGrid()},onChange:function(e){t.straighten(e)},onEnd:function(){t._hideGrid(),t._cleanupFocalPointAfterStraighten()}}),this.addListener(Garnish.$doc,"keydown",(function(t){t.keyCode===Garnish.SHIFT_KEY&&(this.shiftKeyHeld=!0)})),this.addListener(Garnish.$doc,"keyup",(function(t){t.keyCode===Garnish.SHIFT_KEY&&(this.shiftKeyHeld=!1)})),this.addListener(this.$constraintRadioInputs,"change",this._handleConstraintChange),this.addListener($(".orientation input",this.$container),"click",this._handleOrientationClick),this.addListener($(".constraint-group .custom input",this.$container),"keyup",this._applyCustomConstraint)},_handleConstraintClick:function(t){var e=$(t.currentTarget).data("constraint"),i=$(t.currentTarget);if(i.siblings().removeClass("active"),i.addClass("active"),"custom"==e)return this._showCustomConstraint(),void this._applyCustomConstraint();this._hideCustomConstraint(),this.setCroppingConstraint(e),this.enforceCroppingConstraint()},_handleConstraintChange:function(t){var e=$(t.target).val();if("custom"==e)return this._showCustomConstraint(),void this._applyCustomConstraint();this._hideCustomConstraint(),this.setCroppingConstraint(e),this.enforceCroppingConstraint()},_handleOrientationClick:function(t){if(t.currentTarget.value!==this.constraintOrientation){this.constraintOrientation=t.currentTarget.value;for(var e=$(".flip",this.$constraintContainer),i=0;i<e.length;i++){var s=$(e[i]),a='label[for="'+s.attr("id")+'"]',n=$(a,this.$constraintContainer);s.val(1/s.val()),n.html(n.text().split(":").reverse().join(":").replace(/\s/g,""))}e.filter(":checked").trigger("change")}},_applyCustomConstraint:function(){var t=this._getCustomConstraint();t.w>0&&t.h>0&&(this.setCroppingConstraint(t.w/t.h),this.enforceCroppingConstraint())},_getCustomConstraint:function(){var t=parseFloat($(".custom-constraint-w").val()),e=parseFloat($(".custom-constraint-h").val());return{w:isNaN(t)?0:t,h:isNaN(e)?0:e}},_setCustomConstraint:function(t,e){$(".custom-constraint-w").val(parseFloat(t)),$(".custom-constraint-h").val(parseFloat(e))},_hideCustomConstraint:function(){this.showingCustomConstraint=!1,this.$customConstraints.addClass("hidden"),$(".orientation",this.$container).removeClass("hidden")},_showCustomConstraint:function(){this.showingCustomConstraint||(this.showingCustomConstraint=!0,this.$customConstraints.removeClass("hidden"),$(".orientation",this.$container).addClass("hidden"))},_handleTabClick:function(t){if(!this.animationInProgress){var e=$(t.currentTarget);this.activateTab(e)}},activateTab:function(t){var e=$(t).data("view");this.$tabs.removeClass("selected").attr({"aria-selected":"false",tabindex:"-1"}),$(t).addClass("selected").attr({"aria-selected":"true",tabindex:"0"}).trigger("focus"),this.showView(e)},showView:function(t){var e=this;this.currentView!==t&&(this.$views.addClass("hidden"),this.$views.filter('[data-view="'+t+'"]').removeClass("hidden"),"rotate"===t?this.enableSlider():this.disableSlider(),this.updateSizeAndPosition(),"crop"===this.currentView&&"crop"!==t?this._queue.push((function(){return new Promise((function(t,i){e.disableCropMode(),t()}))})):"crop"!==this.currentView&&"crop"===t&&this._queue.push((function(){return new Promise((function(t,i){e.enableCropMode(),t()}))})),this.currentView=t)},storeCropperState:function(t){void 0===this.storeCropperState._&&(this.storeCropperState._={}),t?this.cropperState=t:this.clipper?(this.storeCropperState._.zoomFactor=1/this.zoomRatio,this.cropperState={offsetX:(this.clipper.left-this.image.left)*this.storeCropperState._.zoomFactor,offsetY:(this.clipper.top-this.image.top)*this.storeCropperState._.zoomFactor,height:this.clipper.height*this.storeCropperState._.zoomFactor,width:this.clipper.width*this.storeCropperState._.zoomFactor,imageDimensions:this.getScaledImageDimensions()}):(this.storeCropperState._.dimensions=this.getScaledImageDimensions(),this.cropperState={offsetX:0,offsetY:0,height:this.storeCropperState._.dimensions.height,width:this.storeCropperState._.dimensions.width,imageDimensions:this.storeCropperState._.dimensions})},storeFocalPointState:function(t){void 0===this.storeFocalPointState._&&(this.storeFocalPointState._={}),t?this.focalPointState=t:this.focalPoint&&(this.storeFocalPointState._.zoomFactor=1/this.zoomRatio,this.focalPointState={offsetX:(this.focalPoint.left-this.image.left)*this.storeFocalPointState._.zoomFactor/this.scaleFactor,offsetY:(this.focalPoint.top-this.image.top)*this.storeFocalPointState._.zoomFactor/this.scaleFactor,imageDimensions:this.getScaledImageDimensions()})},rotateImage:function(t){var e=this;if(!this.animationInProgress){if(90!==t&&-90!==t)return!1;this.animationInProgress=!0,this.viewportRotation+=t,this.viewportRotation=parseInt((this.viewportRotation+360)%360,10);var i,s=this.image.angle+t,a=this.getScaledImageDimensions();i=this.hasOrientationChanged()?this.getZoomToCoverRatio({height:a.width,width:a.height}):this.getZoomToCoverRatio(a),this.zoomRatio>i&&(i=this.zoomRatio);var n={angle:90===t?"+=90":"-=90"},r={angle:s,width:a.width*i,height:a.height*i},o=1;this.scaleFactor<1?(o=1/this.scaleFactor,this.scaleFactor=1):(this.viewport.width>this.editorHeight?o=this.editorHeight/this.viewport.width:this.viewport.height>this.editorWidth&&(o=this.editorWidth/this.viewport.height),this.scaleFactor=o),o<1&&(r.width*=o,r.height*=o);var l=this.cropperState,h=l.offsetX,d=l.offsetY,c=t*(Math.PI/180),u=h*Math.cos(c)-d*Math.sin(c),p=h*Math.sin(c)+d*Math.cos(c),f=a.width/l.imageDimensions.width,g=u*f*this.zoomRatio*this.scaleFactor,m=p*f*this.zoomRatio*this.scaleFactor;r.left=this.editorWidth/2-g,r.top=this.editorHeight/2-m,l.offsetX=u,l.offsetY=p;var v=l.width;l.width=l.height,l.height=v,this.storeCropperState(l),this.focalPoint&&this.canvas.remove(this.focalPoint),this.viewport.animate(n,{duration:this.settings.animationDuration,onComplete:function(){var t=e.viewport.height*o;e.viewport.height=e.viewport.width*o,e.viewport.width=t,e.viewport.set({angle:0})}}),this.image.animate(r,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:function(){var i=parseFloat((e.image.angle+360)%360);e.image.set({angle:i}),e.animationInProgress=!1,e.focalPoint?(e._adjustFocalPointByAngle(t),e.straighten(e.straighteningInput),e.canvas.add(e.focalPoint)):e._resetFocalPointPosition()}})}},flipImage:function(t){var e=this;if(!this.animationInProgress){this.animationInProgress=!0,this.hasOrientationChanged()&&(t="y"===t?"x":"y"),this.focalPoint?this.canvas.remove(this.focalPoint):this._resetFocalPointPosition();var i={x:this.editorWidth/2,y:this.editorHeight/2};this.straighteningInput.setValue(-this.imageStraightenAngle),this.imageStraightenAngle=-this.imageStraightenAngle;var s,a,n={angle:this.viewportRotation+this.imageStraightenAngle},r=this.cropperState,o=this.focalPointState;"y"===t&&this.hasOrientationChanged()||"y"!==t&&!this.hasOrientationChanged()?(r.offsetX=-r.offsetX,o.offsetX=-o.offsetX,a=this.image.left-i.x,n.left=i.x-a):(r.offsetY=-r.offsetY,o.offsetY=-o.offsetY,s=this.image.top-i.y,n.top=i.y-s),"y"===t?(n.scaleY=-1*this.image.scaleY,this.flipData.y=1-this.flipData.y):(n.scaleX=-1*this.image.scaleX,this.flipData.x=1-this.flipData.x),this.storeCropperState(r),this.storeFocalPointState(o),this.image.animate(n,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:function(){e.animationInProgress=!1,e.focalPoint&&(e._adjustFocalPointByAngle(0),e.canvas.add(e.focalPoint))}})}},straighten:function(t){if(!this.animationInProgress){this.animationInProgress=!0;var e=this.image.angle;this.imageStraightenAngle=(this.settings.allowDegreeFractions?parseFloat(t.value):Math.round(parseFloat(t.value)))%360,this.image.set({angle:this.viewportRotation+this.imageStraightenAngle}),this.zoomRatio=this.getZoomToCoverRatio(this.getScaledImageDimensions())*this.scaleFactor,this._zoomImage(),this.cropperState&&this._adjustEditorElementsOnStraighten(e),this.renderImage(),this.animationInProgress=!1}},_adjustEditorElementsOnStraighten:function(t){var e,i,s,a,n,r=this.getScaledImageDimensions(),o=this.image.angle-t,l=this.cropperState,h=this.zoomRatio,d=1;do{var c=l.offsetX,u=l.offsetY,p=o*(Math.PI/180);s=c*Math.cos(p)-u*Math.sin(p),a=c*Math.sin(p)+u*Math.cos(p),e=s*h*(n=r.width/l.imageDimensions.width),i=a*h*n;var f=this.getImageVerticeCoords(h),g={width:this.viewport.width,height:this.viewport.height,left:this.editorWidth/2-this.viewport.width/2+e,top:this.editorHeight/2-this.viewport.height/2+i};h*=d=this._getZoomRatioToFitRectangle(g,f)}while(1!==d);this.image.set({left:this.editorWidth/2-e,top:this.editorHeight/2-i}),l.offsetX=s,l.offsetY=a,l.width=this.viewport.width/h/n,l.height=this.viewport.height/h/n,this.storeCropperState(l),this.zoomRatio=h,this.focalPoint?(this._adjustFocalPointByAngle(o),this._isCenterInside(this.focalPoint,this.viewport)?this.focalPoint.set({opacity:1}):this.focalPoint.set({opacity:0})):0!==o&&this._resetFocalPointPosition(),this._zoomImage()},_cleanupFocalPointAfterStraighten:function(){if(this.focalPoint&&!this._isCenterInside(this.focalPoint,this.viewport)){this.focalPoint.set({opacity:1});var t=this.focalPointState;t.offsetX=0,t.offsetY=0,this.storeFocalPointState(t),this.toggleFocalPoint()}},_resetFocalPointPosition:function(){var t=this.focalPointState;t.offsetX=0,t.offsetY=0,this.storeFocalPointState(t)},_isCenterInside:function(t,e){return t.left>e.left-e.width/2&&t.top>e.top-e.height/2&&t.left<e.left+e.width/2&&t.top<e.top+e.height/2},_adjustFocalPointByAngle:function(t){var e=t*(Math.PI/180),i=this.focalPointState,s=i.offsetX,a=i.offsetY,n=s*Math.cos(e)-a*Math.sin(e),r=s*Math.sin(e)+a*Math.cos(e),o=this.getScaledImageDimensions().width/i.imageDimensions.width,l=n*o*this.zoomRatio,h=r*o*this.zoomRatio;this.focalPoint.left=this.image.left+l,this.focalPoint.top=this.image.top+h,i.offsetX=n,i.offsetY=r,this.storeFocalPointState(i)},_getZoomRatioToFitRectangle:function(t,e){for(var i,s,a=this._getRectangleVertices(t),n=0;n<a.length&&(i=a[n],this.arePointsInsideRectangle([i],e));n++)i=!1;if(i){var r=this._getEdgeCrossed(e,i),o={x:t.left+t.width/2,y:t.top+t.height/2},l=Math.abs((r[1].y-r[0].y)*i.x-(r[1].x-r[0].x)*i.y+r[1].x*r[0].y-r[1].y*r[0].x)/Math.sqrt(Math.pow(r[1].y-r[0].y,2)+Math.pow(r[1].x-r[0].x,2)),h=Math.abs((r[1].y-r[0].y)*o.x-(r[1].x-r[0].x)*o.y+r[1].x*r[0].y-r[1].y*r[0].x)/Math.sqrt(Math.pow(r[1].y-r[0].y,2)+Math.pow(r[1].x-r[0].x,2));s=(l+h)/h}else s=1;return s},saveImage:function(t){var e=this,i=$(t.currentTarget);if(this.saving)return!1;this.saving=!0,i.addClass("loading");var s=i.hasClass("replace"),a={assetId:this.assetId,viewportRotation:this.viewportRotation,imageRotation:this.imageStraightenAngle,replace:s?1:0};if(this.cropperState){var n={};n.height=this.cropperState.height,n.width=this.cropperState.width,n.offsetX=this.cropperState.offsetX,n.offsetY=this.cropperState.offsetY,a.imageDimensions=this.cropperState.imageDimensions,a.cropData=n}else a.imageDimensions=this.getScaledImageDimensions();this.focalPoint&&(a.focalPoint=this.focalPointState),a.flipData=this.flipData,a.zoom=this.zoomRatio,Craft.sendActionRequest("POST","assets/save-image",{data:a}).then((function(t){var i=t.data;e.onSave(i),s&&Craft.broadcaster&&Craft.broadcaster.postMessage({event:"saveElement",id:e.assetId}),e.hide(),Craft.cp.runQueue(),Craft.Preview.refresh()})).catch((function(t){var e=t.response;alert(e.data.message)})).finally((function(){e.$buttons.find(".btn").removeClass("loading"),e.saving=!1}))},getZoomToCoverRatio:function(t){var e=Math.abs(this.imageStraightenAngle)*(Math.PI/180),i=Math.sin(e)*t.height+Math.cos(e)*t.width,s=Math.sin(e)*t.width+Math.cos(e)*t.height;return Math.max(i/t.width,s/t.height)},getZoomToFitRatio:function(t){var e=this._getImageBoundingBox(t),i=1;if(e.height>this.editorHeight||e.width>this.editorWidth){var s=this.editorHeight/e.height,a=this.editorWidth/e.width;i=Math.min(a,s)}return i},getCombinedZoomRatio:function(t){return this.getZoomToCoverRatio(t)/this.getZoomToFitRatio(t)},_showGrid:function(){if(!this.grid){var t,e={strokeWidth:1,stroke:"rgba(255,255,255,0.5)"},i=this.viewport.width,s=this.viewport.height,a=i/9,n=s/9,r=[new fabric.Rect({strokeWidth:2,stroke:"rgba(255,255,255,1)",originX:"center",originY:"center",width:i,height:s,left:i/2,top:s/2,fill:"rgba(255,255,255,0)"})];for(t=1;t<=8;t++)r.push(new fabric.Line([t*a,0,t*a,s],e));for(t=1;t<=8;t++)r.push(new fabric.Line([0,t*n,i,t*n],e));this.grid=new fabric.Group(r,{left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",angle:this.viewport.angle}),this.canvas.add(this.grid),this.renderImage()}},_hideGrid:function(){this.canvas.remove(this.grid),this.grid=null,this.renderImage()},onFadeOut:function(){this.destroy()},show:function(){this.base(),Garnish.$bod.addClass("no-scroll")},hide:function(){this.removeAllListeners(),this.straighteningInput.removeAllListeners(),Garnish.$bod.removeClass("no-scroll"),this.base()},onSave:function(t){this.settings.onSave(t),this.trigger("save")},enableSlider:function(){this.$imageTools.removeClass("hidden")},disableSlider:function(){this.$imageTools.addClass("hidden")},enableCropMode:function(){var t=this,e=this.getScaledImageDimensions();this.zoomRatio=this.getZoomToFitRatio(e);var i={width:this.editorWidth,height:this.editorHeight},s={width:e.width*this.zoomRatio,height:e.height*this.zoomRatio,left:this.editorWidth/2,top:this.editorHeight/2};this._editorModeTransition((function(){t._setFittedImageVerticeCoordinates();var e=t.cropperState,i=t.getScaledImageDimensions(),s=i.width/e.imageDimensions.width,a={left:t.image.left+e.offsetX*s*t.zoomRatio,top:t.image.top+e.offsetY*s*t.zoomRatio,width:e.width*s*t.zoomRatio,height:e.height*s*t.zoomRatio};t._showCropper(a),t.focalPoint&&(s=i.width/t.focalPointState.imageDimensions.width,t.focalPoint.left=t.image.left+t.focalPointState.offsetX*s*t.zoomRatio,t.focalPoint.top=t.image.top+t.focalPointState.offsetY*s*t.zoomRatio,t.canvas.add(t.focalPoint))}),s,i)},disableCropMode:function(){var t=this,e={};this._hideCropper();var i=this.getScaledImageDimensions(),s=this.getZoomToCoverRatio(i)*this.scaleFactor,a=s/this.zoomRatio;this.zoomRatio=s;var n={width:i.width*this.zoomRatio,height:i.height*this.zoomRatio,left:this.editorWidth/2,top:this.editorHeight/2},r=(this.clipper.left-this.image.left)*a,o=(this.clipper.top-this.image.top)*a;n.left=this.editorWidth/2-r,n.top=this.editorHeight/2-o,e.height=this.clipper.height*a,e.width=this.clipper.width*a,(!this.focalPoint||this.focalPoint&&!this._isCenterInside(this.focalPoint,this.clipper))&&(this.focalPoint&&this.toggleFocalPoint(),this._resetFocalPointPosition()),this._editorModeTransition((function(){if(t.focalPoint){var e=t.getScaledImageDimensions().width/t.focalPointState.imageDimensions.width;t.focalPoint.left=t.image.left+t.focalPointState.offsetX*e*t.zoomRatio,t.focalPoint.top=t.image.top+t.focalPointState.offsetY*e*t.zoomRatio,t.canvas.add(t.focalPoint)}}),n,e)},_editorModeTransition:function(t,e,i){var s=this;this._queue.pause(),this.animationInProgress||(this.animationInProgress=!0,this.focalPoint&&(this.canvas.remove(this.focalPoint),this.renderImage()),this.image.animate(e,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:function(){t(),s.animationInProgress=!1,s.renderImage(),s._queue.resume()}}),this.viewport.animate(i,{duration:this.settings.animationDuration}))},_showSpinner:function(){this.$spinner||(this.$spinner=$('<div class="spinner big spinner-absolute"/>')),this.$spinner.appendTo(this.$container.find(".image"))},_hideSpinner:function(){this.$spinner.remove()},_showCropper:function(t){this._setupCropperLayer(t),this._redrawCropperElements(),this.renderCropper()},_hideCropper:function(){this.clipper&&(this.croppingCanvas.remove(this.clipper),this.croppingCanvas.remove(this.croppingShade),this.croppingCanvas.remove(this.cropperHandles),this.croppingCanvas.remove(this.cropperGrid),this.croppingCanvas.remove(this.croppingRectangle),this.croppingCanvas=null,this.renderCropper=null)},_setupCropperLayer:function(t){var e=this;this.croppingCanvas=new fabric.StaticCanvas("cropping-canvas",{backgroundColor:"rgba(0,0,0,0)",hoverCursor:"default",selection:!1}),this.croppingCanvas.setDimensions({width:this.editorWidth,height:this.editorHeight}),this.renderCropper=function(){return Garnish.requestAnimationFrame(e.croppingCanvas.renderAll.bind(e.croppingCanvas))},$("#cropping-canvas",this.$editorContainer).css({position:"absolute",top:0,left:0}),this.croppingShade=new fabric.Rect({left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",width:this.editorWidth,height:this.editorHeight,fill:"rgba(0,0,0,0.7)"});var i=this.getScaledImageDimensions(),s=0===this.imageStraightenAngle?1:1.2*this.getCombinedZoomRatio(i),a=i.width/s,n=i.height/s;if(this.hasOrientationChanged()){var r=n;n=a,a=r}this.clipper=new fabric.Rect({left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",width:a,height:n,stroke:"black",fill:"rgba(128,0,0,1)",strokeWidth:0}),t&&this.clipper.set(t),this.clipper.globalCompositeOperation="destination-out",this.croppingCanvas.add(this.croppingShade),this.croppingCanvas.add(this.clipper)},_redrawCropperElements:function(){void 0===this._redrawCropperElements._&&(this._redrawCropperElements._={}),this.cropperHandles&&(this.croppingCanvas.remove(this.cropperHandles),this.croppingCanvas.remove(this.cropperGrid),this.croppingCanvas.remove(this.croppingRectangle)),this._redrawCropperElements._.lineOptions={strokeWidth:4,stroke:"rgb(255,255,255)",fill:!1},this._redrawCropperElements._.gridOptions={strokeWidth:2,stroke:"rgba(255,255,255,0.5)"},this._redrawCropperElements._.pathGroup=[new fabric.Path("M 0,10 L 0,0 L 10,0",this._redrawCropperElements._.lineOptions),new fabric.Path("M "+(this.clipper.width-8)+",0 L "+(this.clipper.width+4)+",0 L "+(this.clipper.width+4)+",10",this._redrawCropperElements._.lineOptions),new fabric.Path("M "+(this.clipper.width+4)+","+(this.clipper.height-8)+" L"+(this.clipper.width+4)+","+(this.clipper.height+4)+" L "+(this.clipper.width-8)+","+(this.clipper.height+4),this._redrawCropperElements._.lineOptions),new fabric.Path("M 10,"+(this.clipper.height+4)+" L 0,"+(this.clipper.height+4)+" L 0,"+(this.clipper.height-8),this._redrawCropperElements._.lineOptions)],this.cropperHandles=new fabric.Group(this._redrawCropperElements._.pathGroup,{left:this.clipper.left,top:this.clipper.top,originX:"center",originY:"center"}),this.croppingRectangle=new fabric.Rect({left:this.clipper.left,top:this.clipper.top,width:this.clipper.width,height:this.clipper.height,fill:"rgba(0,0,0,0)",stroke:"rgba(255,255,255,0.8)",strokeWidth:2,originX:"center",originY:"center"}),this.cropperGrid=new fabric.Group([new fabric.Line([.33*this.clipper.width,0,.33*this.clipper.width,this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([.66*this.clipper.width,0,.66*this.clipper.width,this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([0,.33*this.clipper.height,this.clipper.width,.33*this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([0,.66*this.clipper.height,this.clipper.width,.66*this.clipper.height],this._redrawCropperElements._.gridOptions)],{left:this.clipper.left,top:this.clipper.top,originX:"center",originY:"center"}),this._redrawCropperElements._.cropTextTop=this.croppingRectangle.top+this.clipper.height/2+12,this._redrawCropperElements._.cropTextBackgroundColor="rgba(0,0,0,0)",this._redrawCropperElements._.cropTextTop+12>this.editorHeight-2&&(this._redrawCropperElements._.cropTextTop-=24,this._redrawCropperElements._.cropTextBackgroundColor="rgba(0,0,0,0.5)"),this.croppingCanvas.add(this.cropperHandles),this.croppingCanvas.add(this.cropperGrid),this.croppingCanvas.add(this.croppingRectangle)},_repositionCropper:function(t){if(this.croppingCanvas){var e=this.clipper.left-this.croppingCanvas.width/2,i=this.clipper.top-this.croppingCanvas.height/2;this.croppingCanvas.setDimensions({width:this.editorWidth,height:this.editorHeight});var s=this._getBoundingRectangle(this.imageVerticeCoords).width/t.width;this.clipper.width=Math.round(this.clipper.width*s),this.clipper.height=Math.round(this.clipper.height*s),this.clipper.left=this.editorWidth/2+e*s,this.clipper.top=this.editorHeight/2+i*s,this.croppingShade.set({width:this.editorWidth,height:this.editorHeight,left:this.editorWidth/2,top:this.editorHeight/2}),this._redrawCropperElements(),this.renderCropper()}},_getBoundingRectangle:function(t){return{width:Math.max(t.a.x,t.b.x,t.c.x,t.d.x)-Math.min(t.a.x,t.b.x,t.c.x,t.d.x),height:Math.max(t.a.y,t.b.y,t.c.y,t.d.y)-Math.min(t.a.y,t.b.y,t.c.y,t.d.y)}},_handleMouseDown:function(t){var e=this.focalPoint&&this._isMouseOver(t,this.focalPoint),i=this.croppingCanvas&&this._isMouseOver(t,this.clipper),s=this.croppingCanvas&&this._cropperHandleHitTest(t);(s||i||e)&&(this.previousMouseX=t.pageX,this.previousMouseY=t.pageY,e?this.draggingFocal=!0:s?this.scalingCropper=s:i&&(this.draggingCropper=!0))},_handleMouseMove:function(t){null!==this.mouseMoveEvent&&Garnish.requestAnimationFrame(this._handleMouseMoveInternal.bind(this)),this.mouseMoveEvent=t},_handleMouseMoveInternal:function(){null!==this.mouseMoveEvent&&(this.focalPoint&&this.draggingFocal?(this._handleFocalDrag(this.mouseMoveEvent),this.storeFocalPointState(),this.renderImage()):this.draggingCropper||this.scalingCropper?(this.draggingCropper?this._handleCropperDrag(this.mouseMoveEvent):this._handleCropperResize(this.mouseMoveEvent),this._redrawCropperElements(),this.storeCropperState(),this.renderCropper()):this._setMouseCursor(this.mouseMoveEvent),this.previousMouseX=this.mouseMoveEvent.pageX,this.previousMouseY=this.mouseMoveEvent.pageY,this.mouseMoveEvent=null)},_handleMouseUp:function(){this.draggingCropper=!1,this.scalingCropper=!1,this.draggingFocal=!1},_handleMouseOut:function(t){this._handleMouseUp(t),this.mouseMoveEvent=t,this._handleMouseMoveInternal()},_handleCropperDrag:function(t){if(void 0===this._handleCropperDrag._&&(this._handleCropperDrag._={}),this._handleCropperDrag._.deltaX=t.pageX-this.previousMouseX,this._handleCropperDrag._.deltaY=t.pageY-this.previousMouseY,0===this._handleCropperDrag._.deltaX&&0===this._handleCropperDrag._.deltaY)return!1;if(this._handleCropperDrag._.rectangle={left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height},this._handleCropperDrag._.vertices=this._getRectangleVertices(this._handleCropperDrag._.rectangle,this._handleCropperDrag._.deltaX,this._handleCropperDrag._.deltaY),!this.arePointsInsideRectangle(this._handleCropperDrag._.vertices,this.imageVerticeCoords)){for(this._handleCropperDrag._.dxi=0,this._handleCropperDrag._.dyi=0,this._handleCropperDrag._.xStep=this._handleCropperDrag._.deltaX>0?-1:1,this._handleCropperDrag._.yStep=this._handleCropperDrag._.deltaY>0?-1:1,this._handleCropperDrag._.furthest=0,this._handleCropperDrag._.furthestDeltas={},this._handleCropperDrag._.dxi=Math.min(Math.abs(this._handleCropperDrag._.deltaX),10);this._handleCropperDrag._.dxi>=0;this._handleCropperDrag._.dxi--)for(this._handleCropperDrag._.dyi=Math.min(Math.abs(this._handleCropperDrag._.deltaY),10);this._handleCropperDrag._.dyi>=0;this._handleCropperDrag._.dyi--)this._handleCropperDrag._.vertices=this._getRectangleVertices(this._handleCropperDrag._.rectangle,this._handleCropperDrag._.dxi*(this._handleCropperDrag._.deltaX>0?1:-1),this._handleCropperDrag._.dyi*(this._handleCropperDrag._.deltaY>0?1:-1)),this.arePointsInsideRectangle(this._handleCropperDrag._.vertices,this.imageVerticeCoords)&&this._handleCropperDrag._.dxi+this._handleCropperDrag._.dyi>this._handleCropperDrag._.furthest&&(this._handleCropperDrag._.furthest=this._handleCropperDrag._.dxi+this._handleCropperDrag._.dyi,this._handleCropperDrag._.furthestDeltas={x:this._handleCropperDrag._.dxi*(this._handleCropperDrag._.deltaX>0?1:-1),y:this._handleCropperDrag._.dyi*(this._handleCropperDrag._.deltaY>0?1:-1)});if(0==this._handleCropperDrag._.furthest)return;this._handleCropperDrag._.deltaX=this._handleCropperDrag._.furthestDeltas.x,this._handleCropperDrag._.deltaY=this._handleCropperDrag._.furthestDeltas.y}this.clipper.set({left:this.clipper.left+this._handleCropperDrag._.deltaX,top:this.clipper.top+this._handleCropperDrag._.deltaY})},_handleFocalDrag:function(t){if(void 0===this._handleFocalDrag._&&(this._handleFocalDrag._={}),this.focalPoint){if(this._handleFocalDrag._.deltaX=t.pageX-this.previousMouseX,this._handleFocalDrag._.deltaY=t.pageY-this.previousMouseY,0===this._handleFocalDrag._.deltaX&&0===this._handleFocalDrag._.deltaY)return;if(this._handleFocalDrag._.newX=this.focalPoint.left+this._handleFocalDrag._.deltaX,this._handleFocalDrag._.newY=this.focalPoint.top+this._handleFocalDrag._.deltaY,"crop"===this.currentView){if(!this.arePointsInsideRectangle([{x:this._handleFocalDrag._.newX,y:this._handleFocalDrag._.newY}],this.imageVerticeCoords))return}else if(!(this.viewport.left-this.viewport.width/2-this._handleFocalDrag._.newX<0&&this.viewport.left+this.viewport.width/2-this._handleFocalDrag._.newX>0&&this.viewport.top-this.viewport.height/2-this._handleFocalDrag._.newY<0&&this.viewport.top+this.viewport.height/2-this._handleFocalDrag._.newY>0))return;this.focalPoint.set({left:this.focalPoint.left+this._handleFocalDrag._.deltaX,top:this.focalPoint.top+this._handleFocalDrag._.deltaY})}},setCroppingConstraint:function(t){switch(this.updateSizeAndPosition(),t){case"none":this.croppingConstraint=!1;break;case"original":this.croppingConstraint=this.originalWidth/this.originalHeight;break;case"current":this.croppingConstraint=this.clipper.width/this.clipper.height;break;case"custom":break;default:this.croppingConstraint=parseFloat(t)}},enforceCroppingConstraint:function(){var t=this;void 0===this.enforceCroppingConstraint._&&(this.enforceCroppingConstraint._={}),!this.animationInProgress&&this.croppingConstraint&&(this.animationInProgress=!0,this.enforceCroppingConstraint._.rectangle={left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height},this.clipper.width>this.clipper.height*this.croppingConstraint?(this.enforceCroppingConstraint._.previousHeight=this.enforceCroppingConstraint._.rectangle.height,this.enforceCroppingConstraint._.rectangle.height=this.clipper.width/this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.top-=(this.enforceCroppingConstraint._.rectangle.height-this.enforceCroppingConstraint._.previousHeight)/2,this.arePointsInsideRectangle(this._getRectangleVertices(this.enforceCroppingConstraint._.rectangle),this.imageVerticeCoords)||(this.enforceCroppingConstraint._.rectangle.width=this.clipper.height*this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.height=this.enforceCroppingConstraint._.rectangle.width/this.croppingConstraint)):(this.enforceCroppingConstraint._.previousWidth=this.enforceCroppingConstraint._.rectangle.width,this.enforceCroppingConstraint._.rectangle.width=this.clipper.height*this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.left-=(this.enforceCroppingConstraint._.rectangle.width-this.enforceCroppingConstraint._.previousWidth)/2,this.arePointsInsideRectangle(this._getRectangleVertices(this.enforceCroppingConstraint._.rectangle),this.imageVerticeCoords)||(this.enforceCroppingConstraint._.rectangle.height=this.clipper.width/this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.width=this.enforceCroppingConstraint._.rectangle.height*this.croppingConstraint)),this.enforceCroppingConstraint._.properties={height:this.enforceCroppingConstraint._.rectangle.height,width:this.enforceCroppingConstraint._.rectangle.width},this.clipper.animate(this.enforceCroppingConstraint._.properties,{onChange:function(){t._redrawCropperElements(),t.croppingCanvas.renderAll()},duration:this.settings.animationDuration,onComplete:function(){t._redrawCropperElements(),t.animationInProgress=!1,t.renderCropper(),t.storeCropperState()}}))},_handleCropperResize:function(t){void 0===this._handleCropperResize._&&(this._handleCropperResize._={}),this._handleCropperResize._.deltaX=t.pageX-this.previousMouseX,this._handleCropperResize._.deltaY=t.pageY-this.previousMouseY,"b"!==this.scalingCropper&&"t"!==this.scalingCropper||(this._handleCropperResize._.deltaX=0),"l"!==this.scalingCropper&&"r"!==this.scalingCropper||(this._handleCropperResize._.deltaY=0),0===this._handleCropperResize._.deltaX&&0===this._handleCropperResize._.deltaY||(this._handleCropperResize._.startingRectangle={left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height},this._handleCropperResize._.rectangle=this._calculateNewCropperSizeByDeltas(this._handleCropperResize._.startingRectangle,this._handleCropperResize._.deltaX,this._handleCropperResize._.deltaY,this.scalingCropper),this._handleCropperResize._.rectangle.height<30||this._handleCropperResize._.rectangle.width<30||this.arePointsInsideRectangle(this._getRectangleVertices(this._handleCropperResize._.rectangle),this.imageVerticeCoords)&&(this.clipper.set({top:this._handleCropperResize._.rectangle.top+this._handleCropperResize._.rectangle.height/2,left:this._handleCropperResize._.rectangle.left+this._handleCropperResize._.rectangle.width/2,width:this._handleCropperResize._.rectangle.width,height:this._handleCropperResize._.rectangle.height}),this._redrawCropperElements()))},_calculateNewCropperSizeByDeltas:function(t,e,i,s){if(void 0===this._calculateNewCropperSizeByDeltas._&&(this._calculateNewCropperSizeByDeltas._={}),this._calculateNewCropperSizeByDeltas._.topDelta=0,this._calculateNewCropperSizeByDeltas._.leftDelta=0,this._calculateNewCropperSizeByDeltas._.rectangle=t,this._calculateNewCropperSizeByDeltas._.deltaX=e,this._calculateNewCropperSizeByDeltas._.deltaY=i,this.croppingConstraint){switch(this._calculateNewCropperSizeByDeltas._.change=0,s){case"t":this._calculateNewCropperSizeByDeltas._.change=-this._calculateNewCropperSizeByDeltas._.deltaY;break;case"b":this._calculateNewCropperSizeByDeltas._.change=this._calculateNewCropperSizeByDeltas._.deltaY;break;case"r":this._calculateNewCropperSizeByDeltas._.change=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"l":this._calculateNewCropperSizeByDeltas._.change=-this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tr":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?-this._calculateNewCropperSizeByDeltas._.deltaY:this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tl":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?-this._calculateNewCropperSizeByDeltas._.deltaY:-this._calculateNewCropperSizeByDeltas._.deltaX;break;case"br":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?this._calculateNewCropperSizeByDeltas._.deltaY:this._calculateNewCropperSizeByDeltas._.deltaX;break;case"bl":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?this._calculateNewCropperSizeByDeltas._.deltaY:-this._calculateNewCropperSizeByDeltas._.deltaX}switch(this.croppingConstraint>1?(this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.change,this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.deltaX/this.croppingConstraint):(this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.change,this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.deltaY*this.croppingConstraint),this._calculateNewCropperSizeByDeltas._.rectangle.height+=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.width+=this._calculateNewCropperSizeByDeltas._.deltaX,s){case"t":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX/2;break;case"b":this._calculateNewCropperSizeByDeltas._.rectangle.left+=-this._calculateNewCropperSizeByDeltas._.deltaX/2;break;case"r":this._calculateNewCropperSizeByDeltas._.rectangle.top+=-this._calculateNewCropperSizeByDeltas._.deltaY/2;break;case"l":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY/2,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tr":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY;break;case"tl":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"bl":this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX}}else!this.shiftKeyHeld||"tl"!==s&&"tr"!==s&&"bl"!==s&&"br"!==s||(this._calculateNewCropperSizeByDeltas._.ratio,Math.abs(e)>Math.abs(i)?(this._calculateNewCropperSizeByDeltas._.ratio=t.width/t.height,this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.deltaX/this._calculateNewCropperSizeByDeltas._.ratio,this._calculateNewCropperSizeByDeltas._.deltaY*="tr"===s||"bl"===s?-1:1):(this._calculateNewCropperSizeByDeltas._.ratio=t.width/t.height,this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.deltaY*this._calculateNewCropperSizeByDeltas._.ratio,this._calculateNewCropperSizeByDeltas._.deltaX*="tr"===s||"bl"===s?-1:1)),s.match(/t/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.top+=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.height-=this._calculateNewCropperSizeByDeltas._.deltaY),s.match(/b/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.height+=this._calculateNewCropperSizeByDeltas._.deltaY),s.match(/r/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.width+=this._calculateNewCropperSizeByDeltas._.deltaX),s.match(/l/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.left+=this._calculateNewCropperSizeByDeltas._.deltaX,this._calculateNewCropperSizeByDeltas._.rectangle.width-=this._calculateNewCropperSizeByDeltas._.deltaX);return this._calculateNewCropperSizeByDeltas._.rectangle.top=this._calculateNewCropperSizeByDeltas._.rectangle.top,this._calculateNewCropperSizeByDeltas._.rectangle.left=this._calculateNewCropperSizeByDeltas._.rectangle.left,this._calculateNewCropperSizeByDeltas._.rectangle.width=this._calculateNewCropperSizeByDeltas._.rectangle.width,this._calculateNewCropperSizeByDeltas._.rectangle.height=this._calculateNewCropperSizeByDeltas._.rectangle.height,this._calculateNewCropperSizeByDeltas._.rectangle},_setMouseCursor:function(t){void 0===this._setMouseCursor._&&(this._setMouseCursor._={}),Garnish.isMobileBrowser(!0)||(this._setMouseCursor._.cursor="default",this._setMouseCursor._.handle=this.croppingCanvas&&this._cropperHandleHitTest(t),this.focalPoint&&this._isMouseOver(t,this.focalPoint)?this._setMouseCursor._.cursor="pointer":this._setMouseCursor._.handle?"t"===this._setMouseCursor._.handle||"b"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="ns-resize":"l"===this._setMouseCursor._.handle||"r"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="ew-resize":"tl"===this._setMouseCursor._.handle||"br"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="nwse-resize":"bl"!==this._setMouseCursor._.handle&&"tr"!==this._setMouseCursor._.handle||(this._setMouseCursor._.cursor="nesw-resize"):this.croppingCanvas&&this._isMouseOver(t,this.clipper)&&(this._setMouseCursor._.cursor="move"),$(".body").css("cursor",this._setMouseCursor._.cursor))},_cropperHandleHitTest:function(t){if(void 0===this._cropperHandleHitTest._&&(this._cropperHandleHitTest._={}),this._cropperHandleHitTest._.parentOffset=this.$croppingCanvas.offset(),this._cropperHandleHitTest._.mouseX=t.pageX-this._cropperHandleHitTest._.parentOffset.left,this._cropperHandleHitTest._.mouseY=t.pageY-this._cropperHandleHitTest._.parentOffset.top,this._cropperHandleHitTest._.lb=this.clipper.left-this.clipper.width/2,this._cropperHandleHitTest._.rb=this._cropperHandleHitTest._.lb+this.clipper.width,this._cropperHandleHitTest._.tb=this.clipper.top-this.clipper.height/2,this._cropperHandleHitTest._.bb=this._cropperHandleHitTest._.tb+this.clipper.height,this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb-3){if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.tb+10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb-3)return"tl";if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb+3&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.bb-10)return"bl"}if(this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.rb-13&&this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb+3){if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.tb+10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb-3)return"tr";if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb+2&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.bb-10)return"br"}return this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.lb+3&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb-3&&this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb-10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb+10?"l":this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb+1&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.rb-5&&this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb-10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb+10?"r":this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.tb+4&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb-2&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb-10?"t":this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb+2&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.bb-4&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb-10&&"b"},_isMouseOver:function(t,e){return void 0===this._isMouseOver._&&(this._isMouseOver._={}),this._isMouseOver._.parentOffset=this.$croppingCanvas.offset(),this._isMouseOver._.mouseX=t.pageX-this._isMouseOver._.parentOffset.left,this._isMouseOver._.mouseY=t.pageY-this._isMouseOver._.parentOffset.top,this._isMouseOver._.lb=e.left-e.width/2,this._isMouseOver._.rb=this._isMouseOver._.lb+e.width,this._isMouseOver._.tb=e.top-e.height/2,this._isMouseOver._.bb=this._isMouseOver._.tb+e.height,this._isMouseOver._.mouseX>=this._isMouseOver._.lb&&this._isMouseOver._.mouseX<=this._isMouseOver._.rb&&this._isMouseOver._.mouseY>=this._isMouseOver._.tb&&this._isMouseOver._.mouseY<=this._isMouseOver._.bb},_getRectangleVertices:function(t,e,i){return void 0===this._getRectangleVertices._&&(this._getRectangleVertices._={}),void 0===e&&(e=0),void 0===i&&(i=0),this._getRectangleVertices._.topLeft={x:t.left+e,y:t.top+i},this._getRectangleVertices._.topRight={x:this._getRectangleVertices._.topLeft.x+t.width,y:this._getRectangleVertices._.topLeft.y},this._getRectangleVertices._.bottomRight={x:this._getRectangleVertices._.topRight.x,y:this._getRectangleVertices._.topRight.y+t.height},this._getRectangleVertices._.bottomLeft={x:this._getRectangleVertices._.topLeft.x,y:this._getRectangleVertices._.bottomRight.y},[this._getRectangleVertices._.topLeft,this._getRectangleVertices._.topRight,this._getRectangleVertices._.bottomRight,this._getRectangleVertices._.bottomLeft]},_setFittedImageVerticeCoordinates:function(){this.imageVerticeCoords=this.getImageVerticeCoords("fit")},getImageVerticeCoords:function(t){var e,i=-1*((this.hasOrientationChanged()?90:0)+this.imageStraightenAngle)*(Math.PI/180),s=this.getScaledImageDimensions();e="number"==typeof t?t:"cover"===t?this.getZoomToCoverRatio(s):this.getZoomToFitRatio(s);var a=s.height*e,n=s.width*e,r=Math.cos(i)*a,o=Math.sin(i)*n,l=Math.cos(i)*n,h=Math.sin(i)*a,d=(this.editorHeight-(r+o))/2,c=(this.editorWidth-(h+l))/2;return{a:{x:c+l,y:d},b:{x:this.editorWidth-c,y:d+r},c:{x:c+h,y:this.editorHeight-d},d:{x:c,y:d+o}}},_debug:function(t){this.canvas.remove(this.debugger),this.debugger=t,this.canvas.add(this.debugger)},arePointsInsideRectangle:function(t,e){for(void 0===this.arePointsInsideRectangle._&&(this.arePointsInsideRectangle._={}),this.arePointsInsideRectangle._.ab=this._getVector(e.a,e.b),this.arePointsInsideRectangle._.bc=this._getVector(e.b,e.c),this.arePointsInsideRectangle._.scalarAbAb=this._getScalarProduct(this.arePointsInsideRectangle._.ab,this.arePointsInsideRectangle._.ab),this.arePointsInsideRectangle._.scalarBcBc=this._getScalarProduct(this.arePointsInsideRectangle._.bc,this.arePointsInsideRectangle._.bc),this.arePointsInsideRectangle._.i=0;this.arePointsInsideRectangle._.i<t.length;this.arePointsInsideRectangle._.i++)if(this.arePointsInsideRectangle._.point=t[this.arePointsInsideRectangle._.i],this.arePointsInsideRectangle._.ap=this._getVector(e.a,this.arePointsInsideRectangle._.point),this.arePointsInsideRectangle._.bp=this._getVector(e.b,this.arePointsInsideRectangle._.point),this.arePointsInsideRectangle._.scalarAbAp=this._getScalarProduct(this.arePointsInsideRectangle._.ab,this.arePointsInsideRectangle._.ap),this.arePointsInsideRectangle._.scalarBcBp=this._getScalarProduct(this.arePointsInsideRectangle._.bc,this.arePointsInsideRectangle._.bp),this.arePointsInsideRectangle._.projectsOnAB=0<=this.arePointsInsideRectangle._.scalarAbAp&&this.arePointsInsideRectangle._.scalarAbAp<=this.arePointsInsideRectangle._.scalarAbAb,this.arePointsInsideRectangle._.projectsOnBC=0<=this.arePointsInsideRectangle._.scalarBcBp&&this.arePointsInsideRectangle._.scalarBcBp<=this.arePointsInsideRectangle._.scalarBcBc,!this.arePointsInsideRectangle._.projectsOnAB||!this.arePointsInsideRectangle._.projectsOnBC)return!1;return!0},_getVector:function(t,e){return{x:e.x-t.x,y:e.y-t.y}},_getScalarProduct:function(t,e){return t.x*e.x+t.y*e.y},_getVectorMagnitude:function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},_getAngleBetweenVectors:function(t,e){return Math.round(180*Math.acos(Math.min(1,this._getScalarProduct(t,e)/(this._getVectorMagnitude(t)*this._getVectorMagnitude(e))))/Math.PI*100)/100},_getEdgeCrossed:function(t,e){for(var i=[[t.a,t.b],[t.b,t.c],[t.c,t.d],[t.d,t.a]],s={x:this.editorWidth/2,y:this.editorHeight/2},a=180,n=null,r=0;r<i.length;r++){var o=i[r],l=this._getVector(o[0],s),h=this._getVector(o[0],o[1]),d=this._getVector(o[0],e),c=Math.abs(this._getAngleBetweenVectors(l,d)-(this._getAngleBetweenVectors(l,h)+this._getAngleBetweenVectors(h,d)));c<a&&(a=c,n=o)}return n},_getImageBoundingBox:function(t){var e={},i=Math.abs(this.imageStraightenAngle)*(Math.PI/180),s=t.height/t.width;if(e.height=t.width*(Math.sin(i)+Math.cos(i)*s),e.width=t.width*(Math.cos(i)+Math.sin(i)*s),this.hasOrientationChanged()){var a=e.width;e.width=e.height,e.height=a}return e}},{defaults:{animationDuration:100,allowSavingAsNew:!0,onSave:$.noop,allowDegreeFractions:null}})},2495:function(){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}Craft.AssetIndex=Craft.BaseElementIndex.extend({$includeSubfoldersContainer:null,$includeSubfoldersCheckbox:null,showingIncludeSubfoldersCheckbox:!1,$uploadButton:null,$uploadInput:null,$progressBar:null,$folders:null,uploader:null,promptHandler:null,progressBar:null,_uploadTotalFiles:0,_uploadFileProgress:{},_currentUploaderSettings:{},_assetDrag:null,_folderDrag:null,_expandDropTargetFolderTimeout:null,_tempExpandedFolders:[],_fileConflictTemplate:{choices:[{value:"keepBoth",title:Craft.t("app","Keep both")},{value:"replace",title:Craft.t("app","Replace it")}]},_folderConflictTemplate:{choices:[{value:"replace",title:Craft.t("app","Replace the folder (all existing files will be deleted)")},{value:"merge",title:Craft.t("app","Merge the folder (any conflicting files will be replaced)")}]},init:function(t,e,i){this.base(t,e,i),"index"===this.settings.context?(this._folderDrag||this._initIndexPageMode(),this.addListener(Garnish.$win,"resize,scroll","_positionProgressBar")):(this.addListener(this.$main,"scroll","_positionProgressBar"),this.settings.modal&&this.settings.modal.on("updateSizeAndPosition",this._positionProgressBar.bind(this)))},initSources:function(){return"index"!==this.settings.context||this._folderDrag||this._initIndexPageMode(),this.base()},initSource:function(t){this.base(t),this._createFolderContextMenu(t),"index"===this.settings.context&&(this._folderDrag&&this.getSourceLevel(t)>1&&t.data("folder-id")&&this._folderDrag.addItems(t.parent()),this._assetDrag&&this._assetDrag.updateDropTargets())},deinitSource:function(t){this.base(t);var e=t.data("contextmenu");e&&e.destroy(),"index"===this.settings.context&&(this._folderDrag&&this.getSourceLevel(t)>1&&this._folderDrag.removeItems(t.parent()),this._assetDrag&&this._assetDrag.updateDropTargets())},_initIndexPageMode:function(){var t=this;this._folderDrag||(this.settings.selectable=!0,this.settings.multiSelect=!0,this._assetDrag=new Garnish.DragDrop({activeDropTargetClass:"sel",helperOpacity:.75,filter:function(){return t.view.getSelectedElements().has("div.element[data-movable]")},helper:function(e){return t._getFileDragHelper(e)},dropTargets:function(){var e;e=t._assetDrag.$draggee&&t._assetDrag.$draggee.has(".element[data-peer-file]").length?"data-can-move-peer-files-to":"data-can-move-to";for(var i=[],s=0;s<t.$sources.length;s++){var a=t.$sources.eq(s);Garnish.hasAttr(a,e)&&i.push(a)}return i},onDragStart:this._onDragStart.bind(this),onDropTargetChange:this._onDropTargetChange.bind(this),onDragStop:this._onFileDragStop.bind(this),helperBaseZindex:800}),this._folderDrag=new Garnish.DragDrop({activeDropTargetClass:"sel",helperOpacity:.75,helper:function(e){var i=$('<div class="sidebar drag-helper"/>'),s=$("<nav/>").appendTo(i),a=$("<ul/>").appendTo(s);return e.appendTo(a).removeClass("expanded"),e.children("a").addClass("sel"),e.css({"padding-top":t._folderDrag.$draggee.css("padding-top"),"padding-right":t._folderDrag.$draggee.css("padding-right"),"padding-bottom":t._folderDrag.$draggee.css("padding-bottom"),"padding-left":t._folderDrag.$draggee.css("padding-left")}),i},dropTargets:function(){var e=[],i=[];t._folderDrag.$draggee.find("a[data-key]").each((function(){i.push($(this).data("key"))}));for(var s=0;s<t.$sources.length;s++){var a=t.$sources.eq(s),n=a.data("key");t._getVolumeOrFolderUidFromSourceKey(n)&&(Craft.inArray(n,i)||e.push(a))}return e},onDragStart:this._onDragStart.bind(this),onDropTargetChange:this._onDropTargetChange.bind(this),onDragStop:this._onFolderDragStop.bind(this)}))},_onFileDragStop:function(){var t=this;if(this._assetDrag.$activeDropTarget&&this._assetDrag.$activeDropTarget[0]!==this.$source[0]){for(var e=this.$source,i=this._assetDrag.$activeDropTarget.data("folder-id"),s=[],a=0;a<this._assetDrag.$draggee.length;a++){var n=Craft.getElementInfo(this._assetDrag.$draggee[a]).id;s.push(n)}if(s.length){this.setIndexBusy(),this._positionProgressBar(),this.progressBar.resetProgressBar(),this.progressBar.setItemCount(s.length),this.progressBar.showProgressBar();var r=[];for(a=0;a<s.length;a++)r.push({action:"assets/move-asset",params:{assetId:s[a],folderId:i}});return void this._performBatchRequests(r,(function a(n){t.promptHandler.resetPrompts();for(var r=0;r<n.length;r++){var o=n[r];o.conflict&&t.promptHandler.addPrompt({assetId:o.assetId,suggestedFilename:o.suggestedFilename,prompt:{message:o.conflict,choices:t._fileConflictTemplate.choices}}),o.error&&alert(o.error)}t.setIndexAvailable(),t.progressBar.hideProgressBar();var l=!1,h=function(){this.sourceSelect.selectItem(e),this._totalVisible-=this._assetDrag.$draggee.length;for(var t=0;t<s.length;t++)$("[data-id="+s[t]+"]").remove();this.view.deselectAllElements(),this._collapseExtraExpandedFolders(i),l&&this.updateElements()};t.promptHandler.getPromptCount()?(t._assetDrag.fadeOutHelpers(),t.promptHandler.showBatchPrompts((function(e){for(var s=[],n=0;n<e.length;n++)"cancel"!==e[n].choice?("keepBoth"===e[n].choice&&s.push({action:"assets/move-asset",params:{folderId:i,assetId:e[n].assetId,filename:e[n].suggestedFilename}}),"replace"===e[n].choice&&s.push({action:"assets/move-asset",params:{folderId:i,assetId:e[n].assetId,force:!0}})):l=!0;0===s.length?h.apply(t):(t.setIndexBusy(),t.progressBar.resetProgressBar(),t.progressBar.setItemCount(t.promptHandler.getPromptCount()),t.progressBar.showProgressBar(),t._performBatchRequests(s,a))}))):(h.apply(t),t._assetDrag.fadeOutHelpers())}))}}else this.$source.addClass("sel"),this._collapseExtraExpandedFolders();this._assetDrag.returnHelpersToDraggees()},_onFolderDragStop:function(){var t=this;if(this._folderDrag.$activeDropTarget&&0===this._folderDrag.$activeDropTarget.siblings("ul").children("li").filter(this._folderDrag.$draggee).length){var e=this._folderDrag.$activeDropTarget.data("folder-id");this._collapseExtraExpandedFolders(e);for(var i=[],s=0;s<this._folderDrag.$draggee.length;s++){var a=this._folderDrag.$draggee.eq(s).children("a").data("folder-id");if(a!=e){i.push(a);break}}if(i.length){i.sort(),i.reverse(),this.setIndexBusy(),this._positionProgressBar(),this.progressBar.resetProgressBar(),this.progressBar.setItemCount(i.length),this.progressBar.showProgressBar();var n=[];for(s=0;s<i.length;s++)n.push({action:"assets/move-folder",params:{folderId:i[s],parentId:e}});this.requestId++;var r=[],o="";return void this._performBatchRequests(n,(function e(s){t.promptHandler.resetPrompts();for(var a=0;a<s.length;a++){var n=s[a];n.success&&(n.transferList&&(r=n.transferList),n.newFolderId&&(o=t._folderDrag.$activeDropTarget.data("key")+"/folder:"+n.newFolderUid)),n.conflict&&(n.prompt={message:n.conflict,choices:t._folderConflictTemplate.choices},t.promptHandler.addPrompt(n)),n.error&&alert(n.error)}t.promptHandler.getPromptCount()?(t.promptHandler.showBatchPrompts((function(s){t.promptHandler.resetPrompts();for(var a=[],l={},h=0;h<s.length;h++)"cancel"!==s[h].choice&&("replace"===s[h].choice&&(l.force=!0),"merge"===s[h].choice&&(l.merge=!0),l.folderId=n.folderId,l.parentId=n.parentId,a.push({action:"assets/move-folder",params:l}));0===a.length?t._performActualFolderMove(r,i,o):(t.setIndexBusy(),t.progressBar.resetProgressBar(),t.progressBar.setItemCount(t.promptHandler.getPromptCount()),t.progressBar.showProgressBar(),t._performBatchRequests(a,e))})),t.setIndexAvailable(),t.progressBar.hideProgressBar()):t._performActualFolderMove(r,i,o)}))}}else this.$source.addClass("sel"),this._collapseExtraExpandedFolders();this._folderDrag.returnHelpersToDraggees()},_performActualFolderMove:function(t,e,i){var s=this;this.setIndexBusy(),this.progressBar.resetProgressBar(),this.progressBar.setItemCount(1),this.progressBar.showProgressBar();var a=function(t){for(var e=0,a=t.length,n=0;n<t.length;n++){var r={folderId:t[n]};Craft.sendActionRequest("POST","assets/delete-folder",{data:r}).then((function(t){++e===a&&(s.setIndexAvailable(),s.progressBar.hideProgressBar(),s._folderDrag.returnHelpersToDraggees(),s.setInstanceState("selectedSource",i),s.refreshSources())}))}};if(t.length>0){for(var n=[],r=0;r<t.length;r++)n.push({action:"assets/move-asset",params:t[r]});this._performBatchRequests(n,(function(){a(e)}))}else a(e)},_selectSourceByFolderId:function(t){for(var e=this._getSourceByKey(t),i=e.parent().parents("li"),s=0;s<i.length;s++){var a=$(i[s]);a.hasClass("expanded")||a.children(".toggle").trigger("click")}this.selectSource(e),this.updateElements()},afterInit:function(){var t=this;this.$uploadButton||(this.$uploadButton=$("<button/>",{type:"button",class:"btn submit","data-icon":"upload",style:"position: relative; overflow: hidden;",text:Craft.t("app","Upload files")}),this.addButton(this.$uploadButton),this.$uploadInput=$('<input type="file" multiple="multiple" name="assets-upload" />').hide().insertBefore(this.$uploadButton)),this.promptHandler=new Craft.PromptHandler,this.progressBar=new Craft.ProgressBar(this.$main,!0);var e={url:Craft.getActionUrl("assets/upload"),fileInput:this.$uploadInput,dropZone:this.$container};e.events={fileuploadstart:this._onUploadStart.bind(this),fileuploadprogressall:this._onUploadProgress.bind(this),fileuploaddone:this._onUploadSuccess.bind(this),fileuploadalways:this._onUploadAlways.bind(this),fileuploadfail:this._onUploadFailure.bind(this)},this.settings.criteria&&void 0!==this.settings.criteria.kind&&(e.allowedKinds=this.settings.criteria.kind),this._currentUploaderSettings=e,this.uploader=new Craft.Uploader(this.$uploadButton,e),this.$uploadButton.on("click",(function(){t.$uploadButton.hasClass("disabled")||t.isIndexBusy||t.$uploadButton.parent().find("input[name=assets-upload]").trigger("click")})),this.base()},getDefaultSourceKey:function(){var e=this;if("index"===this.settings.context&&void 0!==window.defaultSource){var i=function(){var t=window.defaultSource.split("/"),i=e.$sources.toArray().find((function(e){return $(e).data("volume-handle")===t[0]}));if(i){for(var s=$(i),a=function(i){var a=e._getChildSources(s).toArray().find((function(e){return $("> .label",e).text()===t[i]}));if(!a)return"break";e._expandSource(s),s=$(a)},n=1;n<t.length&&"break"!==a(n);n++);return{v:s.data("key")}}}();if("object"===t(i))return i.v}return this.base()},onSelectSource:function(){var t=this._getSourceByKey(this.sourceKey);t.data("folder-id")&&Garnish.hasAttr(this.$source,"data-can-upload")?(this.uploader.setParams({folderId:this.$source.attr("data-folder-id")}),this.$uploadButton.removeClass("disabled")):this.$uploadButton.addClass("disabled"),t.length&&"index"===this.settings.context&&this._updateUrl(t),this.base()},_updateUrl:function(t){for(var e,i=[],s=t;(e=this.getParentSource(s))&&e.length;)i.unshift(s),s=e;var a="assets";s.data("volume-handle")&&(a+="/"+s.data("volume-handle"),i.forEach((function(t){a+="/"+t.children(".label").text()}))),Craft.setPath(a)},_getVolumeOrFolderUidFromSourceKey:function(t){var e=t.match(/\b(?:folder|volume):([0-9a-f\-]+)$/);return e?e[1]:null},startSearching:function(){if(!this.settings.hideSidebar&&this.$source.siblings("ul").length){if(null===this.$includeSubfoldersContainer){var t="includeSubfolders-"+Math.floor(1e9*Math.random());this.$includeSubfoldersContainer=$('<div style="margin-bottom: -25px; opacity: 0;"/>').insertAfter(this.$search);var e=$('<div style="padding-top: 5px;"/>').appendTo(this.$includeSubfoldersContainer);this.$includeSubfoldersCheckbox=$('<input type="checkbox" id="'+t+'" class="checkbox"/>').appendTo(e),$('<label class="light smalltext" for="'+t+'"/>').text(" "+Craft.t("app","Search in subfolders")).appendTo(e),this.addListener(this.$includeSubfoldersCheckbox,"change",(function(){this.setSelecetedSourceState("includeSubfolders",this.$includeSubfoldersCheckbox.prop("checked")),this.updateElements()}))}else this.$includeSubfoldersContainer.velocity("stop").removeClass("hidden");var i=this.getSelectedSourceState("includeSubfolders",!1);this.$includeSubfoldersCheckbox.prop("checked",i),this.$includeSubfoldersContainer.velocity({marginBottom:0,opacity:1},"fast"),this.showingIncludeSubfoldersCheckbox=!0}this.base()},stopSearching:function(){var t=this;this.showingIncludeSubfoldersCheckbox&&(this.$includeSubfoldersContainer.velocity("stop"),this.$includeSubfoldersContainer.velocity({marginBottom:-25,opacity:0},{duration:"fast",complete:function(){t.$includeSubfoldersContainer.addClass("hidden")}}),this.showingIncludeSubfoldersCheckbox=!1),this.base()},getViewParams:function(){var t=this.base();return this.showingIncludeSubfoldersCheckbox&&this.$includeSubfoldersCheckbox.prop("checked")&&(t.criteria.includeSubfolders=!0),t},_onUploadStart:function(){this.setIndexBusy(),this._positionProgressBar(),this.progressBar.resetProgressBar(),this.progressBar.showProgressBar(),this.promptHandler.resetPrompts()},_onUploadProgress:function(t,e){var i=parseInt(e.loaded/e.total*100,10);this.progressBar.setProgressPercentage(i)},_onUploadSuccess:function(t,e){var i=e.result;this.selectElementAfterUpdate(i.assetId),i.conflict&&(i.prompt={message:Craft.t("app",i.conflict,{file:i.filename}),choices:this._fileConflictTemplate.choices},this.promptHandler.addPrompt(i)),Craft.cp.runQueue()},_onUploadAlways:function(){this.uploader.isLastUpload()&&(this.progressBar.hideProgressBar(),this.setIndexAvailable(),this.promptHandler.getPromptCount()?this.promptHandler.showBatchPrompts(this._uploadFollowup.bind(this)):this._updateAfterUpload())},_onUploadFailure:function(t,e){var i,s=e.response(),a=(null==s||null===(i=s.jqXHR)||void 0===i?void 0:i.responseJSON)||{},n=a.message,r=a.filename;n||(n=r?Craft.t("app","Upload failed for “{filename}”.",{filename:r}):Craft.t("app","Upload failed.")),alert(n)},_updateAfterUpload:function(){"index"!==this.settings.context&&(this.clearSearch(),this.setSelectedSortAttribute("dateCreated","desc")),this.updateElements()},_uploadFollowup:function(t){var e=this;this.setIndexBusy(),this.progressBar.resetProgressBar(),this.promptHandler.resetPrompts(),this.progressBar.setItemCount(t.length),this.progressBar.showProgressBar(),function t(i,s,a){var n={},r=null,o=function(){s++,e.progressBar.incrementProcessedItemCount(1),e.progressBar.updateProgressBar(),s===i.length?a():t(i,s,a)},l=function(t){t.assetId&&e.selectElementAfterUpdate(t.assetId),o()};"replace"===i[s].choice?(r="assets/replace-file",n.sourceAssetId=i[s].assetId,i[s].conflictingAssetId?n.assetId=i[s].conflictingAssetId:n.targetFilename=i[s].filename):"cancel"===i[s].choice&&(r="assets/delete-asset",n.assetId=i[s].assetId),r?Craft.sendActionRequest("POST",r,{data:n}).then((function(t){return l(t.data)})).catch((function(t){return function(t){alert(t.message),o()}(t.response.data)})):l({assetId:i[s].assetId})}(t,0,(function(){e.progressBar.hideProgressBar(),e.setIndexAvailable(),e._updateAfterUpload()}))},onUpdateElements:function(){var t=this;this._onUpdateElements(!1,this.view.getAllElements()),this.view.on("appendElements",(function(e){t._onUpdateElements(!0,e.newElements)})),this.base()},_onUpdateElements:function(t,e){"index"===this.settings.context&&(t||this._assetDrag.removeAllItems(),this._assetDrag.addItems(e.has("div.element[data-movable]"))),this.base(t,e),this.removeListener(this.$elements,"keydown"),this.addListener(this.$elements,"keydown",this._onKeyDown.bind(this)),this.view.elementSelect.on("focusItem",this._onElementFocus.bind(this))},_onKeyDown:function(t){if(t.keyCode===Garnish.SPACE_KEY&&t.shiftKey){if(Craft.PreviewFileModal.openInstance)Craft.PreviewFileModal.openInstance.selfDestruct();else{var e=this.view.elementSelect.$focusedItem.find(".element");e.length&&this._loadPreview(e)}return t.stopPropagation(),!1}},_onElementFocus:function(t){var e=$(t.item).find(".element");Craft.PreviewFileModal.openInstance&&e.length&&this._loadPreview(e)},_loadPreview:function(t){var e={};t.data("image-width")&&(e.startingWidth=t.data("image-width"),e.startingHeight=t.data("image-height")),new Craft.PreviewFileModal(t.data("id"),this.view.elementSelect,e)},_onDragStart:function(){this._tempExpandedFolders=[]},_getFileDragHelper:function(t){var e,i;switch(this.getSelectedSourceState("mode")){case"table":e=$('<div class="elements datatablesorthelper"/>').appendTo(Garnish.$bod),i=$('<div class="tableview"/>').appendTo(e);var s=$('<table class="data"/>').appendTo(i),a=$("<tbody/>").appendTo(s);t.appendTo(a),this._$firstRowCells=this.view.$table.children("tbody").children("tr:first").children();for(var n=t.children(),r=0;r<n.length;r++){var o=$(n[r]);if(o.hasClass("checkbox-cell"))o.remove(),e.css("margin-"+Craft.left,19);else{var l=$(this._$firstRowCells[r]),h=l.width();l.width(h),o.width(h)}}return e;case"thumbs":return e=$('<div class="elements thumbviewhelper"/>').appendTo(Garnish.$bod),i=$('<ul class="thumbsview"/>').appendTo(e),t.appendTo(i),e}return $()},_onDropTargetChange:function(t){if(clearTimeout(this._expandDropTargetFolderTimeout),t){var e=t.data("folder-id");e?(this.dropTargetFolder=this._getSourceByKey(e),this._hasSubfolders(this.dropTargetFolder)&&!this._isExpanded(this.dropTargetFolder)&&(this._expandDropTargetFolderTimeout=setTimeout(this._expandFolder.bind(this),500))):this.dropTargetFolder=null}t&&t[0]!==this.$source[0]?this.$source.removeClass("sel"):this.$source.addClass("sel")},_collapseExtraExpandedFolders:function(t){var e;clearTimeout(this._expandDropTargetFolderTimeout),t&&(e=this._getSourceByKey(t).parents("li").children("a"));for(var i=this._tempExpandedFolders.length-1;i>=0;i--){var s=this._tempExpandedFolders[i];void 0!==e&&0!==e.filter('[data-key="'+s.data("key")+'"]').length||(this._collapseFolder(s),this._tempExpandedFolders.splice(i,1))}},_getSourceByKey:function(t){return this.$sources.filter('[data-key$="'+t+'"]')},_hasSubfolders:function(t){return t.siblings("ul").find("li").length},_isExpanded:function(t){return t.parent("li").hasClass("expanded")},_expandFolder:function(){this._collapseExtraExpandedFolders(this.dropTargetFolder.data("folder-id")),this.dropTargetFolder.siblings(".toggle").trigger("click"),this._tempExpandedFolders.push(this.dropTargetFolder)},_collapseFolder:function(t){t.parent().hasClass("expanded")&&t.siblings(".toggle").trigger("click")},getSourceActions:function(){var t=this,e=this.base();return this._getVolumeOrFolderUidFromSourceKey(this.sourceKey)&&(e.push({label:Craft.t("app","New subfolder"),onSelect:function(){t._createSubfolder(t.$source)}}),this.getSourceLevel(this.$source)>1&&(e.push({label:Craft.t("app","Rename folder"),onSelect:function(){t._renameFolder(t.$source)}}),e.push({label:Craft.t("app","Delete folder"),destructive:!0,onSelect:function(){t._deleteFolder(t.$source)}}))),e},_createFolderContextMenu:function(t){var e=this;if(this._getVolumeOrFolderUidFromSourceKey(t.data("key"))){var i=[{label:Craft.t("app","New subfolder"),onClick:function(){e._createSubfolder(t)}}];"index"===this.settings.context&&this.getSourceLevel(t)>1&&(i.push({label:Craft.t("app","Rename folder"),onClick:function(){e._renameFolder(t)}}),i.push({label:Craft.t("app","Delete folder"),onClick:function(){e._deleteFolder(t)}})),new Garnish.ContextMenu(t,i,{menuClass:"menu"})}},_createSubfolder:function(t){var e=this,i=prompt(Craft.t("app","Enter the name of the folder"));if(i){var s={parentId:t.data("folder-id"),folderName:i};this.setIndexBusy(),Craft.sendActionRequest("POST","assets/create-folder",{data:s}).then((function(i){var s=i.data;e.setIndexAvailable(),e._prepareParentForChildren(t);var a=$("<li>"+'<a data-key="'.concat(t.data("key"),"/folder:").concat(s.folderUid,'" data-default-sort="').concat(t.data("default-sort"),'"')+(Garnish.hasAttr(t,"data-has-thumbs")?" data-has-thumbs":"")+' data-folder-id="'.concat(s.folderId,'"')+(Garnish.hasAttr(t,"data-can-upload")?" data-can-upload":"")+(Garnish.hasAttr(t,"data-can-move-to")?" data-can-move-to":"")+(Garnish.hasAttr(t,"data-can-move-peer-files-to")?" data-can-move-peer-files-to":"")+">"+'<span class="label">'.concat(s.folderName,"</span>")+"</a></li>"),n=a.children("a:first");e._appendSubfolder(t,a),e.initSource(n),Craft.cp.displayNotice(Craft.t("app","Folder created."))})).catch((function(t){var i=t.response;e.setIndexAvailable(),alert(i.data.message)}))}},_deleteFolder:function(t){var e=this;if(confirm(Craft.t("app","Really delete folder “{folder}”?",{folder:$.trim(t.text())}))){var i={folderId:t.data("folder-id")};this.setIndexBusy(),Craft.sendActionRequest("POST","assets/delete-folder",{data:i}).then((function(i){e.setIndexAvailable();var s=e.getParentSource(t);e.deinitSource(t),t.parent().remove(),e._cleanUpTree(s),Craft.cp.displayNotice(Craft.t("app","Folder deleted."))})).catch((function(t){var i=t.response;e.setIndexAvailable(),alert(i.data.message)}))}},_renameFolder:function(t){var e=this,i=t.children(".label"),s=Craft.trim(i.text()),a=prompt(Craft.t("app","Rename folder"),s);a&&a!==s&&(this.setIndexBusy(),Craft.sendActionRequest("POST","assets/rename-folder",{data:{folderId:t.data("folder-id"),newName:a}}).then((function(s){i.text(s.data.newName),t.data("key")===e.$source.data("key")&&(e.updateElements(),Craft.cp.displayNotice(Craft.t("app","Folder renamed.")),"index"===e.settings.context&&e._updateUrl(t))})).catch((function(t){var i=t.response;e.setIndexAvailable(),alert(i.data.message)})))},_prepareParentForChildren:function(t){this._hasSubfolders(t)||(t.parent().addClass("expanded").append('<div class="toggle"></div><ul class="nested"></ul>'),this.initSourceToggle(t))},_appendSubfolder:function(t,e){for(var i=t.siblings("ul").children("li"),s=$.trim(e.children("a:first").text()),a=!1,n=0;n<i.length;n++){var r=$(i[n]);if($.trim(r.children("a:first").text())>s){r.before(e),a=!0;break}}a||t.siblings("ul").append(e)},_cleanUpTree:function(t){null!==t&&0===t.siblings("ul").children("li").length&&(this.deinitSourceToggle(t),t.siblings("ul").remove(),t.siblings(".toggle").remove(),t.parent().removeClass("expanded"))},_positionProgressBar:function(){this.progressBar||(this.progressBar=new Craft.ProgressBar(this.$main,!0));var t=$(),e=0,i=0;"index"===this.settings.context?(t=this.progressBar.$progressBar.closest("#content"),e=Garnish.$win.scrollTop()):(t=this.progressBar.$progressBar.closest(".main"),e=this.$main.scrollTop());var s=e-t.offset().top,a=Garnish.$win.height();i=t.height()>a?a/2-6+s:t.height()/2-6,"index"!==this.settings.context&&(i=e+(t.height()/2-6)),this.progressBar.$progressBar.css({top:i})},_performBatchRequests:function(t,e){for(var i=this,s=[],a=t.length;t.length;){var n=t.shift();Craft.sendActionRequest("POST",n.action,{data:n.params}).then((function(t){s.push(t.data)})).finally((function(){i.progressBar.incrementProcessedItemCount(1),i.progressBar.updateProgressBar(),0==--a&&(Craft.cp.runQueue(),e(s))}))}}}),Craft.registerElementIndexClass("craft\\elements\\Asset",Craft.AssetIndex)},5077:function(){Craft.AssetSelectInput=Craft.BaseElementSelectInput.extend({requestId:0,hud:null,$uploadBtn:null,uploader:null,progressBar:null,openPreviewTimeout:null,init:function(){this.base.apply(this,arguments),this.settings.canUpload&&this._attachUploader(),this.updateAddElementsBtn(),this.addListener(this.$elementsContainer,"keydown",this._onKeyDown.bind(this)),this.elementSelect.on("focusItem",this._onElementFocus.bind(this))},_onKeyDown:function(t){if(t.keyCode===Garnish.SPACE_KEY&&t.shiftKey)return this.openPreview(),t.stopPropagation(),!1},onAddElements:function(){var t=this;this.$elements.find(".elementthumb").addClass("open-preview").on("click",(function(e){t.clearOpenPreviewTimeout(),t.openPreviewTimeout=setTimeout((function(){t.openPreview(),t.openPreviewTimeout=null}),500)})).on("dblclick",(function(e){t.clearOpenPreviewTimeout()})),this.base()},clearOpenPreviewTimeout:function(){this.openPreviewTimeout&&(clearTimeout(this.openPreviewTimeout),this.openPreviewTimeout=null)},openPreview:function(){if(Craft.PreviewFileModal.openInstance)Craft.PreviewFileModal.openInstance.selfDestruct();else{var t=this.elementSelect.$focusedItem;t.length&&this._loadPreview(t)}},_onElementFocus:function(t){var e=$(t.item);Craft.PreviewFileModal.openInstance&&e.length&&this._loadPreview(e)},_loadPreview:function(t){var e={minGutter:50};t.data("image-width")&&(e.startingWidth=t.data("image-width"),e.startingHeight=t.data("image-height")),new Craft.PreviewFileModal(t.data("id"),this.elementSelect,e)},_attachUploader:function(){var t=this;this.progressBar=new Craft.ProgressBar($('<div class="progress-shade"></div>').appendTo(this.$container));var e={url:Craft.getActionUrl("assets/upload"),dropZone:this.$container,formData:{fieldId:this.settings.fieldId}};this.settings.sourceElementId&&(e.formData.elementId=this.settings.sourceElementId),this.settings.criteria.siteId&&(e.formData.siteId=this.settings.criteria.siteId),this.$addElementBtn&&(this.$uploadBtn=$("<button/>",{type:"button",class:"btn dashed","data-icon":"upload","aria-label":1==this.settings.limit?Craft.t("app","Upload a file"):Craft.t("app","Upload files"),"aria-describedby":this.settings.describedBy,text:1==this.settings.limit?Craft.t("app","Upload a file"):Craft.t("app","Upload files")}).insertAfter(this.$addElementBtn),e.fileInput=$("<input/>",{type:"file",class:"hidden",multiple:1!=this.settings.limit}).insertAfter(this.$uploadBtn),Garnish.$win.trigger("resize")),void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(e.formData[Craft.csrfTokenName]=Craft.csrfTokenValue),void 0!==this.settings.criteria.kind&&(e.allowedKinds=this.settings.criteria.kind),e.canAddMoreFiles=this.canAddMoreFiles.bind(this),e.events={},e.events.fileuploadstart=this._onUploadStart.bind(this),e.events.fileuploadprogressall=this._onUploadProgress.bind(this),e.events.fileuploaddone=this._onUploadComplete.bind(this),e.events.fileuploadfail=this._onUploadFailure.bind(this),this.uploader=new Craft.Uploader(this.$container,e),this.$uploadBtn&&this.$uploadBtn.on("click",(function(e){t.$uploadBtn.next("input[type=file]").trigger("click")}))},enableAddElementsBtn:function(){this.$uploadBtn&&this.$uploadBtn.removeClass("hidden"),this.base()},disableAddElementsBtn:function(){this.$uploadBtn&&this.$uploadBtn.addClass("hidden"),this.base()},selectUploadedFile:function(t){if(this.canAddMoreElements()){var e=t.$element;e.addClass("removable"),e.prepend('<input type="hidden" name="'+this.settings.name+'[]" value="'+t.id+'"><a class="delete icon" title="'+Craft.t("app","Remove")+'"></a>'),e.appendTo(this.$elementsContainer);var i=-(e.outerWidth()+10);this.$addElementBtn.css("margin-"+Craft.left,i+"px");var s={};s["margin-"+Craft.left]=0,this.$addElementBtn.velocity(s,"fast"),this.addElements(e),delete this.modal}},_onUploadStart:function(){this.progressBar.$progressBar.css({top:Math.round(this.$container.outerHeight()/2)-6}),this.$container.addClass("uploading"),this.progressBar.resetProgressBar(),this.progressBar.showProgressBar()},_onUploadProgress:function(t,e){var i=parseInt(e.loaded/e.total*100,10);this.progressBar.setProgressPercentage(i)},_onUploadComplete:function(t,e){var i=this;if(e.result.error)alert(e.result.error),this.progressBar.hideProgressBar(),this.$container.removeClass("uploading");else{var s={elementId:e.result.assetId,siteId:this.settings.criteria.siteId,thumbSize:this.settings.viewMode};Craft.sendActionRequest("POST","elements/get-element-html",{data:s}).then((function(t){var e=$(t.data.html);Craft.appendHeadHtml(t.data.headHtml),i.selectUploadedFile(Craft.getElementInfo(e)),i.uploader.isLastUpload()&&(i.progressBar.hideProgressBar(),i.$container.removeClass("uploading"),i.$container.trigger("change"))})).catch((function(t){var e=t.response;alert(e.data.message)})),Craft.cp.runQueue()}},_onUploadFailure:function(t,e){var i,s=e.response(),a=(null==s||null===(i=s.jqXHR)||void 0===i?void 0:i.responseJSON)||{},n=a.message,r=a.filename;n||(n=r?Craft.t("app","Upload failed for “{filename}”.",{filename:r}):Craft.t("app","Upload failed.")),alert(n),this.progressBar.hideProgressBar(),this.$container.removeClass("uploading")},canAddMoreFiles:function(t){return!this.settings.limit||this.$elements.length+t<this.settings.limit}})},4606:function(){Craft.AssetSelectorModal=Craft.BaseElementSelectorModal.extend({$selectTransformBtn:null,_selectedTransform:null,init:function(t,e){e=$.extend({},Craft.AssetSelectorModal.defaults,e),this.base(t,e),e.transforms.length&&this.createSelectTransformButton(e.transforms)},createSelectTransformButton:function(t){if(t&&t.length){var e=$('<div class="btngroup"/>').appendTo(this.$primaryButtons);this.$selectBtn.appendTo(e),this.$selectTransformBtn=$("<button/>",{type:"button",class:"btn menubtn disabled",text:Craft.t("app","Select transform")}).appendTo(e);for(var i=$('<div class="menu" data-align="right"></div>').insertAfter(this.$selectTransformBtn),s=$("<ul></ul>").appendTo(i),a=0;a<t.length;a++)$('<li><a data-transform="'+t[a].handle+'">'+t[a].name+"</a></li>").appendTo(s);var n=new Garnish.MenuBtn(this.$selectTransformBtn,{onOptionSelect:this.onSelectTransform.bind(this)});n.disable(),this.$selectTransformBtn.data("menuButton",n)}},onSelectionChange:function(t){var e=this.elementIndex.getSelectedElements(),i=!1;if(e.length&&this.settings.transforms.length){i=!0;for(var s=0;s<e.length&&$(".element.hasthumb:first",e[s]).length;s++);}var a=null;this.$selectTransformBtn&&(a=this.$selectTransformBtn.data("menuButton")),i?(a&&a.enable(),this.$selectTransformBtn.removeClass("disabled")):this.$selectTransformBtn&&(a&&a.disable(),this.$selectTransformBtn.addClass("disabled")),this.base()},onSelectTransform:function(t){var e=$(t).data("transform");this.selectImagesWithTransform(e)},selectImagesWithTransform:function(t){var e=this;void 0===Craft.AssetSelectorModal.transformUrls[t]&&(Craft.AssetSelectorModal.transformUrls[t]={});for(var i=this.elementIndex.getSelectedElements(),s=[],a=0;a<i.length;a++){var n=$(i[a]),r=Craft.getElementInfo(n).id;void 0===Craft.AssetSelectorModal.transformUrls[t][r]&&s.push(r)}s.length?(this.showFooterSpinner(),this.fetchMissingTransformUrls(s,t,(function(){e.hideFooterSpinner(),e.selectImagesWithTransform(t)}))):(this._selectedTransform=t,this.selectElements(),this._selectedTransform=null)},fetchMissingTransformUrls:function(t,e,i){var s=this,a=t.pop(),n={assetId:a,handle:e};Craft.sendActionRequest("POST","assets/generate-transform",{data:n}).then((function(t){Craft.AssetSelectorModal.transformUrls[e][a]=!1,t.data.url&&(Craft.AssetSelectorModal.transformUrls[e][a]=t.data.url)})).catch((function(n){n.response,Craft.AssetSelectorModal.transformUrls[e][a]=!1,t.length?s.fetchMissingTransformUrls(t,e,i):i()}))},getElementInfo:function(t){var e=this.base(t);if(this._selectedTransform)for(var i=0;i<e.length;i++){var s=e[i].id;void 0!==Craft.AssetSelectorModal.transformUrls[this._selectedTransform][s]&&!1!==Craft.AssetSelectorModal.transformUrls[this._selectedTransform][s]&&(e[i].url=Craft.AssetSelectorModal.transformUrls[this._selectedTransform][s])}return e},onSelect:function(t){this.settings.onSelect(t,this._selectedTransform)}},{defaults:{canSelectImageTransforms:!1,transforms:[]},transformUrls:{}}),Craft.registerElementSelectorModalClass("craft\\elements\\Asset",Craft.AssetSelectorModal)},9222:function(){Craft.AuthManager=Garnish.Base.extend({remainingSessionTime:null,checkRemainingSessionTimer:null,showLoginModalTimer:null,decrementLogoutWarningInterval:null,showingLogoutWarningModal:!1,showingLoginModal:!1,logoutWarningModal:null,loginModal:null,$logoutWarningPara:null,$passwordInput:null,$loginBtn:null,$loginErrorPara:null,submitLoginIfLoggedOut:!1,init:function(){Craft.username&&this.updateRemainingSessionTime(Craft.remainingSessionTime)},setCheckRemainingSessionTimer:function(t){this.checkRemainingSessionTimer&&clearTimeout(this.checkRemainingSessionTimer),this.checkRemainingSessionTimer=setTimeout(this.checkRemainingSessionTime.bind(this),1e3*t)},checkRemainingSessionTime:function(t){var e=this;$.ajax({url:Craft.getActionUrl("users/session-info",t?null:"dontExtendSession=1"),type:"GET",dataType:"json",complete:function(t,i){"success"===i?(void 0!==t.responseJSON.csrfTokenValue&&void 0!==Craft.csrfTokenValue&&(Craft.csrfTokenValue=t.responseJSON.csrfTokenValue),e.updateRemainingSessionTime(t.responseJSON.timeout),e.submitLoginIfLoggedOut=!1):e.updateRemainingSessionTime(-1)}})},updateRemainingSessionTime:function(t){this.remainingSessionTime=parseInt(t),-1!==this.remainingSessionTime&&this.remainingSessionTime<Craft.AuthManager.minSafeSessionTime?(this.remainingSessionTime?(this.showingLogoutWarningModal||this.showLogoutWarningModal(),this.remainingSessionTime<Craft.AuthManager.checkInterval&&(this.showLoginModalTimer&&clearTimeout(this.showLoginModalTimer),this.showLoginModalTimer=setTimeout(this.showLoginModal.bind(this),1e3*this.remainingSessionTime))):this.showingLoginModal?this.submitLoginIfLoggedOut&&this.submitLogin():this.showLoginModal(),this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval)):(this.hideLogoutWarningModal(),this.hideLoginModal(),-1!==this.remainingSessionTime&&this.remainingSessionTime<Craft.AuthManager.minSafeSessionTime+Craft.AuthManager.checkInterval?this.setCheckRemainingSessionTimer(this.remainingSessionTime-Craft.AuthManager.minSafeSessionTime+1):this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval))},showLogoutWarningModal:function(){var t;if(this.showingLoginModal?(this.hideLoginModal(!0),t=!0):t=!1,this.showingLogoutWarningModal=!0,!this.logoutWarningModal){var e=$('<form id="logoutwarningmodal" class="modal alert fitted"/>'),i=$('<div class="body"/>').appendTo(e),s=$('<div class="buttons right"/>').appendTo(i),a=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Sign out now")}).appendTo(s),n=$("<button/>",{type:"submit",class:"btn submit",text:Craft.t("app","Keep me signed in")}).appendTo(s);this.$logoutWarningPara=$("<p/>").prependTo(i),this.logoutWarningModal=new Garnish.Modal(e,{autoShow:!1,closeOtherModals:!1,hideOnEsc:!1,hideOnShadeClick:!1,shadeClass:"modal-shade dark logoutwarningmodalshade",onFadeIn:function(){Garnish.isMobileBrowser(!0)||setTimeout((function(){n.trigger("focus")}),100)}}),this.addListener(a,"activate","logout"),this.addListener(e,"submit","renewSession")}t?this.logoutWarningModal.quickShow():this.logoutWarningModal.show(),this.updateLogoutWarningMessage(),this.decrementLogoutWarningInterval=setInterval(this.decrementLogoutWarning.bind(this),1e3)},updateLogoutWarningMessage:function(){this.$logoutWarningPara.text(Craft.t("app","Your session will expire in {time}.",{time:Craft.secondsToHumanTimeDuration(this.remainingSessionTime)})),this.logoutWarningModal.updateSizeAndPosition()},decrementLogoutWarning:function(){this.remainingSessionTime>0&&(this.remainingSessionTime--,this.updateLogoutWarningMessage()),0===this.remainingSessionTime&&clearInterval(this.decrementLogoutWarningInterval)},hideLogoutWarningModal:function(t){this.showingLogoutWarningModal=!1,this.logoutWarningModal&&(t?this.logoutWarningModal.quickHide():this.logoutWarningModal.hide(),this.decrementLogoutWarningInterval&&clearInterval(this.decrementLogoutWarningInterval))},showLoginModal:function(){var t,e=this;if(this.showingLogoutWarningModal?(this.hideLogoutWarningModal(!0),t=!0):t=!1,this.showingLoginModal=!0,!this.loginModal){var i=$('<form id="loginmodal" class="modal alert fitted"/>'),s=$('<div class="body"><h2>'+Craft.t("app","Your session has ended.")+"</h2><p>"+Craft.t("app","Enter your password to log back in.")+"</p></div>").appendTo(i),a=$('<div class="inputcontainer">').appendTo(s),n=$('<div class="flex"/>').appendTo(a),r=$('<div class="flex-grow"/>').appendTo(n),o=$("<div/>").appendTo(n),l=$('<div class="passwordwrapper"/>').appendTo(r);this.$passwordInput=$('<input type="password" class="text password fullwidth" autocomplete="current-password" placeholder="'+Craft.t("app","Password")+'"/>').appendTo(l),this.$loginBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Sign in"),spinner:!0}).attr("aria-disabled","true").appendTo(o),this.$loginErrorPara=$('<p class="error"/>').appendTo(s),this.loginModal=new Garnish.Modal(i,{autoShow:!1,closeOtherModals:!1,hideOnEsc:!1,hideOnShadeClick:!1,shadeClass:"modal-shade dark loginmodalshade",onFadeIn:function(){Garnish.isMobileBrowser(!0)||setTimeout((function(){e.$passwordInput.trigger("focus")}),100)},onFadeOut:function(){e.$passwordInput.val("")}}),new Craft.PasswordInput(this.$passwordInput,{onToggleInput:function(t){e.$passwordInput=t}}),this.addListener(this.$passwordInput,"input","validatePassword"),this.addListener(i,"submit","login")}t?this.loginModal.quickShow():this.loginModal.show()},hideLoginModal:function(t){this.showingLoginModal=!1,this.loginModal&&(t?this.loginModal.quickHide():this.loginModal.hide())},logout:function(){$.get({url:Craft.getActionUrl("users/logout"),dataType:"json",success:function(){Craft.redirectTo("")}})},renewSession:function(t){t&&t.preventDefault(),this.hideLogoutWarningModal(),this.checkRemainingSessionTime(!0)},validatePassword:function(){return this.$passwordInput.val().length>=6?(this.$loginBtn.removeClass("disabled"),this.$loginBtn.removeAttr("aria-disabled"),!0):(this.$loginBtn.addClass("disabled"),this.$loginBtn.attr("aria-disabled","true"),!1)},login:function(t){t&&t.preventDefault(),this.validatePassword()&&(this.$loginBtn.addClass("loading"),this.clearLoginError(),void 0!==Craft.csrfTokenValue?(this.submitLoginIfLoggedOut=!0,this.checkRemainingSessionTime()):this.submitLogin())},submitLogin:function(){var t=this,e={loginName:Craft.username,password:this.$passwordInput.val()};Craft.sendActionRequest("POST","users/login",{data:e}).then((function(e){t.$loginBtn.removeClass("loading"),t.hideLoginModal(),t.checkRemainingSessionTime()})).catch((function(e){var i=e.response;t.$loginBtn.removeClass("loading"),t.showLoginError(i.data.message||null),Garnish.shake(t.loginModal.$container),Garnish.isMobileBrowser(!0)||t.$passwordInput.trigger("focus")}))},showLoginError:function(t){null==t&&(t=Craft.t("app","A server error occurred.")),this.$loginErrorPara.text(t),this.loginModal.updateSizeAndPosition()},clearLoginError:function(){this.showLoginError("")}},{checkInterval:60,minSafeSessionTime:120})},5774:function(){function t(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);e&&(s=s.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,s)}return i}function e(e){for(var s=1;s<arguments.length;s++){var a=null!=arguments[s]?arguments[s]:{};s%2?t(Object(a),!0).forEach((function(t){i(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):t(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function s(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(t,e)||function(t,e){if(t){if("string"==typeof t)return a(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}Craft.BaseElementIndex=Garnish.Base.extend({initialized:!1,elementType:null,idPrefix:null,instanceState:null,sourceStates:null,sourceStatesStorageKey:null,searchTimeout:null,sourceSelect:null,$container:null,$main:null,isIndexBusy:!1,$sidebar:null,showingSidebar:null,sourceKey:null,rootSourceKey:null,sourceViewModes:null,$source:null,$rootSource:null,sourcesByKey:null,$visibleSources:null,$sourceActionsContainer:null,$sourceActionsBtn:null,$toolbar:null,toolbarOffset:null,$searchContainer:null,$search:null,$filterBtn:null,searching:!1,searchText:null,sortByScore:null,trashed:!1,drafts:!1,$clearSearchBtn:null,$statusMenuBtn:null,$statusMenuContainer:null,statusMenu:null,status:null,$siteMenuBtn:null,siteMenu:null,siteId:null,$elements:null,$updateSpinner:null,$viewModeBtnContainer:null,viewModeBtns:null,viewMode:null,view:null,_autoSelectElements:null,$countSpinner:null,$countContainer:null,$actionsContainer:null,page:1,resultSet:null,totalResults:null,$exportBtn:null,actions:null,actionsHeadHtml:null,actionsBodyHtml:null,$selectAllContainer:null,$selectAllCheckbox:null,showingActionTriggers:!1,exporters:null,exportersByType:null,_$triggers:null,_ignoreFailedRequest:!1,_cancelToken:null,viewMenus:null,activeViewMenu:null,filterHuds:null,init:function(t,e,i){var s=this;if(this.elementType=t,this.$container=e,this.setSettings(i,Craft.BaseElementIndex.defaults),this.idPrefix=Craft.randomString(10),this.instanceState=this.getDefaultInstanceState(),this.sourceStates={},this.settings.storageKey&&$.extend(this.instanceState,Craft.getLocalStorage(this.settings.storageKey),{}),this.sourceStatesStorageKey="BaseElementIndex."+this.elementType+"."+this.settings.context,$.extend(this.sourceStates,Craft.getLocalStorage(this.sourceStatesStorageKey,{})),this.$main=this.$container.find(".main"),this.$toolbar=this.$container.find(this.settings.toolbarSelector),this.$statusMenuBtn=this.$toolbar.find(".statusmenubtn:first"),this.$statusMenuContainer=this.$statusMenuBtn.parent(),this.$siteMenuBtn=this.$container.find(".sitemenubtn:first"),this.$searchContainer=this.$toolbar.find(".search:first"),this.$search=this.$searchContainer.children("input:first"),this.$filterBtn=this.$searchContainer.children(".filter-btn:first"),this.$clearSearchBtn=this.$searchContainer.children(".clear-btn:first"),this.$sidebar=this.$container.find(".sidebar:first"),this.$sourceActionsContainer=this.$sidebar.find("#source-actions"),this.$elements=this.$container.find(".elements:first"),this.$updateSpinner=this.$elements.find(".spinner"),this.$updateSpinner.length||(this.$updateSpinner=$("<div/>",{class:"update-spinner spinner spinner-absolute"}).appendTo(this.$elements)),this.$countSpinner=this.$container.find("#count-spinner"),this.$countContainer=this.$container.find("#count-container"),this.$actionsContainer=this.$container.find("#actions-container"),this.$exportBtn=this.$container.find("#export-btn"),this.settings.hideSidebar&&(this.$sidebar.hide(),$(".body, .content",this.$container).removeClass("has-sidebar")),this.initSources()){if(this.$statusMenuBtn.length&&(this.statusMenu=this.$statusMenuBtn.menubtn().data("menubtn").menu,this.statusMenu.on("optionselect",this._handleStatusChange.bind(this))),this.$siteMenuBtn.length){this.siteMenu=this.$siteMenuBtn.menubtn().data("menubtn").menu;var a=this.siteMenu.$options.filter(".sel:first");if(a.length||(a=this.siteMenu.$options.first()),a.length?this._setSite(a.data("site-id")):this.settings.criteria={id:"0"},this.siteMenu.on("optionselect",this._handleSiteChange.bind(this)),this.siteId){var n=this.settings.defaultSiteId||Craft.cp.getSiteId();if(n&&n!=this.siteId){var r=this.siteMenu.$options.filter('[data-site-id="'+n+'"]:first');r.length&&r.trigger("click")}}}else this.settings.criteria&&this.settings.criteria.siteId&&"*"!==this.settings.criteria.siteId?this._setSite(this.settings.criteria.siteId):this._setSite(Craft.siteId);this.settings.criteria&&this.settings.criteria.siteId&&delete this.settings.criteria.siteId,this.addListener(this.$search,"input",(function(){!s.searching&&s.$search.val()?s.startSearching():s.searching&&!s.$search.val()&&s.stopSearching(),s.searchTimeout&&clearTimeout(s.searchTimeout),s.searchTimeout=setTimeout(s.updateElementsIfSearchTextChanged.bind(s),500)})),this.addListener(this.$search,"keypress",(function(t){t.keyCode===Garnish.RETURN_KEY&&(t.preventDefault(),s.searchTimeout&&clearTimeout(s.searchTimeout),s.updateElementsIfSearchTextChanged())})),this.addListener(this.$clearSearchBtn,"click",(function(){s.clearSearch(!0),Garnish.isMobileBrowser(!0)||s.$search.trigger("focus")})),Garnish.isMobileBrowser(!0)||this.$search.trigger("focus"),this.viewMenus={},this.filterHuds={},this.addListener(this.$filterBtn,"click","showFilterHud");var o=Craft.getQueryParams();if(o.status){var l;switch(o.status){case"trashed":l="[data-trashed]";break;case"drafts":l="[data-drafts]";break;default:l='[data-status="'.concat(o.status,'"]')}var h=this.statusMenu.$options.filter(l);h.length?this.statusMenu.selectOption(h[0]):this.setQueryParam("status",null)}if(this.addListener(this.$exportBtn,"click","_showExportHud"),this.initialized=!0,this.afterInit(),this.selectDefaultSource(),o.sort){var d=o.sort.lastIndexOf("-");if(-1!==d){var c=o.sort.substring(0,d),u=o.sort.substring(d+1);this.setSelectedSortAttribute(c,u)}}this.setPage(Craft.pageNum),this.updateElements(!0)}},afterInit:function(){this.onAfterInit()},_createCancelToken:function(){return this._cancelToken=axios.CancelToken.source(),this._cancelToken.token},_cancelRequests:function(){var t=this;this._cancelToken&&(this._ignoreFailedRequest=!0,this._cancelToken.cancel(),Garnish.requestAnimationFrame((function(){t._ignoreFailedRequest=!1})))},getSourceContainer:function(){return this.$sidebar.find("nav > ul")},get $sources(){if(this.sourceSelect)return this.sourceSelect.$items},getSite:function(){var t=this;if(this.siteId)return Craft.sites.find((function(e){return e.id==t.siteId}))},initSources:function(){var t=this._getSourcesInList(this.getSourceContainer(),!0);if(0===t.length)return!1;this.sourceSelect||(this.sourceSelect=new Garnish.Select(this.$sidebar.find("nav"),{multi:!1,allowEmpty:!1,vertical:!0,onSelectionChange:this._handleSourceSelectionChange.bind(this)})),this.sourcesByKey={};for(var e=0;e<t.length;e++)this.initSource($(t[e]));return!0},selectDefaultSource:function(){var t,e;return"index"===this.settings.context&&(t=Craft.getQueryParam("source")),t||(t=this.getDefaultSourceKey()),t&&(e=this.getSourceByKey(t),-1===this.$visibleSources.index(e)&&(e=null)),t&&e||(e=this.$visibleSources.first()),this.selectSource(e)},refreshSources:function(){var t=this;this.sourceSelect.removeAllItems(),this.setIndexBusy(),Craft.sendActionRequest("POST",this.settings.refreshSourcesAction,{data:{context:this.settings.context,elementType:this.elementType}}).then((function(e){t.setIndexAvailable(),t.getSourceContainer().replaceWith(e.data.html),t.initSources(),t.selectDefaultSource()})).catch((function(){t.setIndexAvailable(),t._ignoreFailedRequest||Craft.cp.displayError(Craft.t("app","A server error occurred."))}))},initSource:function(t){this.sourceSelect.addItems(t),this.initSourceToggle(t),this.sourcesByKey[t.data("key")]=t,t.data("hasNestedSources")&&-1!==this.instanceState.expandedSources.indexOf(t.data("key"))&&this._expandSource(t)},initSourceToggle:function(t){this.deinitSourceToggle(t);var e=this._getSourceToggle(t);e.length?(this.addListener(t,"dblclick","_handleSourceDblClick"),this.addListener(e,"click","_handleSourceToggleClick"),t.data("hasNestedSources",!0)):t.data("hasNestedSources",!1)},deinitSource:function(t){this.sourceSelect.removeItems(t),this.deinitSourceToggle(t),delete this.sourcesByKey[t.data("key")]},deinitSourceToggle:function(t){t.data("hasNestedSources")&&(this.removeListener(t,"dblclick"),this.removeListener(this._getSourceToggle(t),"click")),t.removeData("hasNestedSources")},getDefaultInstanceState:function(){return{selectedSource:null,expandedSources:[]}},getDefaultSourceKey:function(){if(this.settings.defaultSource){for(var t=this.settings.defaultSource.split("/"),e="",i=0;i<t.length;i++){e+=t[i];var s=this.getSourceByKey(e);if(!s)return this.instanceState.selectedSource;this._expandSource(s),e+="/"}return this._setSite(this.siteId),this.settings.defaultSource}return this.instanceState.selectedSource},getDefaultExpandedSources:function(){return this.instanceState.expandedSources},startSearching:function(){this.$clearSearchBtn.removeClass("hidden"),this.searching=!0,this.sortByScore=!0,this.activeViewMenu&&this.activeViewMenu.updateSortField()},clearSearch:function(t){this.searching&&(this.$search.val(""),this.searchTimeout&&clearTimeout(this.searchTimeout),this.stopSearching(),t?this.updateElementsIfSearchTextChanged():this.searchText=null)},stopSearching:function(){this.$clearSearchBtn.addClass("hidden"),this.searching=!1,this.sortByScore=!1,this.activeViewMenu&&this.activeViewMenu.updateSortField()},setInstanceState:function(t,e){"object"===n(t)?$.extend(this.instanceState,t):this.instanceState[t]=e,this.storeInstanceState()},storeInstanceState:function(){this.settings.storageKey&&Craft.setLocalStorage(this.settings.storageKey,this.instanceState)},getSourceState:function(t,e,i){return t=t.replace(/\/.*/,""),void 0===this.sourceStates[t]&&(this.sourceStates[t]={}),void 0===e?this.sourceStates[t]:void 0!==this.sourceStates[t][e]?this.sourceStates[t][e]:void 0!==i?i:null},getSelectedSourceState:function(t,e){return this.getSourceState(this.instanceState.selectedSource,t,e)},setSelecetedSourceState:function(t,e){var i=this.getSelectedSourceState();if("object"===n(t))for(var s in t)t.hasOwnProperty(s)&&(null!==t[s]?i[s]=t[s]:delete i[s]);else null!==e?i[t]=e:delete i[t];var a=this.instanceState.selectedSource.replace(/\/.*/,"");for(var r in this.sourceStates[a]=i,this.sourceStates)this.sourceStates.hasOwnProperty(r)&&r.includes("/")&&delete this.sourceStates[r];Craft.setLocalStorage(this.sourceStatesStorageKey,this.sourceStates)},storeSortAttributeAndDirection:function(){},setPage:function(t){if("index"===this.settings.context){t=Math.max(t,1),this.page=t;var e=Craft.getPageUrl(this.page);history.replaceState({},"",e)}},_resetCount:function(){this.resultSet=null,this.totalResults=null},updateSourceMenu:function(){var t=this;if(this.$sourceActionsContainer.length){this.$sourceActionsBtn&&(this.$sourceActionsBtn.data("trigger").destroy(),this.$sourceActionsContainer.empty(),$("#source-actions-menu").remove(),this.$sourceActionsBtn=null);var e=this.getSourceActions();if(e.length){var i=[e.filter((function(t){return!t.destructive&&!t.administrative})),e.filter((function(t){return t.destructive&&!t.administrative})),e.filter((function(t){return t.administrative}))].filter((function(t){return t.length}));this.$sourceActionsBtn=$("<button/>",{type:"button",class:"btn settings icon menubtn",title:Craft.t("app","Source settings"),"aria-label":Craft.t("app","Source settings"),"aria-controls":"source-actions-menu"}).appendTo(this.$sourceActionsContainer);var s=$("<div/>",{id:"source-actions-menu",class:"menu menu--disclosure"}).appendTo(this.$sourceActionsContainer);i.forEach((function(e,i){0!==i&&$("<hr/>").appendTo(s),t._buildActionList(e).appendTo(s)})),this.$sourceActionsBtn.disclosureMenu()}}},_buildActionList:function(t){var e=this,i=$("<ul/>");return t.forEach((function(t){var s=$("<button/>",{type:"button",class:"menu-option",text:t.label}).on("click",(function(){e.$sourceActionsBtn.data("trigger").hide(),t.onSelect&&t.onSelect()}));t.destructive&&s.addClass("error"),$("<li/>").append(s).appendTo(i)})),i},getSourceActions:function(){var t=this,e=[];return Craft.userIsAdmin&&Craft.allowAdminChanges&&e.push({label:Craft.t("app","Customize sources"),administrative:!0,onSelect:function(){t.createCustomizeSourcesModal()}}),e},updateViewMenu:function(){this.activeViewMenu&&this.activeViewMenu===this.viewMenus[this.rootSourceKey]||(this.activeViewMenu&&this.activeViewMenu.hideTrigger(),this.viewMenus[this.rootSourceKey]||(this.viewMenus[this.rootSourceKey]=new r(this,this.$rootSource)),this.activeViewMenu=this.viewMenus[this.rootSourceKey],this.activeViewMenu.showTrigger())},getViewParams:function(){var t={siteId:this.siteId,search:this.searchText,offset:this.settings.batchSize*(this.page-1),limit:this.settings.batchSize};this.settings.canHaveDrafts&&(this.drafts||"index"===this.settings.context&&!this.status)&&(t.drafts=this.drafts||null,t.savedDraftsOnly=!0,this.drafts||(t.draftOf=!1)),this.trashed&&(t.trashed=!0),Garnish.hasAttr(this.$source,"data-override-status")||(t.status=this.status),$.extend(t,this.settings.criteria);var e={context:this.settings.context,elementType:this.elementType,source:this.instanceState.selectedSource,condition:this.settings.condition,criteria:t,disabledElementIds:this.settings.disabledElementIds,viewState:$.extend({},this.getSelectedSourceState()),paginated:this._isViewPaginated()?1:0},i=s(this.getSortAttributeAndDirection(),2),a=i[0],n=i[1];return e.viewState.order=a,e.viewState.sort=n,"structure"===a&&(void 0===this.instanceState.collapsedElementIds&&(this.instanceState.collapsedElementIds=[]),e.collapsedElementIds=this.instanceState.collapsedElementIds),this.filterHuds[this.siteId]&&this.filterHuds[this.siteId][this.sourceKey]&&this.filterHuds[this.siteId][this.sourceKey].serialized&&(e.filters=this.filterHuds[this.siteId][this.sourceKey].serialized),this.trigger("registerViewParams",{params:e}),e},updateElements:function(t,e){var i=this;if(this.initialized){this._cancelRequests(),this.setIndexBusy(),this.view&&(this.view.destroy(),delete this.view),!0!==t&&(this.setPage(1),this._resetCount());var s=this.getViewParams();Craft.sendActionRequest("POST",this.settings.updateElementsAction,{data:s,cancelToken:this._createCancelToken()}).then((function(t){if(i.setIndexAvailable(),("index"===i.settings.context?Garnish.$scrollContainer:i.$main).scrollTop(0),i._updateView(s,t.data),e){var a=i.view.getElementContainer();Garnish.firstFocusableElement(a).trigger("focus")}})).catch((function(t){i.setIndexAvailable(),i._ignoreFailedRequest||Craft.cp.displayError(Craft.t("app","A server error occurred."))}))}},updateElementsIfSearchTextChanged:function(){this.searchText!==(this.searchText=this.searching?this.$search.val():null)&&this.updateElements()},showActionTriggers:function(){this.showingActionTriggers||(this._$triggers?this._$triggers.appendTo(this.$actionsContainer):this._createTriggers(),this.showingActionTriggers=!0)},submitAction:function(t,e){var i=this,s=this.view.getSelectedElementIds();if(0!==s.length&&("string"==typeof t&&(t=this._findAction(t)),!t.confirm||confirm(t.confirm))){this._cancelRequests();var a=this.getViewParams();e=e?Craft.expandPostArray(e):{};var n=$.extend(a,t.settings||{},e,{elementAction:t.type,elementIds:s});this.setIndexBusy(),this._autoSelectElements=s,t.download?(Craft.csrfTokenName&&(n[Craft.csrfTokenName]=Craft.csrfTokenValue),Craft.downloadFromUrl("POST",Craft.getActionUrl(this.settings.submitActionsAction),n).then((function(t){i.setIndexAvailable()})).catch((function(t){i.setIndexAvailable()}))):Craft.sendActionRequest("POST",this.settings.submitActionsAction,{data:n,cancelToken:this._createCancelToken()}).then((function(e){i._resetCount(),i._updateView(a,e.data),void 0!==e.data.badgeCounts&&i._updateBadgeCounts(e.data.badgeCounts),e.data.message&&Craft.cp.displaySuccess(e.data.message),i.afterAction(t,n)})).catch((function(t){var e=t.response;Craft.cp.displayError(e.data.message)})).finally((function(){i.setIndexAvailable()}))}},_findAction:function(t){for(var e=0;e<this.actions.length;e++)if(this.actions[e].type===t)return this.actions[e];throw"Invalid element action: ".concat(t)},afterAction:function(t,e){Craft.cp.runQueue(),this.onAfterAction(t,e)},hideActionTriggers:function(){this.showingActionTriggers&&(this._$triggers.detach(),this.showingActionTriggers=!1)},updateActionTriggers:function(){if(this.actions){var t=this.view.getSelectedElements().length;0!==t?(t===this.view.getEnabledElements().length?(this.$selectAllCheckbox.removeClass("indeterminate"),this.$selectAllCheckbox.addClass("checked"),this.$selectAllCheckbox.attr("aria-checked","true")):(this.$selectAllCheckbox.addClass("indeterminate"),this.$selectAllCheckbox.removeClass("checked"),this.$selectAllCheckbox.attr("aria-checked","mixed")),this.showActionTriggers()):(this.$selectAllCheckbox.removeClass("indeterminate checked"),this.$selectAllCheckbox.attr("aria-checked","false"),this.hideActionTriggers())}},getSelectedElements:function(){return this.view?this.view.getSelectedElements():$()},getSelectedElementIds:function(){return this.view?this.view.getSelectedElementIds():[]},setStatus:function(t){var e=this.statusMenu.$options.filter('a[data-status="'+t+'"]:first');e.length&&this.statusMenu.selectOption(e[0])},getSelectedSortAttribute:function(t){if(t=t||this.$source){var e=this.getSourceState(t.data("key"),"order");if(this.getSortOption(e,t))return e}return this.getDefaultSort()[0]},getSelectedSortDirection:function(t){if(t=t||this.$source){var e=this.getSourceState(t.data("key"),"sort");if(["asc","desc"].includes(e))return e}return this.getDefaultSort()[1]},setSortAttribute:function(t){this.setSelectedSortAttribute(t)},setSelectedSortAttribute:function(t,e){if("score"===t)return this.sortByScore=!0,void(this.activeViewMenu&&this.activeViewMenu.updateSortField());this.sortByScore=!1;var i=this.getSortOption(t);if(i){e="structure"===t?"asc":e||i.defaultDir;var a=[],n=[t],r=this.getSelectedSourceState("order");r&&r!==t&&(a.push([r,this.getSelectedSourceState("sort")]),n.push(r));for(var o=this.getSelectedSourceState("orderHistory",[]),l=0;l<o.length;l++){var h=s(o[l],1)[0];if(!h||n.includes(h))break;a.push(o[l]),n.push(h)}this.setSelecetedSourceState({order:t,sort:e,orderHistory:a}),this.activeViewMenu&&this.activeViewMenu.updateSortField(),Craft.setQueryParam("sort","".concat(t,"-").concat(e))}else console.warn("Invalid sort option: ".concat(t))},setSortDirection:function(t){this.setSelectedSortDirection(t)},setSelectedSortDirection:function(t){this.setSelectedSortAttribute(this.getSelectedSortAttribute(),t)},canSortByStructure:function(){return!(this.trashed||this.drafts||this.searching||this.sortByScore)},getSortAttributeAndDirection:function(){if(this.searching&&this.sortByScore)return["score","desc"];var t=this.getSelectedSortAttribute(),e=this.getSelectedSortDirection();if("structure"===t)if(this.canSortByStructure())e="asc";else{var i=this.getSortOptions().find((function(t){return"structure"!==t.attr}));t=i.attr,e=i.defaultDir}return[t,e]},getSortLabel:function(t){var e=this.getSortOption(t);return e?e.label:null},getSelectedViewMode:function(){return this.getSelectedSourceState("mode")||"table"},getSourceLevel:function(t){return t.parentsUntil("nav","ul.nested").length+1},getParentSource:function(t){var e=t.parent().parent().siblings("a");return e.length?e:null},getRootSource:function(t){for(var e;e=this.getParentSource(t);)t=e;return t},getSourceByKey:function(t){return this.sourcesByKey[t]||null},selectSource:function(t){var e=$(t);if(!this.sourcesByKey||!Object.keys(this.sourcesByKey).length)return!1;if(this.$source&&this.$source[0]&&this.$source[0]===e[0]&&e.data("key")===this.sourceKey)return!1;if(this.hideActionTriggers(),this.$source=e,this.$rootSource=this.getRootSource(e),this.sourceKey=e.data("key"),this.rootSourceKey=this.$rootSource.data("key"),this.setInstanceState("selectedSource",this.sourceKey),this.sourceSelect.selectItem(e),Craft.cp.updateContentHeading(),this.searching&&(this.searchText=null,this.$search.val(""),this.stopSearching()),this.$statusMenuBtn.length&&(Garnish.hasAttr(this.$source,"data-override-status")?this.$statusMenuContainer.addClass("hidden"):this.$statusMenuContainer.removeClass("hidden"),this.trashed)){var i=this.statusMenu.$options.first();this.setStatus(i.data("status"))}if(this.$viewModeBtnContainer&&this.$viewModeBtnContainer.remove(),this.viewModeBtns={},this.viewMode=null,this.sourceViewModes=this.getViewModesForSource(),this.sourceViewModes.length>1){this.$viewModeBtnContainer=$('<section class="btngroup btngroup--exclusive"/>').attr("aria-label",Craft.t("app","View")),this.activeViewMenu?this.$viewModeBtnContainer.insertBefore(this.activeViewMenu.$trigger):this.$viewModeBtnContainer.appendTo(this.$toolbar);for(var s=0;s<this.sourceViewModes.length;s++){var a=this.sourceViewModes[s],n=$("<button/>",{type:"button",class:"btn"+(void 0!==a.className?" ".concat(a.className):""),"data-view":a.mode,"data-icon":a.icon,"aria-label":a.title,"aria-pressed":"false",title:a.title}).appendTo(this.$viewModeBtnContainer);this.viewModeBtns[a.mode]=n,this.addListener(n,"click",{mode:a.mode},(function(t){this.selectViewMode(t.data.mode),this.updateElements()}))}}var r=this.getSelectedViewMode();if(r&&this.doesSourceHaveViewMode(r)||(r=this.viewMode&&this.doesSourceHaveViewMode(this.viewMode)?this.viewMode:this.sourceViewModes[0].mode),this.selectViewMode(r),this.updateSourceMenu(),this.updateViewMenu(),this.updateFilterBtn(),this.onSelectSource(),"index"===this.settings.context){var o=Craft.getQueryParams();o.source=this.sourceKey,Craft.setUrl(Craft.getUrl(Craft.path,o))}return!0},selectSourceByKey:function(t){var e=this.getSourceByKey(t);return!!e&&this.selectSource(e)},getSortOptions:function(t){var e=((t=t||this.$rootSource)?t.data("sort-opts"):null)||[];return e.find((function(t){return"structure"!==t.attr}))||e.push({label:Craft.t("app","Title"),attr:"title",defaultDir:"asc"}),e},getSortOption:function(t,e){return this.getSortOptions(e).find((function(e){return e.attr===t}))||null},getDefaultSort:function(t){if(t=t||this.$rootSource){var e=t.data("default-sort");if(e){"string"==typeof e&&(e=[e]);var i=this.getSortOption(e[0],t);if(i)return e[1]||(e[1]=i.defaultDir),e}}var s=this.getSortOptions(t);return[s[0].attr,s[0].defaultDir]},getTableColumnOptions:function(t){return((t=t||this.$rootSource)?t.data("table-col-opts"):null)||[]},getTableColumnOption:function(t,e){return this.getTableColumnOptions(e).find((function(e){return e.attr===t}))||null},getDefaultTableColumns:function(t){return((t=t||this.$rootSource)?t.data("default-table-cols"):null)||[]},getSelectedTableColumns:function(t){var e=this;if(t=t||this.$rootSource){var i=this.getSourceState(t.data("key"),"tableColumns");if(i)return i.filter((function(i){return!!e.getTableColumnOption(i,t)}))}return this.getDefaultTableColumns(t)},setSelectedTableColumns:function(t){this.setSelecetedSourceState({tableColumns:t}),this.activeViewMenu&&this.activeViewMenu.updateTableColumnField()},getViewModesForSource:function(){var t=[{mode:"table",title:Craft.t("app","Display in a table"),icon:"list"}];return this.$source&&Garnish.hasAttr(this.$source,"data-has-thumbs")&&t.push({mode:"thumbs",title:Craft.t("app","Display as thumbnails"),icon:"grid"}),t},doesSourceHaveViewMode:function(t){for(var e=0;e<this.sourceViewModes.length;e++)if(this.sourceViewModes[e].mode===t)return!0;return!1},selectViewMode:function(t,e){e||this.doesSourceHaveViewMode(t)||(t=this.sourceViewModes[0].mode),t!==this.viewMode&&(this.viewMode&&void 0!==this.viewModeBtns[this.viewMode]&&this.viewModeBtns[this.viewMode].removeClass("active").attr("aria-pressed","false"),this.viewMode=t,this.setSelecetedSourceState("mode",this.viewMode),void 0!==this.viewModeBtns[this.viewMode]&&this.viewModeBtns[this.viewMode].addClass("active").attr("aria-pressed","true"))},createView:function(t,e){return new(this.getViewClass(t))(this,this.$elements,e)},getViewClass:function(t){switch(t){case"table":return Craft.TableElementIndexView;case"thumbs":return Craft.ThumbsElementIndexView;default:throw'View mode "'.concat(t,'" not supported.')}},rememberDisabledElementId:function(t){-1===$.inArray(t,this.settings.disabledElementIds)&&this.settings.disabledElementIds.push(t)},forgetDisabledElementId:function(t){var e=$.inArray(t,this.settings.disabledElementIds);-1!==e&&this.settings.disabledElementIds.splice(e,1)},enableElements:function(t){t.removeClass("disabled").parents(".disabled").removeClass("disabled");for(var e=0;e<t.length;e++){var i=$(t[e]).data("id");this.forgetDisabledElementId(i)}this.onEnableElements(t)},disableElements:function(t){t.removeClass("sel").addClass("disabled");for(var e=0;e<t.length;e++){var i=$(t[e]).data("id");this.rememberDisabledElementId(i)}this.onDisableElements(t)},getElementById:function(t){return this.view.getElementById(t)},enableElementsById:function(t){t=$.makeArray(t);for(var e=0;e<t.length;e++){var i=t[e],s=this.getElementById(i);s&&s.length?this.enableElements(s):this.forgetDisabledElementId(i)}},disableElementsById:function(t){t=$.makeArray(t);for(var e=0;e<t.length;e++){var i=t[e],s=this.getElementById(i);s&&s.length?this.disableElements(s):this.rememberDisabledElementId(i)}},selectElementAfterUpdate:function(t){null===this._autoSelectElements&&(this._autoSelectElements=[]),this._autoSelectElements.push(t)},addButton:function(t){this.getButtonContainer().append(t)},isShowingSidebar:function(){return null===this.showingSidebar&&(this.showingSidebar=this.$sidebar.length&&!this.$sidebar.hasClass("hidden")),this.showingSidebar},getButtonContainer:function(){if(this.settings.buttonContainer)return $(this.settings.buttonContainer);var t=$("#action-buttons");return t.length||(t=$('<div id="action-buttons"/>').appendTo($("#header"))),t},setIndexBusy:function(){this.$elements.addClass("busy"),this.$updateSpinner.appendTo(this.$elements),this.isIndexBusy=!0},setIndexAvailable:function(){this.$elements.removeClass("busy"),this.$updateSpinner.remove(),this.isIndexBusy=!1},createCustomizeSourcesModal:function(){var t=new Craft.CustomizeSourcesModal(this,{onHide:function(){t.destroy()}});return t},disable:function(){this.sourceSelect&&this.sourceSelect.disable(),this.view&&this.view.disable(),this.base()},enable:function(){this.sourceSelect&&this.sourceSelect.enable(),this.view&&this.view.enable(),this.base()},onAfterInit:function(){this.settings.onAfterInit(),this.trigger("afterInit")},onSelectSource:function(){this.settings.onSelectSource(this.sourceKey),this.trigger("selectSource",{sourceKey:this.sourceKey})},onSelectSite:function(){this.settings.onSelectSite(this.siteId),this.trigger("selectSite",{siteId:this.siteId})},onUpdateElements:function(){this.settings.onUpdateElements(),this.trigger("updateElements")},onSelectionChange:function(){this.settings.onSelectionChange(),this.trigger("selectionChange")},onEnableElements:function(t){this.settings.onEnableElements(t),this.trigger("enableElements",{elements:t})},onDisableElements:function(t){this.settings.onDisableElements(t),this.trigger("disableElements",{elements:t})},onAfterAction:function(t,e){this.settings.onAfterAction(t,e),this.trigger("afterAction",{action:t,params:e})},_handleSourceSelectionChange:function(){this.sourceSelect.totalSelected?this.selectSource(this.sourceSelect.$selectedItems)&&this.updateElements():this.sourceSelect.selectItem(this.$visibleSources.first())},_handleActionTriggerSubmit:function(t){t.preventDefault();var e=$(t.currentTarget);e.hasClass("disabled")||e.data("custom-handler")||this.submitAction(e.data("action"),Garnish.getPostData(e))},_handleMenuActionTriggerSubmit:function(t){var e=$(t.option);e.hasClass("disabled")||e.data("custom-handler")||this.submitAction(e.data("action"))},_handleStatusChange:function(t){this.statusMenu.$options.removeClass("sel");var e=$(t.selectedOption).addClass("sel");this.$statusMenuBtn.html(e.html()),this.trashed=!1,this.drafts=!1,this.status=null;var i=null;Garnish.hasAttr(e,"data-trashed")?(this.trashed=!0,i="trashed"):Garnish.hasAttr(e,"data-drafts")?(this.drafts=!0,i="drafts"):this.status=i=e.data("status")||null,this.activeViewMenu&&this.activeViewMenu.updateSortField(),Craft.setQueryParam("status",i),this.updateElements()},_handleSiteChange:function(t){this.siteMenu.$options.removeClass("sel");var e=$(t.selectedOption).addClass("sel");this.$siteMenuBtn.html(e.html()),this._setSite(e.data("site-id")),this.onSelectSite()},_setSite:function(t){var e=null===this.siteId;this.siteId=t,this.updateSourceVisibility(),!this.initialized||e||this.$source&&this.$source.length||!this.$visibleSources.length||this.selectSource(this.$visibleSources[0]);for(var i,s=this.getSourceContainer().children(".heading"),a=0;a<s.length;a++)0!==(i=s.eq(a)).has("> ul > li:not(.hidden)").length?i.removeClass("hidden"):i.addClass("hidden");this.initialized&&("index"===this.settings.context&&Craft.cp.setSiteId(t),this.updateElements(),this.updateFilterBtn())},updateSourceVisibility:function(){this.$visibleSources=$();for(var t=0;t<this.$sources.length;t++){var e=this.$sources.eq(t);Garnish.hasAttr(e,"data-disabled")||void 0!==e.data("sites")&&-1===e.data("sites").toString().split(",").indexOf(this.siteId.toString())?(e.parent().addClass("hidden"),this.$source&&this.$source.get(0)===e.get(0)&&(this.$source=null,this.$rootSource=null,this.sourceKey=null,this.rootSourceKey=null)):(e.parent().removeClass("hidden"),this.$visibleSources=this.$visibleSources.add(e))}},_handleSelectionChange:function(){this.updateActionTriggers(),this.onSelectionChange()},_handleSourceDblClick:function(t){this._toggleSource($(t.currentTarget)),t.stopPropagation()},_handleSourceToggleClick:function(t){this._toggleSource($(t.currentTarget).prev("a")),t.stopPropagation()},_getSourcesInList:function(t,e){var i=t.find("> li:not(.heading) > a");return e&&(i=i.add(t.find("> li.heading > ul > li > a"))),i},_getChildSources:function(t){var e=t.siblings("ul");return this._getSourcesInList(e)},_getSourceToggle:function(t){return t.siblings(".toggle")},_toggleSource:function(t){t.parent("li").hasClass("expanded")?this._collapseSource(t):this._expandSource(t)},_expandSource:function(t){t.next(".toggle").attr({"aria-expanded":"true","aria-label":Craft.t("app","Hide nested sources")}),t.parent("li").addClass("expanded");for(var e=this._getChildSources(t),i=0;i<e.length;i++)this.initSource($(e[i])),this.$visibleSources&&(this.$visibleSources=this.$visibleSources.add(e[i]));var s=t.data("key");-1===this.instanceState.expandedSources.indexOf(s)&&(this.instanceState.expandedSources.push(s),this.storeInstanceState())},_collapseSource:function(t){t.next(".toggle").attr({"aria-expanded":"false","aria-label":Craft.t("app","Show nested sources")}),t.parent("li").removeClass("expanded");for(var e=this._getChildSources(t),i=0;i<e.length;i++)this.deinitSource($(e[i])),this.$visibleSources=this.$visibleSources.not(e[i]);var s=this.instanceState.expandedSources.indexOf(t.data("key"));-1!==s&&(this.instanceState.expandedSources.splice(s,1),this.storeInstanceState())},_isViewPaginated:function(){return"index"===this.settings.context&&"structure"!==this.getSortAttributeAndDirection()[0]},_updateView:function(t,e){var i=this;this.actions&&(this.hideActionTriggers(),this.actions=this.actionsHeadHtml=this.actionsBodyHtml=this._$triggers=null);var s=document.activeElement;this.$countContainer.length&&(this.$countSpinner.removeClass("hidden"),this.$countContainer.html(""),this._countResults().then((function(t){i.$countSpinner.addClass("hidden");var e=Craft.elementTypeNames[i.elementType]?Craft.elementTypeNames[i.elementType][2]:i.settings.elementTypeName.toLowerCase(),s=Craft.elementTypeNames[i.elementType]?Craft.elementTypeNames[i.elementType][3]:i.settings.elementTypePluralName.toLowerCase();if(i._isViewPaginated()){var a=Math.min(i.settings.batchSize*(i.page-1)+1,t),n=Math.min(a+(i.settings.batchSize-1),t),r=Craft.t("app","{first, number}-{last, number} of {total, number} {total, plural, =1{{item}} other{{items}}}",{first:a,last:n,total:t,item:e,items:s}),o=$('<div class="flex pagination"/>').appendTo(i.$countContainer),l=Math.max(Math.ceil(t/i.settings.batchSize),1),h=$("<nav/>",{class:"flex","aria-label":Craft.t("app","{element} pagination",{element:e})}).appendTo(o),d=$("<button/>",{role:"button",class:"page-link prev-page"+(i.page>1?"":" disabled"),disabled:1===i.page,title:Craft.t("app","Previous Page")}).appendTo(h),c=$("<button/>",{role:"button",class:"page-link next-page"+(i.page<l?"":" disabled"),disabled:i.page===l,title:Craft.t("app","Next Page")}).appendTo(h);$("<div/>",{class:"page-info",text:r}).appendTo(o),i.page>1&&i.addListener(d,"click",(function(){this.removeListener(d,"click"),this.removeListener(c,"click"),this.setPage(this.page-1),this.updateElements(!0,!0)})),i.page<l&&i.addListener(c,"click",(function(){this.removeListener(d,"click"),this.removeListener(c,"click"),this.setPage(this.page+1),this.updateElements(!0,!0)}))}else{var u=Craft.t("app","{total, number} {total, plural, =1{{item}} other{{items}}}",{total:t,item:e,items:s});i.$countContainer.text(u)}})).catch((function(){i.$countSpinner.addClass("hidden")}))),this.$elements.html(e.html),Craft.appendHeadHtml(e.headHtml),Craft.appendBodyHtml(e.bodyHtml),this.$selectAllContainer=this.$elements.find(".selectallcontainer:first"),e.actions&&e.actions.length?this.$selectAllContainer.length&&(this.actions=e.actions,this.actionsHeadHtml=e.actionsHeadHtml,this.actionsBodyHtml=e.actionsBodyHtml,this.$selectAllCheckbox=$('<div class="checkbox"/>').prependTo(this.$selectAllContainer).attr({role:"checkbox",tabindex:"0","aria-checked":"false","aria-label":Craft.t("app","Select all")}),this.addListener(this.$selectAllCheckbox,"click",(function(){0===this.view.getSelectedElements().length?this.view.selectAllElements():this.view.deselectAllElements()})),this.addListener(this.$selectAllCheckbox,"keydown",(function(t){t.keyCode===Garnish.SPACE_KEY&&(t.preventDefault(),$(t.currentTarget).trigger("click"))}))):(this.$selectAllContainer.siblings().length||this.$selectAllContainer.parent(".header").remove(),this.$selectAllContainer.remove()),this.exporters=e.exporters,this.exportersByType=Craft.index(this.exporters||[],(function(t){return t.type})),this.exporters&&this.exporters.length?this.$exportBtn.removeClass("hidden"):this.$exportBtn.addClass("hidden");var a=this.actions||this.settings.selectable;if(this.view=this.createView(this.getSelectedViewMode(),{context:this.settings.context,batchSize:"index"!==this.settings.context||"structure"===this.getSortAttributeAndDirection()[0]?this.settings.batchSize:null,params:t,selectable:a,multiSelect:this.actions||this.settings.multiSelect,checkboxMode:!!this.actions,onSelectionChange:this._handleSelectionChange.bind(this)}),s&&s.id&&!document.body.contains(s)&&$("#".concat(s.id)).focus(),this._autoSelectElements){if(a)for(var n=0;n<this._autoSelectElements.length;n++)this.view.selectElementById(this._autoSelectElements[n]);this._autoSelectElements=null}this.onUpdateElements()},_updateBadgeCounts:function(t){for(var e in t)if(t.hasOwnProperty(e)){var i=this.getSourceByKey(e);if(i){var s=i.children(".badge");null!==t[e]?(s.length||(s=$('<span class="badge"/>').appendTo(i)),s.text(t[e])):s&&s.remove()}}},_countResults:function(){var t=this;return new Promise((function(e,i){if(null!==t.totalResults)e(t.totalResults);else{var s=t.getViewParams();delete s.criteria.offset,delete s.criteria.limit,null===t.resultSet&&(t.resultSet=Math.floor(1e8*Math.random())),s.resultSet=t.resultSet,Craft.sendActionRequest("POST",t.settings.countElementsAction,{data:s,cancelToken:t._createCancelToken()}).then((function(s){s.data.resultSet==t.resultSet?(t.totalResults=s.data.count,e(s.data.count)):i()})).catch(i)}}))},_createTriggers:function(){var t,e,i=[],s=[],a=[];for(t=0;t<this.actions.length;t++){var n=this.actions[t];if(n.trigger){var r=$('<form id="'+Craft.formatInputId(n.type)+'-actiontrigger"/>').data("action",n).append(n.trigger);this.addListener(r,"submit","_handleActionTriggerSubmit"),i.push(r)}else n.destructive?a.push(n):s.push(n)}if(s.length||a.length){var o=$("<form/>");e=$("<button/>",{type:"button",class:"btn menubtn","data-icon":"settings",title:Craft.t("app","Actions")}).appendTo(o);var l=$('<ul class="menu"/>').appendTo(o),h=this._createMenuTriggerList(s,!1),d=this._createMenuTriggerList(a,!0);h&&h.appendTo(l),h&&d&&$("<hr/>").appendTo(l),d&&d.appendTo(l),i.push(o)}for(this._$triggers=$(),t=0;t<i.length;t++){var c=$("<div/>").append(i[t]);this._$triggers=this._$triggers.add(c)}this._$triggers.appendTo(this.$actionsContainer),Craft.appendHeadHtml(this.actionsHeadHtml),Craft.appendBodyHtml(this.actionsBodyHtml),Craft.initUiElements(this._$triggers),e&&e.data("menubtn").on("optionSelect",this._handleMenuActionTriggerSubmit.bind(this))},_showExportHud:function(){var t=this;this.$exportBtn.addClass("active"),this.$exportBtn.attr("aria-expanded","true");for(var e=$("<form/>",{class:"export-form"}),i=[],s=0;s<this.exporters.length;s++)i.push({label:this.exporters[s].name,value:this.exporters[s].type});var a=Craft.ui.createSelectField({label:Craft.t("app","Export Type"),options:i,class:"fullwidth"}).appendTo(e),n=Craft.ui.createSelectField({label:Craft.t("app","Format"),options:[{label:"CSV",value:"csv"},{label:"JSON",value:"json"},{label:"XML",value:"xml"}],class:"fullwidth"}).appendTo(e),r=a.find("select");this.addListener(r,"change",(function(){var e=r.val();t.exportersByType[e].formattable?n.removeClass("hidden"):n.addClass("hidden")})),r.trigger("change");var o=this.view.getSelectedElementIds();if(!o.length)var l=Craft.ui.createTextField({label:Craft.t("app","Limit"),placeholder:Craft.t("app","No limit"),type:"number",min:1}).appendTo(e);var h=Craft.ui.createSubmitButton({class:"fullwidth",label:Craft.t("app","Export"),spinner:!0}).appendTo(e);new Garnish.HUD(this.$exportBtn,e).on("hide",(function(){t.$exportBtn.removeClass("active"),t.$exportBtn.attr("aria-expanded","false")}));var d=!1;this.addListener(e,"submit",(function(t){var e=this;if(t.preventDefault(),!d){d=!0,h.addClass("loading");var i=this.getViewParams();if(delete i.criteria.offset,delete i.criteria.limit,delete i.collapsedElementIds,i.type=a.find("select").val(),i.format=n.find("select").val(),o.length)i.criteria.id=o;else{var s=parseInt(l.find("input").val());s&&!isNaN(s)&&(i.criteria.limit=s)}Craft.csrfTokenValue&&(i[Craft.csrfTokenName]=Craft.csrfTokenValue),Craft.downloadFromUrl("POST",Craft.getActionUrl("element-indexes/export"),i).catch((function(){e._ignoreFailedRequest||Craft.cp.displayError(Craft.t("app","A server error occurred."))})).finally((function(){d=!1,h.removeClass("loading")}))}}))},_createMenuTriggerList:function(t,e){if(t&&t.length){for(var i=$("<ul/>"),s=0;s<t.length;s++)$("<li/>").append($("<a/>",{id:Craft.formatInputId(t[s].type)+"-actiontrigger",class:e?"error":null,data:{action:t[s]},text:t[s].name})).appendTo(i);return i}},showFilterHud:function(){this.filterHuds[this.siteId]||(this.filterHuds[this.siteId]={}),this.filterHuds[this.siteId][this.sourceKey]?this.filterHuds[this.siteId][this.sourceKey].show():(this.filterHuds[this.siteId][this.sourceKey]=new o(this,this.sourceKey,this.siteId),this.updateFilterBtn())},updateFilterBtn:function(){this.$filterBtn.removeClass("active"),this.filterHuds[this.siteId]&&this.filterHuds[this.siteId][this.sourceKey]?(this.$filterBtn.attr("aria-controls",this.filterHuds[this.siteId][this.sourceKey].id).attr("aria-expanded",this.filterHuds[this.siteId][this.sourceKey].showing?"true":"false"),(this.filterHuds[this.siteId][this.sourceKey].showing||this.filterHuds[this.siteId][this.sourceKey].hasRules())&&this.$filterBtn.addClass("active")):this.$filterBtn.attr("aria-controls",null)}},{defaults:{context:"index",modal:null,storageKey:null,condition:null,criteria:null,batchSize:100,disabledElementIds:[],selectable:!1,multiSelect:!1,buttonContainer:null,hideSidebar:!1,toolbarSelector:".toolbar:first",refreshSourcesAction:"element-indexes/get-source-tree-html",updateElementsAction:"element-indexes/get-elements",countElementsAction:"element-indexes/count-elements",submitActionsAction:"element-indexes/perform-action",defaultSiteId:null,defaultSource:null,canHaveDrafts:!1,elementTypeName:Craft.t("app","Element"),elementTypePluralName:Craft.t("app","Elements"),onAfterInit:$.noop,onSelectSource:$.noop,onSelectSite:$.noop,onUpdateElements:$.noop,onSelectionChange:$.noop,onEnableElements:$.noop,onDisableElements:$.noop,onAfterAction:$.noop}});var r=Garnish.Base.extend({elementIndex:null,$source:null,sourceKey:null,menu:null,id:null,$trigger:null,$container:null,$sortAttributeSelect:null,$sortDirectionPicker:null,sortDirectionListbox:null,$tableColumnsContainer:null,$revertContainer:null,$revertBtn:null,$closeBtn:null,init:function(t,e){var i=this;this.elementIndex=t,this.$source=e,this.sourceKey=e.data("key"),this.id="view-menu-".concat(Math.floor(1e9*Math.random())),this.$trigger=$("<button/>",{type:"button",class:"btn menubtn hidden",text:Craft.t("app","View"),"aria-label":Craft.t("app","View settings"),"aria-controls":this.id,"data-icon":"sliders"}).appendTo(this.elementIndex.$toolbar),this.$container=$("<div/>",{id:this.id,class:"menu menu--disclosure element-index-view-menu","data-align":"right"}).appendTo(Garnish.$bod),this._buildMenu(),this.addListener(this.$container,"mousedown",(function(t){t.stopPropagation()})),this.menu=new Garnish.DisclosureMenu(this.$trigger),this.menu.on("show",(function(){i.$trigger.addClass("active")})),this.menu.on("hide",(function(){i.$trigger.removeClass("active"),setTimeout((function(){i.tidyTableColumnField()}),Garnish.FX_DURATION)}))},showTrigger:function(){this.$trigger.removeClass("hidden")},hideTrigger:function(){this.$trigger.data("trigger").hide(),this.$trigger.addClass("hidden"),this.menu.hide()},updateSortField:function(){var t=s(this.elementIndex.getSortAttributeAndDirection(),2),e=t[0],i=t[1],a=this.$sortAttributeSelect.children('option[value="score"]');this.elementIndex.searching?a.length||this.$sortAttributeSelect.prepend($("<option/>",{value:"score",text:Craft.t("app","Score")})):a.length&&a.remove(),this.$sortAttributeSelect.val(e),this.sortDirectionListbox.select("asc"===i?0:1),["structure","score"].includes(e)?(this.sortDirectionListbox.disable(),this.$sortDirectionPicker.addClass("disabled")):(this.sortDirectionListbox.enable(),this.$sortDirectionPicker.removeClass("disabled")),this.elementIndex.canSortByStructure()?this.$sortAttributeSelect.children('option[value="structure"]').removeAttr("disabled"):this.$sortAttributeSelect.children('option[value="structure"]').attr("disabled","disabled")},updateTableColumnField:function(){var t,e,i=this,s=this.elementIndex.getSelectedTableColumns();s.forEach((function(s){var a=i.$tableColumnsContainer.find('input[value="'.concat(s,'"]'));a.prop("checked")||a.prop("checked",!0);var n=a.parent();t&&n.index()<e&&n.insertAfter(t),t=n,e=n.index()}));for(var a=this._getTableColumnCheckboxes(),n=0;n<a.length;n++){var r=a.eq(n);r.prop("checked")&&!s.includes(r.val())&&r.prop("checked",!1)}},tidyTableColumnField:function(){var t=this.elementIndex.getTableColumnOptions(this.$source).map((function(t){return t.attr})).reduce((function(t,s,a){return e(e({},t),{},i({},s,a))}),{});this.$tableColumnsContainer.children().sort((function(e,i){var s=$(e).children('input[type="checkbox"]')[0],a=$(i).children('input[type="checkbox"]')[0];return s.checked&&a.checked?0:s.checked||a.checked?s.checked?-1:1:t[s.value]<t[a.value]?-1:1})).appendTo(this.$tableColumnsContainer)},revert:function(){this.elementIndex.setSelecetedSourceState({order:null,sort:null,tableColumns:null}),this.updateSortField(),this.updateTableColumnField(),this.tidyTableColumnField(),this.$revertBtn.remove(),this.$revertBtn=null,this.$closeBtn.focus(),this.elementIndex.updateElements()},_buildMenu:function(){var t=this,e=$('<div class="meta"/>').appendTo(this.$container);this._createSortField().appendTo(e),this._createTableColumnsField().appendTo(e),this.$sortAttributeSelect.focus();var i=$("<div/>",{class:"flex menu-footer"}).appendTo(this.$container);this.$revertContainer=$("<div/>",{class:"flex-grow"}).appendTo(i),(this.elementIndex.getSelectedSourceState("order")||this.elementIndex.getSelectedSourceState("sort")||this.elementIndex.getSelectedSourceState("tableColumns"))&&this._createRevertBtn(),this.$closeBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Close")}).appendTo(i).on("click",(function(){t.menu.hide()}))},_createSortField:function(){var t=this,e=$('<div class="flex"/>'),i=Craft.ui.createSelect({options:this.elementIndex.getSortOptions(this.$source).map((function(t){return{label:t.label,value:t.attr}}))}).addClass("fullwidth").appendTo($('<div class="flex-grow"/>').appendTo(e));this.$sortAttributeSelect=i.children("select").attr({"aria-label":Craft.t("app","Sort attribute")}),this.$sortDirectionPicker=$("<section/>",{class:"btngroup btngroup--exclusive","aria-label":Craft.t("app","Sort direction")}).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort ascending"),"aria-label":Craft.t("app","Sort ascending"),"aria-pressed":"false","data-icon":"asc","data-dir":"asc"})).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort descending"),"aria-label":Craft.t("app","Sort descending"),"aria-pressed":"false","data-icon":"desc","data-dir":"desc"})).appendTo(e),this.sortDirectionListbox=new Craft.Listbox(this.$sortDirectionPicker,{onChange:function(e){e.data("dir")!==t.elementIndex.getSelectedSortDirection()&&(t.elementIndex.setSelectedSortAttribute(t.$sortAttributeSelect.val(),e.data("dir")),t.elementIndex.updateElements(),t._createRevertBtn())}}),this.$sortAttributeSelect.on("change",(function(){t.elementIndex.setSelectedSortAttribute(t.$sortAttributeSelect.val(),null,!1),t.elementIndex.updateElements(),t._createRevertBtn()})),this.updateSortField();var s=Craft.ui.createField(e,{label:Craft.t("app","Sort by"),fieldset:!0});return s.addClass("sort-field"),s},_getTableColumnCheckboxes:function(){return this.$tableColumnsContainer.find('input[type="checkbox"]')},_createTableColumnsField:function(){var t=this,e=this.elementIndex.getTableColumnOptions(this.$source);if(!e.length)return $();this.$tableColumnsContainer=$("<div/>"),e.forEach((function(e){$('<div class="element-index-view-menu-table-column"/>').append('<div class="icon move"/>').append(Craft.ui.createCheckbox({label:Craft.escapeHtml(e.label),value:e.attr})).appendTo(t.$tableColumnsContainer)})),this.updateTableColumnField(),this.tidyTableColumnField(),new Garnish.DragSort(this.$tableColumnsContainer.children(),{handle:".move",axis:"y",onSortChange:function(){t._onTableColumnChange()}}),this._getTableColumnCheckboxes().on("change",(function(e){t._onTableColumnChange()}));var i=Craft.ui.createField(this.$tableColumnsContainer,{label:Craft.t("app","Table Columns"),fieldset:!0});return i.addClass("table-columns-field"),i},_onTableColumnChange:function(){for(var t=[],e=this._getTableColumnCheckboxes().filter(":checked"),i=0;i<e.length;i++)t.push(e.eq(i).val());Craft.compare(t,this.elementIndex.getSelectedTableColumns(this.$source))||(this.elementIndex.setSelectedTableColumns(t,!1),this.elementIndex.updateElements(),this._createRevertBtn())},_createRevertBtn:function(){var t=this;this.$revertBtn||(this.$revertBtn=$("<button/>",{type:"button",class:"light",text:Craft.t("app","Use defaults")}).appendTo(this.$revertContainer).on("click",(function(){t.revert()})))},destroy:function(){this.menu.destroy(),delete this.menu,this.base()}}),o=Garnish.HUD.extend({elementIndex:null,sourceKey:null,siteId:null,id:null,loading:!0,serialized:null,$clearBtn:null,cleared:!1,init:function(t,e,i){var s=this;this.elementIndex=t,this.sourceKey=e,this.siteId=i,this.id="filter-".concat(Math.floor(1e9*Math.random()));var a=$("<div/>").append($("<div/>",{class:"spinner"})).append($("<div/>",{text:Craft.t("app","Loading"),class:"visually-hidden","aria-role":"alert"}));this.base(this.elementIndex.$filterBtn,a,{hudClass:"hud element-filter-hud loading"}),this.$hud.attr({id:this.id,"aria-live":"polite","aria-busy":"false"}),this.$tip.remove(),this.$tip=null,this.$body.on("submit",(function(t){t.preventDefault(),s.hide()})),Craft.sendActionRequest("POST","element-indexes/filter-hud",{data:{elementType:this.elementIndex.elementType,source:this.sourceKey,condition:this.elementIndex.settings.condition,id:"".concat(this.id,"-filters")}}).then((function(t){s.loading=!1,s.$hud.removeClass("loading"),a.remove(),s.$main.append(t.data.hudHtml),Craft.appendHeadHtml(t.data.headHtml),Craft.appendBodyHtml(t.data.bodyHtml);var e=$("<div/>",{class:"flex flex-nowrap"}).appendTo(s.$main);$("<div/>",{class:"flex-grow"}).appendTo(e),s.$clearBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(e),$("<button/>",{type:"submit",class:"btn secondary",text:Craft.t("app","Apply")}).appendTo(e),s.$clearBtn.on("click",(function(){s.clear()})),s.$hud.find(".condition-container").on("htmx:beforeRequest",(function(){s.setBusy()})),s.$hud.find(".condition-container").on("htmx:load",(function(){s.setReady()})),s.setFocus()})).catch((function(){Craft.cp.displayError(Craft.t("app","A server error occurred."))})),this.$hud.css("position","fixed"),this.addListener(Garnish.$win,"scroll,resize",(function(){s.updateSizeAndPosition(!0)}))},addListener:function(t,e,i,s){t===this.$main&&"resize"===e||this.base(t,e,i,s)},setBusy:function(){this.$hud.attr("aria-busy","true"),$("<div/>",{class:"visually-hidden",text:Craft.t("app","Loading")}).insertAfter(this.$main.find(".htmx-indicator"))},setReady:function(){this.$hud.attr("aria-busy","false")},setFocus:function(){Garnish.setFocusWithin(this.$main)},clear:function(){this.cleared=!0,this.hide()},updateSizeAndPositionInternal:function(){var t=this.elementIndex.$searchContainer[0].getBoundingClientRect();this.$hud.css({width:this.elementIndex.$searchContainer.outerWidth()-2,top:t.top+this.elementIndex.$searchContainer.outerHeight(),left:t.left+1})},onShow:function(){this.base(),this.$clearBtn&&this.$clearBtn.text(Craft.t("app","Clear")),this.elementIndex.updateFilterBtn(),this.setFocus()},onHide:function(){this.base(),this.serialized!==(this.serialized=this.serialize())&&this.elementIndex.updateElements(),this.cleared?this.destroy():(this.$hud.detach(),this.$shade.detach()),this.elementIndex.updateFilterBtn(),this.elementIndex.$filterBtn.focus()},hasRules:function(){return 0!==this.$main.has(".condition-rule").length},serialize:function(){return!this.cleared&&this.hasRules()?this.$body.serialize():null},destroy:function(){this.base(),delete this.elementIndex.filterHuds[this.siteId][this.sourceKey]}})},8495:function(){Craft.BaseElementIndexView=Garnish.Base.extend({$container:null,$loadingMoreSpinner:null,$elementContainer:null,$scroller:null,elementIndex:null,thumbLoader:null,elementSelect:null,loadingMore:!1,_totalVisible:null,_morePending:null,_handleEnableElements:null,_handleDisableElements:null,init:function(t,e,i){var s=this;this.elementIndex=t,this.$container=$(e),this.setSettings(i,Craft.BaseElementIndexView.defaults),this.$loadingMoreSpinner=$('<div class="centeralign hidden"><div class="spinner loadingmore"></div></div>').insertAfter(this.$container),this.$elementContainer=this.getElementContainer();var a=this.$elementContainer.children();this.setTotalVisible(a.length),this.setMorePending(this.settings.batchSize&&a.length==this.settings.batchSize),this.thumbLoader=new Craft.ElementThumbLoader,this.thumbLoader.load(a),this.settings.selectable&&(this.elementSelect=new Garnish.Select(this.$elementContainer,a.filter(":not(.disabled)"),{multi:this.settings.multiSelect,vertical:this.isVerticalList(),handle:"index"===this.settings.context?".checkbox, .element:first":null,filter:":not(a):not(.toggle)",checkboxMode:this.settings.checkboxMode,onSelectionChange:this.onSelectionChange.bind(this)}),this._handleEnableElements=function(t){s.elementSelect.addItems(t.elements)},this._handleDisableElements=function(t){s.elementSelect.removeItems(t.elements)},this.elementIndex.on("enableElements",this._handleEnableElements),this.elementIndex.on("disableElements",this._handleDisableElements)),"index"===this.settings.context&&(this._handleElementEditing=function(t){var e=$(t.target);if("A"!==e.prop("nodeName")){var i;if(e.hasClass("element"))i=e;else if(!(i=e.closest(".element")).length)return;Garnish.hasAttr(i,"data-editable")&&Craft.createElementEditor(i.data("type"),i)}},this.elementIndex.trashed||(this.addListener(this.$elementContainer,"dblclick",this._handleElementEditing),$.isTouchCapable()&&this.addListener(this.$elementContainer,"taphold",this._handleElementEditing))),this.afterInit(),this.settings.batchSize&&("index"===this.settings.context?this.$scroller=Garnish.$scrollContainer:this.$scroller=this.elementIndex.$main,this.$scroller.scrollTop(0),this.addListener(this.$scroller,"scroll","maybeLoadMore"),this.maybeLoadMore())},getElementContainer:function(){throw"Classes that extend Craft.BaseElementIndexView must supply a getElementContainer() method."},afterInit:function(){},getAllElements:function(){return this.$elementContainer.children()},getEnabledElements:function(){return this.$elementContainer.children(":not(.disabled)")},getElementById:function(t){var e=this.$elementContainer.children('[data-id="'+t+'"]:first');return e.length?e:null},getSelectedElements:function(){if(!this.elementSelect)throw"This view is not selectable.";return this.elementSelect.$selectedItems},getSelectedElementIds:function(){var t;try{t=this.getSelectedElements()}catch(t){}var e=[];if(t)for(var i=0;i<t.length;i++)e.push(t.eq(i).data("id"));return e},selectElement:function(t){if(!this.elementSelect)throw"This view is not selectable.";return this.elementSelect.selectItem(t,!0),!0},selectElementById:function(t){if(!this.elementSelect)throw"This view is not selectable.";var e=this.getElementById(t);return!!e&&(this.elementSelect.selectItem(e,!0),!0)},selectAllElements:function(){this.elementSelect.selectAll()},deselectAllElements:function(){this.elementSelect.deselectAll()},isVerticalList:function(){return!1},getTotalVisible:function(){return this._totalVisible},setTotalVisible:function(t){this._totalVisible=t},getMorePending:function(){return this._morePending},setMorePending:function(t){this._morePending=t},maybeLoadMore:function(){this.canLoadMore()&&this.loadMore()},canLoadMore:function(){return!(!this.getMorePending()||!this.settings.batchSize)&&(this.$scroller[0]===Garnish.$win[0]?Garnish.$win.innerHeight()+Garnish.$win.scrollTop()>=this.$container.offset().top+this.$container.height():this.$scroller.prop("scrollHeight")-this.$scroller.scrollTop()<=this.$scroller.outerHeight()+15)},loadMore:function(){var t=this;this.getMorePending()&&!this.loadingMore&&this.settings.batchSize&&(this.loadingMore=!0,this.$loadingMoreSpinner.removeClass("hidden"),this.removeListener(this.$scroller,"scroll"),Craft.sendActionRequest("POST",this.settings.loadMoreElementsAction,{data:this.getLoadMoreParams()}).then((function(e){t.loadingMore=!1,t.$loadingMoreSpinner.addClass("hidden");var i=$(e.data.html);t.appendElements(i),Craft.appendHeadHtml(e.data.headHtml),Craft.appendBodyHtml(e.data.bodyHtml),t.elementSelect&&(t.elementSelect.addItems(i.filter(":not(.disabled)")),t.elementIndex.updateActionTriggers()),t.setTotalVisible(t.getTotalVisible()+i.length),t.setMorePending(i.length==t.settings.batchSize),t.addListener(t.$scroller,"scroll","maybeLoadMore"),t.maybeLoadMore()})).catch((function(e){t.loadingMore=!1,t.$loadingMoreSpinner.addClass("hidden")})))},getLoadMoreParams:function(){var t=$.extend(!0,{},this.settings.params);return t.criteria.offset=this.getTotalVisible(),t},appendElements:function(t){t.appendTo(this.$elementContainer),this.thumbLoader.load(t),this.onAppendElements(t)},onAppendElements:function(t){this.settings.onAppendElements(t),this.trigger("appendElements",{newElements:t})},onSelectionChange:function(){this.settings.onSelectionChange(),this.trigger("selectionChange")},disable:function(){this.elementSelect&&this.elementSelect.disable()},enable:function(){this.elementSelect&&this.elementSelect.enable()},destroy:function(){this.$loadingMoreSpinner.remove(),this.thumbLoader.destroy(),delete this.thumbLoader,this.elementSelect&&(this.elementIndex.off("enableElements",this._handleEnableElements),this.elementIndex.off("disableElements",this._handleDisableElements),this.elementSelect.destroy(),delete this.elementSelect),this.base()}},{defaults:{context:"index",batchSize:null,params:null,selectable:!1,multiSelect:!1,checkboxMode:!1,loadMoreElementsAction:"element-indexes/get-more-elements",onAppendElements:$.noop,onSelectionChange:$.noop}})},5970:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.BaseElementSelectInput=Garnish.Base.extend({thumbLoader:null,elementSelect:null,elementSort:null,modal:null,elementEditor:null,fieldLabel:null,$container:null,$form:null,$elementsContainer:null,$elements:null,$addElementBtn:null,$spinner:null,_initialized:!1,init:function(t){var e=this;if(!$.isPlainObject(t)){for(var i={},s=["id","name","elementType","sources","criteria","sourceElementId","limit","modalStorageKey","fieldId"],a=0;a<s.length&&void 0!==arguments[a];a++)i[s[a]]=arguments[a];t=i}this.setSettings(t,Craft.BaseElementSelectInput.defaults),this.settings.modalStorageKey&&(this.modalStorageKey="BaseElementSelectInput."+this.settings.modalStorageKey),(1==this.settings.limit||this.settings.maintainHierarchy)&&(this.settings.sortable=!1),this.$container=this.getContainer(),this.$form=this.$container.closest("form"),this.fieldLabel=this.getFieldLabel(),this.$container.data("elementSelect",this),this.$elementsContainer=this.getElementsContainer(),this.$addElementBtn=this.getAddElementsBtn(),this.$spinner=this.getSpinner(),this.thumbLoader=new Craft.ElementThumbLoader,this.initElementSelect(),this.initElementSort(),this.resetElements(),this.$addElementBtn&&this.addListener(this.$addElementBtn,"activate","showModal"),Garnish.requestAnimationFrame((function(){e._initialized=!0}))},get totalSelected(){return this.$elements.length},getContainer:function(){return $("#"+this.settings.id)},getFieldLabel:function(){if(this.$container)return this.$container.closest("fieldset").find("legend").first().data("label")},getElementsContainer:function(){return this.$container.children(".elements")},getElements:function(){return this.$elementsContainer.find(".element")},getAddElementsBtn:function(){return this.$container.find(".btn.add:first")},getSpinner:function(){return this.$container.find(".spinner")},initElementSelect:function(){this.settings.selectable&&(this.elementSelect=new Garnish.Select({multi:this.settings.sortable,filter:":not(.delete)"}))},initElementSort:function(){var t=this;this.settings.sortable&&(this.elementSort=new Garnish.DragSort({container:this.$elementsContainer,filter:this.settings.selectable?function(){return t.elementSort.$targetItem.hasClass("sel")?t.elementSelect.getSelectedItems():t.elementSort.$targetItem}:null,ignoreHandleSelector:".delete",axis:this.getElementSortAxis(),collapseDraggees:!0,magnetStrength:4,helperLagBase:1.5,onSortChange:this.settings.selectable?function(){t.elementSelect.resetItemOrder()}:null}))},getElementSortAxis:function(){return"list"===this.settings.viewMode?"y":null},canAddMoreElements:function(){return!this.settings.limit||this.$elements.length<this.settings.limit},updateAddElementsBtn:function(){this.canAddMoreElements()?this.enableAddElementsBtn():this.disableAddElementsBtn()},enableAddElementsBtn:function(){this.$addElementBtn&&this.$addElementBtn.removeClass("hidden"),this.updateButtonContainer()},disableAddElementsBtn:function(){this.$addElementBtn&&this.$addElementBtn.addClass("hidden"),this.updateButtonContainer()},showSpinner:function(){this.$spinner&&this.$spinner.removeClass("hidden"),this.updateButtonContainer()},hideSpinner:function(){this.$spinner&&this.$spinner.addClass("hidden"),this.updateButtonContainer()},updateButtonContainer:function(){var t=this.$addElementBtn&&this.$addElementBtn.parent(".flex");t&&t.length&&(t.children(":not(.hidden)").length?t.removeClass("hidden"):t.addClass("hidden"))},focusNextLogicalElement:function(){if(this.canAddMoreElements()){var t=this.$addElementBtn;t&&t.get(0).focus()}else this.focusLastRemoveBtn()},focusLastRemoveBtn:function(){var t=this.$container.find(".delete");t.length&&t.last()[0].focus()},resetElements:function(){null!==this.$elements?this.removeElements(this.$elements):this.$elements=$(),this.addElements(this.getElements())},addElements:function(t){var e=this;this.thumbLoader.load(t),this.settings.selectable&&this.elementSelect.addItems(t),this.settings.sortable&&this.elementSort.addItems(t),this.settings.editable&&(this._handleShowElementEditor=function(t){var i=$(t.currentTarget);!Garnish.hasAttr(i,"data-editable")||i.hasClass("disabled")||i.hasClass("loading")||(e.elementEditor=e.createElementEditor(i))},this.addListener(t,"dblclick",this._handleShowElementEditor),$.isTouchCapable()&&this.addListener(t,"taphold",this._handleShowElementEditor)),t.find(".delete").on("click dblclick",(function(t){e.removeElement($(t.currentTarget).closest(".element")),t.stopPropagation()})),t.on("keydown",(function(t){if([Garnish.BACKSPACE_KEY,Garnish.DELETE_KEY].includes(t.keyCode)){t.stopPropagation(),t.preventDefault();for(var i=e.elementSelect.getSelectedItems(),s=0;s<i.length;s++)e.removeElement(i.eq(s))}})),this.$elements=this.$elements.add(t),this.updateAddElementsBtn(),this.onAddElements()},createElementEditor:function(t,e){return e=Object.assign({elementSelectInput:this,prevalidate:this.settings.prevalidate},e),Craft.createElementEditor(this.settings.elementType,t,e)},replaceElement:function(t,e){var i=this;return new Promise((function(s,a){var n=i.$elements.filter('[data-id="'.concat(t,'"]'));if(n.length){i.showSpinner();var r={elementId:e,siteId:i.settings.criteria.siteId,thumbSize:i.settings.viewMode};Craft.sendActionRequest("POST","elements/get-element-html",{data:r}).then((function(t){i.removeElement(n);var e=Craft.getElementInfo(t.data.html);i.selectElements([e]),s()})).catch((function(t){var e=t.response;e&&e.data&&e.data.message?alert(e.data.message):Craft.cp.displayError(),a(e.data.message)})).finally((function(){i.hideSpinner()}))}else a("No element selected with an ID of ".concat(t,"."))}))},removeElements:function(t){if(this.settings.selectable&&this.elementSelect.removeItems(t),this.modal){for(var e=[],i=0;i<t.length;i++){var s=t.eq(i).data("id");s&&e.push(s)}e.length&&this.modal.elementIndex.enableElementsById(e)}var a;if(t.children("input").prop("disabled",!0),this.settings.selectable){var n=this.$elements.index(t.last());a=this.$elements.eq(n+1).find(".delete")}a.length?a.focus():this.focusNextLogicalElement(),this.$elements=this.$elements.not(t),this.updateAddElementsBtn(),this.onRemoveElements()},removeElement:function(t){if(this.settings.maintainHierarchy){var e=t.add(t.parent().siblings("ul").find(".element"));$("[name]",e).removeAttr("name"),this.removeElements(e);for(var i=0;i<e.length;i++)this._animateStructureElementAway(e,i)}else $("[name]",t).removeAttr("name"),this.removeElements(t),this.animateElementAway(t,(function(){t.remove()}))},animateElementAway:function(t,e){t.css("z-index",0);var i={opacity:-1};i["margin-"+Craft.left]=-(t.outerWidth()+parseInt(t.css("margin-"+Craft.right))),"list"!==this.settings.viewMode&&0!==this.$elements.length||(i["margin-bottom"]=-(t.outerHeight()+parseInt(t.css("margin-bottom")))),t.velocity(i,Craft.BaseElementSelectInput.REMOVE_FX_DURATION,(function(){e&&e()}))},showModal:function(){this.canAddMoreElements()&&(this.modal?this.modal.show():this.modal=this.createModal())},createModal:function(){return Craft.createElementSelectorModal(this.settings.elementType,this.getModalSettings())},getModalSettings:function(){return $.extend({closeOtherModals:!1,storageKey:this.modalStorageKey,sources:this.settings.sources,condition:this.settings.condition,criteria:this.settings.criteria,multiSelect:1!=this.settings.limit,hideOnSelect:!this.settings.maintainHierarchy,showSiteMenu:this.settings.showSiteMenu,disabledElementIds:this.getDisabledElementIds(),onSelect:this.onModalSelect.bind(this),onHide:this.onModalHide.bind(this),triggerElement:this.$addElementBtn,modalTitle:Craft.t("app","Select {element}",{element:this.fieldLabel})},this.settings.modalSettings)},getSelectedElementIds:function(){for(var t=[],e=0;e<this.$elements.length;e++)t.push(this.$elements.eq(e).data("id"));return t},getDisabledElementIds:function(){var e,i=this.getSelectedElementIds();return!this.settings.allowSelfRelations&&this.settings.sourceElementId&&i.push(this.settings.sourceElementId),this.settings.disabledElementIds&&i.push.apply(i,function(e){if(Array.isArray(e))return t(e)}(e=this.settings.disabledElementIds)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(e)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),i},onModalSelect:function(t){if(this.settings.maintainHierarchy)this.selectStructuredElements(t);else{if(this.settings.limit){var e=this.settings.limit-this.$elements.length;t.length>e&&(t=t.slice(0,e))}this.selectElements(t),this.updateDisabledElementsInModal()}},onModalHide:function(){var t=this;this.canAddMoreElements()||setTimeout((function(){t.focusNextLogicalElement()}),200)},selectElements:function(t){for(var e=0;e<t.length;e++){var i=t[e],s=this.createNewElement(i);this.appendElement(s),this.addElements(s),this.animateElementIntoPlace(i.$element,s),i.$element=s}this.onSelectElements(t)},selectStructuredElements:function(t){var e=this;this.modal.disable(),this.modal.disableCancelBtn(),this.modal.disableSelectBtn(),this.modal.showFooterSpinner();for(var i=this.getSelectedElementIds(),s=0;s<t.length;s++)i.push(t[s].id);var a={elementIds:i,siteId:t[0].siteId,containerId:this.settings.id,name:this.settings.name,branchLimit:this.settings.branchLimit,selectionLabel:this.settings.selectionLabel,elementType:this.settings.elementType},n=function(){e.modal.enable(),e.modal.enableCancelBtn(),e.modal.enableSelectBtn(),e.modal.hideFooterSpinner()};Craft.sendActionRequest("POST","relational-fields/structured-input-html",{data:a}).then((function(i){n();var s=$(i.data.html).children(".elements");e.$elementsContainer.replaceWith(s),e.$elementsContainer=s,e.resetElements();for(var a=[],r=0;r<t.length;r++){var o=t[r],l=e.getElementById(o.id);l&&(e.animateElementIntoPlace(o.$element,l),a.push(o))}e.updateDisabledElementsInModal(),e.modal.hide(),e.onSelectElements(a)})).catch((function(t){t.response,n()}))},createNewElement:function(t){var e=t.$element.clone(),i=Craft.t("app","Remove {label}",{label:Craft.escapeHtml(t.label)});return Craft.setElementSize(e,"large"===this.settings.viewMode?"large":"small"),e.addClass("removable").prepend($("<input/>",{type:"hidden",name:this.settings.name+(this.settings.single?"":"[]"),value:t.id})).prepend($("<button/>",{type:"button",class:"delete icon",title:Craft.t("app","Remove"),"aria-label":i})),e},appendElement:function(t){t.appendTo(this.$elementsContainer)},animateElementIntoPlace:function(t,e){var i=t.offset(),s=e.offset(),a=e.clone().appendTo(Garnish.$bod);e.css("visibility","hidden"),a.css({position:"absolute",zIndex:1e4,top:i.top,left:i.left});var n={top:s.top,left:s.left};a.velocity(n,Craft.BaseElementSelectInput.ADD_FX_DURATION,(function(){a.remove(),e.css("visibility","visible")}))},updateDisabledElementsInModal:function(){this.modal.elementIndex&&this.modal.elementIndex.disableElementsById(this.getDisabledElementIds())},getElementById:function(t){for(var e=0;e<this.$elements.length;e++){var i=this.$elements.eq(e);if(i.data("id")==t)return i}},onSelectElements:function(t){this.trigger("selectElements",{elements:t}),this.settings.onSelectElements(t),this.$container.trigger("change")},onAddElements:function(){this.trigger("addElements"),this.settings.onAddElements(),this.$container.trigger("change")},onRemoveElements:function(){this.trigger("removeElements"),this.settings.onRemoveElements(),this.$container.trigger("change")},_animateStructureElementAway:function(t,e){var i,s=this;e===t.length-1&&(i=function(){var e=t.first().parent().parent(),i=e.parent();i[0]===s.$elementsContainer[0]||e.siblings().length?e.remove():i.remove()});var a=function(){s.animateElementAway(t.eq(e),i)};0===e?a():setTimeout(a,100*e)}},{ADD_FX_DURATION:200,REMOVE_FX_DURATION:200,defaults:{id:null,name:null,fieldId:null,elementType:null,sources:null,condition:null,criteria:{},allowSelfRelations:!1,sourceElementId:null,disabledElementIds:null,viewMode:"list",single:!1,maintainHierarchy:!1,branchLimit:null,limit:null,showSiteMenu:!1,modalStorageKey:null,modalSettings:{},onAddElements:$.noop,onSelectElements:$.noop,onRemoveElements:$.noop,sortable:!0,selectable:!0,editable:!0,prevalidate:!1,editorSettings:{}}})},4993:function(){Craft.BaseElementSelectorModal=Garnish.Modal.extend({elementType:null,elementIndex:null,supportSidebarToggleView:!1,$body:null,$content:null,$footer:null,$selectBtn:null,$sidebar:null,$sources:null,$sourceToggles:null,$sidebarToggleBtn:null,$sidebarCloseBtn:null,$mainHeading:null,$main:null,$search:null,$elements:null,$tbody:null,$primaryButtons:null,$secondaryButtons:null,$cancelBtn:null,init:function(t,e){this.elementType=t,this.setSettings(e,Craft.BaseElementSelectorModal.defaults);var i="elementSelectorModalHeading-"+Date.now(),s=$('<div class="modal elementselectormodal" aria-labelledby="'+i+'"></div>').appendTo(Garnish.$bod),a=($('<h1 id="'+i+'" class="visually-hidden">'+this.settings.modalTitle+"</h1>").appendTo(s),$('<div class="body"><div class="spinner big"></div></div>').appendTo(s));this.$footer=$('<div class="footer"/>').appendTo(s),this.settings.fullscreen&&(s.addClass("fullscreen"),this.settings.minGutter=0),this.base(s,this.settings),this.$secondaryButtons=$('<div class="buttons left secondary-buttons"/>').appendTo(this.$footer),this.$primaryButtons=$('<div class="buttons right"/>').appendTo(this.$footer),this.$cancelBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(this.$primaryButtons),this.$selectBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Select"),spinner:!0}).attr("aria-disabled","true").appendTo(this.$primaryButtons),this.$body=a,this.addListener(this.$cancelBtn,"activate","cancel"),this.addListener(this.$selectBtn,"activate","selectElements")},updateModalBottomPadding:function(){var t=this.$footer.outerHeight();t!==parseInt(this.$container.css("padding-bottom"))&&this.$container.css("padding-bottom",t)},updateSidebarView:function(){this.supportSidebarToggleView&&(this.sidebarShouldBeHidden()?this.$sidebarToggleBtn||this.buildSidebarToggleView():this.$sidebarToggleBtn&&this.resetView())},sidebarShouldBeHidden:function(){return this.$container.outerWidth()<550},resetView:function(){this.$mainHeader&&this.$mainHeader.remove(),this.$sidebarHeader&&this.$sidebarHeader.remove(),this.$sidebarToggleBtn=null,this.$body.addClass("has-sidebar"),this.$content.addClass("has-sidebar"),this.$sidebar.removeClass("hidden")},buildSidebarToggleView:function(){var t=this;!this.$sidebarToggleBtn&&this.sidebarShouldBeHidden()&&(this.$sidebarHeader=$('<div class="sidebar-header"/>').prependTo(this.$sidebar),this.$sidebarCloseBtn=Craft.ui.createButton({class:"nav-close close-btn"}).attr("aria-label",Craft.t("app","Close")).removeClass("btn").appendTo(this.$sidebarHeader),this.$mainHeader=$('<div class="main-header"/>').prependTo(this.$main),this.$mainHeading=$('<h2 class="main-heading">'.concat(this.getActiveSourceName(),"</h2>")).appendTo(this.$mainHeader),this.$sidebarToggleBtn=Craft.ui.createButton({toggle:!0,controls:"modal-sidebar",class:"nav-toggle"}).removeClass("btn").attr("aria-label",Craft.t("app","Show sidebar")).appendTo(this.$mainHeader),this.$sidebar.attr("id","modal-sidebar"),this.closeSidebar(),this.addListener(this.$sidebarToggleBtn,"click",(function(){t.toggleSidebar()})),this.addListener(this.$sidebarCloseBtn,"click",(function(){t.toggleSidebar()})))},sidebarIsOpen:function(){return"true"===this.$sidebarToggleBtn.attr("aria-expanded")},toggleSidebar:function(){this.sidebarIsOpen()?this.closeSidebar():this.openSidebar()},openSidebar:function(){var t=this;this.$body.addClass("has-sidebar"),this.$content.addClass("has-sidebar"),this.$sidebar.removeClass("hidden"),this.$sidebarToggleBtn.attr("aria-expanded","true"),this.$sidebar.find(":focusable").first().focus(),Garnish.uiLayerManager.addLayer(this.$sidebar),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.closeSidebar();var e=Garnish.getFocusedElement();$.contains(t.$sidebar.get(0),e.get(0))&&t.$sidebarToggleBtn.focus()}))},closeSidebar:function(){this.$sidebarToggleBtn&&(this.sidebarIsOpen()&&(Garnish.uiLayerManager.removeLayer(),this.$sidebar.addClass("hidden"),this.$sidebarToggleBtn.attr("aria-expanded","false")),this.$body.removeClass("has-sidebar"),this.$content.removeClass("has-sidebar"))},getActiveSourceName:function(){return this.$sidebar.find(".sel").text()},onFadeIn:function(){this.elementIndex?Garnish.isMobileBrowser(!0)||this.elementIndex.$search.trigger("focus"):this._createElementIndex(),this.base()},onSelectionChange:function(){this.updateSelectBtnState()},onSelectSource:function(){this.updateHeading(),this.updateModalBottomPadding()},updateHeading:function(){this.$mainHeading&&this.$mainHeading.text(this.getActiveSourceName())},updateSelectBtnState:function(){this.$selectBtn&&(this.elementIndex.getSelectedElements().length?this.enableSelectBtn():this.disableSelectBtn())},enableSelectBtn:function(){this.$selectBtn.removeClass("disabled").attr("aria-disabled","false")},disableSelectBtn:function(){this.$selectBtn.addClass("disabled").attr("aria-disabled","true")},enableCancelBtn:function(){this.$cancelBtn.removeClass("disabled")},disableCancelBtn:function(){this.$cancelBtn.addClass("disabled")},showFooterSpinner:function(){this.$selectBtn.addClass("loading")},hideFooterSpinner:function(){this.$selectBtn.removeClass("loading")},cancel:function(){this.$cancelBtn.hasClass("disabled")||this.hide()},selectElements:function(){if(this.elementIndex&&this.elementIndex.getSelectedElements().length){this.elementIndex.view.elementSelect.clearMouseUpTimeout();var t=this.elementIndex.getSelectedElements(),e=this.getElementInfo(t);this.onSelect(e),this.settings.disableElementsOnSelect&&this.elementIndex.disableElements(this.elementIndex.getSelectedElements()),this.settings.hideOnSelect&&this.hide()}},getElementInfo:function(t){for(var e=[],i=0;i<t.length;i++){var s=$(t[i]),a=Craft.getElementInfo(s);e.push(a)}return e},onShow:function(){this.updateSelectBtnState(),this.addListener(Garnish.$win,"resize",this.updateSidebarView),this.addListener(Garnish.$win,"resize",this.updateModalBottomPadding),this.updateModalBottomPadding(),this.updateSidebarView(),this.base()},onHide:function(){this.closeSidebar(),this.base()},onSelect:function(t){this.settings.onSelect(t)},disable:function(){this.elementIndex&&this.elementIndex.disable(),this.base()},enable:function(){this.elementIndex&&this.elementIndex.enable(),this.base()},_createElementIndex:function(){var t=this,e={context:"modal",elementType:this.elementType,sources:this.settings.sources};null!==this.settings.showSiteMenu&&"auto"!==this.settings.showSiteMenu&&(e.showSiteMenu=this.settings.showSiteMenu?"1":"0"),Craft.sendActionRequest("POST",this.settings.bodyAction,{data:e}).then((function(e){t.$body.html(e.data.html),t.$body.has(".sidebar:not(.hidden)").length&&(t.$body.addClass("has-sidebar"),t.supportSidebarToggleView=!0),t.elementIndex=Craft.createElementIndex(t.elementType,t.$body,Object.assign({context:"modal",modal:t,storageKey:t.settings.storageKey,condition:t.settings.condition,criteria:t.settings.criteria,disabledElementIds:t.settings.disabledElementIds,selectable:!0,multiSelect:t.settings.multiSelect,buttonContainer:t.$secondaryButtons,onSelectionChange:t.onSelectionChange.bind(t),onSelectSource:t.onSelectSource.bind(t),hideSidebar:t.settings.hideSidebar,defaultSiteId:t.settings.defaultSiteId,defaultSource:t.settings.defaultSource},t.settings.indexSettings)),t.$main=t.elementIndex.$main,t.$sidebar=t.elementIndex.$sidebar,t.$content=t.$body.find(".content"),t.updateSidebarView(),t.updateModalBottomPadding(),t.addListener(t.elementIndex.$elements,"doubletap",(function(t,e){e.firstTap.target===e.secondTap.target&&this.selectElements()}))}))}},{defaults:{fullscreen:!1,resizable:!0,storageKey:null,sources:null,condition:null,criteria:null,multiSelect:!1,showSiteMenu:null,disabledElementIds:[],disableElementsOnSelect:!1,hideOnSelect:!0,modalTitle:Craft.t("app","Select element"),onCancel:$.noop,onSelect:$.noop,hideSidebar:!1,defaultSiteId:null,defaultSource:null,bodyAction:"element-selector-modals/body",indexSettings:{}}})},8843:function(){Craft.BaseInputGenerator=Garnish.Base.extend({$source:null,$target:null,$form:null,settings:null,listening:null,timeout:null,init:function(t,e,i){this.$source=$(t),this.$target=$(e),this.$form=this.$source.closest("form"),this.setSettings(i),this.startListening()},setNewSource:function(t){var e=this.listening;this.stopListening(),this.$source=$(t),e&&this.startListening()},startListening:function(){this.listening||(this.listening=!0,this.addListener(this.$source,"input","onSourceTextChange"),this.addListener(this.$target,"input","onTargetTextChange"),this.addListener(this.$form,"submit","onFormSubmit"))},stopListening:function(){this.listening&&(this.listening=!1,this.timeout&&clearTimeout(this.timeout),this.removeAllListeners(this.$source),this.removeAllListeners(this.$target),this.removeAllListeners(this.$form))},onSourceTextChange:function(){this.timeout&&clearTimeout(this.timeout),this.timeout=setTimeout(this.updateTarget.bind(this),250)},onTargetTextChange:function(){this.$target.get(0)===document.activeElement&&this.stopListening()},onFormSubmit:function(){this.timeout&&clearTimeout(this.timeout),this.updateTarget()},updateTarget:function(){if(this.$target.is(":visible")){var t=this.$source.val();if(void 0!==t){var e=this.generateTargetValue(t);this.$target.val(e);for(var i=0;i<this.$target.length;i++)this.$target[i].dispatchEvent(new InputEvent("input",{inputType:"insertText"})),this.$target[i].dispatchEvent(new Event("input"));this.$target.is(":focus")&&Craft.selectFullValue(this.$target)}}},generateTargetValue:function(t){return t}})},3778:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.CategoryIndex=Craft.BaseElementIndex.extend({editableGroups:null,$newCategoryBtnGroup:null,$newCategoryBtn:null,init:function(t,e,i){this.editableGroups=[],this.on("selectSource",this.updateButton.bind(this)),this.on("selectSite",this.updateButton.bind(this)),this.base(t,e,i)},afterInit:function(){var t=this;this.editableGroups=Craft.editableCategoryGroups.filter((function(e){return!!t.getSourceByKey("group:".concat(e.uid))})),this.base()},getDefaultSourceKey:function(){if("index"===this.settings.context&&"undefined"!=typeof defaultGroupHandle)for(var t=0;t<this.$sources.length;t++){var e=$(this.$sources[t]);if(e.data("handle")===defaultGroupHandle)return e.data("key")}return this.base()},updateButton:function(){var e=this;if(this.$source){var i=this.$source.data("handle");if(this.editableGroups.length&&function(){e.$newCategoryBtnGroup&&e.$newCategoryBtnGroup.remove();var s,a=e.editableGroups.find((function(t){return t.handle===i}));e.$newCategoryBtnGroup=$('<div class="btngroup submit" data-wrapper/>');var n="new-category-menu-"+Craft.randomString(10);if(a){var r="index"===e.settings.context?Craft.t("app","New category"):Craft.t("app","New {group} category",{group:a.name}),o="index"===e.settings.context?Craft.t("app","New category in the {group} category group",{group:a.name}):r,l="index"===e.settings.context?"link":null;e.$newCategoryBtn=Craft.ui.createButton({label:r,ariaLabel:o,spinner:!0,role:l}).addClass("submit add icon").appendTo(e.$newCategoryBtnGroup),e.addListener(e.$newCategoryBtn,"click mousedown",(function(t){"index"===e.settings.context&&("click"===t.type&&Garnish.isCtrlKeyPressed(t)||"mousedown"===t.type&&1===t.originalEvent.button)?window.open(Craft.getUrl("categories/".concat(a.handle,"/new"))):"click"===t.type&&e._createCategory(a.id)})),e.editableGroups.length>1&&(s=$("<button/>",{type:"button",class:"btn submit menubtn btngroup-btn-last","aria-controls":n,"data-disclosure-trigger":"","aria-label":Craft.t("app","New category, choose a category group")}).appendTo(e.$newCategoryBtnGroup))}else e.$newCategoryBtn=s=Craft.ui.createButton({label:Craft.t("app","New category"),ariaLabel:Craft.t("app","New category, choose a category group"),spinner:!0}).addClass("submit add icon menubtn btngroup-btn-last").attr("aria-controls",n).attr("data-disclosure-trigger","").appendTo(e.$newCategoryBtnGroup);if(e.addButton(e.$newCategoryBtnGroup),s){var h,d=$("<div/>",{id:n,class:"menu menu--disclosure"}).appendTo(e.$newCategoryBtnGroup),c=$("<ul/>").appendTo(d),u=function(e,i){var s="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!s){if(Array.isArray(e)||(s=function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e))||i&&e&&"number"==typeof e.length){s&&(e=s);var a=0,n=function(){};return{s:n,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){s=s.call(e)},n:function(){var t=s.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==s.return||s.return()}finally{if(l)throw r}}}}(e.editableGroups);try{var p=function(){var t=h.value,i="index"===e.settings.context?"link":"button";if("index"===e.settings.context||t!==a){var n=$("<li/>").appendTo(c),r=$("<a/>",{role:"button"===i?"button":null,href:"#",type:"button"===i?"button":null,text:Craft.t("app","New {group} category",{group:t.name})}).appendTo(n);e.addListener(r,"click",(function(){s.data("trigger").hide(),e._createCategory(t.id)})),"button"===i&&e.addListener(r,"keydown",(function(i){i.keyCode===Garnish.SPACE_KEY&&(i.preventDefault(),s.data("trigger").hide(),e._createCategory(t.id))}))}};for(u.s();!(h=u.n()).done;)p()}catch(t){u.e(t)}finally{u.f()}new Garnish.DisclosureMenu(s)}}(),"index"===this.settings.context){var s="categories";i&&(s+="/"+i),Craft.setPath(s)}}},_createCategory:function(t){var e=this;if(this.$newCategoryBtn.hasClass("loading"))console.warn("New category creation already in progress.");else{var i=this.editableGroups.find((function(e){return e.id===t}));if(!i)throw"Invalid category group ID: ".concat(t);this.$newCategoryBtn.addClass("loading"),Craft.sendActionRequest("POST","elements/create",{data:{elementType:this.elementType,siteId:this.siteId,groupId:t}}).then((function(t){"index"===e.settings.context?document.location.href=Craft.getUrl(t.data.cpEditUrl,{fresh:1}):Craft.createElementEditor(e.elementType,{siteId:e.siteId,elementId:t.data.element.id,draftId:t.data.element.draftId,params:{fresh:1}}).on("submit",(function(){var s="group:".concat(i.uid);e.sourceKey!==s&&e.selectSourceByKey(s),e.clearSearch(),e.selectElementAfterUpdate(t.data.element.id),e.updateElements()}))})).finally((function(){e.$newCategoryBtn.removeClass("loading")}))}}}),Craft.registerElementIndexClass("craft\\elements\\Category",Craft.CategoryIndex)},6617:function(){Craft.CategorySelectInput=Craft.BaseElementSelectInput.extend({setSettings:function(){this.base.apply(this,arguments),this.settings.sortable=!1},getModalSettings:function(){var t=this.base();return t.hideOnSelect=!1,t},getElements:function(){return this.$elementsContainer.find(".element")},onModalSelect:function(t){var e=this;this.modal.disable(),this.modal.disableCancelBtn(),this.modal.disableSelectBtn(),this.modal.showFooterSpinner();for(var i=this.getSelectedElementIds(),s=0;s<t.length;s++)i.push(t[s].id);var a={categoryIds:i,siteId:t[0].siteId,id:this.settings.id,name:this.settings.name,branchLimit:this.settings.branchLimit,selectionLabel:this.settings.selectionLabel},n=function(){e.modal.enable(),e.modal.enableCancelBtn(),e.modal.enableSelectBtn(),e.modal.hideFooterSpinner()};Craft.sendActionRequest("POST","categories/input-html",{data:a}).then((function(i){n();var s=$(i.data.html).children(".elements");e.$elementsContainer.replaceWith(s),e.$elementsContainer=s,e.resetElements();for(var a=[],r=0;r<t.length;r++){var o=t[r],l=e.getElementById(o.id);l&&(e.animateElementIntoPlace(o.$element,l),a.push(o))}e.updateDisabledElementsInModal(),e.modal.hide(),e.onSelectElements(a)})).catch((function(t){t.response,n()}))},removeElement:function(t){var e=t.add(t.parent().siblings("ul").find(".element"));this.removeElements(e);for(var i=0;i<e.length;i++)this._animateCategoryAway(e,i)},_animateCategoryAway:function(t,e){var i,s=this;e===t.length-1&&(i=function(){var e=t.first().parent().parent(),i=e.parent();i[0]===s.$elementsContainer[0]||e.siblings().length?e.remove():i.remove()});var a=function(){s.animateElementAway(t.eq(e),i)};0===e?a():setTimeout(a,100*e)}})},9482:function(){Craft.charts={},Craft.charts.DataTable=Garnish.Base.extend({columns:null,rows:null,init:function(t){var e=t.columns,i=t.rows;i.forEach((function(t){$.each(t,(function(i){var s;switch(e[i].type){case"date":s=d3.timeParse("%Y-%m-%d"),t[i]=s(t[i]);break;case"datetime":s=d3.timeParse("%Y-%m-%d %H:00:00"),t[i]=s(t[i]);break;case"percent":t[i]=t[i]/100;break;case"number":t[i]=+t[i]}}))})),this.columns=e,this.rows=i}}),Craft.charts.Tip=Garnish.Base.extend({$container:null,$tip:null,init:function(t){this.$container=t,this.$tip=$('<div class="tooltip"></div>').appendTo(this.$container),this.hide()},setContent:function(t){this.$tip.html(t)},setPosition:function(t){this.$tip.css("left","".concat(t.left,"px")),this.$tip.css("top","".concat(t.top,"px"))},show:function(){this.$tip.css("display","block")},hide:function(){this.$tip.css("display","none")}}),Craft.charts.BaseChart=Garnish.Base.extend({$container:null,$chart:null,chartBaseClass:"cp-chart",dataTable:null,formatLocale:null,timeFormatLocale:null,orientation:null,svg:null,width:null,height:null,init:function(t,e){var i=this;this.$container=t,this.setSettings(Craft.charts.BaseChart.defaults),this.setSettings(e);var s={formats:window.d3Formats,formatLocaleDefinition:window.d3FormatLocaleDefinition,timeFormatLocaleDefinition:window.d3TimeFormatLocaleDefinition};this.setSettings(s),d3.select(window).on("resize",(function(){i.resize()}))},setSettings:function(t,e){var i=void 0===this.settings?{}:this.settings;this.settings=$.extend(!0,{},i,e,t)},draw:function(t,e){this.setSettings(e),this.dataTable=t,this.formatLocale=d3.formatLocale(this.settings.formatLocaleDefinition),this.timeFormatLocale=d3.timeFormatLocale(this.settings.timeFormatLocaleDefinition),this.orientation=this.settings.orientation,this.$chart&&this.$chart.remove();var i=this.chartBaseClass;this.settings.chartClass&&(i+=" "+this.settings.chartClass),this.$chart=$('<div class="'.concat(i,'" />')).appendTo(this.$container)},resize:function(){this.draw(this.dataTable,this.settings)},onAfterDrawTicks:function(){$(".tick",this.$chart).each((function(t,e){var i=$("text",e);i.clone().appendTo(e),i.attr("stroke","#ffffff"),i.attr("stroke-width",3)}))}},{defaults:{formatLocaleDefinition:null,timeFormatLocaleDefinition:null,formats:{numberFormat:",.2f",percentFormat:",.2%",currencyFormat:"$,.2f",shortDateFormats:{day:"%-m/%-d",month:"%-m/%y",year:"%Y"}},margin:{top:0,right:0,bottom:0,left:0},chartClass:null,colors:["#0594D1","#DE3800","#FF9A00","#009802","#9B009B"]}}),Craft.charts.Area=Craft.charts.BaseChart.extend({tip:null,drawingArea:null,init:function(t,e){this.base(t,Craft.charts.Area.defaults),this.setSettings(e)},draw:function(t,e){this.base(t,e),this.tip&&(this.tip=null);var i=this.getChartMargin();this.width=this.$chart.width()-i.left-i.right,this.height=this.$chart.height()-i.top-i.bottom;var s={width:this.width+(i.left+i.right),height:this.height+(i.top+i.bottom),translateX:"rtl"!==this.orientation?i.left:i.right,translateY:i.top};this.svg=d3.select(this.$chart.get(0)).append("svg").attr("width",s.width).attr("height",s.height),this.drawingArea=this.svg.append("g").attr("transform","translate(".concat(s.translateX,",").concat(s.translateY,")")),this.drawTicks(),this.drawAxes(),this.drawChart(),this.drawTipTriggers()},drawTicks:function(){var t=this.getX(!0),e=d3.axisBottom(t).tickFormat(this.getXFormatter()).ticks(3);this.drawingArea.append("g").attr("class","x ticks-axis").attr("transform","translate(0, ".concat(this.height,")")).call(e);var i,s=this.getY();"rtl"!==this.orientation?(i=d3.axisLeft(s).tickFormat(this.getYFormatter()).tickValues(this.getYTickValues()).ticks(2),this.drawingArea.append("g").attr("class","y ticks-axis").call(i)):(i=d3.axisRight(s).tickFormat(this.getYFormatter()).tickValues(this.getYTickValues()).ticks(2),this.drawingArea.append("g").attr("class","y ticks-axis").attr("transform","translate(".concat(this.width,",0)")).call(i)),this.onAfterDrawTicks()},drawAxes:function(){if(this.settings.xAxis.showAxis){var t=this.getX(),e=d3.axisBottom(t).ticks(0).tickSizeOuter(0);this.drawingArea.append("g").attr("class","x axis").attr("transform","translate(0, ".concat(this.height,")")).call(e)}if(this.settings.yAxis.showAxis){var i,s=this.getY();"rtl"===this.orientation?(i=d3.axisLeft(s).ticks(0),this.drawingArea.append("g").attr("class","y axis").attr("transform","translate(".concat(this.width-0,", 0)")).call(i)):(i=d3.axisRight(s).ticks(0),this.drawingArea.append("g").attr("class","y axis").attr("transform","translate(".concat(0,", 0)")).call(i))}},drawChart:function(){var t=this.getX(!0),e=this.getY();if(this.settings.xAxis.gridlines){var i=d3.axisBottom(t);this.drawingArea.append("g").attr("class","x grid-line").attr("transform","translate(0,".concat(this.height,")")).call(i.tickSize(-this.height,0,0).tickFormat(""))}if(this.settings.yAxis.gridlines){var s=d3.axisLeft(e);this.drawingArea.append("g").attr("class","y grid-line").attr("transform","translate(0 , 0)").call(s.tickSize(-this.width,0).tickFormat("").tickValues(this.getYTickValues()).ticks(2))}var a=d3.line().x((function(e){return t(e[0])})).y((function(t){return e(t[1])}));this.drawingArea.append("g").attr("class","chart-line").append("path").datum(this.dataTable.rows).style("fill","none").style("stroke",this.settings.colors[0]).style("stroke-width","3px").attr("d",a);var n=d3.area().x((function(e){return t(e[0])})).y0(this.height).y1((function(t){return e(t[1])}));this.drawingArea.append("g").attr("class","chart-area").append("path").datum(this.dataTable.rows).style("fill",this.settings.colors[0]).style("fill-opacity","0.3").attr("d",n),this.settings.plots&&this.drawingArea.append("g").attr("class","plots").selectAll("circle").data(this.dataTable.rows).enter().append("circle").style("fill",this.settings.colors[0]).attr("class",(function(t,e){return"plot plot-".concat(e)})).attr("r",4).attr("cx",(function(e){return t(e[0])})).attr("cy",(function(t){return e(t[1])}))},drawTipTriggers:function(){var t=this;if(this.settings.tips){this.tip||(this.tip=new Craft.charts.Tip(this.$chart));var e=this.getChartMargin(),i=(this.drawingArea.select(".x path.domain").node().getTotalLength()-e.left-e.right-12)/(this.dataTable.rows.length-1),s=Math.max(0,i),a=this.getX(!0),n=this.getY();this.drawingArea.append("g").attr("class","tip-triggers").selectAll("rect").data(this.dataTable.rows).enter().append("rect").attr("class","tip-trigger").style("fill","transparent").style("fill-opacity","1").attr("width",s).attr("height",this.height).attr("x",(function(t){return a(t[0])-s/2})).on("mouseover",(function(e,i){t.drawingArea.select(".plot-"+i).attr("r",5);var s=$("<div />"),r=$('<div class="x-value" />').appendTo(s),o=$('<div class="y-value" />').appendTo(s);r.html(t.getXFormatter()(e[0])),o.html(t.getYFormatter()(e[1]));var l=s.get(0);t.tip.setContent(l);var h,d=t.getChartMargin(),c=24,u=n(e[1])+c;"rtl"!==t.orientation?(h=a(e[0])+d.left+c,t.$chart.offset().left+h+t.tip.$tip.width()>t.$chart.offset().left+t.$chart.width()-c&&(h=a(e[0])-(t.tip.$tip.width()+c))):h=a(e[0])-(t.tip.$tip.width()+d.left+c),h<0&&(h=a(e[0])+d.left+c);var p={top:u,left:h};t.tip.setPosition(p),t.tip.show()})).on("mouseout",(function(e,i){t.drawingArea.select(".plot-"+i).attr("r",4),t.tip.hide()}))}},getChartMargin:function(){var t=this,e=this.settings.margin,i=this.getYTickValues(),s=0;return $.each(i,(function(e,i){var a=8*t.getYFormatter()(i).length;a>s&&(s=a)})),s+=10,e.left=s,e},getX:function(t){var e=d3.min(this.dataTable.rows,(function(t){return t[0]})),i=d3.max(this.dataTable.rows,(function(t){return t[0]})),s=[e,i];"rtl"===this.orientation&&(s=[i,e]);var a=0,n=0;t&&(a=0,n=0);var r=d3.scaleTime().range([a,this.width-n]);return r.domain(s),r},getY:function(){var t=[0,this.getYMaxValue()],e=d3.scaleLinear().range([this.height,0]);return e.domain(t),e},getXFormatter:function(){return this.settings.xAxis.formatter!==$.noop?this.settings.xAxis.formatter(this):Craft.charts.utils.getTimeFormatter(this.timeFormatLocale,this.settings)},getYFormatter:function(){return this.settings.yAxis.formatter!==$.noop?this.settings.yAxis.formatter(this):Craft.charts.utils.getNumberFormatter(this.formatLocale,this.dataTable.columns[1].type,this.settings)},getYMaxValue:function(){return d3.max(this.dataTable.rows,(function(t){return t[1]}))},getYTickValues:function(){var t=this.getYMaxValue();return t>1?[t/2,t]:[0,t]}},{defaults:{chartClass:"area",margin:{top:25,right:5,bottom:25,left:0},plots:!0,tips:!0,xAxis:{gridlines:!1,showAxis:!0,formatter:$.noop},yAxis:{gridlines:!0,showAxis:!1,formatter:$.noop}}}),Craft.charts.utils={getDuration:function(t){var e=parseInt(t,10),i={hours:Math.floor(e/3600),minutes:Math.floor((e-3600*i.hours)/60),seconds:e-3600*i.hours-60*i.minutes};return i.hours<10&&(i.hours="0".concat(i.hours)),i.minutes<10&&(i.minutes="0".concat(i.minutes)),i.seconds<10&&(i.seconds="0".concat(i.seconds)),"".concat(i.hours,":").concat(i.minutes,":").concat(i.seconds)},getTimeFormatter:function(t,e){switch(e.dataScale){case"year":return t.format("%Y");case"month":return t.format(e.formats.shortDateFormats.month);case"hour":return t.format("".concat(e.formats.shortDateFormats.day," %H:00:00"));default:return t.format(e.formats.shortDateFormats.day)}},getNumberFormatter:function(t,e,i){switch(e){case"currency":return t.format(i.formats.currencyFormat);case"percent":return t.format(i.formats.percentFormat);case"time":return Craft.charts.utils.getDuration;case"number":return t.format(i.formats.numberFormat)}}}},3352:function(){Craft.ColorInput=Garnish.Base.extend({$container:null,$input:null,$colorContainer:null,$colorPreview:null,$colorInput:null,init:function(t){this.$container=$(t),this.$input=this.$container.find(".color-input"),this.$colorContainer=this.$container.children(".color"),this.$colorPreview=this.$colorContainer.children(".color-preview"),this.createColorInput(),this.handleTextChange(),this.addListener(this.$input,"input","handleTextChange")},createColorInput:function(){var t=document.createElement("input");t.setAttribute("type","color"),"color"===t.type&&(this.$colorContainer.removeClass("static"),this.$colorInput=$(t).addClass("color-preview-input").attr({"aria-controls":this.$input.attr("id"),"aria-label":Craft.t("app","Color picker")}).appendTo(this.$colorPreview),this.addListener(this.$colorInput,"click",(function(t){t.stopPropagation()})),this.addListener(this.$colorContainer,"click",(function(){this.$colorInput.trigger("click")})),this.addListener(this.$colorInput,"input","updateColor"))},updateColor:function(){this.$input.val(this.$colorInput.val()),this.handleTextChange()},handleTextChange:function(){var t=this.$input.val();t!==(t=Craft.trim(t))&&this.$input.val(t),t.length&&"#"===t[0]&&(t=t.substring(1),this.$input.val(t)),t.length?(3===t.length&&(t=t[0].repeat(2)+t[1].repeat(2)+t[2].repeat(2)),t.match(/^[0-9a-f]{6}$/i)?(this.$colorPreview.css("background-color","#".concat(t)),this.$colorInput&&this.$colorInput.val("#".concat(t))):this.$colorPreview.css("background-color","")):this.$colorPreview.css("background-color","")}},{_browserSupportsColorInputs:null,doesBrowserSupportColorInputs:function(){return Craft.ColorInput._browserSupportsColorInputs,Craft.ColorInput._browserSupportsColorInputs}})},8167:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function e(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}Craft.CpScreenSlideout=Craft.Slideout.extend({action:null,namespace:null,showingLoadSpinner:!1,hasTabs:!1,hasCpLink:!1,hasSidebar:!1,$header:null,$toolbar:null,$tabContainer:null,$loadSpinner:null,$editLink:null,$sidebarBtn:null,$body:null,$content:null,$sidebar:null,$footer:null,$noticeContainer:null,$cancelBtn:null,$saveBtn:null,tabManager:null,showingSidebar:!1,cancelToken:null,ignoreFailedRequest:!1,fieldsWithErrors:null,init:function(t,e){var i=this;this.action=t,this.setSettings(e,Craft.CpScreenSlideout.defaults),this.fieldsWithErrors=[],this.$header=$("<header/>",{class:"pane-header"}),this.$toolbar=$("<div/>",{class:"so-toolbar"}).appendTo(this.$header),this.$tabContainer=$("<div/>",{class:"pane-tabs"}).appendTo(this.$toolbar),this.$loadSpinner=$("<div/>",{class:"spinner",title:Craft.t("app","Loading"),"aria-label":Craft.t("app","Loading")}).appendTo(this.$toolbar),this.$editLink=$("<a/>",{target:"_blank",class:"btn header-btn hidden",title:Craft.t("app","Open the full edit page in a new tab"),"aria-label":Craft.t("app","Open the full edit page in a new tab"),"data-icon":"external"}).appendTo(this.$toolbar),this.$sidebarBtn=$("<button/>",{type:"button",class:"btn header-btn hidden sidebar-btn",title:Craft.t("app","Show sidebar"),"aria-label":Craft.t("app","Show sidebar"),"data-icon":"sidebar-".concat(Garnish.ltr?"right":"left"),"aria-expanded":"false"}).appendTo(this.$toolbar),this.addListener(this.$sidebarBtn,"click",(function(t){t.preventDefault(),i.showingSidebar?i.hideSidebar():i.showSidebar()})),this.$body=$("<div/>",{class:"so-body"}),this.$content=$("<div/>",{class:"so-content"}).appendTo(this.$body),this.$sidebar=$("<div/>",{class:"so-sidebar details hidden"}).appendTo(this.$body),this.$footer=$("<div/>",{class:"so-footer hidden"}),this.$noticeContainer=$("<div/>",{class:"so-notice"}).appendTo(this.$footer),$("<div/>",{class:"flex-grow"}).appendTo(this.$footer);var s=$("<div/>",{class:"flex flex-nowrap"}).appendTo(this.$footer);this.$cancelBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(s),this.$saveBtn=Craft.ui.createSubmitButton({label:Craft.t("app","Save"),spinner:!0}).appendTo(s);var a=this.$header.add(this.$body).add(this.$footer);this.base(a,{containerElement:"form",containerAttributes:{id:"cp-screen-".concat(Math.floor(1e8*Math.random())),action:"",method:"post",novalidate:"",class:"cp-screen"},closeOnEsc:!1,closeOnShadeClick:!1}),this.$container.data("cpScreen",this),this.on("beforeClose",(function(){i.hideSidebar()})),Garnish.uiLayerManager.registerShortcut({keyCode:Garnish.S_KEY,ctrl:!0},(function(t){i.handleSubmit(t)})),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){i.closeMeMaybe()})),this.addListener(this.$cancelBtn,"click",(function(){i.closeMeMaybe()})),this.addListener(this.$shade,"click",(function(){i.closeMeMaybe()})),this.addListener(this.$container,"click",(function(t){var e=$(event.target);!i.showingSidebar||e.closest(i.$sidebarBtn).length||e.closest(i.$sidebar).length||i.hideSidebar()})),this.addListener(this.$container,"submit","handleSubmit"),this.load()},load:function(t,e){var i=this;return new Promise((function(t,s){i.trigger("beforeLoad"),i.showLoadSpinner(),i.cancelToken&&(i.ignoreFailedRequest=!0,i.cancelToken.cancel()),i.cancelToken=axios.CancelToken.source(),Craft.sendActionRequest("GET",i.action,$.extend({params:Object.assign({},i.getParams(),i.settings.params),cancelToken:i.cancelToken.token,headers:{"X-Craft-Container-Id":i.$container.attr("id")}},i.settings.requestOptions)).then((function(a){i.update(a.data).then((function(){!1!==e&&(i.$container.data("delta-names",a.data.deltaNames),i.$container.data("initial-delta-values",a.data.initialDeltaValues),i.$container.data("initialSerializedValue",i.$container.serialize())),t()})).catch((function(t){s(t)}))})).catch((function(t){i.ignoreFailedRequest||(Craft.cp.displayError(),s(t)),i.ignoreFailedRequest=!1})).finally((function(){i.hideLoadSpinner(),i.cancelToken=null}))}))},getParams:function(){return{}},updateHeaderVisibility:function(){var t=this.settings.showHeader||this.hasTabs||this.hasCpLink||this.showingLoadSpinner;t||this.hasSidebar?this.$header.removeClass("hidden"):this.$header.addClass("hidden"),t?this.$header.addClass("so-visible"):this.$header.removeClass("so-visible")},showLoadSpinner:function(){this.$loadSpinner.removeClass("hidden"),this.showingLoadSpinner=!0,this.updateHeaderVisibility()},hideLoadSpinner:function(){this.$loadSpinner.addClass("hidden"),this.showingLoadSpinner=!1,this.updateHeaderVisibility()},update:function(t){var e=this;return new Promise((function(i){e.namespace=t.namespace,e.$content.html(t.content),t.submitButtonLabel&&e.$saveBtn.text(t.submitButtonLabel),e.updateTabs(t.tabs),t.formAttributes&&Craft.setElementAttributes(e.$container,t.formAttributes),t.editUrl?(e.$editLink.removeClass("hidden").attr("href",t.editUrl),e.hasCpLink=!0):(e.$editLink.addClass("hidden"),e.hasCpLink=!1),t.sidebar?(e.$container.addClass("has-sidebar"),e.$sidebarBtn.removeClass("hidden"),e.$sidebar.html(t.sidebar),e.$sidebar.find("a").each((function(){this.hostname.length&&void 0===$(this).attr("target")&&$(this).attr("target","_blank")})),e.hasSidebar=!0):(e.$container.removeClass("has-sidebar"),e.$sidebarBtn.addClass("hidden"),e.$sidebar.addClass("hidden").html(""),e.hasSidebar=!1),t.notice?e.$noticeContainer.html(t.notice):e.$noticeContainer.empty(),e.updateHeaderVisibility(),e.$footer.removeClass("hidden"),Garnish.requestAnimationFrame((function(){Craft.appendHeadHtml(t.headHtml),Craft.appendBodyHtml(t.bodyHtml),Craft.initUiElements(e.$content),(new Craft.ElementThumbLoader).load($(e.$content)),t.sidebar&&(Craft.initUiElements(e.$sidebar),(new Craft.ElementThumbLoader).load(e.$sidebar)),Garnish.isMobileBrowser()||Craft.setFocusWithin(e.$content),i(),e.trigger("load")}))}))},updateTabs:function(t){var e=this;if(this.tabManager&&(this.tabManager.destroy(),this.tabManager=null,this.$tabContainer.html("")),this.hasTabs=!!t,this.hasTabs){var i=$(t);this.$tabContainer.replaceWith(i),this.$tabContainer=i,this.tabManager=new Craft.Tabs(this.$tabContainer),this.tabManager.on("deselectTab",(function(t){$(t.$tab.attr("href")).addClass("hidden")})),this.tabManager.on("selectTab",(function(t){$(t.$tab.attr("href")).removeClass("hidden"),Garnish.$win.trigger("resize"),e.$body.trigger("scroll")}))}},showSidebar:function(){var t=this;this.showingSidebar||(this.$body.scrollTop(0).addClass("no-scroll"),this.$sidebar.off("transitionend.so").css(this._closedSidebarStyles()).removeClass("hidden"),this.$sidebar[0].offsetWidth,this.$sidebar.css(this._openedSidebarStyles()),Garnish.isMobileBrowser()||this.$sidebar.one("transitionend.so",(function(){Craft.setFocusWithin(t.$sidebar)})),Craft.trapFocusWithin(this.$sidebar),this.$sidebarBtn.addClass("active").attr({"aria-expanded":"true"}),Garnish.$win.trigger("resize"),this.$sidebar.trigger("scroll"),Garnish.uiLayerManager.addLayer(),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.hideSidebar()})),this.showingSidebar=!0)},hideSidebar:function(){var t=this;this.showingSidebar&&(this.$body.removeClass("no-scroll"),this.$sidebar.off("transitionend.so").css(this._closedSidebarStyles()).one("transitionend.so",(function(){t.$sidebar.addClass("hidden"),t.$sidebarBtn.focus()})),this.$sidebarBtn.removeClass("active").attr({"aria-expanded":"false"}),Garnish.uiLayerManager.removeLayer(),this.showingSidebar=!1)},_openedSidebarStyles:function(){return e({},Garnish.ltr?"right":"left","0")},_closedSidebarStyles:function(){return e({},Garnish.ltr?"right":"left","-350px")},showSubmitSpinner:function(){this.$saveBtn.addClass("loading")},hideSubmitSpinner:function(){this.$saveBtn.removeClass("loading")},handleSubmit:function(t){t.preventDefault(),this.submit()},submit:function(){var t=this;this.showSubmitSpinner();var e=Craft.findDeltaData(this.$container.data("initialSerializedValue"),this.$container.serialize(),this.$container.data("delta-names"),null,this.$container.data("initial-delta-values"));Craft.sendActionRequest("POST",null,{data:e,headers:{"X-Craft-Namespace":this.namespace}}).then((function(e){t.handleSubmitResponse(e)})).catch((function(e){t.handleSubmitError(e)})).finally((function(){t.hideSubmitSpinner()}))},handleSubmitResponse:function(t){this.clearErrors();var e=t.data||{};e.message&&Craft.cp.displaySuccess(e.message,e.notificationSettings),this.trigger("submit",{response:t,data:e.modelName&&e[e.modelName]||{}}),this.settings.closeOnSubmit&&this.close()},handleSubmitError:function(t){if(!t.isAxiosError||!t.response||400===!t.response.status)throw Craft.cp.displayError(),t;var e=t.response.data||{};Craft.cp.displayError(e.message),e.errors&&this.showErrors(e.errors)},showErrors:function(e){var i=this;this.clearErrors(),Object.entries(e).forEach((function(e){var s,a,n=(a=2,function(t){if(Array.isArray(t))return t}(s=e)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(s,a)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(s,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),r=n[0],o=n[1],l=i.$container.find('[data-attribute="'.concat(r,'"]'));l&&(Craft.ui.addErrorsToField(l,o),i.fieldsWithErrors.push(l))}))},clearErrors:function(){this.fieldsWithErrors.forEach((function(t){Craft.ui.clearErrorsFromField(t)}))},isDirty:function(){return void 0!==this.$container.data("initialSerializedValue")&&this.$container.serialize()!==this.$container.data("initialSerializedValue")},closeMeMaybe:function(){this.isOpen&&(this.isDirty()&&!confirm(Craft.t("app","Are you sure you want to close this screen? Any changes will be lost."))||this.close())},close:function(){this.base(),this.cancelToken&&(this.ignoreFailedRequest=!0,this.cancelToken.cancel())}},{defaults:{params:{},requestOptions:{},showHeader:null,closeOnSubmit:!0}})},587:function(){function t(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=s(t))||e&&t&&"number"==typeof t.length){i&&(t=i);var a=0,n=function(){};return{s:n,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function(t){function e(e){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(t){throw t})),f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return o=t.done,t},e:function(t){function e(e){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(t){l=!0,r=t})),f:function(){try{o||null==i.return||i.return()}finally{if(l)throw r}}}}function i(t){return function(t){if(Array.isArray(t))return a(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||s(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(t,e){if(t){if("string"==typeof t)return a(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(t,e):void 0}}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var r=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi;if(jQuery.htmlPrefilter=function(t){return t.replace(r,"<$1></$2>")},$.extend(Craft,{navHeight:48,index:function(t,e){if(!$.isArray(t))throw"The first argument passed to Craft.index() must be an array.";return t.reduce((function(t,i,s){return t["string"==typeof e?i[e]:e(i,s)]=i,t}),{})},group:function(t,e){if(!$.isArray(t))throw"The first argument passed to Craft.group() must be an array.";var i={};return t.reduce((function(t,s,a){var n="string"==typeof e?s[e]:e(s,a);return i.hasOwnProperty(n)||(i[n]=[[],n],t.push(i[n])),i[n][0].push(s),t}),[])},t:function(t,e,i){return void 0!==Craft.translations[t]&&void 0!==Craft.translations[t][e]&&(e=Craft.translations[t][e]),i?this.formatMessage(e,i):e},formatMessage:function(t,e){var i;if(!1===(i=this._tokenizePattern(t)))throw"Message pattern is invalid.";for(var s=0;s<i.length;s++){var a=i[s];if("object"===n(a)&&!1===(i[s]=this._parseToken(a,e)))throw"Message pattern is invalid."}return i.join("")},_tokenizePattern:function(t){var e,s,a=1,n=i(t);if(-1===(e=s=n.indexOf("{")))return[t];for(var r=[n.slice(0,s).join("")];;){var o=n.indexOf("{",s+1),l=n.indexOf("}",s+1);if(-1===o&&(o=!1),-1===l&&(l=!1),!1===o&&!1===l)break;if(!1===o&&(o=n.length),l>o?(a++,s=o):(a--,s=l),0===a&&(r.push(n.slice(e+1,s).join("").split(",",3)),e=s+1,r.push(n.slice(e,o).join("")),e=o),0!==a&&(!1===o||!1===l))break}return 0===a&&r},_parseToken:function(t,e){var s=this,a=Craft.trim(t[0]);if(void 0===e[a])return"{".concat(t.join(","),"}");var r=e[a],o=void 0!==t[1]?Craft.trim(t[1]):"none";switch(o){case"number":return function(){var e=void 0!==t[2]?Craft.trim(t[2]):null;if(null!==e&&"integer"!==e)throw"Message format 'number' is only supported for integer values.";var i,s=Craft.formatNumber(r);return null===e&&-1!==(i="".concat(r).indexOf("."))&&(s+=".".concat(r.substring(i+1))),s}();case"none":return r;case"select":return function(){if(void 0===t[2])return!1;for(var i=s._tokenizePattern(t[2]),a=i.length,n=!1,o=0;o+1<a;o++){if(Garnish.isArray(i[o])||!Garnish.isArray(i[o+1]))return!1;var l=Craft.trim(i[o++]);(!1===n&&"other"===l||l==r)&&(n=i[o].join(","))}return!1!==n&&s.formatMessage(n,e)}();case"plural":return function(){if(void 0===t[2])return!1;for(var a=s._tokenizePattern(t[2]),o=a.length,l=!1,h=0,d=0;d+1<o;d++){if("object"===n(a[d])||"object"!==n(a[d+1]))return!1;var c=Craft.trim(a[d++]),u=i(c);if(1===d&&"offset:"===c.substring(0,7)){var p=i(c.replace(/[\n\r\t]/g," ")).indexOf(" ",7);if(-1===p)throw"Message pattern is invalid.";h=parseInt(Craft.trim(u.slice(7,p).join(""))),c=Craft.trim(u.slice(p+1,p+1+u.length).join(""))}(!1===l&&"other"===c||"="===c[0]&&parseInt(u.slice(1,1+u.length).join(""))===r||"one"===c&&r-h==1)&&(l=("string"==typeof a[d]?[a[d]]:a[d]).map((function(t){return t.replace("#",r-h)})).join(","))}return!1!==l&&s.formatMessage(l,e)}();default:throw"Message format '".concat(o,"' is not supported.")}},formatDate:function(t){return"object"!==n(t)&&(t=new Date(t)),$.datepicker.formatDate(Craft.datepickerOptions.dateFormat,t)},formatNumber:function(t,e){return void 0===e&&(e=",.0f"),d3.formatLocale(d3FormatLocaleDefinition).format(e)(t)},shortcutText:function(t,e,i){return"Mac"===Craft.clientOs?(i?"⌥":"")+(e?"⇧":"")+"⌘"+t:"Ctrl+"+(i?"Alt+":"")+(e?"Shift+":"")+t},escapeHtml:function(t){return $("<div/>").text(t).html()},escapeRegex:function(t){return t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},getText:function(t){return $("<div/>").html(t).text()},encodeUriComponent:function(t){t=encodeURIComponent(t);var e={"!":"%21","*":"%2A","'":"%27","(":"%28",")":"%29"};for(var i in e){var s=new RegExp("\\"+i,"g");t=t.replace(s,e[i])}return t},selectFullValue:function(t){var e=$(t),i=e.val();if(void 0!==e[0].setSelectionRange){var s=2*i.length;e[0].setSelectionRange(0,s)}else e.val(i)},formatInputId:function(t){return this.rtrim(t.replace(/[^\w\-]+/g,"-"),"-")},getUrl:function(t,e,i){"string"!=typeof t&&(t="");var s=null;if($.isPlainObject(e))void 0!==e["#"]&&(s=e["#"],delete e["#"]);else if("string"==typeof e){var a=e.indexOf("#");-1!==a&&(s=e.substring(a+1),e=e.substring(0,a)),e=Object.fromEntries(new URLSearchParams(e).entries())}else e={};var n=t.indexOf("#");-1!==n&&(s||(s=t.substring(n+1)),t=t.substring(0,n));var r,o=t.indexOf("?");if(-1!==o&&(e=$.extend(Object.fromEntries(new URLSearchParams(t.substring(o+1)).entries()),e),t=t.substring(0,o)),-1!==t.search("://")||"/"===t[0])return t+($.isEmptyObject(e)?"":"?".concat($.param(e)))+(s?"#".concat(s):"");if(t=Craft.trim(t,"/"),i){if(r=i,t&&Craft.pathParam){var l=r.match(new RegExp("[&?]"+Craft.escapeRegex(Craft.pathParam)+"=[^&]+"));l&&(r=r.replace(l[0],Craft.rtrim(l[0],"/")+"/"+t),t="")}}else r=Craft.baseUrl;return-1!==(o=r.indexOf("?"))&&(e=$.extend(Object.fromEntries(new URLSearchParams(r.substring(o+1)).entries()),e),r=r.substring(0,o)),!Craft.omitScriptNameInUrls&&t&&(Craft.usePathInfo||!Craft.pathParam?-1===r.search(Craft.scriptName)&&(r=Craft.rtrim(r,"/")+"/"+Craft.scriptName):(void 0!==e[Craft.pathParam]&&(t=Craft.rtrim(e[Craft.pathParam])+(t?"/"+t:"")),e[Craft.pathParam]=t,t=null)),t&&(r=Craft.rtrim(r,"/")+"/"+t),$.isEmptyObject(e)||(r+="?".concat($.param(e))),s&&(r+="#".concat(s)),r},getCpUrl:function(t,e){return this.getUrl(t,e,Craft.baseCpUrl)},getSiteUrl:function(t,e){return this.getUrl(t,e,Craft.baseSiteUrl)},getActionUrl:function(t,e){return Craft.getUrl(t,e,Craft.actionUrl)},redirectTo:function(t){document.location.href=this.getUrl(t)},setUrl:function(t){"undefined"!=typeof history&&(t.match(/#/)||(t+=document.location.hash),history.replaceState({},"",t))},setPath:function(t){this.path=t,this.setUrl(Craft.getUrl(t,document.location.search))},setQueryParam:function(t,e){var i=document.location.origin+document.location.pathname,s=this.getQueryParams();null!=e&&!1!==e?s[t]=e:delete s[t],this.setUrl(Craft.getUrl(i,s))},getPageUrl:function(t){var e=document.location.origin+document.location.pathname;e=Craft.rtrim(e,"/");var i=document.location.search?document.location.search.substring(1):"";if("?"===Craft.pageTrigger[0]){var s=Craft.pageTrigger.substring(1);if(document.location.search){var a=Object.fromEntries(new URLSearchParams(i).entries());delete a[s],i=$.param(a)}1!==t&&(i+=(""!==i?"&":"")+"".concat(s,"=").concat(t))}else e=e.replace(new RegExp("/"+Craft.escapeRegex(Craft.pageTrigger)+"\\d+$"),""),1!==t&&(e+="/".concat(Craft.pageTrigger).concat(t));return e+(i?"?".concat(i):"")+document.location.hash},getCsrfInput:function(){return Craft.csrfTokenName?'<input type="hidden" name="'+Craft.csrfTokenName+'" value="'+Craft.csrfTokenValue+'"/>':""},postActionRequest:function(t,e,i,s){"function"==typeof e&&(s=i,i=e,e={}),(s=s||{}).contentType&&s.contentType.match(/\bjson\b/)&&("object"===n(e)&&(e=JSON.stringify(e)),s.contentType="application/json; charset=utf-8");var a=$.ajax($.extend({url:Craft.getActionUrl(t),type:"POST",dataType:"json",headers:this._actionHeaders(),data:e,success:i,error:function(t,e,s){4===t.readyState&&(400!==t.status&&(void 0!==Craft.cp?Craft.cp.displayError():alert(Craft.t("app","A server error occurred."))),i&&i(400===t.status?t.responseJSON:null,e,t))}},s));return"function"==typeof s.send&&s.send(a),a},_actionHeaders:function(){var t={"X-Registered-Asset-Bundles":Object.keys(Craft.registeredAssetBundles).join(","),"X-Registered-Js-Files":Object.keys(Craft.registeredJsFiles).join(",")};return Craft.csrfTokenValue&&(t["X-CSRF-Token"]=Craft.csrfTokenValue),t},sendActionRequest:function(t,e){var i=this,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if($.isPlainObject(e)&&(s=e,e=null),"POST"===t.toUpperCase()&&e&&s.data)if("string"==typeof s.data){var a=s&&s.headers&&s.headers["X-Craft-Namespace"],n=this.namespaceInputName("action",a);s.data+="&".concat(n,"=").concat(e)}else delete s.data.action;return new Promise((function(a,n){(s=s?$.extend({},s):{}).method=t,s.url=e?Craft.getActionUrl(e):Craft.getCpUrl(),s.headers=$.extend({"X-Requested-With":"XMLHttpRequest"},s.headers||{},i._actionHeaders()),s.params=$.extend({},s.params||{},{v:(new Date).getTime()}),axios.request(s).then(a).catch(n)}))},sendApiRequest:function(t,e,i){var s=this;return new Promise((function(a,n){var r=(i=i?$.extend({},i):{}).cancelToken||null;s._getApiHeaders(r).then((function(o){i.method=t,i.baseURL=Craft.baseApiUrl,i.url=e,i.headers=$.extend(o,i.headers||{}),i.params=$.extend(Craft.apiParams||{},i.params||{},{v:(new Date).getTime()}),s._apiHeaders||(i.params.processCraftHeaders=1),Craft.httpProxy&&(i.proxy=Craft.httpProxy),axios.request(i).then((function(t){s._processApiHeaders(t.headers,r).then((function(){a(t.data)})).catch(n)})).catch(n)})).catch(n)}))},_loadingApiHeaders:!1,_apiHeaders:null,_apiHeaderWaitlist:[],_getApiHeaders:function(t){var i=this;return new Promise((function(s,a){i._loadingApiHeaders?i._apiHeaderWaitlist.push([s,a]):i._apiHeaders?s(i._apiHeaders):(i._loadingApiHeaders=!0,i.sendActionRequest("POST","app/api-headers",{cancelToken:t}).then((function(t){i._loadingApiHeaders?s(t.data):a(e)})).catch((function(t){i._rejectApiRequests(a,t)})))}))},_processApiHeaders:function(t,i){var s=this;return new Promise((function(a,n){s._apiHeaders?a():s.sendActionRequest("POST","app/process-api-response-headers",{data:{headers:t},cancelToken:i}).then((function(t){if(s._loadingApiHeaders)for(s._apiHeaders=t.data,s._loadingApiHeaders=!1,a();s._apiHeaderWaitlist.length;)s._apiHeaderWaitlist.shift()[0](s._apiHeaders);else n(e)})).catch((function(t){s._rejectApiRequests(n,t)}))}))},_rejectApiRequests:function(t,e){for(this._loadingApiHeaders=!1,t(e);this._apiHeaderWaitlist.length;)this._apiHeaderWaitlist.shift()[1](e)},clearCachedApiHeaders:function(){for(this._apiHeaders=null,this._loadingApiHeaders=!1;this._apiHeaderWaitlist.length;)this._apiHeaderWaitlist.shift()[1]()},downloadFromUrl:function(t,e,i){return new Promise((function(s,a){var r=new XMLHttpRequest;r.open(t,e,!0),"object"===n(i)?(r.setRequestHeader("Content-Type","application/json; charset=UTF-8"),i=JSON.stringify(i)):r.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"),r.responseType="blob",r.onload=function(){if(200===r.status){var t=r.getResponseHeader("content-disposition"),e=/"([^"]*)"/.exec(t),i=null!=e&&e[1]?e[1]:"Download",n=r.getResponseHeader("content-type"),o=new Blob([r.response],{type:n}),l=document.createElement("a");l.href=window.URL.createObjectURL(o),l.download=i,document.body.appendChild(l),l.click(),document.body.removeChild(l),s()}else a()},r.send(i)}))},stringToArray:function(t){if("string"!=typeof t)return t;for(var e=t.split(","),i=0;i<e.length;i++)e[i]=$.trim(e[i]);return e},findDeltaData:function(t,e,i,s,a,r){t="string"==typeof t?t:"",e="string"==typeof e?e:"",i=$.isArray(i)?i:[],a=$.isPlainObject(a)?a:{},r=$.isArray(r)?r:[],i.sort((function(t,e){return t.length===e.length?0:t.length>e.length?1:-1}));for(var o=this._groupParamsByDeltaNames(t.split("&"),i,!1,a),l=this._groupParamsByDeltaNames(e.split("&"),i,!0,!1),h=l.__root__,d=0;d<i.length;d++)(Craft.inArray(i[d],r)||"object"===n(l[i[d]])&&("object"!==n(o[i[d]])||JSON.stringify(o[i[d]])!==JSON.stringify(l[i[d]])))&&((h=h.concat(l[i[d]])).push("modifiedDeltaNames[]="+i[d]),s&&s(i[d],l[i[d]]));return h.join("&")},_groupParamsByDeltaNames:function(t,e,i,s){var a={};i&&(a.__root__=[]);var n=function(t){return encodeURIComponent(t).replace("%3D","=")};t=t.map((function(t){return decodeURIComponent(t)}));t:for(var r=0;r<t.length;r++){for(var o=e.length-1;o>=0;o--){var l=t[r].substring(0,e[o].length+1);if(l===e[o]+"="||l===e[o]+"["){void 0===a[e[o]]&&(a[e[o]]=[]),a[e[o]].push(n(t[r]));continue t}}i&&a.__root__.push(n(t[r]))}if(s){var h=function(t,e){return $.isArray(e)||$.isPlainObject(e)?e=$.param(e):"string"==typeof e?e=encodeURIComponent(e):null===e&&(e=""),"".concat(encodeURIComponent(t),"=").concat(e)};for(var d in s)if(s.hasOwnProperty(d))if($.isPlainObject(s[d]))for(var c in a[d]=[],s[d])s[d].hasOwnProperty(c)&&a[d].push(h("".concat(d,"[").concat(c,"]"),s[d][c]));else a[d]=[h(d,s[d])]}return a},expandPostArray:function(t){var e,i={};for(var s in t)if(t.hasOwnProperty(s)){var a,r=t[s],o=s.match(/^(\w+)(\[.*)?/);if(o[2])for(a=o[2].match(/\[[^\[\]]*\]/g),e=0;e<a.length;e++)a[e]=a[e].substring(1,a[e].length-1);else a=[];a.unshift(o[1]);var l=i;for(e=0;e<a.length;e++)e<a.length-1?("object"!==n(l[a[e]])&&(a[e+1]&&parseInt(a[e+1])!=a[e+1]?l[a[e]]={}:l[a[e]]=[]),l=l[a[e]]):(a[e]||(a[e]=l.length),l[a[e]]=r)}return i},createForm:function(t){var e=$("<form/>",{attr:{method:"post",action:"","accept-charset":"UTF-8"}});if("string"==typeof t)for(var i,s=t.split("&"),a=0;a<s.length;a++)i=s[a].split("=",2),$("<input/>",{type:"hidden",name:decodeURIComponent(i[0]),value:decodeURIComponent(i[1]||"")}).appendTo(e);return e},compare:function(t,e,i){if(n(t)!==n(e))return!1;if("object"===n(t)){if(t.length!==e.length)return!1;if(t instanceof Array!=e instanceof Array)return!1;if(!(t instanceof Array))if(void 0===i||!0===i){if(!Craft.compare(Craft.getObjectKeys(t).sort(),Craft.getObjectKeys(e).sort()))return!1}else if(!Craft.compare(Craft.getObjectKeys(t),Craft.getObjectKeys(e)))return!1;for(var s in t)if(t.hasOwnProperty(s)&&!Craft.compare(t[s],e[s]))return!1;return!0}return t===e},getObjectKeys:function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(i);return e},escapeChars:function(t){Garnish.isArray(t)||(t=t.split());for(var e="",i=0;i<t.length;i++)e+="\\"+t[i];return e},ltrim:function(t,e){if(!t)return t;void 0===e&&(e=" \t\n\r\0\v");var i=new RegExp("^["+Craft.escapeChars(e)+"]+");return t.replace(i,"")},rtrim:function(t,e){if(!t)return t;void 0===e&&(e=" \t\n\r\0\v");var i=new RegExp("["+Craft.escapeChars(e)+"]+$");return t.replace(i,"")},trim:function(t,e){return t=Craft.ltrim(t,e),Craft.rtrim(t,e)},startsWith:function(t,e){return t.substring(0,e.length)===e},filterArray:function(t,e){for(var i=[],s=0;s<t.length;s++)("function"==typeof e?e(t[s],s):t[s])&&i.push(t[s]);return i},inArray:function(t,e){return $.isPlainObject(e)&&(e=Object.values(e)),e.includes(t)},removeFromArray:function(t,e){var i=$.inArray(t,e);return-1!==i&&(e.splice(i,1),!0)},getLast:function(t){return t.length?t[t.length-1]:null},uppercaseFirst:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},lowercaseFirst:function(t){return t.charAt(0).toLowerCase()+t.slice(1)},parseUrl:function(t){var e=t.match(/^(?:(https?):\/\/|\/\/)([^\/\:]*)(?:\:(\d+))?(\/[^\?]*)?(?:\?([^#]*))?(#.*)?/);return e?{scheme:e[1],host:e[2]+(e[3]?":"+e[3]:""),hostname:e[2],port:e[3]||null,path:e[4]||"/",query:e[5]||null,hash:e[6]||null}:{}},getQueryParams:function(){return Object.fromEntries(new URLSearchParams(window.location.search).entries())},getQueryParam:function(t){return new Proxy(new URLSearchParams(window.location.search),{get:function(t,e){return t.get(e)}})[t]},isSameHost:function(t){var e=this.parseUrl(document.location.href);if(!e)return!1;var i=this.parseUrl(t);return!!i&&e.host===i.host},secondsToHumanTimeDuration:function(t,e){void 0===e&&(e=!0);var i=604800,s=Math.floor(t/i);t%=i;var a=Math.floor(t/86400);t%=86400;var n,r=Math.floor(t/3600);t%=3600,e?(n=Math.floor(t/60),t%=60):(n=Math.round(t/60),t=0);var o=[];return s&&o.push(s+" "+(1===s?Craft.t("app","week"):Craft.t("app","weeks"))),a&&o.push(a+" "+(1===a?Craft.t("app","day"):Craft.t("app","days"))),r&&o.push(r+" "+(1===r?Craft.t("app","hour"):Craft.t("app","hours"))),!n&&(e||s||a||r)||o.push(n+" "+(1===n?Craft.t("app","minute"):Craft.t("app","minutes"))),!t&&(!e||s||a||r||n)||o.push(t+" "+(1===t?Craft.t("app","second"):Craft.t("app","seconds"))),o.join(", ")},asciiString:function(t,e){t=t.normalize("NFC");for(var i,s="",a=0;a<t.length;a++)i=t.charAt(a),s+="string"==typeof(e||Craft.asciiCharMap)[i]?(e||Craft.asciiCharMap)[i]:i;return s},uuid:function(){return"function"==typeof crypto.randomUUID?crypto.randomUUID():([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(function(t){return(t^crypto.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)}))},namespaceInputName:function(t,e){return e?t.replace(/([^'"\[\]]+)([^'"]*)/,"".concat(e,"[$1]$2")):t},namespaceId:function(t,e){return Craft.formatInputId(e?"".concat(e,"-").concat(t):t)},randomString:function(t){for(var e="",i=0;i<t;i++)e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(62*Math.random()));return e},createErrorList:function(t){for(var e=$(document.createElement("ul")).addClass("errors"),i=0;i<t.length;i++){var s=$(document.createElement("li"));s.appendTo(e),s.html(t[i])}return e},appendHeadHtml:function(t){if(t){var e=$("link[href]");if(e.length){for(var i,s=[],a=0;a<e.length;a++)i=e.eq(a).attr("href").replace(/&/g,"&amp;"),s.push(Craft.escapeRegex(i));var n=new RegExp('<link\\s[^>]*href="(?:'+s.join("|")+')".*?></link>',"g");t=t.replace(n,"")}$("head").append(t)}},appendBodyHtml:function(t){if(t){var e=$("script[src]");if(e.length){for(var i,s=[],a=0;a<e.length;a++)i=e.eq(a).attr("src").replace(/&/g,"&amp;"),s.push(Craft.escapeRegex(i));var n=new RegExp('<script\\s[^>]*src="(?:'+s.join("|")+')".*?><\/script>',"g");t=t.replace(n,"")}Garnish.$bod.append(t)}},appendFootHtml:function(t){console.warn("Craft.appendFootHtml() is deprecated. Craft.appendBodyHtml() should be used instead."),this.appendBodyHtml(t)},initUiElements:function(t){$(".grid",t).grid(),$(".info",t).infoicon(),$(".checkbox-select",t).checkboxselect(),$(".fieldtoggle",t).fieldtoggle(),$(".lightswitch",t).lightswitch(),$(".nicetext",t).nicetext(),$(".formsubmit",t).formsubmit(),$(".menubtn:not([data-disclosure-trigger])",t).menubtn(),$("[data-disclosure-trigger]",t).disclosureMenu(),$(".datetimewrapper",t).datetime(),$('.datewrapper > input[type="date"], .timewrapper > input[type="time"]',t).datetimeinput(),$("a",t).each((function(){this.hostname.length&&this.hostname!==location.hostname&&void 0===$(this).attr("target")&&$(this).attr("rel","noopener").attr("target","_blank")}))},_elementIndexClasses:{},_elementSelectorModalClasses:{},_elementEditorClasses:{},registerElementIndexClass:function(t,e){if(void 0!==this._elementIndexClasses[t])throw"An element index class has already been registered for the element type “"+t+"”.";this._elementIndexClasses[t]=e},registerElementSelectorModalClass:function(t,e){if(void 0!==this._elementSelectorModalClasses[t])throw"An element selector modal class has already been registered for the element type “"+t+"”.";this._elementSelectorModalClasses[t]=e},registerElementEditorClass:function(t,e){if(void 0!==this._elementEditorClasses[t])throw"An element editor class has already been registered for the element type “"+t+"”.";this._elementEditorClasses[t]=e},createElementIndex:function(t,e,i){return new(void 0!==this._elementIndexClasses[t]?this._elementIndexClasses[t]:Craft.BaseElementIndex)(t,e,i)},createElementSelectorModal:function(t,e){return new(void 0!==this._elementSelectorModalClasses[t]?this._elementSelectorModalClasses[t]:Craft.BaseElementSelectorModal)(t,e)},createElementEditor:function(t,e,i){return void 0===i&&$.isPlainObject(e)?(i=e,e=null):"object"!==n(i)&&(i={}),i.elementType||(i.elementType=t),new Craft.ElementEditorSlideout(e,i)},getLocalStorage:function(t,e){return t="Craft-"+Craft.systemUid+"."+t,"undefined"!=typeof localStorage&&void 0!==localStorage[t]?JSON.parse(localStorage[t]):e},setLocalStorage:function(t,e){if("undefined"!=typeof localStorage){t="Craft-"+Craft.systemUid+"."+t;try{localStorage[t]=JSON.stringify(e)}catch(t){}}},removeLocalStorage:function(t){"undefined"!=typeof localStorage&&localStorage.removeItem("Craft-".concat(Craft.systemUid,".").concat(t))},getCookie:function(t){return document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)Craft-".concat(Craft.systemUid,":").concat(t,"\\s*\\=\\s*([^;]*).*$)|^.*$")),"$1")},setCookie:function(t,e,i){i=$.extend({},this.defaultCookieOptions,i);var s="Craft-".concat(Craft.systemUid,":").concat(t,"=").concat(encodeURIComponent(e));i.path&&(s+=";path=".concat(i.path)),i.domain&&(s+=";domain=".concat(i.domain)),i.maxAge?s+=";max-age-in-seconds=".concat(i.maxAge):i.expires&&(s+=";expires=".concat(i.expires.toUTCString())),i.secure&&(s+=";secure"),document.cookie=s},removeCookie:function(t){this.setCookie(t,"",new Date("1970-01-01T00:00:00"))},getElementInfo:function(t){var e=$(t);return e.hasClass("element")||(e=e.find(".element:first")),{id:e.data("id"),siteId:e.data("site-id"),label:e.data("label"),status:e.data("status"),url:e.data("url"),hasThumb:e.hasClass("hasthumb"),$element:e}},setElementSize:function(t,e){var i=$(t);if("small"!==e&&"large"!==e&&(e="small"),!i.hasClass(e)){var s="small"===e?"large":"small";if(i.addClass(e).removeClass(s),i.hasClass("hasthumb")){var a=i.find("> .elementthumb > img"),n=$("<img/>",{sizes:("small"===e?"30":"100")+"px",srcset:a.attr("srcset")||a.attr("data-pfsrcset")});a.replaceWith(n),picturefill({elements:[n[0]]})}}},submitForm:function(t,e){if(void 0===e&&(e={}),!e.confirm||confirm(e.confirm)){if(e.action&&$("<input/>",{type:"hidden",name:"action",val:e.action}).appendTo(t),e.redirect&&$("<input/>",{type:"hidden",name:"redirect",val:e.redirect}).appendTo(t),e.params)for(var i in e.params){var s=e.params[i];$("<input/>",{type:"hidden",name:i,val:s}).appendTo(t)}e.retainScroll&&this.setLocalStorage("scrollY",window.scrollY),t.trigger($.extend({type:"submit"},e.data))}},trapFocusWithin:function(t){Garnish.trapFocusWithin(t)},setFocusWithin:function(t){Garnish.setFocusWithin(t)},filterInputVal:function(t,e){for(var i=$(t),s=i.val(),a=i[0].selectionStart,n="",r=0;r<s.length;r++)s[r].match(e)?n+=s[r]:r<a&&a--;n!==s&&(i.val(n),i[0].setSelectionRange(a,a))},filterNumberInputVal:function(t){this.filterInputVal(t,/[0-9.,\-]/)},setElementAttributes:function(e,i){var s=$(e);for(var a in i)if(i.hasOwnProperty(a)){var n=i[a];if(null===n||!1===n)s.removeAttr(a);else if(!0===n)s.attr(a,"");else if($.isArray(n)||$.isPlainObject(n))if(Craft.dataAttributes.includes(a)){for(var r in n=Object.assign({},n))if(n.hasOwnProperty(r)){var o=n[r];null!==o&&!1!==o&&(o=$.isPlainObject(o)||$.isArray(o)?JSON.stringify(o):!0===o?"":this.escapeHtml(o),s.attr("".concat(a,"-").concat(r),o))}}else if("class"===a){$.isPlainObject(n)&&(n=Object.values(n));var l,h=t(n);try{for(h.s();!(l=h.n()).done;){var d=l.value;s.addClass(d)}}catch(t){h.e(t)}finally{h.f()}}else"style"===a?s.css(n):s.attr(a,JSON.stringify(n));else s.attr(a,this.escapeHtml(n))}},isVisible:function(){return void 0===document.visibilityState||"visible"===document.visibilityState},useMobileStyles:function(){return Garnish.isMobileBrowser()||document.body.clientWidth<600}}),Craft.pageId=Craft.uuid(),"undefined"!=typeof BroadcastChannel){var o="CraftCMS:".concat(Craft.appId);Craft.broadcaster=new BroadcastChannel(o),Craft.messageReceiver=new BroadcastChannel(o),Craft.messageReceiver.addEventListener("message",(function(e){if("saveElement"===e.data.event){var i=$('div.element[data-id="'.concat(e.data.id,'"][data-settings]'));if(!i.length)return;for(var s={type:i.data("type"),id:e.data.id,instances:[]},a=0;a<i.length;a++){var n=i.eq(a);s.instances.push(Object.assign({siteId:n.data("site-id")},n.data("settings")))}Craft.sendActionRequest("POST","app/render-element",{data:s}).then((function(e){for(var s=e.data,a=0;a<i.length;a++){var n=i.eq(a);if(s.elementHtml[a]){var r,o=$(s.elementHtml[a]),l=t(o[0].attributes);try{for(l.s();!(r=l.n()).done;){var h=r.value;"class"===h.name?n.addClass(h.value):n.attr(h.name,h.value)}}catch(t){l.e(t)}finally{l.f()}var d=n.find("input,button").detach();n.html(o.html()),d.length&&d.prependTo(n)}}(new Craft.ElementThumbLoader).load(i)}))}}))}$.extend($.fn,{animateLeft:function(t,e,i,s){return"ltr"===Craft.orientation?this.velocity({left:t},e,i,s):this.velocity({right:t},e,i,s)},animateRight:function(t,e,i,s){return"ltr"===Craft.orientation?this.velocity({right:t},e,i,s):this.velocity({left:t},e,i,s)},disable:function(){return this.each((function(){var t=$(this);t.addClass("disabled"),t.data("activatable")&&t.removeAttr("tabindex")}))},enable:function(){return this.each((function(){var t=$(this);t.removeClass("disabled"),t.data("activatable")&&t.attr("tabindex","0")}))},grid:function(){return this.each((function(){var t=$(this),e={};t.data("item-selector")&&(e.itemSelector=t.data("item-selector")),t.data("cols")&&(e.cols=parseInt(t.data("cols"))),t.data("max-cols")&&(e.maxCols=parseInt(t.data("max-cols"))),t.data("min-col-width")&&(e.minColWidth=parseInt(t.data("min-col-width"))),t.data("mode")&&(e.mode=t.data("mode")),t.data("fill-mode")&&(e.fillMode=t.data("fill-mode")),t.data("col-class")&&(e.colClass=t.data("col-class")),t.data("snap-to-grid")&&(e.snapToGrid=!!t.data("snap-to-grid")),new Craft.Grid(this,e)}))},infoicon:function(){return this.each((function(){new Craft.InfoIcon(this)}))},checkboxselect:function(){return this.each((function(){$.data(this,"checkboxselect")||new Garnish.CheckboxSelect(this)}))},fieldtoggle:function(){return this.each((function(){$.data(this,"fieldtoggle")||new Craft.FieldToggle(this)}))},lightswitch:function(t,e,i){return"settings"===t?("string"==typeof e?(t={})[e]=i:t=e,this.each((function(){var e=$.data(this,"lightswitch");e&&e.setSettings(t)}))):($.isPlainObject(t)||(t={}),this.each((function(){var e=$.extend({},t);Garnish.hasAttr(this,"data-value")&&(e.value=$(this).attr("data-value")),Garnish.hasAttr(this,"data-indeterminate-value")&&(e.indeterminateValue=$(this).attr("data-indeterminate-value")),$.data(this,"lightswitch")||new Craft.LightSwitch(this,e)})))},nicetext:function(){return this.each((function(){$.data(this,"nicetext")||new Garnish.NiceText(this)}))},formsubmit:function(){return this.on("click",(function(t){var e=$(t.currentTarget),i=e.data("params")||{};e.data("param")&&(i[e.data("param")]=e.data("value"));var s=e.data("menu")?e.data("menu").$anchor:e,a=s.attr("data-form")?$("#"+s.attr("data-form")):s.closest("form");Craft.submitForm(a,{confirm:e.data("confirm"),action:e.data("action"),redirect:e.data("redirect"),params:i,data:$.extend({customTrigger:e},e.data("event-data"))})}))},menubtn:function(){return this.each((function(){var t=$(this);if(!t.data("menubtn")&&t.next().hasClass("menu")){var e={};t.data("menu-anchor")&&(e.menuAnchor=t.data("menu-anchor")),new Garnish.MenuBtn(t,e)}}))},disclosureMenu:function(){return this.each((function(){var t=$(this);!t.data("trigger")&&t.attr("aria-controls")&&new Garnish.DisclosureMenu(t)}))},datetime:function(){return this.each((function(){var t=$(this),e=t.find('input:not([name$="[timezone]"])'),i=function(){for(var i=!1,s=0;s<e.length;s++)if(e.eq(s).val()){i=!0;break}if(i){if(!t.children(".clear-btn").length)var a=$("<button/>",{type:"button",class:"clear-btn",title:Craft.t("app","Clear"),"aria-label":Craft.t("app","Clear")}).appendTo(t).on("click",(function(){for(var t=0;t<e.length;t++)e.eq(t).val("").trigger("input").trigger("change");a.remove(),e.first().filter('[type="text"]').focus()}))}else t.children(".clear-btn").remove()};e.on("change",i),i()}))},datetimeinput:function(){return this.each((function(){var t=$(this),e=function(){""===t.val()?t.addClass("empty-value"):t.removeClass("empty-value")};t.on("input",e),e()}))}}),Garnish.NiceText.charsLeftHtml=function(t){return Craft.t("app",'<span class="visually-hidden">Characters left:</span> {chars, number}',{chars:t})},Garnish.$doc.ready((function(){Craft.initUiElements()}))},691:function(){function t(t){return function(t){if(Array.isArray(t))return s(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||i(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(t,e)||i(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(t,e){if(t){if("string"==typeof t)return s(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?s(t,e):void 0}}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.CustomizeSourcesModal=Garnish.Modal.extend({elementIndex:null,$elementIndexSourcesContainer:null,$sidebar:null,$sidebarToggleBtn:null,$sourcesContainer:null,$sourcesHeader:null,$sourcesHeading:null,$sourceSettingsContainer:null,$sourceSettingsHeader:null,$addSourceMenu:null,addSourceMenu:null,$footer:null,$footerBtnContainer:null,$saveBtn:null,$cancelBtn:null,$loadingSpinner:null,sourceSort:null,sources:null,selectedSource:null,elementTypeName:null,baseSortOptions:null,availableTableAttributes:null,customFieldAttributes:null,conditionBuilderHtml:null,conditionBuilderJs:null,userGroups:null,init:function(t,e){var i=this;this.base(),this.setSettings(e,{resizable:!0}),this.elementIndex=t,this.$elementIndexSourcesContainer=this.elementIndex.$sidebar.children("nav").children("ul");var s=$('<form class="modal customize-sources-modal"/>').appendTo(Garnish.$bod);this.$sidebar=$('<div class="cs-sidebar block-types"/>').appendTo(s).attr({role:"navigation","aria-label":Craft.t("app","Source")}),this.$sourcesContainer=$('<div class="sources">').appendTo(this.$sidebar),this.$sourceSettingsContainer=$('<div class="source-settings">').appendTo(s),this.$footer=$('<div class="footer"/>').appendTo(s),this.$footerBtnContainer=$('<div class="buttons right"/>').appendTo(this.$footer),this.$cancelBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(this.$footerBtnContainer),this.$saveBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Save"),spinner:!0}).appendTo(this.$footerBtnContainer),this.$loadingSpinner=$('<div class="spinner"/>').appendTo(this.$sourceSettingsContainer),this.setContainer(s),this.show(),Craft.sendActionRequest("POST","element-index-settings/get-customize-sources-modal-data",{data:{elementType:this.elementIndex.elementType}}).then((function(t){i.$saveBtn.removeClass("disabled"),i.buildModal(t.data)})).finally((function(){i.$loadingSpinner.remove(),Garnish.setFocusWithin(i.$sidebar)})),this.addListener(this.$cancelBtn,"click","hide"),this.addListener(this.$saveBtn,"click","save"),this.addListener(this.$container,"submit","save")},buildModal:function(t){var e=this;this.baseSortOptions=t.baseSortOptions,this.defaultSortOptions=t.defaultSortOptions,this.availableTableAttributes=t.availableTableAttributes,this.customFieldAttributes=t.customFieldAttributes,this.elementTypeName=t.elementTypeName,this.conditionBuilderHtml=t.conditionBuilderHtml,this.conditionBuilderJs=t.conditionBuilderJs,this.userGroups=t.userGroups,t.headHtml&&Craft.appendHeadHtml(t.headHtml),t.bodyHtml&&Craft.appendBodyHtml(t.bodyHtml),this.sourceSort=new Garnish.DragSort({handle:".move",axis:"y"}),this.sources=[];for(var i=0;i<t.sources.length;i++)this.sources.push(this.addSource(t.sources[i]));this.selectedSource||void 0===this.sources[0]||this.sources[0].select();var s=$('<div class="buttons left" data-wrapper/>').appendTo(this.$footer),a=$("<button/>",{type:"button",class:"btn menubtn add icon","aria-label":Craft.t("app","Add…"),"aria-controls":"add-source-menu",title:Craft.t("app","Add…"),"data-disclosure-trigger":""}).appendTo(s);this.$addSourceMenu=$("<div/>",{id:"add-source-menu",class:"menu menu--disclosure"}).appendTo(s);var n=function(t){var i=e.addSource(t,!0);Garnish.scrollContainerToElement(e.$sidebar,i.$item),i.select(),e.addSourceMenu.hide()},r=$("<button/>",{type:"button",class:"menu-option",text:Craft.t("app","New heading")}).on("click",(function(){n({type:"heading"}),e.focusLabelInput()})),o=$("<button/>",{type:"button",class:"menu-option",text:Craft.t("app","New custom source"),"data-type":"custom"}).on("click",(function(){var t=e.baseSortOptions.slice(0);t.push(e.defaultSortOptions),n({type:"custom",key:"custom:".concat(Craft.uuid()),sortOptions:t,defaultSort:[t[0].attr,t[1].defaultDir],tableAttributes:[],availableTableAttributes:[]}),e.focusLabelInput()})),l=$("<ul/>").append($("<li/>").append(r)).appendTo(this.$addSourceMenu);t.conditionBuilderHtml&&$("<li/>").append(o).appendTo(l),Craft.useMobileStyles()&&this.buildSidebarToggleView(),this.addListener(Garnish.$win,"resize",this.updateSidebarView),this.addSourceMenu=new Garnish.DisclosureMenu(a)},focusLabelInput:function(){this.selectedSource.$labelInput.trigger("focus")},getSourceName:function(){return this.selectedSource?this.selectedSource.sourceData.label:this.sources[0].sourceData.label},updateSidebarView:function(){Craft.useMobileStyles()?this.$sidebarToggleBtn||this.buildSidebarToggleView():this.$sidebarToggleBtn&&this.resetView()},resetView:function(){this.$sourceSettingsHeader&&this.$sourceSettingsHeader.remove(),this.$sourcesHeader&&this.$sourcesHeader.remove(),this.$sidebarToggleBtn=null,this.$container.removeClass("sidebar-hidden")},updateHeading:function(){this.$sourcesHeading&&this.$sourcesHeading.text(this.getSourceName())},buildSidebarToggleView:function(){var t=this;this.$sourcesHeader=$('<div class="sources-header"/>').addClass("sidebar-header").prependTo(this.$sourcesContainer),this.$sidebarCloseBtn=Craft.ui.createButton({class:"nav-close close-btn"}).attr("aria-label",Craft.t("app","Close")).removeClass("btn").appendTo(this.$sourcesHeader),this.$sourcesHeading=$('<h1 class="main-heading"/>').text(this.getSourceName()),this.$sourceSettingsHeader=$('<div class="source-settings-header"/>').addClass("main-header").append(this.$sourcesHeading).prependTo(this.$sourceSettingsContainer),this.$sidebarToggleBtn=Craft.ui.createButton({toggle:!0,controls:"modal-sidebar",class:"nav-toggle"}).removeClass("btn").attr("aria-label",Craft.t("app","Show sidebar")).appendTo(this.$sourceSettingsHeader),this.closeSidebar(),this.addListener(this.$sidebarToggleBtn,"click",(function(){t.toggleSidebar()})),this.addListener(this.$sidebarCloseBtn,"click",(function(){t.toggleSidebar(),t.$sidebarToggleBtn.trigger("focus")}))},toggleSidebar:function(){this.sidebarIsOpen()?this.closeSidebar():this.openSidebar()},openSidebar:function(){var t=this;this.$container.removeClass("sidebar-hidden"),this.$sidebarToggleBtn.attr("aria-expanded","true"),this.$sidebar.find(":focusable").first().focus(),Garnish.uiLayerManager.addLayer(this.$sidebar),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.closeSidebar(),Garnish.focusIsInside(t.$sidebar)&&t.$sidebarToggleBtn.focus()}))},closeSidebar:function(){this.$container.addClass("sidebar-hidden"),this.$sidebarToggleBtn&&this.$sidebarToggleBtn.attr("aria-expanded","false"),Garnish.uiLayerManager.currentLayer.$container.hasClass("cs-sidebar")&&Garnish.uiLayerManager.removeLayer()},sidebarIsOpen:function(){return"true"===this.$sidebarToggleBtn.attr("aria-expanded")},addSource:function(t,e){var i,s=$('<div class="customize-sources-item"/>').appendTo(this.$sourcesContainer),a=$('<div class="label customize-sources-item__btn"/>').attr({tabindex:"0",role:"button"}).appendTo(s),n=$('<input type="hidden"/>').appendTo(s);return $('<a class="move icon customize-sources-item__move" title="'.concat(Craft.t("app","Reorder"),'" role="button"></a>')).appendTo(s),"heading"===t.type?(s.addClass("heading"),n.attr("name","sourceOrder[][heading]"),(i=new Craft.CustomizeSourcesModal.Heading(this,s,a,n,t,e)).updateItemLabel(t.heading)):(n.attr("name","sourceOrder[][key]").val(t.key),(i="native"===t.type?new Craft.CustomizeSourcesModal.Source(this,s,a,n,t,e):new Craft.CustomizeSourcesModal.CustomSource(this,s,a,n,t,e)).updateItemLabel(t.label),t.key===this.elementIndex.rootSourceKey&&i.select()),this.sourceSort.addItems(s),i},save:function(t){var e=this;t&&t.preventDefault(),this.$saveBtn.hasClass("disabled")||this.$saveBtn.hasClass("loading")||(this.$saveBtn.addClass("loading"),Craft.sendActionRequest("POST","element-index-settings/save-customize-sources-modal-settings",{data:this.$container.serialize()+"&elementType=".concat(this.elementIndex.elementType)}).then((function(t){var i=t.data,s=null;e.selectedSource&&e.selectedSource.sourceData.key&&!i.disabledSourceKeys.includes(e.selectedSource.sourceData.key)?s=e.selectedSource.sourceData.key:e.elementIndex.sourceKey||(s=e.elementIndex.$visibleSources.first().data("key")),s&&e.elementIndex.selectSourceByKey(s),window.location.reload()})).catch((function(){Craft.cp.displayError(Craft.t("app","A server error occurred."))})).finally((function(){e.$saveBtn.removeClass("loading")})))},appendIndexSourceItem:function(t,e){if(e){var i=t.hasClass("heading");if(e.hasClass("heading")&&!i)t.appendTo(e.children("ul"));else{if(i){var s=e.parentsUntil(this.$elementIndexSourcesContainer,"li").last();s.length&&(e=s)}t.insertAfter(e)}}else t.prependTo(this.$elementIndexSourcesContainer)},destroy:function(){for(var t=0;t<this.sources.length;t++)this.sources[t].destroy();this.addSourceMenu&&(this.addSourceMenu.destroy(),this.$addSourceMenu.remove()),delete this.sources,this.base()}}),Craft.CustomizeSourcesModal.BaseSource=Garnish.Base.extend({modal:null,$item:null,$itemLabel:null,$itemInput:null,$settingsContainer:null,sourceData:null,isNew:null,init:function(t,e,i,s,a,n){var r=this;this.modal=t,this.$item=e,this.$itemLabel=i,this.$itemInput=s,this.sourceData=a,this.isNew=n,this.$item.data("source",this),this.addListener(this.$itemLabel,"click","select"),this.addListener(this.$itemLabel,"keypress",(function(t){return Garnish.handleActivatingKeypress(t,r.select.bind(r))}))},isHeading:function(){return!1},isNative:function(){return!1},isSelected:function(){return this.modal.selectedSource===this},select:function(){this.isSelected()||(this.modal.selectedSource&&this.modal.selectedSource.deselect(),this.$item.addClass("sel"),this.$itemLabel.attr({"aria-current":"true"}),this.modal.selectedSource=this,this.modal.updateHeading(),this.$settingsContainer?this.$settingsContainer.removeClass("hidden"):(this.$settingsContainer=$("<div/>").appendTo(this.modal.$sourceSettingsContainer),this.createSettings(this.$settingsContainer)),this.modal.$sourceSettingsContainer.scrollTop(0))},createSettings:function(){},getIndexSourceItem:function(){},deselect:function(){this.$item.removeClass("sel"),this.$itemLabel.attr({"aria-current":"false"}),this.modal.selectedSource=null,this.$settingsContainer.addClass("hidden")},updateItemLabel:function(t){t?this.$itemLabel.text(t):this.$itemLabel.html("&nbsp;")},destroy:function(){this.modal.sourceSort.removeItems(this.$item),this.modal.sources.splice($.inArray(this,this.modal.sources),1),this.isSelected()&&(this.deselect(),this.modal.sources.length&&this.modal.sources[0].select(),Garnish.setFocusWithin(this.modal.$sourceSettingsContainer)),this.$item.data("source",null),this.$item.remove(),this.$settingsContainer&&this.$settingsContainer.remove(),this.base()}}),Craft.CustomizeSourcesModal.Source=Craft.CustomizeSourcesModal.BaseSource.extend({$sortAttributeSelect:null,$sortDirectionPicker:null,$sortDirectionInput:null,sortDirectionListbox:null,isNative:function(){return!0},createSettings:function(t){Craft.ui.createLightswitchField({label:Craft.t("app","Enabled"),name:"sources[".concat(this.sourceData.key,"][enabled]"),on:!this.sourceData.disabled}).appendTo(t),this.createSortField(t),this.createTableAttributesField(t)},createSortField:function(t){var e=this,i=$('<div class="flex"/>'),s=Craft.ui.createSelect({name:"sources[".concat(this.sourceData.key,"][defaultSort][0]"),options:this.sourceData.sortOptions.map((function(t){return{label:t.label,value:t.attr}})),value:this.sourceData.defaultSort[0]}).addClass("fullwidth").appendTo($("<div/>").appendTo(i));this.$sortAttributeSelect=s.children("select").attr("aria-label",Craft.t("app","Sort attribute")),this.$sortDirectionPicker=$("<section/>",{class:"btngroup btngroup--exclusive","aria-label":Craft.t("app","Sort direction")}).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort ascending"),"aria-label":Craft.t("app","Sort ascending"),"aria-pressed":"false","data-icon":"asc","data-dir":"asc"})).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort descending"),"aria-label":Craft.t("app","Sort descending"),"aria-pressed":"false","data-icon":"desc","data-dir":"desc"})).appendTo(i),this.$sortDirectionInput=$("<input/>",{type:"hidden",name:"sources[".concat(this.sourceData.key,"][defaultSort][1]")}).appendTo(i),this.sortDirectionListbox=new Craft.Listbox(this.$sortDirectionPicker,{onChange:function(t){e.$sortDirectionInput.val(t.data("dir"))}}),this.$sortAttributeSelect.on("change",(function(){e.handleSortAttributeChange()})),this.handleSortAttributeChange(!0),Craft.ui.createField(i,{label:Craft.t("app","Default Sort"),fieldset:!0}).appendTo(t).addClass("sort-field")},handleSortAttributeChange:function(t){var e=this.$sortAttributeSelect.val();if("structure"===e)this.sortDirectionListbox.select(0),this.sortDirectionListbox.disable(),this.$sortDirectionPicker.addClass("disabled");else{this.sortDirectionListbox.enable(),this.$sortDirectionPicker.removeClass("disabled");var i=t?this.sourceData.defaultSort[1]:this.sourceData.sortOptions.find((function(t){return t.attr===e})).defaultDir;this.sortDirectionListbox.select("asc"===i?0:1)}},createTableAttributesField:function(t){var i=this.availableTableAttributes();if(this.sourceData.tableAttributes.length||i.length){var s=$("<div/>"),a=[];$('<input type="hidden" name="sources['.concat(this.sourceData.key,'][tableAttributes][]" value=""/>')).appendTo(s);for(var n=0;n<this.sourceData.tableAttributes.length;n++){var r=e(this.sourceData.tableAttributes[n],2),o=r[0],l=r[1];s.append(this.createTableColumnOption(o,l,!0)),a.push(o)}for(var h=0;h<i.length;h++){var d=e(i[h],2),c=d[0],u=d[1];Craft.inArray(c,a)||s.append(this.createTableColumnOption(c,u,!1))}new Garnish.DragSort(s.children(),{handle:".move",axis:"y"}),Craft.ui.createField(s,{label:Craft.t("app","Default Table Columns"),instructions:Craft.t("app","Choose which table columns should be visible for this source by default.")}).appendTo(t)}},availableTableAttributes:function(){var e=this.modal.availableTableAttributes.slice(0);return e.push.apply(e,t(this.sourceData.availableTableAttributes)),e},createTableColumnOption:function(t,e,i){return $('<div class="customize-sources-table-column"/>').append('<div class="icon move"/>').append(Craft.ui.createCheckbox({label:Craft.escapeHtml(e),name:"sources[".concat(this.sourceData.key,"][tableAttributes][]"),value:t,checked:i}))},getIndexSourceItem:function(){var t=this.modal.elementIndex.getSourceByKey(this.sourceData.key);if(t)return t.closest("li")}}),Craft.CustomizeSourcesModal.CustomSource=Craft.CustomizeSourcesModal.Source.extend({$labelInput:null,createSettings:function(t){var e=this,i=Craft.ui.createTextField({label:Craft.t("app","Label"),name:"sources[".concat(this.sourceData.key,"][label]"),value:this.sourceData.label}).appendTo(t);this.$labelInput=i.find(".text");var s="condition".concat(Math.floor(1e6*Math.random())),a=function(t){return t.replace(/__ID__/g,s).replace(/__SOURCE_KEY__(?=-)/g,Craft.formatInputId(e.sourceData.key)).replace(/__SOURCE_KEY__/g,e.sourceData.key)},n=this.sourceData.conditionBuilderHtml||a(this.modal.conditionBuilderHtml),r=this.sourceData.conditionBuilderJs||a(this.modal.conditionBuilderJs);Craft.ui.createField($("<div/>").append(n),{id:"criteria",label:Craft.t("app","{type} Criteria",{type:this.modal.elementTypeName})}).appendTo(t),Craft.appendBodyHtml(r),this.createSortField(t),this.createTableAttributesField(t),this.modal.userGroups.length&&Craft.ui.createCheckboxSelectField({label:Craft.t("app","User Groups"),instructions:Craft.t("app","Choose which user groups should have access to this source."),name:"sources[".concat(this.sourceData.key,"][userGroups]"),options:this.modal.userGroups,values:this.sourceData.userGroups||"*",showAllOption:!0}).appendTo(t),t.append("<hr/>"),this.$deleteBtn=$('<a class="error delete"/>').attr({role:"button",tabindex:"0"}).text(Craft.t("app","Delete custom source")).appendTo(t),this.addListener(this.$labelInput,"input","handleLabelInputChange"),this.addListener(this.$deleteBtn,"click","destroy"),this.addListener(this.$deleteBtn,"keypress",(function(t){Garnish.handleActivatingKeypress(t,e.destroy.bind(e))}))},availableTableAttributes:function(){var e=this.base();return this.isNew&&e.push.apply(e,t(this.modal.customFieldAttributes)),e},handleLabelInputChange:function(){this.updateItemLabel(this.$labelInput.val())},getIndexSourceItem:function(){var t,e=this.base();if(e?t=e.find(".label"):(t=$("<span/>",{class:"label"}),e=$("<li/>").append($("<a/>",{"data-key":this.sourceData.key}).append(t))),this.$labelInput){var i=Craft.trim(this.$labelInput.val());""===i&&(i=Craft.t("app","(blank)")),t.text(i)}return e}}),Craft.CustomizeSourcesModal.Heading=Craft.CustomizeSourcesModal.BaseSource.extend({$labelInput:null,$deleteBtn:null,isHeading:function(){return!0},createSettings:function(t){var e=this,i=Craft.ui.createTextField({label:Craft.t("app","Heading"),instructions:Craft.t("app","This can be left blank if you just want an unlabeled separator."),value:this.sourceData.heading||""}).appendTo(t);this.$labelInput=i.find(".text"),t.append("<hr/>"),this.$deleteBtn=$('<a class="error delete"/>').text(Craft.t("app","Delete heading")).attr({role:"button",tabindex:"0"}).appendTo(t),this.addListener(this.$labelInput,"input","handleLabelInputChange"),this.addListener(this.$deleteBtn,"click","destroy"),this.addListener(this.$deleteBtn,"keypress",(function(t){Garnish.handleActivatingKeypress(t,e.destroy.bind(e))}))},handleLabelInputChange:function(){this.updateItemLabel(this.$labelInput.val())},updateItemLabel:function(t){this.$itemLabel.html((t?Craft.escapeHtml(t):"<em>".concat(Craft.t("app","(blank)"),"</em>"))+"&nbsp;"),this.$itemInput.val(t)},getIndexSourceItem:function(){var t=(this.$labelInput?this.$labelInput.val():null)||this.sourceData.heading||"";return $('<li class="heading"/>').append($("<span/>").text(t)).append("<ul/>")}})},1519:function(){Craft.DataTableSorter=Garnish.DragSort.extend({$table:null,init:function(t,e){this.$table=$(t);var i=this.$table.children("tbody").children(":not(.filler)");(e=$.extend({},Craft.DataTableSorter.defaults,e)).container=this.$table.children("tbody"),e.helper=this.getHelper.bind(this),e.caboose="<tr/>",e.axis=Garnish.Y_AXIS,e.magnetStrength=4,e.helperLagBase=1.5,this.base(i,e)},getHelper:function(t){var e=$('<div class="'+this.settings.helperClass+'"/>').appendTo(Garnish.$bod),i=$("<table/>").appendTo(e),s=$("<tbody/>").appendTo(i);t.appendTo(s),i.width(this.$table.width()),i.prop("className",this.$table.prop("className"));for(var a=this.$table.find("tr:first").children(),n=t.children(),r=0;r<n.length;r++)$(n[r]).width($(a[r]).width());return e}},{defaults:{handle:".move",helperClass:"datatablesorthelper"}})},501:function(){Craft.DeleteUserModal=Garnish.Modal.extend({id:null,userId:null,$deleteActionRadios:null,$deleteSubmitBtn:null,userSelect:null,_deleting:!1,init:function(t,e){var i=this;this.id=Math.floor(1e9*Math.random()),this.userId=t,e=$.extend(Craft.DeleteUserModal.defaults,e);var s,a=$('<form class="modal fitted deleteusermodal" method="post" accept-charset="UTF-8">'+Craft.getCsrfInput()+'<input type="hidden" name="action" value="users/delete-user"/>'+(Garnish.isArray(this.userId)?"":'<input type="hidden" name="userId" value="'+this.userId+'"/>')+(e.redirect?'<input type="hidden" name="redirect" value="'+e.redirect+'"/>':"")+"</form>").appendTo(Garnish.$bod),n=$('<div class="body"><div class="content-summary"><p>'+Craft.t("app","What do you want to do with their content?")+'</p><ul class="bullets"></ul></div><div class="options"><label><input type="radio" name="contentAction" value="transfer"/> '+Craft.t("app","Transfer it to:")+'</label><div id="transferselect'+this.id+'" class="elementselect"><div class="elements"></div><button type="button" class="btn add icon dashed">'+Craft.t("app","Choose a user")+'</button></div></div><div><label class="error"><input type="radio" name="contentAction" value="delete"/> '+Craft.t("app","Delete their content")+"</label></div></div>").appendTo(a),r=$('<div class="buttons right"/>').appendTo(n),o=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(r);if(e.contentSummary.length)for(var l=0;l<e.contentSummary.length;l++)n.find("ul").append($("<li/>",{text:e.contentSummary[l]}));else n.find("ul").remove();if(this.$deleteActionRadios=n.find("input[type=radio]"),this.$deleteSubmitBtn=Craft.ui.createSubmitButton({class:"disabled",label:this._submitBtnLabel(!1),spinner:!0}).appendTo(r),Garnish.isArray(this.userId)){s=["and"];for(var h=0;h<this.userId.length;h++)s.push("not "+this.userId[h])}else s="not "+this.userId;this.userSelect=new Craft.BaseElementSelectInput({id:"transferselect"+this.id,name:"transferContentTo",elementType:"craft\\elements\\User",criteria:{id:s},limit:1,modalSettings:{closeOtherModals:!1},onSelectElements:function(){i.updateSizeAndPosition(),i.$deleteActionRadios.first().prop("checked")?i.validateDeleteInputs():i.$deleteActionRadios.first().trigger("click")},onRemoveElements:this.validateDeleteInputs.bind(this),selectable:!1,editable:!1}),this.addListener(o,"click","hide"),this.addListener(this.$deleteActionRadios,"change","validateDeleteInputs"),this.addListener(a,"submit","handleSubmit"),this.base(a,e)},_submitBtnLabel:function(t){var e=t?"Delete {num, plural, =1{user} other{users}} and content":"Delete {num, plural, =1{user} other{users}}";return Craft.t("app",e,{num:Garnish.isArray(this.userId)?this.userId.length:1})},validateDeleteInputs:function(){var t=!1;return this.$deleteActionRadios.eq(1).prop("checked")?(t=!0,this.$deleteSubmitBtn.find(".label").text(this._submitBtnLabel(!0))):(this.$deleteSubmitBtn.find(".label").text(this._submitBtnLabel(!1)),this.$deleteActionRadios.eq(0).prop("checked")&&(t=!!this.userSelect.totalSelected)),this.updateSizeAndPosition(),t?this.$deleteSubmitBtn.removeClass("disabled"):this.$deleteSubmitBtn.addClass("disabled"),t},handleSubmit:function(t){if(!this._deleting&&this.validateDeleteInputs()){this.$deleteSubmitBtn.addClass("loading"),this.disable(),this.userSelect.disable(),this._deleting=!0;try{!1===this.settings.onSubmit()&&t.preventDefault()}catch(e){throw t.preventDefault(),this.$deleteSubmitBtn.removeClass("loading"),e}}else t.preventDefault()},onFadeIn:function(){Garnish.isMobileBrowser(!0)||this.$deleteActionRadios.first().trigger("focus"),this.base()}},{defaults:{contentSummary:[],onSubmit:$.noop,redirect:null}})},2318:function(){Craft.DynamicGenerator=Craft.BaseInputGenerator.extend({callback:$.noop,init:function(t,e,i){this.callback=i,this.base(t,e)},generateTargetValue:function(t){return this.callback(t)}})},4755:function(){Craft.EditableTable=Garnish.Base.extend({initialized:!1,id:null,baseName:null,columns:null,sorter:null,biggestId:-1,$table:null,$tbody:null,$addRowBtn:null,$tableParent:null,$statusMessage:null,rowCount:0,hasMaxRows:!1,hasMinRows:!1,radioCheckboxes:null,init:function(t,e,i,s){var a=this;if(this.id=t,this.baseName=e,this.columns=i,this.setSettings(s,Craft.EditableTable.defaults),this.radioCheckboxes={},this.$table=$("#"+t),this.$tbody=this.$table.children("tbody"),this.$tableParent=this.$table.parent(),this.$statusMessage=this.$tableParent.find("[data-status-message]"),this.rowCount=this.$tbody.find("tr").length,this.$table.data("editable-table")&&(console.warn("Double-instantiating an editable table on an element"),this.$table.data("editable-table").destroy()),this.$table.data("editable-table",this),this.sorter=new Craft.DataTableSorter(this.$table,{helperClass:"editabletablesorthelper",copyDraggeeInputValuesToHelper:!0,onSortChange:function(){a.updateAllRows()}}),this.isVisible()?this.initialize():window.setTimeout(this.initializeIfVisible.bind(this),500),this.settings.minRows&&this.rowCount<this.settings.minRows)for(var n=this.rowCount;n<this.settings.minRows;n++)this.addRow()},isVisible:function(){return this.$table.parent().height()>0},initialize:function(){if(this.initialized)return!1;this.initialized=!0,this.removeListener(Garnish.$win,"resize");for(var t=this.$tbody.children(),e=0;e<t.length;e++)this.createRowObj(t[e]);var i=this.$table.parent(".input");return i.length&&this.$table.width()>i.width()&&i.css("overflow-x","auto"),this.$addRowBtn=this.$table.next(".add"),this.updateAddRowButton(),this.addListener(this.$addRowBtn,"activate","addRow"),!0},initializeIfVisible:function(){this.removeListener(Garnish.$win,"resize"),this.isVisible()?this.initialize():this.addListener(Garnish.$win,"resize","initializeIfVisible")},updateAddRowButton:function(){this.canAddRow()?(this.$addRowBtn.css("opacity","1"),this.$addRowBtn.css("pointer-events","auto"),this.$addRowBtn.attr("aria-disabled","false")):(this.$addRowBtn.css("opacity","0.2"),this.$addRowBtn.css("pointer-events","none"),this.$addRowBtn.attr("aria-disabled","true"))},updateAllRows:function(){if(!this.settings.staticRows)for(var t=this.$table.find("> tbody > tr"),e=0;e<t.length;e++)this.updateRow(t.eq(e))},updateRow:function(t){if(!this.settings.staticRows){var e=t.find("button.delete");e.length&&(e.attr("aria-label",Craft.t("app","Delete row {index}",{index:t.index()+1})),this.canDeleteRow()?e.removeAttr("disabled").removeClass("disabled"):e.attr("disabled","disabled").addClass("disabled"))}},updateDeleteRowButton:function(t){this.updateRow(this.$table.find('tr[data-id="'.concat(t,'"]')))},updateStatusMessage:function(){var t,e=this;this.$statusMessage.empty(),t=this.canAddRow()?Craft.t("app","Row could not be deleted. Minimum number of rows reached."):Craft.t("app","Row could not be added. Maximum number of rows reached."),setTimeout((function(){e.$statusMessage.text(t)}),250)},canDeleteRow:function(){return!!this.settings.allowDelete&&this.rowCount>this.settings.minRows},deleteRow:function(t){this.canDeleteRow()?(this.sorter.removeItems(t.$tr),t.$tr.remove(),this.rowCount--,this.updateAllRows(),this.updateAddRowButton(),0===this.rowCount?(this.$table.addClass("hidden"),this.$addRowBtn.trigger("focus")):this.$tbody.find(":focusable").last().trigger("focus"),this.settings.onDeleteRow(t.$tr),t.destroy()):this.updateStatusMessage()},canAddRow:function(){return!!this.settings.allowAdd&&(!this.settings.maxRows||this.rowCount<this.settings.maxRows)},addRow:function(t,e){if(this.canAddRow()){var i=this.settings.rowIdPrefix+(this.biggestId+1),s=this.createRow(i,this.columns,this.baseName,$.extend({},this.settings.defaultValues));e?s.prependTo(this.$tbody):s.appendTo(this.$tbody);var a=this.createRowObj(s);return this.sorter.addItems(s),!1!==t&&s.find("input:visible,textarea:visible,select:visible").first().trigger("focus"),this.rowCount++,this.updateAllRows(),this.updateAddRowButton(),this.$table.removeClass("hidden"),this.settings.onAddRow(s),a}this.updateStatusMessage()},createRow:function(t,e,i,s){return Craft.EditableTable.createRow(t,e,i,s,this.settings.allowReorder,this.settings.allowDelete)},createRowObj:function(t){return new Craft.EditableTable.Row(this,t)},focusOnPrevRow:function(t,e,i){var s,a=t.prev("tr");if((s=a.length?a.data("editable-table-row"):this.addRow(!1,!0))&&s.$tds[e])if($(s.$tds[e]).hasClass("disabled"))a&&this.focusOnPrevRow(a,e,i);else{var n=$("textarea,input.text",s.$tds[e]);n.length&&($(i).trigger("blur"),n.trigger("focus"))}},focusOnNextRow:function(t,e,i){var s,a=t.next("tr");if((s=a.length?a.data("editable-table-row"):this.addRow(!1))&&s.$tds[e])if($(s.$tds[e]).hasClass("disabled"))a&&this.focusOnNextRow(a,e,i);else{var n=$("textarea,input.text",s.$tds[e]);n.length&&($(i).trigger("blur"),n.trigger("focus"))}},importData:function(t,e,i){for(var s=t.split(/\r?\n|\r/),a=0;a<s.length;a++){for(var n=s[a].split("\t"),r=0;r<n.length;r++){var o=n[r];e.$tds.eq(i+r).find("textarea,input[type!=hidden]").val(o).trigger("input")}var l=e.$tr.next("tr");e=l.length?l.data("editable-table-row"):this.addRow(!1)}},destroy:function(){this.$table.removeData("editable-table"),this.base()}},{textualColTypes:["autosuggest","color","date","email","multiline","number","singleline","template","time","url"],defaults:{rowIdPrefix:"",defaultValues:{},allowAdd:!1,allowReorder:!1,allowDelete:!1,minRows:null,maxRows:null,onAddRow:$.noop,onDeleteRow:$.noop},createRow:function(t,e,i,s,a,n){var r=$("<tr/>",{"data-id":t});for(var o in e)if(e.hasOwnProperty(o)){var l,h=e[o],d=void 0!==s[o]?s[o]:"";if("heading"===h.type)l=$("<th/>",{scope:"row",class:h.class,html:d});else{var c=i+"["+t+"]["+o+"]";switch(l=$("<td/>",{class:"".concat(h.class," ").concat(h.type,"-cell"),width:h.width}),Craft.inArray(h.type,Craft.EditableTable.textualColTypes)&&l.addClass("textual"),h.code&&l.addClass("code"),h.type){case"checkbox":$('<div class="checkbox-wrapper"/>').append(Craft.ui.createCheckbox({name:c,value:h.value||"1",checked:!!d})).appendTo(l);break;case"color":Craft.ui.createColorInput({name:c,value:d,small:!0}).appendTo(l);break;case"date":Craft.ui.createDateInput({name:c,value:d}).appendTo(l);break;case"lightswitch":Craft.ui.createLightswitch({name:c,value:h.value||"1",on:!!d,small:!0}).appendTo(l);break;case"select":Craft.ui.createSelect({name:c,options:h.options,value:d||function(){for(var t in h.options)if(h.options.hasOwnProperty(t)&&h.options[t].default)return void 0!==h.options[t].value?h.options[t].value:t;return null}(),class:"small"}).appendTo(l);break;case"time":Craft.ui.createTimeInput({name:c,value:d}).appendTo(l);break;case"email":case"url":Craft.ui.createTextInput({name:c,value:d,type:h.type,placeholder:h.placeholder||null}).appendTo(l);break;default:$("<textarea/>",{name:c,rows:h.rows||1,val:d,placeholder:h.placeholder}).appendTo(l)}}l.appendTo(r)}return a&&$("<td/>",{class:"thin action"}).append($("<a/>",{class:"move icon",title:Craft.t("app","Reorder"),role:"button",type:"button"})).appendTo(r),n&&$("<td/>",{class:"thin action"}).append($("<button/>",{class:"delete icon",title:Craft.t("app","Delete"),type:"button"})).appendTo(r),r}}),Craft.EditableTable.Row=Garnish.Base.extend({table:null,id:null,niceTexts:null,$tr:null,$tds:null,tds:null,$textareas:null,$deleteBtn:null,init:function(t,e){this.table=t,this.$tr=$(e),this.$tds=this.$tr.children(),this.tds=[],this.id=this.$tr.attr("data-id"),this.$tr.data("editable-table-row",this);var i=parseInt(this.id.substring(this.table.settings.rowIdPrefix.length));i>this.table.biggestId&&(this.table.biggestId=i),this.$textareas=$(),this.niceTexts=[];var s,a,n,r,o,l={},h=0;for(s in this.table.columns)this.table.columns.hasOwnProperty(s)&&(a=this.table.columns[s],n=this.tds[s]=this.$tds[h],Craft.inArray(a.type,Craft.EditableTable.textualColTypes)?(r=$("textarea",n),this.$textareas=this.$textareas.add(r),this.addListener(r,"focus","onTextareaFocus"),this.addListener(r,"mousedown","ignoreNextTextareaFocus"),this.niceTexts.push(new Garnish.NiceText(r,{onHeightChange:this.onTextareaHeightChange.bind(this)})),this.addListener(r,"keypress",{tdIndex:h,type:a.type},"handleKeypress"),this.addListener(r,"input",{type:a.type},"validateValue"),r.trigger("input"),"multiline"!==a.type&&this.addListener(r,"paste",{tdIndex:h,type:a.type},"handlePaste"),l[s]=r):"checkbox"===a.type&&(o=$('input[type="checkbox"]',n),a.radioMode&&(void 0===this.table.radioCheckboxes[s]&&(this.table.radioCheckboxes[s]=[]),this.table.radioCheckboxes[s].push(o[0]),this.addListener(o,"change",{colId:s},"onRadioCheckboxChange")),a.toggle&&this.addListener(o,"change",{colId:s},(function(t){this.applyToggleCheckbox(t.data.colId)}))),$(n).hasClass("disabled")||this.addListener(n,"click",{td:n},(function(t){t.target===t.data.td&&$(t.data.td).find("textarea,input,select,.lightswitch").focus()})),h++);for(s in this.onTextareaHeightChange(),this.table.columns)this.table.columns.hasOwnProperty(s)&&"checkbox"===(a=this.table.columns[s]).type&&a.toggle&&this.applyToggleCheckbox(s);for(s in this.table.columns)this.table.columns.hasOwnProperty(s)&&(a=this.table.columns[s]).autopopulate&&void 0!==l[a.autopopulate]&&!l[s].val()&&new Craft.HandleGenerator(l[s],l[a.autopopulate],{allowNonAlphaStart:!0});var d=this.$tr.children().last().find(".delete");this.addListener(d,"click","deleteRow");var c=this.$tr.find("input,textarea,select,.lightswitch");this.addListener(c,"focus",(function(t){$(t.currentTarget).closest("td:not(.disabled)").addClass("focus")})),this.addListener(c,"blur",(function(t){$(t.currentTarget).closest("td").removeClass("focus")}))},onTextareaFocus:function(t){this.onTextareaHeightChange();var e=$(t.currentTarget);e.data("ignoreNextFocus")?e.data("ignoreNextFocus",!1):window.setTimeout((function(){Craft.selectFullValue(e)}),0)},onRadioCheckboxChange:function(t){if(t.currentTarget.checked)for(var e=0;e<this.table.radioCheckboxes[t.data.colId].length;e++){var i=this.table.radioCheckboxes[t.data.colId][e];i.checked=i===t.currentTarget}},applyToggleCheckbox:function(t){for(var e,i,s=this.table.columns[t],a=$('input[type="checkbox"]',this.tds[t]).prop("checked"),n=0;n<s.toggle.length;n++)e=s.toggle[n],this.table.colum,(i="!"===e[0])&&(e=e.substring(1)),a&&!i||!a&&i?$(this.tds[e]).removeClass("disabled").find("textarea, input").prop("disabled",!1):$(this.tds[e]).addClass("disabled").find("textarea, input").prop("disabled",!0)},ignoreNextTextareaFocus:function(t){$.data(t.currentTarget,"ignoreNextFocus",!0)},handleKeypress:function(t){var e=t.keyCode?t.keyCode:t.charCode,i=Garnish.isCtrlKeyPressed(t);if(e===Garnish.RETURN_KEY&&("multiline"!==t.data.type||i))return t.preventDefault(),void(t.shiftKey?this.table.focusOnPrevRow(this.$tr,t.data.tdIndex,t.currentTarget):this.table.focusOnNextRow(this.$tr,t.data.tdIndex,t.currentTarget))},handlePaste:function(t){var e=Craft.trim(t.originalEvent.clipboardData.getData("Text")," \n\r");e.match(/[\t\r\n]/)&&(t.preventDefault(),this.table.importData(e,this,t.data.tdIndex))},validateValue:function(t){if("multiline"!==t.data.type)if("number"!==t.data.type){var e=t.currentTarget.value.replace(/[\r\n]/g,"");e!==t.currentTarget.value&&(t.currentTarget.value=e)}else Craft.filterNumberInputVal(t.currentTarget)},onTextareaHeightChange:function(){for(var t=-1,e=0;e<this.niceTexts.length;e++)this.niceTexts[e].height>t&&(t=this.niceTexts[e].height);this.$textareas.css("min-height",t);var i=this.$textareas.filter(":visible").first().parent().height();i>t&&this.$textareas.css("min-height",i)},deleteRow:function(){this.table.deleteRow(this)}},{numericKeyCodes:[9,8,37,38,39,40,45,91,46,190,48,49,50,51,52,53,54,55,56,57]})},8468:function(){Craft.ElementActionTrigger=Garnish.Base.extend({maxLevels:null,newChildUrl:null,$trigger:null,$selectedItems:null,triggerEnabled:!0,init:function(t){$.isPlainObject(t)||(t={}),void 0!==t.batch&&(t.bulk=t.batch,delete t.batch),Object.defineProperty(t,"batch",{get:function(){return this.bulk},set:function(t){this.bulk=t}}),this.setSettings(t,Craft.ElementActionTrigger.defaults),this.$trigger=$("#"+t.type.replace(/[\[\]\\]+/g,"-")+"-actiontrigger"),this.settings.activate&&(this.$trigger.data("custom-handler",!0),"FORM"===this.$trigger.prop("nodeName")?this.addListener(this.$trigger,"submit","handleTriggerActivation"):this.addListener(this.$trigger,"click","handleTriggerActivation")),this.updateTrigger(),Craft.elementIndex.on("selectionChange",this.updateTrigger.bind(this))},updateTrigger:function(){0!==Craft.elementIndex.getSelectedElements().length&&(this.validateSelection()?this.enableTrigger():this.disableTrigger())},validateSelection:function(){var t=!0;return this.$selectedItems=Craft.elementIndex.getSelectedElements(),!this.settings.bulk&&this.$selectedItems.length>1?t=!1:"function"==typeof this.settings.validateSelection&&(t=this.settings.validateSelection(this.$selectedItems)),t},enableTrigger:function(){this.triggerEnabled||(this.$trigger.removeClass("disabled"),this.triggerEnabled=!0)},disableTrigger:function(){this.triggerEnabled&&(this.$trigger.addClass("disabled"),this.triggerEnabled=!1)},handleTriggerActivation:function(t){t.preventDefault(),t.stopPropagation(),this.triggerEnabled&&this.settings.activate(this.$selectedItems)}},{defaults:{type:null,bulk:!0,validateSelection:null,activate:null}})},5049:function(){function t(t,i){if(t){if("string"==typeof t)return e(t,i);var s=Object.prototype.toString.call(t).slice(8,-1);return"Object"===s&&t.constructor&&(s=t.constructor.name),"Map"===s||"Set"===s?Array.from(t):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?e(t,i):void 0}}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.ElementEditor=Garnish.Base.extend({isFullPage:null,$container:null,$tabContainer:null,$contentContainer:null,$revisionBtn:null,$revisionLabel:null,$spinner:null,$expandSiteStatusesBtn:null,$statusIcon:null,$previewBtn:null,$editMetaBtn:null,metaHud:null,$nameTextInput:null,$saveMetaBtn:null,$siteStatusPane:null,$globalLightswitch:null,$siteLightswitches:null,$additionalSiteField:null,siteIds:null,newSiteIds:null,enableAutosave:null,lastSerializedValue:null,listeningForChanges:!1,pauseLevel:0,timeout:null,cancelToken:null,ignoreFailedRequest:!1,queue:null,submittingForm:!1,duplicatedElements:null,failed:!1,httpStatus:null,httpError:null,openingPreview:!1,preview:null,activatedPreviewToken:!1,previewTokenQueue:null,previewLinks:null,scrollY:null,hiddenTipsStorageKey:"Craft-"+Craft.systemUid+".TipField.hiddenTips",get tipDismissBtn(){return this.$container.find(".tip-dismiss-btn")},get slideout(){return this.$container.data("slideout")},init:function(e,i){var s=this;if(this.$container=$(e),"FORM"!==this.$container.prop("tagName"))throw"Element editors may only be used with forms.";this.$container.data("elementEditor")&&(console.warn("Double-instantiating an element editor on an element."),this.$container.data("elementEditor").destroy()),this.$container.data("elementEditor",this),this.$container.attr("data-element-editor",""),this.setSettings(i,Craft.ElementEditor.defaults),this.isFullPage=this.$container[0]===Craft.cp.$primaryForm[0],this.isFullPage?(this.$tabContainer=$("#tabs"),this.$contentContainer=$("#content")):(this.$tabContainer=this.slideout.$tabContainer,this.$contentContainer=this.slideout.$content),this.queue=this._createQueue(),this.previewTokenQueue=this._createQueue(),this.duplicatedElements={},this.enableAutosave=Craft.autosaveDrafts,this.previewLinks=[],this.siteIds=Object.keys(this.settings.siteStatuses).map((function(t){return parseInt(t)})),this.$revisionBtn=this.$container.find(".context-btn"),this.$revisionLabel=this.$container.find(".revision-label"),this.$previewBtn=this.$container.find(".preview-btn");var a,n,r=this.isFullPage?$("#page-title"):this.slideout.$toolbar;if(this.$spinner=$("<div/>",{class:"revision-spinner spinner hidden",title:Craft.t("app","Saving")}).appendTo(r),this.$statusIcon=$("<div/>",{class:"revision-status ".concat(this.isFullPage?"invisible":"hidden")}).appendTo(r),this.$statusMessage=$("<div/>",{class:"revision-status-message visually-hidden","aria-live":"polite"}).appendTo(r),this.$expandSiteStatusesBtn=$(".expand-status-btn"),this.settings.canEditMultipleSites&&this.addListener(this.$expandSiteStatusesBtn,"click","expandSiteStatuses"),this.settings.previewTargets.length&&this.isFullPage){this.settings.enablePreview&&this.addListener(this.$previewBtn,"click","openPreview");var o=this.$container.find(".preview-btn-container");if(1===this.settings.previewTargets.length){var l=(a=this.settings.previewTargets,n=1,function(t){if(Array.isArray(t))return t}(a)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(a,n)||t(a,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];this.createPreviewLink(l).addClass("view-btn btn").attr("aria-label",Craft.t("app","View")).appendTo(o)}else this.createShareMenu(o)}this.settings.revisionId||(this.$container.data("serializer",(function(){return s.serializeForm(!0)})),this.$container.data("initialSerializedValue",this.serializeForm(!0)),this.isFullPage&&this.addListener(this.$container,"submit","handleSubmit"),this.settings.isProvisionalDraft?this.initForProvisionalDraft():this.settings.draftId&&!this.settings.isUnpublishedDraft?this.initForDraft():this.settings.canSaveCanonical||this.addListener(this.$container,"submit.saveShortcut",(function(t){t.saveShortcut&&(t.preventDefault(),s.createDraft(),s.removeListener(s.$container,"submit.saveShortcut"))})),this.listenForChanges(),this.addListener(this.$statusIcon,"click",(function(){s.showStatusHud(s.$statusIcon)})),this.handleDismissibleTips(),this.isFullPage&&Craft.messageReceiver&&Craft.broadcaster.addEventListener("message",(function(t){if("saveDraft"===t.data.event&&t.data.canonicalId===s.settings.canonicalId&&(t.data.draftId===s.settings.draftId||t.data.isProvisionalDraft&&!s.settings.draftId)||"saveElement"===t.data.event&&t.data.id===s.settings.canonicalId&&!s.settings.draftId)Craft.setLocalStorage("scrollY",window.scrollY),window.location.reload();else if("deleteDraft"===t.data.event&&t.data.canonicalId===s.settings.canonicalId&&t.data.draftId===s.settings.draftId){var e=new URL(window.location.href);e.searchParams.delete("draftId"),e.href!==document.location.href?window.location.href=e:(Craft.setLocalStorage("scrollY",window.scrollY),window.location.reload())}})))},_createQueue:function(){var t=this,e=new Craft.Queue;return e.on("beforeRun",(function(){t.showSpinner()})),e.on("afterRun",(function(){t.hideSpinner()})),e},get namespace(){return this.isFullPage?null:this.slideout.namespace},namespaceInputName:function(t){return Craft.namespaceInputName(t,this.namespace)},namespaceId:function(t){return Craft.namespaceId(t,this.namespace)},listenForChanges:function(){var t=this;if(!(this.listeningForChanges||this.pauseLevel>0)&&this.enableAutosave&&this.settings.canCreateDrafts){this.listeningForChanges=!0;var e=this.isFullPage?Garnish.$bod:this.$container;this.addListener(e,"keypress,keyup,change,focus,blur,click,mousedown,mouseup",(function(e){$(e.target).is(t.statusIcons())||(clearTimeout(t.timeout),["keypress","keyup","change"].includes(e.type)?t.timeout=setTimeout(t.checkForm.bind(t),500):t.checkForm())}))}},stopListeningForChanges:function(){this.listeningForChanges&&(this.removeListener(Garnish.$bod,"keypress,keyup,change,focus,blur,click,mousedown,mouseup"),clearTimeout(this.timeout),this.listeningForChanges=!1)},pause:function(){this.pauseLevel++,this.stopListeningForChanges()},resume:function(){if(0===this.pauseLevel)throw"Craft.ElementEditor::resume() should only be called after pause().";this.pauseLevel--,0===this.pauseLevel&&this.enableAutosave&&(this.checkForm(),this.listenForChanges())},initForProvisionalDraft:function(){var t=this,e=this.$container.find(".discard-changes-btn");if(!e.length){var i,s,a;this.isFullPage?(i=$("#content").height(),s=Garnish.$win.scrollTop(),a=Craft.cp.$noticeContainer):a=this.$container.find(".so-notice");var n=$("<div/>",{class:"draft-notice"}).append($("<div/>",{class:"draft-icon","aria-hidden":"true","data-icon":"edit"})).append($("<p/>",{text:Craft.t("app","Showing your unsaved changes.")})).appendTo(a);if(e=$("<button/>",{type:"button",class:"discard-changes-btn btn",text:Craft.t("app","Discard")}).appendTo(n),this.isFullPage){var r=$("#content").height()-i;if(Garnish.$win.scrollTop(s+r),Garnish.$win.scrollTop()===s){Craft.cp.$contentContainer.css("pointer-events","none"),$("#content-header").css("min-height","auto");var o=a.height();a.css({height:o-r,overflow:"hidden"}).velocity({height:o},"fast",(function(){$("#content-header").css("min-height",""),a.css({height:"",overflow:""}),setTimeout((function(){Craft.cp.$contentContainer.css("pointer-events","")}),300)}))}}}this.addListener(e,"keypress,keyup,change,focus,blur,click,mousedown,mouseup",(function(t){t.stopPropagation()})),this.addListener(e,"click",(function(){confirm(Craft.t("app","Are you sure you want to discard your changes?"))&&t.queue.unshift((function(){return new Promise((function(e,i){t.isFullPage?Craft.submitForm(t.$container,{action:"elements/delete-draft",redirect:t.settings.hashedCpEditUrl,params:{draftId:t.settings.draftId,provisional:1}}):Craft.sendActionRequest("POST","elements/delete-draft",{data:{elementId:t.settings.canonicalId,draftId:t.settings.draftId,provisional:1}}).then((function(e){Craft.cp.displaySuccess(e.data.message),t.slideout.close()})).catch(i)}))}))}))},initForDraft:function(){var t=this;this.createEditMetaBtn(),this.settings.canSaveCanonical&&Garnish.uiLayerManager.registerShortcut({keyCode:Garnish.S_KEY,ctrl:!0,alt:!0},(function(){Craft.submitForm(t.$container,{action:"elements/apply-draft",redirect:t.settings.hashedCpEditUrl})}),0)},expandSiteStatuses:function(){var t=this;this.removeListener(this.$expandSiteStatusesBtn,"click"),this.$expandSiteStatusesBtn.velocity({opacity:0},"fast",(function(){t.$expandSiteStatusesBtn.remove()}));var e=this.$container.find(".enabled-for-site-".concat(this.settings.siteId,"-field"));if(this.$siteStatusPane=e.parent(),this.settings.revisionId)this._getOtherSupportedSites().forEach((function(e){return t._createSiteStatusField(e)}));else{e.addClass("nested");var i=Craft.ui.createLightswitchField({label:Craft.t("app","Enabled for all sites"),name:this.namespaceInputName("enabled")}).insertBefore(e);i.find("label").css("font-weight","bold"),this.$globalLightswitch=i.find(".lightswitch"),this.settings.revisionId||this._showField(i);var s=Object.values(this.settings.siteStatuses),a=s.includes(!0),n=s.includes(!1),r=a&&n?"-":a?"1":"",o=encodeURIComponent(this.namespaceInputName("enabledForSite[".concat(this.settings.siteId,"]")))+"="+(this.settings.enabledForSite?"1":"");this.$siteLightswitches=e.find(".lightswitch").on("change",this._updateGlobalStatus.bind(this)),this._getOtherSupportedSites().forEach((function(e){return t._createSiteStatusField(e)}));for(var l=encodeURIComponent(this.namespaceInputName("enabled"))+"=".concat(r),h=0;h<this.$siteLightswitches.length;h++){var d=this.$siteLightswitches.eq(h).data("lightswitch").$input;l+="&"+encodeURIComponent(d.attr("name"))+"="+d.val()}this.$container.data("initialSerializedValue",this.$container.data("initialSerializedValue").replace(o,l)),this.lastSerializedValue&&(this.lastSerializedValue=this.lastSerializedValue.replace(o,l)),this.settings.additionalSites&&this.settings.additionalSites.length&&this.isFullPage&&this._createAddlSiteField(),this.$globalLightswitch.focus(),this.$globalLightswitch.on("change",this._updateSiteStatuses.bind(this)),this._updateGlobalStatus()}},_getOtherSupportedSites:function(){var t=this;return Craft.sites.filter((function(e){return e.id!=t.settings.siteId&&t.siteIds.includes(e.id)}))},_showField:function(t){var e=t.height();t.css({overflow:"hidden","min-height":"auto"}).height(0).velocity({height:e},"fast",(function(){t.css({overflow:"",height:"","min-height":""})}))},_removeField:function(t){t.css({overflow:"hidden","min-height":"auto"}).velocity({height:0},"fast",(function(){t.remove()}))},_updateGlobalStatus:function(){var t=!0,e=!0;this.$siteLightswitches.each((function(){if($(this).data("lightswitch").on?e=!1:t=!1,!t&&!e)return!1})),t?this.$globalLightswitch.data("lightswitch").turnOn(!0):e?this.$globalLightswitch.data("lightswitch").turnOff(!0):this.$globalLightswitch.data("lightswitch").turnIndeterminate(!0)},_updateSiteStatuses:function(){var t=this.$globalLightswitch.data("lightswitch").on;this.$siteLightswitches.each((function(){t?$(this).data("lightswitch").turnOn(!0):$(this).data("lightswitch").turnOff(!0)}))},_createSiteStatusField:function(t,e){var i=Craft.ui.createLightswitchField({fieldClass:"enabled-for-site-".concat(t.id,"-field"),label:t.name,name:this.namespaceInputName("enabledForSite[".concat(t.id,"]")),on:void 0!==e?e:!this.settings.siteStatuses.hasOwnProperty(t.id)||this.settings.siteStatuses[t.id],disabled:!!this.settings.revisionId});if(this.$additionalSiteField?i.insertBefore(this.$additionalSiteField):i.appendTo(this.$siteStatusPane),!this.settings.revisionId){i.addClass("nested");var s=i.find(".lightswitch").on("change",this._updateGlobalStatus.bind(this));this.$siteLightswitches=this.$siteLightswitches.add(s)}return this._showField(i),i},_createAddlSiteField:function(){var i,s=this,a=Craft.sites.filter((function(t){return!s.siteIds.includes(t.id)&&s.settings.additionalSites.some((function(e){return e.siteId==t.id}))}));if(a.length){var n="add-site-label",r=$("<span/>",{text:Craft.t("app","Add a site..."),class:"visually-hidden",id:n}),o=Craft.ui.createSelect({options:[{label:Craft.t("app","Add a site…")}].concat((i=a.map((function(t){return{label:t.name,value:t.id}})),function(t){if(Array.isArray(t))return e(t)}(i)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(i)||t(i)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())),labelledBy:n}).addClass("fullwidth");this.$additionalSiteField=Craft.ui.createField(o,{}).addClass("nested add").appendTo(this.$siteStatusPane),r.prependTo(this.$additionalSiteField);var l=o.find("select");l.on("change",(function(){var t=parseInt(l.val()),e=Craft.sites.find((function(e){return e.id===t}));if(e){var i=s.settings.additionalSites.find((function(t){return t.siteId==e.id}));s._createSiteStatusField(e,i.enabledByDefault),s._updateGlobalStatus(),l.val("").find('option[value="'.concat(t,'"]')).remove(),null===s.newSiteIds&&(s.newSiteIds=[]),s.siteIds.push(t),s.newSiteIds.push(t),1===l.find("option").length&&s._removeField(s.$additionalSiteField)}})),this._showField(this.$additionalSiteField)}},showStatusHud:function(t){var e;this.failed?(e='<p class="error"><strong>'.concat(this._saveFailMessage(),"</strong></p>"),this.httpError&&(e+='<p class="http-error code">'.concat(Craft.escapeHtml(this.httpError),"</p>")),400===this.httpStatus&&(e+='<button class="btn refresh-btn">'.concat(Craft.t("app","Refresh"),"</button>"))):e="<p>".concat(this._saveSuccessMessage(),"</p>");var i=new Garnish.HUD(t,e,{hudClass:"hud revision-status-hud",onHide:function(){i.destroy()}});i.$mainContainer.find(".refresh-btn").on("click",(function(){window.location.reload()}))},_saveSuccessMessage:function(){return this.settings.isProvisionalDraft||this.settings.isUnpublishedDraft?Craft.t("app","Your changes have been stored."):Craft.t("app","The draft has been saved.")},_saveFailMessage:function(){return this.settings.isProvisionalDraft||this.settings.isUnpublishedDraft?Craft.t("app","Your changes could not be stored."):Craft.t("app","The draft could not be saved.")},spinners:function(){return this.preview?this.$spinner.add(this.preview.$spinner):this.$spinner},showSpinner:function(){this.spinners().removeClass("hidden")},hideSpinner:function(){this.spinners().addClass("hidden")},statusIcons:function(){return this.preview?this.$statusIcon.add(this.preview.$statusIcon):this.$statusIcon},statusMessage:function(){return this.preview?this.$statusMessage.add(this.preview.$statusMessage):this.$statusMessage},createEditMetaBtn:function(){var t=this.$container.find(".context-btngroup");this.$editMetaBtn=$("<button/>",{type:"button",class:"btn edit icon","aria-expanded":"false","aria-label":Craft.t("app","Edit draft settings"),title:Craft.t("app","Edit draft settings")}).appendTo(t),t.find(".btngroup-btn-last").removeClass("btngroup-btn-last"),this.addListener(this.$editMetaBtn,"click","showMetaHud")},createPreviewLink:function(t,e){var i=this,s=$("<a/>",{href:this.getTokenizedPreviewUrl(t.url,null,!1),text:e||Craft.t("app","View"),target:"_blank",data:{targetUrl:t.url,targetLabel:t.label}});return this.addListener(s,"click",(function(){setTimeout((function(){i.activatePreviewToken()}),1)})),this.previewLinks.push(s),s},updatePreviewLinks:function(){var t=this;this.previewLinks.forEach((function(e){t.updatePreviewLinkHref(e),t.activatedPreviewToken&&t.removeListener(e,"click")}))},updatePreviewLinkHref:function(t){t.attr("href",this.getTokenizedPreviewUrl(t.data("targetUrl"),null,!1))},activatePreviewToken:function(){this.settings.isLive||(this.activatedPreviewToken=!0,this.updatePreviewLinks())},createShareMenu:function(t){var e=this,i=$("<button/>",{type:"button",class:"view-btn btn menubtn",text:Craft.t("app","View")}).appendTo(t),s=$("<div/>",{class:"menu"}).appendTo(t),a=$("<ul/>").appendTo(s);this.settings.previewTargets.forEach((function(t){$("<li/>").append(e.createPreviewLink(t,t.label)).appendTo(a)})),new Garnish.MenuBtn(i)},getPreviewTokenParams:function(){var t={elementType:this.settings.elementType,canonicalId:this.settings.canonicalId,siteId:this.settings.siteId,revisionId:this.settings.revisionId,previewToken:this.settings.previewToken};return this.settings.draftId&&!this.settings.isProvisionalDraft&&(t.draftId=this.settings.draftId),t},getPreviewToken:function(){var t=this;return this.previewTokenQueue.push((function(){return new Promise((function(e,i){t.activatedPreviewToken?e(t.settings.previewToken):Craft.sendActionRequest("POST","preview/create-token",{data:t.getPreviewTokenParams()}).then((function(){t.activatePreviewToken(),e(t.settings.previewToken)})).catch(i)}))}))},getTokenizedPreviewUrl:function(t,e,i){var s=this;void 0===i&&(i=!0);var a={};if(!e&&this.settings.isLive||(a[e||"x-craft-preview"]=Craft.randomString(10)),this.settings.siteToken&&(a[Craft.siteToken]=this.settings.siteToken),this.settings.isLive){var n=Craft.getUrl(t,a);return i?new Promise((function(t){t(n)})):n}if(!this.settings.previewToken)throw"Missing preview token";a[Craft.tokenParam]=this.settings.previewToken;var r=Craft.getUrl(t,a);if(this.activatedPreviewToken)return i?new Promise((function(t){t(r)})):r;if(i)return new Promise((function(t,e){s.getPreviewToken().then((function(){t(r)})).catch(e)}));var o=this.getPreviewTokenParams();return o.redirect=r,Craft.getActionUrl("preview/create-token",o)},getPreview:function(){var t=this;return this.preview||(this.preview=new Craft.Preview(this),this.enableAutosave||(this.preview.on("open",(function(){t.enableAutosave=!0,t.listenForChanges()})),this.preview.on("close",(function(){t.enableAutosave=!1,t.stopListeningForChanges();var e=t.statusIcons();e.hasClass("checkmark-icon")&&e.addClass("hidden")}))),this.preview.on("close",(function(){t.scrollY&&(window.scrollTo(0,t.scrollY),t.scrollY=null)}))),this.preview},openPreview:function(){var t=this;Garnish.hasAttr(this.$previewBtn,"aria-disabled")||(this.$previewBtn.attr("aria-disabled",!0),this.$previewBtn.addClass("loading"),this.queue.push((function(){return new Promise((function(e,i){t.openingPreview=!0,t.ensureIsDraftOrRevision(!0).then((function(){t.scrollY=window.scrollY,t.$previewBtn.removeAttr("aria-disabled"),t.$previewBtn.removeClass("loading"),t.getPreview().open(),t.openingPreview=!1,e()})).catch(i)}))})))},ensureIsDraftOrRevision:function(t){var e=this;return new Promise((function(i,s){if(e.settings.draftId||e.settings.revisionId)i();else{if(t&&e.serializeForm(!0)===e.$container.data("initialSerializedValue"))return void i();e.createDraft().then(i).catch(s)}}))},serializeForm:function(t){var e=this.$container.serialize();if(this.isPreviewActive()&&(e=e.replace("__PREVIEW_FIELDS__=1",this.preview.$editor.serialize())),t&&!this.settings.isUnpublishedDraft){var i=this.namespaceInputName("action"),s=this.namespaceInputName("redirect");e=(e=e.replace(new RegExp("&".concat(Craft.escapeRegex(i),"=[^&]*")),"")).replace(new RegExp("&".concat(Craft.escapeRegex(s),"=[^&]*")),"")}return e},checkForm:function(t){var e=this;return this.queue.push((function(){return new Promise((function(i,s){if(e.settings.revisionId||e.pauseLevel>0||!e.enableAutosave||!e.settings.canCreateDrafts)i();else if(clearTimeout(e.timeout),e.timeout=null,void 0!==e.$container.data("initialSerializedValue")){var a=e.serializeForm(!0);t||a!==(e.lastSerializedValue||e.$container.data("initialSerializedValue"))?e.saveDraft(a).then(i).catch((function(t){console.warn("Couldn’t save draft:",t),s(t)})):i()}else e.timeout=setTimeout(e.checkForm.bind(e),500)}))}))},isPreviewActive:function(){return this.preview&&this.preview.isActive},createDraft:function(){var t=this;return this.queue.push((function(){return new Promise((function(e,i){t.saveDraft(t.serializeForm(!0)).then(e).catch(i)}))}))},saveDraft:function(t){var e=this;return new Promise((function(i,s){if(e.submittingForm)s("Form already being submitted.");else{e.lastSerializedValue=t,e.failed=!1,e.httpStatus=null,e.httpError=null,e.cancelToken=axios.CancelToken.source(),e.statusIcons().velocity("stop").css("opacity","").removeClass("hidden invisible checkmark-icon alert-icon fade-out").addClass("hidden"),e.statusMessage().empty(),e.$saveMetaBtn&&e.$saveMetaBtn.addClass("active");var a,n,r,o=[],l=e.prepareData(t,e.settings.isUnpublishedDraft?null:function(t,e){e.length&&o.push(decodeURIComponent(e[0].split("=")[0]))}),h=(a={},n=e.namespaceInputName("visibleLayoutElements"),r=e.settings.visibleLayoutElements,n in a?Object.defineProperty(a,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):a[n]=r,a);!e.settings.isProvisionalDraft&&e.settings.draftId||(h[e.namespaceInputName("provisional")]=1);var d=e.$contentContainer.children("[data-layout-tab]:not(.hidden)").data("id");d&&(h[e.namespaceInputName("selectedTab")]=d),l+="&".concat($.param(h)),Craft.sendActionRequest("POST","elements/save-draft",{cancelToken:e.cancelToken.token,headers:e._saveHeaders,data:l}).then((function(s){e._afterSaveDraft();var a=!e.settings.draftId;a&&(e.settings.isProvisionalDraft=!0,e.$revisionLabel.append($("<span/>",{text:" — ".concat(Craft.t("app","Edited"))}))),e.isFullPage&&(s.data.title&&e.$container.find(".screen-title").text(s.data.title),s.data.docTitle&&(document.title=s.data.docTitle)),e.settings.isProvisionalDraft||(e.$revisionLabel.text(s.data.draftName),e.settings.draftName=s.data.draftName);var n=e.$revisionBtn.data("menubtn")?e.$revisionBtn.data("menubtn").menu:null;for(var r in e.newSiteIds&&(n||(e.$revisionBtn.removeClass("disabled").addClass("menubtn"),new Garnish.MenuBtn(e.$revisionBtn),(n=e.$revisionBtn.data("menubtn").menu).$container.removeClass("hidden")),e.newSiteIds.forEach((function(t){var i=n.$options.filter("[data-site-id=".concat(t,"]")),s=e.settings.additionalSites.find((function(e){return e.siteId==t}));s&&void 0!==s.enabledByDefault&&!s.enabledByDefault||i.find(".status").removeClass("disabled").addClass("enabled"),i.parent().removeClass("hidden").closest(".site-group").removeClass("hidden")})),n.$container.find(".revision-hr").removeClass("hidden"),e.newSiteIds=null),e.settings.isProvisionalDraft?a&&(e.$container.find("input.action-input").attr("value","elements/apply-draft"),e.settings.draftId=s.data.draftId,e.settings.isLive=!1,e.previewToken=null,e.initForProvisionalDraft()):n&&(n.$options.filter(".sel").find(".draft-name").text(s.data.draftName),n.$options.filter(".sel").find(".draft-meta").text(s.data.creator?Craft.t("app","Saved {timestamp} by {creator}",{timestamp:s.data.timestamp,creator:s.data.creator}):Craft.t("app","Saved {timestamp}",{timestamp:s.data.timestamp}))),s.data.previewTargets&&JSON.stringify(s.data.previewTargets)!==JSON.stringify(e.settings.previewTargets)&&e.updatePreviewTargets(s.data.previewTargets),a&&(e.updatePreviewLinks(),e.trigger("createProvisionalDraft")),e.$nameTextInput&&e.checkMetaValues(),s.data.duplicatedElements)r!=e.settings.canonicalId&&s.data.duplicatedElements.hasOwnProperty(r)&&(e.duplicatedElements[r]=s.data.duplicatedElements[r]);for(var l=s.data.modifiedAttributes.map((function(t){return t=e.namespaceInputName(t),'[name="'.concat(t,'"],[name^="').concat(t,'["]')})).concat(o.map((function(t){return'[name="'.concat(t,'"]')}))),h=$(l.join(",")).parents().filter(".field:not(:has(> .status-badge))"),c=0;c<h.length;c++)h.eq(c).prepend($("<div/>",{class:"status-badge modified",title:Craft.t("app","This field has been modified.")}).append($("<span/>",{class:"visually-hidden",html:Craft.t("app","This field has been modified.")})));for(var u=e.serializeForm(!0)===t,p=$(),f={},g=!1,m=0;m<s.data.missingElements.length;m++){var v=s.data.missingElements[m],b=e.$contentContainer.children('[data-layout-tab="'.concat(v.uid,'"]'));b.length||(b=$("<div/>",{id:e.namespaceId(v.id),class:"flex-fields","data-id":v.id,"data-layout-tab":v.uid}),v.id!==d&&b.addClass("hidden"),b.appendTo(e.$contentContainer)),p=p.add(b);for(var C=0;C<v.elements.length;C++){var _=v.elements[C];if(!1!==_.html){if(f[v.uid]||(f[v.uid]=[]),f[v.uid].push(_.uid),"string"==typeof _.html){var w=b.children('[data-layout-element="'.concat(_.uid,'"]')),S=$(_.html);w.length?w.replaceWith(S):S.appendTo(b),Craft.initUiElements(S),g=!0}}else{var y=b.children('[data-layout-element="'.concat(_.uid,'"]'));if(!y.length||!Garnish.hasAttr(y,"data-layout-element-placeholder")){var T=$("<div/>",{class:"hidden","data-layout-element":_.uid,"data-layout-element-placeholder":""});y.length?y.replaceWith(T):T.appendTo(b),g=!0}}}}var I=e.$contentContainer.children("[data-layout-tab]").not(p).not('[data-layout-tab=""]');I.length&&(I.remove(),g=!0),p.filter(":not(.hidden)").length||p.first().removeClass("hidden"),e.settings.visibleLayoutElements=f,e.isFullPage?Craft.cp.updateTabs(s.data.tabs):e.slideout.updateTabs(s.data.tabs),Craft.appendHeadHtml(s.data.headHtml),Craft.appendBodyHtml(s.data.bodyHtml),g&&(s.data.initialDeltaValues&&Object.assign(e.$container.data("initial-delta-values"),s.data.initialDeltaValues),u&&(e.lastSerializedValue=e.serializeForm(!0))),e.handleDismissibleTips(),e.afterUpdate(t),Craft.broadcaster&&Craft.broadcaster.postMessage({pageId:Craft.pageId,event:"saveDraft",canonicalId:e.settings.canonicalId,draftId:e.settings.draftId,isProvisionalDraft:e.settings.isProvisionalDraft}),i()})).catch((function(t){e._afterSaveDraft(),e.ignoreFailedRequest||(e.failed=!0,t&&t.response&&(e.httpStatus=t.response.status,e.httpError=t.response.data?t.response.data.message:null),e._showFailStatus(),s(t)),e.ignoreFailedRequest=!1}))}}))},_afterSaveDraft:function(){this.$saveMetaBtn&&this.$saveMetaBtn.removeClass("active")},_showFailStatus:function(){this.statusIcons().velocity("stop").css("opacity","").removeClass("hidden checkmark-icon").addClass("alert-icon"),this.setStatusMessage(this._saveFailMessage())},prepareData:function(t,e){t=Craft.findDeltaData(this.$container.data("initialSerializedValue"),t,this.$container.data("delta-names"),e,this.$container.data("initial-delta-values"),this.$container.data("modified-delta-names")),t=this.swapDuplicatedElementIds(t);var i={};return this.settings.draftId&&(i[this.namespaceInputName("draftId")]=this.settings.draftId,this.settings.isProvisionalDraft&&(i[this.namespaceInputName("provisional")]=1)),null!==this.settings.draftName&&(i[this.namespaceInputName("draftName")]=this.settings.draftName),$.isEmptyObject(i)||(t+="&".concat($.param(i))),t},get _saveHeaders(){var t={"content-type":"application/x-www-form-urlencoded"};return this.namespace&&(t["X-Craft-Namespace"]=this.namespace),t},swapDuplicatedElementIds:function(t){var e=this,i=Object.keys(this.duplicatedElements).join("|");if(""===i)return t;var s=encodeURIComponent("["),a=encodeURIComponent("]"),n=this.namespaceInputName("fields");for(n=this.isFullPage?Craft.escapeRegex(n):encodeURIComponent(n);t!==(t=t.replace(new RegExp("(&".concat(n).concat(s,"[^=]+").concat(a).concat(s,")(").concat(i,")(").concat(a,")"),"g"),(function(t,i,s,a){return e._filterFieldInputName(i)?i+e.duplicatedElements[s]+a:t})).replace(new RegExp("&(".concat(n).concat(s,"[^=]+)=(").concat(i,")\\b"),"g"),(function(t,i,n){return!e._filterFieldInputName(i)||i.match(new RegExp("".concat(s,"(enabled|sortOrder|type|typeId)").concat(a,"$")))?t:"&".concat(i,"=").concat(e.duplicatedElements[n])}))););return t},_filterFieldInputName:function(t){var e=encodeURIComponent("["),i=encodeURIComponent("]"),s=t.match(new RegExp("(\\bfields|".concat(e,"fields").concat(i,")").concat(e,".+?").concat(i),"g"));if(!s)throw"Unexpected input name: ".concat(t);var a=s[s.length-1].match(new RegExp("(?:\\bfields|".concat(e,"fields").concat(i,")").concat(e,"(.+?)").concat(i)))[1];return Craft.fieldsWithoutContent.includes(a)},updatePreviewTargets:function(t){var e=this;t.forEach((function(t){var i=e.settings.previewTargets.find((function(e){return e.label===t.label}));i&&(i.url=t.url);var s=e.previewLinks.find((function(e){return e.data("targetLabel")===t.label}));s&&(s.data("targetUrl",t.url),e.updatePreviewLinkHref(s))}))},afterUpdate:function(t){this.$container.data("initialSerializedValue",t),this.$container.data("initial-delta-values",{});var e=this.statusIcons().velocity("stop").css("opacity","").removeClass("hidden").addClass("checkmark-icon");this.setStatusMessage(this._saveSuccessMessage()),Craft.autosaveDrafts||e.velocity("stop").velocity({opacity:0},{delay:2e3,complete:function(){e.addClass("hidden")}}),this.trigger("update")},setStatusMessage:function(t){this.statusIcons().attr("title",t),this.statusMessage().empty().append($("<span/>",{class:"visually-hidden",text:t}))},showMetaHud:function(){this.metaHud?this.metaHud.show():(this.createMetaHud(),this.onMetaHudShow()),Garnish.isMobileBrowser(!0)||this.$nameTextInput.trigger("focus")},createMetaHud:function(){var t=$("<div/>"),e=$('<div class="field"><div class="heading"><label for="draft-name">'+Craft.t("app","Draft Name")+"</label></div></div>").appendTo(t),i=$('<div class="input"/>').appendTo(e);this.$nameTextInput=$('<input type="text" class="text fullwidth" id="draft-name"/>').appendTo(i).val(this.settings.draftName);var s=$('<div class="hud-footer flex flex-center"/>').appendTo(t);$('<div class="flex-grow"></div>').appendTo(s),this.$saveMetaBtn=$("<button/>",{type:"submit",class:"btn submit disabled","aria-disabled":"true",text:Craft.t("app","Save")}).appendTo(s),this.metaHud=new Garnish.HUD(this.$editMetaBtn,t,{onSubmit:this.saveMeta.bind(this)}),this.addListener(this.$nameTextInput,"input","checkMetaValues"),this.metaHud.on("show",this.onMetaHudShow.bind(this)),this.metaHud.on("hide",this.onMetaHudHide.bind(this)),this.metaHud.on("escape",this.onMetaHudEscape.bind(this))},onMetaHudShow:function(){this.$editMetaBtn.addClass("active"),this.$editMetaBtn.attr("aria-expanded","true")},onMetaHudHide:function(){this.$editMetaBtn.removeClass("active"),this.$editMetaBtn.attr("aria-expanded","false"),Garnish.focusIsInside(this.metaHud.$body)&&this.$editMetaBtn.trigger("focus")},onMetaHudEscape:function(){this.$nameTextInput.val(this.settings.draftName)},checkMetaValues:function(){return this.$nameTextInput.val()&&this.$nameTextInput.val()!==this.settings.draftName?(this.$saveMetaBtn.removeClass("disabled"),this.$saveMetaBtn.removeAttr("aria-disabled"),!0):(this.$saveMetaBtn.addClass("disabled"),this.$saveMetaBtn.attr("aria-disabled","true"),!1)},shakeMetaHud:function(){Garnish.shake(this.metaHud.$hud)},saveMeta:function(){var t=this;return new Promise((function(e,i){if(!t.checkMetaValues())return t.shakeMetaHud(),void i();t.settings.draftName=t.$nameTextInput.val(),t.metaHud.hide(),t.checkForm(!0).then(e).catch(i)}))},handleSubmit:function(t){var e=this;if(t.preventDefault(),t.stopPropagation(),!this.submittingForm)if(!this.settings.draftId||this.settings.isUnpublishedDraft||this.settings.isProvisionalDraft||void 0!==t.autosave&&!t.autosave||!(t.saveShortcut||t.customTrigger&&"elements/save-draft"===t.customTrigger.data("action"))||!this.enableAutosave){this.submittingForm=!0,Craft.cp.$confirmUnloadForms=Craft.cp.$confirmUnloadForms.not(this.$container),this.cancelToken&&(this.ignoreFailedRequest=!0,this.cancelToken.cancel()),this.trigger("beforeSubmit");var i=this.prepareData(this.serializeForm(!1));if(this.isFullPage){this.stopListeningForChanges();var s=Craft.createForm(i);s.appendTo(Garnish.$bod),s.submit()}else this.slideout.showSubmitSpinner(),Craft.sendActionRequest("POST",null,{headers:this._saveHeaders,data:i}).then((function(t){e.slideout.handleSubmitResponse(t)})).catch((function(t){e.slideout.handleSubmitError(t)})).finally((function(){e.submittingForm=!1,e.slideout.hideSubmitSpinner()}))}else this.checkForm(!0)},handleDismissibleTips:function(){var t=this;this.addListener(this.tipDismissBtn,"click",(function(e){t.hideTip(e)}))},getHiddenTipsUids:function(){return Craft.getLocalStorage("dismissedTips",[])},setHiddenTipsUids:function(t){Craft.setLocalStorage("dismissedTips",t)},hideTip:function(t){var e=t.target;if(e){var i=$(e).closest(".readable");if(i.length){var s=i.data("layout-element");if(i.remove(),"undefined"!=typeof Storage){var a=this.getHiddenTipsUids();a.includes(s)||(a.push(s),this.setHiddenTipsUids(a))}}}}},{defaults:{additionalSites:[],canCreateDrafts:!1,canEditMultipleSites:!1,canSaveCanonical:!1,canonicalId:null,draftId:null,draftName:null,elementType:null,enablePreview:!1,enabled:!1,enabledForSite:!1,hashedCpEditUrl:null,isLive:!1,isProvisionalDraft:!1,isUnpublishedDraft:!1,previewTargets:[],previewToken:null,revisionId:null,siteId:null,siteStatuses:null,siteToken:null,visibleLayoutElements:{}}})},4211:function(){Craft.ElementEditorSlideout=Craft.CpScreenSlideout.extend({$element:null,init:function(t,e){var i=this;this.$element=$(t),e=Object.assign({},Craft.ElementEditorSlideout.defaults,e,{showHeader:!0}),this.base("elements/edit",e),this.on("load",(function(){var t=i.$container.data("elementEditor");t&&t.on("beforeSubmit",(function(){Object.keys(i.settings.saveParams).forEach((function(e){$("<input/>",{class:"hidden",name:t.namespaceInputName(e),value:i.settings.saveParams[e]}).appendTo(i.$container)}))}))})),this.on("submit",(function(t){if(Craft.broadcaster&&Craft.broadcaster.postMessage({event:"saveElement",id:t.response.data.element.id}),i.settings.onSaveElement){var e=Object.assign({},t.response.data,t.response.data.element);delete e.element,delete e.modelName,delete e.message,i.settings.onSaveElement(e)}Craft.Preview.refresh()}))},getParams:function(){var t={};return this.settings.elementType&&(t.elementType=this.settings.elementType),this.settings.elementId?t.elementId=this.settings.elementId:this.$element&&this.$element.data("id")&&(t.elementId=this.$element.data("id")),this.settings.draftId?t.draftId=this.settings.draftId:this.$element&&this.$element.data("draft-id")?t.draftId=this.$element.data("draft-id"):this.settings.revisionId?t.revisionId=this.settings.revisionId:this.$element&&this.$element.data("revision-id")&&(t.revisionId=this.$element.data("revision-id")),this.settings.siteId?t.siteId=this.settings.siteId:this.$element&&this.$element.data("site-id")&&(t.siteId=this.$element.data("site-id")),this.settings.prevalidate&&(t.prevalidate=1),t},handleSubmit:function(t){this.$container.data("elementEditor").handleSubmit(t)}},{defaults:{elementId:null,draftId:null,revisionId:null,elementType:null,siteId:null,prevalidate:!1,saveParams:{},onSaveElement:null,validators:[]}})},7998:function(){Craft.ElementFieldSettings=Garnish.Base.extend({allowMultipleSources:null,$maintainHierarchyField:null,$maintainHierarchyInput:null,$sourcesField:null,$sourceSelect:null,$branchLimitField:null,$maxRelationsField:null,$minRelationsField:null,init:function(t,e,i,s,a,n){this.allowMultipleSources=t,this.$maintainHierarchyField=$("#".concat(e)),this.$maintainHierarchyInput=this.$maintainHierarchyField.find('input[type="checkbox"]'),this.$sourcesField=$("#".concat(i)),this.allowMultipleSources||(this.$sourceSelect=this.$sourcesField.find("select")),this.$branchLimitField=$("#".concat(s)),this.$minRelationsField=$("#".concat(a)),this.$maxRelationsField=$("#".concat(n)),this.updateLimitFields(),this.addListener(this.$maintainHierarchyInput,"change","updateLimitFields"),this.allowMultipleSources?this.$sourcesField.find("[type=checkbox]").each(function(t,e){this.addListener($(e),"change","updateMaintainHierarchyField")}.bind(this)):this.addListener(this.$sourceSelect,"change","updateMaintainHierarchyField"),this.updateMaintainHierarchyField()},updateLimitFields:function(){!this.$maintainHierarchyField.hasClass("hidden")&&this.$maintainHierarchyInput.is(":checked")?(this.$minRelationsField.addClass("hidden"),this.$maxRelationsField.addClass("hidden"),this.$branchLimitField.removeClass("hidden")):(this.$branchLimitField.addClass("hidden"),this.$minRelationsField.removeClass("hidden"),this.$maxRelationsField.removeClass("hidden"))},updateMaintainHierarchyField:function(){var t;if(this.allowMultipleSources){var e=this.$sourcesField.find('[type="checkbox"]:checked');t=1===e.length&&e.data("structure-id")}else t=this.$sourceSelect.children("option:selected").data("structure-id");t?this.$maintainHierarchyField.removeClass("hidden"):this.$maintainHierarchyField.addClass("hidden"),this.updateLimitFields()}})},8895:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.ElementThumbLoader=Garnish.Base.extend({queue:null,workers:[],init:function(){this.queue=[];for(var t=0;t<3;t++)this.workers.push(new Craft.ElementThumbLoader.Worker(this))},load:function(t){for(var e=this,i=t.find(".elementthumb"),s=function(t){var s=i.eq(t),a=s.scrollParent();if("FIELDSET"===a.prop("nodeName")&&(a=a.scrollParent()),a[0]===document.body&&(a=Garnish.$doc),e.isVisible(s,a))e.addToQueue(s[0]);else{var n="thumb"+Math.floor(1e6*Math.random());Craft.ElementThumbLoader.invisibleThumbs[n]=[e,s,a],a.on("scroll.".concat(n),{$thumb:s,$scrollParent:a,key:n},(function(t){e.isVisible(t.data.$thumb,t.data.$scrollParent)&&(delete Craft.ElementThumbLoader.invisibleThumbs[t.data.key],a.off("scroll.".concat(t.data.key)),e.addToQueue(t.data.$thumb[0]))}))}},a=0;a<i.length;a++)s(a)},addToQueue:function(t){this.queue.push(t);for(var e=0;e<this.workers.length;e++)this.workers[e].active||this.workers[e].loadNext()},isVisible:function(t,e){var i,s,a=t.offset().top;return e[0]===document?(i=e.scrollTop(),s=Garnish.$win.height()):(i=e.offset().top,s=e.height()),a>i&&a<i+s+1e3},destroy:function(){for(var t=0;t<this.workers.length;t++)this.workers[t].destroy();this.base()}},{invisibleThumbs:{},retryAll:function(){for(var e in Craft.ElementThumbLoader.invisibleThumbs){var i=(r=Craft.ElementThumbLoader.invisibleThumbs[e],o=3,function(t){if(Array.isArray(t))return t}(r)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(r,o)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(r,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=i[0],a=i[1],n=i[2];delete Craft.ElementThumbLoader.invisibleThumbs[e],n.off("scroll.".concat(e)),s.load(a.parent())}var r,o}}),Craft.ElementThumbLoader.Worker=Garnish.Base.extend({loader:null,active:!1,init:function(t){this.loader=t},loadNext:function(){var t=this.loader.queue.shift();if(void 0!==t){this.active=!0;var e=$(t);if(e.find("img").length)this.loadNext();else{var i=$("<img/>",{sizes:e.attr("data-sizes"),srcset:e.attr("data-srcset"),alt:e.attr("data-alt")||""});this.addListener(i,"load,error","loadNext"),i.appendTo(e),picturefill({elements:[i[0]]})}}else this.active=!1}})},4233:function(){Craft.ElevatedSessionForm=Garnish.Base.extend({$form:null,inputs:null,init:function(t,e){if(this.$form=$(t),void 0!==e){this.inputs=[],e=$.makeArray(e);for(var i=0;i<e.length;i++)for(var s=$(e[i]),a=0;a<s.length;a++){var n=s.eq(a);this.inputs.push({input:n,val:Garnish.getInputPostVal(n)})}}this.addListener(this.$form,"submit","handleFormSubmit")},handleFormSubmit:function(t){if(Craft.elevatedSessionManager.fetchingTimeout)return t.preventDefault(),void t.stopImmediatePropagation();if(this.inputs){for(var e,i=!1,s=0;s<this.inputs.length;s++)if((e=this.inputs[s].input).data("passwordInput")&&(e=e.data("passwordInput").$currentInput),Garnish.getInputPostVal(e)!==this.inputs[s].val){i=!0;break}if(!i)return}t.preventDefault(),t.stopImmediatePropagation(),Craft.elevatedSessionManager.requireElevatedSession(this.submitForm.bind(this))},submitForm:function(){this.disable(),this.$form.trigger("submit"),this.enable()}})},9699:function(){Craft.ElevatedSessionManager=Garnish.Base.extend({fetchingTimeout:!1,passwordModal:null,$passwordInput:null,$submitBtn:null,$errorPara:null,callback:null,requireElevatedSession:function(t){var e=this;this.callback=t,this.fetchingTimeout=!0,Craft.sendActionRequest("POST","users/get-elevated-session-timeout").then((function(t){e.fetchingTimeout=!1,!1===t.data.timeout||t.data.timeout>=Craft.ElevatedSessionManager.minSafeElevatedSessionTimeout?e.callback():e.showPasswordModal()})).catch((function(){e.fetchingTimeout=!1}))},showPasswordModal:function(){var t=this;if(this.passwordModal)this.passwordModal.show();else{var e=$('<form id="elevatedsessionmodal" class="modal secure fitted"/>'),i=$('<div class="body"><p>'+Craft.t("app","Enter your password to continue.")+"</p></div>").appendTo(e),s=$('<div class="inputcontainer">').appendTo(i),a=$('<div class="flex"/>').appendTo(s),n=$('<div class="flex-grow"/>').appendTo(a),r=$("<td/>").appendTo(a),o=$('<div class="passwordwrapper"/>').appendTo(n);this.$passwordInput=$('<input type="password" class="text password fullwidth" placeholder="'+Craft.t("app","Password")+'" autocomplete="current-password"/>').appendTo(o),this.$submitBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Submit"),spinner:!0}).appendTo(r),this.$errorPara=$('<p class="error"/>').appendTo(i),this.passwordModal=new Garnish.Modal(e,{closeOtherModals:!1,onFadeIn:function(){setTimeout(t.focusPasswordInput.bind(t),100)},onFadeOut:function(){t.$passwordInput.val("")}}),new Craft.PasswordInput(this.$passwordInput,{onToggleInput:function(e){t.$passwordInput=e}}),this.addListener(this.$passwordInput,"input","validatePassword"),this.addListener(e,"submit","submitPassword")}},focusPasswordInput:function(){Garnish.isMobileBrowser(!0)||this.$passwordInput.trigger("focus")},validatePassword:function(){return this.$passwordInput.val().length>=6?(this.$submitBtn.removeClass("disabled"),!0):(this.$submitBtn.addClass("disabled"),!1)},submitPassword:function(t){var e=this;if(t&&t.preventDefault(),this.validatePassword()){this.$submitBtn.addClass("loading"),this.clearLoginError();var i={currentPassword:this.$passwordInput.val()};Craft.sendActionRequest("POST","users/start-elevated-session",{data:i}).then((function(t){e.$submitBtn.removeClass("loading"),e.passwordModal.hide(),e.callback()})).catch((function(t){var i=t.response;e.$submitBtn.removeClass("loading"),e.showPasswordError(i.data.message||Craft.t("app","Incorrect password.")),Garnish.shake(e.passwordModal.$container),e.focusPasswordInput()}))}},showPasswordError:function(t){null==t&&(t=Craft.t("app","A server error occurred.")),this.$errorPara.text(t),this.passwordModal.updateSizeAndPosition()},clearLoginError:function(){this.showPasswordError("")}},{minSafeElevatedSessionTimeout:5}),Craft.elevatedSessionManager=new Craft.ElevatedSessionManager},1402:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.EntryIndex=Craft.BaseElementIndex.extend({publishableSections:null,$newEntryBtnGroup:null,$newEntryBtn:null,init:function(t,e,i){this.publishableSections=[],this.on("selectSource",this.updateButton.bind(this)),this.on("selectSite",this.updateButton.bind(this)),this.base(t,e,i)},afterInit:function(){var t=this;this.publishableSections=Craft.publishableSections.filter((function(e){return!!t.getSourceByKey("section:".concat(e.uid))})),this.base()},getDefaultSourceKey:function(){if("index"===this.settings.context&&"undefined"!=typeof defaultSectionHandle){if("singles"===defaultSectionHandle)return"singles";for(var t=0;t<this.$sources.length;t++){var e=$(this.$sources[t]);if(e.data("handle")===defaultSectionHandle)return e.data("key")}}return this.base()},updateButton:function(){var e,i=this;if(this.$source&&(e="singles"===this.$source.data("key")?"singles":this.$source.data("handle"),this.publishableSections.length&&function(){i.$newEntryBtnGroup&&i.$newEntryBtnGroup.remove();var s,a=i.publishableSections.find((function(t){return t.handle===e}));i.$newEntryBtnGroup=$('<div class="btngroup submit" data-wrapper/>');var n="new-entry-menu-"+Craft.randomString(10);if(a){var r="index"===i.settings.context?Craft.t("app","New entry"):Craft.t("app","New {section} entry",{section:a.name}),o="index"===i.settings.context?Craft.t("app","New entry in the {section} section",{section:a.name}):r,l="index"===i.settings.context?"link":null;i.$newEntryBtn=Craft.ui.createButton({label:r,ariaLabel:o,spinner:!0,role:l}).addClass("submit add icon").appendTo(i.$newEntryBtnGroup),i.addListener(i.$newEntryBtn,"click mousedown",(function(t){"index"===i.settings.context&&("click"===t.type&&Garnish.isCtrlKeyPressed(t)||"mousedown"===t.type&&1===t.originalEvent.button)?window.open(Craft.getUrl("entries/".concat(a.handle,"/new"))):"click"===t.type&&i._createEntry(a.id)})),i.publishableSections.length>1&&(s=$("<button/>",{type:"button",class:"btn submit menubtn btngroup-btn-last","aria-controls":n,"data-disclosure-trigger":"","aria-label":Craft.t("app","New entry, choose a section")}).appendTo(i.$newEntryBtnGroup))}else i.$newEntryBtn=s=Craft.ui.createButton({label:Craft.t("app","New entry"),ariaLabel:Craft.t("app","New entry, choose a section"),spinner:!0}).addClass("submit add icon menubtn btngroup-btn-last").attr("aria-controls",n).attr("data-disclosure-trigger","").appendTo(i.$newEntryBtnGroup);if(i.addButton(i.$newEntryBtnGroup),s){var h,d=$("<div/>",{id:n,class:"menu menu--disclosure"}).appendTo(i.$newEntryBtnGroup),c=$("<ul/>").appendTo(d),u=function(e,i){var s="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!s){if(Array.isArray(e)||(s=function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e))||i&&e&&"number"==typeof e.length){s&&(e=s);var a=0,n=function(){};return{s:n,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){s=s.call(e)},n:function(){var t=s.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==s.return||s.return()}finally{if(l)throw r}}}}(i.publishableSections);try{var p=function(){var t=h.value,e="index"===i.settings.context?"link":"button";if("index"===i.settings.context&&-1!==$.inArray(i.siteId,t.sites)||"index"!==i.settings.context&&t!==a){var n=$("<li/>").appendTo(c),r=$("<a/>",{role:"button"===e?"button":null,href:"#",type:"button"===e?"button":null,text:Craft.t("app","New {section} entry",{section:t.name})}).appendTo(n);i.addListener(r,"click",(function(){s.data("trigger").hide(),i._createEntry(t.id)})),"button"===e&&i.addListener(r,"keydown",(function(e){e.keyCode===Garnish.SPACE_KEY&&(e.preventDefault(),s.data("trigger").hide(),i._createEntry(t.id))}))}};for(u.s();!(h=u.n()).done;)p()}catch(t){u.e(t)}finally{u.f()}new Garnish.DisclosureMenu(s)}}(),"index"===this.settings.context)){var s="entries";e&&(s+="/"+e),Craft.setPath(s)}},_createEntry:function(t){var e=this;if(this.$newEntryBtn.hasClass("loading"))console.warn("New entry creation already in progress.");else{var i=this.publishableSections.find((function(e){return e.id===t}));if(!i)throw"Invalid section ID: ".concat(t);this.$newEntryBtn.addClass("loading"),Craft.sendActionRequest("POST","entries/create",{data:{siteId:this.siteId,section:i.handle}}).then((function(t){var s=t.data;"index"===e.settings.context?document.location.href=Craft.getUrl(s.cpEditUrl,{fresh:1}):Craft.createElementEditor(e.elementType,{siteId:e.siteId,elementId:s.entry.id,draftId:s.entry.draftId,params:{fresh:1}}).on("submit",(function(){var t="section:".concat(i.uid);e.sourceKey!==t&&e.selectSourceByKey(t),e.clearSearch(),e.setSelectedSortAttribute("dateCreated","desc"),e.selectElementAfterUpdate(s.entry.id),e.updateElements()}))})).finally((function(){e.$newEntryBtn.removeClass("loading")}))}}}),Craft.registerElementIndexClass("craft\\elements\\Entry",Craft.EntryIndex)},8201:function(){Craft.FieldLayoutDesigner=Garnish.Base.extend({$container:null,$configInput:null,$tabContainer:null,$newTabBtn:null,$sidebar:null,$libraryToggle:null,$selectedLibrary:null,$fieldLibrary:null,$uiLibrary:null,$uiLibraryElements:null,$fieldSearch:null,$clearFieldSearchBtn:null,$fieldGroups:null,$fields:null,tabGrid:null,elementDrag:null,_config:null,init:function(t,e){var i=this;this.$container=$(t),this.setSettings(e,Craft.FieldLayoutDesigner.defaults),this.$configInput=this.$container.children("input[data-config-input]"),this._config=JSON.parse(this.$configInput.val()),this._config.tabs||(this._config.tabs=[]);var s=this.$container.children(".fld-workspace");this.$tabContainer=s.children(".fld-tabs"),this.$newTabBtn=s.children(".fld-new-tab-btn"),this.$sidebar=this.$container.children(".fld-sidebar"),this.$fieldLibrary=this.$selectedLibrary=this.$sidebar.children(".fld-field-library");var a=this.$fieldLibrary.children(".search");this.$fieldSearch=a.children("input"),this.$clearFieldSearchBtn=a.children(".clear"),this.$fieldGroups=this.$sidebar.find(".fld-field-group"),this.$fields=this.$fieldGroups.children(".fld-element"),this.$uiLibrary=this.$sidebar.children(".fld-ui-library"),this.$uiLibraryElements=this.$uiLibrary.children(),this.tabGrid=new Craft.Grid(this.$tabContainer,{itemSelector:".fld-tab",minColWidth:264,fillMode:"grid",snapToGrid:24});for(var n=this.$tabContainer.children(),r=0;r<n.length;r++)this.initTab($(n[r]));if(this.elementDrag=new Craft.FieldLayoutDesigner.ElementDrag(this),this.settings.customizableTabs&&(this.tabDrag=new Craft.FieldLayoutDesigner.TabDrag(this),this.addListener(this.$newTabBtn,"activate","addTab")),this.settings.customizableUi){var o=this.$sidebar.children(".btngroup");new Craft.Listbox(o,{onChange:function(t){i.$selectedLibrary.addClass("hidden"),i.$selectedLibrary=i["$".concat(t.data("library"),"Library")].removeClass("hidden")}})}this.addListener(this.$fieldSearch,"input",(function(){var t=i.$fieldSearch.val().toLowerCase().replace(/['"]/g,"");if(!t)return i.$fieldLibrary.find(".filtered").removeClass("filtered"),void i.$clearFieldSearchBtn.addClass("hidden");i.$clearFieldSearchBtn.removeClass("hidden");var e=i.$fields.filter('[data-keywords*="'.concat(t,'"]')).add(i.$fieldGroups.filter('[data-name*="'.concat(t,'"]')).children(".fld-element")).removeClass("filtered");i.$fields.not(e).addClass("filtered");for(var s=0;s<i.$fieldGroups.length;s++){var a=i.$fieldGroups.eq(s);a.find(".fld-element:not(.hidden):not(.filtered)").length?a.removeClass("filtered"):a.addClass("filtered")}})),this.addListener(this.$fieldSearch,"keydown",(function(t){switch(t.keyCode){case Garnish.ESC_KEY:i.$fieldSearch.val("").trigger("input");break;case Garnish.RETURN_KEY:t.preventDefault()}})),this.addListener(this.$clearFieldSearchBtn,"click",(function(){i.$fieldSearch.val("").trigger("input")}))},initTab:function(t){return new Craft.FieldLayoutDesigner.Tab(this,t)},removeFieldByHandle:function(t){this.$fields.filter('[data-attribute="'.concat(t,'"]:first')).removeClass("hidden").closest(".fld-field-group").removeClass("hidden")},addTab:function(){if(this.settings.customizableTabs){var t=Craft.escapeHtml(prompt(Craft.t("app","Give your tab a name.")));if(t){var e=$('\n<div class="fld-tab">\n  <div class="tabs">\n    <div class="tab sel draggable">\n      <span>'.concat(t,'</span>\n      <a class="settings icon" title="').concat(Craft.t("app","Settings"),'"></a>\n    </div>\n  </div>\n  <div class="fld-tabcontent"></div>\n</div>\n')).appendTo(this.$tabContainer);this.tabGrid.addItems(e),this.tabDrag.addItems(e),this.initTab(e).updatePositionInConfig()}}},get config(){return this._config},set config(t){this._config=t,this.$configInput.val(JSON.stringify(t))},updateConfig:function(t){var e=t(this.config);!1!==e&&(this.config=e)}},{defaults:{customizableTabs:!0,customizableUi:!0},createSlideout:function createSlideout(contents,js){var $body=$("<div/>",{class:"fld-element-settings-body"});$("<div/>",{class:"fields",html:contents}).appendTo($body);var $footer=$("<div/>",{class:"fld-element-settings-footer"});$("<div/>",{class:"flex-grow"}).appendTo($footer);var $cancelBtn=Craft.ui.createButton({label:Craft.t("app","Close"),spinner:!0}).appendTo($footer);Craft.ui.createSubmitButton({class:"secondary",label:Craft.t("app","Apply"),spinner:!0}).appendTo($footer);var $contents=$body.add($footer),slideout=new Craft.Slideout($contents,{containerElement:"form",containerAttributes:{action:"",method:"post",novalidate:"",class:"fld-element-settings"}});return slideout.on("open",(function(){Garnish.requestAnimationFrame((function(){slideout.$container.find(".text:first").trigger("focus")}))})),$cancelBtn.on("click",(function(){slideout.close()})),js&&eval(js),Craft.initUiElements(slideout.$container),slideout}}),Craft.FieldLayoutDesigner.Tab=Garnish.Base.extend({designer:null,uid:null,$container:null,slideout:null,destroyed:!1,init:function(t,e){this.designer=t,this.$container=e,this.$container.data("fld-tab",this),this.uid=this.$container.data("uid"),this.uid||(this.uid=Craft.uuid(),this.config={uid:this.uid,name:this.$container.find(".tabs .tab span").text(),elements:[]},this.$container.data("settings-namespace",this.designer.$container.data("new-tab-settings-namespace").replace(/\bTAB_UID\b/g,this.uid)),this.$container.data("settings-html",this.designer.$container.data("new-tab-settings-html").replace(/\bTAB_UID\b/g,this.uid).replace(/\bTAB_NAME\b/g,this.config.name)),this.$container.data("settings-js",this.designer.$container.data("new-tab-settings-js").replace(/\bTAB_UID\b/g,this.uid))),this.designer.settings.customizableTabs&&(this.settingsNamespace=this.$container.data("settings-namespace"),this.createMenu());for(var i=this.$container.children(".fld-tabcontent").children(),s=0;s<i.length;s++)this.initElement($(i[s]))},createMenu:function(){var t=this,e=this.$container.find(".tabs .settings");$('<div class="menu" data-align="center"/>').insertAfter(e).append($("<ul/>").append($("<li/>").append($("<a/>",{"data-action":"settings",text:Craft.t("app","Settings")}))).append($("<li/>").append($("<a/>",{"data-action":"remove",text:Craft.t("app","Remove")})))).append($("<hr/>")).append($("<ul/>").append($("<li/>").append($("<a/>",{"data-action":"moveLeft",text:Craft.t("app","Move to the left")}))).append($("<li/>").append($("<a/>",{"data-action":"moveRight",text:Craft.t("app","Move to the right")}))));var i=new Garnish.MenuBtn(e,{onOptionSelect:this.onTabOptionSelect.bind(this)});i.menu.on("show",(function(){t.$container.prev(".fld-tab").length?i.menu.$container.find("[data-action=moveLeft]").removeClass("disabled"):i.menu.$container.find("[data-action=moveLeft]").addClass("disabled"),t.$container.next(".fld-tab").length?i.menu.$container.find("[data-action=moveRight]").removeClass("disabled"):i.menu.$container.find("[data-action=moveRight]").addClass("disabled")}))},onTabOptionSelect:function(t){if(this.designer.settings.customizableTabs)switch($(t).data("action")){case"settings":this.slideout?this.slideout.open():this.createSettings();break;case"remove":this.destroy();break;case"moveLeft":var e=this.$container.prev(".fld-tab");e.length&&(this.$container.insertBefore(e),this.updatePositionInConfig());break;case"moveRight":var i=this.$container.next(".fld-tab");i.length&&(this.$container.insertAfter(i),this.updatePositionInConfig())}},createSettings:function(){var t=this,e=this.$container.data("settings-html"),i=this.$container.data("settings-js");this.slideout=Craft.FieldLayoutDesigner.createSlideout(e,i),this.slideout.$container.on("submit",(function(e){e.preventDefault(),t.applySettings()}))},applySettings:function(){var t=this;if(this.slideout.$container.find('[name$="[name]"]').val()){var e=this.slideout.$container.find("button[type=submit]").addClass("loading"),i=$.extend({},this.config);delete i.elements,Craft.sendActionRequest("POST","fields/apply-layout-tab-settings",{data:{config:i,settingsNamespace:this.settingsNamespace,settings:this.slideout.$container.serialize()}}).then((function(e){t.updateConfig((function(t){return $.extend(e.data.config,{elements:t.elements})}));var i=t.$container.find(".tabs .tab span"),s=i.children(".fld-indicator");e.data.hasConditions?s.length||i.append($("<div/>",{class:"fld-indicator",title:Craft.t("app","This tab is conditional"),"aria-label":Craft.t("app","This tab is conditional"),"data-icon":"condition"})):s.length&&s.remove(),t.slideout.close()})).catch((function(t){Craft.cp.displayError(),console.error(t)})).finally((function(){e.removeClass("loading"),t.slideout.close()}))}else alert(Craft.t("app","You must specify a tab name."))},initElement:function(t){return new Craft.FieldLayoutDesigner.Element(this,t)},get index(){var t=this;return this.designer.config.tabs.findIndex((function(e){return e.uid===t.uid}))},get config(){var t=this;if(!this.uid)throw"Tab is missing its UID";var e=this.designer.config.tabs.find((function(e){return e.uid===t.uid}));return e||(e={uid:this.uid,elements:[]},this.config=e),e},set config(t){if(!this.destroyed){t.name&&t.name!==this.config.name&&this.$container.find(".tabs .tab span").text(t.name);var e=this.designer.config,i=this.index;if(-1!==i)e.tabs[i]=t;else{var s=$.inArray(this.$container[0],this.$container.parent().children(".fld-tab"));e.tabs.splice(s,0,t)}this.designer.config=e}},updateConfig:function(t){if(!this.destroyed){var e=t(this.config);!1!==e&&(this.config=e)}},updatePositionInConfig:function(){var t=this;this.destroyed||this.designer.updateConfig((function(e){var i=t.config,s=t.index,a=$.inArray(t.$container[0],t.$container.parent().children(".fld-tab"));return-1!==s&&e.tabs.splice(s,1),e.tabs.splice(a,0,i),e}))},destroy:function(){var t=this;if(!this.destroyed){this.destroyed=!0,this.designer.updateConfig((function(e){var i=t.index;return-1!==i&&(e.tabs.splice(i,1),e)}));for(var e=this.$container.find(".fld-element"),i=0;i<e.length;i++)e.eq(i).data("fld-element").destroy();this.designer.tabGrid.removeItems(this.$container),this.designer.tabDrag.removeItems(this.$container),this.$container.remove(),this.base()}}}),Craft.FieldLayoutDesigner.Element=Garnish.Base.extend({tab:null,$container:null,$settingsContainer:null,$editBtn:null,uid:null,isField:!1,attribute:null,requirable:!1,hasCustomWidth:!1,hasSettings:!1,settingsNamespace:null,slideout:null,init:function(t,e){var i=this;this.tab=t,this.$container=e,this.$container.data("fld-element",this),this.uid=this.$container.data("uid"),this.uid||(this.uid=Craft.uuid(),this.config=$.extend(this.$container.data("config"),{uid:this.uid})),this.isField=this.$container.hasClass("fld-field"),this.requirable=this.isField&&Garnish.hasAttr(this.$container,"data-requirable"),this.isField&&(this.attribute=this.$container.data("attribute")),this.settingsNamespace=this.$container.data("settings-namespace").replace(/\bELEMENT_UID\b/g,this.uid);var s=(this.$container.data("settings-html")||"").replace(/\bELEMENT_UID\b/g,this.uid),a=this.requirable&&this.$container.hasClass("fld-required");if(this.hasCustomWidth=this.tab.designer.settings.customizableUi&&Garnish.hasAttr(this.$container,"data-has-custom-width"),this.hasSettings=s||this.requirable,this.hasSettings){this.$settingsContainer=$("<div/>",{class:"hidden"}),this.$editBtn=$("<a/>",{role:"button",tabindex:0,class:"settings icon",title:Craft.t("app","Edit")});var n=function(){i.slideout?i.slideout.open():i.createSettings(s,a)};this.$editBtn.on("click",n),this.$container.on("dblclick",n)}this.initUi(),this.$container.attr("data-keywords",null),this.$container.attr("data-settings-html",null)},initUi:function(){var t=this;this.hasCustomWidth&&new Craft.SlidePicker(this.config.width||100,{min:25,max:100,step:25,valueLabel:function(t){return Craft.t("app","{pct} width",{pct:"".concat(t,"%")})},onChange:function(e){t.updateConfig((function(t){return t.width=e,t}))}}).$container.appendTo(this.$container),this.hasSettings&&this.$editBtn.appendTo(this.$container)},createSettings:function(t,e){var i=this,s=(this.$container.data("settings-js")||"").replace(/\bELEMENT_UID\b/g,this.uid);if(this.slideout=Craft.FieldLayoutDesigner.createSlideout(t,s),this.slideout.$container.on("submit",(function(t){t.preventDefault(),i.applySettings()})),this.requirable){var a=this.slideout.$container.find(".fields:first");Craft.ui.createLightswitchField({label:Craft.t("app","Required"),name:"".concat(this.settingsNamespace,"[required]"),on:e}).prependTo(a)}this.trigger("createSettings")},applySettings:function(){var t=this,e=this.slideout.$container.find("button[type=submit]").addClass("loading");Craft.sendActionRequest("POST","fields/apply-layout-element-settings",{data:{config:this.config,settingsNamespace:this.settingsNamespace,settings:this.slideout.$container.serialize()}}).then((function(e){t.config=e.data.config,t.$editBtn.detach(),t.$container.html($(e.data.selectorHtml).html()),t.initUi()})).catch((function(t){Craft.cp.displayError(),console.error(t)})).finally((function(){e.removeClass("loading"),t.updateRequiredClass(),t.slideout.close()}))},updateRequiredClass:function(){this.requirable&&(this.config.required?this.$container.addClass("fld-required"):this.$container.removeClass("fld-required"))},get index(){var t=this,e=this.tab.config;return void 0===e?-1:e.elements.findIndex((function(e){return e.uid===t.uid}))},get config(){var t=this;if(!this.uid)throw"Tab is missing its UID";var e=this.tab.config.elements.find((function(e){return e.uid===t.uid}));return e||(e={uid:this.uid},this.config=e),e},set config(t){var e=this.tab.config,i=this.index;if(-1!==i)e.elements[i]=t;else{var s=$.inArray(this.$container[0],this.$container.parent().children(".fld-element"));e.elements.splice(s,0,t)}this.tab.config=e},updateConfig:function(t){var e=t(this.config);!1!==e&&(this.config=e)},updatePositionInConfig:function(){var t=this;this.tab.updateConfig((function(e){var i=t.config,s=t.index,a=$.inArray(t.$container[0],t.$container.parent().children(".fld-element"));return-1!==s&&e.elements.splice(s,1),e.elements.splice(a,0,i),e}))},destroy:function(){var t=this;this.tab.updateConfig((function(e){var i=t.index;return-1!==i&&(e.elements.splice(i,1),e)})),this.tab.designer.elementDrag.removeItems(this.$container),this.$container.remove(),this.isField&&this.tab.designer.removeFieldByHandle(this.attribute),this.base()}}),Craft.FieldLayoutDesigner.BaseDrag=Garnish.Drag.extend({designer:null,$insertion:null,showingInsertion:!1,$caboose:null,init:function(t,e){this.designer=t,this.base(this.findItems(),e)},onDragStart:function(){this.base(),this.$insertion=this.createInsertion(),this.$caboose=this.createCaboose(),this.$items=$().add(this.$items.add(this.$caboose)),Garnish.$bod.addClass("dragging")},removeCaboose:function(){this.$items=this.$items.not(this.$caboose),this.$caboose.remove()},swapDraggeeWithInsertion:function(){this.$insertion.insertBefore(this.$draggee),this.$draggee.detach(),this.$items=$().add(this.$items.not(this.$draggee).add(this.$insertion)),this.showingInsertion=!0},swapInsertionWithDraggee:function(){this.$insertion.replaceWith(this.$draggee),this.$items=$().add(this.$items.not(this.$insertion).add(this.$draggee)),this.showingInsertion=!1},setMidpoints:function(){for(var t=0;t<this.$items.length;t++){var e=$(this.$items[t]),i=e.offset();e.hasClass("unused")||e.data("midpoint",{left:i.left+e.outerWidth()/2,top:i.top+e.outerHeight()/2})}},getClosestItem:function(){for(this.getClosestItem._closestItem=null,this.getClosestItem._closestItemMouseDiff=null,this.getClosestItem._i=0;this.getClosestItem._i<this.$items.length;this.getClosestItem._i++)this.getClosestItem._$item=$(this.$items[this.getClosestItem._i]),this.getClosestItem._midpoint=this.getClosestItem._$item.data("midpoint"),this.getClosestItem._midpoint&&(this.getClosestItem._mouseDiff=Garnish.getDist(this.getClosestItem._midpoint.left,this.getClosestItem._midpoint.top,this.mouseX,this.mouseY),(null===this.getClosestItem._closestItem||this.getClosestItem._mouseDiff<this.getClosestItem._closestItemMouseDiff)&&(this.getClosestItem._closestItem=this.getClosestItem._$item[0],this.getClosestItem._closestItemMouseDiff=this.getClosestItem._mouseDiff));return this.getClosestItem._closestItem},checkForNewClosestItem:function(){this.checkForNewClosestItem._closestItem=this.getClosestItem(),this.checkForNewClosestItem._closestItem!==this.$insertion[0]&&(this.showingInsertion&&$.inArray(this.$insertion[0],this.$items)<$.inArray(this.checkForNewClosestItem._closestItem,this.$items)&&-1===$.inArray(this.checkForNewClosestItem._closestItem,this.$caboose)?this.$insertion.insertAfter(this.checkForNewClosestItem._closestItem):this.$insertion.insertBefore(this.checkForNewClosestItem._closestItem),this.$items=$().add(this.$items.add(this.$insertion)),this.showingInsertion=!0,this.designer.tabGrid.refreshCols(!0),this.setMidpoints())},onDragStop:function(){var t=this;this.showingInsertion&&this.swapInsertionWithDraggee(),this.removeCaboose(),this.designer.tabGrid.refreshCols(!0);var e=this.$draggee.offset();!e||0===e.top&&0===e.left?(this.$draggee.css({display:this.draggeeDisplay,visibility:"visible",opacity:0}).velocity({opacity:1},Garnish.FX_DURATION),this.helpers[0].velocity({opacity:0},Garnish.FX_DURATION,(function(){t._showDraggee()}))):this.returnHelpersToDraggees(),this.base(),Garnish.$bod.removeClass("dragging")}}),Craft.FieldLayoutDesigner.TabDrag=Craft.FieldLayoutDesigner.BaseDrag.extend({init:function(t){this.base(t,{handle:".tab"})},findItems:function(){return this.designer.$tabContainer.find("> div.fld-tab")},onDragStart:function(){this.base(),this.swapDraggeeWithInsertion(),this.setMidpoints()},swapDraggeeWithInsertion:function(){this.base(),this.designer.tabGrid.removeItems(this.$draggee),this.designer.tabGrid.addItems(this.$insertion)},swapInsertionWithDraggee:function(){this.base(),this.designer.tabGrid.removeItems(this.$insertion),this.designer.tabGrid.addItems(this.$draggee)},onDrag:function(){this.checkForNewClosestItem(),this.base()},onDragStop:function(){this.base(),this.$draggee.css({display:this.draggeeDisplay,visibility:"hidden"}),this.$draggee.data("fld-tab").updatePositionInConfig()},createCaboose:function(){var t=$('<div class="fld-tab fld-tab-caboose"/>').appendTo(this.designer.$tabContainer);return this.designer.tabGrid.addItems(t),t},removeCaboose:function(){this.base(),this.designer.tabGrid.removeItems(this.$caboose)},createInsertion:function(){var t=this.$draggee.find(".tab");return $('\n<div class="fld-tab fld-insertion" style="height: '.concat(this.$draggee.height(),'px;">\n  <div class="tabs"><div class="tab sel draggable" style="width: ').concat(t.width(),"px; height: ").concat(t.height(),'px;"></div></div>\n  <div class="fld-tabcontent" style="height: ').concat(this.$draggee.find(".fld-tabcontent").height(),'px;"></div>\n</div>\n'))}}),Craft.FieldLayoutDesigner.ElementDrag=Craft.FieldLayoutDesigner.BaseDrag.extend({draggingLibraryElement:!1,draggingField:!1,originalTab:null,onDragStart:function(){this.base(),this.draggingLibraryElement=this.$draggee.hasClass("unused"),this.draggingField=this.$draggee.hasClass("fld-field"),this.draggingLibraryElement&&!this.draggingField&&this.$draggee.css({display:this.draggeeDisplay,visibility:"visible"}),this.draggingLibraryElement?this.originalTab=null:(this.originalTab=this.$draggee.closest(".fld-tab").data("fld-tab"),this.swapDraggeeWithInsertion()),this.setMidpoints()},onDrag:function(){this.isDraggeeMandatory()||this.isHoveringOverTab()?this.checkForNewClosestItem():this.showingInsertion&&(this.$insertion.remove(),this.$items=$().add(this.$items.not(this.$insertion)),this.showingInsertion=!1,this.designer.tabGrid.refreshCols(!0),this.setMidpoints()),this.base()},isDraggeeMandatory:function(){return Garnish.hasAttr(this.$draggee,"data-mandatory")},isHoveringOverTab:function(){for(var t=0;t<this.designer.tabGrid.$items.length;t++)if(Garnish.hitTest(this.mouseX,this.mouseY,this.designer.tabGrid.$items.eq(t)))return!0;return!1},findItems:function(){return this.designer.$tabContainer.find(".fld-element").add(this.designer.$sidebar.find(".fld-element"))},createCaboose:function(){for(var t=$(),e=this.designer.$tabContainer.find("> .fld-tab > .fld-tabcontent"),i=0;i<e.length;i++)t=t.add($("<div/>").appendTo(e[i]));return t},createInsertion:function(){return $('<div class="fld-element fld-insertion" style="height: '.concat(this.$draggee.outerHeight(),'px;"/>'))},onDragStop:function(){var t=this.showingInsertion;if(t){if(this.draggingLibraryElement){var e=this.$draggee.clone().removeClass("unused");this.draggingField&&(this.$draggee.css({visibility:"inherit",display:"field"}).addClass("hidden"),0===this.$draggee.siblings(".fld-field:not(.hidden)").length&&this.$draggee.closest(".fld-field-group").addClass("hidden")),this.$draggee=e,this.addItems(e)}}else if(!this.draggingLibraryElement){var i=this.draggingField?this.designer.$fields.filter('[data-attribute="'.concat(this.$draggee.data("attribute"),'"]:first')):this.designer.$uiLibraryElements.filter('[data-type="'.concat(this.$draggee.data("type"),'"]:first'));this.draggingField&&(i.removeClass("hidden"),i.closest(".fld-field-group").removeClass("hidden")),this.$draggee.data("fld-element").destroy(),this.$draggee=i}if(this.base(),this.$draggee.css({display:this.draggeeDisplay,visibility:this.draggingField||t?"hidden":"visible"}),t){var s,a=this.$draggee.closest(".fld-tab").data("fld-tab");if(this.draggingLibraryElement)s=a.initElement(this.$draggee);else if(s=this.$draggee.data("fld-element"),a!==this.originalTab){var n=s.config;this.originalTab.updateConfig((function(t){var e=s.index;return-1!==e&&(t.elements.splice(e,1),t)})),this.$draggee.data("fld-element").tab=a,s.config=n}s.updatePositionInConfig()}}})},3347:function(){Craft.FieldToggle=Garnish.Base.extend({$toggle:null,targetPrefix:null,targetSelector:null,reverseTargetSelector:null,_$target:null,_$reverseTarget:null,type:null,init:function(t){switch(this.$toggle=$(t),this.$toggle.data("fieldtoggle")&&(console.warn("Double-instantiating a field toggle on an element"),this.$toggle.data("fieldtoggle").destroy()),this.$toggle.data("fieldtoggle",this),this.type=this.getType(),"select"===this.type||"fieldset"===this.type?this.targetPrefix=this.$toggle.attr("data-target-prefix")||"":(this.targetSelector=this.normalizeTargetSelector(this.$toggle.data("target")),this.reverseTargetSelector=this.normalizeTargetSelector(this.$toggle.data("reverse-target"))),this.findTargets(),this.type){case"link":this.addListener(this.$toggle,"click","onToggleChange");break;case"fieldset":this.addListener(this.$toggle.find("input"),"change","onToggleChange");break;default:this.addListener(this.$toggle,"change","onToggleChange"),this.onToggleChange()}},normalizeTargetSelector:function(t){return t&&!t.match(/^[#\.]/)&&(t="#"+t),t},getType:function(){var t=this.$toggle.prop("nodeName");if("INPUT"===t&&"checkbox"===this.$toggle.attr("type")||"checkbox"===this.$toggle.attr("role")||"switch"===this.$toggle.attr("role"))return"checkbox";switch(t){case"SELECT":return Garnish.hasAttr(this.$toggle,"data-boolean-menu")?"booleanMenu":"select";case"A":return"link";default:return"fieldset"}},findTargets:function(){"select"===this.type||"fieldset"===this.type?(this.getToggleVal(),this._$target=$(this.normalizeTargetSelector(this.targetPrefix+this.getToggleVal()))):(this.targetSelector&&(this._$target=$(this.targetSelector)),this.reverseTargetSelector&&(this._$reverseTarget=$(this.reverseTargetSelector)))},getToggleVal:function(){switch(this.type){case"checkbox":return void 0!==this.$toggle.prop("checked")?this.$toggle.prop("checked"):"true"===this.$toggle.attr("aria-checked");case"booleanMenu":var t=this.$toggle.data("boolean");if(void 0!==t)return t;var e=this.$toggle.val();return e&&"0"!==e;default:var i;return null==(i="fieldset"===this.type?this.$toggle.find("input:checked:first").val():Garnish.getInputPostVal(this.$toggle))?null:i.replace(/[^\w]+/g,"-")}},onToggleChange:function(){"select"===this.type||"fieldset"===this.type?(this.hideTarget(this._$target),this.findTargets(),this.showTarget(this._$target)):(this.findTargets(),"link"===this.type?this.onToggleChange._show=this.$toggle.hasClass("collapsed")||!this.$toggle.hasClass("expanded"):this.onToggleChange._show=!!this.getToggleVal(),this.onToggleChange._show?(this.showTarget(this._$target),this.hideTarget(this._$reverseTarget)):(this.hideTarget(this._$target),this.showTarget(this._$reverseTarget)),delete this.onToggleChange._show)},showTarget:function(t){var e=this;if(t&&t.length){if(this.showTarget._currentHeight=t.height(),t.removeClass("hidden"),"select"!==this.type&&"fieldset"!==this.type){"link"===this.type&&(this.$toggle.removeClass("collapsed"),this.$toggle.addClass("expanded"));for(var i=0;i<t.length;i++)!function(t){"SPAN"!==t.prop("nodeName")&&(t.height("auto"),e.showTarget._targetHeight=t.height(),t.css({height:e.showTarget._currentHeight,overflow:"hidden"}),t.velocity("stop"),t.velocity({height:e.showTarget._targetHeight},"fast",(function(){t.css({height:"",overflow:""})})))}(t.eq(i));delete this.showTarget._targetHeight}delete this.showTarget._currentHeight,Garnish.$win.trigger("resize")}},hideTarget:function(t){if(t&&t.length)if("select"===this.type||"fieldset"===this.type)t.addClass("hidden");else{"link"===this.type&&(this.$toggle.removeClass("expanded"),this.$toggle.addClass("collapsed"));for(var e=0;e<t.length;e++)!function(t){t.hasClass("hidden")||("SPAN"===t.prop("nodeName")?t.addClass("hidden"):(t.css("overflow","hidden"),t.velocity("stop"),t.velocity({height:0},"fast",(function(){t.addClass("hidden")}))))}(t.eq(e))}},destroy:function(){this.$toggle.removeData("fieldtoggle"),this.base()}})},9478:function(){Craft.Grid=Garnish.Base.extend({$container:null,$items:null,items:null,totalCols:null,colGutterDrop:null,colPctWidth:null,possibleItemColspans:null,possibleItemPositionsByColspan:null,itemPositions:null,itemColspansByPosition:null,layouts:null,layout:null,itemHeights:null,leftPadding:null,_refreshingCols:!1,_refreshColsAfterRefresh:!1,_forceRefreshColsAfterRefresh:!1,init:function(t,e){var i=this;this.$container=$(t),this.$container.data("grid")&&(console.warn("Double-instantiating a grid on an element"),this.$container.data("grid").destroy()),this.$container.data("grid",this),this.setSettings(e,Craft.Grid.defaults),this.handleContainerHeightProxy=function(){i.refreshCols(!1,!0)},this.$items=this.$container.children(this.settings.itemSelector),this.setItems(),this.refreshCols(!0,!1),Garnish.$doc.ready((function(){i.refreshCols(!1,!1)}))},addItems:function(t){this.$items=$().add(this.$items.add(t)),this.setItems(),this.refreshCols(!0,!0)},removeItems:function(t){this.$items=$().add(this.$items.not(t)),this.setItems(),this.refreshCols(!0,!0)},resetItemOrder:function(){this.$items=$().add(this.$items),this.setItems(),this.refreshCols(!0,!0)},setItems:function(){for(this.setItems._={},this.items=[],this.setItems._.i=0;this.setItems._.i<this.$items.length;this.setItems._.i++)this.items.push($(this.$items[this.setItems._.i]));delete this.setItems._},refreshCols:function(t){if(this._refreshingCols)return this._refreshColsAfterRefresh=!0,void(t&&(this._forceRefreshColsAfterRefresh=!0));if(this._refreshingCols=!0,this.items.length)if(this.refreshCols._={},this.refreshCols._.oldHeight=this.$container[0].style.height,this.$container[0].style.height=1,this.refreshCols._.scrollHeight=this.$container[0].scrollHeight,this.$container[0].style.height=this.refreshCols._.oldHeight,0!==this.refreshCols._.scrollHeight)if(this.settings.cols?this.refreshCols._.totalCols=this.settings.cols:(this.refreshCols._.totalCols=Math.floor(this.$container.width()/this.settings.minColWidth),null!==this.totalCols&&this.refreshCols._.totalCols>this.totalCols&&(this.refreshCols._.totalCols=Math.floor((this.$container.width()-20)/this.settings.minColWidth)),this.settings.maxCols&&this.refreshCols._.totalCols>this.settings.maxCols&&(this.refreshCols._.totalCols=this.settings.maxCols)),0===this.refreshCols._.totalCols&&(this.refreshCols._.totalCols=1),!0===t||this.totalCols!==this.refreshCols._.totalCols){if(this.totalCols=this.refreshCols._.totalCols,this.colGutterDrop=this.settings.gutter*(this.totalCols-1)/this.totalCols,this.removeListener(this.$container,"resize"),"grid"===this.settings.fillMode)for(this.refreshCols._.itemIndex=0;this.refreshCols._.itemIndex<this.items.length;){for(this.refreshCols._.tallestItemHeight=-1,this.refreshCols._.colIndex=0,this.refreshCols._.i=this.refreshCols._.itemIndex;this.refreshCols._.i<this.refreshCols._.itemIndex+this.totalCols&&this.refreshCols._.i<this.items.length;this.refreshCols._.i++)this.refreshCols._.itemHeight=this.items[this.refreshCols._.i].height("auto").height(),this.refreshCols._.itemHeight>this.refreshCols._.tallestItemHeight&&(this.refreshCols._.tallestItemHeight=this.refreshCols._.itemHeight),this.refreshCols._.colIndex++;for(this.settings.snapToGrid&&(this.refreshCols._.remainder=this.refreshCols._.tallestItemHeight%this.settings.snapToGrid,this.refreshCols._.remainder&&(this.refreshCols._.tallestItemHeight+=this.settings.snapToGrid-this.refreshCols._.remainder)),this.refreshCols._.i=this.refreshCols._.itemIndex;this.refreshCols._.i<this.refreshCols._.itemIndex+this.totalCols&&this.refreshCols._.i<this.items.length;this.refreshCols._.i++)this.items[this.refreshCols._.i].height(this.refreshCols._.tallestItemHeight);this.refreshCols._.itemIndex+=this.totalCols}else if(this.removeListener(this.$items,"resize"),1===this.totalCols)this.$container.height("auto"),this.$items.show().css({position:"relative",width:"auto",top:0}).css(Craft.left,0);else{for(this.$items.css("position","absolute"),this.colPctWidth=100/this.totalCols,this.layouts=[],this.itemPositions=[],this.itemColspansByPosition=[],this.possibleItemColspans=[],this.possibleItemPositionsByColspan=[],this.itemHeightsByColspan=[],this.refreshCols._.item=0;this.refreshCols._.item<this.items.length;this.refreshCols._.item++)for(this.possibleItemColspans[this.refreshCols._.item]=[],this.possibleItemPositionsByColspan[this.refreshCols._.item]={},this.itemHeightsByColspan[this.refreshCols._.item]={},this.refreshCols._.$item=this.items[this.refreshCols._.item].show(),this.refreshCols._.positionRight="right"===this.refreshCols._.$item.data("position"),this.refreshCols._.positionLeft="left"===this.refreshCols._.$item.data("position"),this.refreshCols._.minColspan=this.refreshCols._.$item.data("colspan")?this.refreshCols._.$item.data("colspan"):this.refreshCols._.$item.data("min-colspan")?this.refreshCols._.$item.data("min-colspan"):1,this.refreshCols._.maxColspan=this.refreshCols._.$item.data("colspan")?this.refreshCols._.$item.data("colspan"):this.refreshCols._.$item.data("max-colspan")?this.refreshCols._.$item.data("max-colspan"):this.totalCols,this.refreshCols._.minColspan>this.totalCols&&(this.refreshCols._.minColspan=this.totalCols),this.refreshCols._.maxColspan>this.totalCols&&(this.refreshCols._.maxColspan=this.totalCols),this.refreshCols._.colspan=this.refreshCols._.minColspan;this.refreshCols._.colspan<=this.refreshCols._.maxColspan;this.refreshCols._.colspan++)for(this.refreshCols._.$item.css("width",this.getItemWidthCss(this.refreshCols._.colspan)),this.itemHeightsByColspan[this.refreshCols._.item][this.refreshCols._.colspan]=this.refreshCols._.$item.outerHeight(),this.possibleItemColspans[this.refreshCols._.item].push(this.refreshCols._.colspan),this.possibleItemPositionsByColspan[this.refreshCols._.item][this.refreshCols._.colspan]=[],this.refreshCols._.positionLeft?(this.refreshCols._.minPosition=0,this.refreshCols._.maxPosition=0):this.refreshCols._.positionRight?(this.refreshCols._.minPosition=this.totalCols-this.refreshCols._.colspan,this.refreshCols._.maxPosition=this.refreshCols._.minPosition):(this.refreshCols._.minPosition=0,this.refreshCols._.maxPosition=this.totalCols-this.refreshCols._.colspan),this.refreshCols._.position=this.refreshCols._.minPosition;this.refreshCols._.position<=this.refreshCols._.maxPosition;this.refreshCols._.position++)this.possibleItemPositionsByColspan[this.refreshCols._.item][this.refreshCols._.colspan].push(this.refreshCols._.position);for(this.refreshCols._.colHeights=[],this.refreshCols._.i=0;this.refreshCols._.i<this.totalCols;this.refreshCols._.i++)this.refreshCols._.colHeights.push(0);for(this.createLayouts(0,[],[],this.refreshCols._.colHeights,0),this.refreshCols._.layoutTotalCols=[],this.refreshCols._.i=0;this.refreshCols._.i<this.layouts.length;this.refreshCols._.i++)for(this.refreshCols._.layoutTotalCols[this.refreshCols._.i]=0,this.refreshCols._.j=0;this.refreshCols._.j<this.totalCols;this.refreshCols._.j++)this.layouts[this.refreshCols._.i].colHeights[this.refreshCols._.j]&&this.refreshCols._.layoutTotalCols[this.refreshCols._.i]++;for(this.refreshCols._.highestTotalCols=Math.max.apply(null,this.refreshCols._.layoutTotalCols),this.refreshCols._.i=this.layouts.length-1;this.refreshCols._.i>=0;this.refreshCols._.i--)this.refreshCols._.layoutTotalCols[this.refreshCols._.i]!==this.refreshCols._.highestTotalCols&&this.layouts.splice(this.refreshCols._.i,1);for(this.refreshCols._.layoutHeights=[],this.refreshCols._.i=0;this.refreshCols._.i<this.layouts.length;this.refreshCols._.i++)this.refreshCols._.layoutHeights.push(Math.max.apply(null,this.layouts[this.refreshCols._.i].colHeights));for(this.refreshCols._.shortestHeight=Math.min.apply(null,this.refreshCols._.layoutHeights),this.refreshCols._.shortestLayouts=[],this.refreshCols._.emptySpaces=[],this.refreshCols._.i=0;this.refreshCols._.i<this.refreshCols._.layoutHeights.length;this.refreshCols._.i++)if(this.refreshCols._.layoutHeights[this.refreshCols._.i]===this.refreshCols._.shortestHeight){for(this.refreshCols._.shortestLayouts.push(this.layouts[this.refreshCols._.i]),this.refreshCols._.emptySpace=this.layouts[this.refreshCols._.i].emptySpace,this.refreshCols._.j=0;this.refreshCols._.j<this.totalCols;this.refreshCols._.j++)this.refreshCols._.emptySpace+=this.refreshCols._.shortestHeight-this.layouts[this.refreshCols._.i].colHeights[this.refreshCols._.j];this.refreshCols._.emptySpaces.push(this.refreshCols._.emptySpace)}for(this.layout=this.refreshCols._.shortestLayouts[$.inArray(Math.min.apply(null,this.refreshCols._.emptySpaces),this.refreshCols._.emptySpaces)],this.refreshCols._.i=0;this.refreshCols._.i<this.items.length;this.refreshCols._.i++)this.refreshCols._.css={width:this.getItemWidthCss(this.layout.colspans[this.refreshCols._.i])},this.refreshCols._.css[Craft.left]=this.getItemLeftPosCss(this.layout.positions[this.refreshCols._.i]),this.items[this.refreshCols._.i].css(this.refreshCols._.css);this.isSimpleLayout()?(this.$container.height("auto"),this.$items.css({position:"relative",top:0,"margin-bottom":this.settings.gutter+"px"})):(this.$items.css("position","absolute"),this.positionItems(),this.addListener(this.$items,"resize","onItemResize"))}this.completeRefreshCols(),this.addListener(this.$container,"resize",this.handleContainerHeightProxy),this.onRefreshCols()}else this.completeRefreshCols();else this.completeRefreshCols();else this.completeRefreshCols()},completeRefreshCols:function(){var t=this;if(void 0!==this.refreshCols._&&delete this.refreshCols._,this._refreshingCols=!1,this._refreshColsAfterRefresh){var e=this._forceRefreshColsAfterRefresh;this._refreshColsAfterRefresh=!1,this._forceRefreshColsAfterRefresh=!1,Garnish.requestAnimationFrame((function(){t.refreshCols(e)}))}},getItemWidth:function(t){return this.colPctWidth*t},getItemWidthCss:function(t){return"calc("+this.getItemWidth(t)+"% - "+this.colGutterDrop+"px)"},getItemWidthInPx:function(t){return this.getItemWidth(t)/100*this.$container.width()-this.colGutterDrop},getItemLeftPosCss:function(t){return"calc(("+this.getItemWidth(1)+"% + "+(this.settings.gutter-this.colGutterDrop)+"px) * "+t+")"},getItemLeftPosInPx:function(t){return(this.getItemWidth(1)/100*this.$container.width()+(this.settings.gutter-this.colGutterDrop))*t},createLayouts:function(t,e,i,s,a){new Craft.Grid.LayoutGenerator(this).createLayouts(t,e,i,s,a)},isSimpleLayout:function(){for(this.isSimpleLayout._={},this.isSimpleLayout._.i=0;this.isSimpleLayout._.i<this.layout.positions.length;this.isSimpleLayout._.i++)if(0!==this.layout.positions[this.isSimpleLayout._.i])return delete this.isSimpleLayout._,!1;return delete this.isSimpleLayout._,!0},positionItems:function(){for(this.positionItems._={},this.positionItems._.colHeights=[],this.positionItems._.i=0;this.positionItems._.i<this.totalCols;this.positionItems._.i++)this.positionItems._.colHeights.push(0);for(this.positionItems._.i=0;this.positionItems._.i<this.items.length;this.positionItems._.i++){for(this.positionItems._.endingCol=this.layout.positions[this.positionItems._.i]+this.layout.colspans[this.positionItems._.i]-1,this.positionItems._.affectedColHeights=[],this.positionItems._.col=this.layout.positions[this.positionItems._.i];this.positionItems._.col<=this.positionItems._.endingCol;this.positionItems._.col++)this.positionItems._.affectedColHeights.push(this.positionItems._.colHeights[this.positionItems._.col]);for(this.positionItems._.top=Math.max.apply(null,this.positionItems._.affectedColHeights),this.positionItems._.top>0&&(this.positionItems._.top+=this.settings.gutter),this.items[this.positionItems._.i].css("top",this.positionItems._.top),this.positionItems._.col=this.layout.positions[this.positionItems._.i];this.positionItems._.col<=this.positionItems._.endingCol;this.positionItems._.col++)this.positionItems._.colHeights[this.positionItems._.col]=this.positionItems._.top+this.itemHeightsByColspan[this.positionItems._.i][this.layout.colspans[this.positionItems._.i]]}this.$container.height(Math.max.apply(null,this.positionItems._.colHeights)),delete this.positionItems._},onItemResize:function(t){this.onItemResize._={},t.stopPropagation(),this.onItemResize._.item=$.inArray(t.currentTarget,this.$items),-1!==this.onItemResize._.item&&(this.onItemResize._.newHeight=this.items[this.onItemResize._.item].outerHeight(),this.onItemResize._.newHeight!==this.itemHeightsByColspan[this.onItemResize._.item][this.layout.colspans[this.onItemResize._.item]]&&(this.itemHeightsByColspan[this.onItemResize._.item][this.layout.colspans[this.onItemResize._.item]]=this.onItemResize._.newHeight,this.positionItems(!1))),delete this.onItemResize._},onRefreshCols:function(){this.trigger("refreshCols"),this.settings.onRefreshCols()},destroy:function(){this.$container.removeData("grid"),this.base()}},{defaults:{itemSelector:".item",cols:null,maxCols:null,minColWidth:320,gutter:14,fillMode:"top",colClass:"col",snapToGrid:null,onRefreshCols:$.noop}}),Craft.Grid.LayoutGenerator=Garnish.Base.extend({grid:null,_:null,init:function(t){this.grid=t},createLayouts:function(t,e,i,s,a){for(this._={},this._.c=0;this._.c<this.grid.possibleItemColspans[t].length;this._.c++){for(this._.colspan=this.grid.possibleItemColspans[t][this._.c],this._.tallestColHeightsByPosition=[],this._.p=0;this._.p<this.grid.possibleItemPositionsByColspan[t][this._.colspan].length;this._.p++){for(this._.position=this.grid.possibleItemPositionsByColspan[t][this._.colspan][this._.p],this._.colHeightsForPosition=[],this._.endingCol=this._.position+this._.colspan-1,this._.col=this._.position;this._.col<=this._.endingCol;this._.col++)this._.colHeightsForPosition.push(s[this._.col]);this._.tallestColHeightsByPosition[this._.p]=Math.max.apply(null,this._.colHeightsForPosition)}for(this._.p=$.inArray(Math.min.apply(null,this._.tallestColHeightsByPosition),this._.tallestColHeightsByPosition),this._.position=this.grid.possibleItemPositionsByColspan[t][this._.colspan][this._.p],this._.positions=e.slice(0),this._.colspans=i.slice(0),this._.colHeights=s.slice(0),this._.emptySpace=a,this._.positions.push(this._.position),this._.colspans.push(this._.colspan),this._.tallestColHeight=this._.tallestColHeightsByPosition[this._.p],this._.endingCol=this._.position+this._.colspan-1,this._.col=this._.position;this._.col<=this._.endingCol;this._.col++)this._.emptySpace+=this._.tallestColHeight-this._.colHeights[this._.col],this._.colHeights[this._.col]=this._.tallestColHeight+this.grid.itemHeightsByColspan[t][this._.colspan];t===this.grid.items.length-1?this.grid.layouts.push({positions:this._.positions,colspans:this._.colspans,colHeights:this._.colHeights,emptySpace:this._.emptySpace}):this.grid.createLayouts(t+1,this._.positions,this._.colspans,this._.colHeights,this._.emptySpace)}delete this._}})},2387:function(){Craft.HandleGenerator=Craft.BaseInputGenerator.extend({generateTargetValue:function(t){var e=t.replace("/<(.*?)>/g","");e=(e=e.replace(/['"‘’“”\[\]\(\)\{\}:]/g,"")).toLowerCase(),e=Craft.asciiString(e),this.settings.allowNonAlphaStart||(e=e.replace(/^[^a-z]+/,""));var i=Craft.filterArray(e.split(/[^a-z0-9]+/));if(e="","snake"===Craft.handleCasing)return i.join("_");for(var s=0;s<i.length;s++)"pascal"!==Craft.handleCasing&&0===s?e+=i[s]:e+=i[s].charAt(0).toUpperCase()+i[s].substring(1);return e}})},7966:function(){Craft.ImageUpload=Garnish.Base.extend({$container:null,progressBar:null,uploader:null,init:function(t){this.setSettings(t,Craft.ImageUpload.defaults),this.initImageUpload()},initImageUpload:function(){this.$container=$(this.settings.containerSelector),this.progressBar=new Craft.ProgressBar($('<div class="progress-shade"></div>').appendTo(this.$container));var t={url:Craft.getActionUrl(this.settings.uploadAction),formData:this.settings.postParameters,fileInput:this.$container.find(this.settings.fileInputSelector),paramName:this.settings.uploadParamName};void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(t.formData[Craft.csrfTokenName]=Craft.csrfTokenValue),t.events={},t.events.fileuploadstart=this._onUploadStart.bind(this),t.events.fileuploadprogressall=this._onUploadProgress.bind(this),t.events.fileuploaddone=this._onUploadComplete.bind(this),t.events.fileuploadfail=this._onUploadFailure.bind(this),this.uploader=new Craft.Uploader(this.$container,t),this.initButtons()},initButtons:function(){var t=this;this.$container.find(this.settings.uploadButtonSelector).on("click",(function(e){t.$container.find(t.settings.fileInputSelector).trigger("click")})),this.$container.find(this.settings.deleteButtonSelector).on("click",(function(e){confirm(Craft.t("app","Are you sure you want to delete this image?"))&&($(e.currentTarget).parent().append('<div class="blocking-modal"></div>'),Craft.sendActionRequest("POST",t.settings.deleteAction,{data:t.settings.postParameters}).then((function(e){var i=e.data;t.refreshImage(i)})))}))},refreshImage:function(t){$(this.settings.containerSelector).replaceWith(t.html),this.settings.onAfterRefreshImage(t),this.initImageUpload()},_onUploadStart:function(t){this.progressBar.$progressBar.css({top:Math.round(this.$container.outerHeight()/2)-6}),this.$container.addClass("uploading"),this.progressBar.resetProgressBar(),this.progressBar.showProgressBar()},_onUploadProgress:function(t,e){var i=parseInt(e.loaded/e.total*100,10);this.progressBar.setProgressPercentage(i)},_onUploadComplete:function(t,e){e.result.error?alert(e.result.error):($(e.result.html),this.refreshImage(e.result)),this.uploader.isLastUpload()&&(this.progressBar.hideProgressBar(),this.$container.removeClass("uploading"))},_onUploadFailure:function(t,e){var i,s=e.response(),a=(null==s||null===(i=s.jqXHR)||void 0===i?void 0:i.responseJSON)||{},n=a.message,r=a.filename;n||(n=r?Craft.t("app","Upload failed for “{filename}”.",{filename:r}):Craft.t("app","Upload failed.")),alert(n),this.progressBar.hideProgressBar(),this.$container.removeClass("uploading")}},{defaults:{postParameters:{},uploadAction:"",deleteAction:"",fileInputSelector:"",onAfterRefreshImage:$.noop,containerSelector:null,uploadButtonSelector:null,deleteButtonSelector:null,uploadParamName:"files"}})},657:function(){Craft.InfoIcon=Garnish.Base.extend({$container:null,$icon:null,$liveRegion:null,content:null,hud:null,init:function(t){var e=this;if(this.$icon=$(t),this.$liveRegion=$("<span/>",{role:"status",class:"visually-hidden"}),this.$icon.data("infoicon")?(console.warn("Double-instantiating an info icon on an element"),this.content=this.$icon.data("infoicon").content,this.$icon.data("infoicon").destroy()):(this.content=this.$icon.html(),this.$icon.html("").attr({tabindex:0,role:"button",type:"button","aria-label":Craft.t("app","More info")}).wrap($("<span/>",{class:"infoicon-container"})),this.$container=this.$icon.parent(),this.$container.append(this.$liveRegion)),this.$icon.data("infoicon",this),this.$icon[0].previousSibling&&this.$icon[0].previousSibling.nodeType===Node.TEXT_NODE&&!this.$icon.parent().hasClass("nowrap")){var i=this.$icon[0].previousSibling.nodeValue.match(/[^\s\-]+\s*$/);i&&(this.$icon[0].previousSibling.nodeValue=this.$icon[0].previousSibling.nodeValue.substring(0,i.index),$("<span/>",{class:"nowrap",html:i[0].replace(/\s+$/,"")+" "}).insertAfter(this.$icon[0].previousSibling).append(this.$icon))}this.addListener(this.$icon,"click",(function(t){t.preventDefault(),t.stopPropagation(),e.showHud()})),this.addListener(this.$icon,"keydown",(function(t){e.hud&&e.hud.showing||![Garnish.SPACE_KEY,Garnish.RETURN_KEY].includes(t.keyCode)||(t.preventDefault(),t.stopPropagation(),e.showHud())}))},showHud:function(t){var e=this;this.hud?this.hud.show():(this.hud=new Garnish.HUD(this.$icon,this.content,{hudClass:"hud info-hud",closeOtherHUDs:!1,onShow:function(){Garnish.uiLayerManager.registerShortcut(Garnish.SPACE_KEY,(function(){e.hud.hide()})),e.$liveRegion.html(""),setTimeout((function(){e.$liveRegion.html(e.content)}),200)},onHide:function(){e.$liveRegion.html("")}}),Craft.initUiElements(this.hud.$body))},destroy:function(){this.$icon.removeData("infoicon"),this.base()}})},4487:function(){Craft.LightSwitch=Garnish.Base.extend({settings:null,$outerContainer:null,$innerContainer:null,$input:null,small:!1,on:!1,indeterminate:!1,dragger:null,dragStartMargin:null,init:function(t,e){if(this.$outerContainer=$(t),this.$outerContainer.data("lightswitch")&&(console.warn("Double-instantiating a lightswitch on an element"),this.$outerContainer.data("lightswitch").destroy()),this.$outerContainer.data("lightswitch",this),this.small=this.$outerContainer.hasClass("small"),this.setSettings(e,Craft.LightSwitch.defaults),this.$innerContainer=this.$outerContainer.find(".lightswitch-container:first"),this.$input=this.$outerContainer.find("input:first"),!this.$input.prop("disabled")){this.on=this.$outerContainer.hasClass("on"),this.indeterminate=this.$outerContainer.hasClass("indeterminate"),this.addListener(this.$outerContainer,"mousedown","_onMouseDown"),this.addListener(this.$outerContainer,"keydown","_onKeyDown"),this.dragger=new Garnish.BaseDrag(this.$outerContainer,{axis:Garnish.X_AXIS,ignoreHandleSelector:null,onDragStart:this._onDragStart.bind(this),onDrag:this._onDrag.bind(this),onDragStop:this._onDragStop.bind(this)});var i=this.$outerContainer.parent(".lightswitch-inner-container");i.length&&(this.addListener(i.children('span[data-toggle="off"]'),"click",this.turnOff),this.addListener(i.children('span[data-toggle="on"]'),"click",this.turnOn))}},turnOn:function(t){var e=!this.on;if(this.on=!0,this.indeterminate=!1,this.$outerContainer.addClass("dragging"),Garnish.prefersReducedMotion())this.$innerContainer.css("margin-"+Craft.left,0);else{var i={};i["margin-"+Craft.left]=0,this.$innerContainer.velocity("stop").velocity(i,Craft.LightSwitch.animationDuration,this._onSettle.bind(this))}this.$input.val(this.settings.value),this.$outerContainer.addClass("on"),this.$outerContainer.removeClass("indeterminate"),this.$outerContainer.attr("aria-checked","true"),e&&!0!==t&&this.onChange()},turnOff:function(t){var e=this.on||this.indeterminate;if(this.on=!1,this.indeterminate=!1,this.$outerContainer.addClass("dragging"),Garnish.prefersReducedMotion())this.$innerContainer.css("margin-"+Craft.left,this._getOffMargin());else{var i={};i["margin-"+Craft.left]=this._getOffMargin(),this.$innerContainer.velocity("stop").velocity(i,Craft.LightSwitch.animationDuration,this._onSettle.bind(this))}this.$input.val(""),this.$outerContainer.removeClass("on"),this.$outerContainer.removeClass("indeterminate"),this.$outerContainer.attr("aria-checked","false"),e&&!0!==t&&this.onChange()},turnIndeterminate:function(t){var e=!this.indeterminate;this.on=!1,this.indeterminate=!0,this.$outerContainer.addClass("dragging");var i={};i["margin-"+Craft.left]=this._getOffMargin()/2,this.$innerContainer.velocity("stop").velocity(i,Craft.LightSwitch.animationDuration,this._onSettle.bind(this)),this.$input.val(this.settings.indeterminateValue),this.$outerContainer.removeClass("on"),this.$outerContainer.addClass("indeterminate"),this.$outerContainer.attr("aria-checked","mixed"),e&&!0!==t&&this.onChange()},toggle:function(){this.indeterminate||!this.on?this.turnOn():this.turnOff()},onChange:function(){this.trigger("change"),this.settings.onChange(this.on),this.$outerContainer.trigger("change")},_onMouseDown:function(){this.addListener(Garnish.$doc,"mouseup","_onMouseUp")},_onMouseUp:function(){this.removeListener(Garnish.$doc,"mouseup"),this.dragger.dragging||this.toggle()},_onKeyDown:function(t){switch(t.keyCode){case Garnish.SPACE_KEY:this.toggle(),t.preventDefault();break;case Garnish.RIGHT_KEY:"ltr"===Craft.orientation?this.turnOn():this.turnOff(),t.preventDefault();break;case Garnish.LEFT_KEY:"ltr"===Craft.orientation?this.turnOff():this.turnOn(),t.preventDefault()}},_getMargin:function(){return parseInt(this.$innerContainer.css("margin-"+Craft.left))},_onDragStart:function(){this.$outerContainer.addClass("dragging"),this.dragStartMargin=this._getMargin()},_onDrag:function(){var t;(t="ltr"===Craft.orientation?this.dragStartMargin+this.dragger.mouseDistX:this.dragStartMargin-this.dragger.mouseDistX)<this._getOffMargin()?t=this._getOffMargin():t>0&&(t=0),this.$innerContainer.css("margin-"+Craft.left,t)},_onDragStop:function(){this._getMargin()>this._getOffMargin()/2?this.turnOn():this.turnOff()},_onSettle:function(){this.$outerContainer.removeClass("dragging")},destroy:function(){this.$outerContainer.removeData("lightswitch"),this.base(),this.dragger.destroy()},_getOffMargin:function(){return this.small?-10:-12}},{animationDuration:100,defaults:{value:"1",indeterminateValue:"-",onChange:$.noop}})},6966:function(){Craft.Listbox=Garnish.Base.extend({$container:null,$options:null,$selectedOption:null,selectedOptionIndex:null,init:function(t,e){var i=this;this.$container=$(t),this.setSettings(e,Craft.Listbox.defaults),this.$container.data("listbox")&&(console.warn("Double-instantiating a listbox on an element"),this.$container.data("listbox").destroy()),this.$container.data("listbox",this),this.$options=this.$container.find("button,[role=option]"),this.$selectedOption=this.$options.filter("[aria-pressed=true],[aria-selected=true]").removeAttr("aria-selected").attr("aria-pressed","true"),this.$selectedOption.length?this.selectedOptionIndex=this.$options.index(this.$selectedOption):this.$selectedOption=null,this.addListener(this.$options,"click",(function(t){i.select(i.$options.index($(t.currentTarget))),t.preventDefault()}))},select:function(t){t<0||t>=this.$options.length||t===this.selectedOptionIndex||(this.$selectedOption&&this.$selectedOption.removeClass(this.settings.selectedClass).attr("aria-pressed","false"),this.$selectedOption=this.$options.eq(t).addClass(this.settings.selectedClass).attr("aria-pressed","true"),this.selectedOptionIndex=t,this.settings.onChange(this.$selectedOption,t),this.trigger("change",{$selectedOption:this.$selectedOption,selectedOptionIndex:t}))},disable:function(){this.base(),this.$container.attr("aria-disabled","true")},enable:function(){this.base(),this.$container.removeAttr("aria-disabled")},destroy:function(){this.$container.removeData("listbox"),this.base()}},{defaults:{selectedClass:"active",focusClass:"focus",onChange:$.noop}})},5080:function(){Craft.LivePreview=Garnish.Base.extend({$extraFields:null,$trigger:null,$shade:null,$editorContainer:null,$editor:null,$dragHandle:null,$previewContainer:null,$iframeContainer:null,$iframe:null,$fieldPlaceholder:null,previewUrl:null,token:null,basePostData:null,inPreviewMode:!1,fields:null,lastPostData:null,updateIframeInterval:null,loading:!1,checkAgain:!1,dragger:null,dragStartEditorWidth:null,_slideInOnIframeLoad:!1,_scrollX:null,_scrollY:null,_editorWidth:null,_editorWidthInPx:null,init:function(t){var e=this;this.setSettings(t,Craft.LivePreview.defaults),this.settings.previewUrl?this.previewUrl=this.settings.previewUrl:this.previewUrl=Craft.baseSiteUrl.replace(/\/+$/,"")+"/","https:"===document.location.protocol&&(this.previewUrl=this.previewUrl.replace(/^http:/,"https:")),this.basePostData=$.extend({},this.settings.previewParams),this.$extraFields=$(this.settings.extraFields),this.$trigger=$(this.settings.trigger),this.$fieldPlaceholder=$("<div/>"),this.editorWidth=Craft.getLocalStorage("LivePreview.editorWidth",Craft.LivePreview.defaultEditorWidth),this.addListener(this.$trigger,"activate","toggle"),Craft.cp.on("beforeSaveShortcut",(function(){e.inPreviewMode&&e.moveFieldsBack()})),Craft.Preview.instances.push(this)},get editorWidth(){return this._editorWidth},get editorWidthInPx(){return this._editorWidthInPx},set editorWidth(t){var e;t>=1?(e=t,t/=Garnish.$win.width()):e=Math.round(t*Garnish.$win.width()),e<Craft.LivePreview.minEditorWidthInPx&&(t=(e=Craft.LivePreview.minEditorWidthInPx)/Garnish.$win.width()),this._editorWidth=t,this._editorWidthInPx=e},toggle:function(){this.inPreviewMode?this.exit():this.enter()},enter:function(){var t=this;if(!this.inPreviewMode)if(this.token){if(this.trigger("beforeEnter"),$(document.activeElement).trigger("blur"),!this.$editor){this.$shade=$("<div/>",{class:"modal-shade dark"}).appendTo(Garnish.$bod),this.$previewContainer=$("<div/>",{class:"lp-preview-container"}).appendTo(Garnish.$bod),this.$iframeContainer=$("<div/>",{class:"lp-iframe-container"}).appendTo(this.$previewContainer),this.$editorContainer=$("<div/>",{class:"lp-editor-container"}).appendTo(Garnish.$bod);var e=$("<header/>",{class:"flex"}).appendTo(this.$editorContainer);this.$editor=$("<form/>",{class:"lp-editor"}).appendTo(this.$editorContainer),this.$dragHandle=$("<div/>",{class:"lp-draghandle"}).appendTo(this.$editorContainer);var i=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Close Preview")}).appendTo(e);$("<div/>",{class:"flex-grow"}).appendTo(e);var s=$("<button/>",{type:"button",class:"btn submit",text:Craft.t("app","Save")}).appendTo(e);this.dragger=new Garnish.BaseDrag(this.$dragHandle,{axis:Garnish.X_AXIS,onDragStart:this._onDragStart.bind(this),onDrag:this._onDrag.bind(this),onDragStop:this._onDragStop.bind(this)}),this.addListener(i,"click","exit"),this.addListener(s,"click","save")}this.handleWindowResize(),this.addListener(Garnish.$win,"resize","handleWindowResize"),this.$editorContainer.css(Craft.left,-this.editorWidthInPx+"px"),this.$previewContainer.css(Craft.right,-this.getIframeWidth()),this.fields=[];for(var a=$(this.settings.fields),n=0;n<a.length;n++){var r=$(a[n]),o=this._getClone(r);this.$fieldPlaceholder.insertAfter(r),r.detach(),this.$fieldPlaceholder.replaceWith(o),r.appendTo(this.$editor),this.fields.push({$field:r,$clone:o})}this.updateIframe()?this._slideInOnIframeLoad=!0:this.slideIn(),Craft.ElementThumbLoader.retryAll(),Garnish.uiLayerManager.addLayer(this.$sidebar),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.exit()})),this.inPreviewMode=!0,this.trigger("enter")}else this.createToken()},createToken:function(){var t=this,e={previewAction:this.settings.previewAction};Craft.sendActionRequest("POST","live-preview/create-token",{data:e}).then((function(e){t.token=e.data.token,t.enter()}))},save:function(){Craft.cp.submitPrimaryForm()},handleWindowResize:function(){this.editorWidth=this.editorWidth,this.updateWidths()},slideIn:function(){var t=this;$("html").addClass("noscroll"),this.$shade.velocity("fadeIn"),this.$editorContainer.show().velocity("stop").animateLeft(0,"slow",(function(){t.trigger("slideIn"),Garnish.$win.trigger("resize")})),this.$previewContainer.show().velocity("stop").animateRight(0,"slow",(function(){t.updateIframeInterval=setInterval(t.updateIframe.bind(t),1e3)}))},exit:function(){var t=this;this.inPreviewMode&&(this.trigger("beforeExit"),$("html").removeClass("noscroll"),this.removeListener(Garnish.$win,"resize"),Garnish.uiLayerManager.removeLayer(),this.updateIframeInterval&&clearInterval(this.updateIframeInterval),this.moveFieldsBack(),this.$shade.delay(200).velocity("fadeOut"),this.$editorContainer.velocity("stop").animateLeft(-this.editorWidthInPx,"slow",(function(){for(var e=0;e<t.fields.length;e++)t.fields[e].$newClone.remove();t.$editorContainer.hide(),t.trigger("slideOut")})),this.$previewContainer.velocity("stop").animateRight(-this.getIframeWidth(),"slow",(function(){t.$previewContainer.hide()})),Craft.ElementThumbLoader.retryAll(),this.inPreviewMode=!1,this.trigger("exit"))},moveFieldsBack:function(){for(var t=0;t<this.fields.length;t++){var e=this.fields[t];e.$newClone=this._getClone(e.$field),this.$fieldPlaceholder.insertAfter(e.$field),e.$field.detach(),this.$fieldPlaceholder.replaceWith(e.$newClone),e.$clone.replaceWith(e.$field)}Garnish.$win.trigger("resize")},getIframeWidth:function(){return Garnish.$win.width()-this.editorWidthInPx},updateWidths:function(){this.$editorContainer.css("width",this.editorWidthInPx+"px"),this.$previewContainer.width(this.getIframeWidth())},updateIframe:function(t){if(t&&(this.lastPostData=null),!this.inPreviewMode)return!1;if(this.loading)return this.checkAgain=!0,!1;var e=$.extend(Garnish.getPostData(this.$editor),Garnish.getPostData(this.$extraFields));if(this.lastPostData&&Craft.compare(e,this.lastPostData,!1))return!1;this.lastPostData=e,this.loading=!0;var i=this.$iframe?$(this.$iframe[0].contentWindow.document):null;return this._scrollX=i?i.scrollLeft():0,this._scrollY=i?i.scrollTop():0,$.ajax({url:this.previewUrl+(-1!==this.previewUrl.indexOf("?")?"&":"?")+Craft.tokenParam+"="+this.token,method:"POST",data:$.extend({},e,this.basePostData),headers:{"X-Craft-Token":this.token},xhrFields:{withCredentials:!0},crossDomain:!0,success:this.handleSuccess.bind(this),error:this.handleError.bind(this)}),!0},forceUpdateIframe:function(){return this.updateIframe(!0)},handleSuccess:function(t){var e=this,i=t+'<script type="text/javascript">window.scrollTo('+this._scrollX+", "+this._scrollY+");<\/script>",s=$('<iframe class="lp-preview" frameborder="0"/>');this.$iframe?s.insertBefore(this.$iframe):s.appendTo(this.$iframeContainer),this.addListener(s,"load",(function(){this.$iframe&&this.$iframe.remove(),this.$iframe=s,this._slideInOnIframeLoad&&(this.slideIn(),this._slideInOnIframeLoad=!1),this.removeListener(s,"load")})),Garnish.requestAnimationFrame((function(){s[0].contentWindow.document.open(),s[0].contentWindow.document.write(i),s[0].contentWindow.document.close(),e.onResponse()}))},handleError:function(){this.onResponse()},onResponse:function(){this.loading=!1,this.checkAgain&&(this.checkAgain=!1,this.updateIframe())},_getClone:function(t){var e=t.clone();return Garnish.copyInputValues(t,e),e.attr("id",""),e.find("[id]").attr("id",""),e},_onDragStart:function(){this.dragStartEditorWidth=this.editorWidthInPx,this.$previewContainer.addClass("dragging")},_onDrag:function(){"ltr"===Craft.orientation?this.editorWidth=this.dragStartEditorWidth+this.dragger.mouseDistX:this.editorWidth=this.dragStartEditorWidth-this.dragger.mouseDistX,this.updateWidths()},_onDragStop:function(){this.$previewContainer.removeClass("dragging"),Craft.setLocalStorage("LivePreview.editorWidth",this.editorWidth)},destroy:function(){var t=this;Craft.Preview.instances=Craft.Preview.instances.filter((function(e){return e!==t})),this.base()}},{defaultEditorWidth:.33,minEditorWidthInPx:320,instances:[],defaults:{trigger:".livepreviewbtn",fields:null,extraFields:null,previewUrl:null,previewAction:null,previewParams:{}}}),Craft.LivePreview.init=function(t){Craft.livePreview=new Craft.LivePreview(t)}},7439:function(){Craft.PasswordInput=Garnish.Base.extend({$passwordWrapper:null,$passwordInput:null,$textInput:null,$currentInput:null,$showPasswordToggle:null,showingPassword:null,init:function(t,e){this.$passwordInput=$(t),this.$passwordWrapper=this.$passwordInput.parent(".passwordwrapper"),this.settings=$.extend({},Craft.PasswordInput.defaults,e),this.$passwordInput.data("passwordInput")&&(console.warn("Double-instantiating a password input on an element"),this.$passwordInput.data("passwordInput").destroy()),this.$passwordInput.data("passwordInput",this),this.$showPasswordToggle=$('<button type="button" class="invisible" />'),this.$showPasswordToggle.addClass("password-toggle"),this.$showPasswordToggle.insertAfter(this.$passwordInput),this.initInputFocusEvents(this.$passwordInput),this.addListener(this.$showPasswordToggle,"click","onClick"),this.hidePassword(),this.addListener(this.$passwordWrapper.closest("form"),"submit","hidePassword")},setCurrentInput:function(t){this.$currentInput&&(t.insertAfter(this.$currentInput),this.$currentInput.detach(),t.trigger("focus"),t.val(this.$currentInput.val())),this.$currentInput=t,this.addListener(this.$currentInput,"keypress,keyup,change,blur","onInputChange")},updateToggleLabel:function(t){this.$showPasswordToggle.text(t)},initInputFocusEvents:function(t){this.addListener(t,"focus",(function(){this.$passwordWrapper.addClass("focus")})),this.addListener(t,"blur",(function(){this.$passwordWrapper.removeClass("focus")}))},showPassword:function(){this.showingPassword||(this.$textInput||(this.$textInput=this.$passwordInput.clone(!0),this.$textInput.attr({type:"text",autocapitalize:"off"}),this.initInputFocusEvents(this.$textInput)),this.setCurrentInput(this.$textInput),this.updateToggleLabel(Craft.t("app","Hide")),this.showingPassword=!0)},hidePassword:function(){!1!==this.showingPassword&&(this.setCurrentInput(this.$passwordInput),this.updateToggleLabel(Craft.t("app","Show")),this.showingPassword=!1)},togglePassword:function(){this.showingPassword?this.hidePassword():this.showPassword(),this.settings.onToggleInput(this.$currentInput)},onInputChange:function(){this.$currentInput.val()?this.$showPasswordToggle.removeClass("invisible"):this.$showPasswordToggle.addClass("invisible")},onClick:function(t){if(this.$currentInput[0].setSelectionRange){var e=this.$currentInput[0].selectionStart,i=this.$currentInput[0].selectionEnd;this.togglePassword(),this.$currentInput[0].setSelectionRange(e,i)}else this.togglePassword()},destroy:function(){this.$passwordInput.removeData("passwordInput"),this.base()}},{defaults:{onToggleInput:$.noop}})},5328:function(){function t(t,i){var s="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!s){if(Array.isArray(t)||(s=function(t,i){if(t){if("string"==typeof t)return e(t,i);var s=Object.prototype.toString.call(t).slice(8,-1);return"Object"===s&&t.constructor&&(s=t.constructor.name),"Map"===s||"Set"===s?Array.from(t):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?e(t,i):void 0}}(t))||i&&t&&"number"==typeof t.length){s&&(t=s);var a=0,n=function(){};return{s:n,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){s=s.call(t)},n:function(){var t=s.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==s.return||s.return()}finally{if(l)throw r}}}}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function i(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);e&&(s=s.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,s)}return i}function s(t){for(var e=1;e<arguments.length;e++){var s=null!=arguments[e]?arguments[e]:{};e%2?i(Object(s),!0).forEach((function(e){a(t,e,s[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(s)):i(Object(s)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(s,e))}))}return t}function a(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}Craft.Preview=Garnish.Base.extend({elementEditor:null,$shade:null,$editorContainer:null,$editor:null,$spinner:null,$statusIcon:null,$dragHandle:null,$previewWrapper:null,$previewContainer:null,$previewSkipLink:null,$bumperLink:null,$notifier:null,$iframeContainer:null,$previewHeader:null,$targetBtn:null,$targetMenu:null,$deviceTypeContainer:null,$orientationBtn:null,$refreshBtn:null,$deviceMask:null,$devicePreviewContainer:null,$iframe:null,iframeLoaded:!1,$tempInput:null,$fieldPlaceholder:null,isActive:!1,isVisible:!1,activeTarget:0,animationDuration:"slow",currentDeviceType:"desktop",deviceOrientation:null,deviceWidth:"",deviceHeight:"",deviceMaskDimensions:{phone:{width:375,height:753},tablet:{width:768,height:1110}},draftId:null,url:null,fields:null,iframeHeight:null,scrollTop:null,dragger:null,dragStartEditorWidth:null,_updateIframeProxy:null,_editorWidth:null,_editorWidthInPx:null,init:function(t){this.elementEditor=t,this._updateIframeProxy=this.updateIframe.bind(this),this.$tempInput=$("<input/>",{type:"hidden",name:"__PREVIEW_FIELDS__",value:"1"}),this.$fieldPlaceholder=$("<div/>"),this.editorWidth=Craft.getLocalStorage("LivePreview.editorWidth",Craft.Preview.defaultEditorWidth),Craft.Preview.instances.push(this)},get editorWidth(){return this._editorWidth},get editorWidthInPx(){return this._editorWidthInPx},set editorWidth(t){var e;t>=1?(e=t,t/=Garnish.$win.width()):e=Math.round(t*Garnish.$win.width()),e<Craft.Preview.minEditorWidthInPx&&(t=(e=Craft.Preview.minEditorWidthInPx)/Garnish.$win.width()),this._editorWidth=t,this._editorWidthInPx=e},open:function(){var t=this;if(!this.isActive){if(this.isActive=!0,this.trigger("beforeOpen"),$(document.activeElement).trigger("blur"),!this.$editor){var e=Craft.t("app","Skip to {title}",{title:Craft.t("app","Top of preview")});this.$shade=$("<div/>",{class:"modal-shade dark"}).appendTo(Garnish.$bod),this.$previewWrapper=$("<div/>",{role:"dialog","aria-modal":"true","aria-labelledby":"lp-preview-heading"}).appendTo(Garnish.$bod),this.$modalLabel=$("<h2/>",{id:"lp-preview-heading",class:"visually-hidden",html:Craft.t("app","Preview")}).appendTo(this.$previewWrapper),this.$editorContainer=$("<div/>",{class:"lp-editor-container"}).appendTo(this.$previewWrapper),this.$previewContainer=$("<div/>",{class:"lp-preview-container",id:"lp-preview-container"}).appendTo(this.$previewWrapper),this.$notifier=$("<span/>",{class:"visually-hidden","aria-live":"assertive"}).appendTo(this.$previewContainer);var i=$("<header/>",{class:"flex"}).appendTo(this.$editorContainer);this.$editor=$("<form/>",{class:"lp-editor"}).appendTo(this.$editorContainer),this.$dragHandle=$("<div/>",{class:"lp-draghandle"}).appendTo(this.$editorContainer);var s=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Close Preview")}).appendTo(i);if($("<div/>",{class:"flex-grow"}).appendTo(i),this.$spinner=$("<div/>",{class:"spinner hidden",title:Craft.t("app","Saving")}).appendTo(i),this.$statusIcon=$("<div/>",{class:"invisible"}).appendTo(i),this.$statusMessage=$("<span/>",{class:"visually-hidden","aria-live":"polite"}).appendTo(i),this.$previewSkipLink=$("<a/>",{class:"skip-link btn",href:"#lp-preview-container",html:e}).appendTo(i),Craft.Pro){if(this.$previewHeader=$("<header/>",{class:"lp-preview-header"}).appendTo(this.$previewContainer),this.elementEditor.settings.previewTargets.length>1){this.$targetBtn=$("<button/>",{type:"button",class:"btn menubtn",text:this.elementEditor.settings.previewTargets[0].label}).appendTo(this.$previewHeader),this.$targetMenu=$("<div/>",{class:"menu lp-target-menu"}).insertAfter(this.$targetBtn);for(var a,n=$("<ul/>",{class:"padded"}).appendTo(this.$targetMenu),r=0;r<this.elementEditor.settings.previewTargets.length;r++)a=$("<li/>").appendTo(n),$("<a/>",{data:{target:r},text:this.elementEditor.settings.previewTargets[r].label,class:0===r?"sel":null}).appendTo(a);new Garnish.MenuBtn(this.$targetBtn,{onOptionSelect:function(e){t.switchTarget($(e).data("target"))}}),$('<div class="flex-grow"/>').appendTo(this.$previewHeader)}this._buildDeviceTypeFieldset(),$('<div class="flex-grow"/>').appendTo(this.$previewHeader);var o=$('<div class="buttons"/>').appendTo(this.$previewHeader);this.$orientationBtn=$("<button/>",{type:"button",class:"btn disabled","data-icon":"rotate","aria-disabled":"true",text:Craft.t("app","Rotate"),"aria-label":Craft.t("app","Rotate")}).appendTo(o),this.addListener(this.$orientationBtn,"click","switchOrientation"),this.$refreshBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Refresh"),"data-icon":"refresh"}).appendTo(o),this.addListener(this.$refreshBtn,"click",(function(){t.updateIframe(!1,!0)})),this.deviceOrientation=Craft.getLocalStorage("LivePreview.orientation")}this.$iframeContainer=$("<div/>",{class:"lp-iframe-container"}).appendTo(this.$previewContainer),this.$devicePreviewContainer=$("<div/>",{class:"lp-device-preview-container"}).appendTo(this.$iframeContainer),this.$deviceMask=$("<div/>",{class:"lp-device-mask"}).appendTo(this.$iframeContainer),this.$bumperLink=$("<a/>",{class:"skip-link btn lp-preview-container__bumper-link",html:e,href:"#lp-preview-container"}),this.$bumperLink.appendTo(this.$previewContainer),this.dragger=new Garnish.BaseDrag(this.$dragHandle,{axis:Garnish.X_AXIS,onDragStart:this._onDragStart.bind(this),onDrag:this._onDrag.bind(this),onDragStop:this._onDragStop.bind(this)}),this.addListener(s,"click","close"),this.addListener(this.$statusIcon,"click",(function(){t.elementEditor.showStatusHud(t.$statusIcon)}))}this.handleWindowResize(),this.addListener(Garnish.$win,"resize","handleWindowResize"),this.$editorContainer.css(Craft.left,-this.editorWidthInPx+"px"),this.$previewContainer.css(Craft.right,-this.getIframeWidth()),this.fields=[];var l=$("#content .field").not($("#content .field .field"));if(l.length){this.$tempInput.insertBefore(l.get(0));for(var h=0;h<l.length;h++){var d=$(l[h]),c=this._getClone(d);this.$fieldPlaceholder.insertAfter(d),d.detach(),this.$fieldPlaceholder.replaceWith(c),d.appendTo(this.$editor),this.fields.push({$field:d,$clone:c})}}this.updateIframe(),this.elementEditor.on("update",this._updateIframeProxy),Craft.ElementThumbLoader.retryAll(),this.trigger("open")}},_getDeviceTypeTranslation:function(t){var e;switch(t){case"phone":e=Craft.t("app","Mobile");break;case"tablet":e=Craft.t("app","Tablet");break;default:e=Craft.t("app","Desktop")}return e},_getDeviceOrientationTranslation:function(t){return"portrait"===t?Craft.t("app","Portrait"):Craft.t("app","Landscape")},_buildDeviceTypeFieldset:function(){var t=this;this.$deviceTypeContainer=$("<section/>",{class:"btngroup lp-device-type","aria-label":Craft.t("app","Device type")}).appendTo(this.$previewHeader),$("<button/>",{type:"button",class:"btn lp-device-type-btn--desktop active",title:Craft.t("app","Desktop"),"aria-label":Craft.t("app","Desktop"),"aria-pressed":"true",data:{width:"",height:"",deviceType:"desktop"}}).appendTo(this.$deviceTypeContainer),$("<button/>",{type:"button",class:"btn lp-device-type-btn--tablet",title:Craft.t("app","Tablet"),"aria-label":Craft.t("app","Tablet"),"aria-pressed":"false",data:{width:768,height:1024,deviceType:"tablet"}}).appendTo(this.$deviceTypeContainer),$("<button/>",{type:"button",class:"btn lp-device-type-btn--phone",title:Craft.t("app","Mobile"),"aria-label":Craft.t("app","Mobile"),"aria-pressed":"false",data:{width:375,height:667,deviceType:"phone"}}).appendTo(this.$deviceTypeContainer),this.deviceBtnGroup=new Craft.Listbox(this.$deviceTypeContainer,{onChange:function(e){t.switchDeviceType(e)}})},_activeTarget:function(){return this.elementEditor.settings.previewTargets[this.activeTarget]},_autoRefresh:function(){var t=this._activeTarget();return void 0===n(t.refresh)||!!t.refresh},switchTarget:function(t){this.activeTarget=t,this.$targetBtn.text(this.elementEditor.settings.previewTargets[t].label),this.$targetMenu.find("a.sel").removeClass("sel"),this.$targetMenu.find("a").eq(t).addClass("sel"),this.updateIframe(!0),this.trigger("switchTarget",{previewTarget:this.elementEditor.settings.previewTargets[t]})},handleWindowResize:function(){this.editorWidth=this.editorWidth,this.updateWidths()},slideIn:function(){var t=this;this.isActive&&!this.isVisible&&($("html").addClass("noscroll"),this.$shade.velocity("fadeIn"),this.$editorContainer.show().velocity("stop").animateLeft(0,Garnish.getUserPreferredAnimationDuration(this.animationDuration),(function(){t.trigger("slideIn"),Garnish.$win.trigger("resize")})),this.$previewContainer.show().velocity("stop").animateRight(0,Garnish.getUserPreferredAnimationDuration(this.animationDuration)),this.isVisible=!0,Garnish.uiLayerManager.addLayer(this.$previewWrapper),Garnish.hideModalBackgroundLayers(),Craft.setFocusWithin(this.$previewWrapper),Craft.trapFocusWithin(this.$previewWrapper),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.close()})))},close:function(){var t=this;this.isActive&&this.isVisible&&(this.trigger("beforeClose"),$("html").removeClass("noscroll"),this.removeListener(Garnish.$win,"resize"),Garnish.uiLayerManager.removeLayer(),Garnish.resetModalBackgroundLayerVisibility(),this.$tempInput.detach(),this.moveFieldsBack(),Garnish.prefersReducedMotion()?this.$shade.velocity("fadeOut"):this.$shade.delay(200).velocity("fadeOut"),this.$editorContainer.velocity("stop").animateLeft(-this.editorWidthInPx,Garnish.getUserPreferredAnimationDuration(this.animationDuration),(function(){for(var e=0;e<t.fields.length;e++)t.fields[e].$newClone.remove();t.$editorContainer.hide(),t.trigger("slideOut")})),this.$previewContainer.velocity("stop").animateRight(-this.getIframeWidth(),Garnish.getUserPreferredAnimationDuration(this.animationDuration),(function(){t.$iframeContainer.removeClass("lp-iframe-container--rotating"),t.$previewContainer.hide()})),this.elementEditor.off("update",this._updateIframeProxy),Craft.ElementThumbLoader.retryAll(),this.elementEditor.$previewBtn&&this.elementEditor.$previewBtn.focus(),this.isActive=!1,this.isVisible=!1,this.trigger("close"))},moveFieldsBack:function(){for(var t=0;t<this.fields.length;t++){var e=this.fields[t];e.$newClone=this._getClone(e.$field),this.$fieldPlaceholder.insertAfter(e.$field),e.$field.detach(),this.$fieldPlaceholder.replaceWith(e.$newClone),e.$clone.replaceWith(e.$field)}Garnish.$win.trigger("resize"),Garnish.$doc.trigger("scroll")},getIframeWidth:function(){return Garnish.$win.width()-this.editorWidthInPx},updateWidths:function(){this.$editorContainer.css("width",this.editorWidthInPx+"px"),this.$previewContainer.width(this.getIframeWidth()),this._devicePreviewIsActive()&&this.updateDevicePreview()},_useIframeResizer:function(){return!1!==Craft.previewIframeResizerOptions},updateIframe:function(t,e){var i=this;if(!this.isActive)return!1;t=!0===t,this.draftId===(this.draftId=this.elementEditor.settings.draftId)&&this.$iframe||(e=!0);var s=this._activeTarget();void 0===e&&(e=t||this._autoRefresh()),this.trigger("beforeUpdateIframe",{previewTarget:s,resetScroll:t,refresh:e}),e?this.elementEditor.getTokenizedPreviewUrl(s.url,"x-craft-live-preview").then((function(e){var s;t?i.scrollTop=null:i.iframeLoaded&&i.$iframe&&(i._useIframeResizer()?(i.iframeHeight=i.$iframe.height(),i.scrollTop=i.$iframeContainer.scrollTop()):(s=Craft.isSameHost(e))&&i.$iframe[0].contentWindow&&(i.scrollTop=$(i.$iframe[0].contentWindow.document).scrollTop())),i.iframeLoaded=!1;var a=$("<iframe/>",{class:"lp-preview",frameborder:0,src:e,title:Craft.t("app","Preview")});i.$iframe?i.$iframe.replaceWith(a):a.appendTo(i.$devicePreviewContainer),i._useIframeResizer()?(t||null===i.iframeHeight||(a.height(i.iframeHeight),i.$iframeContainer.scrollTop(i.scrollTop)),iFrameResize($.extend({checkOrigin:!1,scrolling:!0,onInit:function(t){i.iframeLoaded=!0,i.iframeHeight=null,i.scrollTop=null,t.scrolling="no"}},Craft.previewIframeResizerOptions||{}),a[0])):a.on("load",(function(){i.iframeLoaded=!0,!t&&s&&null!==i.scrollTop&&$(a[0].contentWindow.document).scrollTop(i.scrollTop)})),i.url=e,i.$iframe=a,i._devicePreviewIsActive()&&i.updateDevicePreview(),i.trigger("afterUpdateIframe",{previewTarget:i.elementEditor.settings.previewTargets[i.activeTarget],$iframe:i.$iframe}),i.slideIn()})):this.slideIn()},_devicePreviewIsActive:function(){return"desktop"!==this.currentDeviceType},_updateNotifier:function(){var t=this;this.$notifier.html="";var e="desktop"===this.currentDeviceType?"Previewing {type} device":"Previewing {type} device in {orientation}",i={type:this._getDeviceTypeTranslation(this.currentDeviceType)};"desktop"!==this.currentDeviceType&&(i=s(s({},i),{orientation:this._getDeviceOrientationTranslation(this.deviceOrientation)}));var a=Craft.t("app",e,i);setTimeout((function(){t.$notifier.text(a)}),200)},switchDeviceType:function(t){this.$iframeContainer.removeClass("lp-iframe-container--rotating");var e=t.data("deviceType");if(e===this.currentDeviceType)return!1;this.currentDeviceType=e,this.deviceWidth=t.data("width"),this.deviceHeight=t.data("height"),"desktop"===this.currentDeviceType?(this.$orientationBtn.addClass("disabled").attr("aria-disabled","true"),this.$iframeContainer.removeClass("lp-iframe-container--has-device-preview")):(this.$orientationBtn.removeClass("disabled").removeAttr("aria-disabled"),this.$iframeContainer.addClass("lp-iframe-container--has-device-preview")),"tablet"===this.currentDeviceType?this.$iframeContainer.addClass("lp-iframe-container--tablet"):this.$iframeContainer.removeClass("lp-iframe-container--tablet"),this._updateNotifier(),"desktop"!==this.currentDeviceType&&this.updateDevicePreview()},switchOrientation:function(){var t=this;if(!this._devicePreviewIsActive())return!1;this.deviceOrientation&&"portrait"!==this.deviceOrientation?this.deviceOrientation="portrait":this.deviceOrientation="landscape",Craft.setLocalStorage("LivePreview.orientation",this.deviceOrientation),this.$iframeContainer.addClass("lp-iframe-container--rotating"),this.updateDevicePreview(),this._updateNotifier(),setTimeout((function(){t.$iframeContainer.removeClass("lp-iframe-container--rotating")}),300)},updateDevicePreview:function(){var t=1,e=1,i=1,s=this.$previewContainer.height()-50-48,a=this.$previewContainer.width()-48,n=this.deviceMaskDimensions[this.currentDeviceType].height,r=this.deviceMaskDimensions[this.currentDeviceType].width;"landscape"===this.deviceOrientation?(a<n&&(t=a/n),s<r&&(e=s/r)):(s<n&&(t=s/n),a<r&&(e=a/r)),i=t,e<t&&(i=e);var o=-100/i/2,l="landscape"===this.deviceOrientation?"-90deg":"0deg";this.$deviceMask.css({width:this.deviceMaskDimensions[this.currentDeviceType].width+"px",height:this.deviceMaskDimensions[this.currentDeviceType].height+"px",transform:"scale("+i+") translate("+o+"%, "+o+"%) rotate("+l+")"}),"landscape"===this.deviceOrientation?this.$devicePreviewContainer.css({width:this.deviceHeight+"px",height:this.deviceWidth+"px",transform:"scale("+i+") translate("+o+"%, "+o+"%)",marginTop:0,marginLeft:"-"+12*i+"px"}):this.$devicePreviewContainer.css({width:this.deviceWidth+"px",height:this.deviceHeight+"px",transform:"scale("+i+") translate("+o+"%, "+o+"%)",marginTop:"-"+12*i+"px",marginLeft:0})},_getClone:function(t){var e=t.clone();return Garnish.copyInputValues(t,e),e.attr("id",""),e.find("[id]").attr("id",""),e.find("[name]").prop("disabled",!0),e},_onDragStart:function(){this.dragStartEditorWidth=this.editorWidthInPx,this.$previewContainer.addClass("dragging")},_onDrag:function(){"ltr"===Craft.orientation?this.editorWidth=this.dragStartEditorWidth+this.dragger.mouseDistX:this.editorWidth=this.dragStartEditorWidth-this.dragger.mouseDistX,this.updateWidths()},_onDragStop:function(){this.$previewContainer.removeClass("dragging"),Craft.setLocalStorage("LivePreview.editorWidth",this.editorWidth)},destroy:function(){var t=this;Craft.Preview.instances=Craft.Preview.instances.filter((function(e){return e!==t})),this.base()}},{defaultEditorWidth:.33,minEditorWidthInPx:320,instances:[],refresh:function(){var e,i=t(Craft.Preview.instances);try{for(i.s();!(e=i.n()).done;)preview=e.value,preview.updateIframe()}catch(t){i.e(t)}finally{i.f()}var s,a=t(Craft.LivePreview.instances);try{for(a.s();!(s=a.n()).done;)preview=s.value,preview.forceUpdateIframe()}catch(t){a.e(t)}finally{a.f()}}})},6419:function(){Craft.PreviewFileModal=Garnish.Modal.extend({assetId:null,$spinner:null,$triggerElement:null,$bumperButtonStart:null,$bumperButtonEnd:null,elementSelect:null,type:null,loaded:null,requestId:0,init:function(t,e,i){var s=this;if(i=$.extend(this.defaultSettings,i),this.$triggerElement=Garnish.getFocusedElement(),i.onHide=this._onHide.bind(this),Craft.PreviewFileModal.openInstance){var a=Craft.PreviewFileModal.openInstance;return a.assetId!==t&&(a.loadAsset(t,i.startingWidth,i.startingHeight),a.elementSelect=e),this.destroy()}Craft.PreviewFileModal.openInstance=this,this.elementSelect=e,this.$container=$('<div class="modal previewmodal loading"/>').appendTo(Garnish.$bod),this.base(this.$container,$.extend({resizable:!0},i)),this.$container&&(this.$container.velocity("stop"),this.$container.show().css("opacity",1),this.$shade.velocity("stop"),this.$shade.show().css("opacity",1),Garnish.setFocusWithin(this.$container)),this.$bumperButtonStart=Craft.ui.createButton({html:Craft.t("app","Close Preview"),class:"skip-link"}),this.addListener(this.$bumperButtonStart,"click",(function(){s.hide()})),this.$bumperButtonEnd=this.$bumperButtonStart.clone(!0),this.loadAsset(t,i.startingWidth,i.startingHeight)},_onHide:function(){return Craft.PreviewFileModal.openInstance=null,this.elementSelect?this.elementSelect.focusItem(this.elementSelect.$focusedItem):this.$triggerElement&&this.$triggerElement.length&&this.$triggerElement.trigger("focus"),this.$shade.remove(),this.destroy()},_addBumperButtons:function(){this.$container.prepend(this.$bumperButtonStart).append(this.$bumperButtonEnd)},_addModalName:function(){var t="preview-heading";this.$container.prepend($("h1").attr({class:"visually-hidden",id:t}).text(Craft.t("app","Preview file"))).attr("aria-labelledby",t)},selfDestruct:function(){var t=Craft.PreviewFileModal.openInstance;return t.hide(),t.$shade.remove(),t.destroy(),Craft.PreviewFileModal.openInstance=null,Craft.focalPoint.destruct(),Craft.focalPoint=null,!0},loadAsset:function(t,e,i){var s=this;this.assetId=t,this.$container.empty(),this.loaded=!1,this.desiredHeight=null,this.desiredWidth=null;var a=.66*Garnish.$win.height(),n=Math.min(a/3*4,Garnish.$win.width()-2*this.settings.minGutter);if(a=n/4*3,e&&i){var r=e/i;n=Math.min(e,Garnish.$win.width()-2*this.settings.minGutter),(n=(a=Math.min(n/r,Garnish.$win.height()-2*this.settings.minGutter))*r)>Math.min(e,Garnish.$win.width()-2*this.settings.minGutter)&&(a=(n=Math.min(e,Garnish.$win.width()-2*this.settings.minGutter))/r)}this._resizeContainer(n,a),this.$spinner=$('<div class="spinner centeralign"></div>').appendTo(this.$container);var o=this.$container.height()/2-this.$spinner.height()/2+"px",l=this.$container.width()/2-this.$spinner.width()/2+"px";this.$spinner.css({left:l,top:o,position:"absolute"}),this.requestId++;var h={assetId:t,requestId:this.requestId},d=function(){s.$container.removeClass("loading"),s.$spinner.remove(),s.loaded=!0};Craft.sendActionRequest("POST","assets/preview-file",{data:h}).then((function(t){if(d(),t.data.requestId==s.requestId){if(!t.data.previewHtml)return s.$container.addClass("zilch"),s.$container.append($("<p/>",{text:Craft.t("app","No preview available.")})),void s._addBumperButtons();s.$container.removeClass("zilch"),s.$container.attr("data-asset-id",s.assetId),s.$container.append(t.data.previewHtml),s._addBumperButtons(),s._addModalName(),Craft.appendHeadHtml(t.data.headHtml),Craft.appendBodyHtml(t.data.bodyHtml)}})).catch((function(t){var e=t.response;d(),alert(e.data.message),s.hide()}))},_resizeContainer:function(t,e){this.$container.css({width:t,"min-width":t,"max-width":t,height:e,"min-height":e,"max-height":e,top:(Garnish.$win.height()-e)/2,left:(Garnish.$win.width()-t)/2})}},{defaultSettings:{startingWidth:null,startingHeight:null}})},872:function(){Craft.ProgressBar=Garnish.Base.extend({$progressBar:null,$innerProgressBar:null,$progressBarStatus:null,_itemCount:0,_processedItemCount:0,_displaySteps:!1,init:function(t,e){e&&(this._displaySteps=!0),this.$progressBar=$('<div class="progressbar pending hidden"/>').appendTo(t),this.$innerProgressBar=$('<div class="progressbar-inner"/>').appendTo(this.$progressBar),this.$progressBarStatus=$('<div class="progressbar-status hidden" />').insertAfter(this.$progressBar),this.resetProgressBar()},resetProgressBar:function(){this.setProgressPercentage(100),this.$progressBar.addClass("pending"),this.setItemCount(1),this.setProcessedItemCount(0),this.$progressBarStatus.html(""),this._displaySteps&&this.$progressBar.addClass("has-status")},hideProgressBar:function(){var t=this;this.$progressBar.fadeTo("fast",.01,(function(){t.$progressBar.addClass("hidden").fadeTo(1,1,$.noop)})),this.$progressBarStatus.fadeTo("fast",.01,(function(){t.$progressBarStatus.addClass("hidden").fadeTo(1,1,$.noop)}))},showProgressBar:function(){this.$progressBar.removeClass("hidden"),this.$progressBarStatus.removeClass("hidden")},setItemCount:function(t){this._itemCount=t},incrementItemCount:function(t){this._itemCount+=t},setProcessedItemCount:function(t){this._processedItemCount=t},incrementProcessedItemCount:function(t){this._processedItemCount+=t},updateProgressBar:function(){this._itemCount=Math.max(this._itemCount,1);var t=Math.min(100,Math.round(100*this._processedItemCount/this._itemCount));this.setProgressPercentage(t),this._displaySteps&&this.$progressBarStatus.html(this._processedItemCount+" / "+this._itemCount)},setProgressPercentage:function(t,e){0===t?this.$progressBar.addClass("pending"):(this.$progressBar.removeClass("pending"),e?this.$innerProgressBar.velocity("stop").velocity({width:t+"%"},"fast"):this.$innerProgressBar.velocity("stop").width(t+"%"))}})},1396:function(){Craft.PromptHandler=Garnish.Base.extend({modal:null,$modalContainerDiv:null,$prompt:null,$promptApplyToRemainingContainer:null,$promptApplyToRemainingCheckbox:null,$promptApplyToRemainingLabel:null,$pomptChoices:null,_prompts:[],_promptBatchCallback:$.noop,_promptBatchReturnData:[],_promptBatchNum:0,resetPrompts:function(){this._prompts=[],this._promptBatchCallback=$.noop,this._promptBatchReturnData=[],this._promptBatchNum=0},addPrompt:function(t){this._prompts.push(t)},getPromptCount:function(){return this._prompts.length},showBatchPrompts:function(t){this._promptBatchCallback=t,this._promptBatchReturnData=[],this._promptBatchNum=0,this._showNextPromptInBatch()},_showNextPromptInBatch:function(){var t=this._prompts[this._promptBatchNum].prompt,e=this._prompts.length-(this._promptBatchNum+1);this._showPrompt(t.message,t.choices,this._handleBatchPromptSelection.bind(this),e)},_handleBatchPromptSelection:function(t,e){var i=this._prompts[this._promptBatchNum],s=this._prompts.length-(this._promptBatchNum+1),a=$.extend(i,{choice:t});this._promptBatchReturnData.push(a),s?(this._promptBatchNum++,e?this._handleBatchPromptSelection(t,!0):this._showNextPromptInBatch()):"function"==typeof this._promptBatchCallback&&this._promptBatchCallback(this._promptBatchReturnData)},_showPrompt:function(t,e,i,s){this._promptCallback=i,null===this.modal&&(this.modal=new Garnish.Modal({closeOtherModals:!1})),null===this.$modalContainerDiv&&(this.$modalContainerDiv=$('<div class="modal fitted prompt-modal"></div>').addClass().appendTo(Garnish.$bod)),this.$prompt=$('<div class="body"></div>').appendTo(this.$modalContainerDiv.empty()),this.$promptMessage=$('<p class="prompt-msg"/>').appendTo(this.$prompt),this.$promptChoices=$('<div class="options"></div>').appendTo(this.$prompt),this.$promptApplyToRemainingContainer=$('<label class="assets-applytoremaining"/>').appendTo(this.$prompt).hide(),this.$promptApplyToRemainingCheckbox=$('<input type="checkbox"/>').appendTo(this.$promptApplyToRemainingContainer),this.$promptApplyToRemainingLabel=$("<span/>").appendTo(this.$promptApplyToRemainingContainer),this.$promptButtons=$('<div class="buttons right"/>').appendTo(this.$prompt),this.modal.setContainer(this.$modalContainerDiv),this.$promptMessage.html(t);for(var a=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(this.$promptButtons),n=$("<button/>",{type:"submit",class:"btn submit disabled",text:Craft.t("app","OK")}).appendTo(this.$promptButtons),r=0;r<e.length;r++){var o=$('<div><label><input type="radio" name="promptAction" value="'+e[r].value+'"/> '+e[r].title+"</label></div>").appendTo(this.$promptChoices).find("input");this.addListener(o,"click",(function(){n.removeClass("disabled")}))}this.addListener(n,"activate",(function(t){var e=$(t.currentTarget).parents(".modal").find("input[name=promptAction]:checked").val(),i=this.$promptApplyToRemainingCheckbox.prop("checked");this._selectPromptChoice(e,i)})),this.addListener(a,"activate",(function(){var t=this.$promptApplyToRemainingCheckbox.prop("checked");this._selectPromptChoice("cancel",t)})),s&&(this.$promptApplyToRemainingContainer.show(),this.$promptApplyToRemainingLabel.html(" "+Craft.t("app","Apply this to the {number} remaining conflicts?",{number:s}))),this.modal.show(),this.modal.removeListener(Garnish.Modal.$shade,"click"),this.addListener(Garnish.Modal.$shade,"click","_cancelPrompt")},_selectPromptChoice:function(t,e){var i=this;this.$prompt.fadeOut("fast",(function(){i.modal.hide(),i._promptCallback(t,e)}))},_cancelPrompt:function(){this._selectPromptChoice("cancel",!0)}})},8960:function(){Craft.Queue=Garnish.Base.extend({running:!1,paused:!1,pausedForVisibility:!1,jobs:null,get length(){return this.jobs.length},get isPaused(){return this.paused||this.pausedForVisibility},init:function(){var t=this;this.jobs=[],Garnish.$doc.on("visibilitychange",(function(){t.pausedForVisibility&&Craft.isVisible()&&(t.pausedForVisibility=!1,t._resume())}))},push:function(t){return this._add(t,"push")},unshift:function(t){return this._add(t,"unshift")},pause:function(){this.paused||(this.paused=!0,this.pausedForVisibility||this.trigger("pause"))},resume:function(){this.paused&&(this.paused=!1,this._resume())},_add:function(t,e){var i=this;return new Promise((function(s,a){i.jobs[e]((function(){return new Promise((function(e,i){t().then((function(t){s(t),e()})).catch((function(t){a(t),i()}))}))})),i.running||(i.trigger("beforeRun"),i.running=!0,i._exec())}))},clear:function(){this.jobs.length=0},_exec:function(){var t=this;if(!this.jobs.length)return this.running=!1,void this.trigger("afterRun");this.pausedForVisibility||Craft.isVisible()||(this.pausedForVisibility=!0,this.paused||this.trigger("pause")),this.paused||this.pausedForVisibility||(this.trigger("beforeExec"),this.jobs.shift()().finally((function(){t.trigger("afterExec"),t._exec()})))},_resume:function(){this.isPaused||(this.trigger("resume"),this._exec())}}),Craft.queue=new Craft.Queue},4070:function(){!function(t){Craft.SlidePicker=Garnish.Base.extend({min:null,max:null,totalSteps:null,value:null,label:null,describedBy:null,$container:null,$buttons:null,init:function(e,i){var s=this;this.setSettings(i,Craft.SlidePicker.defaults),this.$container=t("<div/>",{class:"slide-picker",role:"slider",tabindex:0}),this.refresh(),this.setValue(e,!1),this.addListener(this.$container,"keydown",(function(t){switch(t.keyCode){case Garnish.UP_KEY:s.setValue(s.value+s.settings.step),t.preventDefault();break;case Garnish.DOWN_KEY:s.setValue(s.value-s.settings.step),t.preventDefault();break;case Garnish.RIGHT_KEY:"ltr"===Craft.orientation?s.setValue(s.value+s.settings.step):s.setValue(s.value-s.settings.step),t.preventDefault();break;case Garnish.LEFT_KEY:"ltr"===Craft.orientation?s.setValue(s.value-s.settings.step):s.setValue(s.value+s.settings.step),t.preventDefault();break;case Garnish.HOME_KEY:s.setValue(s.min),t.preventDefault();break;case Garnish.END_KEY:s.setValue(s.max),t.preventDefault()}}))},refresh:function(){var e=this;if(this.min=this._min(),this.max=this._max(),this.totalSteps=(this.max-this.min)/this.settings.step,this.label=this.settings.label,this.describedBy=this.settings.describedBy,!Number.isInteger(this.totalSteps))throw"Invalid SlidePicker config";this.$buttons&&this.$buttons.remove(),this.$container.attr("aria-valuemin",this.min),this.$container.attr("aria-valuemax",this.max),this.label&&this.$container.attr("aria-label",this.label),this.describedBy&&this.$container.attr("aria-describedby",this.describedBy),this.$buttons=t();for(var i=this.min;i<=this.max;i+=this.settings.step)this.$buttons=this.$buttons.add(t("<a/>",{title:this.settings.valueLabel(i),data:{value:i}}));if(this.$buttons.appendTo(this.$container),null!==this.value){var s=this.value;this.value=null,this.setValue(s,!1)}this.addListener(this.$buttons,"mouseover",(function(i){e.$buttons.removeClass("active-hover last-active-hover"),t(i.currentTarget).addClass("active-hover last-active-hover").prevAll().addClass("active-hover")})),this.addListener(this.$buttons,"mouseout",(function(){e.$buttons.removeClass("active-hover")})),this.addListener(this.$buttons,"click",(function(i){e.setValue(t.data(i.currentTarget,"value")),i.stopPropagation(),e.$container.focus()}))},setValue:function(t,e){if(t=Math.max(Math.min(t,this.max),this.min),this.value!==(this.value=t)){this.$container.attr({"aria-valuenow":this.value,"aria-valuetext":this.settings.valueLabel(this.value)}),this.$buttons.removeClass("last-active active");var i=this.$buttons.eq((this.value-this.min)/this.settings.step);i.add(i.prevAll()).addClass("active"),i.addClass("last-active"),!1!==e&&this.settings.onChange(t)}},_min:function(){return"function"==typeof this.settings.min?this.settings.min():this.settings.min},_max:function(){return"function"==typeof this.settings.max?this.settings.max():this.settings.max}},{defaults:{min:0,max:100,step:10,valueLabel:null,onChange:t.noop}})}(jQuery)},5763:function(){Craft.SlideRuleInput=Garnish.Base.extend({$container:null,$options:null,$selectedOption:null,$input:null,value:null,startPositionX:null,init:function(t,e){var i=this;this.setSettings(e,Craft.SlideRuleInput.defaultSettings),this.value=0,this.graduationsMin=-70,this.graduationsMax=70,this.slideMin=-45,this.slideMax=45,this.$container=$("#"+t),this.$overlay=$('<div class="overlay"></div>').appendTo(this.$container),this.$cursor=$('<div class="cursor"></div>').appendTo(this.$container),this.$graduations=$('<div class="graduations"></div>').appendTo(this.$container),this.$graduationsUl=$("<ul></ul>").appendTo(this.$graduations),this.$container.attr({role:"slider",tabindex:"0","aria-valuemin":this.slideMin,"aria-valuemax":this.slideMax,"aria-valuenow":"0","aria-valuetext":Craft.t("app","{num, number} {num, plural, =1{degree} other{degrees}}",{num:0})});for(var s=this.graduationsMin;s<=this.graduationsMax;s++){var a=$('<li class="graduation" data-graduation="'+s+'"><div class="label">'+s+"</div></li>").appendTo(this.$graduationsUl);s%5==0&&a.addClass("main-graduation"),0===s&&a.addClass("selected")}this.$options=this.$container.find(".graduation"),this.addListener(this.$container,"resize",this._handleResize.bind(this)),this.addListener(this.$container,"tapstart",this._handleTapStart.bind(this)),this.addListener(Garnish.$bod,"tapmove",this._handleTapMove.bind(this)),this.addListener(Garnish.$bod,"tapend",this._handleTapEnd.bind(this)),this.addListener(this.$container,"keydown",this._handleKeypress.bind(this)),setTimeout((function(){i.graduationsCalculatedWidth=10*(i.$options.length-1),i.$graduationsUl.css("left",-i.graduationsCalculatedWidth/2+i.$container.width()/2)}),50)},_handleResize:function(){var t=this.valueToPosition(this.value);this.$graduationsUl.css("left",t)},_handleKeypress:function(t){var e=parseInt(this.$container.attr("aria-valuenow"),10);switch(t.keyCode){case Garnish.UP_KEY:case Garnish.RIGHT_KEY:this.setValue(e+1);break;case Garnish.DOWN_KEY:case Garnish.LEFT_KEY:this.setValue(e-1);break;case Garnish.PAGE_UP_KEY:this.setValue(e+10);break;case Garnish.PAGE_DOWN_KEY:this.setValue(e-10);break;case Garnish.HOME_KEY:this.setValue(this.slideMin);break;case Garnish.END_KEY:this.setValue(this.slideMax)}this.onChange()},_handleTapStart:function(t,e){t.preventDefault(),this.startPositionX=e.position.x,this.startLeft=this.$graduationsUl.position().left,this.dragging=!0,this.onStart()},_handleTapMove:function(t,e){if(this.dragging){t.preventDefault();var i=this.startPositionX-e.position.x,s=this.startLeft-i,a=this.positionToValue(s);this.setValue(a),this.onChange()}},setValue:function(t){var e=this.valueToPosition(t);t<this.slideMin?(t=this.slideMin,e=this.valueToPosition(t)):t>this.slideMax&&(t=this.slideMax,e=this.valueToPosition(t)),this.$graduationsUl.css("left",e),t>=this.slideMin&&t<=this.slideMax&&(this.$options.removeClass("selected"),$.each(this.$options,(function(e,i){$(i).data("graduation")>0&&$(i).data("graduation")<=t&&$(i).addClass("selected"),$(i).data("graduation")<0&&$(i).data("graduation")>=t&&$(i).addClass("selected"),0==$(i).data("graduation")&&$(i).addClass("selected")}))),this.$container.attr({"aria-valuenow":t,"aria-valuetext":Craft.t("app","{num, number} {num, plural, =1{degree} other{degrees}}",{num:parseInt(t,10)})}),this.value=t},_handleTapEnd:function(t){this.dragging&&(t.preventDefault(),this.dragging=!1,this.onEnd())},positionToValue:function(t){var e=-1*this.graduationsMin,i=-1*(this.graduationsMin-this.graduationsMax);return(this.$graduations.width()/2+-1*t)/this.graduationsCalculatedWidth*i-e},valueToPosition:function(t){var e=-1*this.graduationsMin,i=-1*(this.graduationsMin-this.graduationsMax);return-((t+e)*this.graduationsCalculatedWidth/i-this.$graduations.width()/2)},onStart:function(){"function"==typeof this.settings.onChange&&this.settings.onStart(this)},onChange:function(){"function"==typeof this.settings.onChange&&this.settings.onChange(this)},onEnd:function(){"function"==typeof this.settings.onChange&&this.settings.onEnd(this)},defaultSettings:{onStart:$.noop,onChange:$.noop,onEnd:$.noop}})},5759:function(){!function(t){Craft.Slideout=Garnish.Base.extend({$outerContainer:null,$container:null,$shade:null,isOpen:!1,init:function(e,i){var s=this;this.setSettings(i,Craft.Slideout.defaults),Craft.useMobileStyles()||(this.$shade=t('<div class="slideout-shade"/>').appendTo(Garnish.$bod),this.settings.closeOnShadeClick&&this.addListener(this.$shade,"click",(function(t){t.stopPropagation(),s.close()}))),this.$outerContainer=t("<div/>",{class:"slideout-container hidden"}),this.$container=t("<".concat(this.settings.containerElement,"/>"),this.settings.containerAttributes).attr("data-slideout","").addClass("slideout").append(e).data("slideout",this).appendTo(this.$outerContainer),Garnish.addModalAttributes(this.$outerContainer),Craft.useMobileStyles()&&this.$container.addClass("so-mobile"),Craft.trapFocusWithin(this.$container),this.settings.autoOpen&&this.open()},open:function(){var t=this;this.isOpen||(this.setTriggerElement(document.activeElement),this._cancelTransitionListeners(),this.$shade&&this.$shade.appendTo(Garnish.$bod).show(),this.$outerContainer.appendTo(Garnish.$bod).removeClass("hidden"),Craft.useMobileStyles()?this.$container.css("top","100vh"):this.$container.css(Garnish.ltr?"left":"right","100vw"),this.$container.one("transitionend.slideout",(function(){Craft.setFocusWithin(t.$container)})),this.$shade&&(this.$shade[0].offsetWidth,this.$shade.addClass("so-visible")),this.$container[0].offsetWidth,Craft.Slideout.addPanel(this),this.enable(),Garnish.uiLayerManager.addLayer(this.$outerContainer),Garnish.hideModalBackgroundLayers(),this.settings.closeOnEsc&&Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.close()})),this.isOpen=!0,this.trigger("open"))},setTriggerElement:function(t){this.settings.triggerElement=t},close:function(){var t=this;this.isOpen&&(this.trigger("beforeClose"),this.disable(),this.isOpen=!1,this._cancelTransitionListeners(),this.$shade&&this.$shade.removeClass("so-visible").one("transitionend.slideout",(function(){t.$shade.hide()})),Craft.Slideout.removePanel(this),Garnish.uiLayerManager.removeLayer(),Garnish.resetModalBackgroundLayerVisibility(),this.$container.one("transitionend.slideout",(function(){t.$outerContainer.addClass("hidden"),t.trigger("close")})),this.settings.triggerElement&&this.settings.triggerElement.focus())},_cancelTransitionListeners:function(){this.$shade&&this.$shade.off("transitionend.slideout"),this.$container.off("transitionend.slideout")},destroy:function(){this.$shade&&(this.$shade.remove(),this.$shade=null),this.$outerContainer.remove(),this.$outerContainer=null,this.$container=null,this.base()}},{defaults:{containerElement:"div",containerAttributes:{},autoOpen:!0,closeOnEsc:!0,closeOnShadeClick:!0,triggerElement:null},openPanels:[],addPanel:function(t){Craft.Slideout.openPanels.unshift(t),Craft.useMobileStyles()?t.$container.css("top",0):Craft.Slideout.updateStyles()},removePanel:function(t){Craft.Slideout.openPanels=Craft.Slideout.openPanels.filter((function(e){return e!==t})),Craft.useMobileStyles()?t.$container.css("top","100vh"):(t.$container.css(Garnish.ltr?"left":"right","100vw"),Craft.Slideout.updateStyles())},updateStyles:function(){var t=Craft.Slideout.openPanels.length;Craft.Slideout.openPanels.forEach((function(e,i){e.$container.css(Garnish.ltr?"left":"right","".concat((t-i)/t*50,"vw"))})),0!==t?Garnish.$bod.addClass("no-scroll"):Garnish.$bod.removeClass("no-scroll")}})}(jQuery)},5185:function(){Craft.SlugGenerator=Craft.BaseInputGenerator.extend({generateTargetValue:function(t){t=(t=t.replace(/<(.*?)>/g,"")).replace(/['"‘’“”\[\]\(\)\{\}:]/g,""),Craft.allowUppercaseInSlug||(t=t.toLowerCase()),Craft.limitAutoSlugsToAscii&&(t=Craft.asciiString(t,this.settings.charMap));var e=Craft.filterArray(XRegExp.matchChain(t,[XRegExp("[\\p{L}\\p{N}\\p{M}]+")]));return e.length?e.join(Craft.slugWordSeparator):""}})},8030:function(){Craft.Structure=Garnish.Base.extend({id:null,$container:null,state:null,structureDrag:null,init:function(t,e,i){this.id=t,this.$container=$(e),this.setSettings(i,Craft.Structure.defaults),this.$container.data("structure")&&(console.warn("Double-instantiating a structure on an element"),this.$container.data("structure").destroy()),this.$container.data("structure",this),this.state={},this.settings.storageKey&&$.extend(this.state,Craft.getLocalStorage(this.settings.storageKey,{})),void 0===this.state.collapsedElementIds&&(this.state.collapsedElementIds=[]);for(var s=this.$container.find("ul").prev(".row"),a=0;a<s.length;a++){var n=$(s[a]),r=n.parent(),o=$('<div class="toggle" title="'+Craft.t("app","Show/hide children")+'"/>').prependTo(n);-1!==$.inArray(n.children(".element").data("id"),this.state.collapsedElementIds)&&r.addClass("collapsed"),this.initToggle(o)}this.settings.sortable&&(this.structureDrag=new Craft.StructureDrag(this,this.settings.maxLevels)),this.settings.newChildUrl&&this.initNewChildMenus(this.$container.find(".add"))},initToggle:function(t){var e=this;t.on("click",(function(t){var i=$(t.currentTarget).closest("li"),s=i.children(".row").find(".element:first").data("id"),a=$.inArray(s,e.state.collapsedElementIds);i.hasClass("collapsed")?(i.removeClass("collapsed"),-1!==a&&e.state.collapsedElementIds.splice(a,1)):(i.addClass("collapsed"),-1===a&&e.state.collapsedElementIds.push(s)),e.settings.storageKey&&Craft.setLocalStorage(e.settings.storageKey,e.state)}))},initNewChildMenus:function(t){this.addListener(t,"click","onNewChildMenuClick")},onNewChildMenuClick:function(t){var e=$(t.currentTarget);if(!e.data("menubtn")){var i=e.parent().children(".element").data("id"),s=Craft.getUrl(this.settings.newChildUrl,"parentId="+i);$('<div class="menu"><ul><li><a href="'+s+'">'+Craft.t("app","New child")+"</a></li></ul></div>").insertAfter(e),new Garnish.MenuBtn(e).showMenu()}},getIndent:function(t){return Craft.Structure.baseIndent+(t-1)*Craft.Structure.nestedIndent},addElement:function(t){var e=$('<li data-level="1"/>').appendTo(this.$container),i=$('<div class="row" style="margin-'+Craft.left+": -"+Craft.Structure.baseIndent+"px; padding-"+Craft.left+": "+Craft.Structure.baseIndent+'px;">').appendTo(e);if(i.append(t),this.settings.sortable&&(i.append('<a class="move icon" title="'+Craft.t("app","Move")+'"></a>'),this.structureDrag.addItems(e)),this.settings.newChildUrl){var s=$('<a class="add icon" title="'+Craft.t("app","New child")+'"></a>').appendTo(i);this.initNewChildMenus(s)}i.css("margin-bottom",-30),i.velocity({"margin-bottom":0},"fast")},removeElement:function(t){var e,i=this,s=t.parent().parent();this.settings.sortable&&this.structureDrag.removeItems(s),s.siblings().length||(e=s.parent()),s.css("visibility","hidden").velocity({marginBottom:-s.height()},"fast",(function(){s.remove(),void 0!==e&&i._removeUl(e)}))},_removeUl:function(t){t.siblings(".row").children(".toggle").remove(),t.remove()},destroy:function(){this.$container.removeData("structure"),this.base()}},{baseIndent:8,nestedIndent:35,defaults:{storageKey:null,sortable:!1,newChildUrl:null,maxLevels:null}})},3096:function(){Craft.StructureDrag=Garnish.Drag.extend({structure:null,maxLevels:null,draggeeLevel:null,$helperLi:null,$targets:null,draggeeHeight:null,init:function(t,e){this.structure=t,this.maxLevels=e,this.$insertion=$('<li class="draginsertion"/>');var i=this.structure.$container.find("li");this.base(i,{handle:".element:first, .move:first",helper:this.getHelper.bind(this)})},getHelper:function(t){this.$helperLi=t;var e=$('<ul class="structure draghelper"/>').append(t);return t.css("padding-"+Craft.left,this.$draggee.css("padding-"+Craft.left)),t.find(".move").removeAttr("title"),e},onDragStart:function(){var t=this;this.$targets=$(),this.findTargets(this.structure.$container),this.draggeeLevel=0;var e=this.$draggee;do{this.draggeeLevel++,e=e.find("> ul > li")}while(e.length);this.draggeeHeight=this.$draggee.height(),this.$draggee.velocity({height:0},"fast",(function(){t.$draggee.addClass("hidden")})),this.base(),this.addListener(Garnish.$doc,"keydown",(function(t){t.keyCode===Garnish.ESC_KEY&&this.cancelDrag()}))},findTargets:function(t){for(var e=t.children().not(this.$draggee),i=0;i<e.length;i++){var s=$(e[i]);this.$targets=this.$targets.add(s.children(".row")),s.hasClass("collapsed")||this.findTargets(s.children("ul"))}},onDrag:function(){for(this._.$closestTarget&&(this._.$closestTarget.removeClass("draghover"),this.$insertion.remove()),this._.$closestTarget=null,this._.closestTargetPos=null,this._.closestTargetYDiff=null,this._.closestTargetOffset=null,this._.closestTargetHeight=null,this._.i=0;this._.i<this.$targets.length&&(this._.$target=$(this.$targets[this._.i]),this._.targetOffset=this._.$target.offset(),this._.targetHeight=this._.$target.outerHeight(),this._.targetYMidpoint=this._.targetOffset.top+this._.targetHeight/2,this._.targetYDiff=Math.abs(this.mouseY-this._.targetYMidpoint),0===this._.i||this.mouseY>=this._.targetOffset.top+5&&this._.targetYDiff<this._.closestTargetYDiff);this._.i++)this._.$closestTarget=this._.$target,this._.closestTargetPos=this._.i,this._.closestTargetYDiff=this._.targetYDiff,this._.closestTargetOffset=this._.targetOffset,this._.closestTargetHeight=this._.targetHeight;if(this._.$closestTarget)if(0===this._.closestTargetPos&&this.mouseY<this._.closestTargetOffset.top+5)this.$insertion.prependTo(this.structure.$container);else if(this._.$closestTargetLi=this._.$closestTarget.parent(),this._.closestTargetLevel=this._.$closestTargetLi.data("level"),this._.closestTargetPos<this.$targets.length-1?(this._.$nextTargetLi=$(this.$targets[this._.closestTargetPos+1]).parent(),this._.nextTargetLevel=this._.$nextTargetLi.data("level")):(this._.$nextTargetLi=null,this._.nextTargetLevel=null),this._.hoveringBetweenRows=this.mouseY>=this._.closestTargetOffset.top+this._.closestTargetHeight-5,this._.$nextTargetLi&&this._.nextTargetLevel==this._.closestTargetLevel)this._.hoveringBetweenRows?(!this.maxLevels||this.maxLevels>=this._.closestTargetLevel+this.draggeeLevel-1)&&this.$insertion.insertAfter(this._.$closestTargetLi):(!this.maxLevels||this.maxLevels>=this._.closestTargetLevel+this.draggeeLevel)&&this._.$closestTarget.addClass("draghover");else if(this._.$nextTargetLi&&this._.nextTargetLevel>this._.closestTargetLevel)(!this.maxLevels||this.maxLevels>=this._.nextTargetLevel+this.draggeeLevel-1)&&(this._.hoveringBetweenRows?this.$insertion.insertBefore(this._.$nextTargetLi):(this._.$closestTarget.addClass("draghover"),this.$insertion.appendTo(this._.$closestTargetLi.children("ul"))));else if(this._.hoveringBetweenRows){for(this._.draggeeX=this.mouseX-this.targetItemMouseDiffX,"rtl"===Craft.orientation&&(this._.draggeeX+=this.$helperLi.width()),this._.$parentLis=this._.$closestTarget.parentsUntil(this.structure.$container,"li"),this._.$closestParentLi=null,this._.closestParentLiXDiff=null,this._.closestParentLevel=null,this._.i=0;this._.i<this._.$parentLis.length;this._.i++)this._.$parentLi=$(this._.$parentLis[this._.i]),this._.parentLiX=this._.$parentLi.offset().left,"rtl"===Craft.orientation&&(this._.parentLiX+=this._.$parentLi.width()),this._.parentLiXDiff=Math.abs(this._.parentLiX-this._.draggeeX),this._.parentLevel=this._.$parentLi.data("level"),(!this.maxLevels||this.maxLevels>=this._.parentLevel+this.draggeeLevel-1)&&(!this._.$closestParentLi||this._.parentLiXDiff<this._.closestParentLiXDiff&&(!this._.$nextTargetLi||this._.parentLevel>=this._.nextTargetLevel))&&(this._.$closestParentLi=this._.$parentLi,this._.closestParentLiXDiff=this._.parentLiXDiff,this._.closestParentLevel=this._.parentLevel);this._.$closestParentLi&&this.$insertion.insertAfter(this._.$closestParentLi)}else(!this.maxLevels||this.maxLevels>=this._.closestTargetLevel+this.draggeeLevel)&&this._.$closestTarget.addClass("draghover")},cancelDrag:function(){this.$insertion.remove(),this._.$closestTarget&&this._.$closestTarget.removeClass("draghover"),this.onMouseUp()},onDragStop:function(){var t=this;if(this._.$closestTarget&&(this.$insertion.parent().length||this._.$closestTarget.hasClass("draghover"))){var e,i;if(this.$draggee.siblings().length||(e=this.$draggee.parent()),this.$insertion.parent().length){var s=this.$insertion.next().add(this.$insertion.prev());-1===$.inArray(this.$draggee[0],s)?(this.$insertion.replaceWith(this.$draggee),i=!0):(this.$insertion.remove(),i=!1)}else{var a=this._.$closestTargetLi.children("ul");if(e&&a.length&&a[0]===e[0])i=!1;else{if(a.length)this._.$closestTargetLi.hasClass("collapsed")&&this._.$closestTarget.children(".toggle").trigger("click");else{var n=$('<div class="toggle" title="'+Craft.t("app","Show/hide children")+'"/>').prependTo(this._.$closestTarget);this.structure.initToggle(n),a=$("<ul>").appendTo(this._.$closestTargetLi)}this.$draggee.appendTo(a),i=!0}}if(this._.$closestTarget.removeClass("draghover"),i){e&&this.structure._removeUl(e);var r,o=this.$draggee.parentsUntil(this.structure.$container,"li").length+1;o!=this.$draggee.data("level")&&(1==this.$draggee.data("level")?((r={})["padding-"+Craft.left]=38,this.$helperLi.velocity(r,"fast")):1==o&&((r={})["padding-"+Craft.left]=Craft.Structure.baseIndent,this.$helperLi.velocity(r,"fast")),this.setLevel(this.$draggee,o));var l=this.$draggee.children(".row").children(".element"),h={structureId:this.structure.id,elementId:l.data("id"),siteId:l.data("site-id"),prevId:this.$draggee.prev().children(".row").children(".element").data("id"),parentId:this.$draggee.parent("ul").parent("li").children(".row").children(".element").data("id")};Craft.sendActionRequest("POST","structures/move-element",{data:h}).then((function(t){Craft.cp.displaySuccess(Craft.t("app","New order saved."))}))}}this.$draggee.velocity("stop").removeClass("hidden").velocity({height:this.draggeeHeight},"fast",(function(){t.$draggee.css("height","auto")})),this.returnHelpersToDraggees(),this.base()},setLevel:function(t,e){t.data("level",e);var i=this.structure.getIndent(e),s={};s["margin-"+Craft.left]="-"+i+"px",s["padding-"+Craft.left]=i+"px",this.$draggee.children(".row").css(s);for(var a=t.children("ul").children(),n=0;n<a.length;n++)this.setLevel($(a[n]),e+1)}})},3331:function(){Craft.StructureTableSorter=Garnish.DragSort.extend({tableView:null,structureId:null,maxLevels:null,_basePadding:null,_helperMargin:null,_$firstRowCells:null,_$titleHelperCell:null,_titleHelperCellOuterWidth:null,_ancestors:null,_updateAncestorsFrame:null,_draggeeLevel:null,_draggeeLevelDelta:null,draggingLastElements:null,_loadingDraggeeLevelDelta:!1,_targetLevel:null,_targetLevelBounds:null,_positionChanged:null,init:function(t,e,i){this.tableView=t,this.structureId=this.tableView.$table.data("structure-id"),this.maxLevels=parseInt(this.tableView.$table.attr("data-max-levels")),this._basePadding=14+(this.tableView.elementIndex.actions?34:24),this._helperMargin=this.tableView.elementIndex.actions?54:0,i=$.extend({},Craft.StructureTableSorter.defaults,i,{handle:".move",collapseDraggees:!0,singleHelper:!0,helperSpacingY:2,magnetStrength:4,helper:this.getHelper.bind(this),helperLagBase:1.5,axis:Garnish.Y_AXIS}),this.base(e,i)},findDraggee:function(){var t=this;this._draggeeLevel=this._targetLevel=this.$targetItem.data("level"),this._draggeeLevelDelta=0;for(var e=$(this.$targetItem),i=this.$targetItem.next();i.length;){var s=i.data("level");if(s<=this._draggeeLevel)break;var a=s-this._draggeeLevel;a>this._draggeeLevelDelta&&(this._draggeeLevelDelta=a),e=e.add(i),i=i.next()}if(this.draggingLastElements=!i.length,this.maxLevels&&this.draggingLastElements&&this.tableView.getMorePending()){this._loadingDraggeeLevelDelta=!0;var n=this._getAjaxBaseData(this.$targetItem);Craft.sendActionRequest("POST","structures/get-element-level-delta",{data:n}).then((function(e){t._loadingDraggeeLevelDelta=!1,t.dragging&&(t._draggeeLevelDelta=e.data.delta,t.drag(!1))}))}return e},getHelper:function(t){var e=$('<div class="elements datatablesorthelper"/>').appendTo(Garnish.$bod),i=$('<div class="tableview"/>').appendTo(e),s=$('<table class="data"/>').appendTo(i),a=$("<tbody/>").appendTo(s);t.appendTo(a),this._$firstRowCells=this.tableView.$elementContainer.children("tr:first").children();for(var n=t.children(),r=0;r<n.length;r++){var o=$(n[r]);if(o.hasClass("checkbox-cell"))o.remove();else{var l=$(this._$firstRowCells[r]),h=l[0].getBoundingClientRect().width;l.css("width",h+"px"),o.css("width",h+"px"),Garnish.hasAttr(l,"data-titlecell")&&(this._$titleHelperCell=o,parseInt(l.css("padding-"+Craft.left)),this._titleHelperCellOuterWidth=h,o.css("padding-"+Craft.left,this._basePadding))}}return e},canInsertBefore:function(t){return!this._loadingDraggeeLevelDelta&&!1!==this._getLevelBounds(t.prev(),t)},canInsertAfter:function(t){return!this._loadingDraggeeLevelDelta&&!1!==this._getLevelBounds(t,t.next())},onDragStart:function(){this._ancestors=this._getAncestors(this.$targetItem,this.$targetItem.data("level")),this._setTargetLevelBounds(),this.tableView.maybeLoadMore(),this.base()},onDrag:function(){this.base(),this._updateIndent()},onInsertionPointChange:function(){this._setTargetLevelBounds(),this._updateAncestorsBeforeRepaint(),this.base()},onDragStop:function(){var t=this;if(this._positionChanged=!1,this.base(),this._targetLevel!=this._draggeeLevel){for(var e=this._targetLevel-this._draggeeLevel,i=0;i<this.$draggee.length;i++){var s=$(this.$draggee[i]),a=s.data("level")+e,n=this._basePadding+this._getLevelIndent(a);s.data("level",a),s.find(".element").data("level",a),s.children("[data-titlecell]:first").css("padding-"+Craft.left,n)}this._positionChanged=!0}if(this._positionChanged){for(var r=this._getAjaxBaseData(this.$draggee),o=this.$draggee.first().prev();o.length;){var l=o.data("level");if(l==this._targetLevel){r.prevId=o.data("id");break}if(l<this._targetLevel){r.parentId=o.data("id");var h=o.find("> th > .toggle");if(!h.hasClass("expanded")){h.addClass("expanded");var d=this.tableView._createSpinnerRowAfter(o);this.tableView.elementSelect&&this.tableView.elementSelect.removeItems(this.$targetItem),this.removeItems(this.$targetItem),this.$targetItem.remove(),this.tableView._totalVisible--}break}o=o.prev()}Craft.sendActionRequest("POST","structures/move-element",{data:r}).then((function(e){Craft.cp.displaySuccess(Craft.t("app","New position saved.")),t.onPositionChange(),d&&d.parent().length&&(d.remove(),t.tableView._expandElement(h,!0)),Craft.cp.runQueue()})).catch((function(e){e.response,Craft.cp.displayError(Craft.t("app","A server error occurred.")),t.tableView.elementIndex.updateElements()}))}},onSortChange:function(){this.tableView.elementSelect&&this.tableView.elementSelect.resetItemOrder(),this._positionChanged=!0,this.base()},onPositionChange:function(){var t=this;Garnish.requestAnimationFrame((function(){t.trigger("positionChange"),t.settings.onPositionChange()}))},onReturnHelpersToDraggees:function(){if(this._$firstRowCells.css("width",""),this.draggingLastElements&&this.tableView.getMorePending()){this.tableView._totalVisible+=this.newDraggeeIndexes[0]-this.oldDraggeeIndexes[0];var t=this.$draggee.last().nextAll();t.length&&(this.removeItems(t),t.remove(),this.tableView.maybeLoadMore())}this.base()},_getLevelBounds:function(t,e){if(e&&e.length?this._getLevelBounds._minLevel=e.data("level"):this._getLevelBounds._minLevel=1,t&&t.length?this._getLevelBounds._maxLevel=t.data("level")+1:this._getLevelBounds._maxLevel=1,this.maxLevels){if(1!=this._getLevelBounds._minLevel&&this._getLevelBounds._minLevel+this._draggeeLevelDelta>this.maxLevels)return!1;this._getLevelBounds._maxLevel+this._draggeeLevelDelta>this.maxLevels&&(this._getLevelBounds._maxLevel=this.maxLevels-this._draggeeLevelDelta,this._getLevelBounds._maxLevel<this._getLevelBounds._minLevel&&(this._getLevelBounds._maxLevel=this._getLevelBounds._minLevel))}return{min:this._getLevelBounds._minLevel,max:this._getLevelBounds._maxLevel}},_setTargetLevelBounds:function(){this._targetLevelBounds=this._getLevelBounds(this.$draggee.first().prev(),this.$draggee.last().next())},_updateIndent:function(t){this._updateIndent._mouseDist=this.realMouseX-this.mousedownX,"rtl"===Craft.orientation&&(this._updateIndent._mouseDist*=-1),this._updateIndent._indentationDist=Math.round(this._updateIndent._mouseDist/Craft.StructureTableSorter.LEVEL_INDENT),this._updateIndent._targetLevel=this._draggeeLevel+this._updateIndent._indentationDist,this._updateIndent._targetLevel<this._targetLevelBounds.min?(this._updateIndent._indentationDist+=this._targetLevelBounds.min-this._updateIndent._targetLevel,this._updateIndent._targetLevel=this._targetLevelBounds.min):this._updateIndent._targetLevel>this._targetLevelBounds.max&&(this._updateIndent._indentationDist-=this._updateIndent._targetLevel-this._targetLevelBounds.max,this._updateIndent._targetLevel=this._targetLevelBounds.max),this._targetLevel!==(this._targetLevel=this._updateIndent._targetLevel)&&this._updateAncestorsBeforeRepaint(),this._updateIndent._targetLevelMouseDiff=this._updateIndent._mouseDist-this._updateIndent._indentationDist*Craft.StructureTableSorter.LEVEL_INDENT,this._updateIndent._magnetImpact=Math.round(this._updateIndent._targetLevelMouseDiff/15),Math.abs(this._updateIndent._magnetImpact)>Craft.StructureTableSorter.MAX_GIVE&&(this._updateIndent._magnetImpact=(this._updateIndent._magnetImpact>0?1:-1)*Craft.StructureTableSorter.MAX_GIVE),this._updateIndent._closestLevelMagnetIndent=this._getLevelIndent(this._targetLevel)+this._updateIndent._magnetImpact,this.helpers[0].css("margin-"+Craft.left,this._updateIndent._closestLevelMagnetIndent+this._helperMargin),this._$titleHelperCell.css("width",this._titleHelperCellOuterWidth-this._updateIndent._closestLevelMagnetIndent)},_getLevelIndent:function(t){return(t-1)*Craft.StructureTableSorter.LEVEL_INDENT},_getAjaxBaseData:function(t){return{structureId:this.structureId,elementId:t.data("id"),siteId:t.find(".element:first").data("site-id")}},_getAncestors:function(t,e){if(this._getAncestors._ancestors=[],0!=e)for(this._getAncestors._level=e,this._getAncestors._$prevRow=t.prev();this._getAncestors._$prevRow.length&&!(this._getAncestors._$prevRow.data("level")<this._getAncestors._level&&(this._getAncestors._ancestors.unshift(this._getAncestors._$prevRow),this._getAncestors._level=this._getAncestors._$prevRow.data("level"),0==this._getAncestors._level));)this._getAncestors._$prevRow=this._getAncestors._$prevRow.prev();return this._getAncestors._ancestors},_updateAncestorsBeforeRepaint:function(){this._updateAncestorsFrame&&Garnish.cancelAnimationFrame(this._updateAncestorsFrame),this._updateAncestorsFrame=Garnish.requestAnimationFrame(this._updateAncestors.bind(this))},_updateAncestors:function(){for(this._updateAncestorsFrame=null,this._updateAncestors._i=0;this._updateAncestors._i<this._ancestors.length;this._updateAncestors._i++)this._updateAncestors._$ancestor=this._ancestors[this._updateAncestors._i],this._updateAncestors._$ancestor.data("descendants",this._updateAncestors._$ancestor.data("descendants")-1),0==this._updateAncestors._$ancestor.data("descendants")&&this._updateAncestors._$ancestor.find("> th > .toggle:first").remove();for(this._updateAncestors._newAncestors=this._getAncestors(this.$targetItem,this._targetLevel),this._updateAncestors._i=0;this._updateAncestors._i<this._updateAncestors._newAncestors.length;this._updateAncestors._i++)if(this._updateAncestors._$ancestor=this._updateAncestors._newAncestors[this._updateAncestors._i],this._updateAncestors._$ancestor.data("descendants",this._updateAncestors._$ancestor.data("descendants")+1),1==this._updateAncestors._$ancestor.data("descendants")){var t=this._updateAncestors._$ancestor.data("title");$('<button class="toggle expanded" type="button" aria-expanded="true" title="'+Craft.t("app","Show/hide children")+'" aria-label="'+Craft.t("app","Show {title} children",{title:t})+'"></button>').insertAfter(this._updateAncestors._$ancestor.find("> th .move:first"))}this._ancestors=this._updateAncestors._newAncestors,delete this._updateAncestors._i,delete this._updateAncestors._$ancestor,delete this._updateAncestors._newAncestors}},{HELPER_MARGIN:0,LEVEL_INDENT:44,MAX_GIVE:22,defaults:{onPositionChange:$.noop}})},53:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.TableElementIndexView=Craft.BaseElementIndexView.extend({$table:null,$tableCaption:null,$selectedSortHeader:null,$statusMessage:null,structureTableSort:null,_totalVisiblePostStructureTableDraggee:null,_morePendingPostStructureTableDraggee:!1,_broadcastListener:null,getElementContainer:function(){return this.$table=this.$container.find("table:first"),this.$table.children("tbody:first")},afterInit:function(){var t=this;this.$tableCaption=this.$table.find("caption"),this.$statusMessage=this.$table.parent().find("[data-status-message]"),this.initTableHeaders(),this.elementIndex.on("updateElements",(function(){t._updateScreenReaderStatus()})),"index"===this.elementIndex.settings.context&&"structure"===this.elementIndex.getSelectedSortAttribute()&&Garnish.hasAttr(this.$table,"data-structure-id")?this.structureTableSort=new Craft.StructureTableSorter(this,this.getAllElements()):this.structureTableSort=null,"structure"===this.elementIndex.getSelectedSortAttribute()&&this.addListener(this.$elementContainer,"click",(function(t){var e=$(t.target);e.hasClass("toggle")&&!1===this._collapseElement(e)&&this._expandElement(e)})),Craft.messageReceiver&&(this._broadcastListener=function(e){if("saveElement"===e.data.event){var i=t.$table.find('> tbody > tr[data-id="'.concat(e.data.id,'"]'));if(i.length){var s={elementType:t.elementIndex.elementType,source:t.elementIndex.sourceKey,id:e.data.id,siteId:t.elementIndex.siteId};Craft.sendActionRequest("POST","element-indexes/element-table-html",{data:s}).then((function(t){for(var e=t.data,s=0;s<i.length;s++){var a=i.eq(s);for(var n in a.find("> th[data-titlecell] .element").replaceWith(e.elementHtml),e.attributeHtml)e.attributeHtml.hasOwnProperty(n)&&a.find('> td[data-attr="'.concat(n,'"]')).html(e.attributeHtml[n])}(new Craft.ElementThumbLoader).load(i)}))}}},Craft.messageReceiver.addEventListener("message",this._broadcastListener))},initTableHeaders:function(){for(var e=function(e,i){return function(t){if(Array.isArray(t))return t}(e)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(e,i)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(this.elementIndex.getSortAttributeAndDirection(),1)[0],i=this.$table.children("thead").children().children("[data-attribute]"),s=0;s<i.length;s++){var a=i.eq(s),n=a.attr("data-attribute"),r="none";if(n===e){this.$selectedSortHeader=a;var o=this.elementIndex.getSelectedSortDirection();r="asc"===o?"ascending":"descending",a.addClass("ordered "+o),this.makeColumnSortable(a,!0)}else this.elementIndex.getSortOption(n)&&this.makeColumnSortable(a);a.attr("aria-sort",r)}},makeColumnSortable:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t.addClass("orderable");var i=t.html(),s=this.$tableCaption.find("[data-sort-instructions]"),a=$("<button/>",{id:"".concat(this.elementIndex.idPrefix,"-").concat(t.attr("data-attribute")),type:"button","aria-pressed":"false"}).html(i);s.length&&a.attr("aria-describedby",s.attr("id")),e?(a.attr("aria-pressed","true"),a.on("click",this._handleSelectedSortHeaderClick.bind(this))):a.on("click",this._handleUnselectedSortHeaderClick.bind(this)),t.empty().append(a)},isVerticalList:function(){return!0},getTotalVisible:function(){return this._isStructureTableDraggingLastElements()?this._totalVisiblePostStructureTableDraggee:this._totalVisible},setTotalVisible:function(t){this._isStructureTableDraggingLastElements()?this._totalVisiblePostStructureTableDraggee=t:this._totalVisible=t},getMorePending:function(){return this._isStructureTableDraggingLastElements()?this._morePendingPostStructureTableDraggee:this._morePending},setMorePending:function(t){this._isStructureTableDraggingLastElements()?this._morePendingPostStructureTableDraggee=t:this._morePending=this._morePendingPostStructureTableDraggee=t},getLoadMoreParams:function(){var t=this.base();return this._isStructureTableDraggingLastElements()&&(t.criteria.positionedAfter=this.structureTableSort.$targetItem.data("id")),t},appendElements:function(t){this.base(t),this.structureTableSort&&this.structureTableSort.addItems(t),Craft.cp.updateResponsiveTables()},_collapseElement:function(t,e){if(!e&&!t.hasClass("expanded"))return!1;t.removeClass("expanded"),t.attr("aria-expanded","false");for(var i=t.parent().parent(),s=i.data("id"),a=i.data("level"),n=i.next();n.length;){if(!Garnish.hasAttr(n,"data-spinnerrow")){if(n.data("level")<=a)break;this.elementSelect&&this.elementSelect.removeItems(n),this.structureTableSort&&this.structureTableSort.removeItems(n),this._totalVisible--}var r=n.next();n.remove(),n=r}this.elementIndex.instanceState.collapsedElementIds||(this.elementIndex.instanceState.collapsedElementIds=[]),this.elementIndex.instanceState.collapsedElementIds.push(s),this.elementIndex.setInstanceState("collapsedElementIds",this.elementIndex.instanceState.collapsedElementIds),this.maybeLoadMore()},_expandElement:function(t,e){var i=this;if(!e&&t.hasClass("expanded"))return!1;if(t.addClass("expanded"),t.attr("aria-expanded","true"),this.elementIndex.instanceState.collapsedElementIds){var s=t.parent().parent(),a=s.data("id"),n=$.inArray(a,this.elementIndex.instanceState.collapsedElementIds);if(-1!==n){this.elementIndex.instanceState.collapsedElementIds.splice(n,1),this.elementIndex.setInstanceState("collapsedElementIds",this.elementIndex.instanceState.collapsedElementIds);var r=this._createSpinnerRowAfter(s),o=$.extend(!0,{},this.settings.params);o.criteria.descendantOf=a,Craft.sendActionRequest("POST",this.settings.loadMoreElementsAction,{data:o}).then((function(t){if(r.parent().length){var e=$(t.data.html),s=i._totalVisible+e.length,a=i.settings.batchSize&&e.length===i.settings.batchSize;if(a){var n=r.nextAll();i.elementSelect&&i.elementSelect.removeItems(n),i.structureTableSort&&i.structureTableSort.removeItems(n),n.remove(),s-=n.length}else a=i._morePending;r.replaceWith(e),i.thumbLoader.load(e),(i.elementIndex.actions||i.settings.selectable)&&(i.elementSelect.addItems(e.filter(":not(.disabled)")),i.elementIndex.updateActionTriggers()),i.structureTableSort&&i.structureTableSort.addItems(e),Craft.appendHeadHtml(t.data.headHtml),Craft.appendBodyHtml(t.data.bodyHtml),Craft.cp.updateResponsiveTables(),i.setTotalVisible(s),i.setMorePending(a),i.maybeLoadMore()}})).catch((function(t){Craft.cp.displayError(),r.parent().length}))}}},_createSpinnerRowAfter:function(t){return $('<tr data-spinnerrow><td class="centeralign" colspan="'+t.children().length+'"><div class="spinner"/></td></tr>').insertAfter(t)},_isStructureTableDraggingLastElements:function(){return this.structureTableSort&&this.structureTableSort.dragging&&this.structureTableSort.draggingLastElements},_handleSelectedSortHeaderClick:function(t){var e=$(t.currentTarget).closest("th");if(!e.hasClass("loading")){var i="asc"===this.elementIndex.getSelectedSortDirection()?"desc":"asc";this.elementIndex.setSelectedSortDirection(i),this._handleSortHeaderClick(t,e)}},_handleUnselectedSortHeaderClick:function(t){var e=$(t.currentTarget).closest("th");if(!e.hasClass("loading")){var i=e.attr("data-attribute");this.elementIndex.setSelectedSortAttribute(i),this._handleSortHeaderClick(t,e)}},_handleSortHeaderClick:function(t,e){this.$selectedSortHeader&&this.$selectedSortHeader.removeClass("ordered asc desc"),e.addClass("ordered loading"),this.elementIndex.updateElements(),this.elementIndex.setIndexAvailable()},_updateScreenReaderStatus:function(){var t=this.elementIndex.getSelectedSortAttribute(),e="asc"===this.elementIndex.getSelectedSortDirection()?Craft.t("app","Ascending"):Craft.t("app","Descending"),i=this.elementIndex.getSortLabel(t);if(t||e||i){var s=Craft.t("app","Table {name} sorted by {attribute}, {direction}",{name:this.$table.attr("data-name"),attribute:i,direction:e});this.$statusMessage.empty(),this.$statusMessage.text(s)}},_updateTableAttributes:function(t,e){var i=t.closest("tr");for(var s in e)e.hasOwnProperty(s)&&i.children('[data-attr="'+s+'"]:first').html(e[s])},destroy:function(){this._broadcastListener&&(Craft.messageReceiver.removeEventListener("message",this._broadcastListener),delete this._broadcastListener),this.base()}})},7745:function(){Craft.Tabs=Garnish.Base.extend({$container:null,$tablist:null,$menuBtn:null,$tabs:null,$firstTab:null,$lastTab:null,$selectedTab:null,$focusableTab:null,menu:null,init:function(t){var e=this;this.$container=$(t),this.$tablist=this.$container.find('> [role="tablist"]:first'),this.$tabs=this.$tablist.find('> [role="tab"]'),this.$firstTab=this.$tabs.first(),this.$lastTab=this.$tabs.last(),this.$selectedTab=this.$tabs.filter(".sel:first"),this.$focusableTab=this.$tabs.filter("[tabindex=0]:first"),this.$menuBtn=this.$container.find("> .menubtn:first").menubtn(),this.menu=this.$menuBtn.data("menubtn").menu,this.$container.data("tabs")&&(console.warn("Double-instantiating a tab manager on an element"),this.$container.data("tabs").destroy()),this.$container.data("tabs",this);for(var i=0;i<this.$tabs.length;i++){var s=this.$tabs.eq(i),a=s.attr("href");a&&"#"===a.charAt(0)&&(this.addListener(s,"keydown",(function(t){[Garnish.SPACE_KEY,Garnish.RETURN_KEY].includes(t.keyCode)&&(t.preventDefault(),e.selectTab(t.currentTarget))})),this.addListener(s,"click",(function(t){t.preventDefault(),e.selectTab(t.currentTarget)}))),this.addListener(s,"keydown",(function(t){var i;[Garnish.LEFT_KEY,Garnish.RIGHT_KEY].includes(t.keyCode)&&$.contains(e.$tablist[0],t.currentTarget)?i=t.keyCode===("ltr"===Craft.orientation?Garnish.LEFT_KEY:Garnish.RIGHT_KEY)?(i=$(t.currentTarget).prevAll('[role="tab"]:not(.hidden):first')).length?i:e.$lastTab:(i=$(t.currentTarget).nextAll('[role="tab"]:not(.hidden):first')).length?i:e.$firstTab:t.keyCode!==Garnish.HOME_KEY&&t.keyCode!==Garnish.END_KEY||(i=t.keyCode===Garnish.HOME_KEY?e.$firstTab:e.$lastTab),i&&(t.preventDefault(),e.makeTabFocusable(i),i.focus(),e.scrollToTab(i))}))}this.updateMenuBtn(),Garnish.$win.on("resize",(function(){e.updateMenuBtn()})),this.menu.$options.on("click",(function(t){var e=$(t.currentTarget).attr("href");e&&"#"===e.charAt(0)&&t.preventDefault()})),this.menu.on("optionselect",(function(t){e.selectTab($(t.selectedOption).data("id"))}))},selectTab:function(t){var e=this._getTab(t);e[0]!==this.$selectedTab[0]&&(this.deselectTab(),this.$selectedTab=e.addClass("sel").attr("aria-selected","true"),this.makeTabFocusable(e),e.focus(),this.scrollToTab(e),this.menu.$options.removeClass("sel"),this.menu.$options.filter('[data-id="'.concat(e.data("id"),'"]')).addClass("sel"),this.trigger("selectTab",{$tab:e}),$("#content").trigger("scroll"))},deselectTab:function(){var t=this.$selectedTab.removeClass("sel").attr("aria-selected","false");this.$selectedTab=null,this.trigger("deselectTab",{$tab:t})},makeTabFocusable:function(t){var e=this._getTab(t);e[0]!==this.$focusableTab[0]&&(this.$focusableTab.attr("tabindex","-1"),this.$focusableTab=e.attr("tabindex","0"))},scrollToTab:function(t){var e=this._getTab(t),i=this.$tablist.scrollLeft(),s=e.offset().left-this.$tablist.offset().left,a=!1;if(s<0)a=i+s-24;else{var n=e.outerWidth(),r=this.$tablist.prop("clientWidth");s+n>r&&(a=i+(s-(r-n))+24)}!1!==a&&this.$tablist.scrollLeft(a)},updateMenuBtn:function(){Math.floor(this.$tablist.prop("scrollWidth")-48)>this.$container.prop("clientWidth")?(this.$tablist.addClass("scrollable"),this.$menuBtn.removeClass("hidden")):(this.$tablist.removeClass("scrollable"),this.$menuBtn.addClass("hidden"))},_getTab:function(t){if(t instanceof jQuery)return t;if(t instanceof HTMLElement)return $(t);if("string"!=typeof t)throw"Invalid tab ID";var e=this.$tabs.filter('[data-id="'.concat(t,'"]'));if(!e.length)throw"Invalid tab ID: ".concat(t);return e},destroy:function(){this.$container.removeData("tabs"),this.base()}})},5074:function(){Craft.TagSelectInput=Craft.BaseElementSelectInput.extend({searchTimeout:null,searchMenu:null,$container:null,$elementsContainer:null,$elements:null,$addTagInput:null,$spinner:null,_ignoreBlur:!1,init:function(t){var e=this;if(!$.isPlainObject(t)){for(var i={},s=["id","name","tagGroupId","sourceElementId"],a=0;a<s.length&&void 0!==arguments[a];a++)i[s[a]]=arguments[a];t=i}this.base($.extend({},Craft.TagSelectInput.defaults,t)),this.$addTagInput=this.$container.children(".add").children(".text"),this.$spinner=this.$addTagInput.next(),this.addListener(this.$addTagInput,"input",(function(){e.searchTimeout&&clearTimeout(e.searchTimeout),e.searchTimeout=setTimeout(e.searchForTags.bind(e),500)})),this.addListener(this.$addTagInput,"keydown",(function(t){switch(t.keyCode===Garnish.RETURN_KEY&&t.preventDefault(),t.keyCode){case Garnish.RETURN_KEY:return t.preventDefault(),void(this.searchMenu&&this.selectTag(this.searchMenu.$options.filter(".hover")));case Garnish.DOWN_KEY:if(t.preventDefault(),this.searchMenu){var e=this.searchMenu.$options.filter(".hover");if(e.length){var i=e.parent().nextAll().find("a:not(.disabled)").first();i.length&&this.focusOption(i)}else this.focusOption(this.searchMenu.$options.eq(0))}return;case Garnish.UP_KEY:if(t.preventDefault(),this.searchMenu){var s=this.searchMenu.$options.filter(".hover");if(s.length){var a=s.parent().prevAll().find("a:not(.disabled)").last();a.length&&this.focusOption(a)}else this.focusOption(this.searchMenu.$options.eq(this.searchMenu.$options.length-1))}return}})),this.addListener(this.$addTagInput,"focus",(function(){this.searchMenu&&this.searchMenu.show()})),this.addListener(this.$addTagInput,"blur",(function(){var t=this;this._ignoreBlur?this._ignoreBlur=!1:setTimeout((function(){t.searchMenu&&t.searchMenu.hide()}),1)}))},focusOption:function(t){this.searchMenu.$options.removeClass("hover"),t.addClass("hover"),this.searchMenu.$menuList.attr("aria-activedescendant",t.attr("id"))},getAddElementsBtn:$.noop,getElementSortAxis:function(){return null},searchForTags:function(){var t=this;if(this.searchMenu&&this.killSearchMenu(),this.$addTagInput.val()){this.$spinner.removeClass("hidden");for(var e=[],i=0;i<this.$elements.length;i++){var s=$(this.$elements[i]).data("id");s&&e.push(s)}this.settings.sourceElementId&&e.push(this.settings.sourceElementId);var a={search:this.$addTagInput.val(),tagGroupId:this.settings.tagGroupId,excludeIds:e};Craft.sendActionRequest("POST","tags/search-for-tags",{data:a}).then((function(e){t.searchMenu&&t.killSearchMenu(),t.$spinner.addClass("hidden");for(var i,s=$('<div class="menu tagmenu"/>').appendTo(Garnish.$bod),n=$("<ul/>").appendTo(s),r=0;r<e.data.tags.length;r++)i=$("<li/>").appendTo(n),$('<a data-icon="tag"/>').appendTo(i).text(e.data.tags[r].title).data("id",e.data.tags[r].id).addClass(e.data.tags[r].exclude?"disabled":"");e.data.exactMatch||(i=$("<li/>").appendTo(n),$('<a data-icon="plus"/>').appendTo(i).text(a.search)),n.find("a:not(.disabled):first").addClass("hover"),t.searchMenu=new Garnish.Menu(s,{attachToElement:t.$addTagInput,onOptionSelect:t.selectTag.bind(t)}),t.addListener(s,"mousedown",(function(){t._ignoreBlur=!0})),t.searchMenu.show()})).catch((function(e){e.response,t.searchMenu&&t.killSearchMenu(),t.$spinner.addClass("hidden")}))}else this.$spinner.addClass("hidden")},selectTag:function(t){var e=this,i=$(t);if(!i.hasClass("disabled")){var s=i.data("id"),a=i.text(),n=$("<div/>",{class:"element small removable","data-id":s,"data-site-id":this.settings.targetSiteId,"data-label":a,"data-editable":"1"}).appendTo(this.$elementsContainer),r=$("<input/>",{type:"hidden",name:this.settings.name+"[]",value:s}).appendTo(n);$("<button/>",{class:"delete icon",title:Craft.t("app","Remove"),type:"button","aria-label":Craft.t("app","Remove {label}",{label:a})}).appendTo(n);var o=$("<div/>",{class:"label"}).appendTo(n);$("<span/>",{class:"title",text:a}).appendTo(o);var l=-(n.outerWidth()+10);this.$addTagInput.css("margin-"+Craft.left,l+"px");var h={};if(h["margin-"+Craft.left]=0,this.$addTagInput.velocity(h,"fast"),this.$elements=this.$elements.add(n),this.addElements(n),this.killSearchMenu(),this.$addTagInput.val(""),this.$addTagInput.trigger("focus"),!s){n.addClass("loading disabled");var d={groupId:this.settings.tagGroupId,title:a};Craft.sendActionRequest("POST","tags/create-tag",{data:d}).then((function(t){n.attr("data-id",t.data.id),r.val(t.data.id),n.removeClass("loading disabled")})).catch((function(t){t.response,e.removeElement(n),Craft.cp.displayError(Craft.t("app","A server error occurred."))}))}}},killSearchMenu:function(){this.searchMenu.hide(),this.searchMenu.destroy(),this.searchMenu=null}},{defaults:{tagGroupId:null}})},3958:function(){Craft.ThumbsElementIndexView=Craft.BaseElementIndexView.extend({getElementContainer:function(){return this.$container.children("ul")}})},1592:function(){Craft.ui={createButton:function(t){var e=$("<button/>",{type:t.type||"button",class:"btn"});return t.id&&e.attr("id",t.id),t.class&&e.addClass(t.class),t.ariaLabel&&e.attr("aria-label",t.ariaLabel),t.role&&e.attr("role",t.role),t.html?e.html(t.html):t.label?e.append($('<div class="label"/>').text(t.label)):e.addClass("btn-empty"),t.toggle&&e.attr("aria-expanded","false"),t.controls&&e.attr("aria-controls",t.controls),t.spinner&&e.append($('<div class="spinner spinner-absolute"/>')),e},createSubmitButton:function(t){var e=this.createButton(Object.assign({},t,{type:"submit",label:t.label||Craft.t("app","Submit")}));return e.addClass("submit"),e},createTextInput:function(t){t=$.extend({autocomplete:!1},t);var e=$("<input/>",{attr:{class:"text",type:t.type||"text",inputmode:t.inputmode,id:t.id,size:t.size,name:t.name,value:t.value,maxlength:t.maxlength,autofocus:this.getAutofocusValue(t.autofocus),autocomplete:"boolean"==typeof t.autocomplete?t.autocomplete?"on":"off":t.autocomplete,disabled:this.getDisabledValue(t.disabled),readonly:t.readonly,title:t.title,placeholder:t.placeholder,step:t.step,min:t.min,max:t.max}});return t.class&&e.addClass(t.class),t.placeholder&&e.addClass("nicetext"),"password"===t.type&&e.addClass("password"),t.disabled&&e.addClass("disabled"),t.size||e.addClass("fullwidth"),t.showCharsLeft&&t.maxlength&&e.attr("data-show-chars-left").css("padding-"+("ltr"===Craft.orientation?"right":"left"),7.2*t.maxlength.toString().length+14+"px"),(t.placeholder||t.showCharsLeft)&&new Garnish.NiceText(e),"password"===t.type?$('<div class="passwordwrapper"/>').append(e):e},createTextField:function(t){return t.id||(t.id="text"+Math.floor(1e9*Math.random())),this.createField(this.createTextInput(t),t)},createCopyTextInput:function(t){var e=t.id||"copytext"+Math.floor(1e9*Math.random()),i=t.buttonId||"".concat(e,"-btn"),s=$("<div/>",{class:"copytext"}),a=this.createTextInput($.extend({},t,{readonly:!0})).appendTo(s);return $("<button/>",{type:"button",id:i,class:"btn","data-icon":"clipboard",title:Craft.t("app","Copy to clipboard"),"aria-label":Craft.t("app","Copy to clipboard")}).appendTo(s).on("click",(function(){a[0].select(),document.execCommand("copy"),Craft.cp.displayNotice(Craft.t("app","Copied to clipboard.")),s.trigger("copy"),a[0].setSelectionRange(0,0)})),s},createCopyTextBtn:function(t){var e=t.id||"copytext"+Math.floor(1e9*Math.random()),i=t.value,s=$("<div/>",{id:e,class:"copytextbtn",role:"button",title:Craft.t("app","Copy to clipboard"),"aria-label":Craft.t("app","Copy to clipboard"),tabindex:"0"});t.class&&s.addClass(t.class);var a=$("<input/>",{value:i,readonly:!0,size:i.length,tabindex:"-1"}).appendTo(s),n=($("<span/>",{"data-icon":"clipboard","aria-hidden":"true"}).appendTo(s),function(){a[0].select(),document.execCommand("copy"),Craft.cp.displayNotice(Craft.t("app","Copied to clipboard.")),s.trigger("copy"),a[0].setSelectionRange(0,0),s.focus()});return s.on("click",(function(){n()})),s.on("keydown",(function(t){t.keyCode===Garnish.SPACE_KEY&&(n(),t.preventDefault())})),s},createCopyTextField:function(t){return t.id||(t.id="copytext"+Math.floor(1e9*Math.random())),this.createField(this.createCopyTextInput(t),t)},createCopyTextPrompt:function(t){var e=$("<div/>",{class:"modal fitted"}),i=$("<div/>",{class:"body"}).appendTo(e);this.createCopyTextField($.extend({size:Math.max(Math.min(t.value.length,50),25)},t)).appendTo(i);var s=i.find("label");s.length>0&&s.attr("id")&&e.attr("aria-labelledby",s.attr("id"));var a=new Garnish.Modal(e,{closeOtherModals:!1});return e.on("copy",(function(){a.hide()})),e},createTextarea:function(t){var e=$("<textarea/>",{class:"text",rows:t.rows||2,cols:t.cols||50,id:t.id,name:t.name,maxlength:t.maxlength,autofocus:t.autofocus&&!Garnish.isMobileBrowser(!0),disabled:!!t.disabled,placeholder:t.placeholder,html:t.value});return t.showCharsLeft&&e.attr("data-show-chars-left",""),t.class&&e.addClass(t.class),t.size||e.addClass("fullwidth"),e},createTextareaField:function(t){return t.id||(t.id="textarea"+Math.floor(1e9*Math.random())),this.createField(this.createTextarea(t),t)},createSelect:function(t){var e=$("<div/>",{class:"select"});t.class&&e.addClass(t.class);var i=$("<select/>",{id:t.id,name:t.name,autofocus:t.autofocus&&Garnish.isMobileBrowser(!0),disabled:t.disabled,"data-target-prefix":t.targetPrefix,"aria-labelledby":t.labelledBy}).appendTo(e);if($.isPlainObject(t.options)){var s=[];for(var a in t.options)if(t.options.hasOwnProperty(a)){var n=t.options[a];$.isPlainObject(n)?void 0!==n.optgroup?s.push(n):s.push({label:n.label,value:void 0!==n.value?n.value:a,disabled:void 0!==n.disabled&&n.disabled}):s.push({label:n,value:a})}t.options=s}for(var r=null,o=0;o<t.options.length;o++){var l=t.options[o];void 0!==l.optgroup?r=$("<optgroup/>",{label:l.label}).appendTo(i):$("<option/>",{value:l.value,selected:l.value==t.value,disabled:void 0!==l.disabled&&l.disabled,html:l.label}).appendTo(r||i)}return t.toggle&&(i.addClass("fieldtoggle"),new Craft.FieldToggle(i)),e},createSelectField:function(t){return t.id||(t.id="select"+Math.floor(1e9*Math.random())),this.createField(this.createSelect(t),t)},createCheckbox:function(t){var e=t.id||"checkbox"+Math.floor(1e9*Math.random()),i=$("<input/>",{type:"checkbox",value:void 0!==t.value?t.value:"1",id:e,class:"checkbox",name:t.name,checked:t.checked?"checked":null,autofocus:this.getAutofocusValue(t.autofocus),disabled:this.getDisabledValue(t.disabled),"data-target":t.toggle,"data-reverse-target":t.reverseToggle});t.class&&i.addClass(t.class),(t.toggle||t.reverseToggle)&&(i.addClass("fieldtoggle"),new Craft.FieldToggle(i));var s=$("<label/>",{for:e,html:t.label});return t.name&&(t.name.length<3||"[]"!==t.name.slice(-2))?$([$("<input/>",{type:"hidden",name:t.name,value:""})[0],i[0],s[0]]):$([i[0],s[0]])},createCheckboxField:function(t){t.id||(t.id="checkbox"+Math.floor(1e9*Math.random()));var e=$('<div class="field checkboxfield"/>',{id:"".concat(t.id,"-field")});return t.first&&e.addClass("first"),t.instructions&&e.addClass("has-instructions"),this.createCheckbox(t).appendTo(e),t.instructions&&$('<div class="instructions"/>').text(t.instructions).appendTo(e),e},createCheckboxSelect:function(t){var e,i,s=$('<fieldset class="checkbox-select"/>');t.class&&s.addClass(t.class),t.showAllOption?(e=t.allValue||"*",i=t.values==e,$("<div/>").appendTo(s).append(this.createCheckbox({id:t.id,class:"all",label:"<b>"+(t.allLabel||Craft.t("app","All"))+"</b>",name:t.name,value:e,checked:i,autofocus:t.autofocus}))):i=!1;for(var a=0;a<t.options.length;a++){var n=t.options[a];n.value!=e&&$("<div/>").appendTo(s).append(this.createCheckbox({label:n.label,name:t.name?t.name+"[]":null,value:n.value,checked:i||(t.values||[]).includes(n.value),disabled:i}))}return new Garnish.CheckboxSelect(s),s},createCheckboxSelectField:function(t){return t.fieldset=!0,t.id||(t.id="checkboxselect"+Math.floor(1e9*Math.random())),this.createField(this.createCheckboxSelect(t),t)},createLightswitch:function(t){var e=t.value||"1",i=t.indeterminateValue||"-",s=$("<button/>",{type:"button",class:"lightswitch","data-value":e,"data-indeterminate-value":i,id:t.id,role:"switch","aria-checked":t.on?"true":t.indeterminate?"mixed":"false","aria-labelledby":t.labelId,"data-target":t.toggle,"data-reverse-target":t.reverseToggle});return t.on?s.addClass("on"):t.indeterminate&&s.addClass("indeterminate"),t.small&&s.addClass("small"),t.disabled&&s.addClass("disabled"),$('<div class="lightswitch-container"><div class="handle"></div></div>').appendTo(s),t.name&&$("<input/>",{type:"hidden",name:t.name,value:t.on?e:t.indeterminate?i:"",disabled:t.disabled}).appendTo(s),(t.toggle||t.reverseToggle)&&(s.addClass("fieldtoggle"),new Craft.FieldToggle(s)),new Craft.LightSwitch(s,{onChange:t.onChange||$.noop}),s},createLightswitchField:function(t){return t.id||(t.id="lightswitch"+Math.floor(1e9*Math.random())),t.labelId||(t.labelId="".concat(t.id,"-label")),this.createField(this.createLightswitch(t),t).addClass("lightswitch-field")},createColorInput:function(t){var e=t.id||"color"+Math.floor(1e9*Math.random()),i=t.containerId||e+"-container",s=t.name||null,a=t.value||null,n=t.small||!1,r=t.autofocus&&Garnish.isMobileBrowser(!0),o=t.disabled||!1,l=$("<div/>",{id:i,class:"flex color-container"}),h=$("<div/>",{class:"color static"+(n?" small":"")}).appendTo(l),d=($("<div/>",{class:"color-preview",style:t.value?{backgroundColor:t.value}:null}).appendTo(h),$("<div/>",{class:"color-input-container"}).append($("<div/>",{class:"color-hex-indicator light code","aria-hidden":"true",text:"#"})).appendTo(l));return this.createTextInput({id:e,name:s,value:Craft.ltrim(a,"#"),size:10,class:"color-input",autofocus:r,disabled:o,"aria-label":Craft.t("app","Color hex value")}).appendTo(d),new Craft.ColorInput(l),l},createColorField:function(t){return t.fieldset=!0,o,t.id||(t.id="color"+Math.floor(1e9*Math.random())),this.createField(this.createColorInput(t),t)},createDateInput:function(t){var e=Garnish.isMobileBrowser(),i=(t.id||"date"+Math.floor(1e9*Math.random()))+"-date",s=t.name||null,a=s?s+"[date]":null,n=t.value&&"function"==typeof t.value.getMonth?t.value:null,r=t.autofocus&&Garnish.isMobileBrowser(!0),o=t.disabled||!1,l=$("<div/>",{class:"datewrapper"}),h=this.createTextInput({id:i,type:e?"date":"text",class:!(!e||n)&&"empty-value",name:a,value:n?e?n.toISOString().split("T")[0]:Craft.formatDate(n):"",placeholder:" ",autocomplete:!1,autofocus:r,disabled:o}).appendTo(l);return $('<div data-icon="date"></div>').appendTo(l),s&&$("<input/>",{type:"hidden",name:s+"[timezone]",val:Craft.timezone}).appendTo(l),e?h.datetimeinput():h.datepicker($.extend({defaultDate:n||new Date},Craft.datepickerOptions)),t.hasOuterContainer?l:$('<div class="datetimewrapper"/>').append(l).datetime()},createDateField:function(t){return t.id||(t.id="date"+Math.floor(1e9*Math.random())),this.createField(this.createDateInput(t),t)},createDateRangePicker:function(t){var e=new Date,i=new Date(e.getFullYear(),e.getMonth(),e.getDate());t=$.extend({class:"",options:["today","thisWeek","thisMonth","thisYear","past7Days","past30Days","past90Days","pastYear"],onChange:$.noop,selected:null,startDate:null,endDate:null},t);var s,a,n=$("<div/>",{class:"menu"}),r=$("<ul/>",{class:"padded"}).appendTo(n),o=$("<a/>").addClass("sel").text(Craft.t("app","All")).data("handle","all");$("<li/>").append(o).appendTo(r);for(var l=0;l<t.options.length;l++){var h=t.options[l];switch(h){case"today":s={label:Craft.t("app","Today"),startDate:i,endDate:i};break;case"thisWeek":var d=e.getDay()-Craft.datepickerOptions.firstDay;d<0&&(d+=7),s={label:Craft.t("app","This week"),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-d),endDate:i};break;case"thisMonth":s={label:Craft.t("app","This month"),startDate:new Date(e.getFullYear(),e.getMonth()),endDate:i};break;case"thisYear":s={label:Craft.t("app","This year"),startDate:new Date(e.getFullYear(),0),endDate:i};break;case"past7Days":s={label:Craft.t("app","Past {num} days",{num:7}),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-7),endDate:i};break;case"past30Days":s={label:Craft.t("app","Past {num} days",{num:30}),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-30),endDate:i};break;case"past90Days":s={label:Craft.t("app","Past {num} days",{num:90}),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-90),endDate:i};break;case"pastYear":s={label:Craft.t("app","Past year"),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-365),endDate:i}}var c=$("<li/>"),u=$("<a/>",{text:s.label}).data("handle",h).data("startDate",s.startDate).data("endDate",s.endDate).data("startTime",s.startDate?s.startDate.getTime():null).data("endTime",s.endDate?s.endDate.getTime():null);t.selected&&h==t.selected&&(a=u[0]),c.append(u),c.appendTo(r)}$("<hr/>").appendTo(n);var p=$("<div/>",{class:"flex flex-nowrap padded"}).appendTo(n),f=this.createDateField({label:Craft.t("app","From")}).appendTo(p).find("input"),g=this.createDateField({label:Craft.t("app","To")}).appendTo(p).find("input"),m=f.add(g);m.on("keyup",(function(t){t.keyCode===Garnish.ESC_KEY&&$(this).data("datepicker")&&$(this).data("datepicker").dpDiv.is(":visible")&&t.stopPropagation()})),f.data("datepicker")&&f.data("datepicker").dpDiv.on("mousedown",(function(t){t.stopPropagation()})),g.data("datepicker")&&g.data("datepicker").dpDiv.on("mousedown",(function(t){t.stopPropagation()}));var v=new Garnish.Menu(n,{onOptionSelect:function(e){var i=$(e);C.text(i.text()),v.setPositionRelativeToAnchor(),n.find(".sel").removeClass("sel"),i.addClass("sel"),f.datepicker("setDate",i.data("startDate")),g.datepicker("setDate",i.data("endDate")),t.onChange(i.data("startDate")||null,i.data("endDate")||null,i.data("handle"))}});m.on("change",(function(){for(var e,i=f.datepicker("getDate"),s=g.datepicker("getDate"),a=i?i.getTime():null,o=s?s.getTime():null,l=r.find("a"),h=!1,d=0;d<l.length;d++)if(a===((e=l.eq(d)).data("startTime")||null)&&o===(e.data("endTime")||null)){v.selectOption(e[0]),h=!0,t.onChange(null,null,e.data("handle"));break}h||(n.find(".sel").removeClass("sel"),p.addClass("sel"),a||o?a&&o?C.text(f.val()+" - "+g.val()):a?C.text(Craft.t("app","From {date}",{date:f.val()})):C.text(Craft.t("app","To {date}",{date:g.val()})):C.text(Craft.t("app","All")),v.setPositionRelativeToAnchor(),t.onChange(i,s,"custom"))})),v.on("hide",(function(){f.datepicker("hide"),g.datepicker("hide")}));var b="btn menubtn";t.class&&(b=b+" "+t.class);var C=$("<button/>",{type:"button",class:b,"data-icon":"date",text:Craft.t("app","All")});return new Garnish.MenuBtn(C,v),a&&v.selectOption(a),t.startDate&&f.datepicker("setDate",t.startDate),t.endDate&&g.datepicker("setDate",t.endDate),(t.startDate||t.endDate)&&m.trigger("change"),C},createTimeInput:function(t){var e=Garnish.isMobileBrowser(),i=(t.id||"time"+Math.floor(1e9*Math.random()))+"-time",s=t.name||null,a=s?s+"[time]":null,n=t.value&&"function"==typeof t.value.getMonth?t.value:null,r=t.autofocus&&Garnish.isMobileBrowser(!0),o=t.disabled||!1,l=$("<div/>",{class:"timewrapper"}),h=this.createTextInput({id:i,type:e?"time":"text",class:!(!e||n)&&"empty-value",name:a,placeholder:" ",autocomplete:!1,autofocus:r,disabled:o}).appendTo(l);return $('<div data-icon="time"></div>').appendTo(l),s&&$("<input/>",{type:"hidden",name:s+"[timezone]",val:Craft.timezone}).appendTo(l),e?(n&&h.val(n.toISOString().split("T")[1]),h.datetimeinput()):(h.timepicker(Craft.timepickerOptions),n&&h.timepicker("setTime",3600*n.getHours()+60*n.getMinutes()+n.getSeconds())),t.hasOuterContainer?l:$('<div class="datetimewrapper"/>').append(l).datetime()},createTimeField:function(t){return t.id||(t.id="time"+Math.floor(1e9*Math.random())),this.createField(this.createTimeInput(t),t)},createField:function(t,e){var i=e.label&&"__blank__"!==e.label?e.label:null,s=$(e.fieldset?"<fieldset/>":"<div/>",{class:"field",id:e.fieldId||(e.id?e.id+"-field":null)});if(e.first&&s.addClass("first"),e.fieldClass&&s.addClass(e.fieldClass),i&&e.fieldset&&$("<legend/>",{text:i,class:"visually-hidden","data-label":i}).appendTo(s),i){var a=$('<div class="heading"/>').appendTo(s);$(e.fieldset?"<legend/>":"<label/>",{id:e.labelId||(e.id?"".concat(e.id,"-").concat(e.fieldset?"legend":"label"):null),class:e.required?"required":null,for:!e.fieldset&&e.id||null,text:i}).appendTo(a)}if(e.instructions&&$('<div class="instructions"/>').text(e.instructions).appendTo(s),$('<div class="input"/>').append(t).appendTo(s),e.tip){var n=$('<p class="notice has-icon"/>');$('<span class="icon" aria-hidden="true"/>').appendTo(n),$('<span class="visually-hidden"/>').text(Craft.t("app","Tip")+": ").appendTo(n),$("<span/>").text(e.tip).appendTo(n),n.appendTo(s)}if(e.warning){var r=$('<p class="warning has-icon"/>');$('<span class="icon" aria-hidden="true"/>').appendTo(r),$('<span class="visually-hidden"/>').text(Craft.t("app","Warning")+": ").appendTo(r),$("<span/>").text(e.warning).appendTo(r),r.appendTo(s)}return e.errors&&this.addErrorsToField(s,e.errors),s},createErrorList:function(t){var e=$('<ul class="errors"/>');return t&&this.addErrorsToList(e,t),e},addErrorsToList:function(t,e){for(var i=0;i<e.length;i++)$("<li/>").text(e[i]).appendTo(t)},addErrorsToField:function(t,e){if(e){t.addClass("has-errors"),t.children(".input").addClass("errors");var i=t.children("ul.errors");i.length||(i=this.createErrorList().appendTo(t)),this.addErrorsToList(i,e)}},clearErrorsFromField:function(t){t.removeClass("has-errors"),t.children(".input").removeClass("errors"),t.children("ul.errors").remove()},getAutofocusValue:function(t){return t&&!Garnish.isMobileBrowser(!0)?"autofocus":null},getDisabledValue:function(t){return t?"disabled":null}}},1752:function(){Craft.Uploader=Garnish.Base.extend({uploader:null,allowedKinds:null,$element:null,settings:null,_rejectedFiles:{},_extensionList:null,_totalFileCounter:0,_validFileCounter:0,init:function(t,e){this._rejectedFiles={size:[],type:[],limit:[]},this.$element=t,this.allowedKinds=null,this._extensionList=null,this._totalFileCounter=0,this._validFileCounter=0;var i=(e=$.extend({},Craft.Uploader.defaults,e)).events;for(var s in delete e.events,e.allowedKinds&&e.allowedKinds.length&&("string"==typeof e.allowedKinds&&(e.allowedKinds=[e.allowedKinds]),this.allowedKinds=e.allowedKinds,delete e.allowedKinds),e.autoUpload=!1,this.uploader=this.$element.fileupload(e),i)i.hasOwnProperty(s)&&this.uploader.on(s,i[s]);this.settings=e,this.uploader.on("fileuploadadd",this.onFileAdd.bind(this))},setParams:function(t){void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(t[Craft.csrfTokenName]=Craft.csrfTokenValue),this.uploader.fileupload("option",{formData:t})},getInProgress:function(){return this.uploader.fileupload("active")},isLastUpload:function(){return this.getInProgress()<2},onFileAdd:function(t,e){var i=this;t.stopPropagation();var s=!1;return this.allowedKinds&&(this._extensionList||this._createExtensionList(),s=!0),e.process().done((function(){var t=e.files[0],a=!0;if(s){var n=t.name.match(/\.([a-z0-4_]+)$/i)[1];-1===$.inArray(n.toLowerCase(),i._extensionList)&&(a=!1,i._rejectedFiles.type.push("“"+t.name+"”"))}t.size>i.settings.maxFileSize&&(i._rejectedFiles.size.push("“"+t.name+"”"),a=!1),a&&"function"==typeof i.settings.canAddMoreFiles&&!i.settings.canAddMoreFiles(i._validFileCounter)&&(i._rejectedFiles.limit.push("“"+t.name+"”"),a=!1),a&&(i._validFileCounter++,e.submit()),++i._totalFileCounter===e.originalFiles.length&&(i._totalFileCounter=0,i._validFileCounter=0,i.processErrorMessages())})),!0},processErrorMessages:function(){var t;this._rejectedFiles.type.length&&(t=1===this._rejectedFiles.type.length?"The file {files} could not be uploaded. The allowed file kinds are: {kinds}.":"The files {files} could not be uploaded. The allowed file kinds are: {kinds}.",t=Craft.t("app",t,{files:this._rejectedFiles.type.join(", "),kinds:this.allowedKinds.join(", ")}),this._rejectedFiles.type=[],alert(t)),this._rejectedFiles.size.length&&(t=1===this._rejectedFiles.size.length?"The file {files} could not be uploaded, because it exceeds the maximum upload size of {size}.":"The files {files} could not be uploaded, because they exceeded the maximum upload size of {size}.",t=Craft.t("app",t,{files:this._rejectedFiles.size.join(", "),size:this.humanFileSize(Craft.maxUploadSize)}),this._rejectedFiles.size=[],alert(t)),this._rejectedFiles.limit.length&&(t=1===this._rejectedFiles.limit.length?"The file {files} could not be uploaded, because the field limit has been reached.":"The files {files} could not be uploaded, because the field limit has been reached.",t=Craft.t("app",t,{files:this._rejectedFiles.limit.join(", ")}),this._rejectedFiles.limit=[],alert(t))},humanFileSize:function(t){var e=1024;if(t<e)return t+" B";var i=-1;do{t/=e,++i}while(t>=e);return t.toFixed(1)+" "+["kB","MB","GB","TB","PB","EB","ZB","YB"][i]},_createExtensionList:function(){this._extensionList=[];for(var t=0;t<this.allowedKinds.length;t++){var e=this.allowedKinds[t];if(void 0!==Craft.fileKinds[e])for(var i=0;i<Craft.fileKinds[e].extensions.length;i++){var s=Craft.fileKinds[e].extensions[i];this._extensionList.push(s)}}},destroy:function(){this.$element.fileupload("destroy"),this.base()}},{defaults:{dropZone:null,pasteZone:null,fileInput:null,sequentialUploads:!0,maxFileSize:Craft.maxUploadSize,allowedKinds:null,events:{},canAddMoreFiles:null,headers:{Accept:"application/json;q=0.9,*/*;q=0.8"},paramName:"assets-upload"}})},7e3:function(){Craft.UriFormatGenerator=Craft.BaseInputGenerator.extend({generateTargetValue:function(t){t=(t=t.replace("/<(.*?)>/g","")).toLowerCase(),t=(t=(t=Craft.asciiString(t)).replace(/^[^a-z]+/,"")).replace(/[^a-z0-9]+$/,"");var e=Craft.filterArray(t.split(/[^a-z0-9]+/)).join(Craft.slugWordSeparator);return e&&this.settings.suffix&&(e+=this.settings.suffix),e}})},8654:function(){Craft.UserIndex=Craft.BaseElementIndex.extend({init:function(t,e,i){this.on("selectSource",this.updateUrl.bind(this)),this.base(t,e,i)},getDefaultSourceKey:function(){if("index"===this.settings.context&&"undefined"!=typeof defaultSourceSlug)for(var t=0;t<this.$sources.length;t++){var e=$(this.$sources[t]);if(e.data("slug")===defaultSourceSlug)return e.data("key")}return this.base()},updateUrl:function(){if("index"===this.settings.context){var t="users",e=this.$source.data("slug");e&&(t+="/".concat(e)),Craft.setPath(t)}}}),Craft.registerElementIndexClass("craft\\elements\\User",Craft.UserIndex)},5537:function(){},9383:function(){},6558:function(t,e,i){var s=i(5537);s.__esModule&&(s=s.default),"string"==typeof s&&(s=[[t.id,s,""]]),s.locals&&(t.exports=s.locals),(0,i(9673).Z)("3790022a",s,!0,{})},2179:function(t,e,i){var s=i(9383);s.__esModule&&(s=s.default),"string"==typeof s&&(s=[[t.id,s,""]]),s.locals&&(t.exports=s.locals),(0,i(9673).Z)("80058a3c",s,!0,{})},9673:function(t,e,i){"use strict";function s(t,e){for(var i=[],s={},a=0;a<e.length;a++){var n=e[a],r=n[0],o={id:t+":"+a,css:n[1],media:n[2],sourceMap:n[3]};s[r]?s[r].parts.push(o):i.push(s[r]={id:r,parts:[o]})}return i}i.d(e,{Z:function(){return f}});var a="undefined"!=typeof document;if("undefined"!=typeof DEBUG&&DEBUG&&!a)throw new Error("vue-style-loader cannot be used in a non-browser environment. Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.");var n={},r=a&&(document.head||document.getElementsByTagName("head")[0]),o=null,l=0,h=!1,d=function(){},c=null,u="data-vue-ssr-id",p="undefined"!=typeof navigator&&/msie [6-9]\b/.test(navigator.userAgent.toLowerCase());function f(t,e,i,a){h=i,c=a||{};var r=s(t,e);return g(r),function(e){for(var i=[],a=0;a<r.length;a++){var o=r[a];(l=n[o.id]).refs--,i.push(l)}for(e?g(r=s(t,e)):r=[],a=0;a<i.length;a++){var l;if(0===(l=i[a]).refs){for(var h=0;h<l.parts.length;h++)l.parts[h]();delete n[l.id]}}}}function g(t){for(var e=0;e<t.length;e++){var i=t[e],s=n[i.id];if(s){s.refs++;for(var a=0;a<s.parts.length;a++)s.parts[a](i.parts[a]);for(;a<i.parts.length;a++)s.parts.push(v(i.parts[a]));s.parts.length>i.parts.length&&(s.parts.length=i.parts.length)}else{var r=[];for(a=0;a<i.parts.length;a++)r.push(v(i.parts[a]));n[i.id]={id:i.id,refs:1,parts:r}}}}function m(){var t=document.createElement("style");return t.type="text/css",r.appendChild(t),t}function v(t){var e,i,s=document.querySelector("style["+u+'~="'+t.id+'"]');if(s){if(h)return d;s.parentNode.removeChild(s)}if(p){var a=l++;s=o||(o=m()),e=C.bind(null,s,a,!1),i=C.bind(null,s,a,!0)}else s=m(),e=_.bind(null,s),i=function(){s.parentNode.removeChild(s)};return e(t),function(s){if(s){if(s.css===t.css&&s.media===t.media&&s.sourceMap===t.sourceMap)return;e(t=s)}else i()}}var b,$=(b=[],function(t,e){return b[t]=e,b.filter(Boolean).join("\n")});function C(t,e,i,s){var a=i?"":s.css;if(t.styleSheet)t.styleSheet.cssText=$(e,a);else{var n=document.createTextNode(a),r=t.childNodes;r[e]&&t.removeChild(r[e]),r.length?t.insertBefore(n,r[e]):t.appendChild(n)}}function _(t,e){var i=e.css,s=e.media,a=e.sourceMap;if(s&&t.setAttribute("media",s),c.ssrId&&t.setAttribute(u,e.id),a&&(i+="\n/*# sourceURL="+a.sources[0]+" */",i+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(a))))+" */"),t.styleSheet)t.styleSheet.cssText=i;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(i))}}}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var i=__webpack_module_cache__[t]={id:t,exports:{}};return __webpack_modules__[t](i,i.exports,__webpack_require__),i.exports}__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return __webpack_require__.d(e,{a:e}),e},__webpack_require__.d=function(t,e){for(var i in e)__webpack_require__.o(e,i)&&!__webpack_require__.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)};var __webpack_exports__={};!function(){"use strict";__webpack_require__(2179),__webpack_require__(6558),__webpack_require__(587),__webpack_require__(8960),__webpack_require__(5774),__webpack_require__(8495),__webpack_require__(5970),__webpack_require__(4993),__webpack_require__(8843),__webpack_require__(5759),__webpack_require__(8167),__webpack_require__(4211),__webpack_require__(7745),__webpack_require__(463),__webpack_require__(3839),__webpack_require__(7452),__webpack_require__(6872),__webpack_require__(2495),__webpack_require__(5077),__webpack_require__(4606),__webpack_require__(9222);var t=jQuery,e=__webpack_require__.n(t);function i(t){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i(t)}function s(t,e){if(t){if("string"==typeof t)return a(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(t,e):void 0}}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.CP=Garnish.Base.extend({authManager:null,$nav:null,$navToggle:null,$globalSidebar:null,$globalContainer:null,$mainContainer:null,$alerts:null,$crumbs:null,$breadcrumbList:null,$breadcrumbItems:null,$notificationContainer:null,$main:null,$primaryForm:null,$headerContainer:null,$header:null,$mainContent:null,$details:null,$sidebarContainer:null,$sidebarToggle:null,$sidebar:null,$contentContainer:null,$edition:null,$confirmUnloadForms:null,$deltaForms:null,$collapsibleTables:null,isMobile:null,fixedHeader:!1,breadcrumbListWidth:0,breadcrumbDisclosureItem:'<li class="breadcrumb-toggle-wrapper" data-disclosure-item><button data-disclosure-trigger aria-controls="breadcrumb-disclosure" aria-haspopup="true">'.concat(Craft.t("app","More…"),'</button><div id="breadcrumb-disclosure" class="menu menu--disclosure" data-disclosure-menu><ul></ul></div></li>'),tabManager:null,enableQueue:!0,totalJobs:0,jobInfo:null,displayedJobInfo:null,displayedJobInfoUnchanged:1,trackJobProgressTimeout:null,jobProgressIcon:null,checkingForUpdates:!1,forcingRefreshOnUpdatesCheck:!1,includingDetailsOnUpdatesCheck:!1,checkForUpdatesCallbacks:null,resizeTimeout:null,init:function(){var t=this;0!==Craft.remainingSessionTime&&(this.authManager=new Craft.AuthManager),this.$nav=e()("#nav"),this.$navToggle=e()("#primary-nav-toggle"),this.$globalSidebar=e()("#global-sidebar"),this.$globalContainer=e()("#global-container"),this.$mainContainer=e()("#main-container"),this.$alerts=e()("#alerts"),this.$crumbs=e()("#crumbs"),this.$breadcrumbList=e()(".breadcrumb-list"),this.$breadcrumbItems=e()(".breadcrumb-list li"),this.$notificationContainer=e()("#notifications"),this.$main=e()("#main"),this.$primaryForm=e()("#main-form"),this.$headerContainer=e()("#header-container"),this.$header=e()("#header"),this.$mainContent=e()("#main-content"),this.$details=e()("#details"),this.$sidebarContainer=e()("#sidebar-container"),this.$sidebarToggle=e()("#sidebar-toggle"),this.$sidebar=e()("#sidebar"),this.$contentContainer=e()("#content-container"),this.$collapsibleTables=e()("table.collapsible"),this.isMobile=Garnish.isMobileBrowser(),this.updateContentHeading();for(var i=this.$details.find(".meta > .field > .instructions"),a=0;a<i.length;a++){var n=i.eq(a),r=n.siblings(".heading").children("label");e()("<span/>",{class:"info",html:n.children().html()}).appendTo(r),n.remove()}if(!this.isMobile&&this.$header.length&&(this.addListener(Garnish.$win,"scroll","updateFixedHeader"),this.updateFixedHeader()),Garnish.$doc.ready((function(){t.addListener(Garnish.$win,"resize",(function(e){if(e.target===window){t.handleWindowResize(),clearTimeout(t.resizeTimeout);var i=t;t.resizeTimeout=setTimeout((function(){i.setSidebarNavAttributes()}),100)}})),t.handleWindowResize(),t.setSidebarNavAttributes(),Garnish.requestAnimationFrame(t.initSpecialForms.bind(t))})),this.$alerts.length&&this.initAlerts(),this.addListener(this.$navToggle,"click","toggleNav"),this.addListener(this.$sidebarToggle,"click","toggleSidebar"),this.$primaryForm.length||(this.$primaryForm=e()("form[data-saveshortcut]:first")),this.$primaryForm.length&&Garnish.hasAttr(this.$primaryForm,"data-saveshortcut")&&function(){var e=[],i=t.$primaryForm.data("actions");if(void 0===i)e.push([{keyCode:Garnish.S_KEY,ctrl:!0},{redirect:t.$primaryForm.data("saveshortcut-redirect"),retainScroll:Garnish.hasAttr(t.$primaryForm,"saveshortcut-scroll")}]);else for(var s=0;s<i.length;s++){var a=i[s];a.shortcut&&e.push([{keyCode:Garnish.S_KEY,ctrl:!0,shift:!!a.shift},{action:a.action,redirect:a.redirect,confirm:a.confirm,params:a.params,data:a.data,retainScroll:a.retainScroll}])}for(var n=function(i){Garnish.uiLayerManager.registerShortcut(e[i][0],(function(){t.submitPrimaryForm(e[i][1])}))},r=0;r<e.length;r++)n(r)}(),this.initTabs(),this.tabManager&&window.LOCATION_HASH){var o=this.tabManager.$tabs.filter('[href="#'.concat(window.LOCATION_HASH,'"]'));o.length&&this.tabManager.selectTab(o)}var l=Craft.getLocalStorage("scrollY");if(void 0!==l&&(Craft.removeLocalStorage("scrollY"),Garnish.$doc.ready((function(){Garnish.requestAnimationFrame((function(){window.scrollTo(0,l)}))}))),e().isTouchCapable()&&(this.$mainContainer.on("focus","input, textarea, .focusable-input",this._handleInputFocus.bind(this)),this.$mainContainer.on("blur","input, textarea, .focusable-input",this._handleInputBlur.bind(this))),Craft.announcements.length){var h,d,c=e()("#announcements-btn").removeClass("hidden"),u=Craft.announcements.some((function(t){return t.unread}));u&&(h=e()("<span/>",{class:"visually-hidden",html:Craft.t("app","Unread messages")}),c.addClass("unread").append(h)),this.addListener(c,"click",(function(){if(d)d.show();else{var t="";Craft.announcements.forEach((function(e){t+='<div class="announcement '.concat(e.unread?"unread":"",'" role="listitem">')+'<div class="announcement__header">'+'<h3 class="announcement__heading h2">'.concat(e.heading,"</h3>")+'<div class="announcement-label-container">'+'<div class="announcement-icon" aria-hidden="true">'.concat(e.icon,"</div>")+'<div class="announcement-label">'.concat(e.label,"</div>")+"</div></div>"+"<p>".concat(e.body,"</p>")+"</div>"})),d=new Garnish.HUD(c,'<h2 class="visually-hidden">'.concat(Craft.t("app","Announcements"),'</h2><div id="announcements" role="list">').concat(t,"</div>"),{onShow:function(){c.addClass("active")},onHide:function(){c.removeClass("active")}}),e()("a",d.$main).each((function(){this.hostname.length&&this.hostname!==location.hostname&&void 0===e()(this).attr("target")&&e()(this).attr("rel","noopener").attr("target","_blank")})),u&&(c.removeClass("unread"),h.remove(),Craft.sendActionRequest("POST","users/mark-announcements-as-read",{data:{ids:Craft.announcements.map((function(t){return t.id}))}}))}}))}var p=document.getElementById("footer");p&&new IntersectionObserver((function(t){var e=function(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(t,e)||s(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(t,1)[0];e.target.classList.toggle("stuck",e.intersectionRatio<1)}),{rootMargin:"0px 0px -1px 0px",threshold:[1]}).observe(p)},get $contentHeader(){var t=e()("#content-header");return t.length?t:e()("<header/>",{id:"content-header",class:"pane-header"}).prependTo(e()("#content"))},get $noticeContainer(){var t=e()("#content-notice");return t.length?t:e()('<div id="content-notice"/>').attr("role","status").prependTo(this.$contentHeader)},initSpecialForms:function(){var t=this;if(this.$confirmUnloadForms=e()("form[data-confirm-unload]"),this.$deltaForms=e()("form[data-delta]"),this.$confirmUnloadForms.length){for(var i=this.$confirmUnloadForms.add(this.$deltaForms),s=function(e){var s=i.eq(e),a=void 0;s.data("initialSerializedValue")||(a="function"==typeof s.data("serializer")?s.data("serializer")():s.serialize(),s.data("initialSerializedValue",a)),t.addListener(s,"submit",(function(t){if(Garnish.hasAttr(s,"data-confirm-unload")&&this.removeListener(Garnish.$win,"beforeunload"),Garnish.hasAttr(s,"data-delta")){var e;t.preventDefault(),e="function"==typeof s.data("serializer")?s.data("serializer")():s.serialize();var i=Craft.findDeltaData(s.data("initialSerializedValue"),e,s.data("delta-names"),null,s.data("initial-delta-values"),s.data("modified-delta-names"));Craft.createForm(i).appendTo(Garnish.$bod).submit()}}))},a=0;a<i.length;a++)s(a);this.addListener(Garnish.$win,"beforeunload",(function(t){var e=!1;if(void 0!==Craft.livePreview&&Craft.livePreview.inPreviewMode)e=!0;else for(var i=0;i<this.$confirmUnloadForms.length;i++){var s,a=this.$confirmUnloadForms.eq(i);if(s="function"==typeof a.data("serializer")?a.data("serializer")():a.serialize(),a.data("initialSerializedValue")!==s){e=!0;break}}if(e){var n=Craft.t("app","Any changes will be lost if you leave this page.");return t?t.originalEvent.returnValue=n:window.event.returnValue=n,n}}))}},_handleInputFocus:function(){this.updateFixedHeader()},_handleInputBlur:function(){this.updateFixedHeader()},submitPrimaryForm:function(t){this.trigger("beforeSaveShortcut"),"object"===i(t)&&e().isPlainObject(t)||(t={}),t.redirect||(t.redirect=this.$primaryForm.data("saveshortcut-redirect")),t.data||(t.data={}),t.data.saveShortcut=!0,Craft.submitForm(this.$primaryForm,t)},updateSidebarMenuLabel:function(){this.updateContentHeading()},updateContentHeading:function(){var t=this.$sidebar.find("a.sel:first"),i=t.children(".label");e()("#content-heading").text(i.length?i.text():t.text()),Garnish.$bod.removeClass("showing-sidebar")},toggleNav:function(){var t=this.navIsExpanded();null!==t&&(t?(this.disableGlobalSidebarLinks(),this.$navToggle.focus(),this.$navToggle.attr("aria-expanded","false"),Garnish.$bod.removeClass("showing-nav")):(this.enableGlobalSidebarLinks(),this.$globalSidebar.find(":focusable")[0].focus(),this.$navToggle.attr("aria-expanded","true"),Garnish.$bod.addClass("showing-nav")))},enableGlobalSidebarLinks:function(){var t=this.$globalSidebar.find(":focusable");e()(t).each((function(){e()(this).attr("tabindex","0")}))},disableGlobalSidebarLinks:function(){var t=this.$globalSidebar.find(":focusable");e()(t).each((function(){e()(this).attr("tabindex","-1")}))},setSidebarNavAttributes:function(){var t=this.navIsExpanded();null!==t&&(t?this.enableGlobalSidebarLinks():this.disableGlobalSidebarLinks())},navIsExpanded:function(){if(!this.$globalSidebar[0])return null;var t=getComputedStyle(this.$globalSidebar[0]).getPropertyValue("--is-always-visible").trim();return"true"===this.$navToggle.attr("aria-expanded")||"true"===t},toggleSidebar:function(){var t="true"===this.$sidebarToggle.attr("aria-expanded")?"false":"true";this.$sidebarToggle.attr("aria-expanded",t),Garnish.$bod.toggleClass("showing-sidebar")},initTabs:function(){this.tabManager&&(this.tabManager.destroy(),this.tabManager=null);var t=e()("#tabs");t.length&&(this.tabManager=new Craft.Tabs(t),this.tabManager.on("selectTab",(function(t){var i=t.$tab.attr("href");if(i&&"#"===i.charAt(0)&&e()(i).removeClass("hidden"),Garnish.$win.trigger("resize"),Garnish.$doc.trigger("scroll"),i&&"#"===i.charAt(0)){var s=e()("#context-btn").menubtn().data("menubtn");if(s)for(var a=0;a<s.menu.$options.length;a++){var n=s.menu.$options[a];n.href&&(n.href=n.href.match(/^[^#]*/)[0]+i)}}"undefined"!=typeof history&&Garnish.requestAnimationFrame((function(){history.replaceState(void 0,void 0,i)}))})),this.tabManager.on("deselectTab",(function(t){var i=t.$tab.attr("href");i&&"#"===i.charAt(0)&&e()(t.$tab.attr("href")).addClass("hidden")})))},updateTabs:function(t){if(t){var i=e()(t).attr("id","tabs");this.tabManager?this.tabManager.$container.replaceWith(i):i.appendTo(this.$contentHeader),this.initTabs()}else this.tabManager&&(this.tabManager.$container.siblings().length?this.tabManager.$container.remove():this.tabManager.$container.parent().remove(),this.tabManager.destroy(),this.tabManager=null)},get $tabsContainer(){return this.tabManager?this.tabManager.$container:void 0},get $tabsList(){return this.tabManager?this.tabManager.$tablist:void 0},get $tabs(){return this.tabManager?this.tabManager.$tablist.find("> a"):void 0},get $selectedTab(){return this.tabManager?this.tabManager.$selectedTab:void 0},get selectedTabIndex(){return this.tabManager?this.tabManager.$tabs.index(this.tabManager.$selectedTab):void 0},get $focusableTab(){return this.tabManager?this.tabManager.$focusableTab:void 0},selectTab:function(t){this.tabManager&&this.tabManager.selectTab(t)},deselectTab:function(){this.tabManager&&this.tabManager.deselectTab()},handleWindowResize:function(){this.updateResponsiveTables(),this.handleBreadcrumbVisibility()},breadcrumbItemsWrap:function(){if(this.$breadcrumbItems[0]){this.$breadcrumbList.css("ltr"===Craft.orientation?"margin-right":"margin-left","");for(var t=this.$breadcrumbList[0].getBoundingClientRect().width,e=0,i=this.$breadcrumbList.find("li"),s=0;s<i.length;s++)e+=i.get(s).getBoundingClientRect().width;return this.breadcrumbListWidth=t,!(e<=t||e<t+1&&(this.$breadcrumbList.css("ltr"===Craft.orientation?"margin-right":"margin-left","-1px"),1))}},handleBreadcrumbVisibility:function(){if(this.breadcrumbItemsWrap()){0===this.$breadcrumbList.find("[data-disclosure-item]").length&&this.$breadcrumbList.append(this.breadcrumbDisclosureItem);var t,e=this.$breadcrumbList.find("[data-disclosure-item]")[0].offsetWidth,i=this.breadcrumbListWidth;this.$breadcrumbItems.each((function(s){if(!(e+this.offsetWidth<i))return!1;t=s,e+=this.offsetWidth}));var s=this.$breadcrumbItems.slice(0,t+1),a=this.$breadcrumbItems.slice(t+1);this.$breadcrumbList.html(""),this.$breadcrumbList.append(s),this.$breadcrumbList.append(this.breadcrumbDisclosureItem),this.$breadcrumbList.find("[data-disclosure-menu] ul").append(a),this.$breadcrumbList.find("[data-disclosure-trigger]").disclosureMenu()}},updateResponsiveTables:function(){for(this.updateResponsiveTables._i=0;this.updateResponsiveTables._i<this.$collapsibleTables.length;this.updateResponsiveTables._i++)this.updateResponsiveTables._$table=this.$collapsibleTables.eq(this.updateResponsiveTables._i),this.updateResponsiveTables._containerWidth=this.updateResponsiveTables._$table.parent().width(),this.updateResponsiveTables._check=!1,this.updateResponsiveTables._containerWidth>0&&(void 0===this.updateResponsiveTables._$table.data("lastContainerWidth")?this.updateResponsiveTables._check=!0:(this.updateResponsiveTables._isCollapsed=this.updateResponsiveTables._$table.hasClass("collapsed"),this.updateResponsiveTables._containerWidth>this.updateResponsiveTables._$table.data("lastContainerWidth")?this.updateResponsiveTables._isCollapsed&&(this.updateResponsiveTables._$table.removeClass("collapsed"),this.updateResponsiveTables._check=!0):this.updateResponsiveTables._isCollapsed||(this.updateResponsiveTables._check=!0)),this.updateResponsiveTables._check&&this.updateResponsiveTables._$table.width()-30>this.updateResponsiveTables._containerWidth&&this.updateResponsiveTables._$table.addClass("collapsed"),this.updateResponsiveTables._$table.data("lastContainerWidth",this.updateResponsiveTables._containerWidth))},updateFixedHeader:function(){if(!this.isMobile)if(this.$main.length&&this.$headerContainer[0].getBoundingClientRect().top<0){if(!this.fixedHeader){var t=this.$headerContainer.height();this.$contentContainer.css("min-height","calc(100vh - "+(t+14+48-1)+"px)"),this.$headerContainer.height(t),Garnish.$bod.addClass("fixed-header"),this.$contentContainer.outerHeight(),this.$details.outerHeight();var e={top:t+"px","max-height":"calc(100vh - "+t+"px)"};this.$sidebar.addClass("fixed").css(e),this.$details.addClass("fixed").css(e),this.fixedHeader=!0}}else this.fixedHeader&&(this.$headerContainer.height("auto"),Garnish.$bod.removeClass("fixed-header"),this.$contentContainer.css("min-height",""),this.$sidebar.removeClass("fixed").css({top:"","max-height":""}),this.$details.removeClass("fixed").css({top:"","max-height":""}),this.fixedHeader=!1)},displayNotification:function(t,e,i){var s=new Craft.CP.Notification(t,e,i);return this.trigger("displayNotification",{notificationType:t,message:e,notification:s}),s},displayNotice:function(t,e){return this.displayNotification("notice",t,Object.assign({icon:"info",iconLabel:Craft.t("app","Notice")},e))},displaySuccess:function(t,e){return this.displayNotification("success",t,Object.assign({icon:"check",iconLabel:Craft.t("app","Success")},e))},displayError:function(t,e){return t&&"object"!==i(t)||(e=t,t=Craft.t("app","A server error occurred.")),this.displayNotification("error",t,Object.assign({icon:"alert",iconLabel:Craft.t("app","Error")},e))},fetchAlerts:function(){return Craft.queue.push((function(){return new Promise((function(t,e){var i={path:Craft.path};Craft.sendActionRequest("POST","app/get-cp-alerts",{data:i}).then((function(e){var i=e.data;t(i.alerts)})).catch(e)}))}))},displayAlerts:function(t){if(this.$alerts.remove(),Garnish.isArray(t)&&t.length){this.$alerts=e()('<ul id="alerts"/>').prependTo(e()("#page-container"));for(var i=0;i<t.length;i++)e()('<li><span data-icon="alert" aria-label="'.concat(Craft.t("app","Error"),'"></span> ').concat(t[i],"</li>")).appendTo(this.$alerts);var s=this.$alerts.outerHeight();this.$alerts.css("margin-top",-s).velocity({"margin-top":0},"fast"),this.initAlerts()}},initAlerts:function(){for(var t=this,i=this.$alerts.find('a[class^="shun:"]'),s=0;s<i.length;s++)this.addListener(i[s],"click",(function(i){i.preventDefault(),Craft.queue.push((function(){return new Promise((function(s,a){var n=e()(i.currentTarget),r={message:n.prop("className").substring(5)};Craft.sendActionRequest("POST","app/shun-cp-alert",{data:r}).then((function(){n.parent().remove(),s()})).catch((function(e){var i=e.response;t.displayError(i.data.message),a()}))}))}))}))},checkForUpdates:function(t,e,i){var s=this;if("function"==typeof e&&(i=e,e=!1),this.checkingForUpdates&&(!0===t&&!this.forcingRefreshOnUpdatesCheck||!0===e&&!this.includingDetailsOnUpdatesCheck)){var a=i;i=function(){s.checkForUpdates(t,e,a)}}"function"==typeof i&&(Garnish.isArray(this.checkForUpdatesCallbacks)||(this.checkForUpdatesCallbacks=[]),this.checkForUpdatesCallbacks.push(i)),this.checkingForUpdates||(this.checkingForUpdates=!0,this.forcingRefreshOnUpdatesCheck=!0===t,this.includingDetailsOnUpdatesCheck=!0===e,this._checkForUpdates(t,e).then((function(t){if(s.updateUtilitiesBadge(),s.checkingForUpdates=!1,Garnish.isArray(s.checkForUpdatesCallbacks)){var e=s.checkForUpdatesCallbacks;s.checkForUpdatesCallbacks=null;for(var i=0;i<e.length;i++)e[i](t)}s.trigger("checkForUpdates",{updateInfo:t})})))},_checkForUpdates:function(t,e){var i=this;return new Promise((function(s,a){t?i._getUpdates(e).then(s).catch(a):i._checkForCachedUpdates(e).then((function(t){t.cached?s(t):i._getUpdates(e).then((function(t){s(t)}))})).catch(a)}))},_checkForCachedUpdates:function(t){return new Promise((function(e,i){var s={onlyIfCached:!0,includeDetails:t};Craft.sendActionRequest("POST","app/check-for-updates",{data:s}).then((function(t){var i=t.data;e(i)})).catch((function(){e({cached:!1})}))}))},_getUpdates:function(t){var e=this;return new Promise((function(i,s){Craft.sendApiRequest("GET","updates").then((function(s){e._cacheUpdates(s,t).then((function(t){i(t)}))})).catch(s)}))},_cacheUpdates:function(t,e){return new Promise((function(i,s){var a={updates:t,includeDetails:e};Craft.sendActionRequest("POST","app/cache-updates",{data:a}).then((function(t){var e=t.data;i(e)})).catch(s)}))},updateUtilitiesBadge:function(){var t=e()("#nav-utilities").find("> a:not(.sel)");t.length&&Craft.queue.push((function(){return new Promise((function(i,s){Craft.sendActionRequest("POST","app/get-utilities-badge-count").then((function(s){var a=s.data,n=t.children(".badge"),r=t.children("[data-notification]");a.badgeCount?(n.length||(n=e()('<span class="badge" aria-hidden="true"/>').appendTo(t)),r.length||(r=e()('<span class="visually-hidden" data-notification/>').appendTo(t)),n.text(a.badgeCount),r.text(Craft.t("app","{num, number} {num, plural, =1{notification} other{notifications}}",{num:a.badgeCount}))):n.length&&r.length&&(n.remove(),r.remove()),i()})).catch(s)}))}))},runQueue:function(){var t=this;this.enableQueue&&(Craft.runQueueAutomatically?Craft.queue.push((function(){return new Promise((function(e,i){Craft.sendActionRequest("POST","queue/run").then((function(){t.trackJobProgress(!1,!0),e()})).catch(i)}))})):this.trackJobProgress(!1,!0))},trackJobProgress:function(t,e){if(e&&this.trackJobProgressTimeout&&(clearTimeout(this.trackJobProgressTimeout),this.trackJobProgressTimeout=null),!this.trackJobProgressTimeout&&this.enableQueue)if(!0===t){var i=Math.min(6e4,500*this.displayedJobInfoUnchanged);this.trackJobProgressTimeout=setTimeout(this._trackJobProgressInternal.bind(this),i)}else this._trackJobProgressInternal()},_trackJobProgressInternal:function(){var t=this;Craft.queue.push((function(){return new Promise((function(e,i){Craft.sendActionRequest("POST","queue/get-job-info?limit=50&dontExtendSession=1").then((function(i){var s=i.data;t.trackJobProgressTimeout=null,t.totalJobs=s.total,t.setJobInfo(s.jobs),t.jobInfo.length&&t.trackJobProgress(!0),e()})).catch(i)}))}))},setJobInfo:function(t){if(this.enableQueue){this.jobInfo=t;var e=this.displayedJobInfo;this.displayedJobInfo=this.getDisplayedJobInfo(),e&&this.displayedJobInfo&&e.id===this.displayedJobInfo.id&&e.progress===this.displayedJobInfo.progress&&e.progressLabel===this.displayedJobInfo.progressLabel&&e.status===this.displayedJobInfo.status?this.displayedJobInfoUnchanged++:this.displayedJobInfoUnchanged=1,this.updateJobIcon(),this.trigger("setJobInfo")}},getDisplayedJobInfo:function(){if(!this.enableQueue)return null;for(var t=[Craft.CP.JOB_STATUS_RESERVED,Craft.CP.JOB_STATUS_FAILED,Craft.CP.JOB_STATUS_WAITING],e=0;e<t.length;e++)for(var i=0;i<this.jobInfo.length;i++)if(this.jobInfo[i].status===t[e]&&(t[e]!==Craft.CP.JOB_STATUS_WAITING||!this.jobInfo[i].delay))return this.jobInfo[i];return null},updateJobIcon:function(){this.enableQueue&&this.$nav.length&&(this.displayedJobInfo?(this.jobProgressIcon||(this.jobProgressIcon=new n),this.displayedJobInfo.status===Craft.CP.JOB_STATUS_RESERVED||this.displayedJobInfo.status===Craft.CP.JOB_STATUS_WAITING?(this.jobProgressIcon.hideFailMode(),this.jobProgressIcon.setDescription(this.displayedJobInfo.description,this.displayedJobInfo.progressLabel),this.jobProgressIcon.setProgress(this.displayedJobInfo.progress)):this.displayedJobInfo.status===Craft.CP.JOB_STATUS_FAILED&&this.jobProgressIcon.showFailMode(Craft.t("app","Failed"))):this.jobProgressIcon&&(this.jobProgressIcon.hideFailMode(),this.jobProgressIcon.complete(),delete this.jobProgressIcon))},getSiteId:function(){var t=Craft.getLocalStorage("BaseElementIndex.siteId");if(void 0!==t){Craft.removeLocalStorage("BaseElementIndex.siteId");try{this.setSiteId(t)}catch(t){}}return Craft.siteId},setSiteId:function(t){var i=Craft.sites.find((function(e){return e.id===t}));if(!i)throw"Invalid site ID: ".concat(t);Craft.siteId=t,Craft.actionUrl=Craft.getUrl(Craft.actionUrl,{site:i.handle}),Craft.baseCpUrl=Craft.getUrl(Craft.baseCpUrl,{site:i.handle}),Craft.baseUrl=Craft.getUrl(Craft.baseUrl,{site:i.handle});var a=Craft.getUrl(document.location.href,{site:i.handle});history.replaceState({},"",a);var n,r=function(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=s(t))){i&&(t=i);var a=0,n=function(){};return{s:n,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==i.return||i.return()}finally{if(l)throw r}}}}(document.body.classList);try{for(r.s();!(n=r.n()).done;){var o=n.value;o.match(/^site--/)&&document.body.classList.remove(o)}}catch(t){r.e(t)}finally{r.f()}document.body.classList.add("site--".concat(i.handle)),e()("a").each((function(){this.hostname.length&&this.hostname===location.hostname&&-1!==this.href.indexOf(Craft.cpTrigger)&&(this.href=Craft.getUrl(this.href,{site:i.handle}))}))}},{notificationDuration:5e3,JOB_STATUS_WAITING:1,JOB_STATUS_RESERVED:2,JOB_STATUS_DONE:3,JOB_STATUS_FAILED:4}),Craft.CP.Notification=Garnish.Base.extend({type:null,message:null,settings:null,closing:!1,closeTimeout:null,_preventDelayedClose:!1,$container:null,$closeBtn:null,originalActiveElement:null,init:function(t,i,s){var a=this;this.type=t,this.message=i,this.settings=s||{},this.$container=e()("<div/>",{class:"notification","data-type":this.type}).appendTo(Craft.cp.$notificationContainer);var n=e()('<div class="notification-body"/>').appendTo(this.$container).attr("role","status");if(this.settings.icon){var r=e()("<span/>",{class:"notification-icon","data-icon":this.settings.icon}).appendTo(n);this.settings.iconLabel?r.attr({"aria-label":this.settings.iconLabel,role:"img"}):r.attr("aria-hidden","true")}var o=e()('<div class="notification-main"/>').appendTo(n);e()("<div/>",{class:"notification-message",text:this.message}).appendTo(o);var l=e()("<div/>").appendTo(this.$container);this.$closeBtn=e()("<button/>",{type:"button",class:"notification-close-btn","aria-label":Craft.t("app","Close"),"data-icon":"remove"}).appendTo(l),this.settings.details&&e()('<div class="notification-details"/>').append(this.settings.details).appendTo(o).find("button,input").length&&(Garnish.uiLayerManager.addLayer(this.$container),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){a.close()})),this.originalActiveElement=document.activeElement,this.$container.attr("tabindex","-1").focus(),this.$container.on("keydown",(function(t){t.keyCode===Garnish.ESC_KEY&&(t.stopPropagation(),a.close())}))),this.$container.css({opacity:0,"margin-bottom":this._negMargin()}).velocity({opacity:1,"margin-bottom":0},{duration:"fast"}),Craft.initUiElements(this.$container),this.addListener(this.$closeBtn,"click","close"),Craft.notificationDuration&&this._initDelayedClose()},_initDelayedClose:function(){var t=this;this._preventDelayedClose||(Craft.isVisible()?(this.delayedClose(),this.$container.on("keypress keyup change focus blur click mousedown mouseup",(function(e){e.target!=t.$closeBtn[0]&&(t.$container.off("keypress keyup change focus blur click mousedown mouseup"),t.preventDelayedClose())}))):Garnish.$doc.one("visibilitychange",(function(){t._initDelayedClose()})))},_negMargin:function(){return"-".concat(this.$container.outerHeight()+12,"px")},close:function(){var t=this;this.closing||(this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null),this.closing=!0,this.originalActiveElement&&document.activeElement&&(document.activeElement===this.$container[0]||e().contains(this.$container[0],document.activeElement))&&e()(this.originalActiveElement).focus(),this.$container.velocity({opacity:0,"margin-bottom":this._negMargin()},{duration:"fast",complete:function(){t.$container.remove()}}))},delayedClose:function(){var t=this;this.closeTimeout=setTimeout((function(){t.close()}),Craft.notificationDuration),this.$container.one("mouseover",(function(){clearTimeout(t.closeTimeout),t.closeTimeout=null,t.$container.on("mouseout",(function(e){e.target==t.$container[0]&&(t.$container.off("mouseout"),t.delayedClose())}))}))},preventDelayedClose:function(){this._preventDelayedClose=!0,this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null),this.$container.off("mouseover mouseout")}}),Garnish.$scrollContainer=Garnish.$win,Craft.cp=new Craft.CP;var n=Garnish.Base.extend({$li:null,$a:null,$label:null,$progressLabel:null,progress:null,failMode:!1,_$bgCanvas:null,_$staticCanvas:null,_$hoverCanvas:null,_$failCanvas:null,_staticCtx:null,_hoverCtx:null,_canvasSize:null,_arcPos:null,_arcRadius:null,_lineWidth:null,_arcStartPos:0,_arcEndPos:0,_arcStartStepSize:null,_arcEndStepSize:null,_arcStep:null,_arcStepTimeout:null,_arcAnimateCallback:null,_progressBar:null,init:function(){this.$li=e()("<li/>").appendTo(Craft.cp.$nav.children("ul")),this.$a=e()("<a/>",{id:"job-icon",href:Craft.canAccessQueueManager?Craft.getUrl("utilities/queue-manager"):null}).appendTo(this.$li),this.$canvasContainer=e()('<span class="icon"/>').appendTo(this.$a);var t=e()('<span class="label"/>').appendTo(this.$a);this.$label=e()("<span/>").appendTo(t),this.$progressLabel=e()('<span class="progress-label"/>').appendTo(t).hide();var i=window.devicePixelRatio>1?2:1;this._canvasSize=18*i,this._arcPos=this._canvasSize/2,this._arcRadius=7*i,this._lineWidth=3*i,this._$bgCanvas=this._createCanvas("bg","#61666b"),this._$staticCanvas=this._createCanvas("static","#d7d9db"),this._$hoverCanvas=this._createCanvas("hover","#fff"),this._$failCanvas=this._createCanvas("fail","#da5a47").hide(),this._staticCtx=this._$staticCanvas[0].getContext("2d"),this._hoverCtx=this._$hoverCanvas[0].getContext("2d"),this._drawArc(this._$bgCanvas[0].getContext("2d"),0,1),this._drawArc(this._$failCanvas[0].getContext("2d"),0,1)},setDescription:function(t,e){this.$a.attr("title",t),this.$label.text(t),e?this.$progressLabel.text(e).show():this.$progressLabel.hide()},setProgress:function(t){0==t?(this._$staticCanvas.hide(),this._$hoverCanvas.hide()):(this._$staticCanvas.show(),this._$hoverCanvas.show(),this.progress&&t>this.progress?this._animateArc(0,t/100):this._setArc(0,t/100)),this.progress=t},complete:function(){var t=this;this._animateArc(0,1,(function(){t._$bgCanvas.velocity("fadeOut"),t._animateArc(1,1,(function(){t.$a.remove(),t.destroy()}))}))},showFailMode:function(t){this.failMode||(this.failMode=!0,this.progress=null,this._$bgCanvas.hide(),this._$staticCanvas.hide(),this._$hoverCanvas.hide(),this._$failCanvas.show(),this.setDescription(t))},hideFailMode:function(){this.failMode&&(this.failMode=!1,this._$bgCanvas.show(),this._$staticCanvas.show(),this._$hoverCanvas.show(),this._$failCanvas.hide())},_createCanvas:function(t,i){var s=e()('<canvas id="job-icon-'+t+'" width="'+this._canvasSize+'" height="'+this._canvasSize+'"/>').appendTo(this.$canvasContainer),a=s[0].getContext("2d");return a.strokeStyle=i,a.lineWidth=this._lineWidth,a.lineCap="round",s},_setArc:function(t,e){this._arcStartPos=t,this._arcEndPos=e,this._drawArc(this._staticCtx,t,e),this._drawArc(this._hoverCtx,t,e)},_drawArc:function(t,e,i){t.clearRect(0,0,this._canvasSize,this._canvasSize),t.beginPath(),t.arc(this._arcPos,this._arcPos,this._arcRadius,(1.5+2*e)*Math.PI,(1.5+2*i)*Math.PI),t.stroke(),t.closePath()},_animateArc:function(t,e,i){this._arcStepTimeout&&clearTimeout(this._arcStepTimeout),this._arcStep=0,this._arcStartStepSize=(t-this._arcStartPos)/10,this._arcEndStepSize=(e-this._arcEndPos)/10,this._arcAnimateCallback=i,this._takeNextArcStep()},_takeNextArcStep:function(){this._setArc(this._arcStartPos+this._arcStartStepSize,this._arcEndPos+this._arcEndStepSize),this._arcStep++,this._arcStep<10?this._arcStepTimeout=setTimeout(this._takeNextArcStep.bind(this),50):this._arcAnimateCallback&&this._arcAnimateCallback()}});__webpack_require__(3778),__webpack_require__(6617),__webpack_require__(9482),__webpack_require__(3352),__webpack_require__(691),__webpack_require__(1519),__webpack_require__(501),__webpack_require__(2318),__webpack_require__(4755),__webpack_require__(8468),__webpack_require__(5049),__webpack_require__(7998),__webpack_require__(8895),__webpack_require__(4233),__webpack_require__(9699),__webpack_require__(1402),__webpack_require__(8201),__webpack_require__(3347),__webpack_require__(9478),__webpack_require__(2387),__webpack_require__(7966),__webpack_require__(657),__webpack_require__(4487),__webpack_require__(6966),__webpack_require__(5080),__webpack_require__(7439),__webpack_require__(5328),__webpack_require__(6419),__webpack_require__(872),__webpack_require__(1396),__webpack_require__(4070),__webpack_require__(5763),__webpack_require__(5185),__webpack_require__(8030),__webpack_require__(3096),__webpack_require__(3331),__webpack_require__(53),__webpack_require__(5074),__webpack_require__(3958),__webpack_require__(1592),__webpack_require__(1752),__webpack_require__(7e3),__webpack_require__(8654)}()})();
 //# sourceMappingURL=cp.js.map
\ No newline at end of file
diff --git a/src/web/assets/cp/dist/cp.js.map b/src/web/assets/cp/dist/cp.js.map
index 36e56d4de0e..115f71ccb4b 100644
--- a/src/web/assets/cp/dist/cp.js.map
+++ b/src/web/assets/cp/dist/cp.js.map
@@ -1 +1 @@
-{"version":3,"file":"cp.js","mappings":"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","sources":["webpack:///./js/Accordion.js","webpack:///./js/AddressesInput.js","webpack:///./js/AdminTable.js","webpack:///./js/AssetImageEditor.js","webpack:///./js/AssetIndex.js","webpack:///./js/AssetSelectInput.js","webpack:///./js/AssetSelectorModal.js","webpack:///./js/AuthManager.js","webpack:///./js/BaseElementIndex.js","webpack:///./js/BaseElementIndexView.js","webpack:///./js/BaseElementSelectInput.js","webpack:///./js/BaseElementSelectorModal.js","webpack:///./js/BaseInputGenerator.js","webpack:///./js/CategoryIndex.js","webpack:///./js/CategorySelectInput.js","webpack:///./js/Chart.js","webpack:///./js/ColorInput.js","webpack:///./js/CpScreenSlideout.js","webpack:///./js/Craft.js","webpack:///./js/CustomizeSourcesModal.js","webpack:///./js/DataTableSorter.js","webpack:///./js/DeleteUserModal.js","webpack:///./js/DynamicGenerator.js","webpack:///./js/EditableTable.js","webpack:///./js/ElementActionTrigger.js","webpack:///./js/ElementEditor.js","webpack:///./js/ElementEditorSlideout.js","webpack:///./js/ElementFieldSettings.js","webpack:///./js/ElementThumbLoader.js","webpack:///./js/ElevatedSessionForm.js","webpack:///./js/ElevatedSessionManager.js","webpack:///./js/EntryIndex.js","webpack:///./js/FieldLayoutDesigner.js","webpack:///./js/FieldToggle.js","webpack:///./js/Grid.js","webpack:///./js/HandleGenerator.js","webpack:///./js/ImageUpload.js","webpack:///./js/InfoIcon.js","webpack:///./js/LightSwitch.js","webpack:///./js/Listbox.js","webpack:///./js/LivePreview.js","webpack:///./js/PasswordInput.js","webpack:///./js/Preview.js","webpack:///./js/PreviewFileModal.js","webpack:///./js/ProgressBar.js","webpack:///./js/PromptHandler.js","webpack:///./js/Queue.js","webpack:///./js/SlidePicker.js","webpack:///./js/SlideRuleInput.js","webpack:///./js/Slideout.js","webpack:///./js/SlugGenerator.js","webpack:///./js/Structure.js","webpack:///./js/StructureDrag.js","webpack:///./js/StructureTableSorter.js","webpack:///./js/TableElementIndexView.js","webpack:///./js/Tabs.js","webpack:///./js/TagSelectInput.js","webpack:///./js/ThumbsElementIndexView.js","webpack:///./js/UI.js","webpack:///./js/Uploader.js","webpack:///./js/UriFormatGenerator.js","webpack:///./js/UserIndex.js","webpack:///./css/charts.scss?4afb","webpack:///./css/craft.scss?1b58","webpack:///../../../../../node_modules/vue-style-loader/lib/listToStyles.js","webpack:///../../../../../node_modules/vue-style-loader/lib/addStylesClient.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///external var \"jQuery\"","webpack:///./js/CP.js"],"sourcesContent":["/** global: Craft */\n/** global: Garnish */\n/**\n * Accordion\n */\nCraft.Accordion = Garnish.Base.extend({\n  $trigger: null,\n  targetSelector: null,\n\n  _$target: null,\n\n  init: function (trigger) {\n    this.$trigger = $(trigger);\n\n    // Is this already an accordion trigger?\n    if (this.$trigger.data('accordion')) {\n      console.warn('Double-instantiating an accordion trigger on an element');\n      this.$trigger.data('accordion').destroy();\n    }\n\n    this.$trigger.data('accordion', this);\n    this.targetSelector = this.$trigger.attr('aria-controls')\n      ? `#${this.$trigger.attr('aria-controls')}`\n      : null;\n\n    if (this.targetSelector) {\n      this._$target = $(this.targetSelector);\n    }\n\n    this.addListener(this.$trigger, 'click', 'onTriggerClick');\n    this.addListener(this.$trigger, 'keypress', (event) => {\n      const key = event.keyCode;\n\n      if (key === Garnish.SPACE_KEY || key === Garnish.RETURN_KEY) {\n        event.preventDefault();\n        this.onTriggerClick();\n      }\n    });\n  },\n\n  onTriggerClick: function () {\n    const isOpen = this.$trigger.attr('aria-expanded') === 'true';\n\n    if (isOpen) {\n      this.hideTarget(this._$target);\n    } else {\n      this.showTarget(this._$target);\n    }\n  },\n\n  showTarget: function ($target) {\n    if ($target && $target.length) {\n      this.showTarget._currentHeight = $target.height();\n\n      $target.removeClass('hidden');\n\n      this.$trigger\n        .removeClass('collapsed')\n        .addClass('expanded')\n        .attr('aria-expanded', 'true');\n\n      for (let i = 0; i < $target.length; i++) {\n        (($t) => {\n          if ($t.prop('nodeName') !== 'SPAN') {\n            $t.height('auto');\n            this.showTarget._targetHeight = $t.height();\n            $t.css({\n              height: this.showTarget._currentHeight,\n              overflow: 'hidden',\n            });\n\n            $t.velocity('stop');\n\n            $t.velocity(\n              {height: this.showTarget._targetHeight},\n              Garnish.getUserPreferredAnimationDuration('fast'),\n              function () {\n                $t.css({\n                  height: '',\n                  overflow: '',\n                });\n              }\n            );\n          }\n        })($target.eq(i));\n      }\n\n      delete this.showTarget._targetHeight;\n      delete this.showTarget._currentHeight;\n\n      // Trigger a resize event in case there are any grids in the target that need to initialize\n      Garnish.$win.trigger('resize');\n    }\n  },\n\n  hideTarget: function ($target) {\n    if ($target && $target.length) {\n      this.$trigger\n        .removeClass('expanded')\n        .addClass('collapsed')\n        .attr('aria-expanded', 'false');\n\n      for (let i = 0; i < $target.length; i++) {\n        (($t) => {\n          if ($t.hasClass('hidden')) {\n            return;\n          }\n          if ($t.prop('nodeName') === 'SPAN') {\n            $t.addClass('hidden');\n          } else {\n            $t.css('overflow', 'hidden');\n            $t.velocity('stop');\n            $t.velocity(\n              {height: 0},\n              Garnish.getUserPreferredAnimationDuration('fast'),\n              function () {\n                $t.addClass('hidden');\n              }\n            );\n          }\n        })($target.eq(i));\n      }\n    }\n  },\n\n  destroy: function () {\n    this.$trigger.removeData('accordion');\n    this.base();\n  },\n});\n","/** global: Craft */\n\n/**\n * AddressInput class\n */\nCraft.AddressesInput = Garnish.Base.extend(\n  {\n    $container: null,\n    $addBtn: null,\n    $addBtnItem: null,\n    $cards: null,\n\n    init: function (container, settings) {\n      this.$container = $(container);\n      this.setSettings(settings, Craft.AddressesInput.defaults);\n\n      // Is this already an address input?\n      if (this.$container.data('addresses')) {\n        console.warn('Double-instantiating an address input on an element');\n        this.$container.data('addresses').destroy();\n      }\n\n      this.$container.data('addresses', this);\n\n      this.$addBtn = this.$container.find('.address-cards__add-btn');\n      this.$addBtnItem = this.$addBtn.closest('li');\n      this.$cards = this.$container.find('> .address-card');\n\n      for (let i = 0; i < this.$cards.length; i++) {\n        this.initCard(this.$cards.eq(i));\n      }\n\n      this.updateAddButton();\n\n      this.addListener(this.$addBtn, 'click', () => {\n        this.createAddress();\n      });\n    },\n\n    initCard: function ($card) {\n      this.addListener($card, 'click', (ev) => {\n        if (!$(ev.target).closest('.menubtn').length) {\n          this.editAddress($card);\n        }\n      });\n\n      const $actionBtn = $card.find('.menubtn').disclosureMenu();\n      if ($actionBtn.length) {\n        const menu = $actionBtn.data('trigger');\n        const $menu = menu.$container;\n\n        // Activate edit button\n        const $editBtn = $menu.find('[data-action=\"edit\"]');\n        this.addListener($editBtn, 'click', (ev) => {\n          ev.stopPropagation();\n          this.editAddress($card);\n        });\n\n        // Activate delete button\n        const $deleteBtn = $menu.find('[data-action=\"delete\"]');\n        this.addListener($deleteBtn, 'click', (ev) => {\n          ev.preventDefault();\n          ev.stopPropagation();\n          if (\n            confirm(\n              Craft.t('app', 'Are you sure you want to delete this address?')\n            )\n          ) {\n            this.$addBtn.addClass('loading');\n            const addressId = $card.data('id');\n            const draftId = $card.data('draft-id');\n            Craft.sendActionRequest('POST', 'elements/delete', {\n              data: {\n                elementId: addressId,\n                draftId: draftId,\n              },\n            })\n              .then(() => {\n                $card.remove();\n                $menu.remove();\n                menu.destroy();\n                this.$cards = this.$cards.not($card);\n                this.updateAddButton();\n\n                this.trigger('deleteAddress', {\n                  addressId,\n                  draftId,\n                });\n              })\n              .finally(() => {\n                this.$addBtn.removeClass('loading');\n              });\n          }\n        });\n      }\n    },\n\n    editAddress: function ($card, settings) {\n      const slideout = Craft.createElementEditor(\n        'craft\\\\elements\\\\Address',\n        $card,\n        settings\n      );\n\n      slideout.on('submit', (ev) => {\n        this.trigger('saveAddress', {\n          data: ev.data,\n        });\n\n        Craft.sendActionRequest('POST', 'addresses/card-html', {\n          data: {\n            addressId: ev.data.id,\n          },\n        }).then((response) => {\n          const $newCard = $(response.data.html);\n          if ($card) {\n            $card.replaceWith($newCard);\n            this.$cards = this.$cards.not($card);\n          } else {\n            $newCard.insertBefore(this.$addBtnItem);\n          }\n          Craft.initUiElements($newCard);\n          this.initCard($newCard);\n          this.$cards = this.$cards.add($newCard);\n          this.updateAddButton();\n        });\n      });\n    },\n\n    updateAddButton: function () {\n      if (this.canCreateAddress()) {\n        this.$addBtn.removeClass('hidden');\n      } else {\n        this.$addBtn.addClass('hidden');\n      }\n    },\n\n    canCreateAddress: function () {\n      return (\n        !this.settings.maxAddresses ||\n        this.$cards.length < this.settings.maxAddresses\n      );\n    },\n\n    createAddress: function () {\n      if (!this.canCreateAddress()) {\n        throw 'No more addresses can be created.';\n      }\n\n      this.$addBtn.addClass('loading');\n\n      Craft.sendActionRequest('POST', 'elements/create', {\n        data: {\n          elementType: 'craft\\\\elements\\\\Address',\n          ownerId: this.settings.ownerId,\n        },\n      })\n        .then((ev) => {\n          this.editAddress(null, {\n            elementId: ev.data.element.id,\n            draftId: ev.data.element.draftId,\n          });\n        })\n        .finally(() => {\n          this.$addBtn.removeClass('loading');\n        });\n    },\n\n    destroy: function () {\n      this.$container.removeData('addresses');\n      this.base();\n    },\n  },\n  {\n    ownerId: null,\n    defaults: {\n      maxAddresses: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Admin table class\n */\nCraft.AdminTable = Garnish.Base.extend(\n  {\n    settings: null,\n    totalItems: null,\n    sorter: null,\n\n    $noItems: null,\n    $table: null,\n    $tbody: null,\n    $deleteBtns: null,\n\n    init: function (settings) {\n      this.setSettings(settings, Craft.AdminTable.defaults);\n\n      if (!this.settings.allowDeleteAll) {\n        this.settings.minItems = 1;\n      }\n\n      this.$noItems = $(this.settings.noItemsSelector);\n      this.$table = $(this.settings.tableSelector);\n      this.$tbody = this.$table.children('tbody');\n      this.totalItems = this.$tbody.children().length;\n\n      if (this.settings.sortable) {\n        this.sorter = new Craft.DataTableSorter(this.$table, {\n          onSortChange: this.reorderItems.bind(this),\n        });\n      }\n\n      this.$deleteBtns = this.$table.find('.delete:not(.disabled)');\n      this.addListener(this.$deleteBtns, 'click', 'handleDeleteBtnClick');\n      this.addListener(this.$deleteBtns, 'keydown', (event) => {\n        if (\n          event.keyCode === Garnish.SPACE_KEY ||\n          event.keyCode === Garnish.RETURN_KEY\n        ) {\n          event.preventDefault();\n          this.handleDeleteBtnClick(event);\n        }\n      });\n\n      this.updateUI();\n    },\n\n    addRow: function (row) {\n      if (this.settings.maxItems && this.totalItems >= this.settings.maxItems) {\n        // Sorry pal.\n        return;\n      }\n\n      var $row = $(row).appendTo(this.$tbody),\n        $deleteBtn = $row.find('.delete');\n\n      if (this.settings.sortable) {\n        this.sorter.addItems($row);\n      }\n\n      this.$deleteBtns = this.$deleteBtns.add($deleteBtn);\n\n      this.addListener($deleteBtn, 'click', 'handleDeleteBtnClick');\n      this.totalItems++;\n\n      this.updateUI();\n    },\n\n    reorderItems: function () {\n      if (!this.settings.sortable) {\n        return;\n      }\n\n      // Get the new field order\n      var ids = [];\n\n      for (var i = 0; i < this.sorter.$items.length; i++) {\n        var id = $(this.sorter.$items[i]).attr(this.settings.idAttribute);\n        ids.push(id);\n      }\n\n      // Send it to the server\n      var data = {\n        ids: JSON.stringify(ids),\n      };\n\n      Craft.sendActionRequest('POST', this.settings.reorderAction, {data})\n        .then((response) => {\n          this.onReorderItems(ids);\n          Craft.cp.displaySuccess(\n            Craft.t('app', this.settings.reorderSuccessMessage)\n          );\n        })\n        .catch(({response}) => {\n          Craft.cp.displayError(\n            Craft.t('app', this.settings.reorderFailMessage)\n          );\n        });\n    },\n\n    handleDeleteBtnClick: function (event) {\n      if (this.settings.minItems && this.totalItems <= this.settings.minItems) {\n        // Sorry pal.\n        return;\n      }\n\n      var $row = $(event.target).closest('tr');\n\n      if (this.confirmDeleteItem($row)) {\n        this.deleteItem($row);\n      }\n    },\n\n    confirmDeleteItem: function ($row) {\n      if (!this.settings.confirmDeleteMessage) {\n        return true;\n      }\n\n      var name = this.getItemName($row);\n      return confirm(\n        Craft.t('app', this.settings.confirmDeleteMessage, {name})\n      );\n    },\n\n    deleteItem: function ($row) {\n      var data = {\n        id: this.getItemId($row),\n      };\n\n      Craft.sendActionRequest('POST', this.settings.deleteAction, {data})\n        .then((response) => this.handleDeleteItemSuccess(response.data, $row))\n        .catch(({response}) =>\n          this.handleDeleteItemFailure(response.data, $row)\n        );\n    },\n\n    handleDeleteItemFailure: function (data, $row) {\n      var id = this.getItemId($row),\n        name = this.getItemName($row);\n\n      Craft.cp.displayError(\n        Craft.t('app', this.settings.deleteFailMessage, {name})\n      );\n    },\n\n    handleDeleteItemSuccess: function (data, $row) {\n      var id = this.getItemId($row),\n        name = this.getItemName($row);\n\n      if (this.sorter) {\n        this.sorter.removeItems($row);\n      }\n\n      $row.remove();\n      this.totalItems--;\n      this.updateUI();\n      this.onDeleteItem(id);\n\n      if (this.settings.deleteSuccessMessage) {\n        Craft.cp.displaySuccess(\n          Craft.t('app', this.settings.deleteSuccessMessage, {name})\n        );\n      }\n    },\n\n    onReorderItems: function (ids) {\n      this.settings.onReorderItems(ids);\n    },\n\n    onDeleteItem: function (id) {\n      this.settings.onDeleteItem(id);\n    },\n\n    getItemId: function ($row) {\n      return $row.attr(this.settings.idAttribute);\n    },\n\n    getItemName: function ($row) {\n      return Craft.escapeHtml($row.attr(this.settings.nameAttribute));\n    },\n\n    updateUI: function () {\n      // Show the \"No Whatever Exists\" message if there aren't any\n      if (this.totalItems === 0) {\n        this.$table.hide();\n        this.$noItems.removeClass('hidden');\n      } else {\n        this.$table.show();\n        this.$noItems.addClass('hidden');\n      }\n\n      // Disable the sort buttons if there's only one row\n      if (this.settings.sortable) {\n        var $moveButtons = this.$table.find('.move');\n\n        if (this.totalItems === 1) {\n          $moveButtons.addClass('disabled');\n        } else {\n          $moveButtons.removeClass('disabled');\n        }\n      }\n\n      // Disable the delete buttons if we've reached the minimum items\n      if (this.settings.minItems && this.totalItems <= this.settings.minItems) {\n        this.$deleteBtns.addClass('disabled');\n      } else {\n        this.$deleteBtns.removeClass('disabled');\n      }\n\n      // Hide the New Whatever button if we've reached the maximum items\n      if (this.settings.newItemBtnSelector) {\n        if (\n          this.settings.maxItems &&\n          this.totalItems >= this.settings.maxItems\n        ) {\n          $(this.settings.newItemBtnSelector).addClass('hidden');\n        } else {\n          $(this.settings.newItemBtnSelector).removeClass('hidden');\n        }\n      }\n    },\n  },\n  {\n    defaults: {\n      tableSelector: null,\n      noItemsSelector: null,\n      newItemBtnSelector: null,\n      idAttribute: 'data-id',\n      nameAttribute: 'data-name',\n      sortable: false,\n      allowDeleteAll: true,\n      minItems: 0,\n      maxItems: null,\n      reorderAction: null,\n      deleteAction: null,\n      reorderSuccessMessage: Craft.t('app', 'New order saved.'),\n      reorderFailMessage: Craft.t('app', 'Couldn’t save new order.'),\n      confirmDeleteMessage: Craft.t(\n        'app',\n        'Are you sure you want to delete “{name}”?'\n      ),\n      deleteSuccessMessage: Craft.t('app', '“{name}” deleted.'),\n      deleteFailMessage: Craft.t('app', 'Couldn’t delete “{name}”.'),\n      onReorderItems: $.noop,\n      onDeleteItem: $.noop,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Asset image editor class\n */\n\nCraft.AssetImageEditor = Garnish.Modal.extend(\n  {\n    // jQuery objects\n    $body: null,\n    $footer: null,\n    $imageTools: null,\n    $buttons: null,\n    $cancelBtn: null,\n    $replaceBtn: null,\n    $saveBtn: null,\n    $focalPointBtn: null,\n    $editorContainer: null,\n    $straighten: null,\n    $croppingCanvas: null,\n    $spinner: null,\n    $constraintContainer: null,\n    $constraintRadioInputs: null,\n    $customConstraints: null,\n\n    // FabricJS objects\n    canvas: null,\n    image: null,\n    viewport: null,\n    focalPoint: null,\n    grid: null,\n    croppingCanvas: null,\n    clipper: null,\n    croppingRectangle: null,\n    cropperHandles: null,\n    cropperGrid: null,\n    croppingShade: null,\n\n    // Image state attributes\n    imageStraightenAngle: 0,\n    viewportRotation: 0,\n    originalWidth: 0,\n    originalHeight: 0,\n    imageVerticeCoords: null,\n    zoomRatio: 1,\n\n    // Editor state attributes\n    animationInProgress: false,\n    currentView: '',\n    assetId: null,\n    cacheBust: null,\n    draggingCropper: false,\n    scalingCropper: false,\n    draggingFocal: false,\n    previousMouseX: 0,\n    previousMouseY: 0,\n    shiftKeyHeld: false,\n    editorHeight: 0,\n    editorWidth: 0,\n    cropperState: false,\n    scaleFactor: 1,\n    flipData: {},\n    focalPointState: false,\n    maxImageSize: null,\n    lastLoadedDimensions: null,\n    imageIsLoading: false,\n    mouseMoveEvent: null,\n    croppingConstraint: false,\n    constraintOrientation: 'landscape',\n    showingCustomConstraint: false,\n    saving: false,\n\n    // Rendering proxy functions\n    renderImage: null,\n    renderCropper: null,\n\n    _queue: null,\n\n    init: function (assetId, settings) {\n      this._queue = new Craft.Queue();\n\n      this.cacheBust = Date.now();\n\n      this.setSettings(settings, Craft.AssetImageEditor.defaults);\n\n      if (this.settings.allowDegreeFractions === null) {\n        this.settings.allowDegreeFractions = Craft.isImagick;\n      }\n\n      if (Garnish.prefersReducedMotion()) {\n        this.settings.animationDuration = 1;\n      }\n\n      this.assetId = assetId;\n      this.flipData = {x: 0, y: 0};\n\n      // Build the modal\n      this.$container = $(\n        '<form class=\"modal fitted imageeditor\"></form>'\n      ).appendTo(Garnish.$bod);\n      this.$body = $('<div class=\"body\"></div>').appendTo(this.$container);\n      this.$footer = $('<div class=\"footer\"/>').appendTo(this.$container);\n\n      this.base(this.$container, this.settings);\n\n      this.$buttons = $('<div class=\"buttons right\"/>').appendTo(this.$footer);\n      this.$cancelBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn cancel',\n        text: Craft.t('app', 'Cancel'),\n      }).appendTo(this.$buttons);\n\n      if (this.settings.allowSavingAsNew) {\n        this.$saveBtn = Craft.ui\n          .createButton({\n            class: 'save copy',\n            label: Craft.t('app', 'Save as a new asset'),\n            spinner: true,\n          })\n          .appendTo(this.$buttons);\n        this.addListener(this.$saveBtn, 'activate', this.saveImage);\n      }\n\n      this.$replaceBtn = Craft.ui\n        .createSubmitButton({\n          class: 'save replace',\n          label: Craft.t('app', 'Save'),\n          spinner: true,\n        })\n        .appendTo(this.$buttons);\n\n      this.addListener(this.$replaceBtn, 'activate', this.saveImage);\n      this.addListener(this.$cancelBtn, 'activate', this.hide);\n      this.removeListener(this.$shade, 'click');\n\n      this.maxImageSize = this.getMaxImageSize();\n      Craft.sendActionRequest('POST', 'assets/image-editor', {\n        data: {assetId},\n      }).then((response) => this.loadEditor(response.data));\n    },\n\n    /**\n     * Get the max image size that is viewable in the editor currently\n     */\n    getMaxImageSize: function () {\n      var browserViewportWidth =\n        Garnish.$doc.get(0).documentElement.clientWidth;\n      var browserViewportHeight =\n        Garnish.$doc.get(0).documentElement.clientHeight;\n\n      return (\n        Math.max(browserViewportHeight, browserViewportWidth) *\n        (window.devicePixelRatio > 1 ? 2 : 1)\n      );\n    },\n\n    /**\n     * Load the editor markup and start loading components and the image.\n     *\n     * @param {Object} data\n     */\n    loadEditor: function (data) {\n      if (!data.html) {\n        alert(Craft.t('app', 'Could not load the image editor.'));\n      }\n\n      this.$body.html(data.html);\n      this.$tabs = $('.tabs li', this.$body);\n      this.$viewsContainer = $('.views', this.$body);\n      this.$views = $('> div', this.$viewsContainer);\n      this.$imageTools = $('.image-container .image-tools', this.$body);\n      this.$editorContainer = $('.image-container .image', this.$body);\n      this.$constraintContainer = $('.constraint-group', this.$body);\n      this.$constraintRadioInputs = $(\n        '[name=\"constraint\"]',\n        this.$constraintContainer\n      );\n      this.$focalPointBtn = $('.focal-point', this.$body);\n      this.editorHeight = this.$editorContainer.innerHeight();\n      this.editorWidth = this.$editorContainer.innerWidth();\n\n      this._showSpinner();\n\n      this.updateSizeAndPosition();\n\n      $customConstraintWrapper = this.$constraintRadioInputs\n        .filter('[value=\"custom\"]')\n        .parent();\n\n      // Add custom constraint inputs to fieldset\n      this.$customConstraints = $('<div/>', {\n        class: 'constraint custom hidden',\n        'data-constraint': 'custom',\n      })\n        .append(\n          $('<input/>', {\n            type: 'text',\n            class: 'custom-constraint-w',\n            size: 3,\n            value: 1,\n            'aria-label': Craft.t('app', 'Width unit'),\n          })\n        )\n        .append(\n          $('<span/>', {\n            class: 'custom-constraint-spacer',\n            text: 'x',\n            'aria-hidden': 'true',\n          })\n        )\n        .append(\n          $('<input/>', {\n            type: 'text',\n            class: 'custom-constraint-h',\n            size: 3,\n            value: 1,\n            'aria-label': Craft.t('app', 'Height unit'),\n          })\n        )\n        .appendTo($customConstraintWrapper);\n\n      // Specify which get flipped on orientation change\n      this.$constraintRadioInputs\n        .filter(function () {\n          const regex = /^\\d*\\.\\d+$/;\n          const value = $(this).val();\n          return regex.test(value);\n        })\n        .addClass('flip');\n\n      // Load the canvas on which we'll host our image and set up the proxy render function\n      this.canvas = new fabric.StaticCanvas('image-canvas');\n\n      // Set up the cropping canvas jquery element for tracking all the nice events\n      this.$croppingCanvas = $('#cropping-canvas', this.$editorContainer);\n      this.$croppingCanvas.width(this.editorWidth);\n      this.$croppingCanvas.height(this.editorHeight);\n\n      this.canvas.enableRetinaScaling = true;\n      this.renderImage = () => {\n        Garnish.requestAnimationFrame(this.canvas.renderAll.bind(this.canvas));\n      };\n\n      // Load the image from URL\n      var imageUrl = Craft.getActionUrl('assets/edit-image', {\n        assetId: this.assetId,\n        size: this.maxImageSize,\n        cacheBust: this.cacheBust,\n      });\n\n      // Load image and set up the initial properties\n      fabric.Image.fromURL(imageUrl, (imageObject) => {\n        this.image = imageObject;\n        this.image.set({\n          originX: 'center',\n          originY: 'center',\n          left: this.editorWidth / 2,\n          top: this.editorHeight / 2,\n        });\n        this.canvas.add(this.image);\n\n        this.originalHeight = this.image.getHeight();\n        this.originalWidth = this.image.getWidth();\n        this.zoomRatio = 1;\n\n        this.lastLoadedDimensions = this.getScaledImageDimensions();\n\n        // Set up the image bounding box, viewport and position everything\n        this._setFittedImageVerticeCoordinates();\n        this._repositionEditorElements();\n\n        // Set up the focal point\n        var focalState = {\n          imageDimensions: this.getScaledImageDimensions(),\n          offsetX: 0,\n          offsetY: 0,\n        };\n\n        var focal = false;\n        if (data.focalPoint) {\n          // Transform the focal point coordinates from relative to absolute\n          var focalData = data.focalPoint;\n\n          // Resolve for the current image dimensions.\n          var adjustedX = focalState.imageDimensions.width * focalData.x;\n          var adjustedY = focalState.imageDimensions.height * focalData.y;\n\n          focalState.offsetX = adjustedX - focalState.imageDimensions.width / 2;\n          focalState.offsetY =\n            adjustedY - focalState.imageDimensions.height / 2;\n\n          focal = true;\n        }\n\n        this.storeFocalPointState(focalState);\n\n        if (focal) {\n          this._createFocalPoint();\n        }\n\n        this._createViewport();\n        this.storeCropperState();\n\n        // Add listeners to buttons\n        this._addControlListeners();\n\n        // Add mouse event listeners\n        this.addListener(\n          this.$croppingCanvas,\n          'mousemove,touchmove',\n          this._handleMouseMove\n        );\n        this.addListener(\n          this.$croppingCanvas,\n          'mousedown,touchstart',\n          this._handleMouseDown\n        );\n        this.addListener(\n          this.$croppingCanvas,\n          'mouseup,touchend',\n          this._handleMouseUp\n        );\n        this.addListener(\n          this.$croppingCanvas,\n          'mouseout,touchcancel',\n          this._handleMouseOut\n        );\n\n        this._hideSpinner();\n\n        // Render it, finally\n        this.renderImage();\n\n        // Make sure verything gets fired for the first tab\n        this.$tabs.first().trigger('click');\n      });\n    },\n\n    /**\n     * Reload the image to better fit the current available image editor viewport.\n     */\n    _reloadImage: function () {\n      if (this.imageIsLoading) {\n        return;\n      }\n\n      this.imageIsLoading = true;\n      this.maxImageSize = this.getMaxImageSize();\n\n      // Load the image from URL\n      var imageUrl = Craft.getActionUrl('assets/edit-image', {\n        assetId: this.assetId,\n        size: this.maxImageSize,\n        cacheBust: this.cacheBust,\n      });\n\n      this.image.setSrc(imageUrl, (imageObject) => {\n        this.originalHeight = imageObject.getHeight();\n        this.originalWidth = imageObject.getWidth();\n        this.lastLoadedDimensions = {\n          width: this.originalHeight,\n          height: this.originalWidth,\n        };\n        this.updateSizeAndPosition();\n        this.renderImage();\n        this.imageIsLoading = false;\n      });\n    },\n\n    /**\n     * Update the modal size and position on browser resize\n     */\n    updateSizeAndPosition: function () {\n      if (!this.$container) {\n        return;\n      }\n\n      // Fullscreen modal\n      var innerWidth = window.innerWidth;\n      var innerHeight = window.innerHeight;\n\n      this.$container.css({\n        width: innerWidth,\n        'min-width': innerWidth,\n        left: 0,\n\n        height: innerHeight,\n        'min-height': innerHeight,\n        top: 0,\n      });\n\n      this.$body.css({\n        height: innerHeight - (this.$footer.outerHeight() - 1),\n      });\n\n      if (innerWidth < innerHeight) {\n        this.$container.addClass('vertical');\n      } else {\n        this.$container.removeClass('vertical');\n      }\n\n      // If image is already loaded, make sure it looks pretty.\n      if (this.$editorContainer && this.image) {\n        this._repositionEditorElements();\n      }\n    },\n\n    /**\n     * Reposition the editor elements to accurately reflect the editor state with current dimensions\n     */\n    _repositionEditorElements: function () {\n      // Remember what the dimensions were before the resize took place\n      var previousEditorDimensions = {\n        width: this.editorWidth,\n        height: this.editorHeight,\n      };\n\n      this.editorHeight = this.$editorContainer.innerHeight();\n      this.editorWidth = this.$editorContainer.innerWidth();\n\n      this.canvas.setDimensions({\n        width: this.editorWidth,\n        height: this.editorHeight,\n      });\n\n      var currentScaledDimensions = this.getScaledImageDimensions();\n\n      // If we're cropping now, we have to reposition the cropper correctly in case\n      // the area for image changes, forcing the image size to change as well.\n      if (this.currentView === 'crop') {\n        this.zoomRatio = this.getZoomToFitRatio(\n          this.getScaledImageDimensions()\n        );\n        var previouslyOccupiedArea = this._getBoundingRectangle(\n          this.imageVerticeCoords\n        );\n        this._setFittedImageVerticeCoordinates();\n        this._repositionCropper(previouslyOccupiedArea);\n      } else {\n        // Otherwise just recalculate the image zoom ratio\n        this.zoomRatio =\n          this.getZoomToCoverRatio(this.getScaledImageDimensions()) *\n          this.scaleFactor;\n      }\n\n      // Reposition the image relatively to the previous editor dimensions.\n      this._repositionImage(previousEditorDimensions);\n      this._repositionViewport();\n      this._repositionFocalPoint(previousEditorDimensions);\n      this._zoomImage();\n\n      this.renderImage();\n\n      if (\n        currentScaledDimensions.width / this.lastLoadedDimensions.width > 1.5 ||\n        currentScaledDimensions.height / this.lastLoadedDimensions.height > 1.5\n      ) {\n        this._reloadImage();\n      }\n    },\n\n    /**\n     * Reposition image based on how the editor dimensions have changed.\n     * This ensures keeping the image center offset, if there is any.\n     *\n     * @param {Object} previousEditorDimensions\n     */\n    _repositionImage: function (previousEditorDimensions) {\n      this.image.set({\n        left:\n          this.image.left -\n          (previousEditorDimensions.width - this.editorWidth) / 2,\n        top:\n          this.image.top -\n          (previousEditorDimensions.height - this.editorHeight) / 2,\n      });\n    },\n\n    /**\n     * Create the viewport for image editor.\n     */\n    _createViewport: function () {\n      this.viewport = new fabric.Rect({\n        width: this.image.width,\n        height: this.image.height,\n        fill: 'rgba(127,0,0,1)',\n        originX: 'center',\n        originY: 'center',\n        globalCompositeOperation: 'destination-in', // This clips everything outside of the viewport\n        left: this.image.left,\n        top: this.image.top,\n      });\n      this.canvas.add(this.viewport);\n      this.renderImage();\n    },\n\n    /**\n     * Create the focal point.\n     */\n    _createFocalPoint: function () {\n      var focalPointState = this.focalPointState;\n      var sizeFactor =\n        this.getScaledImageDimensions().width /\n        focalPointState.imageDimensions.width;\n\n      var focalX =\n        focalPointState.offsetX *\n        sizeFactor *\n        this.zoomRatio *\n        this.scaleFactor;\n      var focalY =\n        focalPointState.offsetY *\n        sizeFactor *\n        this.zoomRatio *\n        this.scaleFactor;\n\n      // Adjust by image margins\n      focalX += this.image.left;\n      focalY += this.image.top;\n\n      var deltaX = 0;\n      var deltaY = 0;\n\n      // When creating a fresh focal point, drop it dead in the center of the viewport, not the image.\n      if (\n        this.viewport &&\n        focalPointState.offsetX === 0 &&\n        focalPointState.offsetY === 0\n      ) {\n        if (this.currentView !== 'crop') {\n          deltaX = this.viewport.left - this.image.left;\n          deltaY = this.viewport.top - this.image.top;\n        } else {\n          // Unless we have a cropper showing, in which case drop it in the middle of the cropper\n          deltaX = this.clipper.left - this.image.left;\n          deltaY = this.clipper.top - this.image.top;\n        }\n\n        // Bump focal to middle of viewport\n        focalX += deltaX;\n        focalY += deltaY;\n\n        // Reflect changes in saved state\n        focalPointState.offsetX +=\n          deltaX / (sizeFactor * this.zoomRatio * this.scaleFactor);\n        focalPointState.offsetY +=\n          deltaY / (sizeFactor * this.zoomRatio * this.scaleFactor);\n      }\n\n      this.focalPoint = new fabric.Group(\n        [\n          new fabric.Circle({\n            radius: 8,\n            fill: 'rgba(0,0,0,0.5)',\n            strokeWidth: 2,\n            stroke: 'rgba(255,255,255,0.8)',\n            left: 0,\n            top: 0,\n            originX: 'center',\n            originY: 'center',\n          }),\n          new fabric.Circle({\n            radius: 1,\n            fill: 'rgba(255,255,255,0)',\n            strokeWidth: 2,\n            stroke: 'rgba(255,255,255,0.8)',\n            left: 0,\n            top: 0,\n            originX: 'center',\n            originY: 'center',\n          }),\n        ],\n        {\n          originX: 'center',\n          originY: 'center',\n          left: focalX,\n          top: focalY,\n        }\n      );\n\n      this.storeFocalPointState(focalPointState);\n      this.canvas.add(this.focalPoint);\n    },\n\n    /**\n     * Toggle focal point\n     */\n    toggleFocalPoint: function () {\n      if (!this.focalPoint) {\n        this._createFocalPoint();\n        this.$focalPointBtn.attr('aria-pressed', 'true');\n      } else {\n        this.canvas.remove(this.focalPoint);\n        this.focalPoint = null;\n        this.$focalPointBtn.attr('aria-pressed', 'false');\n      }\n\n      this.renderImage();\n    },\n\n    /**\n     * Reposition the viewport to handle editor resizing.\n     */\n    _repositionViewport: function () {\n      if (this.viewport) {\n        var dimensions = {\n          left: this.editorWidth / 2,\n          top: this.editorHeight / 2,\n        };\n\n        // If we're cropping, nothing exciting happens for the viewport\n        if (this.currentView === 'crop') {\n          dimensions.width = this.editorWidth;\n          dimensions.height = this.editorHeight;\n        } else {\n          // If this is the first initial reposition, no cropper state yet\n          if (this.cropperState) {\n            // Recall the state\n            var state = this.cropperState;\n\n            var scaledImageDimensions = this.getScaledImageDimensions();\n            // Make sure we have the correct current image size\n            var sizeFactor =\n              scaledImageDimensions.width / state.imageDimensions.width;\n\n            // Set the viewport dimensions\n            dimensions.width = state.width * sizeFactor * this.zoomRatio;\n            dimensions.height = state.height * sizeFactor * this.zoomRatio;\n\n            // Adjust the image position to show the correct part of the image in the viewport\n            this.image.set({\n              left: this.editorWidth / 2 - state.offsetX * sizeFactor,\n              top: this.editorHeight / 2 - state.offsetY * sizeFactor,\n            });\n          } else {\n            $.extend(dimensions, this.getScaledImageDimensions());\n          }\n        }\n        this.viewport.set(dimensions);\n      }\n    },\n\n    _repositionFocalPoint: function (previousEditorDimensions) {\n      if (this.focalPoint) {\n        var offsetX = this.focalPoint.left - this.editorWidth / 2;\n        var offsetY = this.focalPoint.top - this.editorHeight / 2;\n\n        var currentWidth = this.image.width;\n        var newWidth = this.getScaledImageDimensions().width * this.zoomRatio;\n        var ratio = newWidth / currentWidth / this.scaleFactor;\n\n        offsetX -= (previousEditorDimensions.width - this.editorWidth) / 2;\n        offsetY -= (previousEditorDimensions.height - this.editorHeight) / 2;\n\n        offsetX *= ratio;\n        offsetY *= ratio;\n\n        this.focalPoint.set({\n          left: this.editorWidth / 2 + offsetX,\n          top: this.editorHeight / 2 + offsetY,\n        });\n      }\n    },\n\n    /**\n     * Return true if the image orientation has changed\n     */\n    hasOrientationChanged: function () {\n      return this.viewportRotation % 180 !== 0;\n    },\n\n    /**\n     * Return the current image dimensions that would be used in the current image area with no straightening or rotation applied.\n     */\n    getScaledImageDimensions: function () {\n      if (typeof this.getScaledImageDimensions._ === 'undefined') {\n        this.getScaledImageDimensions._ = {};\n      }\n\n      this.getScaledImageDimensions._.imageRatio =\n        this.originalHeight / this.originalWidth;\n      this.getScaledImageDimensions._.editorRatio =\n        this.editorHeight / this.editorWidth;\n\n      this.getScaledImageDimensions._.dimensions = {};\n      if (\n        this.getScaledImageDimensions._.imageRatio >\n        this.getScaledImageDimensions._.editorRatio\n      ) {\n        this.getScaledImageDimensions._.dimensions.height = Math.min(\n          this.editorHeight,\n          this.originalHeight\n        );\n        this.getScaledImageDimensions._.dimensions.width = Math.round(\n          this.originalWidth /\n            (this.originalHeight /\n              this.getScaledImageDimensions._.dimensions.height)\n        );\n      } else {\n        this.getScaledImageDimensions._.dimensions.width = Math.min(\n          this.editorWidth,\n          this.originalWidth\n        );\n        this.getScaledImageDimensions._.dimensions.height = Math.round(\n          this.originalHeight *\n            (this.getScaledImageDimensions._.dimensions.width /\n              this.originalWidth)\n        );\n      }\n\n      return this.getScaledImageDimensions._.dimensions;\n    },\n\n    /**\n     * Set the image dimensions to reflect the current zoom ratio.\n     */\n    _zoomImage: function () {\n      if (typeof this._zoomImage._ === 'undefined') {\n        this._zoomImage._ = {};\n      }\n\n      this._zoomImage._.imageDimensions = this.getScaledImageDimensions();\n      this.image.set({\n        width: this._zoomImage._.imageDimensions.width * this.zoomRatio,\n        height: this._zoomImage._.imageDimensions.height * this.zoomRatio,\n      });\n    },\n\n    /**\n     * Gets previous tab element from currently-active.\n     */\n    _getPrevTab: function () {\n      const activeTabIndex = this._getActiveTabIndex();\n\n      if (activeTabIndex < 0) return;\n\n      let newTabIndex;\n\n      if (activeTabIndex > 0) {\n        newTabIndex = activeTabIndex - 1;\n      } else {\n        newTabIndex = this.$tabs.length - 1;\n      }\n\n      return this.$tabs.eq(newTabIndex);\n    },\n\n    /**\n     * Gets next tab element from currently-active.\n     */\n    _getNextTab: function () {\n      const activeTabIndex = this._getActiveTabIndex();\n\n      if (activeTabIndex < 0) return;\n\n      let newTabIndex;\n\n      if (activeTabIndex < this.$tabs.length - 1) {\n        newTabIndex = activeTabIndex + 1;\n      } else {\n        newTabIndex = 0;\n      }\n\n      return this.$tabs.eq(newTabIndex);\n    },\n\n    /**\n     * Gets active tab element\n     */\n    _getActiveTab: function () {\n      return this.$tabs.filter('[aria-selected=\"true\"]');\n    },\n\n    /**\n     * Gets index of active tab among sibling tabs\n     */\n    _getActiveTabIndex: function () {\n      const $activeTab = this._getActiveTab();\n\n      if (!$activeTab.length) return;\n\n      return $activeTab.index();\n    },\n\n    /**\n     * Set up listeners for the controls.\n     */\n    _addControlListeners: function () {\n      // Tabs\n      this.addListener(this.$tabs, 'click', this._handleTabClick);\n      this.addListener(this.$tabs, 'keydown', (event) => {\n        switch (event.keyCode) {\n          case Garnish.LEFT_KEY:\n          case Garnish.UP_KEY:\n            event.preventDefault();\n            const $prevTab = this._getPrevTab();\n            this.activateTab($prevTab);\n            break;\n          case Garnish.RIGHT_KEY:\n          case Garnish.DOWN_KEY:\n            event.preventDefault();\n            const $nextTab = this._getNextTab();\n            this.activateTab($nextTab);\n            break;\n        }\n      });\n\n      // Focal point\n      this.addListener(this.$focalPointBtn, 'click', this.toggleFocalPoint);\n\n      // Rotate controls\n      this.addListener($('.rotate-left'), 'click', function () {\n        this.rotateImage(-90);\n      });\n      this.addListener($('.rotate-right'), 'click', function () {\n        this.rotateImage(90);\n      });\n      this.addListener($('.flip-vertical'), 'click', function () {\n        this.flipImage('y');\n      });\n      this.addListener($('.flip-horizontal'), 'click', function () {\n        this.flipImage('x');\n      });\n\n      // Straighten slider\n      this.straighteningInput = new Craft.SlideRuleInput('slide-rule', {\n        onStart: () => {\n          this._showGrid();\n        },\n        onChange: (slider) => {\n          this.straighten(slider);\n        },\n        onEnd: () => {\n          this._hideGrid();\n          this._cleanupFocalPointAfterStraighten();\n        },\n      });\n\n      // Cropper scale modifier key\n      this.addListener(Garnish.$doc, 'keydown', function (ev) {\n        if (ev.keyCode === Garnish.SHIFT_KEY) {\n          this.shiftKeyHeld = true;\n        }\n      });\n      this.addListener(Garnish.$doc, 'keyup', function (ev) {\n        if (ev.keyCode === Garnish.SHIFT_KEY) {\n          this.shiftKeyHeld = false;\n        }\n      });\n\n      this.addListener(\n        this.$constraintRadioInputs,\n        'change',\n        this._handleConstraintChange\n      );\n      this.addListener(\n        $('.orientation input', this.$container),\n        'click',\n        this._handleOrientationClick\n      );\n      this.addListener(\n        $('.constraint-group .custom input', this.$container),\n        'keyup',\n        this._applyCustomConstraint\n      );\n    },\n\n    /**\n     * Handle a constraint button click.\n     *\n     * @param {Object} ev\n     */\n    _handleConstraintClick: function (ev) {\n      var constraint = $(ev.currentTarget).data('constraint');\n      var $target = $(ev.currentTarget);\n      $target.siblings().removeClass('active');\n      $target.addClass('active');\n\n      if (constraint == 'custom') {\n        this._showCustomConstraint();\n        this._applyCustomConstraint();\n        return;\n      }\n\n      this._hideCustomConstraint();\n\n      this.setCroppingConstraint(constraint);\n      this.enforceCroppingConstraint();\n    },\n\n    /**\n     * Handle a constraint change.\n     *\n     * @param {Object} ev\n     */\n    _handleConstraintChange: function (ev) {\n      const constraint = $(ev.target).val();\n\n      if (constraint == 'custom') {\n        this._showCustomConstraint();\n        this._applyCustomConstraint();\n        return;\n      }\n\n      this._hideCustomConstraint();\n\n      this.setCroppingConstraint(constraint);\n      this.enforceCroppingConstraint();\n    },\n\n    /**\n     * Handle an orientation switch click.\n     *\n     * @param {Object} ev\n     */\n    _handleOrientationClick: function (ev) {\n      if (ev.currentTarget.value === this.constraintOrientation) {\n        return;\n      }\n      this.constraintOrientation = ev.currentTarget.value;\n\n      const $constraints = $('.flip', this.$constraintContainer);\n\n      for (var i = 0; i < $constraints.length; i++) {\n        var $constraint = $($constraints[i]);\n        const labelSelector = 'label[for=\"' + $constraint.attr('id') + '\"]';\n        const $label = $(labelSelector, this.$constraintContainer);\n        $constraint.val(1 / $constraint.val());\n        $label.html(\n          $label.text().split(':').reverse().join(':').replace(/\\s/g, '')\n        );\n      }\n\n      $constraints.filter(':checked').trigger('change');\n    },\n\n    /**\n     * Apply the custom ratio set in the inputs\n     */\n    _applyCustomConstraint: function () {\n      var constraint = this._getCustomConstraint();\n\n      if (constraint.w > 0 && constraint.h > 0) {\n        this.setCroppingConstraint(constraint.w / constraint.h);\n        this.enforceCroppingConstraint();\n      }\n    },\n\n    /**\n     * Get the custom constraint.\n     *\n     * @returns {{w: *, h: *}}\n     */\n    _getCustomConstraint: function () {\n      var w = parseFloat($('.custom-constraint-w').val());\n      var h = parseFloat($('.custom-constraint-h').val());\n      return {\n        w: isNaN(w) ? 0 : w,\n        h: isNaN(h) ? 0 : h,\n      };\n    },\n\n    /**\n     * Set the custom constraint.\n     *\n     * @param {number} w\n     * @param {number} h\n     */\n    _setCustomConstraint: function (w, h) {\n      $('.custom-constraint-w').val(parseFloat(w));\n      $('.custom-constraint-h').val(parseFloat(h));\n    },\n\n    /**\n     * Hide the custom constraint inputs.\n     */\n    _hideCustomConstraint: function () {\n      this.showingCustomConstraint = false;\n      this.$customConstraints.addClass('hidden');\n      $('.orientation', this.$container).removeClass('hidden');\n    },\n\n    /**\n     * Show the custom constraint inputs.\n     */\n    _showCustomConstraint: function () {\n      if (this.showingCustomConstraint) {\n        return;\n      }\n\n      this.showingCustomConstraint = true;\n      this.$customConstraints.removeClass('hidden');\n      $('.orientation', this.$container).addClass('hidden');\n    },\n\n    /**\n     * Handle tab click.\n     *\n     * @param {Object} ev\n     */\n    _handleTabClick: function (ev) {\n      if (!this.animationInProgress) {\n        var $tab = $(ev.currentTarget);\n        this.activateTab($tab);\n      }\n    },\n\n    /**\n     * Activate a tab.\n     *\n     * @param {(jQuery|HTMLElement|string)} tab\n     */\n\n    activateTab: function (tab) {\n      const view = $(tab).data('view');\n      this.$tabs.removeClass('selected').attr({\n        'aria-selected': 'false',\n        tabindex: '-1',\n      });\n      $(tab)\n        .addClass('selected')\n        .attr({\n          'aria-selected': 'true',\n          tabindex: '0',\n        })\n        .trigger('focus');\n      this.showView(view);\n    },\n\n    /**\n     * Show a view.\n     *\n     * @param {string} view\n     */\n    showView: function (view) {\n      if (this.currentView === view) {\n        return;\n      }\n\n      this.$views.addClass('hidden');\n      var $view = this.$views.filter('[data-view=\"' + view + '\"]');\n      $view.removeClass('hidden');\n\n      if (view === 'rotate') {\n        this.enableSlider();\n      } else {\n        this.disableSlider();\n      }\n\n      // Now that most likely our editor dimensions have changed, time to reposition stuff\n      this.updateSizeAndPosition();\n\n      // See if we have to enable or disable crop mode as we transition between tabs\n      if (this.currentView === 'crop' && view !== 'crop') {\n        this._queue.push(\n          () =>\n            new Promise((resolve, reject) => {\n              this.disableCropMode();\n              resolve();\n            })\n        );\n      } else if (this.currentView !== 'crop' && view === 'crop') {\n        this._queue.push(\n          () =>\n            new Promise((resolve, reject) => {\n              this.enableCropMode();\n              resolve();\n            })\n        );\n      }\n\n      // Mark the current view\n      this.currentView = view;\n    },\n\n    /**\n     * Store the current cropper state.\n     *\n     * Cropper state is always assumed to be saved at a zoom ratio of 1 to be used\n     * as the basis for recalculating the cropper position and dimensions.\n     *\n     * @param {Object} [state]\n     */\n    storeCropperState: function (state) {\n      if (typeof this.storeCropperState._ === 'undefined') {\n        this.storeCropperState._ = {};\n      }\n\n      // If we're asked to store a specific state.\n      if (state) {\n        this.cropperState = state;\n      } else if (this.clipper) {\n        this.storeCropperState._.zoomFactor = 1 / this.zoomRatio;\n\n        this.cropperState = {\n          offsetX:\n            (this.clipper.left - this.image.left) *\n            this.storeCropperState._.zoomFactor,\n          offsetY:\n            (this.clipper.top - this.image.top) *\n            this.storeCropperState._.zoomFactor,\n          height: this.clipper.height * this.storeCropperState._.zoomFactor,\n          width: this.clipper.width * this.storeCropperState._.zoomFactor,\n          imageDimensions: this.getScaledImageDimensions(),\n        };\n      } else {\n        this.storeCropperState._.dimensions = this.getScaledImageDimensions();\n        this.cropperState = {\n          offsetX: 0,\n          offsetY: 0,\n          height: this.storeCropperState._.dimensions.height,\n          width: this.storeCropperState._.dimensions.width,\n          imageDimensions: this.storeCropperState._.dimensions,\n        };\n      }\n    },\n\n    /**\n     * Store focal point coordinates in a manner that is not tied to zoom ratio and rotation.\n     */\n    storeFocalPointState: function (state) {\n      if (typeof this.storeFocalPointState._ === 'undefined') {\n        this.storeFocalPointState._ = {};\n      }\n\n      // If we're asked to store a specific state.\n      if (state) {\n        this.focalPointState = state;\n      } else if (this.focalPoint) {\n        this.storeFocalPointState._.zoomFactor = 1 / this.zoomRatio;\n        this.focalPointState = {\n          offsetX:\n            ((this.focalPoint.left - this.image.left) *\n              this.storeFocalPointState._.zoomFactor) /\n            this.scaleFactor,\n          offsetY:\n            ((this.focalPoint.top - this.image.top) *\n              this.storeFocalPointState._.zoomFactor) /\n            this.scaleFactor,\n          imageDimensions: this.getScaledImageDimensions(),\n        };\n      }\n    },\n\n    /**\n     * Rotate the image along with the viewport.\n     *\n     * @param {number} degrees\n     */\n    rotateImage: function (degrees) {\n      if (!this.animationInProgress) {\n        // We're not that kind of an establishment, sir.\n        if (degrees !== 90 && degrees !== -90) {\n          return false;\n        }\n\n        this.animationInProgress = true;\n        this.viewportRotation += degrees;\n\n        // Normalize the viewport rotation angle so it's between 0 and 359\n        this.viewportRotation = parseInt(\n          (this.viewportRotation + 360) % 360,\n          10\n        );\n\n        var newAngle = this.image.angle + degrees;\n        var scaledImageDimensions = this.getScaledImageDimensions();\n        var imageZoomRatio;\n\n        if (this.hasOrientationChanged()) {\n          imageZoomRatio = this.getZoomToCoverRatio({\n            height: scaledImageDimensions.width,\n            width: scaledImageDimensions.height,\n          });\n        } else {\n          imageZoomRatio = this.getZoomToCoverRatio(scaledImageDimensions);\n        }\n\n        // In cases when for some reason we've already zoomed in on the image,\n        // use existing zoom.\n        if (this.zoomRatio > imageZoomRatio) {\n          imageZoomRatio = this.zoomRatio;\n        }\n\n        var viewportProperties = {\n          angle: degrees === 90 ? '+=90' : '-=90',\n        };\n\n        var imageProperties = {\n          angle: newAngle,\n          width: scaledImageDimensions.width * imageZoomRatio,\n          height: scaledImageDimensions.height * imageZoomRatio,\n        };\n\n        var scaleFactor = 1;\n        if (this.scaleFactor < 1) {\n          scaleFactor = 1 / this.scaleFactor;\n          this.scaleFactor = 1;\n        } else {\n          if (this.viewport.width > this.editorHeight) {\n            scaleFactor = this.editorHeight / this.viewport.width;\n          } else if (this.viewport.height > this.editorWidth) {\n            scaleFactor = this.editorWidth / this.viewport.height;\n          }\n          this.scaleFactor = scaleFactor;\n        }\n\n        if (scaleFactor < 1) {\n          imageProperties.width *= scaleFactor;\n          imageProperties.height *= scaleFactor;\n        }\n\n        var state = this.cropperState;\n\n        // Make sure we reposition the image as well to focus on the same image area\n        var deltaX = state.offsetX;\n        var deltaY = state.offsetY;\n        var angleInRadians = degrees * (Math.PI / 180);\n\n        // Calculate how the cropper would need to move in a circle to maintain\n        // the focus on the same region if the image was rotated with zoom intact.\n        var newDeltaX =\n          deltaX * Math.cos(angleInRadians) - deltaY * Math.sin(angleInRadians);\n        var newDeltaY =\n          deltaX * Math.sin(angleInRadians) + deltaY * Math.cos(angleInRadians);\n\n        var sizeFactor =\n          scaledImageDimensions.width / state.imageDimensions.width;\n\n        var modifiedDeltaX =\n          newDeltaX * sizeFactor * this.zoomRatio * this.scaleFactor;\n        var modifiedDeltaY =\n          newDeltaY * sizeFactor * this.zoomRatio * this.scaleFactor;\n\n        imageProperties.left = this.editorWidth / 2 - modifiedDeltaX;\n        imageProperties.top = this.editorHeight / 2 - modifiedDeltaY;\n\n        state.offsetX = newDeltaX;\n        state.offsetY = newDeltaY;\n\n        var temp = state.width;\n        state.width = state.height;\n        state.height = temp;\n\n        this.storeCropperState(state);\n\n        if (this.focalPoint) {\n          this.canvas.remove(this.focalPoint);\n        }\n\n        this.viewport.animate(viewportProperties, {\n          duration: this.settings.animationDuration,\n          onComplete: () => {\n            // If we're zooming the image in or out, better do the same to viewport\n            var temp = this.viewport.height * scaleFactor;\n            this.viewport.height = this.viewport.width * scaleFactor;\n            this.viewport.width = temp;\n            this.viewport.set({angle: 0});\n          },\n        });\n\n        // Animate the rotation and dimension change\n        this.image.animate(imageProperties, {\n          onChange: this.canvas.renderAll.bind(this.canvas),\n          duration: this.settings.animationDuration,\n          onComplete: () => {\n            var cleanAngle = parseFloat((this.image.angle + 360) % 360);\n            this.image.set({angle: cleanAngle});\n            this.animationInProgress = false;\n            if (this.focalPoint) {\n              this._adjustFocalPointByAngle(degrees);\n              this.straighten(this.straighteningInput);\n              this.canvas.add(this.focalPoint);\n            } else {\n              this._resetFocalPointPosition();\n            }\n          },\n        });\n      }\n    },\n\n    /**\n     * Flip an image along an axis.\n     *\n     * @param {string} axis\n     */\n    flipImage: function (axis) {\n      if (!this.animationInProgress) {\n        this.animationInProgress = true;\n\n        if (this.hasOrientationChanged()) {\n          axis = axis === 'y' ? 'x' : 'y';\n        }\n\n        if (this.focalPoint) {\n          this.canvas.remove(this.focalPoint);\n        } else {\n          this._resetFocalPointPosition();\n        }\n\n        var editorCenter = {x: this.editorWidth / 2, y: this.editorHeight / 2};\n        this.straighteningInput.setValue(-this.imageStraightenAngle);\n        this.imageStraightenAngle = -this.imageStraightenAngle;\n        var properties = {\n          angle: this.viewportRotation + this.imageStraightenAngle,\n        };\n\n        var deltaY, deltaX;\n        var cropperState = this.cropperState;\n        var focalPointState = this.focalPointState;\n\n        // Reposition the image, viewport, and stored cropper and focal point states.\n        if (\n          (axis === 'y' && this.hasOrientationChanged()) ||\n          (axis !== 'y' && !this.hasOrientationChanged())\n        ) {\n          cropperState.offsetX = -cropperState.offsetX;\n          focalPointState.offsetX = -focalPointState.offsetX;\n          deltaX = this.image.left - editorCenter.x;\n          properties.left = editorCenter.x - deltaX;\n        } else {\n          cropperState.offsetY = -cropperState.offsetY;\n          focalPointState.offsetY = -focalPointState.offsetY;\n          deltaY = this.image.top - editorCenter.y;\n          properties.top = editorCenter.y - deltaY;\n        }\n\n        if (axis === 'y') {\n          properties.scaleY = this.image.scaleY * -1;\n          this.flipData.y = 1 - this.flipData.y;\n        } else {\n          properties.scaleX = this.image.scaleX * -1;\n          this.flipData.x = 1 - this.flipData.x;\n        }\n\n        this.storeCropperState(cropperState);\n        this.storeFocalPointState(focalPointState);\n\n        this.image.animate(properties, {\n          onChange: this.canvas.renderAll.bind(this.canvas),\n          duration: this.settings.animationDuration,\n          onComplete: () => {\n            this.animationInProgress = false;\n            if (this.focalPoint) {\n              // Well this is handy\n              this._adjustFocalPointByAngle(0);\n              this.canvas.add(this.focalPoint);\n            }\n          },\n        });\n      }\n    },\n\n    /**\n     * Perform the straightening with input slider.\n     *\n     * @param {Craft.SlideRuleInput} slider\n     */\n    straighten: function (slider) {\n      if (!this.animationInProgress) {\n        this.animationInProgress = true;\n\n        var previousAngle = this.image.angle;\n\n        this.imageStraightenAngle =\n          (this.settings.allowDegreeFractions\n            ? parseFloat(slider.value)\n            : Math.round(parseFloat(slider.value))) % 360;\n\n        // Straighten the image\n        this.image.set({\n          angle: this.viewportRotation + this.imageStraightenAngle,\n        });\n\n        // Set the new zoom ratio\n        this.zoomRatio =\n          this.getZoomToCoverRatio(this.getScaledImageDimensions()) *\n          this.scaleFactor;\n        this._zoomImage();\n\n        if (this.cropperState) {\n          this._adjustEditorElementsOnStraighten(previousAngle);\n        }\n\n        this.renderImage();\n\n        this.animationInProgress = false;\n      }\n    },\n\n    /**\n     * Adjust the cropped viewport when straightening the image to correct for\n     * bumping into edges, keeping focus on the cropped area center and to\n     * maintain the illusion that the image is being straightened relative to the viewport center.\n     *\n     * @param {integer} previousAngle integer the previous image angle before straightening\n     */\n    _adjustEditorElementsOnStraighten: function (previousAngle) {\n      var scaledImageDimensions = this.getScaledImageDimensions();\n      var angleDelta = this.image.angle - previousAngle;\n      var state = this.cropperState;\n\n      var currentZoomRatio = this.zoomRatio;\n      var adjustmentRatio = 1;\n\n      var deltaX, deltaY, newCenterX, newCenterY, sizeFactor;\n\n      do {\n        // Get the cropper center coordinates\n        var cropperCenterX = state.offsetX;\n        var cropperCenterY = state.offsetY;\n        var angleInRadians = angleDelta * (Math.PI / 180);\n\n        // Calculate how the cropper would need to move in a circle to maintain\n        // the focus on the same region if the image was rotated with zoom intact.\n        newCenterX =\n          cropperCenterX * Math.cos(angleInRadians) -\n          cropperCenterY * Math.sin(angleInRadians);\n        newCenterY =\n          cropperCenterX * Math.sin(angleInRadians) +\n          cropperCenterY * Math.cos(angleInRadians);\n\n        sizeFactor = scaledImageDimensions.width / state.imageDimensions.width;\n\n        // Figure out the final image offset to keep the viewport focused where we need it\n        deltaX = newCenterX * currentZoomRatio * sizeFactor;\n        deltaY = newCenterY * currentZoomRatio * sizeFactor;\n\n        // If the image would creep in the viewport, figure out how to math around it.\n        var imageVertices = this.getImageVerticeCoords(currentZoomRatio);\n        var rectangle = {\n          width: this.viewport.width,\n          height: this.viewport.height,\n          left: this.editorWidth / 2 - this.viewport.width / 2 + deltaX,\n          top: this.editorHeight / 2 - this.viewport.height / 2 + deltaY,\n        };\n        adjustmentRatio = this._getZoomRatioToFitRectangle(\n          rectangle,\n          imageVertices\n        );\n        currentZoomRatio = currentZoomRatio * adjustmentRatio;\n\n        // If we had to make adjustments, do the calculations again\n      } while (adjustmentRatio !== 1);\n\n      // Reposition the image correctly\n      this.image.set({\n        left: this.editorWidth / 2 - deltaX,\n        top: this.editorHeight / 2 - deltaY,\n      });\n\n      // Finally, store the new cropper state to reflect the rotation change.\n      state.offsetX = newCenterX;\n      state.offsetY = newCenterY;\n      state.width = this.viewport.width / currentZoomRatio / sizeFactor;\n      state.height = this.viewport.height / currentZoomRatio / sizeFactor;\n\n      this.storeCropperState(state);\n\n      // Zoom the image in and we're done.\n      this.zoomRatio = currentZoomRatio;\n\n      if (this.focalPoint) {\n        this._adjustFocalPointByAngle(angleDelta);\n\n        if (!this._isCenterInside(this.focalPoint, this.viewport)) {\n          this.focalPoint.set({opacity: 0});\n        } else {\n          this.focalPoint.set({opacity: 1});\n        }\n      } else if (angleDelta !== 0) {\n        this._resetFocalPointPosition();\n      }\n\n      this._zoomImage();\n    },\n\n    /**\n     * If focal point is active and outside of viewport after straightening, reset it.\n     */\n    _cleanupFocalPointAfterStraighten: function () {\n      if (\n        this.focalPoint &&\n        !this._isCenterInside(this.focalPoint, this.viewport)\n      ) {\n        this.focalPoint.set({opacity: 1});\n        var state = this.focalPointState;\n        state.offsetX = 0;\n        state.offsetY = 0;\n        this.storeFocalPointState(state);\n        this.toggleFocalPoint();\n      }\n    },\n\n    /**\n     * Reset focal point to the middle of image.\n     */\n    _resetFocalPointPosition: function () {\n      var state = this.focalPointState;\n      state.offsetX = 0;\n      state.offsetY = 0;\n      this.storeFocalPointState(state);\n    },\n\n    /**\n     * Returns true if a center of an object is inside another rectangle shaped object that is not rotated.\n     *\n     * @param {Object} object\n     * @param {Object} containingObject\n     * @returns {boolean}\n     */\n    _isCenterInside: function (object, containingObject) {\n      return (\n        object.left > containingObject.left - containingObject.width / 2 &&\n        object.top > containingObject.top - containingObject.height / 2 &&\n        object.left < containingObject.left + containingObject.width / 2 &&\n        object.top < containingObject.top + containingObject.height / 2\n      );\n    },\n\n    /**\n     * Adjust the focal point by an angle in degrees.\n     * @param {number} angle\n     */\n    _adjustFocalPointByAngle: function (angle) {\n      var angleInRadians = angle * (Math.PI / 180);\n      var state = this.focalPointState;\n\n      var focalX = state.offsetX;\n      var focalY = state.offsetY;\n\n      // Calculate how the focal point would need to move in a circle to keep on the same spot\n      // on the image if it was rotated with zoom intact.\n      var newFocalX =\n        focalX * Math.cos(angleInRadians) - focalY * Math.sin(angleInRadians);\n      var newFocalY =\n        focalX * Math.sin(angleInRadians) + focalY * Math.cos(angleInRadians);\n      var sizeFactor =\n        this.getScaledImageDimensions().width / state.imageDimensions.width;\n\n      var adjustedFocalX = newFocalX * sizeFactor * this.zoomRatio;\n      var adjustedFocalY = newFocalY * sizeFactor * this.zoomRatio;\n\n      this.focalPoint.left = this.image.left + adjustedFocalX;\n      this.focalPoint.top = this.image.top + adjustedFocalY;\n\n      state.offsetX = newFocalX;\n      state.offsetY = newFocalY;\n      this.storeFocalPointState(state);\n    },\n\n    /**\n     * Get the zoom ratio required to fit a rectangle within another rectangle, that is defined by vertices.\n     * If the rectangle fits, 1 will be returned.\n     *\n     * @param {Object} rectangle\n     * @param {Object} containingVertices\n     */\n    _getZoomRatioToFitRectangle: function (rectangle, containingVertices) {\n      var rectangleVertices = this._getRectangleVertices(rectangle);\n      var vertex;\n\n      // Check if any of the viewport vertices end up out of bounds\n      for (\n        var verticeIndex = 0;\n        verticeIndex < rectangleVertices.length;\n        verticeIndex++\n      ) {\n        vertex = rectangleVertices[verticeIndex];\n\n        if (!this.arePointsInsideRectangle([vertex], containingVertices)) {\n          break;\n        }\n\n        vertex = false;\n      }\n\n      // If there's no vertex set after loop, it means that all of them are inside the image rectangle\n      var adjustmentRatio;\n\n      if (!vertex) {\n        adjustmentRatio = 1;\n      } else {\n        // Find out which edge got crossed by the vertex\n        var edge = this._getEdgeCrossed(containingVertices, vertex);\n\n        var rectangleCenter = {\n          x: rectangle.left + rectangle.width / 2,\n          y: rectangle.top + rectangle.height / 2,\n        };\n\n        // Calculate how much further that edge needs to be.\n        // https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Line_defined_by_two_points\n        var distanceFromVertexToEdge =\n          Math.abs(\n            (edge[1].y - edge[0].y) * vertex.x -\n              (edge[1].x - edge[0].x) * vertex.y +\n              edge[1].x * edge[0].y -\n              edge[1].y * edge[0].x\n          ) /\n          Math.sqrt(\n            Math.pow(edge[1].y - edge[0].y, 2) +\n              Math.pow(edge[1].x - edge[0].x, 2)\n          );\n        var distanceFromCenterToEdge =\n          Math.abs(\n            (edge[1].y - edge[0].y) * rectangleCenter.x -\n              (edge[1].x - edge[0].x) * rectangleCenter.y +\n              edge[1].x * edge[0].y -\n              edge[1].y * edge[0].x\n          ) /\n          Math.sqrt(\n            Math.pow(edge[1].y - edge[0].y, 2) +\n              Math.pow(edge[1].x - edge[0].x, 2)\n          );\n\n        // Adjust the zoom ratio\n        adjustmentRatio =\n          (distanceFromVertexToEdge + distanceFromCenterToEdge) /\n          distanceFromCenterToEdge;\n      }\n\n      return adjustmentRatio;\n    },\n\n    /**\n     * Save the image.\n     *\n     * @param {Object} ev\n     */\n    saveImage: function (ev) {\n      var $button = $(ev.currentTarget);\n      if (this.saving) {\n        return false;\n      }\n\n      this.saving = true;\n      $button.addClass('loading');\n      const replace = $button.hasClass('replace');\n\n      var postData = {\n        assetId: this.assetId,\n        viewportRotation: this.viewportRotation,\n        imageRotation: this.imageStraightenAngle,\n        replace: replace ? 1 : 0,\n      };\n\n      if (this.cropperState) {\n        var cropData = {};\n\n        cropData.height = this.cropperState.height;\n        cropData.width = this.cropperState.width;\n        cropData.offsetX = this.cropperState.offsetX;\n        cropData.offsetY = this.cropperState.offsetY;\n\n        postData.imageDimensions = this.cropperState.imageDimensions;\n\n        postData.cropData = cropData;\n      } else {\n        postData.imageDimensions = this.getScaledImageDimensions();\n      }\n\n      if (this.focalPoint) {\n        postData.focalPoint = this.focalPointState;\n      }\n\n      postData.flipData = this.flipData;\n      postData.zoom = this.zoomRatio;\n\n      Craft.sendActionRequest('POST', 'assets/save-image', {data: postData})\n        .then(({data}) => {\n          this.onSave(data);\n          if (replace && Craft.broadcaster) {\n            Craft.broadcaster.postMessage({\n              event: 'saveElement',\n              id: this.assetId,\n            });\n          }\n          this.hide();\n          Craft.cp.runQueue();\n\n          // Refresh Live Preview\n          Craft.Preview.refresh();\n        })\n        .catch(({response}) => {\n          alert(response.data.message);\n        })\n        .finally(() => {\n          this.$buttons.find('.btn').removeClass('loading');\n          this.saving = false;\n        });\n    },\n\n    /**\n     * Return image zoom ratio depending on the straighten angle to cover a viewport by given dimensions.\n     *\n     * @param {Object} dimensions\n     */\n    getZoomToCoverRatio: function (dimensions) {\n      // Convert the angle to radians\n      var angleInRadians =\n        Math.abs(this.imageStraightenAngle) * (Math.PI / 180);\n\n      // Calculate the dimensions of the scaled image using the magic of math\n      var scaledWidth =\n        Math.sin(angleInRadians) * dimensions.height +\n        Math.cos(angleInRadians) * dimensions.width;\n      var scaledHeight =\n        Math.sin(angleInRadians) * dimensions.width +\n        Math.cos(angleInRadians) * dimensions.height;\n\n      // Calculate the ratio\n      return Math.max(\n        scaledWidth / dimensions.width,\n        scaledHeight / dimensions.height\n      );\n    },\n\n    /**\n     * Return image zoom ratio depending on the straighten angle to fit inside a viewport by given dimensions.\n     *\n     * @param {Object} dimensions\n     */\n    getZoomToFitRatio: function (dimensions) {\n      // Get the bounding box for a rotated image\n      var boundingBox = this._getImageBoundingBox(dimensions);\n\n      // Scale the bounding box to fit\n      var scale = 1;\n      if (\n        boundingBox.height > this.editorHeight ||\n        boundingBox.width > this.editorWidth\n      ) {\n        var vertScale = this.editorHeight / boundingBox.height;\n        var horiScale = this.editorWidth / boundingBox.width;\n        scale = Math.min(horiScale, vertScale);\n      }\n\n      return scale;\n    },\n\n    /**\n     * Return the combined zoom ratio to fit a rectangle inside image that's been zoomed to fit.\n     */\n    getCombinedZoomRatio: function (dimensions) {\n      return (\n        this.getZoomToCoverRatio(dimensions) /\n        this.getZoomToFitRatio(dimensions)\n      );\n    },\n\n    /**\n     * Draw the grid.\n     *\n     * @private\n     */\n    _showGrid: function () {\n      if (!this.grid) {\n        var strokeOptions = {\n          strokeWidth: 1,\n          stroke: 'rgba(255,255,255,0.5)',\n        };\n\n        var lineCount = 8;\n        var gridWidth = this.viewport.width;\n        var gridHeight = this.viewport.height;\n        var xStep = gridWidth / (lineCount + 1);\n        var yStep = gridHeight / (lineCount + 1);\n\n        var grid = [\n          new fabric.Rect({\n            strokeWidth: 2,\n            stroke: 'rgba(255,255,255,1)',\n            originX: 'center',\n            originY: 'center',\n            width: gridWidth,\n            height: gridHeight,\n            left: gridWidth / 2,\n            top: gridHeight / 2,\n            fill: 'rgba(255,255,255,0)',\n          }),\n        ];\n\n        var i;\n        for (i = 1; i <= lineCount; i++) {\n          grid.push(\n            new fabric.Line(\n              [i * xStep, 0, i * xStep, gridHeight],\n              strokeOptions\n            )\n          );\n        }\n        for (i = 1; i <= lineCount; i++) {\n          grid.push(\n            new fabric.Line([0, i * yStep, gridWidth, i * yStep], strokeOptions)\n          );\n        }\n\n        this.grid = new fabric.Group(grid, {\n          left: this.editorWidth / 2,\n          top: this.editorHeight / 2,\n          originX: 'center',\n          originY: 'center',\n          angle: this.viewport.angle,\n        });\n\n        this.canvas.add(this.grid);\n        this.renderImage();\n      }\n    },\n\n    /**\n     * Hide the grid\n     */\n    _hideGrid: function () {\n      this.canvas.remove(this.grid);\n      this.grid = null;\n      this.renderImage();\n    },\n\n    /**\n     * Remove all the events when hiding the editor.\n     */\n    onFadeOut: function () {\n      this.destroy();\n    },\n\n    /**\n     * Make sure underlying content is not scrolled by accident.\n     */\n    show: function () {\n      this.base();\n      Garnish.$bod.addClass('no-scroll');\n    },\n\n    /**\n     * Allow the content to scroll.\n     */\n    hide: function () {\n      this.removeAllListeners();\n      this.straighteningInput.removeAllListeners();\n      Garnish.$bod.removeClass('no-scroll');\n      this.base();\n    },\n\n    /**\n     * onSave callback.\n     */\n    onSave: function (data) {\n      this.settings.onSave(data);\n      this.trigger('save');\n    },\n\n    /**\n     * Enable the rotation slider.\n     */\n    enableSlider: function () {\n      this.$imageTools.removeClass('hidden');\n    },\n\n    /**\n     * Disable the rotation slider.\n     */\n    disableSlider: function () {\n      this.$imageTools.addClass('hidden');\n    },\n\n    /**\n     * Switch to crop mode.\n     */\n    enableCropMode: function () {\n      var imageDimensions = this.getScaledImageDimensions();\n      this.zoomRatio = this.getZoomToFitRatio(imageDimensions);\n\n      var viewportProperties = {\n        width: this.editorWidth,\n        height: this.editorHeight,\n      };\n\n      var imageProperties = {\n        width: imageDimensions.width * this.zoomRatio,\n        height: imageDimensions.height * this.zoomRatio,\n        left: this.editorWidth / 2,\n        top: this.editorHeight / 2,\n      };\n\n      var callback = () => {\n        this._setFittedImageVerticeCoordinates();\n\n        // Restore cropper\n        var state = this.cropperState;\n        var scaledImageDimensions = this.getScaledImageDimensions();\n        var sizeFactor =\n          scaledImageDimensions.width / state.imageDimensions.width;\n\n        // Restore based on the stored information\n        var cropperData = {\n          left: this.image.left + state.offsetX * sizeFactor * this.zoomRatio,\n          top: this.image.top + state.offsetY * sizeFactor * this.zoomRatio,\n          width: state.width * sizeFactor * this.zoomRatio,\n          height: state.height * sizeFactor * this.zoomRatio,\n        };\n\n        this._showCropper(cropperData);\n\n        if (this.focalPoint) {\n          sizeFactor =\n            scaledImageDimensions.width /\n            this.focalPointState.imageDimensions.width;\n          this.focalPoint.left =\n            this.image.left +\n            this.focalPointState.offsetX * sizeFactor * this.zoomRatio;\n          this.focalPoint.top =\n            this.image.top +\n            this.focalPointState.offsetY * sizeFactor * this.zoomRatio;\n          this.canvas.add(this.focalPoint);\n        }\n      };\n\n      this._editorModeTransition(callback, imageProperties, viewportProperties);\n    },\n\n    /**\n     * Switch out of crop mode.\n     */\n    disableCropMode: function () {\n      var viewportProperties = {};\n\n      this._hideCropper();\n      var imageDimensions = this.getScaledImageDimensions();\n      var targetZoom =\n        this.getZoomToCoverRatio(imageDimensions) * this.scaleFactor;\n      var inverseZoomFactor = targetZoom / this.zoomRatio;\n      this.zoomRatio = targetZoom;\n\n      var imageProperties = {\n        width: imageDimensions.width * this.zoomRatio,\n        height: imageDimensions.height * this.zoomRatio,\n        left: this.editorWidth / 2,\n        top: this.editorHeight / 2,\n      };\n\n      var offsetX = this.clipper.left - this.image.left;\n      var offsetY = this.clipper.top - this.image.top;\n\n      var imageOffsetX = offsetX * inverseZoomFactor;\n      var imageOffsetY = offsetY * inverseZoomFactor;\n      imageProperties.left = this.editorWidth / 2 - imageOffsetX;\n      imageProperties.top = this.editorHeight / 2 - imageOffsetY;\n\n      // Calculate the cropper dimensions after all the zooming\n      viewportProperties.height = this.clipper.height * inverseZoomFactor;\n      viewportProperties.width = this.clipper.width * inverseZoomFactor;\n\n      if (\n        !this.focalPoint ||\n        (this.focalPoint &&\n          !this._isCenterInside(this.focalPoint, this.clipper))\n      ) {\n        if (this.focalPoint) {\n          this.toggleFocalPoint();\n        }\n\n        this._resetFocalPointPosition();\n      }\n\n      var callback = () => {\n        // Reposition focal point correctly\n        if (this.focalPoint) {\n          var sizeFactor =\n            this.getScaledImageDimensions().width /\n            this.focalPointState.imageDimensions.width;\n          this.focalPoint.left =\n            this.image.left +\n            this.focalPointState.offsetX * sizeFactor * this.zoomRatio;\n          this.focalPoint.top =\n            this.image.top +\n            this.focalPointState.offsetY * sizeFactor * this.zoomRatio;\n          this.canvas.add(this.focalPoint);\n        }\n      };\n\n      this._editorModeTransition(callback, imageProperties, viewportProperties);\n    },\n\n    /**\n     * @callback editorModeTransitionCallback\n     */\n    /**\n     * Transition between cropping end editor modes\n     *\n     * @param {editorModeTransitionCallback}\n     * @param {Object} imageProperties\n     * @param {Object} viewportProperties\n     * @private\n     */\n    _editorModeTransition: function (\n      callback,\n      imageProperties,\n      viewportProperties\n    ) {\n      this._queue.pause();\n\n      if (!this.animationInProgress) {\n        this.animationInProgress = true;\n\n        // Without this it looks semi-broken during animation\n        if (this.focalPoint) {\n          this.canvas.remove(this.focalPoint);\n          this.renderImage();\n        }\n\n        this.image.animate(imageProperties, {\n          onChange: this.canvas.renderAll.bind(this.canvas),\n          duration: this.settings.animationDuration,\n          onComplete: () => {\n            callback();\n            this.animationInProgress = false;\n            this.renderImage();\n            this._queue.resume();\n          },\n        });\n\n        this.viewport.animate(viewportProperties, {\n          duration: this.settings.animationDuration,\n        });\n      }\n    },\n\n    _showSpinner: function () {\n      if (!this.$spinner) {\n        this.$spinner = $('<div class=\"spinner big spinner-absolute\"/>');\n      }\n      this.$spinner.appendTo(this.$container.find('.image'));\n    },\n\n    _hideSpinner: function () {\n      this.$spinner.remove();\n    },\n\n    /**\n     * Show the cropper.\n     *\n     * @param {Object} clipperData\n     */\n    _showCropper: function (clipperData) {\n      this._setupCropperLayer(clipperData);\n      this._redrawCropperElements();\n      this.renderCropper();\n    },\n\n    /**\n     * Hide the cropper.\n     */\n    _hideCropper: function () {\n      if (this.clipper) {\n        this.croppingCanvas.remove(this.clipper);\n        this.croppingCanvas.remove(this.croppingShade);\n        this.croppingCanvas.remove(this.cropperHandles);\n        this.croppingCanvas.remove(this.cropperGrid);\n        this.croppingCanvas.remove(this.croppingRectangle);\n\n        this.croppingCanvas = null;\n        this.renderCropper = null;\n      }\n    },\n\n    /**\n     * Draw the cropper.\n     *\n     * @param {Object} clipperData\n     */\n    _setupCropperLayer: function (clipperData) {\n      // Set up the canvas for cropper\n      this.croppingCanvas = new fabric.StaticCanvas('cropping-canvas', {\n        backgroundColor: 'rgba(0,0,0,0)',\n        hoverCursor: 'default',\n        selection: false,\n      });\n\n      this.croppingCanvas.setDimensions({\n        width: this.editorWidth,\n        height: this.editorHeight,\n      });\n\n      this.renderCropper = () =>\n        Garnish.requestAnimationFrame(\n          this.croppingCanvas.renderAll.bind(this.croppingCanvas)\n        );\n\n      $('#cropping-canvas', this.$editorContainer).css({\n        position: 'absolute',\n        top: 0,\n        left: 0,\n      });\n\n      this.croppingShade = new fabric.Rect({\n        left: this.editorWidth / 2,\n        top: this.editorHeight / 2,\n        originX: 'center',\n        originY: 'center',\n        width: this.editorWidth,\n        height: this.editorHeight,\n        fill: 'rgba(0,0,0,0.7)',\n      });\n\n      // Calculate the cropping rectangle size\n      var imageDimensions = this.getScaledImageDimensions();\n      var rectangleRatio =\n        this.imageStraightenAngle === 0\n          ? 1\n          : this.getCombinedZoomRatio(imageDimensions) * 1.2;\n      var rectWidth = imageDimensions.width / rectangleRatio;\n      var rectHeight = imageDimensions.height / rectangleRatio;\n\n      if (this.hasOrientationChanged()) {\n        var temp = rectHeight;\n        rectHeight = rectWidth;\n        rectWidth = temp;\n      }\n\n      // Set up the cropping viewport rectangle\n      this.clipper = new fabric.Rect({\n        left: this.editorWidth / 2,\n        top: this.editorHeight / 2,\n        originX: 'center',\n        originY: 'center',\n        width: rectWidth,\n        height: rectHeight,\n        stroke: 'black',\n        fill: 'rgba(128,0,0,1)',\n        strokeWidth: 0,\n      });\n\n      // Set from clipper data\n      if (clipperData) {\n        this.clipper.set(clipperData);\n      }\n\n      this.clipper.globalCompositeOperation = 'destination-out';\n      this.croppingCanvas.add(this.croppingShade);\n      this.croppingCanvas.add(this.clipper);\n    },\n\n    /**\n     * Redraw the cropper boundaries\n     */\n    _redrawCropperElements: function () {\n      if (typeof this._redrawCropperElements._ === 'undefined') {\n        this._redrawCropperElements._ = {};\n      }\n\n      if (this.cropperHandles) {\n        this.croppingCanvas.remove(this.cropperHandles);\n        this.croppingCanvas.remove(this.cropperGrid);\n        this.croppingCanvas.remove(this.croppingRectangle);\n      }\n      this._redrawCropperElements._.lineOptions = {\n        strokeWidth: 4,\n        stroke: 'rgb(255,255,255)',\n        fill: false,\n      };\n\n      this._redrawCropperElements._.gridOptions = {\n        strokeWidth: 2,\n        stroke: 'rgba(255,255,255,0.5)',\n      };\n\n      // Draw the handles\n      this._redrawCropperElements._.pathGroup = [\n        new fabric.Path(\n          'M 0,10 L 0,0 L 10,0',\n          this._redrawCropperElements._.lineOptions\n        ),\n        new fabric.Path(\n          'M ' +\n            (this.clipper.width - 8) +\n            ',0 L ' +\n            (this.clipper.width + 4) +\n            ',0 L ' +\n            (this.clipper.width + 4) +\n            ',10',\n          this._redrawCropperElements._.lineOptions\n        ),\n        new fabric.Path(\n          'M ' +\n            (this.clipper.width + 4) +\n            ',' +\n            (this.clipper.height - 8) +\n            ' L' +\n            (this.clipper.width + 4) +\n            ',' +\n            (this.clipper.height + 4) +\n            ' L ' +\n            (this.clipper.width - 8) +\n            ',' +\n            (this.clipper.height + 4),\n          this._redrawCropperElements._.lineOptions\n        ),\n        new fabric.Path(\n          'M 10,' +\n            (this.clipper.height + 4) +\n            ' L 0,' +\n            (this.clipper.height + 4) +\n            ' L 0,' +\n            (this.clipper.height - 8),\n          this._redrawCropperElements._.lineOptions\n        ),\n      ];\n\n      this.cropperHandles = new fabric.Group(\n        this._redrawCropperElements._.pathGroup,\n        {\n          left: this.clipper.left,\n          top: this.clipper.top,\n          originX: 'center',\n          originY: 'center',\n        }\n      );\n\n      // Don't forget the rectangle\n      this.croppingRectangle = new fabric.Rect({\n        left: this.clipper.left,\n        top: this.clipper.top,\n        width: this.clipper.width,\n        height: this.clipper.height,\n        fill: 'rgba(0,0,0,0)',\n        stroke: 'rgba(255,255,255,0.8)',\n        strokeWidth: 2,\n        originX: 'center',\n        originY: 'center',\n      });\n\n      this.cropperGrid = new fabric.Group(\n        [\n          new fabric.Line(\n            [\n              this.clipper.width * 0.33,\n              0,\n              this.clipper.width * 0.33,\n              this.clipper.height,\n            ],\n            this._redrawCropperElements._.gridOptions\n          ),\n          new fabric.Line(\n            [\n              this.clipper.width * 0.66,\n              0,\n              this.clipper.width * 0.66,\n              this.clipper.height,\n            ],\n            this._redrawCropperElements._.gridOptions\n          ),\n          new fabric.Line(\n            [\n              0,\n              this.clipper.height * 0.33,\n              this.clipper.width,\n              this.clipper.height * 0.33,\n            ],\n            this._redrawCropperElements._.gridOptions\n          ),\n          new fabric.Line(\n            [\n              0,\n              this.clipper.height * 0.66,\n              this.clipper.width,\n              this.clipper.height * 0.66,\n            ],\n            this._redrawCropperElements._.gridOptions\n          ),\n        ],\n        {\n          left: this.clipper.left,\n          top: this.clipper.top,\n          originX: 'center',\n          originY: 'center',\n        }\n      );\n\n      this._redrawCropperElements._.cropTextTop =\n        this.croppingRectangle.top + this.clipper.height / 2 + 12;\n      this._redrawCropperElements._.cropTextBackgroundColor = 'rgba(0,0,0,0)';\n\n      if (\n        this._redrawCropperElements._.cropTextTop + 12 >\n        this.editorHeight - 2\n      ) {\n        this._redrawCropperElements._.cropTextTop -= 24;\n        this._redrawCropperElements._.cropTextBackgroundColor =\n          'rgba(0,0,0,0.5)';\n      }\n\n      this.croppingCanvas.add(this.cropperHandles);\n      this.croppingCanvas.add(this.cropperGrid);\n      this.croppingCanvas.add(this.croppingRectangle);\n    },\n\n    /**\n     * Reposition the cropper when the image editor dimensions change.\n     *\n     * @param {Object} previousImageArea\n     */\n    _repositionCropper: function (previousImageArea) {\n      if (!this.croppingCanvas) {\n        return;\n      }\n\n      // Get the current clipper offset relative to center\n      var currentOffset = {\n        x: this.clipper.left - this.croppingCanvas.width / 2,\n        y: this.clipper.top - this.croppingCanvas.height / 2,\n      };\n\n      // Resize the cropping canvas\n      this.croppingCanvas.setDimensions({\n        width: this.editorWidth,\n        height: this.editorHeight,\n      });\n\n      // Check by what factor will the new final bounding box be different\n      var currentArea = this._getBoundingRectangle(this.imageVerticeCoords);\n      var areaFactor = currentArea.width / previousImageArea.width;\n\n      // Adjust the cropper size to scale along with the bounding box\n      this.clipper.width = Math.round(this.clipper.width * areaFactor);\n      this.clipper.height = Math.round(this.clipper.height * areaFactor);\n\n      // Adjust the coordinates: re-position clipper in relation to the new center to adjust\n      // for editor size changes and then multiply by the size factor to adjust for image size changes\n      this.clipper.left = this.editorWidth / 2 + currentOffset.x * areaFactor;\n      this.clipper.top = this.editorHeight / 2 + currentOffset.y * areaFactor;\n\n      // Resize the cropping shade\n      this.croppingShade.set({\n        width: this.editorWidth,\n        height: this.editorHeight,\n        left: this.editorWidth / 2,\n        top: this.editorHeight / 2,\n      });\n\n      this._redrawCropperElements();\n      this.renderCropper();\n    },\n\n    /**\n     * Get the dimensions of a bounding rectangle by a set of four coordinates.\n     *\n     * @param {Object} coordinateSet\n     */\n    _getBoundingRectangle: function (coordinateSet) {\n      return {\n        width:\n          Math.max(\n            coordinateSet.a.x,\n            coordinateSet.b.x,\n            coordinateSet.c.x,\n            coordinateSet.d.x\n          ) -\n          Math.min(\n            coordinateSet.a.x,\n            coordinateSet.b.x,\n            coordinateSet.c.x,\n            coordinateSet.d.x\n          ),\n        height:\n          Math.max(\n            coordinateSet.a.y,\n            coordinateSet.b.y,\n            coordinateSet.c.y,\n            coordinateSet.d.y\n          ) -\n          Math.min(\n            coordinateSet.a.y,\n            coordinateSet.b.y,\n            coordinateSet.c.y,\n            coordinateSet.d.y\n          ),\n      };\n    },\n\n    /**\n     * Handle the mouse being clicked.\n     *\n     * @param {Object} ev\n     */\n    _handleMouseDown: function (ev) {\n      // Focal before resize before dragging\n      var focal = this.focalPoint && this._isMouseOver(ev, this.focalPoint);\n      var move = this.croppingCanvas && this._isMouseOver(ev, this.clipper);\n      var handle = this.croppingCanvas && this._cropperHandleHitTest(ev);\n\n      if (handle || move || focal) {\n        this.previousMouseX = ev.pageX;\n        this.previousMouseY = ev.pageY;\n\n        if (focal) {\n          this.draggingFocal = true;\n        } else if (handle) {\n          this.scalingCropper = handle;\n        } else if (move) {\n          this.draggingCropper = true;\n        }\n      }\n    },\n\n    /**\n     * Handle the mouse being moved.\n     *\n     * @param {Object} ev\n     */\n    _handleMouseMove: function (ev) {\n      if (this.mouseMoveEvent !== null) {\n        Garnish.requestAnimationFrame(this._handleMouseMoveInternal.bind(this));\n      }\n      this.mouseMoveEvent = ev;\n    },\n\n    _handleMouseMoveInternal: function () {\n      if (this.mouseMoveEvent === null) {\n        return;\n      }\n\n      if (this.focalPoint && this.draggingFocal) {\n        this._handleFocalDrag(this.mouseMoveEvent);\n        this.storeFocalPointState();\n        this.renderImage();\n      } else if (this.draggingCropper || this.scalingCropper) {\n        if (this.draggingCropper) {\n          this._handleCropperDrag(this.mouseMoveEvent);\n        } else {\n          this._handleCropperResize(this.mouseMoveEvent);\n        }\n\n        this._redrawCropperElements();\n\n        this.storeCropperState();\n        this.renderCropper();\n      } else {\n        this._setMouseCursor(this.mouseMoveEvent);\n      }\n\n      this.previousMouseX = this.mouseMoveEvent.pageX;\n      this.previousMouseY = this.mouseMoveEvent.pageY;\n\n      this.mouseMoveEvent = null;\n    },\n\n    /**\n     * Handle mouse being released.\n     */\n    _handleMouseUp: function () {\n      this.draggingCropper = false;\n      this.scalingCropper = false;\n      this.draggingFocal = false;\n    },\n\n    /**\n     * Handle mouse out\n     *\n     * @param {Object} ev\n     */\n    _handleMouseOut: function (ev) {\n      this._handleMouseUp(ev);\n      this.mouseMoveEvent = ev;\n      this._handleMouseMoveInternal();\n    },\n\n    /**\n     * Handle cropper being dragged.\n     *\n     * @param {Object} ev\n     */\n    _handleCropperDrag: function (ev) {\n      if (typeof this._handleCropperDrag._ === 'undefined') {\n        this._handleCropperDrag._ = {};\n      }\n\n      this._handleCropperDrag._.deltaX = ev.pageX - this.previousMouseX;\n      this._handleCropperDrag._.deltaY = ev.pageY - this.previousMouseY;\n\n      if (\n        this._handleCropperDrag._.deltaX === 0 &&\n        this._handleCropperDrag._.deltaY === 0\n      ) {\n        return false;\n      }\n\n      this._handleCropperDrag._.rectangle = {\n        left: this.clipper.left - this.clipper.width / 2,\n        top: this.clipper.top - this.clipper.height / 2,\n        width: this.clipper.width,\n        height: this.clipper.height,\n      };\n\n      this._handleCropperDrag._.vertices = this._getRectangleVertices(\n        this._handleCropperDrag._.rectangle,\n        this._handleCropperDrag._.deltaX,\n        this._handleCropperDrag._.deltaY\n      );\n\n      // If this would drag it outside of the image\n      if (\n        !this.arePointsInsideRectangle(\n          this._handleCropperDrag._.vertices,\n          this.imageVerticeCoords\n        )\n      ) {\n        // Try to find the furthest point in the same general direction where we can drag it\n\n        // Delta iterator setup\n        this._handleCropperDrag._.dxi = 0;\n        this._handleCropperDrag._.dyi = 0;\n        this._handleCropperDrag._.xStep =\n          this._handleCropperDrag._.deltaX > 0 ? -1 : 1;\n        this._handleCropperDrag._.yStep =\n          this._handleCropperDrag._.deltaY > 0 ? -1 : 1;\n\n        // The furthest we can move\n        this._handleCropperDrag._.furthest = 0;\n        this._handleCropperDrag._.furthestDeltas = {};\n\n        // Loop through every combination of dragging it not so far\n        for (\n          this._handleCropperDrag._.dxi = Math.min(\n            Math.abs(this._handleCropperDrag._.deltaX),\n            10\n          );\n          this._handleCropperDrag._.dxi >= 0;\n          this._handleCropperDrag._.dxi--\n        ) {\n          for (\n            this._handleCropperDrag._.dyi = Math.min(\n              Math.abs(this._handleCropperDrag._.deltaY),\n              10\n            );\n            this._handleCropperDrag._.dyi >= 0;\n            this._handleCropperDrag._.dyi--\n          ) {\n            this._handleCropperDrag._.vertices = this._getRectangleVertices(\n              this._handleCropperDrag._.rectangle,\n              this._handleCropperDrag._.dxi *\n                (this._handleCropperDrag._.deltaX > 0 ? 1 : -1),\n              this._handleCropperDrag._.dyi *\n                (this._handleCropperDrag._.deltaY > 0 ? 1 : -1)\n            );\n\n            if (\n              this.arePointsInsideRectangle(\n                this._handleCropperDrag._.vertices,\n                this.imageVerticeCoords\n              )\n            ) {\n              if (\n                this._handleCropperDrag._.dxi + this._handleCropperDrag._.dyi >\n                this._handleCropperDrag._.furthest\n              ) {\n                this._handleCropperDrag._.furthest =\n                  this._handleCropperDrag._.dxi + this._handleCropperDrag._.dyi;\n                this._handleCropperDrag._.furthestDeltas = {\n                  x:\n                    this._handleCropperDrag._.dxi *\n                    (this._handleCropperDrag._.deltaX > 0 ? 1 : -1),\n                  y:\n                    this._handleCropperDrag._.dyi *\n                    (this._handleCropperDrag._.deltaY > 0 ? 1 : -1),\n                };\n              }\n            }\n          }\n        }\n\n        // REALLY can't drag along the cursor movement\n        if (this._handleCropperDrag._.furthest == 0) {\n          return;\n        } else {\n          this._handleCropperDrag._.deltaX =\n            this._handleCropperDrag._.furthestDeltas.x;\n          this._handleCropperDrag._.deltaY =\n            this._handleCropperDrag._.furthestDeltas.y;\n        }\n      }\n\n      this.clipper.set({\n        left: this.clipper.left + this._handleCropperDrag._.deltaX,\n        top: this.clipper.top + this._handleCropperDrag._.deltaY,\n      });\n    },\n\n    /**\n     * Handle focal point being dragged.\n     *\n     * @param {Object} ev\n     */\n    _handleFocalDrag: function (ev) {\n      if (typeof this._handleFocalDrag._ === 'undefined') {\n        this._handleFocalDrag._ = {};\n      }\n\n      if (this.focalPoint) {\n        this._handleFocalDrag._.deltaX = ev.pageX - this.previousMouseX;\n        this._handleFocalDrag._.deltaY = ev.pageY - this.previousMouseY;\n\n        if (\n          this._handleFocalDrag._.deltaX === 0 &&\n          this._handleFocalDrag._.deltaY === 0\n        ) {\n          return;\n        }\n\n        this._handleFocalDrag._.newX =\n          this.focalPoint.left + this._handleFocalDrag._.deltaX;\n        this._handleFocalDrag._.newY =\n          this.focalPoint.top + this._handleFocalDrag._.deltaY;\n\n        // Just make sure that the focal point stays inside the image\n        if (this.currentView === 'crop') {\n          if (\n            !this.arePointsInsideRectangle(\n              [\n                {\n                  x: this._handleFocalDrag._.newX,\n                  y: this._handleFocalDrag._.newY,\n                },\n              ],\n              this.imageVerticeCoords\n            )\n          ) {\n            return;\n          }\n        } else {\n          if (\n            !(\n              this.viewport.left -\n                this.viewport.width / 2 -\n                this._handleFocalDrag._.newX <\n                0 &&\n              this.viewport.left +\n                this.viewport.width / 2 -\n                this._handleFocalDrag._.newX >\n                0 &&\n              this.viewport.top -\n                this.viewport.height / 2 -\n                this._handleFocalDrag._.newY <\n                0 &&\n              this.viewport.top +\n                this.viewport.height / 2 -\n                this._handleFocalDrag._.newY >\n                0\n            )\n          ) {\n            return;\n          }\n        }\n\n        this.focalPoint.set({\n          left: this.focalPoint.left + this._handleFocalDrag._.deltaX,\n          top: this.focalPoint.top + this._handleFocalDrag._.deltaY,\n        });\n      }\n    },\n\n    /**\n     * Set the cropping constraint\n     * @param {string} constraint\n     */\n    setCroppingConstraint: function (constraint) {\n      // In case this caused the sidebar width to change.\n      this.updateSizeAndPosition();\n\n      switch (constraint) {\n        case 'none':\n          this.croppingConstraint = false;\n          break;\n\n        case 'original':\n          this.croppingConstraint = this.originalWidth / this.originalHeight;\n          break;\n\n        case 'current':\n          this.croppingConstraint = this.clipper.width / this.clipper.height;\n          break;\n\n        case 'custom':\n          break;\n        default:\n          this.croppingConstraint = parseFloat(constraint);\n\n          break;\n      }\n    },\n\n    /**\n     * Enforce the cropping constraint\n     */\n    enforceCroppingConstraint: function () {\n      if (typeof this.enforceCroppingConstraint._ === 'undefined') {\n        this.enforceCroppingConstraint._ = {};\n      }\n\n      if (this.animationInProgress || !this.croppingConstraint) {\n        return;\n      }\n\n      this.animationInProgress = true;\n\n      // Mock the clipping rectangle for collision tests\n      this.enforceCroppingConstraint._.rectangle = {\n        left: this.clipper.left - this.clipper.width / 2,\n        top: this.clipper.top - this.clipper.height / 2,\n        width: this.clipper.width,\n        height: this.clipper.height,\n      };\n\n      // If wider than it should be\n      if (this.clipper.width > this.clipper.height * this.croppingConstraint) {\n        this.enforceCroppingConstraint._.previousHeight =\n          this.enforceCroppingConstraint._.rectangle.height;\n\n        // Make it taller!\n        this.enforceCroppingConstraint._.rectangle.height =\n          this.clipper.width / this.croppingConstraint;\n\n        // Getting really awkward having to convert between 0;0 being center or top-left corner.\n        this.enforceCroppingConstraint._.rectangle.top -=\n          (this.enforceCroppingConstraint._.rectangle.height -\n            this.enforceCroppingConstraint._.previousHeight) /\n          2;\n\n        // If the clipper would end up out of bounds, make it narrower instead.\n        if (\n          !this.arePointsInsideRectangle(\n            this._getRectangleVertices(\n              this.enforceCroppingConstraint._.rectangle\n            ),\n            this.imageVerticeCoords\n          )\n        ) {\n          this.enforceCroppingConstraint._.rectangle.width =\n            this.clipper.height * this.croppingConstraint;\n          this.enforceCroppingConstraint._.rectangle.height =\n            this.enforceCroppingConstraint._.rectangle.width /\n            this.croppingConstraint;\n        }\n      } else {\n        // Follow the same pattern, if taller than it should be.\n        this.enforceCroppingConstraint._.previousWidth =\n          this.enforceCroppingConstraint._.rectangle.width;\n        this.enforceCroppingConstraint._.rectangle.width =\n          this.clipper.height * this.croppingConstraint;\n        this.enforceCroppingConstraint._.rectangle.left -=\n          (this.enforceCroppingConstraint._.rectangle.width -\n            this.enforceCroppingConstraint._.previousWidth) /\n          2;\n\n        if (\n          !this.arePointsInsideRectangle(\n            this._getRectangleVertices(\n              this.enforceCroppingConstraint._.rectangle\n            ),\n            this.imageVerticeCoords\n          )\n        ) {\n          this.enforceCroppingConstraint._.rectangle.height =\n            this.clipper.width / this.croppingConstraint;\n          this.enforceCroppingConstraint._.rectangle.width =\n            this.enforceCroppingConstraint._.rectangle.height *\n            this.croppingConstraint;\n        }\n      }\n\n      this.enforceCroppingConstraint._.properties = {\n        height: this.enforceCroppingConstraint._.rectangle.height,\n        width: this.enforceCroppingConstraint._.rectangle.width,\n      };\n\n      // Make sure to redraw cropper handles and gridlines when resizing\n      this.clipper.animate(this.enforceCroppingConstraint._.properties, {\n        onChange: () => {\n          this._redrawCropperElements();\n          this.croppingCanvas.renderAll();\n        },\n        duration: this.settings.animationDuration,\n        onComplete: () => {\n          this._redrawCropperElements();\n          this.animationInProgress = false;\n          this.renderCropper();\n          this.storeCropperState();\n        },\n      });\n    },\n\n    /**\n     * Handle cropper being resized.\n     *\n     * @param {Object} ev\n     */\n    _handleCropperResize: function (ev) {\n      if (typeof this._handleCropperResize._ === 'undefined') {\n        this._handleCropperResize._ = {};\n      }\n\n      // Size deltas\n      this._handleCropperResize._.deltaX = ev.pageX - this.previousMouseX;\n      this._handleCropperResize._.deltaY = ev.pageY - this.previousMouseY;\n\n      if (this.scalingCropper === 'b' || this.scalingCropper === 't') {\n        this._handleCropperResize._.deltaX = 0;\n      }\n\n      if (this.scalingCropper === 'l' || this.scalingCropper === 'r') {\n        this._handleCropperResize._.deltaY = 0;\n      }\n\n      if (\n        this._handleCropperResize._.deltaX === 0 &&\n        this._handleCropperResize._.deltaY === 0\n      ) {\n        return;\n      }\n\n      // Translate from center-center origin to absolute coords\n      this._handleCropperResize._.startingRectangle = {\n        left: this.clipper.left - this.clipper.width / 2,\n        top: this.clipper.top - this.clipper.height / 2,\n        width: this.clipper.width,\n        height: this.clipper.height,\n      };\n\n      this._handleCropperResize._.rectangle =\n        this._calculateNewCropperSizeByDeltas(\n          this._handleCropperResize._.startingRectangle,\n          this._handleCropperResize._.deltaX,\n          this._handleCropperResize._.deltaY,\n          this.scalingCropper\n        );\n\n      if (\n        this._handleCropperResize._.rectangle.height < 30 ||\n        this._handleCropperResize._.rectangle.width < 30\n      ) {\n        return;\n      }\n\n      if (\n        !this.arePointsInsideRectangle(\n          this._getRectangleVertices(this._handleCropperResize._.rectangle),\n          this.imageVerticeCoords\n        )\n      ) {\n        return;\n      }\n\n      // Translate back to center-center origin.\n      this.clipper.set({\n        top:\n          this._handleCropperResize._.rectangle.top +\n          this._handleCropperResize._.rectangle.height / 2,\n        left:\n          this._handleCropperResize._.rectangle.left +\n          this._handleCropperResize._.rectangle.width / 2,\n        width: this._handleCropperResize._.rectangle.width,\n        height: this._handleCropperResize._.rectangle.height,\n      });\n\n      this._redrawCropperElements();\n    },\n\n    _calculateNewCropperSizeByDeltas: function (\n      startingRectangle,\n      deltaX,\n      deltaY,\n      cropperDirection\n    ) {\n      if (typeof this._calculateNewCropperSizeByDeltas._ === 'undefined') {\n        this._calculateNewCropperSizeByDeltas._ = {};\n      }\n\n      // Center deltas\n      this._calculateNewCropperSizeByDeltas._.topDelta = 0;\n      this._calculateNewCropperSizeByDeltas._.leftDelta = 0;\n\n      this._calculateNewCropperSizeByDeltas._.rectangle = startingRectangle;\n      this._calculateNewCropperSizeByDeltas._.deltaX = deltaX;\n      this._calculateNewCropperSizeByDeltas._.deltaY = deltaY;\n\n      // Lock the aspect ratio if needed\n      if (this.croppingConstraint) {\n        this._calculateNewCropperSizeByDeltas._.change = 0;\n\n        // Take into account the mouse direction and figure out the \"real\" change in cropper size\n        switch (cropperDirection) {\n          case 't':\n            this._calculateNewCropperSizeByDeltas._.change =\n              -this._calculateNewCropperSizeByDeltas._.deltaY;\n            break;\n          case 'b':\n            this._calculateNewCropperSizeByDeltas._.change =\n              this._calculateNewCropperSizeByDeltas._.deltaY;\n            break;\n          case 'r':\n            this._calculateNewCropperSizeByDeltas._.change =\n              this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'l':\n            this._calculateNewCropperSizeByDeltas._.change =\n              -this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'tr':\n            this._calculateNewCropperSizeByDeltas._.change =\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n                ? -this._calculateNewCropperSizeByDeltas._.deltaY\n                : this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'tl':\n            this._calculateNewCropperSizeByDeltas._.change =\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n                ? -this._calculateNewCropperSizeByDeltas._.deltaY\n                : -this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'br':\n            this._calculateNewCropperSizeByDeltas._.change =\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n                ? this._calculateNewCropperSizeByDeltas._.deltaY\n                : this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'bl':\n            this._calculateNewCropperSizeByDeltas._.change =\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n                ? this._calculateNewCropperSizeByDeltas._.deltaY\n                : -this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n        }\n\n        if (this.croppingConstraint > 1) {\n          this._calculateNewCropperSizeByDeltas._.deltaX =\n            this._calculateNewCropperSizeByDeltas._.change;\n          this._calculateNewCropperSizeByDeltas._.deltaY =\n            this._calculateNewCropperSizeByDeltas._.deltaX /\n            this.croppingConstraint;\n        } else {\n          this._calculateNewCropperSizeByDeltas._.deltaY =\n            this._calculateNewCropperSizeByDeltas._.change;\n          this._calculateNewCropperSizeByDeltas._.deltaX =\n            this._calculateNewCropperSizeByDeltas._.deltaY *\n            this.croppingConstraint;\n        }\n\n        this._calculateNewCropperSizeByDeltas._.rectangle.height +=\n          this._calculateNewCropperSizeByDeltas._.deltaY;\n        this._calculateNewCropperSizeByDeltas._.rectangle.width +=\n          this._calculateNewCropperSizeByDeltas._.deltaX;\n\n        // Make the cropper compress/expand relative to the correct edge to make it feel \"right\"\n        switch (cropperDirection) {\n          case 't':\n            this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n              this._calculateNewCropperSizeByDeltas._.deltaY;\n            this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n              this._calculateNewCropperSizeByDeltas._.deltaX / 2;\n            break;\n          case 'b':\n            this._calculateNewCropperSizeByDeltas._.rectangle.left +=\n              -this._calculateNewCropperSizeByDeltas._.deltaX / 2;\n            break;\n          case 'r':\n            this._calculateNewCropperSizeByDeltas._.rectangle.top +=\n              -this._calculateNewCropperSizeByDeltas._.deltaY / 2;\n            break;\n          case 'l':\n            this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n              this._calculateNewCropperSizeByDeltas._.deltaY / 2;\n            this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n              this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'tr':\n            this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n              this._calculateNewCropperSizeByDeltas._.deltaY;\n            break;\n          case 'tl':\n            this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n              this._calculateNewCropperSizeByDeltas._.deltaY;\n            this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n              this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'bl':\n            this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n              this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n        }\n      } else {\n        // Lock the aspect ratio\n        if (\n          this.shiftKeyHeld &&\n          (cropperDirection === 'tl' ||\n            cropperDirection === 'tr' ||\n            cropperDirection === 'bl' ||\n            cropperDirection === 'br')\n        ) {\n          this._calculateNewCropperSizeByDeltas._.ratio;\n          if (Math.abs(deltaX) > Math.abs(deltaY)) {\n            this._calculateNewCropperSizeByDeltas._.ratio =\n              startingRectangle.width / startingRectangle.height;\n            this._calculateNewCropperSizeByDeltas._.deltaY =\n              this._calculateNewCropperSizeByDeltas._.deltaX /\n              this._calculateNewCropperSizeByDeltas._.ratio;\n            this._calculateNewCropperSizeByDeltas._.deltaY *=\n              cropperDirection === 'tr' || cropperDirection === 'bl' ? -1 : 1;\n          } else {\n            this._calculateNewCropperSizeByDeltas._.ratio =\n              startingRectangle.width / startingRectangle.height;\n            this._calculateNewCropperSizeByDeltas._.deltaX =\n              this._calculateNewCropperSizeByDeltas._.deltaY *\n              this._calculateNewCropperSizeByDeltas._.ratio;\n            this._calculateNewCropperSizeByDeltas._.deltaX *=\n              cropperDirection === 'tr' || cropperDirection === 'bl' ? -1 : 1;\n          }\n        }\n\n        if (cropperDirection.match(/t/)) {\n          this._calculateNewCropperSizeByDeltas._.rectangle.top +=\n            this._calculateNewCropperSizeByDeltas._.deltaY;\n          this._calculateNewCropperSizeByDeltas._.rectangle.height -=\n            this._calculateNewCropperSizeByDeltas._.deltaY;\n        }\n        if (cropperDirection.match(/b/)) {\n          this._calculateNewCropperSizeByDeltas._.rectangle.height +=\n            this._calculateNewCropperSizeByDeltas._.deltaY;\n        }\n        if (cropperDirection.match(/r/)) {\n          this._calculateNewCropperSizeByDeltas._.rectangle.width +=\n            this._calculateNewCropperSizeByDeltas._.deltaX;\n        }\n        if (cropperDirection.match(/l/)) {\n          this._calculateNewCropperSizeByDeltas._.rectangle.left +=\n            this._calculateNewCropperSizeByDeltas._.deltaX;\n          this._calculateNewCropperSizeByDeltas._.rectangle.width -=\n            this._calculateNewCropperSizeByDeltas._.deltaX;\n        }\n      }\n\n      this._calculateNewCropperSizeByDeltas._.rectangle.top =\n        this._calculateNewCropperSizeByDeltas._.rectangle.top;\n      this._calculateNewCropperSizeByDeltas._.rectangle.left =\n        this._calculateNewCropperSizeByDeltas._.rectangle.left;\n      this._calculateNewCropperSizeByDeltas._.rectangle.width =\n        this._calculateNewCropperSizeByDeltas._.rectangle.width;\n      this._calculateNewCropperSizeByDeltas._.rectangle.height =\n        this._calculateNewCropperSizeByDeltas._.rectangle.height;\n\n      return this._calculateNewCropperSizeByDeltas._.rectangle;\n    },\n\n    /**\n     * Set mouse cursor by it's position over cropper.\n     *\n     * @param {Object} ev\n     */\n    _setMouseCursor: function (ev) {\n      if (typeof this._setMouseCursor._ === 'undefined') {\n        this._setMouseCursor._ = {};\n      }\n\n      if (Garnish.isMobileBrowser(true)) {\n        return;\n      }\n      this._setMouseCursor._.cursor = 'default';\n      this._setMouseCursor._.handle =\n        this.croppingCanvas && this._cropperHandleHitTest(ev);\n      if (this.focalPoint && this._isMouseOver(ev, this.focalPoint)) {\n        this._setMouseCursor._.cursor = 'pointer';\n      } else if (this._setMouseCursor._.handle) {\n        if (\n          this._setMouseCursor._.handle === 't' ||\n          this._setMouseCursor._.handle === 'b'\n        ) {\n          this._setMouseCursor._.cursor = 'ns-resize';\n        } else if (\n          this._setMouseCursor._.handle === 'l' ||\n          this._setMouseCursor._.handle === 'r'\n        ) {\n          this._setMouseCursor._.cursor = 'ew-resize';\n        } else if (\n          this._setMouseCursor._.handle === 'tl' ||\n          this._setMouseCursor._.handle === 'br'\n        ) {\n          this._setMouseCursor._.cursor = 'nwse-resize';\n        } else if (\n          this._setMouseCursor._.handle === 'bl' ||\n          this._setMouseCursor._.handle === 'tr'\n        ) {\n          this._setMouseCursor._.cursor = 'nesw-resize';\n        }\n      } else if (this.croppingCanvas && this._isMouseOver(ev, this.clipper)) {\n        this._setMouseCursor._.cursor = 'move';\n      }\n\n      $('.body').css('cursor', this._setMouseCursor._.cursor);\n    },\n\n    /**\n     * Test whether the mouse cursor is on any cropper handles.\n     *\n     * @param {Object} ev\n     */\n    _cropperHandleHitTest: function (ev) {\n      if (typeof this._cropperHandleHitTest._ === 'undefined') {\n        this._cropperHandleHitTest._ = {};\n      }\n\n      this._cropperHandleHitTest._.parentOffset = this.$croppingCanvas.offset();\n      this._cropperHandleHitTest._.mouseX =\n        ev.pageX - this._cropperHandleHitTest._.parentOffset.left;\n      this._cropperHandleHitTest._.mouseY =\n        ev.pageY - this._cropperHandleHitTest._.parentOffset.top;\n\n      // Compensate for center origin coordinate-wise\n      this._cropperHandleHitTest._.lb =\n        this.clipper.left - this.clipper.width / 2;\n      this._cropperHandleHitTest._.rb =\n        this._cropperHandleHitTest._.lb + this.clipper.width;\n      this._cropperHandleHitTest._.tb =\n        this.clipper.top - this.clipper.height / 2;\n      this._cropperHandleHitTest._.bb =\n        this._cropperHandleHitTest._.tb + this.clipper.height;\n\n      // Left side top/bottom\n      if (\n        this._cropperHandleHitTest._.mouseX <\n          this._cropperHandleHitTest._.lb + 10 &&\n        this._cropperHandleHitTest._.mouseX >\n          this._cropperHandleHitTest._.lb - 3\n      ) {\n        if (\n          this._cropperHandleHitTest._.mouseY <\n            this._cropperHandleHitTest._.tb + 10 &&\n          this._cropperHandleHitTest._.mouseY >\n            this._cropperHandleHitTest._.tb - 3\n        ) {\n          return 'tl';\n        } else if (\n          this._cropperHandleHitTest._.mouseY <\n            this._cropperHandleHitTest._.bb + 3 &&\n          this._cropperHandleHitTest._.mouseY >\n            this._cropperHandleHitTest._.bb - 10\n        ) {\n          return 'bl';\n        }\n      }\n      // Right side top/bottom\n      if (\n        this._cropperHandleHitTest._.mouseX >\n          this._cropperHandleHitTest._.rb - 13 &&\n        this._cropperHandleHitTest._.mouseX <\n          this._cropperHandleHitTest._.rb + 3\n      ) {\n        if (\n          this._cropperHandleHitTest._.mouseY <\n            this._cropperHandleHitTest._.tb + 10 &&\n          this._cropperHandleHitTest._.mouseY >\n            this._cropperHandleHitTest._.tb - 3\n        ) {\n          return 'tr';\n        } else if (\n          this._cropperHandleHitTest._.mouseY <\n            this._cropperHandleHitTest._.bb + 2 &&\n          this._cropperHandleHitTest._.mouseY >\n            this._cropperHandleHitTest._.bb - 10\n        ) {\n          return 'br';\n        }\n      }\n\n      // Left or right\n      if (\n        this._cropperHandleHitTest._.mouseX <\n          this._cropperHandleHitTest._.lb + 3 &&\n        this._cropperHandleHitTest._.mouseX >\n          this._cropperHandleHitTest._.lb - 3 &&\n        this._cropperHandleHitTest._.mouseY <\n          this._cropperHandleHitTest._.bb - 10 &&\n        this._cropperHandleHitTest._.mouseY >\n          this._cropperHandleHitTest._.tb + 10\n      ) {\n        return 'l';\n      }\n      if (\n        this._cropperHandleHitTest._.mouseX <\n          this._cropperHandleHitTest._.rb + 1 &&\n        this._cropperHandleHitTest._.mouseX >\n          this._cropperHandleHitTest._.rb - 5 &&\n        this._cropperHandleHitTest._.mouseY <\n          this._cropperHandleHitTest._.bb - 10 &&\n        this._cropperHandleHitTest._.mouseY >\n          this._cropperHandleHitTest._.tb + 10\n      ) {\n        return 'r';\n      }\n\n      // Top or bottom\n      if (\n        this._cropperHandleHitTest._.mouseY <\n          this._cropperHandleHitTest._.tb + 4 &&\n        this._cropperHandleHitTest._.mouseY >\n          this._cropperHandleHitTest._.tb - 2 &&\n        this._cropperHandleHitTest._.mouseX >\n          this._cropperHandleHitTest._.lb + 10 &&\n        this._cropperHandleHitTest._.mouseX <\n          this._cropperHandleHitTest._.rb - 10\n      ) {\n        return 't';\n      }\n      if (\n        this._cropperHandleHitTest._.mouseY <\n          this._cropperHandleHitTest._.bb + 2 &&\n        this._cropperHandleHitTest._.mouseY >\n          this._cropperHandleHitTest._.bb - 4 &&\n        this._cropperHandleHitTest._.mouseX >\n          this._cropperHandleHitTest._.lb + 10 &&\n        this._cropperHandleHitTest._.mouseX <\n          this._cropperHandleHitTest._.rb - 10\n      ) {\n        return 'b';\n      }\n\n      return false;\n    },\n\n    /**\n     * Test whether the mouse cursor is on a fabricJS object.\n     *\n     * @param {Object} event\n     * @param {Object} object\n     * @returns {boolean}\n     */\n    _isMouseOver: function (event, object) {\n      if (typeof this._isMouseOver._ === 'undefined') {\n        this._isMouseOver._ = {};\n      }\n\n      this._isMouseOver._.parentOffset = this.$croppingCanvas.offset();\n      this._isMouseOver._.mouseX =\n        event.pageX - this._isMouseOver._.parentOffset.left;\n      this._isMouseOver._.mouseY =\n        event.pageY - this._isMouseOver._.parentOffset.top;\n\n      // Compensate for center origin coordinate-wise\n      this._isMouseOver._.lb = object.left - object.width / 2;\n      this._isMouseOver._.rb = this._isMouseOver._.lb + object.width;\n      this._isMouseOver._.tb = object.top - object.height / 2;\n      this._isMouseOver._.bb = this._isMouseOver._.tb + object.height;\n\n      return (\n        this._isMouseOver._.mouseX >= this._isMouseOver._.lb &&\n        this._isMouseOver._.mouseX <= this._isMouseOver._.rb &&\n        this._isMouseOver._.mouseY >= this._isMouseOver._.tb &&\n        this._isMouseOver._.mouseY <= this._isMouseOver._.bb\n      );\n    },\n\n    /**\n     * Get vertices of a rectangle defined by left,top,height and width properties.\n     * Optionally it's possible to provide offsetX and offsetY values.\n     * Left and top properties of rectangle reference the top-left corner.\n     *\n     * @param {Object} rectangle\n     * @param {number} [offsetX]\n     * @param {number} [offsetY]\n     */\n    _getRectangleVertices: function (rectangle, offsetX, offsetY) {\n      if (typeof this._getRectangleVertices._ === 'undefined') {\n        this._getRectangleVertices._ = {};\n      }\n\n      if (typeof offsetX === 'undefined') {\n        offsetX = 0;\n      }\n      if (typeof offsetY === 'undefined') {\n        offsetY = 0;\n      }\n\n      this._getRectangleVertices._.topLeft = {\n        x: rectangle.left + offsetX,\n        y: rectangle.top + offsetY,\n      };\n\n      this._getRectangleVertices._.topRight = {\n        x: this._getRectangleVertices._.topLeft.x + rectangle.width,\n        y: this._getRectangleVertices._.topLeft.y,\n      };\n      this._getRectangleVertices._.bottomRight = {\n        x: this._getRectangleVertices._.topRight.x,\n        y: this._getRectangleVertices._.topRight.y + rectangle.height,\n      };\n      this._getRectangleVertices._.bottomLeft = {\n        x: this._getRectangleVertices._.topLeft.x,\n        y: this._getRectangleVertices._.bottomRight.y,\n      };\n\n      return [\n        this._getRectangleVertices._.topLeft,\n        this._getRectangleVertices._.topRight,\n        this._getRectangleVertices._.bottomRight,\n        this._getRectangleVertices._.bottomLeft,\n      ];\n    },\n\n    /**\n     * Set image vertice coordinates for an image that's been zoomed to fit.\n     */\n    _setFittedImageVerticeCoordinates: function () {\n      this.imageVerticeCoords = this.getImageVerticeCoords('fit');\n    },\n\n    /**\n     * Get image vertice coords by a zoom mode and taking into account the straightening angle.\n     * The zoomMode can be either \"cover\", \"fit\" or a discrete float value.\n     *\n     * @param {string} zoomMode\n     */\n    getImageVerticeCoords: function (zoomMode) {\n      var angleInRadians =\n        -1 *\n        ((this.hasOrientationChanged() ? 90 : 0) + this.imageStraightenAngle) *\n        (Math.PI / 180);\n\n      var imageDimensions = this.getScaledImageDimensions();\n\n      var ratio;\n\n      if (typeof zoomMode === 'number') {\n        ratio = zoomMode;\n      } else if (zoomMode === 'cover') {\n        ratio = this.getZoomToCoverRatio(imageDimensions);\n      } else {\n        ratio = this.getZoomToFitRatio(imageDimensions);\n      }\n\n      // Get the dimensions of the scaled image\n      var scaledHeight = imageDimensions.height * ratio;\n      var scaledWidth = imageDimensions.width * ratio;\n\n      // Calculate the segments of the containing box for the image.\n      // When referring to top/bottom or right/left segments, these are on the\n      // right-side and bottom projection of the containing box for the zoomed out image.\n      var topVerticalSegment = Math.cos(angleInRadians) * scaledHeight;\n      var bottomVerticalSegment = Math.sin(angleInRadians) * scaledWidth;\n      var rightHorizontalSegment = Math.cos(angleInRadians) * scaledWidth;\n      var leftHorizontalSegment = Math.sin(angleInRadians) * scaledHeight;\n\n      // Calculate the offsets from editor box for the image-containing box\n      var verticalOffset =\n        (this.editorHeight - (topVerticalSegment + bottomVerticalSegment)) / 2;\n      var horizontalOffset =\n        (this.editorWidth - (leftHorizontalSegment + rightHorizontalSegment)) /\n        2;\n\n      // Finally, calculate the image vertice coordinates\n      return {\n        a: {\n          x: horizontalOffset + rightHorizontalSegment,\n          y: verticalOffset,\n        },\n        b: {\n          x: this.editorWidth - horizontalOffset,\n          y: verticalOffset + topVerticalSegment,\n        },\n        c: {\n          x: horizontalOffset + leftHorizontalSegment,\n          y: this.editorHeight - verticalOffset,\n        },\n        d: {\n          x: horizontalOffset,\n          y: verticalOffset + bottomVerticalSegment,\n        },\n      };\n    },\n\n    /**\n     * Debug stuff by continuously rendering a fabric object on canvas.\n     *\n     * @param {Object} fabricObj\n     */\n    _debug: function (fabricObj) {\n      this.canvas.remove(this.debugger);\n      this.debugger = fabricObj;\n      this.canvas.add(this.debugger);\n    },\n\n    /**\n     * Given an array of points in the form of {x: int, y:int} and a rectangle in the form of\n     * {a:{x:int, y:int}, b:{x:int, y:int}, c:{x:int, y:int}} (the fourth vertice is unnecessary)\n     * return true if the point is in the rectangle.\n     *\n     * Adapted from: http://stackoverflow.com/a/2763387/2040791\n     *\n     * @param {Object} points\n     * @param {Object} rectangle\n     */\n    arePointsInsideRectangle: function (points, rectangle) {\n      if (typeof this.arePointsInsideRectangle._ === 'undefined') {\n        this.arePointsInsideRectangle._ = {};\n      }\n\n      // Pre-calculate the vectors and scalar products for two rectangle edges\n      this.arePointsInsideRectangle._.ab = this._getVector(\n        rectangle.a,\n        rectangle.b\n      );\n      this.arePointsInsideRectangle._.bc = this._getVector(\n        rectangle.b,\n        rectangle.c\n      );\n      this.arePointsInsideRectangle._.scalarAbAb = this._getScalarProduct(\n        this.arePointsInsideRectangle._.ab,\n        this.arePointsInsideRectangle._.ab\n      );\n      this.arePointsInsideRectangle._.scalarBcBc = this._getScalarProduct(\n        this.arePointsInsideRectangle._.bc,\n        this.arePointsInsideRectangle._.bc\n      );\n\n      for (\n        this.arePointsInsideRectangle._.i = 0;\n        this.arePointsInsideRectangle._.i < points.length;\n        this.arePointsInsideRectangle._.i++\n      ) {\n        this.arePointsInsideRectangle._.point =\n          points[this.arePointsInsideRectangle._.i];\n\n        // Calculate the vectors for two rectangle sides and for\n        // the vector from vertices a and b to the point P\n        this.arePointsInsideRectangle._.ap = this._getVector(\n          rectangle.a,\n          this.arePointsInsideRectangle._.point\n        );\n        this.arePointsInsideRectangle._.bp = this._getVector(\n          rectangle.b,\n          this.arePointsInsideRectangle._.point\n        );\n\n        // Calculate scalar or dot products for some vector combinations\n        this.arePointsInsideRectangle._.scalarAbAp = this._getScalarProduct(\n          this.arePointsInsideRectangle._.ab,\n          this.arePointsInsideRectangle._.ap\n        );\n        this.arePointsInsideRectangle._.scalarBcBp = this._getScalarProduct(\n          this.arePointsInsideRectangle._.bc,\n          this.arePointsInsideRectangle._.bp\n        );\n\n        this.arePointsInsideRectangle._.projectsOnAB =\n          0 <= this.arePointsInsideRectangle._.scalarAbAp &&\n          this.arePointsInsideRectangle._.scalarAbAp <=\n            this.arePointsInsideRectangle._.scalarAbAb;\n        this.arePointsInsideRectangle._.projectsOnBC =\n          0 <= this.arePointsInsideRectangle._.scalarBcBp &&\n          this.arePointsInsideRectangle._.scalarBcBp <=\n            this.arePointsInsideRectangle._.scalarBcBc;\n\n        if (\n          !(\n            this.arePointsInsideRectangle._.projectsOnAB &&\n            this.arePointsInsideRectangle._.projectsOnBC\n          )\n        ) {\n          return false;\n        }\n      }\n\n      return true;\n    },\n\n    /**\n     * Returns an object representing the vector between points a and b.\n     *\n     * @param {Object} a\n     * @param {Object} b\n     */\n    _getVector: function (a, b) {\n      return {x: b.x - a.x, y: b.y - a.y};\n    },\n\n    /**\n     * Returns the scalar product of two vectors\n     *\n     * @param {Object} a\n     * @param {Object} b\n     */\n    _getScalarProduct: function (a, b) {\n      return a.x * b.x + a.y * b.y;\n    },\n\n    /**\n     * Returns the magnitude of a vector_redrawCropperElements\n     * .\n     *\n     * @param {Object} vector\n     */\n    _getVectorMagnitude: function (vector) {\n      return Math.sqrt(vector.x * vector.x + vector.y * vector.y);\n    },\n\n    /**\n     * Returns the angle between two vectors in degrees with two decimal points\n     *\n     * @param {Object} a\n     * @param {Object} b\n     */\n    _getAngleBetweenVectors: function (a, b) {\n      return (\n        Math.round(\n          ((Math.acos(\n            Math.min(\n              1,\n              this._getScalarProduct(a, b) /\n                (this._getVectorMagnitude(a) * this._getVectorMagnitude(b))\n            )\n          ) *\n            180) /\n            Math.PI) *\n            100\n        ) / 100\n      );\n    },\n\n    /**\n     * Return the rectangle edge crossed by an imaginary line drawn from editor center to a vertex\n     *\n     * @param {Object} rectangle\n     * @param {Object} vertex\n     *\n     * @returns {*}\n     */\n    _getEdgeCrossed: function (rectangle, vertex) {\n      // Determine over which edge the vertex is\n      var edgePoints = [\n        [rectangle.a, rectangle.b],\n        [rectangle.b, rectangle.c],\n        [rectangle.c, rectangle.d],\n        [rectangle.d, rectangle.a],\n      ];\n\n      var centerPoint = {x: this.editorWidth / 2, y: this.editorHeight / 2};\n      var smallestDiff = 180;\n      var edgeCrossed = null;\n\n      // Test each edge\n      for (var edgeIndex = 0; edgeIndex < edgePoints.length; edgeIndex++) {\n        var edge = edgePoints[edgeIndex];\n        var toCenter = this._getVector(edge[0], centerPoint);\n        var edgeVector = this._getVector(edge[0], edge[1]);\n        var toVertex = this._getVector(edge[0], vertex);\n\n        // If the angle between toCenter/toVertex is the sum of\n        // angles between edgeVector/toCenter and edgeVector/toVertex, it means that\n        // the edgeVector is between the other two meaning that this is the offending vertex.\n        // To avoid the rounding errors, we'll take the closest match\n        var diff = Math.abs(\n          this._getAngleBetweenVectors(toCenter, toVertex) -\n            (this._getAngleBetweenVectors(toCenter, edgeVector) +\n              this._getAngleBetweenVectors(edgeVector, toVertex))\n        );\n\n        if (diff < smallestDiff) {\n          smallestDiff = diff;\n          edgeCrossed = edge;\n        }\n      }\n\n      return edgeCrossed;\n    },\n\n    /**\n     * Get the image bounding box by image scaled dimensions, taking ingo account the straightening angle.\n     *\n     * @param {Object} dimensions\n     */\n    _getImageBoundingBox: function (dimensions) {\n      var box = {};\n\n      var angleInRadians =\n        Math.abs(this.imageStraightenAngle) * (Math.PI / 180);\n\n      var proportion = dimensions.height / dimensions.width;\n      box.height =\n        dimensions.width *\n        (Math.sin(angleInRadians) + Math.cos(angleInRadians) * proportion);\n      box.width =\n        dimensions.width *\n        (Math.cos(angleInRadians) + Math.sin(angleInRadians) * proportion);\n\n      if (this.hasOrientationChanged()) {\n        var temp = box.width;\n        box.width = box.height;\n        box.height = temp;\n      }\n\n      return box;\n    },\n  },\n  {\n    defaults: {\n      animationDuration: 100,\n      allowSavingAsNew: true,\n      onSave: $.noop,\n      allowDegreeFractions: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Asset index class\n */\nCraft.AssetIndex = Craft.BaseElementIndex.extend({\n  $includeSubfoldersContainer: null,\n  $includeSubfoldersCheckbox: null,\n  showingIncludeSubfoldersCheckbox: false,\n\n  $uploadButton: null,\n  $uploadInput: null,\n  $progressBar: null,\n  $folders: null,\n\n  uploader: null,\n  promptHandler: null,\n  progressBar: null,\n\n  _uploadTotalFiles: 0,\n  _uploadFileProgress: {},\n  _currentUploaderSettings: {},\n\n  _assetDrag: null,\n  _folderDrag: null,\n  _expandDropTargetFolderTimeout: null,\n  _tempExpandedFolders: [],\n\n  _fileConflictTemplate: {\n    choices: [\n      {value: 'keepBoth', title: Craft.t('app', 'Keep both')},\n      {value: 'replace', title: Craft.t('app', 'Replace it')},\n    ],\n  },\n  _folderConflictTemplate: {\n    choices: [\n      {\n        value: 'replace',\n        title: Craft.t(\n          'app',\n          'Replace the folder (all existing files will be deleted)'\n        ),\n      },\n      {\n        value: 'merge',\n        title: Craft.t(\n          'app',\n          'Merge the folder (any conflicting files will be replaced)'\n        ),\n      },\n    ],\n  },\n\n  init: function (elementType, $container, settings) {\n    this.base(elementType, $container, settings);\n\n    if (this.settings.context === 'index') {\n      if (!this._folderDrag) {\n        this._initIndexPageMode();\n      }\n\n      this.addListener(Garnish.$win, 'resize,scroll', '_positionProgressBar');\n    } else {\n      this.addListener(this.$main, 'scroll', '_positionProgressBar');\n\n      if (this.settings.modal) {\n        this.settings.modal.on(\n          'updateSizeAndPosition',\n          this._positionProgressBar.bind(this)\n        );\n      }\n    }\n  },\n\n  initSources: function () {\n    if (this.settings.context === 'index' && !this._folderDrag) {\n      this._initIndexPageMode();\n    }\n\n    return this.base();\n  },\n\n  initSource: function ($source) {\n    this.base($source);\n\n    this._createFolderContextMenu($source);\n\n    if (this.settings.context === 'index') {\n      if (this._folderDrag && this.getSourceLevel($source) > 1) {\n        if ($source.data('folder-id')) {\n          this._folderDrag.addItems($source.parent());\n        }\n      }\n\n      if (this._assetDrag) {\n        this._assetDrag.updateDropTargets();\n      }\n    }\n  },\n\n  deinitSource: function ($source) {\n    this.base($source);\n\n    // Does this source have a context menu?\n    var contextMenu = $source.data('contextmenu');\n\n    if (contextMenu) {\n      contextMenu.destroy();\n    }\n\n    if (this.settings.context === 'index') {\n      if (this._folderDrag && this.getSourceLevel($source) > 1) {\n        this._folderDrag.removeItems($source.parent());\n      }\n\n      if (this._assetDrag) {\n        this._assetDrag.updateDropTargets();\n      }\n    }\n  },\n\n  /**\n   * Initialize the index page-specific features\n   */\n  _initIndexPageMode: function () {\n    if (this._folderDrag) {\n      return;\n    }\n\n    // Make the elements selectable\n    this.settings.selectable = true;\n    this.settings.multiSelect = true;\n\n    // Asset dragging\n    // ---------------------------------------------------------------------\n\n    this._assetDrag = new Garnish.DragDrop({\n      activeDropTargetClass: 'sel',\n      helperOpacity: 0.75,\n      filter: () =>\n        this.view.getSelectedElements().has('div.element[data-movable]'),\n      helper: ($file) => this._getFileDragHelper($file),\n      dropTargets: () => {\n        // Which data attribute should we be checking?\n        var attr;\n        if (\n          this._assetDrag.$draggee &&\n          this._assetDrag.$draggee.has('.element[data-peer-file]').length\n        ) {\n          attr = 'data-can-move-peer-files-to';\n        } else {\n          attr = 'data-can-move-to';\n        }\n\n        var targets = [];\n\n        for (var i = 0; i < this.$sources.length; i++) {\n          // Make sure it's a volume folder\n          var $source = this.$sources.eq(i);\n          if (Garnish.hasAttr($source, attr)) {\n            targets.push($source);\n          }\n        }\n\n        return targets;\n      },\n\n      onDragStart: this._onDragStart.bind(this),\n      onDropTargetChange: this._onDropTargetChange.bind(this),\n      onDragStop: this._onFileDragStop.bind(this),\n      helperBaseZindex: 800,\n    });\n\n    // Folder dragging\n    // ---------------------------------------------------------------------\n\n    this._folderDrag = new Garnish.DragDrop({\n      activeDropTargetClass: 'sel',\n      helperOpacity: 0.75,\n\n      helper: ($draggeeHelper) => {\n        var $helperSidebar = $('<div class=\"sidebar drag-helper\"/>'),\n          $helperNav = $('<nav/>').appendTo($helperSidebar),\n          $helperUl = $('<ul/>').appendTo($helperNav);\n\n        $draggeeHelper.appendTo($helperUl).removeClass('expanded');\n        $draggeeHelper.children('a').addClass('sel');\n\n        // Match the style\n        $draggeeHelper.css({\n          'padding-top': this._folderDrag.$draggee.css('padding-top'),\n          'padding-right': this._folderDrag.$draggee.css('padding-right'),\n          'padding-bottom': this._folderDrag.$draggee.css('padding-bottom'),\n          'padding-left': this._folderDrag.$draggee.css('padding-left'),\n        });\n\n        return $helperSidebar;\n      },\n\n      dropTargets: () => {\n        var targets = [];\n\n        // Tag the dragged folder and it's subfolders\n        var draggedSourceIds = [];\n        this._folderDrag.$draggee.find('a[data-key]').each(function () {\n          draggedSourceIds.push($(this).data('key'));\n        });\n\n        for (var i = 0; i < this.$sources.length; i++) {\n          // Make sure it's a volume folder and not one of the dragged folders\n          var $source = this.$sources.eq(i),\n            key = $source.data('key');\n\n          if (!this._getVolumeOrFolderUidFromSourceKey(key)) {\n            continue;\n          }\n\n          if (!Craft.inArray(key, draggedSourceIds)) {\n            targets.push($source);\n          }\n        }\n\n        return targets;\n      },\n\n      onDragStart: this._onDragStart.bind(this),\n      onDropTargetChange: this._onDropTargetChange.bind(this),\n      onDragStop: this._onFolderDragStop.bind(this),\n    });\n  },\n\n  /**\n   * On file drag stop\n   */\n  _onFileDragStop: function () {\n    if (\n      this._assetDrag.$activeDropTarget &&\n      this._assetDrag.$activeDropTarget[0] !== this.$source[0]\n    ) {\n      // Keep it selected\n      var originatingSource = this.$source;\n\n      var targetFolderId = this._assetDrag.$activeDropTarget.data('folder-id'),\n        originalAssetIds = [];\n\n      // For each file, prepare array data.\n      for (var i = 0; i < this._assetDrag.$draggee.length; i++) {\n        var originalAssetId = Craft.getElementInfo(\n          this._assetDrag.$draggee[i]\n        ).id;\n\n        originalAssetIds.push(originalAssetId);\n      }\n\n      // Are any files actually getting moved?\n      if (originalAssetIds.length) {\n        this.setIndexBusy();\n\n        this._positionProgressBar();\n        this.progressBar.resetProgressBar();\n        this.progressBar.setItemCount(originalAssetIds.length);\n        this.progressBar.showProgressBar();\n\n        // For each file to move a separate request\n        var parameterArray = [];\n        for (i = 0; i < originalAssetIds.length; i++) {\n          parameterArray.push({\n            action: 'assets/move-asset',\n            params: {\n              assetId: originalAssetIds[i],\n              folderId: targetFolderId,\n            },\n          });\n        }\n\n        // Define the callback for when all file moves are complete\n        var onMoveFinish = (responseArray) => {\n          this.promptHandler.resetPrompts();\n\n          // Loop trough all the responses\n          for (var i = 0; i < responseArray.length; i++) {\n            var response = responseArray[i];\n\n            // Push prompt into prompt array\n            if (response.conflict) {\n              this.promptHandler.addPrompt({\n                assetId: response.assetId,\n                suggestedFilename: response.suggestedFilename,\n                prompt: {\n                  message: response.conflict,\n                  choices: this._fileConflictTemplate.choices,\n                },\n              });\n            }\n\n            if (response.error) {\n              alert(response.error);\n            }\n          }\n\n          this.setIndexAvailable();\n          this.progressBar.hideProgressBar();\n          var reloadIndex = false;\n\n          var performAfterMoveActions = function () {\n            // Select original source\n            this.sourceSelect.selectItem(originatingSource);\n\n            // Make sure we use the correct offset when fetching the next page\n            this._totalVisible -= this._assetDrag.$draggee.length;\n\n            // And remove the elements that have been moved away\n            for (var i = 0; i < originalAssetIds.length; i++) {\n              $('[data-id=' + originalAssetIds[i] + ']').remove();\n            }\n\n            this.view.deselectAllElements();\n            this._collapseExtraExpandedFolders(targetFolderId);\n\n            if (reloadIndex) {\n              this.updateElements();\n            }\n          };\n\n          if (this.promptHandler.getPromptCount()) {\n            // Define callback for completing all prompts\n            var promptCallback = (returnData) => {\n              var newParameterArray = [];\n\n              // Loop trough all returned data and prepare a new request array\n              for (var i = 0; i < returnData.length; i++) {\n                if (returnData[i].choice === 'cancel') {\n                  reloadIndex = true;\n                  continue;\n                }\n\n                if (returnData[i].choice === 'keepBoth') {\n                  newParameterArray.push({\n                    action: 'assets/move-asset',\n                    params: {\n                      folderId: targetFolderId,\n                      assetId: returnData[i].assetId,\n                      filename: returnData[i].suggestedFilename,\n                    },\n                  });\n                }\n\n                if (returnData[i].choice === 'replace') {\n                  newParameterArray.push({\n                    action: 'assets/move-asset',\n                    params: {\n                      folderId: targetFolderId,\n                      assetId: returnData[i].assetId,\n                      force: true,\n                    },\n                  });\n                }\n              }\n\n              // Nothing to do, carry on\n              if (newParameterArray.length === 0) {\n                performAfterMoveActions.apply(this);\n              } else {\n                // Start working\n                this.setIndexBusy();\n                this.progressBar.resetProgressBar();\n                this.progressBar.setItemCount(\n                  this.promptHandler.getPromptCount()\n                );\n                this.progressBar.showProgressBar();\n\n                // Move conflicting files again with resolutions now\n                this._performBatchRequests(newParameterArray, onMoveFinish);\n              }\n            };\n\n            this._assetDrag.fadeOutHelpers();\n            this.promptHandler.showBatchPrompts(promptCallback);\n          } else {\n            performAfterMoveActions.apply(this);\n            this._assetDrag.fadeOutHelpers();\n          }\n        };\n\n        // Initiate the file move with the built array, index of 0 and callback to use when done\n        this._performBatchRequests(parameterArray, onMoveFinish);\n\n        // Skip returning dragees\n        return;\n      }\n    } else {\n      // Add the .sel class back on the selected source\n      this.$source.addClass('sel');\n\n      this._collapseExtraExpandedFolders();\n    }\n\n    this._assetDrag.returnHelpersToDraggees();\n  },\n\n  /**\n   * On folder drag stop\n   */\n  _onFolderDragStop: function () {\n    // Only move if we have a valid target and we're not trying to move into our direct parent\n    if (\n      this._folderDrag.$activeDropTarget &&\n      this._folderDrag.$activeDropTarget\n        .siblings('ul')\n        .children('li')\n        .filter(this._folderDrag.$draggee).length === 0\n    ) {\n      var targetFolderId = this._folderDrag.$activeDropTarget.data('folder-id');\n\n      this._collapseExtraExpandedFolders(targetFolderId);\n\n      // Get the old folder IDs, and sort them so that we're moving the most-nested folders first\n      var folderIds = [];\n\n      for (var i = 0; i < this._folderDrag.$draggee.length; i++) {\n        var $a = this._folderDrag.$draggee.eq(i).children('a'),\n          folderId = $a.data('folder-id');\n\n        // Make sure it’s not already in the target folder and use this single folder Id.\n        if (folderId != targetFolderId) {\n          folderIds.push(folderId);\n          break;\n        }\n      }\n\n      if (folderIds.length) {\n        folderIds.sort();\n        folderIds.reverse();\n\n        this.setIndexBusy();\n        this._positionProgressBar();\n        this.progressBar.resetProgressBar();\n        this.progressBar.setItemCount(folderIds.length);\n        this.progressBar.showProgressBar();\n\n        var parameterArray = [];\n\n        for (i = 0; i < folderIds.length; i++) {\n          parameterArray.push({\n            action: 'assets/move-folder',\n            params: {\n              folderId: folderIds[i],\n              parentId: targetFolderId,\n            },\n          });\n        }\n\n        // Increment, so to avoid displaying folder files that are being moved\n        this.requestId++;\n\n        /*\n                 Here's the rundown:\n                 1) Send all the folders being moved\n                 2) Get results:\n                 a) For all conflicting, receive prompts and resolve them to get:\n                 b) For all valid move operations: by now server has created the needed folders\n                 in target destination. Server returns an array of file move operations\n                 c) server also returns a list of all the folder id changes\n                 d) and the data-id of node to be removed, in case of conflict\n                 e) and a list of folders to delete after the move\n                 3) From data in 2) build a large file move operation array\n                 4) Create a request loop based on this, so we can display progress bar\n                 5) when done, delete all the folders and perform other maintenance\n                 6) Champagne\n                 */\n\n        // This will hold the final list of files to move\n        var fileMoveList = [];\n\n        var newSourceKey = '';\n\n        var onMoveFinish = (responseArray) => {\n          this.promptHandler.resetPrompts();\n\n          // Loop trough all the responses\n          for (var i = 0; i < responseArray.length; i++) {\n            var data = responseArray[i];\n\n            // If successful and have data, then update\n            if (data.success) {\n              if (data.transferList) {\n                fileMoveList = data.transferList;\n              }\n\n              if (data.newFolderId) {\n                newSourceKey =\n                  this._folderDrag.$activeDropTarget.data('key') +\n                  '/folder:' +\n                  data.newFolderUid;\n              }\n            }\n\n            // Push prompt into prompt array\n            if (data.conflict) {\n              data.prompt = {\n                message: data.conflict,\n                choices: this._folderConflictTemplate.choices,\n              };\n\n              this.promptHandler.addPrompt(data);\n            }\n\n            if (data.error) {\n              alert(data.error);\n            }\n          }\n\n          if (this.promptHandler.getPromptCount()) {\n            // Define callback for completing all prompts\n            var promptCallback = (returnData) => {\n              this.promptHandler.resetPrompts();\n\n              var newParameterArray = [];\n\n              var params = {};\n              // Loop trough all returned data and prepare a new request array\n              for (var i = 0; i < returnData.length; i++) {\n                if (returnData[i].choice === 'cancel') {\n                  continue;\n                }\n\n                if (returnData[i].choice === 'replace') {\n                  params.force = true;\n                }\n\n                if (returnData[i].choice === 'merge') {\n                  params.merge = true;\n                }\n\n                params.folderId = data.folderId;\n                params.parentId = data.parentId;\n\n                newParameterArray.push({\n                  action: 'assets/move-folder',\n                  params: params,\n                });\n              }\n\n              // Start working on them lists, baby\n              if (newParameterArray.length === 0) {\n                this._performActualFolderMove(\n                  fileMoveList,\n                  folderIds,\n                  newSourceKey\n                );\n              } else {\n                // Start working\n                this.setIndexBusy();\n                this.progressBar.resetProgressBar();\n                this.progressBar.setItemCount(\n                  this.promptHandler.getPromptCount()\n                );\n                this.progressBar.showProgressBar();\n\n                this._performBatchRequests(newParameterArray, onMoveFinish);\n              }\n            };\n\n            this.promptHandler.showBatchPrompts(promptCallback);\n\n            this.setIndexAvailable();\n            this.progressBar.hideProgressBar();\n          } else {\n            this._performActualFolderMove(\n              fileMoveList,\n              folderIds,\n              newSourceKey\n            );\n          }\n        };\n\n        // Initiate the folder move with the built array, index of 0 and callback to use when done\n        this._performBatchRequests(parameterArray, onMoveFinish);\n\n        // Skip returning dragees until we get the Ajax response\n        return;\n      }\n    } else {\n      // Add the .sel class back on the selected source\n      this.$source.addClass('sel');\n\n      this._collapseExtraExpandedFolders();\n    }\n\n    this._folderDrag.returnHelpersToDraggees();\n  },\n\n  /**\n   * Really move the folder. Like really. For real.\n   */\n  _performActualFolderMove: function (\n    fileMoveList,\n    folderDeleteList,\n    newSourceKey\n  ) {\n    this.setIndexBusy();\n    this.progressBar.resetProgressBar();\n    this.progressBar.setItemCount(1);\n    this.progressBar.showProgressBar();\n\n    var moveCallback = (folderDeleteList) => {\n      // Delete the old folders\n      var counter = 0;\n      var limit = folderDeleteList.length;\n      for (var i = 0; i < folderDeleteList.length; i++) {\n        let data = {folderId: folderDeleteList[i]};\n\n        // When all folders are deleted, reload the sources.\n        Craft.sendActionRequest('POST', 'assets/delete-folder', {data}).then(\n          (response) => {\n            if (++counter === limit) {\n              this.setIndexAvailable();\n              this.progressBar.hideProgressBar();\n              this._folderDrag.returnHelpersToDraggees();\n              this.setInstanceState('selectedSource', newSourceKey);\n              this.refreshSources();\n            }\n          }\n        );\n      }\n    };\n\n    if (fileMoveList.length > 0) {\n      var parameterArray = [];\n\n      for (var i = 0; i < fileMoveList.length; i++) {\n        parameterArray.push({\n          action: 'assets/move-asset',\n          params: fileMoveList[i],\n        });\n      }\n      this._performBatchRequests(parameterArray, function () {\n        moveCallback(folderDeleteList);\n      });\n    } else {\n      moveCallback(folderDeleteList);\n    }\n  },\n\n  _selectSourceByFolderId: function (targetFolderId) {\n    var $targetSource = this._getSourceByKey(targetFolderId);\n\n    // Make sure that all the parent sources are expanded and this source is visible.\n    var $parentSources = $targetSource.parent().parents('li');\n\n    for (var i = 0; i < $parentSources.length; i++) {\n      var $parentSource = $($parentSources[i]);\n\n      if (!$parentSource.hasClass('expanded')) {\n        $parentSource.children('.toggle').trigger('click');\n      }\n    }\n\n    this.selectSource($targetSource);\n    this.updateElements();\n  },\n\n  /**\n   * Initialize the uploader.\n   *\n   * @private\n   */\n  afterInit: function () {\n    if (!this.$uploadButton) {\n      this.$uploadButton = $('<button/>', {\n        type: 'button',\n        class: 'btn submit',\n        'data-icon': 'upload',\n        style: 'position: relative; overflow: hidden;',\n        text: Craft.t('app', 'Upload files'),\n      });\n      this.addButton(this.$uploadButton);\n\n      this.$uploadInput = $(\n        '<input type=\"file\" multiple=\"multiple\" name=\"assets-upload\" />'\n      )\n        .hide()\n        .insertBefore(this.$uploadButton);\n    }\n\n    this.promptHandler = new Craft.PromptHandler();\n    this.progressBar = new Craft.ProgressBar(this.$main, true);\n\n    var options = {\n      url: Craft.getActionUrl('assets/upload'),\n      fileInput: this.$uploadInput,\n      dropZone: this.$container,\n    };\n\n    options.events = {\n      fileuploadstart: this._onUploadStart.bind(this),\n      fileuploadprogressall: this._onUploadProgress.bind(this),\n      fileuploaddone: this._onUploadSuccess.bind(this),\n      fileuploadalways: this._onUploadAlways.bind(this),\n      fileuploadfail: this._onUploadFailure.bind(this),\n    };\n\n    if (\n      this.settings.criteria &&\n      typeof this.settings.criteria.kind !== 'undefined'\n    ) {\n      options.allowedKinds = this.settings.criteria.kind;\n    }\n\n    this._currentUploaderSettings = options;\n\n    this.uploader = new Craft.Uploader(this.$uploadButton, options);\n\n    this.$uploadButton.on('click', () => {\n      if (this.$uploadButton.hasClass('disabled')) {\n        return;\n      }\n      if (!this.isIndexBusy) {\n        this.$uploadButton\n          .parent()\n          .find('input[name=assets-upload]')\n          .trigger('click');\n      }\n    });\n\n    this.base();\n  },\n\n  getDefaultSourceKey: function () {\n    // Did they request a specific volume in the URL?\n    if (\n      this.settings.context === 'index' &&\n      typeof window.defaultSource !== 'undefined'\n    ) {\n      let defaultSourceParts = window.defaultSource.split('/');\n      let volumeSource = this.$sources.toArray().find((s) => {\n        return $(s).data('volume-handle') === defaultSourceParts[0];\n      });\n      if (volumeSource) {\n        let $source = $(volumeSource);\n\n        for (let i = 1; i < defaultSourceParts.length; i++) {\n          // does $source have a subfolder with this path name?\n          let subfolderSource = this._getChildSources($source)\n            .toArray()\n            .find((s) => {\n              return $('> .label', s).text() === defaultSourceParts[i];\n            });\n          if (!subfolderSource) {\n            break;\n          }\n          this._expandSource($source);\n          $source = $(subfolderSource);\n        }\n\n        return $source.data('key');\n      }\n    }\n\n    return this.base();\n  },\n\n  onSelectSource: function () {\n    var $source = this._getSourceByKey(this.sourceKey);\n    var folderId = $source.data('folder-id');\n\n    if (folderId && Garnish.hasAttr(this.$source, 'data-can-upload')) {\n      this.uploader.setParams({\n        folderId: this.$source.attr('data-folder-id'),\n      });\n      this.$uploadButton.removeClass('disabled');\n    } else {\n      this.$uploadButton.addClass('disabled');\n    }\n\n    // Update the URL if we're on the Assets index\n    if ($source.length && this.settings.context === 'index') {\n      this._updateUrl($source);\n    }\n\n    this.base();\n  },\n\n  _updateUrl: function ($source) {\n    // Find all the subfolder sources. At the end, $thisSource will be the root volume source\n    let nestedSources = [];\n    let $thisSource = $source;\n    let $parent;\n    while (($parent = this.getParentSource($thisSource)) && $parent.length) {\n      nestedSources.unshift($thisSource);\n      $thisSource = $parent;\n    }\n\n    let uri = 'assets';\n    if ($thisSource.data('volume-handle')) {\n      uri += '/' + $thisSource.data('volume-handle');\n      nestedSources.forEach(($s) => {\n        uri += '/' + $s.children('.label').text();\n      });\n    }\n\n    Craft.setPath(uri);\n  },\n\n  _getVolumeOrFolderUidFromSourceKey: function (sourceKey) {\n    var m = sourceKey.match(/\\b(?:folder|volume):([0-9a-f\\-]+)$/);\n\n    return m ? m[1] : null;\n  },\n\n  startSearching: function () {\n    // Does this source have subfolders?\n    if (!this.settings.hideSidebar && this.$source.siblings('ul').length) {\n      if (this.$includeSubfoldersContainer === null) {\n        var id = 'includeSubfolders-' + Math.floor(Math.random() * 1000000000);\n\n        this.$includeSubfoldersContainer = $(\n          '<div style=\"margin-bottom: -25px; opacity: 0;\"/>'\n        ).insertAfter(this.$search);\n        var $subContainer = $('<div style=\"padding-top: 5px;\"/>').appendTo(\n          this.$includeSubfoldersContainer\n        );\n        this.$includeSubfoldersCheckbox = $(\n          '<input type=\"checkbox\" id=\"' + id + '\" class=\"checkbox\"/>'\n        ).appendTo($subContainer);\n        $('<label class=\"light smalltext\" for=\"' + id + '\"/>')\n          .text(' ' + Craft.t('app', 'Search in subfolders'))\n          .appendTo($subContainer);\n\n        this.addListener(\n          this.$includeSubfoldersCheckbox,\n          'change',\n          function () {\n            this.setSelecetedSourceState(\n              'includeSubfolders',\n              this.$includeSubfoldersCheckbox.prop('checked')\n            );\n            this.updateElements();\n          }\n        );\n      } else {\n        this.$includeSubfoldersContainer.velocity('stop').removeClass('hidden');\n      }\n\n      var checked = this.getSelectedSourceState('includeSubfolders', false);\n      this.$includeSubfoldersCheckbox.prop('checked', checked);\n\n      this.$includeSubfoldersContainer.velocity(\n        {\n          marginBottom: 0,\n          opacity: 1,\n        },\n        'fast'\n      );\n\n      this.showingIncludeSubfoldersCheckbox = true;\n    }\n\n    this.base();\n  },\n\n  stopSearching: function () {\n    if (this.showingIncludeSubfoldersCheckbox) {\n      this.$includeSubfoldersContainer.velocity('stop');\n\n      this.$includeSubfoldersContainer.velocity(\n        {\n          marginBottom: -25,\n          opacity: 0,\n        },\n        {\n          duration: 'fast',\n          complete: () => {\n            this.$includeSubfoldersContainer.addClass('hidden');\n          },\n        }\n      );\n\n      this.showingIncludeSubfoldersCheckbox = false;\n    }\n\n    this.base();\n  },\n\n  getViewParams: function () {\n    var data = this.base();\n\n    if (\n      this.showingIncludeSubfoldersCheckbox &&\n      this.$includeSubfoldersCheckbox.prop('checked')\n    ) {\n      data.criteria.includeSubfolders = true;\n    }\n\n    return data;\n  },\n\n  /**\n   * React on upload submit.\n   *\n   * @private\n   */\n  _onUploadStart: function () {\n    this.setIndexBusy();\n\n    // Initial values\n    this._positionProgressBar();\n    this.progressBar.resetProgressBar();\n    this.progressBar.showProgressBar();\n\n    this.promptHandler.resetPrompts();\n  },\n\n  /**\n   * Update uploaded byte count.\n   */\n  _onUploadProgress: function (event, data) {\n    var progress = parseInt((data.loaded / data.total) * 100, 10);\n    this.progressBar.setProgressPercentage(progress);\n  },\n\n  /**\n   * On upload success.\n   *\n   * @param {Object} event\n   * @param {Object} data\n   * @private\n   */\n  _onUploadSuccess: function (event, data) {\n    const {result} = data;\n\n    // Add the uploaded file to the selected ones, if appropriate\n    this.selectElementAfterUpdate(result.assetId);\n\n    // If there is a prompt, add it to the queue\n    if (result.conflict) {\n      result.prompt = {\n        message: Craft.t('app', result.conflict, {file: result.filename}),\n        choices: this._fileConflictTemplate.choices,\n      };\n\n      this.promptHandler.addPrompt(result);\n    }\n\n    Craft.cp.runQueue();\n  },\n\n  /**\n   * On upload complete no matter what (success, fail, or abort).\n   */\n  _onUploadAlways: function () {\n    if (this.uploader.isLastUpload()) {\n      this.progressBar.hideProgressBar();\n      this.setIndexAvailable();\n\n      if (this.promptHandler.getPromptCount()) {\n        this.promptHandler.showBatchPrompts(this._uploadFollowup.bind(this));\n      } else {\n        this._updateAfterUpload();\n      }\n    }\n  },\n\n  /**\n   * On Upload Failure.\n   */\n  _onUploadFailure: function (event, data) {\n    const response = data.response();\n    let {message, filename} = response?.jqXHR?.responseJSON || {};\n\n    if (!message) {\n      message = filename\n        ? Craft.t('app', 'Upload failed for “{filename}”.', {filename})\n        : Craft.t('app', 'Upload failed.');\n    }\n\n    alert(message);\n  },\n\n  /**\n   * Update the elements after an upload, setting sort to dateModified descending, if not using index.\n   *\n   * @private\n   */\n  _updateAfterUpload: function () {\n    if (this.settings.context !== 'index') {\n      this.clearSearch();\n      this.setSelectedSortAttribute('dateCreated', 'desc');\n    }\n    this.updateElements();\n  },\n\n  /**\n   * Follow up to an upload that triggered at least one conflict resolution prompt.\n   *\n   * @param {Object} returnData\n   * @private\n   */\n  _uploadFollowup: function (returnData) {\n    this.setIndexBusy();\n    this.progressBar.resetProgressBar();\n\n    this.promptHandler.resetPrompts();\n\n    var finalCallback = () => {\n      this.progressBar.hideProgressBar();\n      this.setIndexAvailable();\n      this._updateAfterUpload();\n    };\n\n    this.progressBar.setItemCount(returnData.length);\n\n    var doFollowup = (parameterArray, parameterIndex, callback) => {\n      var data = {};\n      var action = null;\n\n      const followupAlways = () => {\n        parameterIndex++;\n        this.progressBar.incrementProcessedItemCount(1);\n        this.progressBar.updateProgressBar();\n\n        if (parameterIndex === parameterArray.length) {\n          callback();\n        } else {\n          doFollowup(parameterArray, parameterIndex, callback);\n        }\n      };\n      const followupSuccess = (data) => {\n        if (data.assetId) {\n          this.selectElementAfterUpdate(data.assetId);\n        }\n\n        followupAlways();\n      };\n      const followupFailure = (data) => {\n        alert(data.message);\n        followupAlways();\n      };\n\n      if (parameterArray[parameterIndex].choice === 'replace') {\n        action = 'assets/replace-file';\n        data.sourceAssetId = parameterArray[parameterIndex].assetId;\n\n        if (parameterArray[parameterIndex].conflictingAssetId) {\n          data.assetId = parameterArray[parameterIndex].conflictingAssetId;\n        } else {\n          data.targetFilename = parameterArray[parameterIndex].filename;\n        }\n      } else if (parameterArray[parameterIndex].choice === 'cancel') {\n        action = 'assets/delete-asset';\n        data.assetId = parameterArray[parameterIndex].assetId;\n      }\n\n      if (!action) {\n        // We don't really need to do another request, so let's pretend that already happened\n        followupSuccess({\n          assetId: parameterArray[parameterIndex].assetId,\n        });\n      } else {\n        Craft.sendActionRequest('POST', action, {data})\n          .then((response) => followupSuccess(response.data))\n          .catch(({response}) => followupFailure(response.data));\n      }\n    };\n\n    this.progressBar.showProgressBar();\n    doFollowup(returnData, 0, finalCallback);\n  },\n\n  /**\n   * Perform actions after updating elements\n   * @private\n   */\n  onUpdateElements: function () {\n    this._onUpdateElements(false, this.view.getAllElements());\n    this.view.on('appendElements', (ev) => {\n      this._onUpdateElements(true, ev.newElements);\n    });\n\n    this.base();\n  },\n\n  /**\n   * Do the after-update initializations\n   * @private\n   */\n  _onUpdateElements: function (append, $newElements) {\n    if (this.settings.context === 'index') {\n      if (!append) {\n        this._assetDrag.removeAllItems();\n      }\n\n      this._assetDrag.addItems($newElements.has('div.element[data-movable]'));\n    }\n\n    this.base(append, $newElements);\n\n    this.removeListener(this.$elements, 'keydown');\n    this.addListener(this.$elements, 'keydown', this._onKeyDown.bind(this));\n    this.view.elementSelect.on('focusItem', this._onElementFocus.bind(this));\n  },\n\n  /**\n   * Handle a keypress\n   * @private\n   */\n  _onKeyDown: function (ev) {\n    if (ev.keyCode === Garnish.SPACE_KEY && ev.shiftKey) {\n      if (Craft.PreviewFileModal.openInstance) {\n        Craft.PreviewFileModal.openInstance.selfDestruct();\n      } else {\n        var $element = this.view.elementSelect.$focusedItem.find('.element');\n\n        if ($element.length) {\n          this._loadPreview($element);\n        }\n      }\n\n      ev.stopPropagation();\n      return false;\n    }\n  },\n\n  /**\n   * Handle element being focused\n   * @private\n   */\n  _onElementFocus: function (ev) {\n    var $element = $(ev.item).find('.element');\n\n    if (Craft.PreviewFileModal.openInstance && $element.length) {\n      this._loadPreview($element);\n    }\n  },\n\n  /**\n   * Load the preview for an Asset element\n   * @private\n   */\n  _loadPreview: function ($element) {\n    var settings = {};\n\n    if ($element.data('image-width')) {\n      settings.startingWidth = $element.data('image-width');\n      settings.startingHeight = $element.data('image-height');\n    }\n\n    new Craft.PreviewFileModal(\n      $element.data('id'),\n      this.view.elementSelect,\n      settings\n    );\n  },\n\n  /**\n   * On Drag Start\n   */\n  _onDragStart: function () {\n    this._tempExpandedFolders = [];\n  },\n\n  /**\n   * Get File Drag Helper\n   */\n  _getFileDragHelper: function ($element) {\n    var currentView = this.getSelectedSourceState('mode');\n    var $outerContainer;\n    var $innerContainer;\n\n    switch (currentView) {\n      case 'table': {\n        $outerContainer = $(\n          '<div class=\"elements datatablesorthelper\"/>'\n        ).appendTo(Garnish.$bod);\n        $innerContainer = $('<div class=\"tableview\"/>').appendTo(\n          $outerContainer\n        );\n        var $table = $('<table class=\"data\"/>').appendTo($innerContainer);\n        var $tbody = $('<tbody/>').appendTo($table);\n\n        $element.appendTo($tbody);\n\n        // Copy the column widths\n        this._$firstRowCells = this.view.$table\n          .children('tbody')\n          .children('tr:first')\n          .children();\n        var $helperCells = $element.children();\n\n        for (var i = 0; i < $helperCells.length; i++) {\n          // Hard-set the cell widths\n          var $helperCell = $($helperCells[i]);\n\n          // Skip the checkbox cell\n          if ($helperCell.hasClass('checkbox-cell')) {\n            $helperCell.remove();\n            $outerContainer.css('margin-' + Craft.left, 19); // 26 - 7\n            continue;\n          }\n\n          var $firstRowCell = $(this._$firstRowCells[i]),\n            width = $firstRowCell.width();\n\n          $firstRowCell.width(width);\n          $helperCell.width(width);\n        }\n\n        return $outerContainer;\n      }\n      case 'thumbs': {\n        $outerContainer = $('<div class=\"elements thumbviewhelper\"/>').appendTo(\n          Garnish.$bod\n        );\n        $innerContainer = $('<ul class=\"thumbsview\"/>').appendTo(\n          $outerContainer\n        );\n\n        $element.appendTo($innerContainer);\n\n        return $outerContainer;\n      }\n    }\n\n    return $();\n  },\n\n  /**\n   * On Drop Target Change\n   */\n  _onDropTargetChange: function ($dropTarget) {\n    clearTimeout(this._expandDropTargetFolderTimeout);\n\n    if ($dropTarget) {\n      var folderId = $dropTarget.data('folder-id');\n\n      if (folderId) {\n        this.dropTargetFolder = this._getSourceByKey(folderId);\n\n        if (\n          this._hasSubfolders(this.dropTargetFolder) &&\n          !this._isExpanded(this.dropTargetFolder)\n        ) {\n          this._expandDropTargetFolderTimeout = setTimeout(\n            this._expandFolder.bind(this),\n            500\n          );\n        }\n      } else {\n        this.dropTargetFolder = null;\n      }\n    }\n\n    if ($dropTarget && $dropTarget[0] !== this.$source[0]) {\n      // Temporarily remove the .sel class on the active source\n      this.$source.removeClass('sel');\n    } else {\n      this.$source.addClass('sel');\n    }\n  },\n\n  /**\n   * Collapse Extra Expanded Folders\n   */\n  _collapseExtraExpandedFolders: function (dropTargetFolderId) {\n    clearTimeout(this._expandDropTargetFolderTimeout);\n\n    // If a source ID is passed in, exclude its parents\n    var $excludedSources;\n\n    if (dropTargetFolderId) {\n      $excludedSources = this._getSourceByKey(dropTargetFolderId)\n        .parents('li')\n        .children('a');\n    }\n\n    for (var i = this._tempExpandedFolders.length - 1; i >= 0; i--) {\n      var $source = this._tempExpandedFolders[i];\n\n      // Check the parent list, if a source id is passed in\n      if (\n        typeof $excludedSources === 'undefined' ||\n        $excludedSources.filter('[data-key=\"' + $source.data('key') + '\"]')\n          .length === 0\n      ) {\n        this._collapseFolder($source);\n        this._tempExpandedFolders.splice(i, 1);\n      }\n    }\n  },\n\n  _getSourceByKey: function (key) {\n    return this.$sources.filter('[data-key$=\"' + key + '\"]');\n  },\n\n  _hasSubfolders: function ($source) {\n    return $source.siblings('ul').find('li').length;\n  },\n\n  _isExpanded: function ($source) {\n    return $source.parent('li').hasClass('expanded');\n  },\n\n  _expandFolder: function () {\n    // Collapse any temp-expanded drop targets that aren't parents of this one\n    this._collapseExtraExpandedFolders(this.dropTargetFolder.data('folder-id'));\n\n    this.dropTargetFolder.siblings('.toggle').trigger('click');\n\n    // Keep a record of that\n    this._tempExpandedFolders.push(this.dropTargetFolder);\n  },\n\n  _collapseFolder: function ($source) {\n    if ($source.parent().hasClass('expanded')) {\n      $source.siblings('.toggle').trigger('click');\n    }\n  },\n\n  getSourceActions: function () {\n    const actions = this.base();\n\n    // Make sure it's a volume folder\n    if (this._getVolumeOrFolderUidFromSourceKey(this.sourceKey)) {\n      actions.push({\n        label: Craft.t('app', 'New subfolder'),\n        onSelect: () => {\n          this._createSubfolder(this.$source);\n        },\n      });\n\n      // For all folders that are not top folders\n      if (this.getSourceLevel(this.$source) > 1) {\n        actions.push({\n          label: Craft.t('app', 'Rename folder'),\n          onSelect: () => {\n            this._renameFolder(this.$source);\n          },\n        });\n        actions.push({\n          label: Craft.t('app', 'Delete folder'),\n          destructive: true,\n          onSelect: () => {\n            this._deleteFolder(this.$source);\n          },\n        });\n      }\n    }\n\n    return actions;\n  },\n\n  _createFolderContextMenu: function ($source) {\n    // Make sure it's a volume folder\n    if (!this._getVolumeOrFolderUidFromSourceKey($source.data('key'))) {\n      return;\n    }\n\n    var menuOptions = [\n      {\n        label: Craft.t('app', 'New subfolder'),\n        onClick: () => {\n          this._createSubfolder($source);\n        },\n      },\n    ];\n\n    // For all folders that are not top folders\n    if (this.settings.context === 'index' && this.getSourceLevel($source) > 1) {\n      menuOptions.push({\n        label: Craft.t('app', 'Rename folder'),\n        onClick: () => {\n          this._renameFolder($source);\n        },\n      });\n      menuOptions.push({\n        label: Craft.t('app', 'Delete folder'),\n        onClick: () => {\n          this._deleteFolder($source);\n        },\n      });\n    }\n\n    new Garnish.ContextMenu($source, menuOptions, {menuClass: 'menu'});\n  },\n\n  _createSubfolder: function ($parentFolder) {\n    var subfolderName = prompt(Craft.t('app', 'Enter the name of the folder'));\n\n    if (subfolderName) {\n      var data = {\n        parentId: $parentFolder.data('folder-id'),\n        folderName: subfolderName,\n      };\n\n      this.setIndexBusy();\n\n      Craft.sendActionRequest('POST', 'assets/create-folder', {data})\n        .then((response) => {\n          const data = response.data;\n          this.setIndexAvailable();\n          this._prepareParentForChildren($parentFolder);\n          var $subfolder = $(\n            '<li>' +\n              `<a data-key=\"${$parentFolder.data('key')}/folder:${\n                data.folderUid\n              }\" data-default-sort=\"${$parentFolder.data('default-sort')}\"` +\n              (Garnish.hasAttr($parentFolder, 'data-has-thumbs')\n                ? ' data-has-thumbs'\n                : '') +\n              ` data-folder-id=\"${data.folderId}\"` +\n              (Garnish.hasAttr($parentFolder, 'data-can-upload')\n                ? ' data-can-upload'\n                : '') +\n              (Garnish.hasAttr($parentFolder, 'data-can-move-to')\n                ? ' data-can-move-to'\n                : '') +\n              (Garnish.hasAttr($parentFolder, 'data-can-move-peer-files-to')\n                ? ' data-can-move-peer-files-to'\n                : '') +\n              '>' +\n              `<span class=\"label\">${data.folderName}</span>` +\n              '</a>' +\n              '</li>'\n          );\n\n          var $a = $subfolder.children('a:first');\n          this._appendSubfolder($parentFolder, $subfolder);\n          this.initSource($a);\n\n          Craft.cp.displayNotice(Craft.t('app', 'Folder created.'));\n        })\n        .catch(({response}) => {\n          this.setIndexAvailable();\n          alert(response.data.message);\n        });\n    }\n  },\n\n  _deleteFolder: function ($targetFolder) {\n    if (\n      confirm(\n        Craft.t('app', 'Really delete folder “{folder}”?', {\n          folder: $.trim($targetFolder.text()),\n        })\n      )\n    ) {\n      var data = {\n        folderId: $targetFolder.data('folder-id'),\n      };\n\n      this.setIndexBusy();\n\n      Craft.sendActionRequest('POST', 'assets/delete-folder', {data})\n        .then((response) => {\n          this.setIndexAvailable();\n          var $parentFolder = this.getParentSource($targetFolder);\n\n          // Remove folder and any trace from its parent, if needed\n          this.deinitSource($targetFolder);\n\n          $targetFolder.parent().remove();\n          this._cleanUpTree($parentFolder);\n\n          Craft.cp.displayNotice(Craft.t('app', 'Folder deleted.'));\n        })\n        .catch(({response}) => {\n          this.setIndexAvailable();\n          alert(response.data.message);\n        });\n    }\n  },\n\n  /**\n   * Rename\n   */\n  _renameFolder: function ($source) {\n    const $label = $source.children('.label');\n    const oldName = Craft.trim($label.text());\n    const newName = prompt(Craft.t('app', 'Rename folder'), oldName);\n\n    if (!newName || newName === oldName) {\n      return;\n    }\n\n    this.setIndexBusy();\n\n    Craft.sendActionRequest('POST', 'assets/rename-folder', {\n      data: {\n        folderId: $source.data('folder-id'),\n        newName: newName,\n      },\n    })\n      .then((response) => {\n        $label.text(response.data.newName);\n\n        // Is this the selected source?\n        if ($source.data('key') === this.$source.data('key')) {\n          this.updateElements();\n\n          Craft.cp.displayNotice(Craft.t('app', 'Folder renamed.'));\n\n          // Update the URL if we're on the Assets index\n          if (this.settings.context === 'index') {\n            this._updateUrl($source);\n          }\n        }\n      })\n      .catch(({response}) => {\n        this.setIndexAvailable();\n        alert(response.data.message);\n      });\n  },\n\n  /**\n   * Prepare a source folder for children folder.\n   *\n   * @param {jQuery} $parentFolder\n   * @private\n   */\n  _prepareParentForChildren: function ($parentFolder) {\n    if (!this._hasSubfolders($parentFolder)) {\n      $parentFolder\n        .parent()\n        .addClass('expanded')\n        .append('<div class=\"toggle\"></div><ul class=\"nested\"></ul>');\n      this.initSourceToggle($parentFolder);\n    }\n  },\n\n  /**\n   * Appends a subfolder to the parent folder at the correct spot.\n   *\n   * @param {jQuery} $parentFolder\n   * @param {jQuery} $subfolder\n   * @private\n   */\n  _appendSubfolder: function ($parentFolder, $subfolder) {\n    var $subfolderList = $parentFolder.siblings('ul'),\n      $existingChildren = $subfolderList.children('li'),\n      subfolderLabel = $.trim($subfolder.children('a:first').text()),\n      folderInserted = false;\n\n    for (var i = 0; i < $existingChildren.length; i++) {\n      var $existingChild = $($existingChildren[i]);\n\n      if ($.trim($existingChild.children('a:first').text()) > subfolderLabel) {\n        $existingChild.before($subfolder);\n        folderInserted = true;\n        break;\n      }\n    }\n\n    if (!folderInserted) {\n      $parentFolder.siblings('ul').append($subfolder);\n    }\n  },\n\n  _cleanUpTree: function ($parentFolder) {\n    if (\n      $parentFolder !== null &&\n      $parentFolder.siblings('ul').children('li').length === 0\n    ) {\n      this.deinitSourceToggle($parentFolder);\n      $parentFolder.siblings('ul').remove();\n      $parentFolder.siblings('.toggle').remove();\n      $parentFolder.parent().removeClass('expanded');\n    }\n  },\n\n  _positionProgressBar: function () {\n    if (!this.progressBar) {\n      this.progressBar = new Craft.ProgressBar(this.$main, true);\n    }\n\n    var $container = $(),\n      scrollTop = 0,\n      offset = 0;\n\n    if (this.settings.context === 'index') {\n      $container = this.progressBar.$progressBar.closest('#content');\n      scrollTop = Garnish.$win.scrollTop();\n    } else {\n      $container = this.progressBar.$progressBar.closest('.main');\n      scrollTop = this.$main.scrollTop();\n    }\n\n    var containerTop = $container.offset().top;\n    var diff = scrollTop - containerTop;\n    var windowHeight = Garnish.$win.height();\n\n    if ($container.height() > windowHeight) {\n      offset = windowHeight / 2 - 6 + diff;\n    } else {\n      offset = $container.height() / 2 - 6;\n    }\n\n    if (this.settings.context !== 'index') {\n      offset = scrollTop + ($container.height() / 2 - 6);\n    }\n\n    this.progressBar.$progressBar.css({\n      top: offset,\n    });\n  },\n\n  _performBatchRequests: function (parameterArray, finalCallback) {\n    const responseArray = [];\n    let activeRequests = parameterArray.length;\n\n    while (parameterArray.length) {\n      const parameters = parameterArray.shift();\n      Craft.sendActionRequest('POST', parameters.action, {\n        data: parameters.params,\n      })\n        .then((response) => {\n          responseArray.push(response.data);\n        })\n        .finally(() => {\n          this.progressBar.incrementProcessedItemCount(1);\n          this.progressBar.updateProgressBar();\n\n          // Was that the last one?\n          if (--activeRequests === 0) {\n            // If assets were just merged we should get the reference tags updated right away\n            Craft.cp.runQueue();\n            finalCallback(responseArray);\n          }\n        });\n    }\n  },\n});\n\n// Register it!\nCraft.registerElementIndexClass('craft\\\\elements\\\\Asset', Craft.AssetIndex);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Asset Select input\n */\nCraft.AssetSelectInput = Craft.BaseElementSelectInput.extend({\n  requestId: 0,\n  hud: null,\n  $uploadBtn: null,\n  uploader: null,\n  progressBar: null,\n  openPreviewTimeout: null,\n\n  init: function () {\n    this.base.apply(this, arguments);\n\n    if (this.settings.canUpload) {\n      this._attachUploader();\n    }\n\n    this.updateAddElementsBtn();\n\n    this.addListener(\n      this.$elementsContainer,\n      'keydown',\n      this._onKeyDown.bind(this)\n    );\n    this.elementSelect.on('focusItem', this._onElementFocus.bind(this));\n  },\n\n  /**\n   * Handle a keypress\n   * @private\n   */\n  _onKeyDown: function (ev) {\n    if (ev.keyCode === Garnish.SPACE_KEY && ev.shiftKey) {\n      this.openPreview();\n      ev.stopPropagation();\n      return false;\n    }\n  },\n\n  onAddElements: function () {\n    this.$elements\n      .find('.elementthumb')\n      .addClass('open-preview')\n      .on('click', (ev) => {\n        this.clearOpenPreviewTimeout();\n        this.openPreviewTimeout = setTimeout(() => {\n          this.openPreview();\n          this.openPreviewTimeout = null;\n        }, 500);\n      })\n      .on('dblclick', (ev) => {\n        this.clearOpenPreviewTimeout();\n      });\n    this.base();\n  },\n\n  clearOpenPreviewTimeout: function () {\n    if (this.openPreviewTimeout) {\n      clearTimeout(this.openPreviewTimeout);\n      this.openPreviewTimeout = null;\n    }\n  },\n\n  openPreview: function () {\n    if (Craft.PreviewFileModal.openInstance) {\n      Craft.PreviewFileModal.openInstance.selfDestruct();\n    } else {\n      var $element = this.elementSelect.$focusedItem;\n\n      if ($element.length) {\n        this._loadPreview($element);\n      }\n    }\n  },\n\n  /**\n   * Handle element being focused\n   * @private\n   */\n  _onElementFocus: function (ev) {\n    var $element = $(ev.item);\n\n    if (Craft.PreviewFileModal.openInstance && $element.length) {\n      this._loadPreview($element);\n    }\n  },\n\n  /**\n   * Load the preview for an Asset element\n   * @private\n   */\n  _loadPreview: function ($element) {\n    var settings = {\n      minGutter: 50,\n    };\n\n    if ($element.data('image-width')) {\n      settings.startingWidth = $element.data('image-width');\n      settings.startingHeight = $element.data('image-height');\n    }\n\n    new Craft.PreviewFileModal(\n      $element.data('id'),\n      this.elementSelect,\n      settings\n    );\n  },\n\n  /**\n   * Attach the uploader with drag event handler\n   */\n  _attachUploader: function () {\n    this.progressBar = new Craft.ProgressBar(\n      $('<div class=\"progress-shade\"></div>').appendTo(this.$container)\n    );\n\n    var options = {\n      url: Craft.getActionUrl('assets/upload'),\n      dropZone: this.$container,\n      formData: {\n        fieldId: this.settings.fieldId,\n      },\n    };\n\n    if (this.settings.sourceElementId) {\n      options.formData.elementId = this.settings.sourceElementId;\n    }\n\n    if (this.settings.criteria.siteId) {\n      options.formData.siteId = this.settings.criteria.siteId;\n    }\n\n    if (this.$addElementBtn) {\n      this.$uploadBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn dashed',\n        'data-icon': 'upload',\n        'aria-label':\n          this.settings.limit == 1\n            ? Craft.t('app', 'Upload a file')\n            : Craft.t('app', 'Upload files'),\n        'aria-describedby': this.settings.describedBy,\n        text:\n          this.settings.limit == 1\n            ? Craft.t('app', 'Upload a file')\n            : Craft.t('app', 'Upload files'),\n      }).insertAfter(this.$addElementBtn);\n      options.fileInput = $('<input/>', {\n        type: 'file',\n        class: 'hidden',\n        multiple: this.settings.limit != 1,\n      }).insertAfter(this.$uploadBtn);\n\n      // Trigger a window resize in case the field is inside an element editor HUD\n      Garnish.$win.trigger('resize');\n    }\n\n    // If CSRF protection isn't enabled, these won't be defined.\n    if (\n      typeof Craft.csrfTokenName !== 'undefined' &&\n      typeof Craft.csrfTokenValue !== 'undefined'\n    ) {\n      // Add the CSRF token\n      options.formData[Craft.csrfTokenName] = Craft.csrfTokenValue;\n    }\n\n    if (typeof this.settings.criteria.kind !== 'undefined') {\n      options.allowedKinds = this.settings.criteria.kind;\n    }\n\n    options.canAddMoreFiles = this.canAddMoreFiles.bind(this);\n\n    options.events = {};\n    options.events.fileuploadstart = this._onUploadStart.bind(this);\n    options.events.fileuploadprogressall = this._onUploadProgress.bind(this);\n    options.events.fileuploaddone = this._onUploadComplete.bind(this);\n    options.events.fileuploadfail = this._onUploadFailure.bind(this);\n\n    this.uploader = new Craft.Uploader(this.$container, options);\n\n    if (this.$uploadBtn) {\n      this.$uploadBtn.on('click', (ev) => {\n        // We can't store a reference to the file input, because it gets replaced with a new input\n        // each time a new file is uploaded - see https://stackoverflow.com/a/25034721/1688568\n        this.$uploadBtn.next('input[type=file]').trigger('click');\n      });\n    }\n  },\n\n  enableAddElementsBtn: function () {\n    if (this.$uploadBtn) {\n      this.$uploadBtn.removeClass('hidden');\n    }\n\n    this.base();\n  },\n\n  disableAddElementsBtn: function () {\n    if (this.$uploadBtn) {\n      this.$uploadBtn.addClass('hidden');\n    }\n\n    this.base();\n  },\n\n  /**\n   * Add the freshly uploaded file to the input field.\n   */\n  selectUploadedFile: function (element) {\n    // Check if we're able to add new elements\n    if (!this.canAddMoreElements()) {\n      return;\n    }\n\n    var $newElement = element.$element;\n\n    // Make a couple tweaks\n    $newElement.addClass('removable');\n    $newElement.prepend(\n      '<input type=\"hidden\" name=\"' +\n        this.settings.name +\n        '[]\" value=\"' +\n        element.id +\n        '\">' +\n        '<a class=\"delete icon\" title=\"' +\n        Craft.t('app', 'Remove') +\n        '\"></a>'\n    );\n\n    $newElement.appendTo(this.$elementsContainer);\n\n    var margin = -($newElement.outerWidth() + 10);\n\n    this.$addElementBtn.css('margin-' + Craft.left, margin + 'px');\n\n    var animateCss = {};\n    animateCss['margin-' + Craft.left] = 0;\n    this.$addElementBtn.velocity(animateCss, 'fast');\n\n    this.addElements($newElement);\n\n    delete this.modal;\n  },\n\n  /**\n   * On upload start.\n   */\n  _onUploadStart: function () {\n    this.progressBar.$progressBar.css({\n      top: Math.round(this.$container.outerHeight() / 2) - 6,\n    });\n\n    this.$container.addClass('uploading');\n    this.progressBar.resetProgressBar();\n    this.progressBar.showProgressBar();\n  },\n\n  /**\n   * On upload progress.\n   */\n  _onUploadProgress: function (event, data) {\n    var progress = parseInt((data.loaded / data.total) * 100, 10);\n    this.progressBar.setProgressPercentage(progress);\n  },\n\n  /**\n   * On a file being uploaded.\n   */\n  _onUploadComplete: function (event, data) {\n    if (data.result.error) {\n      alert(data.result.error);\n      this.progressBar.hideProgressBar();\n      this.$container.removeClass('uploading');\n    } else {\n      var parameters = {\n        elementId: data.result.assetId,\n        siteId: this.settings.criteria.siteId,\n        thumbSize: this.settings.viewMode,\n      };\n\n      Craft.sendActionRequest('POST', 'elements/get-element-html', {\n        data: parameters,\n      })\n        .then((response) => {\n          var html = $(response.data.html);\n          Craft.appendHeadHtml(response.data.headHtml);\n          this.selectUploadedFile(Craft.getElementInfo(html));\n\n          // Last file\n          if (this.uploader.isLastUpload()) {\n            this.progressBar.hideProgressBar();\n            this.$container.removeClass('uploading');\n            this.$container.trigger('change');\n          }\n        })\n        .catch(({response}) => {\n          alert(response.data.message);\n        });\n\n      Craft.cp.runQueue();\n    }\n  },\n\n  /**\n   * On Upload Failure.\n   */\n  _onUploadFailure: function (event, data) {\n    const response = data.response();\n    let {message, filename} = response?.jqXHR?.responseJSON || {};\n\n    if (!message) {\n      message = filename\n        ? Craft.t('app', 'Upload failed for “{filename}”.', {filename})\n        : Craft.t('app', 'Upload failed.');\n    }\n\n    alert(message);\n    this.progressBar.hideProgressBar();\n    this.$container.removeClass('uploading');\n  },\n\n  /**\n   * We have to take into account files about to be added as well\n   */\n  canAddMoreFiles: function (slotsTaken) {\n    return (\n      !this.settings.limit ||\n      this.$elements.length + slotsTaken < this.settings.limit\n    );\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Asset selector modal class\n */\nCraft.AssetSelectorModal = Craft.BaseElementSelectorModal.extend(\n  {\n    $selectTransformBtn: null,\n    _selectedTransform: null,\n\n    init: function (elementType, settings) {\n      settings = $.extend({}, Craft.AssetSelectorModal.defaults, settings);\n\n      this.base(elementType, settings);\n\n      if (settings.transforms.length) {\n        this.createSelectTransformButton(settings.transforms);\n      }\n    },\n\n    createSelectTransformButton: function (transforms) {\n      if (!transforms || !transforms.length) {\n        return;\n      }\n\n      var $btnGroup = $('<div class=\"btngroup\"/>').appendTo(\n        this.$primaryButtons\n      );\n      this.$selectBtn.appendTo($btnGroup);\n\n      this.$selectTransformBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn menubtn disabled',\n        text: Craft.t('app', 'Select transform'),\n      }).appendTo($btnGroup);\n\n      var $menu = $('<div class=\"menu\" data-align=\"right\"></div>').insertAfter(\n          this.$selectTransformBtn\n        ),\n        $menuList = $('<ul></ul>').appendTo($menu);\n\n      for (var i = 0; i < transforms.length; i++) {\n        $(\n          '<li><a data-transform=\"' +\n            transforms[i].handle +\n            '\">' +\n            transforms[i].name +\n            '</a></li>'\n        ).appendTo($menuList);\n      }\n\n      var MenuButton = new Garnish.MenuBtn(this.$selectTransformBtn, {\n        onOptionSelect: this.onSelectTransform.bind(this),\n      });\n      MenuButton.disable();\n\n      this.$selectTransformBtn.data('menuButton', MenuButton);\n    },\n\n    onSelectionChange: function (ev) {\n      var $selectedElements = this.elementIndex.getSelectedElements(),\n        allowTransforms = false;\n\n      if ($selectedElements.length && this.settings.transforms.length) {\n        allowTransforms = true;\n\n        for (var i = 0; i < $selectedElements.length; i++) {\n          if (!$('.element.hasthumb:first', $selectedElements[i]).length) {\n            break;\n          }\n        }\n      }\n\n      var MenuBtn = null;\n\n      if (this.$selectTransformBtn) {\n        MenuBtn = this.$selectTransformBtn.data('menuButton');\n      }\n\n      if (allowTransforms) {\n        if (MenuBtn) {\n          MenuBtn.enable();\n        }\n\n        this.$selectTransformBtn.removeClass('disabled');\n      } else if (this.$selectTransformBtn) {\n        if (MenuBtn) {\n          MenuBtn.disable();\n        }\n\n        this.$selectTransformBtn.addClass('disabled');\n      }\n\n      this.base();\n    },\n\n    onSelectTransform: function (option) {\n      var transform = $(option).data('transform');\n      this.selectImagesWithTransform(transform);\n    },\n\n    selectImagesWithTransform: function (transform) {\n      // First we must get any missing transform URLs\n      if (\n        typeof Craft.AssetSelectorModal.transformUrls[transform] === 'undefined'\n      ) {\n        Craft.AssetSelectorModal.transformUrls[transform] = {};\n      }\n\n      var $selectedElements = this.elementIndex.getSelectedElements(),\n        imageIdsWithMissingUrls = [];\n\n      for (var i = 0; i < $selectedElements.length; i++) {\n        var $item = $($selectedElements[i]),\n          elementId = Craft.getElementInfo($item).id;\n\n        if (\n          typeof Craft.AssetSelectorModal.transformUrls[transform][\n            elementId\n          ] === 'undefined'\n        ) {\n          imageIdsWithMissingUrls.push(elementId);\n        }\n      }\n\n      if (imageIdsWithMissingUrls.length) {\n        this.showFooterSpinner();\n\n        this.fetchMissingTransformUrls(\n          imageIdsWithMissingUrls,\n          transform,\n          () => {\n            this.hideFooterSpinner();\n            this.selectImagesWithTransform(transform);\n          }\n        );\n      } else {\n        this._selectedTransform = transform;\n        this.selectElements();\n        this._selectedTransform = null;\n      }\n    },\n\n    fetchMissingTransformUrls: function (\n      imageIdsWithMissingUrls,\n      transform,\n      callback\n    ) {\n      var elementId = imageIdsWithMissingUrls.pop();\n\n      var data = {\n        assetId: elementId,\n        handle: transform,\n      };\n\n      Craft.sendActionRequest('POST', 'assets/generate-transform', {data})\n        .then((response) => {\n          Craft.AssetSelectorModal.transformUrls[transform][elementId] = false;\n          if (response.data.url) {\n            Craft.AssetSelectorModal.transformUrls[transform][elementId] =\n              response.data.url;\n          }\n        })\n        .catch(({response}) => {\n          Craft.AssetSelectorModal.transformUrls[transform][elementId] = false;\n\n          // More to load?\n          if (imageIdsWithMissingUrls.length) {\n            this.fetchMissingTransformUrls(\n              imageIdsWithMissingUrls,\n              transform,\n              callback\n            );\n          } else {\n            callback();\n          }\n        });\n    },\n\n    getElementInfo: function ($selectedElements) {\n      var info = this.base($selectedElements);\n\n      if (this._selectedTransform) {\n        for (var i = 0; i < info.length; i++) {\n          var elementId = info[i].id;\n\n          if (\n            typeof Craft.AssetSelectorModal.transformUrls[\n              this._selectedTransform\n            ][elementId] !== 'undefined' &&\n            Craft.AssetSelectorModal.transformUrls[this._selectedTransform][\n              elementId\n            ] !== false\n          ) {\n            info[i].url =\n              Craft.AssetSelectorModal.transformUrls[this._selectedTransform][\n                elementId\n              ];\n          }\n        }\n      }\n\n      return info;\n    },\n\n    onSelect: function (elementInfo) {\n      this.settings.onSelect(elementInfo, this._selectedTransform);\n    },\n  },\n  {\n    defaults: {\n      canSelectImageTransforms: false,\n      transforms: [],\n    },\n\n    transformUrls: {},\n  }\n);\n\n// Register it!\nCraft.registerElementSelectorModalClass(\n  'craft\\\\elements\\\\Asset',\n  Craft.AssetSelectorModal\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * AuthManager class\n */\nCraft.AuthManager = Garnish.Base.extend(\n  {\n    remainingSessionTime: null,\n    checkRemainingSessionTimer: null,\n    showLoginModalTimer: null,\n    decrementLogoutWarningInterval: null,\n\n    showingLogoutWarningModal: false,\n    showingLoginModal: false,\n\n    logoutWarningModal: null,\n    loginModal: null,\n\n    $logoutWarningPara: null,\n    $passwordInput: null,\n    $loginBtn: null,\n    $loginErrorPara: null,\n\n    submitLoginIfLoggedOut: false,\n\n    /**\n     * Init\n     */\n    init: function () {\n      if (Craft.username) {\n        this.updateRemainingSessionTime(Craft.remainingSessionTime);\n      }\n    },\n\n    /**\n     * Sets a timer for the next time to check the auth timeout.\n     */\n    setCheckRemainingSessionTimer: function (seconds) {\n      if (this.checkRemainingSessionTimer) {\n        clearTimeout(this.checkRemainingSessionTimer);\n      }\n\n      this.checkRemainingSessionTimer = setTimeout(\n        this.checkRemainingSessionTime.bind(this),\n        seconds * 1000\n      );\n    },\n\n    /**\n     * Pings the server to see how many seconds are left on the current user session, and handles the response.\n     */\n    checkRemainingSessionTime: function (extendSession) {\n      $.ajax({\n        url: Craft.getActionUrl(\n          'users/session-info',\n          extendSession ? null : 'dontExtendSession=1'\n        ),\n        type: 'GET',\n        dataType: 'json',\n        complete: (jqXHR, textStatus) => {\n          if (textStatus === 'success') {\n            if (\n              typeof jqXHR.responseJSON.csrfTokenValue !== 'undefined' &&\n              typeof Craft.csrfTokenValue !== 'undefined'\n            ) {\n              Craft.csrfTokenValue = jqXHR.responseJSON.csrfTokenValue;\n            }\n\n            this.updateRemainingSessionTime(jqXHR.responseJSON.timeout);\n            this.submitLoginIfLoggedOut = false;\n          } else {\n            this.updateRemainingSessionTime(-1);\n          }\n        },\n      });\n    },\n\n    /**\n     * Updates our record of the auth timeout, and handles it.\n     */\n    updateRemainingSessionTime: function (remainingSessionTime) {\n      this.remainingSessionTime = parseInt(remainingSessionTime);\n\n      // Are we within the warning window?\n      if (\n        this.remainingSessionTime !== -1 &&\n        this.remainingSessionTime < Craft.AuthManager.minSafeSessionTime\n      ) {\n        // Is there still time to renew the session?\n        if (this.remainingSessionTime) {\n          if (!this.showingLogoutWarningModal) {\n            // Show the warning modal\n            this.showLogoutWarningModal();\n          }\n\n          // Will the session expire before the next checkup?\n          if (this.remainingSessionTime < Craft.AuthManager.checkInterval) {\n            if (this.showLoginModalTimer) {\n              clearTimeout(this.showLoginModalTimer);\n            }\n\n            this.showLoginModalTimer = setTimeout(\n              this.showLoginModal.bind(this),\n              this.remainingSessionTime * 1000\n            );\n          }\n        } else {\n          if (this.showingLoginModal) {\n            if (this.submitLoginIfLoggedOut) {\n              this.submitLogin();\n            }\n          } else {\n            // Show the login modal\n            this.showLoginModal();\n          }\n        }\n\n        this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval);\n      } else {\n        // Everything's good!\n        this.hideLogoutWarningModal();\n        this.hideLoginModal();\n\n        // Will be be within the minSafeSessionTime before the next update?\n        if (\n          this.remainingSessionTime !== -1 &&\n          this.remainingSessionTime <\n            Craft.AuthManager.minSafeSessionTime +\n              Craft.AuthManager.checkInterval\n        ) {\n          this.setCheckRemainingSessionTimer(\n            this.remainingSessionTime - Craft.AuthManager.minSafeSessionTime + 1\n          );\n        } else {\n          this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval);\n        }\n      }\n    },\n\n    /**\n     * Shows the logout warning modal.\n     */\n    showLogoutWarningModal: function () {\n      var quickShow;\n\n      if (this.showingLoginModal) {\n        this.hideLoginModal(true);\n        quickShow = true;\n      } else {\n        quickShow = false;\n      }\n\n      this.showingLogoutWarningModal = true;\n\n      if (!this.logoutWarningModal) {\n        let $form = $(\n          '<form id=\"logoutwarningmodal\" class=\"modal alert fitted\"/>'\n        );\n        let $body = $('<div class=\"body\"/>').appendTo($form);\n        let $buttons = $('<div class=\"buttons right\"/>').appendTo($body);\n        let $logoutBtn = $('<button/>', {\n          type: 'button',\n          class: 'btn',\n          text: Craft.t('app', 'Sign out now'),\n        }).appendTo($buttons);\n        let $renewSessionBtn = $('<button/>', {\n          type: 'submit',\n          class: 'btn submit',\n          text: Craft.t('app', 'Keep me signed in'),\n        }).appendTo($buttons);\n\n        this.$logoutWarningPara = $('<p/>').prependTo($body);\n\n        this.logoutWarningModal = new Garnish.Modal($form, {\n          autoShow: false,\n          closeOtherModals: false,\n          hideOnEsc: false,\n          hideOnShadeClick: false,\n          shadeClass: 'modal-shade dark logoutwarningmodalshade',\n          onFadeIn: function () {\n            if (!Garnish.isMobileBrowser(true)) {\n              // Auto-focus the renew button\n              setTimeout(function () {\n                $renewSessionBtn.trigger('focus');\n              }, 100);\n            }\n          },\n        });\n\n        this.addListener($logoutBtn, 'activate', 'logout');\n        this.addListener($form, 'submit', 'renewSession');\n      }\n\n      if (quickShow) {\n        this.logoutWarningModal.quickShow();\n      } else {\n        this.logoutWarningModal.show();\n      }\n\n      this.updateLogoutWarningMessage();\n\n      this.decrementLogoutWarningInterval = setInterval(\n        this.decrementLogoutWarning.bind(this),\n        1000\n      );\n    },\n\n    /**\n     * Updates the logout warning message indicating that the session is about to expire.\n     */\n    updateLogoutWarningMessage: function () {\n      this.$logoutWarningPara.text(\n        Craft.t('app', 'Your session will expire in {time}.', {\n          time: Craft.secondsToHumanTimeDuration(this.remainingSessionTime),\n        })\n      );\n\n      this.logoutWarningModal.updateSizeAndPosition();\n    },\n\n    decrementLogoutWarning: function () {\n      if (this.remainingSessionTime > 0) {\n        this.remainingSessionTime--;\n        this.updateLogoutWarningMessage();\n      }\n\n      if (this.remainingSessionTime === 0) {\n        clearInterval(this.decrementLogoutWarningInterval);\n      }\n    },\n\n    /**\n     * Hides the logout warning modal.\n     */\n    hideLogoutWarningModal: function (quick) {\n      this.showingLogoutWarningModal = false;\n\n      if (this.logoutWarningModal) {\n        if (quick) {\n          this.logoutWarningModal.quickHide();\n        } else {\n          this.logoutWarningModal.hide();\n        }\n\n        if (this.decrementLogoutWarningInterval) {\n          clearInterval(this.decrementLogoutWarningInterval);\n        }\n      }\n    },\n\n    /**\n     * Shows the login modal.\n     */\n    showLoginModal: function () {\n      var quickShow;\n\n      if (this.showingLogoutWarningModal) {\n        this.hideLogoutWarningModal(true);\n        quickShow = true;\n      } else {\n        quickShow = false;\n      }\n\n      this.showingLoginModal = true;\n\n      if (!this.loginModal) {\n        var $form = $('<form id=\"loginmodal\" class=\"modal alert fitted\"/>'),\n          $body = $(\n            '<div class=\"body\"><h2>' +\n              Craft.t('app', 'Your session has ended.') +\n              '</h2><p>' +\n              Craft.t('app', 'Enter your password to log back in.') +\n              '</p></div>'\n          ).appendTo($form),\n          $inputContainer = $('<div class=\"inputcontainer\">').appendTo($body),\n          $inputsFlexContainer = $('<div class=\"flex\"/>').appendTo(\n            $inputContainer\n          ),\n          $passwordContainer = $('<div class=\"flex-grow\"/>').appendTo(\n            $inputsFlexContainer\n          ),\n          $buttonContainer = $('<div/>').appendTo($inputsFlexContainer),\n          $passwordWrapper = $('<div class=\"passwordwrapper\"/>').appendTo(\n            $passwordContainer\n          );\n\n        this.$passwordInput = $(\n          '<input type=\"password\" class=\"text password fullwidth\" autocomplete=\"current-password\" placeholder=\"' +\n            Craft.t('app', 'Password') +\n            '\"/>'\n        ).appendTo($passwordWrapper);\n        this.$loginBtn = Craft.ui\n          .createSubmitButton({\n            class: 'disabled',\n            label: Craft.t('app', 'Sign in'),\n            spinner: true,\n          })\n          .attr('aria-disabled', 'true')\n          .appendTo($buttonContainer);\n        this.$loginErrorPara = $('<p class=\"error\"/>').appendTo($body);\n\n        this.loginModal = new Garnish.Modal($form, {\n          autoShow: false,\n          closeOtherModals: false,\n          hideOnEsc: false,\n          hideOnShadeClick: false,\n          shadeClass: 'modal-shade dark loginmodalshade',\n          onFadeIn: () => {\n            if (!Garnish.isMobileBrowser(true)) {\n              // Auto-focus the password input\n              setTimeout(() => {\n                this.$passwordInput.trigger('focus');\n              }, 100);\n            }\n          },\n          onFadeOut: () => {\n            this.$passwordInput.val('');\n          },\n        });\n\n        new Craft.PasswordInput(this.$passwordInput, {\n          onToggleInput: ($newPasswordInput) => {\n            this.$passwordInput = $newPasswordInput;\n          },\n        });\n\n        this.addListener(this.$passwordInput, 'input', 'validatePassword');\n        this.addListener($form, 'submit', 'login');\n      }\n\n      if (quickShow) {\n        this.loginModal.quickShow();\n      } else {\n        this.loginModal.show();\n      }\n    },\n\n    /**\n     * Hides the login modal.\n     */\n    hideLoginModal: function (quick) {\n      this.showingLoginModal = false;\n\n      if (this.loginModal) {\n        if (quick) {\n          this.loginModal.quickHide();\n        } else {\n          this.loginModal.hide();\n        }\n      }\n    },\n\n    logout: function () {\n      $.get({\n        url: Craft.getActionUrl('users/logout'),\n        dataType: 'json',\n        success: () => {\n          Craft.redirectTo('');\n        },\n      });\n    },\n\n    renewSession: function (ev) {\n      if (ev) {\n        ev.preventDefault();\n      }\n\n      this.hideLogoutWarningModal();\n      this.checkRemainingSessionTime(true);\n    },\n\n    validatePassword: function () {\n      if (this.$passwordInput.val().length >= 6) {\n        this.$loginBtn.removeClass('disabled');\n        this.$loginBtn.removeAttr('aria-disabled');\n        return true;\n      } else {\n        this.$loginBtn.addClass('disabled');\n        this.$loginBtn.attr('aria-disabled', 'true');\n        return false;\n      }\n    },\n\n    login: function (ev) {\n      if (ev) {\n        ev.preventDefault();\n      }\n\n      if (this.validatePassword()) {\n        this.$loginBtn.addClass('loading');\n        this.clearLoginError();\n\n        if (typeof Craft.csrfTokenValue !== 'undefined') {\n          // Check the auth status one last time before sending this off,\n          // in case the user has already logged back in from another window/tab\n          this.submitLoginIfLoggedOut = true;\n          this.checkRemainingSessionTime();\n        } else {\n          this.submitLogin();\n        }\n      }\n    },\n\n    submitLogin: function () {\n      var data = {\n        loginName: Craft.username,\n        password: this.$passwordInput.val(),\n      };\n\n      Craft.sendActionRequest('POST', 'users/login', {data})\n        .then((response) => {\n          this.$loginBtn.removeClass('loading');\n          this.hideLoginModal();\n          this.checkRemainingSessionTime();\n        })\n        .catch(({response}) => {\n          this.$loginBtn.removeClass('loading');\n          this.showLoginError(response.data.message || null);\n          Garnish.shake(this.loginModal.$container);\n\n          if (!Garnish.isMobileBrowser(true)) {\n            this.$passwordInput.trigger('focus');\n          }\n        });\n    },\n\n    showLoginError: function (error) {\n      if (error === null || typeof error === 'undefined') {\n        error = Craft.t('app', 'A server error occurred.');\n      }\n\n      this.$loginErrorPara.text(error);\n      this.loginModal.updateSizeAndPosition();\n    },\n\n    clearLoginError: function () {\n      this.showLoginError('');\n    },\n  },\n  {\n    checkInterval: 60,\n    minSafeSessionTime: 120,\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Element index class\n */\nCraft.BaseElementIndex = Garnish.Base.extend(\n  {\n    initialized: false,\n    elementType: null,\n    idPrefix: null,\n\n    instanceState: null,\n    sourceStates: null,\n    sourceStatesStorageKey: null,\n\n    searchTimeout: null,\n    sourceSelect: null,\n\n    $container: null,\n    $main: null,\n    isIndexBusy: false,\n\n    $sidebar: null,\n    showingSidebar: null,\n    sourceKey: null,\n    rootSourceKey: null,\n    sourceViewModes: null,\n    $source: null,\n    $rootSource: null,\n    sourcesByKey: null,\n    $visibleSources: null,\n\n    $sourceActionsContainer: null,\n    $sourceActionsBtn: null,\n\n    $toolbar: null,\n    toolbarOffset: null,\n\n    $searchContainer: null,\n    $search: null,\n    $filterBtn: null,\n    searching: false,\n    searchText: null,\n    sortByScore: null,\n    trashed: false,\n    drafts: false,\n    $clearSearchBtn: null,\n\n    $statusMenuBtn: null,\n    $statusMenuContainer: null,\n    statusMenu: null,\n    status: null,\n\n    $siteMenuBtn: null,\n    siteMenu: null,\n    siteId: null,\n\n    $elements: null,\n    $updateSpinner: null,\n    $viewModeBtnContainer: null,\n    viewModeBtns: null,\n    viewMode: null,\n    view: null,\n    _autoSelectElements: null,\n    $countSpinner: null,\n    $countContainer: null,\n    $actionsContainer: null,\n    page: 1,\n    resultSet: null,\n    totalResults: null,\n    $exportBtn: null,\n\n    actions: null,\n    actionsHeadHtml: null,\n    actionsBodyHtml: null,\n    $selectAllContainer: null,\n    $selectAllCheckbox: null,\n    showingActionTriggers: false,\n    exporters: null,\n    exportersByType: null,\n    _$triggers: null,\n\n    _ignoreFailedRequest: false,\n    _cancelToken: null,\n\n    viewMenus: null,\n    activeViewMenu: null,\n    filterHuds: null,\n\n    /**\n     * Constructor\n     */\n    init: function (elementType, $container, settings) {\n      this.elementType = elementType;\n      this.$container = $container;\n      this.setSettings(settings, Craft.BaseElementIndex.defaults);\n\n      // Define an ID prefix that can be used for dynamically created elements\n      // ---------------------------------------------------------------------\n\n      this.idPrefix = Craft.randomString(10);\n\n      // Set the state objects\n      // ---------------------------------------------------------------------\n\n      this.instanceState = this.getDefaultInstanceState();\n\n      this.sourceStates = {};\n\n      // Instance states (selected source) are stored by a custom storage key defined in the settings\n      if (this.settings.storageKey) {\n        $.extend(\n          this.instanceState,\n          Craft.getLocalStorage(this.settings.storageKey),\n          {}\n        );\n      }\n\n      // Source states (view mode, etc.) are stored by the element type and context\n      this.sourceStatesStorageKey =\n        'BaseElementIndex.' + this.elementType + '.' + this.settings.context;\n      $.extend(\n        this.sourceStates,\n        Craft.getLocalStorage(this.sourceStatesStorageKey, {})\n      );\n\n      // Find the DOM elements\n      // ---------------------------------------------------------------------\n\n      this.$main = this.$container.find('.main');\n      this.$toolbar = this.$container.find(this.settings.toolbarSelector);\n      this.$statusMenuBtn = this.$toolbar.find('.statusmenubtn:first');\n      this.$statusMenuContainer = this.$statusMenuBtn.parent();\n      this.$siteMenuBtn = this.$container.find('.sitemenubtn:first');\n\n      this.$searchContainer = this.$toolbar.find('.search:first');\n      this.$search = this.$searchContainer.children('input:first');\n      this.$filterBtn = this.$searchContainer.children('.filter-btn:first');\n      this.$clearSearchBtn = this.$searchContainer.children('.clear-btn:first');\n\n      this.$sidebar = this.$container.find('.sidebar:first');\n      this.$sourceActionsContainer = this.$sidebar.find('#source-actions');\n\n      this.$elements = this.$container.find('.elements:first');\n      this.$updateSpinner = this.$elements.find('.spinner');\n\n      if (!this.$updateSpinner.length) {\n        this.$updateSpinner = $('<div/>', {\n          class: 'update-spinner spinner spinner-absolute',\n        }).appendTo(this.$elements);\n      }\n\n      this.$countSpinner = this.$container.find('#count-spinner');\n      this.$countContainer = this.$container.find('#count-container');\n      this.$actionsContainer = this.$container.find('#actions-container');\n      this.$exportBtn = this.$container.find('#export-btn');\n\n      // Hide sidebar if needed\n      if (this.settings.hideSidebar) {\n        this.$sidebar.hide();\n        $('.body, .content', this.$container).removeClass('has-sidebar');\n      }\n\n      // Initialize the sources\n      // ---------------------------------------------------------------------\n\n      if (!this.initSources()) {\n        return;\n      }\n\n      // Initialize the status menu\n      // ---------------------------------------------------------------------\n\n      if (this.$statusMenuBtn.length) {\n        this.statusMenu = this.$statusMenuBtn.menubtn().data('menubtn').menu;\n        this.statusMenu.on('optionselect', this._handleStatusChange.bind(this));\n      }\n\n      // Initialize the site menu\n      // ---------------------------------------------------------------------\n\n      // Is there a site menu?\n      if (this.$siteMenuBtn.length) {\n        this.siteMenu = this.$siteMenuBtn.menubtn().data('menubtn').menu;\n\n        // Figure out the initial site\n        var $option = this.siteMenu.$options.filter('.sel:first');\n\n        if (!$option.length) {\n          $option = this.siteMenu.$options.first();\n        }\n\n        if ($option.length) {\n          this._setSite($option.data('site-id'));\n        } else {\n          // No site options -- they must not have any site permissions\n          this.settings.criteria = {id: '0'};\n        }\n\n        this.siteMenu.on('optionselect', this._handleSiteChange.bind(this));\n\n        if (this.siteId) {\n          // Should we be using a different default site?\n          var defaultSiteId =\n            this.settings.defaultSiteId || Craft.cp.getSiteId();\n\n          if (defaultSiteId && defaultSiteId != this.siteId) {\n            // Is that one available here?\n            var $storedSiteOption = this.siteMenu.$options.filter(\n              '[data-site-id=\"' + defaultSiteId + '\"]:first'\n            );\n\n            if ($storedSiteOption.length) {\n              // Todo: switch this to siteMenu.selectOption($storedSiteOption) once Menu is updated to support that\n              $storedSiteOption.trigger('click');\n            }\n          }\n        }\n      } else if (\n        this.settings.criteria &&\n        this.settings.criteria.siteId &&\n        this.settings.criteria.siteId !== '*'\n      ) {\n        this._setSite(this.settings.criteria.siteId);\n      } else {\n        this._setSite(Craft.siteId);\n      }\n\n      // Don't let the criteria override the selected site\n      if (this.settings.criteria && this.settings.criteria.siteId) {\n        delete this.settings.criteria.siteId;\n      }\n\n      // Initialize the search input\n      // ---------------------------------------------------------------------\n\n      // Automatically update the elements after new search text has been sitting for a 1/2 second\n      this.addListener(this.$search, 'input', () => {\n        if (!this.searching && this.$search.val()) {\n          this.startSearching();\n        } else if (this.searching && !this.$search.val()) {\n          this.stopSearching();\n        }\n\n        if (this.searchTimeout) {\n          clearTimeout(this.searchTimeout);\n        }\n\n        this.searchTimeout = setTimeout(\n          this.updateElementsIfSearchTextChanged.bind(this),\n          500\n        );\n      });\n\n      // Update the elements when the Return key is pressed\n      this.addListener(this.$search, 'keypress', (ev) => {\n        if (ev.keyCode === Garnish.RETURN_KEY) {\n          ev.preventDefault();\n\n          if (this.searchTimeout) {\n            clearTimeout(this.searchTimeout);\n          }\n\n          this.updateElementsIfSearchTextChanged();\n        }\n      });\n\n      // Clear the search when the X button is clicked\n      this.addListener(this.$clearSearchBtn, 'click', () => {\n        this.clearSearch(true);\n\n        if (!Garnish.isMobileBrowser(true)) {\n          this.$search.trigger('focus');\n        }\n      });\n\n      // Auto-focus the Search box\n      if (!Garnish.isMobileBrowser(true)) {\n        this.$search.trigger('focus');\n      }\n\n      // View menus\n      this.viewMenus = {};\n\n      // Filter HUDs\n      this.filterHuds = {};\n      this.addListener(this.$filterBtn, 'click', 'showFilterHud');\n\n      // Set the default status\n      // ---------------------------------------------------------------------\n\n      const queryParams = Craft.getQueryParams();\n\n      if (queryParams.status) {\n        let selector;\n        switch (queryParams.status) {\n          case 'trashed':\n            selector = '[data-trashed]';\n            break;\n          case 'drafts':\n            selector = '[data-drafts]';\n            break;\n          default:\n            selector = `[data-status=\"${queryParams.status}\"]`;\n        }\n\n        const $option = this.statusMenu.$options.filter(selector);\n        if ($option.length) {\n          this.statusMenu.selectOption($option[0]);\n        } else {\n          this.setQueryParam('status', null);\n        }\n      }\n\n      // Initialize the Export button\n      // ---------------------------------------------------------------------\n\n      this.addListener(this.$exportBtn, 'click', '_showExportHud');\n\n      // Let everyone know that the UI is initialized\n      // ---------------------------------------------------------------------\n\n      this.initialized = true;\n      this.afterInit();\n\n      // Select the initial source\n      // ---------------------------------------------------------------------\n\n      this.selectDefaultSource();\n\n      // Select the default sort attribute/direction\n      // ---------------------------------------------------------------------\n\n      if (queryParams.sort) {\n        const lastDashPos = queryParams.sort.lastIndexOf('-');\n        if (lastDashPos !== -1) {\n          const attr = queryParams.sort.substring(0, lastDashPos);\n          const dir = queryParams.sort.substring(lastDashPos + 1);\n          this.setSelectedSortAttribute(attr, dir);\n        }\n      }\n\n      // Load the first batch of elements!\n      // ---------------------------------------------------------------------\n\n      // Default to whatever page is in the URL\n      this.setPage(Craft.pageNum);\n\n      this.updateElements(true);\n    },\n\n    afterInit: function () {\n      this.onAfterInit();\n    },\n\n    _createCancelToken: function () {\n      this._cancelToken = axios.CancelToken.source();\n      return this._cancelToken.token;\n    },\n\n    _cancelRequests: function () {\n      if (this._cancelToken) {\n        this._ignoreFailedRequest = true;\n        this._cancelToken.cancel();\n        Garnish.requestAnimationFrame(() => {\n          this._ignoreFailedRequest = false;\n        });\n      }\n    },\n\n    getSourceContainer: function () {\n      return this.$sidebar.find('nav > ul');\n    },\n\n    get $sources() {\n      if (!this.sourceSelect) {\n        return undefined;\n      }\n\n      return this.sourceSelect.$items;\n    },\n\n    getSite: function () {\n      if (!this.siteId) {\n        return undefined;\n      }\n      return Craft.sites.find((s) => s.id == this.siteId);\n    },\n\n    initSources: function () {\n      var $sources = this._getSourcesInList(this.getSourceContainer(), true);\n\n      // No source, no party.\n      if ($sources.length === 0) {\n        return false;\n      }\n\n      // The source selector\n      if (!this.sourceSelect) {\n        this.sourceSelect = new Garnish.Select(this.$sidebar.find('nav'), {\n          multi: false,\n          allowEmpty: false,\n          vertical: true,\n          onSelectionChange: this._handleSourceSelectionChange.bind(this),\n        });\n      }\n\n      this.sourcesByKey = {};\n\n      for (let i = 0; i < $sources.length; i++) {\n        this.initSource($($sources[i]));\n      }\n\n      return true;\n    },\n\n    selectDefaultSource: function () {\n      // The `source` query param should always take precedence\n      let sourceKey;\n      if (this.settings.context === 'index') {\n        sourceKey = Craft.getQueryParam('source');\n      }\n\n      if (!sourceKey) {\n        sourceKey = this.getDefaultSourceKey();\n      }\n\n      let $source;\n\n      if (sourceKey) {\n        $source = this.getSourceByKey(sourceKey);\n\n        // Make sure it's visible\n        if (this.$visibleSources.index($source) === -1) {\n          $source = null;\n        }\n      }\n\n      if (!sourceKey || !$source) {\n        // Select the first source by default\n        $source = this.$visibleSources.first();\n      }\n\n      return this.selectSource($source);\n    },\n\n    refreshSources: function () {\n      this.sourceSelect.removeAllItems();\n\n      this.setIndexBusy();\n\n      Craft.sendActionRequest('POST', this.settings.refreshSourcesAction, {\n        data: {\n          context: this.settings.context,\n          elementType: this.elementType,\n        },\n      })\n        .then((response) => {\n          this.setIndexAvailable();\n          this.getSourceContainer().replaceWith(response.data.html);\n          this.initSources();\n          this.selectDefaultSource();\n        })\n        .catch(() => {\n          this.setIndexAvailable();\n          if (!this._ignoreFailedRequest) {\n            Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n          }\n        });\n    },\n\n    initSource: function ($source) {\n      this.sourceSelect.addItems($source);\n      this.initSourceToggle($source);\n      this.sourcesByKey[$source.data('key')] = $source;\n\n      if (\n        $source.data('hasNestedSources') &&\n        this.instanceState.expandedSources.indexOf($source.data('key')) !== -1\n      ) {\n        this._expandSource($source);\n      }\n    },\n\n    initSourceToggle: function ($source) {\n      // Remove handlers for the same thing. Just in case.\n      this.deinitSourceToggle($source);\n\n      var $toggle = this._getSourceToggle($source);\n\n      if ($toggle.length) {\n        this.addListener($source, 'dblclick', '_handleSourceDblClick');\n        this.addListener($toggle, 'click', '_handleSourceToggleClick');\n        $source.data('hasNestedSources', true);\n      } else {\n        $source.data('hasNestedSources', false);\n      }\n    },\n\n    deinitSource: function ($source) {\n      this.sourceSelect.removeItems($source);\n      this.deinitSourceToggle($source);\n      delete this.sourcesByKey[$source.data('key')];\n    },\n\n    deinitSourceToggle: function ($source) {\n      if ($source.data('hasNestedSources')) {\n        this.removeListener($source, 'dblclick');\n        this.removeListener(this._getSourceToggle($source), 'click');\n      }\n\n      $source.removeData('hasNestedSources');\n    },\n\n    getDefaultInstanceState: function () {\n      return {\n        selectedSource: null,\n        expandedSources: [],\n      };\n    },\n\n    getDefaultSourceKey: function () {\n      if (this.settings.defaultSource) {\n        const paths = this.settings.defaultSource.split('/');\n        let path = '';\n\n        // Expand the tree\n        for (let i = 0; i < paths.length; i++) {\n          path += paths[i];\n          const $source = this.getSourceByKey(path);\n\n          // If the folder can't be found, then just go to the stored instance source.\n          if (!$source) {\n            return this.instanceState.selectedSource;\n          }\n\n          this._expandSource($source);\n          path += '/';\n        }\n\n        // Just make sure that the modal is aware of the newly expanded sources, too.\n        this._setSite(this.siteId);\n\n        return this.settings.defaultSource;\n      }\n\n      return this.instanceState.selectedSource;\n    },\n\n    getDefaultExpandedSources: function () {\n      return this.instanceState.expandedSources;\n    },\n\n    startSearching: function () {\n      // Show the clear button\n      this.$clearSearchBtn.removeClass('hidden');\n      this.searching = true;\n      this.sortByScore = true;\n\n      if (this.activeViewMenu) {\n        this.activeViewMenu.updateSortField();\n      }\n    },\n\n    clearSearch: function (updateElements) {\n      if (!this.searching) {\n        return;\n      }\n\n      this.$search.val('');\n\n      if (this.searchTimeout) {\n        clearTimeout(this.searchTimeout);\n      }\n\n      this.stopSearching();\n\n      if (updateElements) {\n        this.updateElementsIfSearchTextChanged();\n      } else {\n        this.searchText = null;\n      }\n    },\n\n    stopSearching: function () {\n      // Hide the clear button\n      this.$clearSearchBtn.addClass('hidden');\n      this.searching = false;\n      this.sortByScore = false;\n\n      if (this.activeViewMenu) {\n        this.activeViewMenu.updateSortField();\n      }\n    },\n\n    setInstanceState: function (key, value) {\n      if (typeof key === 'object') {\n        $.extend(this.instanceState, key);\n      } else {\n        this.instanceState[key] = value;\n      }\n\n      this.storeInstanceState();\n    },\n\n    storeInstanceState: function () {\n      if (this.settings.storageKey) {\n        Craft.setLocalStorage(this.settings.storageKey, this.instanceState);\n      }\n    },\n\n    getSourceState: function (sourceKey, key, defaultValue) {\n      sourceKey = sourceKey.replace(/\\/.*/, '');\n\n      if (typeof this.sourceStates[sourceKey] === 'undefined') {\n        // Set it now so any modifications to it by whoever's calling this will be stored.\n        this.sourceStates[sourceKey] = {};\n      }\n\n      if (typeof key === 'undefined') {\n        return this.sourceStates[sourceKey];\n      } else if (typeof this.sourceStates[sourceKey][key] !== 'undefined') {\n        return this.sourceStates[sourceKey][key];\n      } else {\n        return typeof defaultValue !== 'undefined' ? defaultValue : null;\n      }\n    },\n\n    getSelectedSourceState: function (key, defaultValue) {\n      return this.getSourceState(\n        this.instanceState.selectedSource,\n        key,\n        defaultValue\n      );\n    },\n\n    setSelecetedSourceState: function (key, value) {\n      var viewState = this.getSelectedSourceState();\n\n      if (typeof key === 'object') {\n        for (let k in key) {\n          if (key.hasOwnProperty(k)) {\n            if (key[k] !== null) {\n              viewState[k] = key[k];\n            } else {\n              delete viewState[k];\n            }\n          }\n        }\n      } else if (value !== null) {\n        viewState[key] = value;\n      } else {\n        delete viewState[key];\n      }\n\n      const sourceKey = this.instanceState.selectedSource.replace(/\\/.*/, '');\n\n      this.sourceStates[sourceKey] = viewState;\n\n      // Clean up sourceStates while we're at it\n      for (let i in this.sourceStates) {\n        if (this.sourceStates.hasOwnProperty(i) && i.includes('/')) {\n          delete this.sourceStates[i];\n        }\n      }\n\n      // Store it in localStorage too\n      Craft.setLocalStorage(this.sourceStatesStorageKey, this.sourceStates);\n    },\n\n    /**\n     * @deprecated in 4.3.0.\n     */\n    storeSortAttributeAndDirection: function () {},\n\n    /**\n     * Sets the page number.\n     */\n    setPage: function (page) {\n      if (this.settings.context !== 'index') {\n        return;\n      }\n\n      page = Math.max(page, 1);\n      this.page = page;\n\n      const url = Craft.getPageUrl(this.page);\n      history.replaceState({}, '', url);\n    },\n\n    _resetCount: function () {\n      this.resultSet = null;\n      this.totalResults = null;\n    },\n\n    updateSourceMenu: function () {\n      if (!this.$sourceActionsContainer.length) {\n        return;\n      }\n\n      if (this.$sourceActionsBtn) {\n        this.$sourceActionsBtn.data('trigger').destroy();\n        this.$sourceActionsContainer.empty();\n        $('#source-actions-menu').remove();\n        this.$sourceActionsBtn = null;\n      }\n\n      const actions = this.getSourceActions();\n      if (!actions.length) {\n        return;\n      }\n\n      const groupedActions = [\n        actions.filter((a) => !a.destructive && !a.administrative),\n        actions.filter((a) => a.destructive && !a.administrative),\n        actions.filter((a) => a.administrative),\n      ].filter((group) => group.length);\n\n      this.$sourceActionsBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn settings icon menubtn',\n        title: Craft.t('app', 'Source settings'),\n        'aria-label': Craft.t('app', 'Source settings'),\n        'aria-controls': 'source-actions-menu',\n      }).appendTo(this.$sourceActionsContainer);\n\n      const $menu = $('<div/>', {\n        id: 'source-actions-menu',\n        class: 'menu menu--disclosure',\n      }).appendTo(this.$sourceActionsContainer);\n\n      groupedActions.forEach((group, index) => {\n        if (index !== 0) {\n          $('<hr/>').appendTo($menu);\n        }\n\n        this._buildActionList(group).appendTo($menu);\n      });\n\n      this.$sourceActionsBtn.disclosureMenu();\n    },\n\n    _buildActionList: function (actions) {\n      const $ul = $('<ul/>');\n\n      actions.forEach((action) => {\n        const $button = $('<button/>', {\n          type: 'button',\n          class: 'menu-option',\n          text: action.label,\n        }).on('click', () => {\n          this.$sourceActionsBtn.data('trigger').hide();\n          if (action.onSelect) {\n            action.onSelect();\n          }\n        });\n\n        if (action.destructive) {\n          $button.addClass('error');\n        }\n\n        $('<li/>').append($button).appendTo($ul);\n      });\n\n      return $ul;\n    },\n\n    getSourceActions: function () {\n      let actions = [];\n\n      if (Craft.userIsAdmin && Craft.allowAdminChanges) {\n        actions.push({\n          label: Craft.t('app', 'Customize sources'),\n          administrative: true,\n          onSelect: () => {\n            this.createCustomizeSourcesModal();\n          },\n        });\n      }\n\n      return actions;\n    },\n\n    updateViewMenu: function () {\n      if (\n        !this.activeViewMenu ||\n        this.activeViewMenu !== this.viewMenus[this.rootSourceKey]\n      ) {\n        if (this.activeViewMenu) {\n          this.activeViewMenu.hideTrigger();\n        }\n        if (!this.viewMenus[this.rootSourceKey]) {\n          this.viewMenus[this.rootSourceKey] = new ViewMenu(\n            this,\n            this.$rootSource\n          );\n        }\n        this.activeViewMenu = this.viewMenus[this.rootSourceKey];\n        this.activeViewMenu.showTrigger();\n      }\n    },\n\n    /**\n     * Returns the data that should be passed to the elementIndex/getElements controller action\n     * when loading elements.\n     */\n    getViewParams: function () {\n      var criteria = {\n        siteId: this.siteId,\n        search: this.searchText,\n        offset: this.settings.batchSize * (this.page - 1),\n        limit: this.settings.batchSize,\n      };\n\n      // Only set drafts/draftOf/trashed params when needed, so we don't potentially override a source's criteria\n      if (\n        this.settings.canHaveDrafts &&\n        (this.drafts || (this.settings.context === 'index' && !this.status))\n      ) {\n        criteria.drafts = this.drafts || null;\n        criteria.savedDraftsOnly = true;\n        if (!this.drafts) {\n          criteria.draftOf = false;\n        }\n      }\n      if (this.trashed) {\n        criteria.trashed = true;\n      }\n\n      if (!Garnish.hasAttr(this.$source, 'data-override-status')) {\n        criteria.status = this.status;\n      }\n\n      $.extend(criteria, this.settings.criteria);\n\n      var params = {\n        context: this.settings.context,\n        elementType: this.elementType,\n        source: this.instanceState.selectedSource,\n        condition: this.settings.condition,\n        criteria: criteria,\n        disabledElementIds: this.settings.disabledElementIds,\n        viewState: $.extend({}, this.getSelectedSourceState()),\n        paginated: this._isViewPaginated() ? 1 : 0,\n      };\n\n      // Possible that the order/sort isn't entirely accurate if we're sorting by Score\n      const [sortAttribute, sortDirection] =\n        this.getSortAttributeAndDirection();\n      params.viewState.order = sortAttribute;\n      params.viewState.sort = sortDirection;\n\n      if (sortAttribute === 'structure') {\n        if (typeof this.instanceState.collapsedElementIds === 'undefined') {\n          this.instanceState.collapsedElementIds = [];\n        }\n        params.collapsedElementIds = this.instanceState.collapsedElementIds;\n      }\n\n      if (\n        this.filterHuds[this.siteId] &&\n        this.filterHuds[this.siteId][this.sourceKey] &&\n        this.filterHuds[this.siteId][this.sourceKey].serialized\n      ) {\n        params.filters =\n          this.filterHuds[this.siteId][this.sourceKey].serialized;\n      }\n\n      // Give plugins a chance to hook in here\n      this.trigger('registerViewParams', {\n        params: params,\n      });\n\n      return params;\n    },\n\n    updateElements: function (preservePagination, pageChanged) {\n      // Ignore if we're not fully initialized yet\n      if (!this.initialized) {\n        return;\n      }\n\n      // Cancel any ongoing requests\n      this._cancelRequests();\n\n      this.setIndexBusy();\n\n      // Kill the old view class\n      if (this.view) {\n        this.view.destroy();\n        delete this.view;\n      }\n\n      if (preservePagination !== true) {\n        this.setPage(1);\n        this._resetCount();\n      }\n\n      var params = this.getViewParams();\n\n      Craft.sendActionRequest('POST', this.settings.updateElementsAction, {\n        data: params,\n        cancelToken: this._createCancelToken(),\n      })\n        .then((response) => {\n          this.setIndexAvailable();\n          (this.settings.context === 'index'\n            ? Garnish.$scrollContainer\n            : this.$main\n          ).scrollTop(0);\n          this._updateView(params, response.data);\n\n          if (pageChanged) {\n            const $elementContainer = this.view.getElementContainer();\n            Garnish.firstFocusableElement($elementContainer).trigger('focus');\n          }\n        })\n        .catch((e) => {\n          this.setIndexAvailable();\n          if (!this._ignoreFailedRequest) {\n            Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n          }\n        });\n    },\n\n    updateElementsIfSearchTextChanged: function () {\n      if (\n        this.searchText !==\n        (this.searchText = this.searching ? this.$search.val() : null)\n      ) {\n        this.updateElements();\n      }\n    },\n\n    showActionTriggers: function () {\n      // Ignore if they're already shown\n      if (this.showingActionTriggers) {\n        return;\n      }\n\n      if (!this._$triggers) {\n        this._createTriggers();\n      } else {\n        this._$triggers.appendTo(this.$actionsContainer);\n      }\n\n      this.showingActionTriggers = true;\n    },\n\n    submitAction: function (action, actionParams) {\n      // Make sure something's selected\n      var selectedElementIds = this.view.getSelectedElementIds(),\n        totalSelected = selectedElementIds.length;\n\n      if (totalSelected === 0) {\n        return;\n      }\n\n      if (typeof action === 'string') {\n        action = this._findAction(action);\n      }\n\n      if (action.confirm && !confirm(action.confirm)) {\n        return;\n      }\n\n      // Cancel any ongoing requests\n      this._cancelRequests();\n\n      // Get ready to submit\n      var viewParams = this.getViewParams();\n\n      actionParams = actionParams ? Craft.expandPostArray(actionParams) : {};\n      var params = $.extend(viewParams, action.settings || {}, actionParams, {\n        elementAction: action.type,\n        elementIds: selectedElementIds,\n      });\n\n      // Do it\n      this.setIndexBusy();\n      this._autoSelectElements = selectedElementIds;\n\n      if (action.download) {\n        if (Craft.csrfTokenName) {\n          params[Craft.csrfTokenName] = Craft.csrfTokenValue;\n        }\n        Craft.downloadFromUrl(\n          'POST',\n          Craft.getActionUrl(this.settings.submitActionsAction),\n          params\n        )\n          .then((response) => {\n            this.setIndexAvailable();\n          })\n          .catch((e) => {\n            this.setIndexAvailable();\n          });\n      } else {\n        Craft.sendActionRequest('POST', this.settings.submitActionsAction, {\n          data: params,\n          cancelToken: this._createCancelToken(),\n        })\n          .then((response) => {\n            // Update the count text too\n            this._resetCount();\n            this._updateView(viewParams, response.data);\n\n            if (typeof response.data.badgeCounts !== 'undefined') {\n              this._updateBadgeCounts(response.data.badgeCounts);\n            }\n\n            if (response.data.message) {\n              Craft.cp.displaySuccess(response.data.message);\n            }\n\n            this.afterAction(action, params);\n          })\n          .catch(({response}) => {\n            Craft.cp.displayError(response.data.message);\n          })\n          .finally(() => {\n            this.setIndexAvailable();\n          });\n      }\n    },\n\n    _findAction: function (actionClass) {\n      for (var i = 0; i < this.actions.length; i++) {\n        if (this.actions[i].type === actionClass) {\n          return this.actions[i];\n        }\n      }\n      throw `Invalid element action: ${actionClass}`;\n    },\n\n    afterAction: function (action, params) {\n      // There may be a new background job that needs to be run\n      Craft.cp.runQueue();\n\n      this.onAfterAction(action, params);\n    },\n\n    hideActionTriggers: function () {\n      // Ignore if there aren't any\n      if (!this.showingActionTriggers) {\n        return;\n      }\n\n      this._$triggers.detach();\n\n      this.showingActionTriggers = false;\n    },\n\n    updateActionTriggers: function () {\n      // Do we have an action UI to update?\n      if (this.actions) {\n        var totalSelected = this.view.getSelectedElements().length;\n\n        if (totalSelected !== 0) {\n          if (totalSelected === this.view.getEnabledElements().length) {\n            this.$selectAllCheckbox.removeClass('indeterminate');\n            this.$selectAllCheckbox.addClass('checked');\n            this.$selectAllCheckbox.attr('aria-checked', 'true');\n          } else {\n            this.$selectAllCheckbox.addClass('indeterminate');\n            this.$selectAllCheckbox.removeClass('checked');\n            this.$selectAllCheckbox.attr('aria-checked', 'mixed');\n          }\n\n          this.showActionTriggers();\n        } else {\n          this.$selectAllCheckbox.removeClass('indeterminate checked');\n          this.$selectAllCheckbox.attr('aria-checked', 'false');\n          this.hideActionTriggers();\n        }\n      }\n    },\n\n    getSelectedElements: function () {\n      return this.view ? this.view.getSelectedElements() : $();\n    },\n\n    getSelectedElementIds: function () {\n      return this.view ? this.view.getSelectedElementIds() : [];\n    },\n\n    setStatus: function (status) {\n      // Find the option (and make sure it actually exists)\n      var $option = this.statusMenu.$options.filter(\n        'a[data-status=\"' + status + '\"]:first'\n      );\n\n      if ($option.length) {\n        this.statusMenu.selectOption($option[0]);\n      }\n    },\n\n    /**\n     * Returns the selected sort attribute for a source\n     * @param {jQuery} [$source]\n     * @returns {string}\n     */\n    getSelectedSortAttribute: function ($source) {\n      $source = $source || this.$source;\n      if ($source) {\n        const attribute = this.getSourceState($source.data('key'), 'order');\n\n        // Make sure it's valid\n        if (this.getSortOption(attribute, $source)) {\n          return attribute;\n        }\n      }\n\n      return this.getDefaultSort()[0];\n    },\n\n    /**\n     * Returns the selected sort direction for a source\n     * @param {jQuery} [$source]\n     * @returns {string}\n     */\n    getSelectedSortDirection: function ($source) {\n      $source = $source || this.$source;\n      if ($source) {\n        const direction = this.getSourceState($source.data('key'), 'sort');\n\n        // Make sure it's valid\n        if (['asc', 'desc'].includes(direction)) {\n          return direction;\n        }\n      }\n\n      return this.getDefaultSort()[1];\n    },\n\n    /**\n     * @deprecated in 4.3.0. Use setSelectedSortAttribute() instead.\n     */\n    setSortAttribute: function (attr) {\n      this.setSelectedSortAttribute(attr);\n    },\n\n    /**\n     * Sets the selected sort attribute and direction.\n     *\n     * If direction isn’t provided, the attribute’s default direction will be used.\n     *\n     * @param {string} attr\n     * @param {string} [dir]\n     */\n    setSelectedSortAttribute: function (attr, dir) {\n      // If score, keep track of that separately\n      if (attr === 'score') {\n        this.sortByScore = true;\n        if (this.activeViewMenu) {\n          this.activeViewMenu.updateSortField();\n        }\n        return;\n      }\n\n      this.sortByScore = false;\n\n      // Make sure it's valid\n      const sortOption = this.getSortOption(attr);\n      if (!sortOption) {\n        console.warn(`Invalid sort option: ${attr}`);\n        return;\n      }\n\n      if (attr === 'structure') {\n        dir = 'asc';\n      } else {\n        dir = dir || sortOption.defaultDir;\n      }\n\n      const history = [];\n\n      // Remember the previous choices\n      const attributes = [attr];\n\n      // Only include the last attribute if it changed\n      const lastAttr = this.getSelectedSourceState('order');\n      if (lastAttr && lastAttr !== attr) {\n        history.push([lastAttr, this.getSelectedSourceState('sort')]);\n        attributes.push(lastAttr);\n      }\n\n      const oldHistory = this.getSelectedSourceState('orderHistory', []);\n      for (let i = 0; i < oldHistory.length; i++) {\n        const [a] = oldHistory[i];\n        if (a && !attributes.includes(a)) {\n          history.push(oldHistory[i]);\n          attributes.push(a);\n        } else {\n          break;\n        }\n      }\n\n      this.setSelecetedSourceState({\n        order: attr,\n        sort: dir,\n        orderHistory: history,\n      });\n\n      // Update the view menu\n      if (this.activeViewMenu) {\n        this.activeViewMenu.updateSortField();\n      }\n\n      // Update the query string\n      Craft.setQueryParam('sort', `${attr}-${dir}`);\n    },\n\n    /**\n     * @deprecated in 4.3.0. Use setSelectedSortAttribute() or setSelectedSortDirection() instead.\n     */\n    setSortDirection: function (dir) {\n      this.setSelectedSortDirection(dir);\n    },\n\n    /**\n     * Sets the selected sort direction, maintaining the current sort attribute.\n     * @param {string} dir\n     */\n    setSelectedSortDirection: function (dir) {\n      this.setSelectedSortAttribute(this.getSelectedSortAttribute(), dir);\n    },\n\n    /**\n     * Returns whether sorting by a structure is permitted for the current state.\n     * @returns {boolean}\n     */\n    canSortByStructure: function () {\n      return (\n        !this.trashed && !this.drafts && !this.searching && !this.sortByScore\n      );\n    },\n\n    /**\n     * Returns the actual sort attribute, which may be different from what's selected.\n     * @returns {string[]}\n     */\n    getSortAttributeAndDirection: function () {\n      if (this.searching && this.sortByScore) {\n        return ['score', 'desc'];\n      }\n\n      let attribute = this.getSelectedSortAttribute();\n      let direction = this.getSelectedSortDirection();\n\n      if (attribute === 'structure') {\n        if (!this.canSortByStructure()) {\n          const alt = this.getSortOptions().find((a) => a.attr !== 'structure');\n          attribute = alt.attr;\n          direction = alt.defaultDir;\n        } else {\n          direction = 'asc';\n        }\n      }\n\n      return [attribute, direction];\n    },\n\n    getSortLabel: function (attr) {\n      const sortOption = this.getSortOption(attr);\n      return sortOption ? sortOption.label : null;\n    },\n\n    getSelectedViewMode: function () {\n      return this.getSelectedSourceState('mode') || 'table';\n    },\n\n    /**\n     * Returns the nesting level for a given source, where 1 = the root level\n     * @param {jQuery} $source\n     * @returns {number}\n     */\n    getSourceLevel: function ($source) {\n      return $source.parentsUntil('nav', 'ul.nested').length + 1;\n    },\n\n    /**\n     * Returns a source’s parent, or null if it’s the root source\n     * @param {jQuery} $source\n     * @returns {?jQuery}\n     */\n    getParentSource: function ($source) {\n      const $parent = $source.parent().parent().siblings('a');\n      return $parent.length ? $parent : null;\n    },\n\n    /**\n     * Returns the root level source for a given source.\n     * @param {jQuery} $source\n     * @returns {jQuery}\n     */\n    getRootSource: function ($source) {\n      let $parent;\n      while (($parent = this.getParentSource($source))) {\n        $source = $parent;\n      }\n      return $source;\n    },\n\n    getSourceByKey: function (key) {\n      return this.sourcesByKey[key] || null;\n    },\n\n    selectSource: function (source) {\n      const $source = $(source);\n\n      // return false if there truly are no sources;\n      // don't attempt to check only default/visible sources\n      if (!this.sourcesByKey || !Object.keys(this.sourcesByKey).length) {\n        return false;\n      }\n\n      if (\n        this.$source &&\n        this.$source[0] &&\n        this.$source[0] === $source[0] &&\n        $source.data('key') === this.sourceKey\n      ) {\n        return false;\n      }\n\n      // Hide action triggers if they're currently being shown\n      this.hideActionTriggers();\n\n      this.$source = $source;\n      this.$rootSource = this.getRootSource($source);\n      this.sourceKey = $source.data('key');\n      this.rootSourceKey = this.$rootSource.data('key');\n      this.setInstanceState('selectedSource', this.sourceKey);\n      this.sourceSelect.selectItem($source);\n\n      Craft.cp.updateContentHeading();\n\n      if (this.searching) {\n        // Clear the search value without causing it to update elements\n        this.searchText = null;\n        this.$search.val('');\n        this.stopSearching();\n      }\n\n      // Status menu\n      // ----------------------------------------------------------------------\n\n      if (this.$statusMenuBtn.length) {\n        if (Garnish.hasAttr(this.$source, 'data-override-status')) {\n          this.$statusMenuContainer.addClass('hidden');\n        } else {\n          this.$statusMenuContainer.removeClass('hidden');\n        }\n\n        if (this.trashed) {\n          // Swap to the initial status\n          var $firstOption = this.statusMenu.$options.first();\n          this.setStatus($firstOption.data('status'));\n        }\n      }\n\n      // View mode buttons\n      // ----------------------------------------------------------------------\n\n      // Clear out any previous view mode data\n      if (this.$viewModeBtnContainer) {\n        this.$viewModeBtnContainer.remove();\n      }\n\n      this.viewModeBtns = {};\n      this.viewMode = null;\n\n      // Get the new list of view modes\n      this.sourceViewModes = this.getViewModesForSource();\n\n      // Create the buttons if there's more than one mode available to this source\n      if (this.sourceViewModes.length > 1) {\n        this.$viewModeBtnContainer = $(\n          '<section class=\"btngroup btngroup--exclusive\"/>'\n        ).attr('aria-label', Craft.t('app', 'View'));\n\n        if (this.activeViewMenu) {\n          this.$viewModeBtnContainer.insertBefore(this.activeViewMenu.$trigger);\n        } else {\n          this.$viewModeBtnContainer.appendTo(this.$toolbar);\n        }\n\n        for (var i = 0; i < this.sourceViewModes.length; i++) {\n          let sourceViewMode = this.sourceViewModes[i];\n\n          let $viewModeBtn = $('<button/>', {\n            type: 'button',\n            class:\n              'btn' +\n              (typeof sourceViewMode.className !== 'undefined'\n                ? ` ${sourceViewMode.className}`\n                : ''),\n            'data-view': sourceViewMode.mode,\n            'data-icon': sourceViewMode.icon,\n            'aria-label': sourceViewMode.title,\n            'aria-pressed': 'false',\n            title: sourceViewMode.title,\n          }).appendTo(this.$viewModeBtnContainer);\n\n          this.viewModeBtns[sourceViewMode.mode] = $viewModeBtn;\n\n          this.addListener(\n            $viewModeBtn,\n            'click',\n            {mode: sourceViewMode.mode},\n            function (ev) {\n              this.selectViewMode(ev.data.mode);\n              this.updateElements();\n            }\n          );\n        }\n      }\n\n      // Figure out which mode we should start with\n      var viewMode = this.getSelectedViewMode();\n\n      if (!viewMode || !this.doesSourceHaveViewMode(viewMode)) {\n        // Try to keep using the current view mode\n        if (this.viewMode && this.doesSourceHaveViewMode(this.viewMode)) {\n          viewMode = this.viewMode;\n        }\n        // Just use the first one\n        else {\n          viewMode = this.sourceViewModes[0].mode;\n        }\n      }\n\n      this.selectViewMode(viewMode);\n\n      this.updateSourceMenu();\n      this.updateViewMenu();\n      this.updateFilterBtn();\n\n      this.onSelectSource();\n\n      if (this.settings.context === 'index') {\n        const urlParams = Craft.getQueryParams();\n        urlParams.source = this.sourceKey;\n        Craft.setUrl(Craft.getUrl(Craft.path, urlParams));\n      }\n\n      return true;\n    },\n\n    selectSourceByKey: function (key) {\n      var $source = this.getSourceByKey(key);\n\n      if ($source) {\n        return this.selectSource($source);\n      } else {\n        return false;\n      }\n    },\n\n    /**\n     * Returns the available sort attributes for a source (or the selected root source)\n     * @param {jQuery} [$source]\n     * @returns {Object[]}\n     */\n    getSortOptions: function ($source) {\n      $source = $source || this.$rootSource;\n      const sortOptions = ($source ? $source.data('sort-opts') : null) || [];\n\n      // Make sure there's at least one non-structure attribute\n      if (!sortOptions.find((a) => a.attr !== 'structure')) {\n        sortOptions.push({\n          label: Craft.t('app', 'Title'),\n          attr: 'title',\n          defaultDir: 'asc',\n        });\n      }\n\n      return sortOptions;\n    },\n\n    /**\n     * Returns info about a sort attribute.\n     * @param {string} attribute\n     * @param {jQuery} [$source]\n     * @returns {?Object}\n     */\n    getSortOption: function (attribute, $source) {\n      return (\n        this.getSortOptions($source).find((o) => o.attr === attribute) || null\n      );\n    },\n\n    /**\n     * Returns the default sort attribute and direction for a source.\n     * @param {jQuery} [$source]\n     * @returns {string[]}\n     */\n    getDefaultSort: function ($source) {\n      $source = $source || this.$rootSource;\n      if ($source) {\n        let defaultSort = $source.data('default-sort');\n        if (defaultSort) {\n          if (typeof defaultSort === 'string') {\n            defaultSort = [defaultSort];\n          }\n\n          // Make sure it's valid\n          const sortOption = this.getSortOption(defaultSort[0], $source);\n          if (sortOption) {\n            // Fill in the default direction if it's not specified\n            if (!defaultSort[1]) {\n              defaultSort[1] = sortOption.defaultDir;\n            }\n\n            return defaultSort;\n          }\n        }\n      }\n\n      // Default to the first sort option\n      const sortOptions = this.getSortOptions($source);\n      return [sortOptions[0].attr, sortOptions[0].defaultDir];\n    },\n\n    /**\n     * Returns the available table columns for a source (or the selected root source)\n     * @param {jQuery} [$source]\n     * @returns {Object[]}\n     */\n    getTableColumnOptions: function ($source) {\n      $source = $source || this.$rootSource;\n      return ($source ? $source.data('table-col-opts') : null) || [];\n    },\n\n    /**\n     * Returns info about a table column.\n     * @param {string} attribute\n     * @param {jQuery} [$source]\n     * @returns {?Object}\n     */\n    getTableColumnOption: function (attribute, $source) {\n      return (\n        this.getTableColumnOptions($source).find((o) => o.attr === attribute) ||\n        null\n      );\n    },\n\n    /**\n     * Returns the default table columns for a source (or the selected root source)\n     * @param {jQuery} [$source]\n     * @returns {string[]}\n     */\n    getDefaultTableColumns: function ($source) {\n      $source = $source || this.$rootSource;\n      return ($source ? $source.data('default-table-cols') : null) || [];\n    },\n\n    /**\n     * Returns the selected sort attribute for a source\n     * @param {jQuery} [$source]\n     * @returns {string[]}\n     */\n    getSelectedTableColumns: function ($source) {\n      $source = $source || this.$rootSource;\n      if ($source) {\n        const attributes = this.getSourceState(\n          $source.data('key'),\n          'tableColumns'\n        );\n\n        if (attributes) {\n          // Only return the valid ones\n          return attributes.filter(\n            (a) => !!this.getTableColumnOption(a, $source)\n          );\n        }\n      }\n\n      return this.getDefaultTableColumns($source);\n    },\n\n    setSelectedTableColumns: function (attributes) {\n      this.setSelecetedSourceState({\n        tableColumns: attributes,\n      });\n\n      // Update the view menu\n      if (this.activeViewMenu) {\n        this.activeViewMenu.updateTableColumnField();\n      }\n    },\n\n    getViewModesForSource: function () {\n      var viewModes = [\n        {\n          mode: 'table',\n          title: Craft.t('app', 'Display in a table'),\n          icon: 'list',\n        },\n      ];\n\n      if (this.$source && Garnish.hasAttr(this.$source, 'data-has-thumbs')) {\n        viewModes.push({\n          mode: 'thumbs',\n          title: Craft.t('app', 'Display as thumbnails'),\n          icon: 'grid',\n        });\n      }\n\n      return viewModes;\n    },\n\n    doesSourceHaveViewMode: function (viewMode) {\n      for (var i = 0; i < this.sourceViewModes.length; i++) {\n        if (this.sourceViewModes[i].mode === viewMode) {\n          return true;\n        }\n      }\n\n      return false;\n    },\n\n    selectViewMode: function (viewMode, force) {\n      // Make sure that the current source supports it\n      if (!force && !this.doesSourceHaveViewMode(viewMode)) {\n        viewMode = this.sourceViewModes[0].mode;\n      }\n\n      // Has anything changed?\n      if (viewMode === this.viewMode) {\n        return;\n      }\n\n      // Deselect the previous view mode\n      if (\n        this.viewMode &&\n        typeof this.viewModeBtns[this.viewMode] !== 'undefined'\n      ) {\n        this.viewModeBtns[this.viewMode]\n          .removeClass('active')\n          .attr('aria-pressed', 'false');\n      }\n\n      this.viewMode = viewMode;\n      this.setSelecetedSourceState('mode', this.viewMode);\n\n      if (typeof this.viewModeBtns[this.viewMode] !== 'undefined') {\n        this.viewModeBtns[this.viewMode]\n          .addClass('active')\n          .attr('aria-pressed', 'true');\n      }\n    },\n\n    createView: function (mode, settings) {\n      var viewClass = this.getViewClass(mode);\n      return new viewClass(this, this.$elements, settings);\n    },\n\n    getViewClass: function (mode) {\n      switch (mode) {\n        case 'table':\n          return Craft.TableElementIndexView;\n        case 'thumbs':\n          return Craft.ThumbsElementIndexView;\n        default:\n          throw `View mode \"${mode}\" not supported.`;\n      }\n    },\n\n    rememberDisabledElementId: function (id) {\n      var index = $.inArray(id, this.settings.disabledElementIds);\n\n      if (index === -1) {\n        this.settings.disabledElementIds.push(id);\n      }\n    },\n\n    forgetDisabledElementId: function (id) {\n      var index = $.inArray(id, this.settings.disabledElementIds);\n\n      if (index !== -1) {\n        this.settings.disabledElementIds.splice(index, 1);\n      }\n    },\n\n    enableElements: function ($elements) {\n      $elements\n        .removeClass('disabled')\n        .parents('.disabled')\n        .removeClass('disabled');\n\n      for (var i = 0; i < $elements.length; i++) {\n        var id = $($elements[i]).data('id');\n        this.forgetDisabledElementId(id);\n      }\n\n      this.onEnableElements($elements);\n    },\n\n    disableElements: function ($elements) {\n      $elements.removeClass('sel').addClass('disabled');\n\n      for (var i = 0; i < $elements.length; i++) {\n        var id = $($elements[i]).data('id');\n        this.rememberDisabledElementId(id);\n      }\n\n      this.onDisableElements($elements);\n    },\n\n    getElementById: function (id) {\n      return this.view.getElementById(id);\n    },\n\n    enableElementsById: function (ids) {\n      ids = $.makeArray(ids);\n\n      for (var i = 0; i < ids.length; i++) {\n        var id = ids[i],\n          $element = this.getElementById(id);\n\n        if ($element && $element.length) {\n          this.enableElements($element);\n        } else {\n          this.forgetDisabledElementId(id);\n        }\n      }\n    },\n\n    disableElementsById: function (ids) {\n      ids = $.makeArray(ids);\n\n      for (var i = 0; i < ids.length; i++) {\n        var id = ids[i],\n          $element = this.getElementById(id);\n\n        if ($element && $element.length) {\n          this.disableElements($element);\n        } else {\n          this.rememberDisabledElementId(id);\n        }\n      }\n    },\n\n    selectElementAfterUpdate: function (id) {\n      if (this._autoSelectElements === null) {\n        this._autoSelectElements = [];\n      }\n\n      this._autoSelectElements.push(id);\n    },\n\n    addButton: function ($button) {\n      this.getButtonContainer().append($button);\n    },\n\n    isShowingSidebar: function () {\n      if (this.showingSidebar === null) {\n        this.showingSidebar =\n          this.$sidebar.length && !this.$sidebar.hasClass('hidden');\n      }\n\n      return this.showingSidebar;\n    },\n\n    getButtonContainer: function () {\n      // Is there a predesignated place where buttons should go?\n      if (this.settings.buttonContainer) {\n        return $(this.settings.buttonContainer);\n      } else {\n        var $container = $('#action-buttons');\n\n        if (!$container.length) {\n          $container = $('<div id=\"action-buttons\"/>').appendTo($('#header'));\n        }\n\n        return $container;\n      }\n    },\n\n    setIndexBusy: function () {\n      this.$elements.addClass('busy');\n      this.$updateSpinner.appendTo(this.$elements);\n      this.isIndexBusy = true;\n    },\n\n    setIndexAvailable: function () {\n      this.$elements.removeClass('busy');\n      this.$updateSpinner.remove();\n      this.isIndexBusy = false;\n    },\n\n    createCustomizeSourcesModal: function () {\n      // Recreate it each time\n      var modal = new Craft.CustomizeSourcesModal(this, {\n        onHide: function () {\n          modal.destroy();\n        },\n      });\n\n      return modal;\n    },\n\n    disable: function () {\n      if (this.sourceSelect) {\n        this.sourceSelect.disable();\n      }\n\n      if (this.view) {\n        this.view.disable();\n      }\n\n      this.base();\n    },\n\n    enable: function () {\n      if (this.sourceSelect) {\n        this.sourceSelect.enable();\n      }\n\n      if (this.view) {\n        this.view.enable();\n      }\n\n      this.base();\n    },\n\n    onAfterInit: function () {\n      this.settings.onAfterInit();\n      this.trigger('afterInit');\n    },\n\n    onSelectSource: function () {\n      this.settings.onSelectSource(this.sourceKey);\n      this.trigger('selectSource', {sourceKey: this.sourceKey});\n    },\n\n    onSelectSite: function () {\n      this.settings.onSelectSite(this.siteId);\n      this.trigger('selectSite', {siteId: this.siteId});\n    },\n\n    onUpdateElements: function () {\n      this.settings.onUpdateElements();\n      this.trigger('updateElements');\n    },\n\n    onSelectionChange: function () {\n      this.settings.onSelectionChange();\n      this.trigger('selectionChange');\n    },\n\n    onEnableElements: function ($elements) {\n      this.settings.onEnableElements($elements);\n      this.trigger('enableElements', {elements: $elements});\n    },\n\n    onDisableElements: function ($elements) {\n      this.settings.onDisableElements($elements);\n      this.trigger('disableElements', {elements: $elements});\n    },\n\n    onAfterAction: function (action, params) {\n      this.settings.onAfterAction(action, params);\n      this.trigger('afterAction', {action: action, params: params});\n    },\n\n    // UI state handlers\n    // -------------------------------------------------------------------------\n\n    _handleSourceSelectionChange: function () {\n      // If the selected source was just removed (maybe because its parent was collapsed),\n      // there won't be a selected source\n      if (!this.sourceSelect.totalSelected) {\n        this.sourceSelect.selectItem(this.$visibleSources.first());\n        return;\n      }\n\n      if (this.selectSource(this.sourceSelect.$selectedItems)) {\n        this.updateElements();\n      }\n    },\n\n    _handleActionTriggerSubmit: function (ev) {\n      ev.preventDefault();\n\n      var $form = $(ev.currentTarget);\n\n      // Make sure Craft.ElementActionTrigger isn't overriding this\n      if ($form.hasClass('disabled') || $form.data('custom-handler')) {\n        return;\n      }\n\n      this.submitAction($form.data('action'), Garnish.getPostData($form));\n    },\n\n    _handleMenuActionTriggerSubmit: function (ev) {\n      var $option = $(ev.option);\n\n      // Make sure Craft.ElementActionTrigger isn't overriding this\n      if ($option.hasClass('disabled') || $option.data('custom-handler')) {\n        return;\n      }\n\n      this.submitAction($option.data('action'));\n    },\n\n    _handleStatusChange: function (ev) {\n      this.statusMenu.$options.removeClass('sel');\n      var $option = $(ev.selectedOption).addClass('sel');\n      this.$statusMenuBtn.html($option.html());\n\n      this.trashed = false;\n      this.drafts = false;\n      this.status = null;\n      let queryParam = null;\n\n      if (Garnish.hasAttr($option, 'data-trashed')) {\n        this.trashed = true;\n        queryParam = 'trashed';\n      } else if (Garnish.hasAttr($option, 'data-drafts')) {\n        this.drafts = true;\n        queryParam = 'drafts';\n      } else {\n        this.status = queryParam = $option.data('status') || null;\n      }\n\n      if (this.activeViewMenu) {\n        this.activeViewMenu.updateSortField();\n      }\n\n      Craft.setQueryParam('status', queryParam);\n      this.updateElements();\n    },\n\n    _handleSiteChange: function (ev) {\n      this.siteMenu.$options.removeClass('sel');\n      var $option = $(ev.selectedOption).addClass('sel');\n      this.$siteMenuBtn.html($option.html());\n      this._setSite($option.data('site-id'));\n      this.onSelectSite();\n    },\n\n    _setSite: function (siteId) {\n      let firstSite = this.siteId === null;\n      this.siteId = siteId;\n\n      this.updateSourceVisibility();\n\n      if (\n        this.initialized &&\n        !firstSite &&\n        (!this.$source || !this.$source.length) &&\n        this.$visibleSources.length\n      ) {\n        this.selectSource(this.$visibleSources[0]);\n      }\n\n      // Hide any empty-nester headings\n      var $headings = this.getSourceContainer().children('.heading');\n      var $heading;\n\n      for (let i = 0; i < $headings.length; i++) {\n        $heading = $headings.eq(i);\n        if ($heading.has('> ul > li:not(.hidden)').length !== 0) {\n          $heading.removeClass('hidden');\n        } else {\n          $heading.addClass('hidden');\n        }\n      }\n\n      if (this.initialized) {\n        if (this.settings.context === 'index') {\n          // Remember this site for later\n          Craft.cp.setSiteId(siteId);\n        }\n\n        // Update the elements\n        this.updateElements();\n        this.updateFilterBtn();\n      }\n    },\n\n    updateSourceVisibility: function () {\n      this.$visibleSources = $();\n\n      for (let i = 0; i < this.$sources.length; i++) {\n        const $source = this.$sources.eq(i);\n\n        if (\n          !Garnish.hasAttr($source, 'data-disabled') &&\n          (typeof $source.data('sites') === 'undefined' ||\n            $source\n              .data('sites')\n              .toString()\n              .split(',')\n              .indexOf(this.siteId.toString()) !== -1)\n        ) {\n          $source.parent().removeClass('hidden');\n          this.$visibleSources = this.$visibleSources.add($source);\n        } else {\n          $source.parent().addClass('hidden');\n\n          // Is this the currently selected source?\n          if (this.$source && this.$source.get(0) === $source.get(0)) {\n            this.$source = null;\n            this.$rootSource = null;\n            this.sourceKey = null;\n            this.rootSourceKey = null;\n          }\n        }\n      }\n    },\n\n    _handleSelectionChange: function () {\n      this.updateActionTriggers();\n      this.onSelectionChange();\n    },\n\n    _handleSourceDblClick: function (ev) {\n      this._toggleSource($(ev.currentTarget));\n      ev.stopPropagation();\n    },\n\n    _handleSourceToggleClick: function (ev) {\n      this._toggleSource($(ev.currentTarget).prev('a'));\n      ev.stopPropagation();\n    },\n\n    // Source managemnet\n    // -------------------------------------------------------------------------\n\n    _getSourcesInList: function ($list, topLevel) {\n      let $sources = $list.find('> li:not(.heading) > a');\n      if (topLevel) {\n        $sources = $sources.add($list.find('> li.heading > ul > li > a'));\n      }\n      return $sources;\n    },\n\n    _getChildSources: function ($source) {\n      var $list = $source.siblings('ul');\n      return this._getSourcesInList($list);\n    },\n\n    _getSourceToggle: function ($source) {\n      return $source.siblings('.toggle');\n    },\n\n    _toggleSource: function ($source) {\n      if ($source.parent('li').hasClass('expanded')) {\n        this._collapseSource($source);\n      } else {\n        this._expandSource($source);\n      }\n    },\n\n    _expandSource: function ($source) {\n      $source.next('.toggle').attr({\n        'aria-expanded': 'true',\n        'aria-label': Craft.t('app', 'Hide nested sources'),\n      });\n      $source.parent('li').addClass('expanded');\n\n      var $childSources = this._getChildSources($source);\n      for (let i = 0; i < $childSources.length; i++) {\n        this.initSource($($childSources[i]));\n        if (this.$visibleSources) {\n          this.$visibleSources = this.$visibleSources.add($childSources[i]);\n        }\n      }\n\n      var key = $source.data('key');\n      if (this.instanceState.expandedSources.indexOf(key) === -1) {\n        this.instanceState.expandedSources.push(key);\n        this.storeInstanceState();\n      }\n    },\n\n    _collapseSource: function ($source) {\n      $source.next('.toggle').attr({\n        'aria-expanded': 'false',\n        'aria-label': Craft.t('app', 'Show nested sources'),\n      });\n      $source.parent('li').removeClass('expanded');\n\n      var $childSources = this._getChildSources($source);\n      for (let i = 0; i < $childSources.length; i++) {\n        this.deinitSource($($childSources[i]));\n        this.$visibleSources = this.$visibleSources.not($childSources[i]);\n      }\n\n      var i = this.instanceState.expandedSources.indexOf($source.data('key'));\n      if (i !== -1) {\n        this.instanceState.expandedSources.splice(i, 1);\n        this.storeInstanceState();\n      }\n    },\n\n    // View\n    // -------------------------------------------------------------------------\n\n    _isViewPaginated: function () {\n      return (\n        this.settings.context === 'index' &&\n        this.getSortAttributeAndDirection()[0] !== 'structure'\n      );\n    },\n\n    _updateView: function (params, response) {\n      // Cleanup\n      // -------------------------------------------------------------\n\n      // Get rid of the old action triggers regardless of whether the new batch has actions or not\n      if (this.actions) {\n        this.hideActionTriggers();\n        this.actions =\n          this.actionsHeadHtml =\n          this.actionsBodyHtml =\n          this._$triggers =\n            null;\n      }\n\n      // Capture the focused element, in case it's about to get removed from the DOM\n      const activeElement = document.activeElement;\n\n      // Update the count text\n      // -------------------------------------------------------------\n\n      if (this.$countContainer.length) {\n        this.$countSpinner.removeClass('hidden');\n        this.$countContainer.html('');\n\n        this._countResults()\n          .then((total) => {\n            this.$countSpinner.addClass('hidden');\n\n            let itemLabel = Craft.elementTypeNames[this.elementType]\n              ? Craft.elementTypeNames[this.elementType][2]\n              : this.settings.elementTypeName.toLowerCase();\n            let itemsLabel = Craft.elementTypeNames[this.elementType]\n              ? Craft.elementTypeNames[this.elementType][3]\n              : this.settings.elementTypePluralName.toLowerCase();\n\n            if (!this._isViewPaginated()) {\n              let countLabel = Craft.t(\n                'app',\n                '{total, number} {total, plural, =1{{item}} other{{items}}}',\n                {\n                  total: total,\n                  item: itemLabel,\n                  items: itemsLabel,\n                }\n              );\n              this.$countContainer.text(countLabel);\n            } else {\n              let first = Math.min(\n                this.settings.batchSize * (this.page - 1) + 1,\n                total\n              );\n              let last = Math.min(first + (this.settings.batchSize - 1), total);\n              let countLabel = Craft.t(\n                'app',\n                '{first, number}-{last, number} of {total, number} {total, plural, =1{{item}} other{{items}}}',\n                {\n                  first: first,\n                  last: last,\n                  total: total,\n                  item: itemLabel,\n                  items: itemsLabel,\n                }\n              );\n\n              let $paginationContainer = $(\n                '<div class=\"flex pagination\"/>'\n              ).appendTo(this.$countContainer);\n              let totalPages = Math.max(\n                Math.ceil(total / this.settings.batchSize),\n                1\n              );\n\n              const $paginationNav = $('<nav/>', {\n                class: 'flex',\n                'aria-label': Craft.t('app', '{element} pagination', {\n                  element: itemLabel,\n                }),\n              }).appendTo($paginationContainer);\n\n              let $prevBtn = $('<button/>', {\n                role: 'button',\n                class:\n                  'page-link prev-page' + (this.page > 1 ? '' : ' disabled'),\n                disabled: this.page === 1,\n                title: Craft.t('app', 'Previous Page'),\n              }).appendTo($paginationNav);\n              let $nextBtn = $('<button/>', {\n                role: 'button',\n                class:\n                  'page-link next-page' +\n                  (this.page < totalPages ? '' : ' disabled'),\n                disabled: this.page === totalPages,\n                title: Craft.t('app', 'Next Page'),\n              }).appendTo($paginationNav);\n\n              $('<div/>', {\n                class: 'page-info',\n                text: countLabel,\n              }).appendTo($paginationContainer);\n\n              if (this.page > 1) {\n                this.addListener($prevBtn, 'click', function () {\n                  this.removeListener($prevBtn, 'click');\n                  this.removeListener($nextBtn, 'click');\n                  this.setPage(this.page - 1);\n                  this.updateElements(true, true);\n                });\n              }\n\n              if (this.page < totalPages) {\n                this.addListener($nextBtn, 'click', function () {\n                  this.removeListener($prevBtn, 'click');\n                  this.removeListener($nextBtn, 'click');\n                  this.setPage(this.page + 1);\n                  this.updateElements(true, true);\n                });\n              }\n            }\n          })\n          .catch(() => {\n            this.$countSpinner.addClass('hidden');\n          });\n      }\n\n      // Update the view with the new container + elements HTML\n      // -------------------------------------------------------------\n\n      this.$elements.html(response.html);\n      Craft.appendHeadHtml(response.headHtml);\n      Craft.appendBodyHtml(response.bodyHtml);\n\n      // Batch actions setup\n      // -------------------------------------------------------------\n\n      this.$selectAllContainer = this.$elements.find(\n        '.selectallcontainer:first'\n      );\n\n      if (response.actions && response.actions.length) {\n        if (this.$selectAllContainer.length) {\n          this.actions = response.actions;\n          this.actionsHeadHtml = response.actionsHeadHtml;\n          this.actionsBodyHtml = response.actionsBodyHtml;\n\n          // Create the select all checkbox\n          this.$selectAllCheckbox = $('<div class=\"checkbox\"/>')\n            .prependTo(this.$selectAllContainer)\n            .attr({\n              role: 'checkbox',\n              tabindex: '0',\n              'aria-checked': 'false',\n              'aria-label': Craft.t('app', 'Select all'),\n            });\n\n          this.addListener(this.$selectAllCheckbox, 'click', function () {\n            if (this.view.getSelectedElements().length === 0) {\n              this.view.selectAllElements();\n            } else {\n              this.view.deselectAllElements();\n            }\n          });\n\n          this.addListener(this.$selectAllCheckbox, 'keydown', function (ev) {\n            if (ev.keyCode === Garnish.SPACE_KEY) {\n              ev.preventDefault();\n\n              $(ev.currentTarget).trigger('click');\n            }\n          });\n        }\n      } else {\n        if (!this.$selectAllContainer.siblings().length) {\n          this.$selectAllContainer.parent('.header').remove();\n        }\n        this.$selectAllContainer.remove();\n      }\n\n      // Exporters setup\n      // -------------------------------------------------------------\n\n      this.exporters = response.exporters;\n      this.exportersByType = Craft.index(this.exporters || [], (e) => e.type);\n\n      if (this.exporters && this.exporters.length) {\n        this.$exportBtn.removeClass('hidden');\n      } else {\n        this.$exportBtn.addClass('hidden');\n      }\n\n      // Create the view\n      // -------------------------------------------------------------\n\n      // Should we make the view selectable?\n      var selectable = this.actions || this.settings.selectable;\n\n      this.view = this.createView(this.getSelectedViewMode(), {\n        context: this.settings.context,\n        batchSize:\n          this.settings.context !== 'index' ||\n          this.getSortAttributeAndDirection()[0] === 'structure'\n            ? this.settings.batchSize\n            : null,\n        params: params,\n        selectable: selectable,\n        multiSelect: this.actions || this.settings.multiSelect,\n        checkboxMode: !!this.actions,\n        onSelectionChange: this._handleSelectionChange.bind(this),\n      });\n\n      // Refocus the previously-focused element\n      // -------------------------------------------------------------\n\n      if (\n        activeElement &&\n        activeElement.id &&\n        !document.body.contains(activeElement)\n      ) {\n        $(`#${activeElement.id}`).focus();\n      }\n\n      // Auto-select elements\n      // -------------------------------------------------------------\n\n      if (this._autoSelectElements) {\n        if (selectable) {\n          for (var i = 0; i < this._autoSelectElements.length; i++) {\n            this.view.selectElementById(this._autoSelectElements[i]);\n          }\n        }\n\n        this._autoSelectElements = null;\n      }\n\n      // Trigger the event\n      // -------------------------------------------------------------\n\n      this.onUpdateElements();\n    },\n\n    _updateBadgeCounts: function (badgeCounts) {\n      for (let sourceKey in badgeCounts) {\n        if (badgeCounts.hasOwnProperty(sourceKey)) {\n          const $source = this.getSourceByKey(sourceKey);\n          if ($source) {\n            let $badge = $source.children('.badge');\n            if (badgeCounts[sourceKey] !== null) {\n              if (!$badge.length) {\n                $badge = $('<span class=\"badge\"/>').appendTo($source);\n              }\n              $badge.text(badgeCounts[sourceKey]);\n            } else if ($badge) {\n              $badge.remove();\n            }\n          }\n        }\n      }\n    },\n\n    _countResults: function () {\n      return new Promise((resolve, reject) => {\n        if (this.totalResults !== null) {\n          resolve(this.totalResults);\n        } else {\n          var params = this.getViewParams();\n          delete params.criteria.offset;\n          delete params.criteria.limit;\n\n          // Make sure we've got an active result set ID\n          if (this.resultSet === null) {\n            this.resultSet = Math.floor(Math.random() * 100000000);\n          }\n          params.resultSet = this.resultSet;\n\n          Craft.sendActionRequest('POST', this.settings.countElementsAction, {\n            data: params,\n            cancelToken: this._createCancelToken(),\n          })\n            .then((response) => {\n              if (response.data.resultSet == this.resultSet) {\n                this.totalResults = response.data.count;\n                resolve(response.data.count);\n              } else {\n                reject();\n              }\n            })\n            .catch(reject);\n        }\n      });\n    },\n\n    _createTriggers: function () {\n      var triggers = [],\n        safeMenuActions = [],\n        destructiveMenuActions = [];\n\n      var i;\n\n      for (i = 0; i < this.actions.length; i++) {\n        var action = this.actions[i];\n\n        if (action.trigger) {\n          var $form = $(\n            '<form id=\"' +\n              Craft.formatInputId(action.type) +\n              '-actiontrigger\"/>'\n          )\n            .data('action', action)\n            .append(action.trigger);\n\n          this.addListener($form, 'submit', '_handleActionTriggerSubmit');\n          triggers.push($form);\n        } else {\n          if (!action.destructive) {\n            safeMenuActions.push(action);\n          } else {\n            destructiveMenuActions.push(action);\n          }\n        }\n      }\n\n      var $btn;\n\n      if (safeMenuActions.length || destructiveMenuActions.length) {\n        var $menuTrigger = $('<form/>');\n\n        $btn = $('<button/>', {\n          type: 'button',\n          class: 'btn menubtn',\n          'data-icon': 'settings',\n          title: Craft.t('app', 'Actions'),\n        }).appendTo($menuTrigger);\n\n        var $menu = $('<ul class=\"menu\"/>').appendTo($menuTrigger),\n          $safeList = this._createMenuTriggerList(safeMenuActions, false),\n          $destructiveList = this._createMenuTriggerList(\n            destructiveMenuActions,\n            true\n          );\n\n        if ($safeList) {\n          $safeList.appendTo($menu);\n        }\n\n        if ($safeList && $destructiveList) {\n          $('<hr/>').appendTo($menu);\n        }\n\n        if ($destructiveList) {\n          $destructiveList.appendTo($menu);\n        }\n\n        triggers.push($menuTrigger);\n      }\n\n      this._$triggers = $();\n\n      for (i = 0; i < triggers.length; i++) {\n        var $div = $('<div/>').append(triggers[i]);\n        this._$triggers = this._$triggers.add($div);\n      }\n\n      this._$triggers.appendTo(this.$actionsContainer);\n      Craft.appendHeadHtml(this.actionsHeadHtml);\n      Craft.appendBodyHtml(this.actionsBodyHtml);\n\n      Craft.initUiElements(this._$triggers);\n\n      if ($btn) {\n        $btn\n          .data('menubtn')\n          .on('optionSelect', this._handleMenuActionTriggerSubmit.bind(this));\n      }\n    },\n\n    _showExportHud: function () {\n      this.$exportBtn.addClass('active');\n      this.$exportBtn.attr('aria-expanded', 'true');\n\n      var $form = $('<form/>', {\n        class: 'export-form',\n      });\n\n      var typeOptions = [];\n      for (var i = 0; i < this.exporters.length; i++) {\n        typeOptions.push({\n          label: this.exporters[i].name,\n          value: this.exporters[i].type,\n        });\n      }\n      var $typeField = Craft.ui\n        .createSelectField({\n          label: Craft.t('app', 'Export Type'),\n          options: typeOptions,\n          class: 'fullwidth',\n        })\n        .appendTo($form);\n\n      var $formatField = Craft.ui\n        .createSelectField({\n          label: Craft.t('app', 'Format'),\n          options: [\n            {label: 'CSV', value: 'csv'},\n            {label: 'JSON', value: 'json'},\n            {label: 'XML', value: 'xml'},\n          ],\n          class: 'fullwidth',\n        })\n        .appendTo($form);\n\n      let $typeSelect = $typeField.find('select');\n      this.addListener($typeSelect, 'change', () => {\n        let type = $typeSelect.val();\n        if (this.exportersByType[type].formattable) {\n          $formatField.removeClass('hidden');\n        } else {\n          $formatField.addClass('hidden');\n        }\n      });\n      $typeSelect.trigger('change');\n\n      // Only show the Limit field if there aren't any selected elements\n      var selectedElementIds = this.view.getSelectedElementIds();\n\n      if (!selectedElementIds.length) {\n        var $limitField = Craft.ui\n          .createTextField({\n            label: Craft.t('app', 'Limit'),\n            placeholder: Craft.t('app', 'No limit'),\n            type: 'number',\n            min: 1,\n          })\n          .appendTo($form);\n      }\n\n      const $submitBtn = Craft.ui\n        .createSubmitButton({\n          class: 'fullwidth',\n          label: Craft.t('app', 'Export'),\n          spinner: true,\n        })\n        .appendTo($form);\n\n      var hud = new Garnish.HUD(this.$exportBtn, $form);\n\n      hud.on('hide', () => {\n        this.$exportBtn.removeClass('active');\n        this.$exportBtn.attr('aria-expanded', 'false');\n      });\n\n      var submitting = false;\n\n      this.addListener($form, 'submit', function (ev) {\n        ev.preventDefault();\n        if (submitting) {\n          return;\n        }\n\n        submitting = true;\n        $submitBtn.addClass('loading');\n\n        var params = this.getViewParams();\n        delete params.criteria.offset;\n        delete params.criteria.limit;\n        delete params.collapsedElementIds;\n\n        params.type = $typeField.find('select').val();\n        params.format = $formatField.find('select').val();\n\n        if (selectedElementIds.length) {\n          params.criteria.id = selectedElementIds;\n        } else {\n          var limit = parseInt($limitField.find('input').val());\n          if (limit && !isNaN(limit)) {\n            params.criteria.limit = limit;\n          }\n        }\n\n        if (Craft.csrfTokenValue) {\n          params[Craft.csrfTokenName] = Craft.csrfTokenValue;\n        }\n\n        Craft.downloadFromUrl(\n          'POST',\n          Craft.getActionUrl('element-indexes/export'),\n          params\n        )\n          .catch(() => {\n            if (!this._ignoreFailedRequest) {\n              Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n            }\n          })\n          .finally(() => {\n            submitting = false;\n            $submitBtn.removeClass('loading');\n          });\n      });\n    },\n\n    _createMenuTriggerList: function (actions, destructive) {\n      if (actions && actions.length) {\n        var $ul = $('<ul/>');\n\n        for (var i = 0; i < actions.length; i++) {\n          $('<li/>')\n            .append(\n              $('<a/>', {\n                id: Craft.formatInputId(actions[i].type) + '-actiontrigger',\n                class: destructive ? 'error' : null,\n                data: {\n                  action: actions[i],\n                },\n                text: actions[i].name,\n              })\n            )\n            .appendTo($ul);\n        }\n\n        return $ul;\n      }\n    },\n\n    showFilterHud: function () {\n      if (!this.filterHuds[this.siteId]) {\n        this.filterHuds[this.siteId] = {};\n      }\n      if (!this.filterHuds[this.siteId][this.sourceKey]) {\n        this.filterHuds[this.siteId][this.sourceKey] = new FilterHud(\n          this,\n          this.sourceKey,\n          this.siteId\n        );\n        this.updateFilterBtn();\n      } else {\n        this.filterHuds[this.siteId][this.sourceKey].show();\n      }\n    },\n\n    updateFilterBtn: function () {\n      this.$filterBtn.removeClass('active');\n\n      if (\n        this.filterHuds[this.siteId] &&\n        this.filterHuds[this.siteId][this.sourceKey]\n      ) {\n        this.$filterBtn\n          .attr(\n            'aria-controls',\n            this.filterHuds[this.siteId][this.sourceKey].id\n          )\n          .attr(\n            'aria-expanded',\n            this.filterHuds[this.siteId][this.sourceKey].showing\n              ? 'true'\n              : 'false'\n          );\n\n        if (\n          this.filterHuds[this.siteId][this.sourceKey].showing ||\n          this.filterHuds[this.siteId][this.sourceKey].hasRules()\n        ) {\n          this.$filterBtn.addClass('active');\n        }\n      } else {\n        this.$filterBtn.attr('aria-controls', null);\n      }\n    },\n  },\n  {\n    defaults: {\n      context: 'index',\n      modal: null,\n      storageKey: null,\n      condition: null,\n      criteria: null,\n      batchSize: 100,\n      disabledElementIds: [],\n      selectable: false,\n      multiSelect: false,\n      buttonContainer: null,\n      hideSidebar: false,\n      toolbarSelector: '.toolbar:first',\n      refreshSourcesAction: 'element-indexes/get-source-tree-html',\n      updateElementsAction: 'element-indexes/get-elements',\n      countElementsAction: 'element-indexes/count-elements',\n      submitActionsAction: 'element-indexes/perform-action',\n      defaultSiteId: null,\n      defaultSource: null,\n      canHaveDrafts: false,\n\n      elementTypeName: Craft.t('app', 'Element'),\n      elementTypePluralName: Craft.t('app', 'Elements'),\n\n      onAfterInit: $.noop,\n      onSelectSource: $.noop,\n      onSelectSite: $.noop,\n      onUpdateElements: $.noop,\n      onSelectionChange: $.noop,\n      onEnableElements: $.noop,\n      onDisableElements: $.noop,\n      onAfterAction: $.noop,\n    },\n  }\n);\n\nconst ViewMenu = Garnish.Base.extend({\n  elementIndex: null,\n  $source: null,\n  sourceKey: null,\n  menu: null,\n  id: null,\n\n  $trigger: null,\n  $container: null,\n  $sortAttributeSelect: null,\n  $sortDirectionPicker: null,\n  sortDirectionListbox: null,\n  $tableColumnsContainer: null,\n  $revertContainer: null,\n  $revertBtn: null,\n  $closeBtn: null,\n\n  init: function (elementIndex, $source) {\n    this.elementIndex = elementIndex;\n    this.$source = $source;\n    this.sourceKey = $source.data('key');\n    this.id = `view-menu-${Math.floor(Math.random() * 1000000000)}`;\n\n    this.$trigger = $('<button/>', {\n      type: 'button',\n      class: 'btn menubtn hidden',\n      text: Craft.t('app', 'View'),\n      'aria-label': Craft.t('app', 'View settings'),\n      'aria-controls': this.id,\n      'data-icon': 'sliders',\n    }).appendTo(this.elementIndex.$toolbar);\n\n    this.$container = $('<div/>', {\n      id: this.id,\n      class: 'menu menu--disclosure element-index-view-menu',\n      'data-align': 'right',\n    }).appendTo(Garnish.$bod);\n\n    this._buildMenu();\n\n    this.addListener(this.$container, 'mousedown', (ev) => {\n      ev.stopPropagation();\n    });\n\n    this.menu = new Garnish.DisclosureMenu(this.$trigger);\n\n    this.menu.on('show', () => {\n      this.$trigger.addClass('active');\n    });\n\n    this.menu.on('hide', () => {\n      this.$trigger.removeClass('active');\n\n      // Move all checked table column checkboxes to the top once it's fully faded out\n      setTimeout(() => {\n        this.tidyTableColumnField();\n      }, Garnish.FX_DURATION);\n    });\n  },\n\n  showTrigger: function () {\n    this.$trigger.removeClass('hidden');\n  },\n\n  hideTrigger: function () {\n    this.$trigger.data('trigger').hide();\n    this.$trigger.addClass('hidden');\n    this.menu.hide();\n  },\n\n  updateSortField: function () {\n    let [attribute, direction] =\n      this.elementIndex.getSortAttributeAndDirection();\n\n    // Add/remove a score option\n    const $scoreOption = this.$sortAttributeSelect.children(\n      'option[value=\"score\"]'\n    );\n\n    // If searching by score, just keep showing the actual selection\n    if (this.elementIndex.searching) {\n      if (!$scoreOption.length) {\n        this.$sortAttributeSelect.prepend(\n          $('<option/>', {\n            value: 'score',\n            text: Craft.t('app', 'Score'),\n          })\n        );\n      }\n    } else if ($scoreOption.length) {\n      $scoreOption.remove();\n    }\n\n    this.$sortAttributeSelect.val(attribute);\n    this.sortDirectionListbox.select(direction === 'asc' ? 0 : 1);\n\n    if (['structure', 'score'].includes(attribute)) {\n      this.sortDirectionListbox.disable();\n      this.$sortDirectionPicker.addClass('disabled');\n    } else {\n      this.sortDirectionListbox.enable();\n      this.$sortDirectionPicker.removeClass('disabled');\n    }\n\n    if (!this.elementIndex.canSortByStructure()) {\n      this.$sortAttributeSelect\n        .children('option[value=\"structure\"]')\n        .attr('disabled', 'disabled');\n    } else {\n      this.$sortAttributeSelect\n        .children('option[value=\"structure\"]')\n        .removeAttr('disabled');\n    }\n  },\n\n  updateTableColumnField: function () {\n    const attributes = this.elementIndex.getSelectedTableColumns();\n    let $lastContainer, lastIndex;\n\n    attributes.forEach((attribute) => {\n      const $checkbox = this.$tableColumnsContainer.find(\n        `input[value=\"${attribute}\"]`\n      );\n      if (!$checkbox.prop('checked')) {\n        $checkbox.prop('checked', true);\n      }\n      const $container = $checkbox.parent();\n\n      // Do we need to move it up?\n      if ($lastContainer && $container.index() < lastIndex) {\n        $container.insertAfter($lastContainer);\n      }\n\n      $lastContainer = $container;\n      lastIndex = $container.index();\n    });\n\n    // See if we need to uncheck any checkboxes\n    const $checkboxes = this._getTableColumnCheckboxes();\n    for (let i = 0; i < $checkboxes.length; i++) {\n      const $checkbox = $checkboxes.eq(i);\n      if ($checkbox.prop('checked') && !attributes.includes($checkbox.val())) {\n        $checkbox.prop('checked', false);\n      }\n    }\n  },\n\n  tidyTableColumnField: function () {\n    const defaultOrder = this.elementIndex\n      .getTableColumnOptions(this.$source)\n      .map((column) => column.attr)\n      .reduce((obj, attr, index) => {\n        return {...obj, [attr]: index};\n      }, {});\n\n    this.$tableColumnsContainer\n      .children()\n      .sort((a, b) => {\n        const checkboxA = $(a).children('input[type=\"checkbox\"]')[0];\n        const checkboxB = $(b).children('input[type=\"checkbox\"]')[0];\n        if (checkboxA.checked && checkboxB.checked) {\n          return 0;\n        }\n        if (checkboxA.checked || checkboxB.checked) {\n          return checkboxA.checked ? -1 : 1;\n        }\n        return defaultOrder[checkboxA.value] < defaultOrder[checkboxB.value]\n          ? -1\n          : 1;\n      })\n      .appendTo(this.$tableColumnsContainer);\n  },\n\n  revert: function () {\n    this.elementIndex.setSelecetedSourceState({\n      order: null,\n      sort: null,\n      tableColumns: null,\n    });\n\n    this.updateSortField();\n    this.updateTableColumnField();\n    this.tidyTableColumnField();\n\n    this.$revertBtn.remove();\n    this.$revertBtn = null;\n\n    this.$closeBtn.focus();\n    this.elementIndex.updateElements();\n  },\n\n  _buildMenu: function () {\n    const $metaContainer = $('<div class=\"meta\"/>').appendTo(this.$container);\n    this._createSortField().appendTo($metaContainer);\n    this._createTableColumnsField().appendTo($metaContainer);\n\n    this.$sortAttributeSelect.focus();\n\n    const $footerContainer = $('<div/>', {\n      class: 'flex menu-footer',\n    }).appendTo(this.$container);\n\n    this.$revertContainer = $('<div/>', {\n      class: 'flex-grow',\n    }).appendTo($footerContainer);\n\n    // Only create the revert button if there's a custom view state\n    if (\n      this.elementIndex.getSelectedSourceState('order') ||\n      this.elementIndex.getSelectedSourceState('sort') ||\n      this.elementIndex.getSelectedSourceState('tableColumns')\n    ) {\n      this._createRevertBtn();\n    }\n\n    this.$closeBtn = $('<button/>', {\n      type: 'button',\n      class: 'btn',\n      text: Craft.t('app', 'Close'),\n    })\n      .appendTo($footerContainer)\n      .on('click', () => {\n        this.menu.hide();\n      });\n  },\n\n  _createSortField: function () {\n    const $container = $('<div class=\"flex\"/>');\n\n    const $sortAttributeSelectContainer = Craft.ui\n      .createSelect({\n        options: this.elementIndex.getSortOptions(this.$source).map((o) => {\n          return {\n            label: o.label,\n            value: o.attr,\n          };\n        }),\n      })\n      .addClass('fullwidth')\n      .appendTo($('<div class=\"flex-grow\"/>').appendTo($container));\n\n    this.$sortAttributeSelect = $sortAttributeSelectContainer\n      .children('select')\n      .attr({\n        'aria-label': Craft.t('app', 'Sort attribute'),\n      });\n\n    this.$sortDirectionPicker = $('<section/>', {\n      class: 'btngroup btngroup--exclusive',\n      'aria-label': Craft.t('app', 'Sort direction'),\n    })\n      .append(\n        $('<button/>', {\n          type: 'button',\n          class: 'btn',\n          title: Craft.t('app', 'Sort ascending'),\n          'aria-label': Craft.t('app', 'Sort ascending'),\n          'aria-pressed': 'false',\n          'data-icon': 'asc',\n          'data-dir': 'asc',\n        })\n      )\n      .append(\n        $('<button/>', {\n          type: 'button',\n          class: 'btn',\n          title: Craft.t('app', 'Sort descending'),\n          'aria-label': Craft.t('app', 'Sort descending'),\n          'aria-pressed': 'false',\n          'data-icon': 'desc',\n          'data-dir': 'desc',\n        })\n      )\n      .appendTo($container);\n\n    this.sortDirectionListbox = new Craft.Listbox(this.$sortDirectionPicker, {\n      onChange: ($selectedOption) => {\n        const direction = $selectedOption.data('dir');\n        if (direction !== this.elementIndex.getSelectedSortDirection()) {\n          this.elementIndex.setSelectedSortAttribute(\n            this.$sortAttributeSelect.val(),\n            $selectedOption.data('dir')\n          );\n          this.elementIndex.updateElements();\n          this._createRevertBtn();\n        }\n      },\n    });\n\n    this.$sortAttributeSelect.on('change', () => {\n      this.elementIndex.setSelectedSortAttribute(\n        this.$sortAttributeSelect.val(),\n        null,\n        false\n      );\n      this.elementIndex.updateElements();\n      this._createRevertBtn();\n    });\n\n    this.updateSortField();\n\n    const $field = Craft.ui.createField($container, {\n      label: Craft.t('app', 'Sort by'),\n      fieldset: true,\n    });\n    $field.addClass('sort-field');\n    return $field;\n  },\n\n  _getTableColumnCheckboxes: function () {\n    return this.$tableColumnsContainer.find('input[type=\"checkbox\"]');\n  },\n\n  _createTableColumnsField: function () {\n    const columns = this.elementIndex.getTableColumnOptions(this.$source);\n\n    if (!columns.length) {\n      return $();\n    }\n\n    this.$tableColumnsContainer = $('<div/>');\n\n    columns.forEach((column) => {\n      $('<div class=\"element-index-view-menu-table-column\"/>')\n        .append('<div class=\"icon move\"/>')\n        .append(\n          Craft.ui.createCheckbox({\n            label: Craft.escapeHtml(column.label),\n            value: column.attr,\n          })\n        )\n        .appendTo(this.$tableColumnsContainer);\n    });\n\n    this.updateTableColumnField();\n    this.tidyTableColumnField();\n\n    new Garnish.DragSort(this.$tableColumnsContainer.children(), {\n      handle: '.move',\n      axis: 'y',\n      onSortChange: () => {\n        this._onTableColumnChange();\n      },\n    });\n\n    this._getTableColumnCheckboxes().on('change', (ev) => {\n      this._onTableColumnChange();\n    });\n\n    const $field = Craft.ui.createField(this.$tableColumnsContainer, {\n      label: Craft.t('app', 'Table Columns'),\n      fieldset: true,\n    });\n    $field.addClass('table-columns-field');\n    return $field;\n  },\n\n  _onTableColumnChange: function () {\n    const columns = [];\n    const $selectedCheckboxes =\n      this._getTableColumnCheckboxes().filter(':checked');\n    for (let i = 0; i < $selectedCheckboxes.length; i++) {\n      columns.push($selectedCheckboxes.eq(i).val());\n    }\n\n    // Only commit the change if it's different from the current column selections\n    // (maybe an unchecked column was dragged, etc.)\n    if (\n      Craft.compare(\n        columns,\n        this.elementIndex.getSelectedTableColumns(this.$source)\n      )\n    ) {\n      return;\n    }\n\n    this.elementIndex.setSelectedTableColumns(columns, false);\n    this.elementIndex.updateElements();\n    this._createRevertBtn();\n  },\n\n  _createRevertBtn: function () {\n    if (this.$revertBtn) {\n      return;\n    }\n\n    this.$revertBtn = $('<button/>', {\n      type: 'button',\n      class: 'light',\n      text: Craft.t('app', 'Use defaults'),\n    })\n      .appendTo(this.$revertContainer)\n      .on('click', () => {\n        this.revert();\n      });\n  },\n\n  destroy: function () {\n    this.menu.destroy();\n    delete this.menu;\n    this.base();\n  },\n});\n\nconst FilterHud = Garnish.HUD.extend({\n  elementIndex: null,\n  sourceKey: null,\n  siteId: null,\n  id: null,\n  loading: true,\n  serialized: null,\n  $clearBtn: null,\n  cleared: false,\n\n  init: function (elementIndex, sourceKey, siteId) {\n    this.elementIndex = elementIndex;\n    this.sourceKey = sourceKey;\n    this.siteId = siteId;\n    this.id = `filter-${Math.floor(Math.random() * 1000000000)}`;\n\n    const $loadingContent = $('<div/>')\n      .append(\n        $('<div/>', {\n          class: 'spinner',\n        })\n      )\n      .append(\n        $('<div/>', {\n          text: Craft.t('app', 'Loading'),\n          class: 'visually-hidden',\n          'aria-role': 'alert',\n        })\n      );\n\n    this.base(this.elementIndex.$filterBtn, $loadingContent, {\n      hudClass: 'hud element-filter-hud loading',\n    });\n\n    this.$hud.attr({\n      id: this.id,\n      'aria-live': 'polite',\n      'aria-busy': 'false',\n    });\n    this.$tip.remove();\n    this.$tip = null;\n\n    this.$body.on('submit', (ev) => {\n      ev.preventDefault();\n      this.hide();\n    });\n\n    Craft.sendActionRequest('POST', 'element-indexes/filter-hud', {\n      data: {\n        elementType: this.elementIndex.elementType,\n        source: this.sourceKey,\n        condition: this.elementIndex.settings.condition,\n        id: `${this.id}-filters`,\n      },\n    })\n      .then((response) => {\n        this.loading = false;\n        this.$hud.removeClass('loading');\n        $loadingContent.remove();\n\n        this.$main.append(response.data.hudHtml);\n        Craft.appendHeadHtml(response.data.headHtml);\n        Craft.appendBodyHtml(response.data.bodyHtml);\n\n        const $btnContainer = $('<div/>', {\n          class: 'flex flex-nowrap',\n        }).appendTo(this.$main);\n        $('<div/>', {\n          class: 'flex-grow',\n        }).appendTo($btnContainer);\n        this.$clearBtn = $('<button/>', {\n          type: 'button',\n          class: 'btn',\n          text: Craft.t('app', 'Cancel'),\n        }).appendTo($btnContainer);\n        $('<button/>', {\n          type: 'submit',\n          class: 'btn secondary',\n          text: Craft.t('app', 'Apply'),\n        }).appendTo($btnContainer);\n        this.$clearBtn.on('click', () => {\n          this.clear();\n        });\n\n        this.$hud.find('.condition-container').on('htmx:beforeRequest', () => {\n          this.setBusy();\n        });\n\n        this.$hud.find('.condition-container').on('htmx:load', () => {\n          this.setReady();\n        });\n        this.setFocus();\n      })\n      .catch(() => {\n        Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n      });\n\n    this.$hud.css('position', 'fixed');\n\n    this.addListener(Garnish.$win, 'scroll,resize', () => {\n      this.updateSizeAndPosition(true);\n    });\n  },\n\n  addListener: function (elem, events, data, func) {\n    if (elem === this.$main && events === 'resize') {\n      return;\n    }\n    this.base(elem, events, data, func);\n  },\n\n  setBusy: function () {\n    this.$hud.attr('aria-busy', 'true');\n\n    $('<div/>', {\n      class: 'visually-hidden',\n      text: Craft.t('app', 'Loading'),\n    }).insertAfter(this.$main.find('.htmx-indicator'));\n  },\n\n  setReady: function () {\n    this.$hud.attr('aria-busy', 'false');\n  },\n\n  setFocus: function () {\n    Garnish.setFocusWithin(this.$main);\n  },\n\n  clear: function () {\n    this.cleared = true;\n    this.hide();\n  },\n\n  updateSizeAndPositionInternal: function () {\n    // const searchOffset = this.elementIndex.$searchContainer.offset();\n    const searchOffset =\n      this.elementIndex.$searchContainer[0].getBoundingClientRect();\n\n    this.$hud.css({\n      width: this.elementIndex.$searchContainer.outerWidth() - 2,\n      top: searchOffset.top + this.elementIndex.$searchContainer.outerHeight(),\n      left: searchOffset.left + 1,\n    });\n  },\n\n  onShow: function () {\n    this.base();\n\n    // Cancel => Clear\n    if (this.$clearBtn) {\n      this.$clearBtn.text(Craft.t('app', 'Clear'));\n    }\n\n    this.elementIndex.updateFilterBtn();\n    this.setFocus();\n  },\n\n  onHide: function () {\n    this.base();\n\n    // If something changed, update the elements\n    if (this.serialized !== (this.serialized = this.serialize())) {\n      this.elementIndex.updateElements();\n    }\n\n    if (this.cleared) {\n      this.destroy();\n    } else {\n      this.$hud.detach();\n      this.$shade.detach();\n    }\n\n    this.elementIndex.updateFilterBtn();\n    this.elementIndex.$filterBtn.focus();\n  },\n\n  hasRules: function () {\n    return this.$main.has('.condition-rule').length !== 0;\n  },\n\n  serialize: function () {\n    return !this.cleared && this.hasRules() ? this.$body.serialize() : null;\n  },\n\n  destroy: function () {\n    this.base();\n    delete this.elementIndex.filterHuds[this.siteId][this.sourceKey];\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Base Element Index View\n */\nCraft.BaseElementIndexView = Garnish.Base.extend(\n  {\n    $container: null,\n    $loadingMoreSpinner: null,\n    $elementContainer: null,\n    $scroller: null,\n\n    elementIndex: null,\n    thumbLoader: null,\n    elementSelect: null,\n\n    loadingMore: false,\n\n    _totalVisible: null,\n    _morePending: null,\n    _handleEnableElements: null,\n    _handleDisableElements: null,\n\n    init: function (elementIndex, container, settings) {\n      this.elementIndex = elementIndex;\n      this.$container = $(container);\n      this.setSettings(settings, Craft.BaseElementIndexView.defaults);\n\n      // Create a \"loading-more\" spinner\n      this.$loadingMoreSpinner = $(\n        '<div class=\"centeralign hidden\">' +\n          '<div class=\"spinner loadingmore\"></div>' +\n          '</div>'\n      ).insertAfter(this.$container);\n\n      // Get the actual elements container and its child elements\n      this.$elementContainer = this.getElementContainer();\n      var $elements = this.$elementContainer.children();\n\n      this.setTotalVisible($elements.length);\n      this.setMorePending(\n        this.settings.batchSize && $elements.length == this.settings.batchSize\n      );\n\n      // Instantiate the thumb loader\n      this.thumbLoader = new Craft.ElementThumbLoader();\n      this.thumbLoader.load($elements);\n\n      if (this.settings.selectable) {\n        this.elementSelect = new Garnish.Select(\n          this.$elementContainer,\n          $elements.filter(':not(.disabled)'),\n          {\n            multi: this.settings.multiSelect,\n            vertical: this.isVerticalList(),\n            handle:\n              this.settings.context === 'index'\n                ? '.checkbox, .element:first'\n                : null,\n            filter: ':not(a):not(.toggle)',\n            checkboxMode: this.settings.checkboxMode,\n            onSelectionChange: this.onSelectionChange.bind(this),\n          }\n        );\n\n        this._handleEnableElements = (ev) => {\n          this.elementSelect.addItems(ev.elements);\n        };\n\n        this._handleDisableElements = (ev) => {\n          this.elementSelect.removeItems(ev.elements);\n        };\n\n        this.elementIndex.on('enableElements', this._handleEnableElements);\n        this.elementIndex.on('disableElements', this._handleDisableElements);\n      }\n\n      // Enable inline element editing if this is an index page\n      if (this.settings.context === 'index') {\n        this._handleElementEditing = (ev) => {\n          var $target = $(ev.target);\n\n          if ($target.prop('nodeName') === 'A') {\n            // Let the link do its thing\n            return;\n          }\n\n          var $element;\n\n          if ($target.hasClass('element')) {\n            $element = $target;\n          } else {\n            $element = $target.closest('.element');\n\n            if (!$element.length) {\n              return;\n            }\n          }\n\n          if (Garnish.hasAttr($element, 'data-editable')) {\n            Craft.createElementEditor($element.data('type'), $element);\n          }\n        };\n\n        if (!this.elementIndex.trashed) {\n          this.addListener(\n            this.$elementContainer,\n            'dblclick',\n            this._handleElementEditing\n          );\n          if ($.isTouchCapable()) {\n            this.addListener(\n              this.$elementContainer,\n              'taphold',\n              this._handleElementEditing\n            );\n          }\n        }\n      }\n\n      // Give sub-classes a chance to do post-initialization stuff here\n      this.afterInit();\n\n      // Set up lazy-loading\n      if (this.settings.batchSize) {\n        if (this.settings.context === 'index') {\n          this.$scroller = Garnish.$scrollContainer;\n        } else {\n          this.$scroller = this.elementIndex.$main;\n        }\n\n        this.$scroller.scrollTop(0);\n        this.addListener(this.$scroller, 'scroll', 'maybeLoadMore');\n        this.maybeLoadMore();\n      }\n    },\n\n    getElementContainer: function () {\n      throw 'Classes that extend Craft.BaseElementIndexView must supply a getElementContainer() method.';\n    },\n\n    afterInit: function () {},\n\n    getAllElements: function () {\n      return this.$elementContainer.children();\n    },\n\n    getEnabledElements: function () {\n      return this.$elementContainer.children(':not(.disabled)');\n    },\n\n    getElementById: function (id) {\n      var $element = this.$elementContainer.children(\n        '[data-id=\"' + id + '\"]:first'\n      );\n\n      if ($element.length) {\n        return $element;\n      } else {\n        return null;\n      }\n    },\n\n    getSelectedElements: function () {\n      if (!this.elementSelect) {\n        throw 'This view is not selectable.';\n      }\n\n      return this.elementSelect.$selectedItems;\n    },\n\n    getSelectedElementIds: function () {\n      let $selectedElements;\n      try {\n        $selectedElements = this.getSelectedElements();\n      } catch (e) {}\n\n      let ids = [];\n      if ($selectedElements) {\n        for (var i = 0; i < $selectedElements.length; i++) {\n          ids.push($selectedElements.eq(i).data('id'));\n        }\n      }\n      return ids;\n    },\n\n    selectElement: function ($element) {\n      if (!this.elementSelect) {\n        throw 'This view is not selectable.';\n      }\n\n      this.elementSelect.selectItem($element, true);\n      return true;\n    },\n\n    selectElementById: function (id) {\n      if (!this.elementSelect) {\n        throw 'This view is not selectable.';\n      }\n\n      var $element = this.getElementById(id);\n\n      if ($element) {\n        this.elementSelect.selectItem($element, true);\n        return true;\n      } else {\n        return false;\n      }\n    },\n\n    selectAllElements: function () {\n      this.elementSelect.selectAll();\n    },\n\n    deselectAllElements: function () {\n      this.elementSelect.deselectAll();\n    },\n\n    isVerticalList: function () {\n      return false;\n    },\n\n    getTotalVisible: function () {\n      return this._totalVisible;\n    },\n\n    setTotalVisible: function (totalVisible) {\n      this._totalVisible = totalVisible;\n    },\n\n    getMorePending: function () {\n      return this._morePending;\n    },\n\n    setMorePending: function (morePending) {\n      this._morePending = morePending;\n    },\n\n    /**\n     * Checks if the user has reached the bottom of the scroll area, and if so, loads the next batch of elemets.\n     */\n    maybeLoadMore: function () {\n      if (this.canLoadMore()) {\n        this.loadMore();\n      }\n    },\n\n    /**\n     * Returns whether the user has reached the bottom of the scroll area.\n     */\n    canLoadMore: function () {\n      if (!this.getMorePending() || !this.settings.batchSize) {\n        return false;\n      }\n\n      // Check if the user has reached the bottom of the scroll area\n      var containerHeight;\n\n      if (this.$scroller[0] === Garnish.$win[0]) {\n        var winHeight = Garnish.$win.innerHeight(),\n          winScrollTop = Garnish.$win.scrollTop(),\n          containerOffset = this.$container.offset().top;\n        containerHeight = this.$container.height();\n\n        return winHeight + winScrollTop >= containerOffset + containerHeight;\n      } else {\n        var containerScrollHeight = this.$scroller.prop('scrollHeight'),\n          containerScrollTop = this.$scroller.scrollTop();\n        containerHeight = this.$scroller.outerHeight();\n\n        return (\n          containerScrollHeight - containerScrollTop <= containerHeight + 15\n        );\n      }\n    },\n\n    /**\n     * Loads the next batch of elements.\n     */\n    loadMore: function () {\n      if (\n        !this.getMorePending() ||\n        this.loadingMore ||\n        !this.settings.batchSize\n      ) {\n        return;\n      }\n\n      this.loadingMore = true;\n      this.$loadingMoreSpinner.removeClass('hidden');\n      this.removeListener(this.$scroller, 'scroll');\n\n      Craft.sendActionRequest('POST', this.settings.loadMoreElementsAction, {\n        data: this.getLoadMoreParams(),\n      })\n        .then((response) => {\n          this.loadingMore = false;\n          this.$loadingMoreSpinner.addClass('hidden');\n\n          let $newElements = $(response.data.html);\n\n          this.appendElements($newElements);\n          Craft.appendHeadHtml(response.data.headHtml);\n          Craft.appendBodyHtml(response.data.bodyHtml);\n\n          if (this.elementSelect) {\n            this.elementSelect.addItems($newElements.filter(':not(.disabled)'));\n            this.elementIndex.updateActionTriggers();\n          }\n\n          this.setTotalVisible(this.getTotalVisible() + $newElements.length);\n          this.setMorePending($newElements.length == this.settings.batchSize);\n\n          // Is there room to load more right now?\n          this.addListener(this.$scroller, 'scroll', 'maybeLoadMore');\n          this.maybeLoadMore();\n        })\n        .catch((e) => {\n          this.loadingMore = false;\n          this.$loadingMoreSpinner.addClass('hidden');\n        });\n    },\n\n    getLoadMoreParams: function () {\n      // Use the same params that were passed when initializing this view\n      var params = $.extend(true, {}, this.settings.params);\n      params.criteria.offset = this.getTotalVisible();\n      return params;\n    },\n\n    appendElements: function ($newElements) {\n      $newElements.appendTo(this.$elementContainer);\n      this.thumbLoader.load($newElements);\n      this.onAppendElements($newElements);\n    },\n\n    onAppendElements: function ($newElements) {\n      this.settings.onAppendElements($newElements);\n      this.trigger('appendElements', {\n        newElements: $newElements,\n      });\n    },\n\n    onSelectionChange: function () {\n      this.settings.onSelectionChange();\n      this.trigger('selectionChange');\n    },\n\n    disable: function () {\n      if (this.elementSelect) {\n        this.elementSelect.disable();\n      }\n    },\n\n    enable: function () {\n      if (this.elementSelect) {\n        this.elementSelect.enable();\n      }\n    },\n\n    destroy: function () {\n      // Remove the \"loading-more\" spinner, since we added that outside of the view container\n      this.$loadingMoreSpinner.remove();\n\n      // Kill the thumb loader\n      this.thumbLoader.destroy();\n      delete this.thumbLoader;\n\n      // Delete the element select\n      if (this.elementSelect) {\n        this.elementIndex.off('enableElements', this._handleEnableElements);\n        this.elementIndex.off('disableElements', this._handleDisableElements);\n\n        this.elementSelect.destroy();\n        delete this.elementSelect;\n      }\n\n      this.base();\n    },\n  },\n  {\n    defaults: {\n      context: 'index',\n      batchSize: null,\n      params: null,\n      selectable: false,\n      multiSelect: false,\n      checkboxMode: false,\n      loadMoreElementsAction: 'element-indexes/get-more-elements',\n      onAppendElements: $.noop,\n      onSelectionChange: $.noop,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element Select input\n */\nCraft.BaseElementSelectInput = Garnish.Base.extend(\n  {\n    thumbLoader: null,\n    elementSelect: null,\n    elementSort: null,\n    modal: null,\n    elementEditor: null,\n\n    fieldLabel: null,\n\n    $container: null,\n    $form: null,\n    $elementsContainer: null,\n    $elements: null,\n    $addElementBtn: null,\n    $spinner: null,\n\n    _initialized: false,\n\n    init: function (settings) {\n      // Normalize the settings and set them\n      // ---------------------------------------------------------------------\n\n      // Are they still passing in a bunch of arguments?\n      if (!$.isPlainObject(settings)) {\n        // Loop through all of the old arguments and apply them to the settings\n        var normalizedSettings = {},\n          args = [\n            'id',\n            'name',\n            'elementType',\n            'sources',\n            'criteria',\n            'sourceElementId',\n            'limit',\n            'modalStorageKey',\n            'fieldId',\n          ];\n\n        for (var i = 0; i < args.length; i++) {\n          if (typeof arguments[i] !== 'undefined') {\n            normalizedSettings[args[i]] = arguments[i];\n          } else {\n            break;\n          }\n        }\n\n        settings = normalizedSettings;\n      }\n\n      this.setSettings(settings, Craft.BaseElementSelectInput.defaults);\n\n      // Apply the storage key prefix\n      if (this.settings.modalStorageKey) {\n        this.modalStorageKey =\n          'BaseElementSelectInput.' + this.settings.modalStorageKey;\n      }\n\n      // No reason for this to be sortable if we're only allowing 1 selection\n      if (this.settings.limit == 1 || this.settings.maintainHierarchy) {\n        this.settings.sortable = false;\n      }\n\n      this.$container = this.getContainer();\n      this.$form = this.$container.closest('form');\n      this.fieldLabel = this.getFieldLabel();\n\n      // Store a reference to this class\n      this.$container.data('elementSelect', this);\n\n      this.$elementsContainer = this.getElementsContainer();\n      this.$addElementBtn = this.getAddElementsBtn();\n      this.$spinner = this.getSpinner();\n\n      this.thumbLoader = new Craft.ElementThumbLoader();\n\n      this.initElementSelect();\n      this.initElementSort();\n      this.resetElements();\n\n      if (this.$addElementBtn) {\n        this.addListener(this.$addElementBtn, 'activate', 'showModal');\n      }\n\n      Garnish.requestAnimationFrame(() => {\n        this._initialized = true;\n      });\n    },\n\n    get totalSelected() {\n      return this.$elements.length;\n    },\n\n    getContainer: function () {\n      return $('#' + this.settings.id);\n    },\n\n    getFieldLabel: function () {\n      if (!this.$container) return;\n\n      const $fieldset = this.$container.closest('fieldset');\n      return $fieldset.find('legend').first().data('label');\n    },\n\n    getElementsContainer: function () {\n      return this.$container.children('.elements');\n    },\n\n    getElements: function () {\n      return this.$elementsContainer.find('.element');\n    },\n\n    getAddElementsBtn: function () {\n      return this.$container.find('.btn.add:first');\n    },\n\n    getSpinner: function () {\n      return this.$container.find('.spinner');\n    },\n\n    initElementSelect: function () {\n      if (this.settings.selectable) {\n        this.elementSelect = new Garnish.Select({\n          multi: this.settings.sortable,\n          filter: ':not(.delete)',\n        });\n      }\n    },\n\n    initElementSort: function () {\n      if (this.settings.sortable) {\n        this.elementSort = new Garnish.DragSort({\n          container: this.$elementsContainer,\n          filter: this.settings.selectable\n            ? () => {\n                // Only return all the selected items if the target item is selected\n                if (this.elementSort.$targetItem.hasClass('sel')) {\n                  return this.elementSelect.getSelectedItems();\n                } else {\n                  return this.elementSort.$targetItem;\n                }\n              }\n            : null,\n          ignoreHandleSelector: '.delete',\n          axis: this.getElementSortAxis(),\n          collapseDraggees: true,\n          magnetStrength: 4,\n          helperLagBase: 1.5,\n          onSortChange: this.settings.selectable\n            ? () => {\n                this.elementSelect.resetItemOrder();\n              }\n            : null,\n        });\n      }\n    },\n\n    getElementSortAxis: function () {\n      return this.settings.viewMode === 'list' ? 'y' : null;\n    },\n\n    canAddMoreElements: function () {\n      return (\n        !this.settings.limit || this.$elements.length < this.settings.limit\n      );\n    },\n\n    updateAddElementsBtn: function () {\n      if (this.canAddMoreElements()) {\n        this.enableAddElementsBtn();\n      } else {\n        this.disableAddElementsBtn();\n      }\n    },\n\n    enableAddElementsBtn: function () {\n      if (this.$addElementBtn) {\n        this.$addElementBtn.removeClass('hidden');\n      }\n\n      this.updateButtonContainer();\n    },\n\n    disableAddElementsBtn: function () {\n      if (this.$addElementBtn) {\n        this.$addElementBtn.addClass('hidden');\n      }\n\n      this.updateButtonContainer();\n    },\n\n    showSpinner: function () {\n      if (this.$spinner) {\n        this.$spinner.removeClass('hidden');\n      }\n\n      this.updateButtonContainer();\n    },\n\n    hideSpinner: function () {\n      if (this.$spinner) {\n        this.$spinner.addClass('hidden');\n      }\n\n      this.updateButtonContainer();\n    },\n\n    updateButtonContainer: function () {\n      const $container =\n        this.$addElementBtn && this.$addElementBtn.parent('.flex');\n      if ($container && $container.length) {\n        if ($container.children(':not(.hidden)').length) {\n          $container.removeClass('hidden');\n        } else {\n          $container.addClass('hidden');\n        }\n      }\n    },\n\n    focusNextLogicalElement: function () {\n      if (this.canAddMoreElements()) {\n        // If can add more elements, focus ADD button\n        let $btn = this.$addElementBtn;\n\n        if ($btn) {\n          $btn.get(0).focus();\n        }\n      } else {\n        // If can't add more elements, focus on the final remove\n        this.focusLastRemoveBtn();\n      }\n    },\n\n    focusLastRemoveBtn: function () {\n      const $removeBtns = this.$container.find('.delete');\n\n      if (!$removeBtns.length) return;\n\n      $removeBtns.last()[0].focus();\n    },\n\n    resetElements: function () {\n      if (this.$elements !== null) {\n        this.removeElements(this.$elements);\n      } else {\n        this.$elements = $();\n      }\n\n      this.addElements(this.getElements());\n    },\n\n    addElements: function ($elements) {\n      this.thumbLoader.load($elements);\n\n      if (this.settings.selectable) {\n        this.elementSelect.addItems($elements);\n      }\n\n      if (this.settings.sortable) {\n        this.elementSort.addItems($elements);\n      }\n\n      if (this.settings.editable) {\n        this._handleShowElementEditor = (ev) => {\n          var $element = $(ev.currentTarget);\n          if (\n            Garnish.hasAttr($element, 'data-editable') &&\n            !$element.hasClass('disabled') &&\n            !$element.hasClass('loading')\n          ) {\n            this.elementEditor = this.createElementEditor($element);\n          }\n        };\n\n        this.addListener($elements, 'dblclick', this._handleShowElementEditor);\n\n        if ($.isTouchCapable()) {\n          this.addListener($elements, 'taphold', this._handleShowElementEditor);\n        }\n      }\n\n      $elements.find('.delete').on('click dblclick', (ev) => {\n        this.removeElement($(ev.currentTarget).closest('.element'));\n        // Prevent this from acting as one of a double-click\n        ev.stopPropagation();\n      });\n\n      $elements.on('keydown', (ev) => {\n        if ([Garnish.BACKSPACE_KEY, Garnish.DELETE_KEY].includes(ev.keyCode)) {\n          ev.stopPropagation();\n          ev.preventDefault();\n          const $elements = this.elementSelect.getSelectedItems();\n          for (let i = 0; i < $elements.length; i++) {\n            this.removeElement($elements.eq(i));\n          }\n        }\n      });\n\n      this.$elements = this.$elements.add($elements);\n\n      this.updateAddElementsBtn();\n\n      this.onAddElements();\n    },\n\n    createElementEditor: function ($element, settings) {\n      settings = Object.assign(\n        {\n          elementSelectInput: this,\n          prevalidate: this.settings.prevalidate,\n        },\n        settings\n      );\n\n      return Craft.createElementEditor(\n        this.settings.elementType,\n        $element,\n        settings\n      );\n    },\n\n    replaceElement: function (elementId, replacementId) {\n      return new Promise((resolve, reject) => {\n        const $existing = this.$elements.filter(`[data-id=\"${elementId}\"]`);\n\n        if (!$existing.length) {\n          reject(`No element selected with an ID of ${elementId}.`);\n          return;\n        }\n\n        this.showSpinner();\n\n        const data = {\n          elementId: replacementId,\n          siteId: this.settings.criteria.siteId,\n          thumbSize: this.settings.viewMode,\n        };\n\n        Craft.sendActionRequest('POST', 'elements/get-element-html', {data})\n          .then((response) => {\n            this.removeElement($existing);\n            const elementInfo = Craft.getElementInfo(response.data.html);\n            this.selectElements([elementInfo]);\n            resolve();\n          })\n          .catch(({response}) => {\n            if (response && response.data && response.data.message) {\n              alert(response.data.message);\n            } else {\n              Craft.cp.displayError();\n            }\n\n            reject(response.data.message);\n          })\n          .finally(() => {\n            this.hideSpinner();\n          });\n      });\n    },\n\n    removeElements: function ($elements) {\n      if (this.settings.selectable) {\n        this.elementSelect.removeItems($elements);\n      }\n\n      if (this.modal) {\n        var ids = [];\n\n        for (var i = 0; i < $elements.length; i++) {\n          var id = $elements.eq(i).data('id');\n\n          if (id) {\n            ids.push(id);\n          }\n        }\n\n        if (ids.length) {\n          this.modal.elementIndex.enableElementsById(ids);\n        }\n      }\n\n      // Disable the hidden input in case the form is submitted before this element gets removed from the DOM\n      $elements.children('input').prop('disabled', true);\n\n      // Move the focus to the next element in the list, if there is one\n      let $nextDeleteBtn;\n      if (this.settings.selectable) {\n        const lastElementIndex = this.$elements.index($elements.last());\n        $nextDeleteBtn = this.$elements\n          .eq(lastElementIndex + 1)\n          .find('.delete');\n      }\n      if ($nextDeleteBtn.length) {\n        $nextDeleteBtn.focus();\n      } else {\n        this.focusNextLogicalElement();\n      }\n\n      this.$elements = this.$elements.not($elements);\n      this.updateAddElementsBtn();\n\n      this.onRemoveElements();\n    },\n\n    removeElement: function ($element) {\n      if (this.settings.maintainHierarchy) {\n        // Find any descendants this element might have\n        const $allElements = $element.add(\n          $element.parent().siblings('ul').find('.element')\n        );\n\n        // Remove any inputs from the form data\n        $('[name]', $allElements).removeAttr('name');\n\n        // Remove our record of them all at once\n        this.removeElements($allElements);\n\n        // Animate them away one at a time\n        for (let i = 0; i < $allElements.length; i++) {\n          this._animateStructureElementAway($allElements, i);\n        }\n      } else {\n        // Remove any inputs from the form data\n        $('[name]', $element).removeAttr('name');\n        this.removeElements($element);\n        this.animateElementAway($element, () => {\n          $element.remove();\n        });\n      }\n    },\n\n    animateElementAway: function ($element, callback) {\n      $element.css('z-index', 0);\n\n      var animateCss = {\n        opacity: -1,\n      };\n      animateCss['margin-' + Craft.left] = -(\n        $element.outerWidth() + parseInt($element.css('margin-' + Craft.right))\n      );\n\n      if (this.settings.viewMode === 'list' || this.$elements.length === 0) {\n        animateCss['margin-bottom'] = -(\n          $element.outerHeight() + parseInt($element.css('margin-bottom'))\n        );\n      }\n\n      $element.velocity(\n        animateCss,\n        Craft.BaseElementSelectInput.REMOVE_FX_DURATION,\n        () => {\n          if (callback) {\n            callback();\n          }\n        }\n      );\n    },\n\n    showModal: function () {\n      // Make sure we haven't reached the limit\n      if (!this.canAddMoreElements()) {\n        return;\n      }\n\n      if (!this.modal) {\n        this.modal = this.createModal();\n      } else {\n        this.modal.show();\n      }\n    },\n\n    createModal: function () {\n      return Craft.createElementSelectorModal(\n        this.settings.elementType,\n        this.getModalSettings()\n      );\n    },\n\n    getModalSettings: function () {\n      return $.extend(\n        {\n          closeOtherModals: false,\n          storageKey: this.modalStorageKey,\n          sources: this.settings.sources,\n          condition: this.settings.condition,\n          criteria: this.settings.criteria,\n          multiSelect: this.settings.limit != 1,\n          hideOnSelect: !this.settings.maintainHierarchy,\n          showSiteMenu: this.settings.showSiteMenu,\n          disabledElementIds: this.getDisabledElementIds(),\n          onSelect: this.onModalSelect.bind(this),\n          onHide: this.onModalHide.bind(this),\n          triggerElement: this.$addElementBtn,\n          modalTitle: Craft.t('app', 'Select {element}', {\n            element: this.fieldLabel,\n          }),\n        },\n        this.settings.modalSettings\n      );\n    },\n\n    getSelectedElementIds: function () {\n      var ids = [];\n\n      for (var i = 0; i < this.$elements.length; i++) {\n        ids.push(this.$elements.eq(i).data('id'));\n      }\n\n      return ids;\n    },\n\n    getDisabledElementIds: function () {\n      var ids = this.getSelectedElementIds();\n\n      if (!this.settings.allowSelfRelations && this.settings.sourceElementId) {\n        ids.push(this.settings.sourceElementId);\n      }\n\n      if (this.settings.disabledElementIds) {\n        ids.push(...this.settings.disabledElementIds);\n      }\n\n      return ids;\n    },\n\n    onModalSelect: function (elements) {\n      if (this.settings.maintainHierarchy) {\n        this.selectStructuredElements(elements);\n      } else {\n        if (this.settings.limit) {\n          // Cut off any excess elements\n          var slotsLeft = this.settings.limit - this.$elements.length;\n\n          if (elements.length > slotsLeft) {\n            elements = elements.slice(0, slotsLeft);\n          }\n        }\n\n        this.selectElements(elements);\n        this.updateDisabledElementsInModal();\n      }\n    },\n\n    onModalHide: function () {\n      // If can add more elements, do default behavior of focus on \"Add\" button\n      if (this.canAddMoreElements()) return;\n\n      setTimeout(() => {\n        this.focusNextLogicalElement();\n      }, 200);\n    },\n\n    selectElements: function (elements) {\n      for (let i = 0; i < elements.length; i++) {\n        let elementInfo = elements[i],\n          $element = this.createNewElement(elementInfo);\n\n        this.appendElement($element);\n        this.addElements($element);\n        this.animateElementIntoPlace(elementInfo.$element, $element);\n\n        // Override the element reference with the new one\n        elementInfo.$element = $element;\n      }\n\n      this.onSelectElements(elements);\n    },\n\n    selectStructuredElements: function (elements) {\n      // Disable the modal\n      this.modal.disable();\n      this.modal.disableCancelBtn();\n      this.modal.disableSelectBtn();\n      this.modal.showFooterSpinner();\n\n      // Get the new element HTML\n      var selectedElementIds = this.getSelectedElementIds();\n\n      for (var i = 0; i < elements.length; i++) {\n        selectedElementIds.push(elements[i].id);\n      }\n\n      var data = {\n        elementIds: selectedElementIds,\n        siteId: elements[0].siteId,\n        containerId: this.settings.id,\n        name: this.settings.name,\n        branchLimit: this.settings.branchLimit,\n        selectionLabel: this.settings.selectionLabel,\n        elementType: this.settings.elementType,\n      };\n\n      const onResponse = () => {\n        this.modal.enable();\n        this.modal.enableCancelBtn();\n        this.modal.enableSelectBtn();\n        this.modal.hideFooterSpinner();\n      };\n      Craft.sendActionRequest(\n        'POST',\n        'relational-fields/structured-input-html',\n        {data}\n      )\n        .then((response) => {\n          onResponse();\n          var $newInput = $(response.data.html),\n            $newElementsContainer = $newInput.children('.elements');\n\n          this.$elementsContainer.replaceWith($newElementsContainer);\n          this.$elementsContainer = $newElementsContainer;\n          this.resetElements();\n\n          var filteredElements = [];\n\n          for (var i = 0; i < elements.length; i++) {\n            var element = elements[i],\n              $element = this.getElementById(element.id);\n\n            if ($element) {\n              this.animateElementIntoPlace(element.$element, $element);\n              filteredElements.push(element);\n            }\n          }\n\n          this.updateDisabledElementsInModal();\n          this.modal.hide();\n          this.onSelectElements(filteredElements);\n        })\n        .catch(({response}) => {\n          onResponse();\n        });\n    },\n\n    createNewElement: function (elementInfo) {\n      var $element = elementInfo.$element.clone();\n      var removeText = Craft.t('app', 'Remove {label}', {\n        label: Craft.escapeHtml(elementInfo.label),\n      });\n      // Make a couple tweaks\n      Craft.setElementSize(\n        $element,\n        this.settings.viewMode === 'large' ? 'large' : 'small'\n      );\n      $element\n        .addClass('removable')\n        .prepend(\n          $('<input/>', {\n            type: 'hidden',\n            name: this.settings.name + (this.settings.single ? '' : '[]'),\n            value: elementInfo.id,\n          })\n        )\n        .prepend(\n          $('<button/>', {\n            type: 'button',\n            class: 'delete icon',\n            title: Craft.t('app', 'Remove'),\n            'aria-label': removeText,\n          })\n        );\n\n      return $element;\n    },\n\n    appendElement: function ($element) {\n      $element.appendTo(this.$elementsContainer);\n    },\n\n    animateElementIntoPlace: function ($modalElement, $inputElement) {\n      var origOffset = $modalElement.offset(),\n        destOffset = $inputElement.offset(),\n        $helper = $inputElement.clone().appendTo(Garnish.$bod);\n\n      $inputElement.css('visibility', 'hidden');\n\n      $helper.css({\n        position: 'absolute',\n        zIndex: 10000,\n        top: origOffset.top,\n        left: origOffset.left,\n      });\n\n      var animateCss = {\n        top: destOffset.top,\n        left: destOffset.left,\n      };\n\n      $helper.velocity(\n        animateCss,\n        Craft.BaseElementSelectInput.ADD_FX_DURATION,\n        function () {\n          $helper.remove();\n          $inputElement.css('visibility', 'visible');\n        }\n      );\n    },\n\n    updateDisabledElementsInModal: function () {\n      if (this.modal.elementIndex) {\n        this.modal.elementIndex.disableElementsById(\n          this.getDisabledElementIds()\n        );\n      }\n    },\n\n    getElementById: function (id) {\n      for (var i = 0; i < this.$elements.length; i++) {\n        var $element = this.$elements.eq(i);\n\n        if ($element.data('id') == id) {\n          return $element;\n        }\n      }\n    },\n\n    onSelectElements: function (elements) {\n      this.trigger('selectElements', {elements});\n      this.settings.onSelectElements(elements);\n      this.$container.trigger('change');\n    },\n\n    onAddElements: function () {\n      this.trigger('addElements');\n      this.settings.onAddElements();\n      this.$container.trigger('change');\n    },\n\n    onRemoveElements: function () {\n      this.trigger('removeElements');\n      this.settings.onRemoveElements();\n      this.$container.trigger('change');\n    },\n\n    _animateStructureElementAway: function ($allElements, i) {\n      let callback;\n\n      // Is this the last one?\n      if (i === $allElements.length - 1) {\n        callback = () => {\n          const $li = $allElements.first().parent().parent();\n          const $ul = $li.parent();\n\n          if ($ul[0] === this.$elementsContainer[0] || $li.siblings().length) {\n            $li.remove();\n          } else {\n            $ul.remove();\n          }\n        };\n      }\n\n      const func = () => {\n        this.animateElementAway($allElements.eq(i), callback);\n      };\n\n      if (i === 0) {\n        func();\n      } else {\n        setTimeout(func, 100 * i);\n      }\n    },\n  },\n  {\n    ADD_FX_DURATION: 200,\n    REMOVE_FX_DURATION: 200,\n\n    defaults: {\n      id: null,\n      name: null,\n      fieldId: null,\n      elementType: null,\n      sources: null,\n      condition: null,\n      criteria: {},\n      allowSelfRelations: false,\n      sourceElementId: null,\n      disabledElementIds: null,\n      viewMode: 'list',\n      single: false,\n      maintainHierarchy: false,\n      branchLimit: null,\n      limit: null,\n      showSiteMenu: false,\n      modalStorageKey: null,\n      modalSettings: {},\n      onAddElements: $.noop,\n      onSelectElements: $.noop,\n      onRemoveElements: $.noop,\n      sortable: true,\n      selectable: true,\n      editable: true,\n      prevalidate: false,\n      editorSettings: {},\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element selector modal class\n */\nCraft.BaseElementSelectorModal = Garnish.Modal.extend(\n  {\n    elementType: null,\n    elementIndex: null,\n\n    supportSidebarToggleView: false,\n\n    $body: null,\n    $content: null,\n    $footer: null,\n    $selectBtn: null,\n    $sidebar: null,\n    $sources: null,\n    $sourceToggles: null,\n    $sidebarToggleBtn: null,\n    $sidebarCloseBtn: null,\n    $mainHeading: null,\n    $main: null,\n    $search: null,\n    $elements: null,\n    $tbody: null,\n    $primaryButtons: null,\n    $secondaryButtons: null,\n    $cancelBtn: null,\n\n    init: function (elementType, settings) {\n      this.elementType = elementType;\n      this.setSettings(settings, Craft.BaseElementSelectorModal.defaults);\n      var $headingId = 'elementSelectorModalHeading-' + Date.now();\n\n      // Build the modal\n      var $container = $(\n          '<div class=\"modal elementselectormodal\" aria-labelledby=\"' +\n            $headingId +\n            '\"></div>'\n        ).appendTo(Garnish.$bod),\n        $heading = $(\n          '<h1 id=\"' +\n            $headingId +\n            '\" class=\"visually-hidden\">' +\n            this.settings.modalTitle +\n            '</h1>'\n        ).appendTo($container),\n        $body = $(\n          '<div class=\"body\"><div class=\"spinner big\"></div></div>'\n        ).appendTo($container);\n\n      this.$footer = $('<div class=\"footer\"/>').appendTo($container);\n\n      if (this.settings.fullscreen) {\n        $container.addClass('fullscreen');\n        this.settings.minGutter = 0;\n      }\n\n      this.base($container, this.settings);\n\n      this.$secondaryButtons = $(\n        '<div class=\"buttons left secondary-buttons\"/>'\n      ).appendTo(this.$footer);\n      this.$primaryButtons = $('<div class=\"buttons right\"/>').appendTo(\n        this.$footer\n      );\n      this.$cancelBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn',\n        text: Craft.t('app', 'Cancel'),\n      }).appendTo(this.$primaryButtons);\n      this.$selectBtn = Craft.ui\n        .createSubmitButton({\n          class: 'disabled',\n          label: Craft.t('app', 'Select'),\n          spinner: true,\n        })\n        .attr('aria-disabled', 'true')\n        .appendTo(this.$primaryButtons);\n\n      this.$body = $body;\n\n      this.addListener(this.$cancelBtn, 'activate', 'cancel');\n      this.addListener(this.$selectBtn, 'activate', 'selectElements');\n    },\n\n    updateModalBottomPadding: function () {\n      const footerHeight = this.$footer.outerHeight();\n      const bottomPadding = parseInt(this.$container.css('padding-bottom'));\n\n      if (footerHeight !== bottomPadding) {\n        this.$container.css('padding-bottom', footerHeight);\n      }\n    },\n\n    updateSidebarView: function () {\n      if (!this.supportSidebarToggleView) return;\n\n      if (this.sidebarShouldBeHidden()) {\n        if (!this.$sidebarToggleBtn) this.buildSidebarToggleView();\n      } else {\n        if (this.$sidebarToggleBtn) this.resetView();\n      }\n    },\n\n    sidebarShouldBeHidden: function () {\n      const contentWidth = this.$container.outerWidth();\n      return contentWidth < 550;\n    },\n\n    resetView: function () {\n      if (this.$mainHeader) {\n        this.$mainHeader.remove();\n      }\n\n      if (this.$sidebarHeader) {\n        this.$sidebarHeader.remove();\n      }\n\n      this.$sidebarToggleBtn = null;\n      this.$body.addClass('has-sidebar');\n      this.$content.addClass('has-sidebar');\n      this.$sidebar.removeClass('hidden');\n    },\n\n    buildSidebarToggleView: function () {\n      if (this.$sidebarToggleBtn || !this.sidebarShouldBeHidden()) return;\n\n      this.$sidebarHeader = $('<div class=\"sidebar-header\"/>').prependTo(\n        this.$sidebar\n      );\n\n      this.$sidebarCloseBtn = Craft.ui\n        .createButton({\n          class: 'nav-close close-btn',\n        })\n        .attr('aria-label', Craft.t('app', 'Close'))\n        .removeClass('btn')\n        .appendTo(this.$sidebarHeader);\n\n      this.$mainHeader = $('<div class=\"main-header\"/>').prependTo(this.$main);\n      this.$mainHeading = $(\n        `<h2 class=\"main-heading\">${this.getActiveSourceName()}</h2>`\n      ).appendTo(this.$mainHeader);\n\n      const buttonConfig = {\n        toggle: true,\n        controls: 'modal-sidebar',\n        class: 'nav-toggle',\n      };\n      this.$sidebarToggleBtn = Craft.ui\n        .createButton(buttonConfig)\n        .removeClass('btn')\n        .attr('aria-label', Craft.t('app', 'Show sidebar'))\n        .appendTo(this.$mainHeader);\n\n      this.$sidebar.attr('id', 'modal-sidebar');\n\n      this.closeSidebar();\n\n      this.addListener(this.$sidebarToggleBtn, 'click', () => {\n        this.toggleSidebar();\n      });\n\n      this.addListener(this.$sidebarCloseBtn, 'click', () => {\n        this.toggleSidebar();\n      });\n    },\n\n    sidebarIsOpen: function () {\n      return this.$sidebarToggleBtn.attr('aria-expanded') === 'true';\n    },\n\n    toggleSidebar: function () {\n      if (this.sidebarIsOpen()) {\n        this.closeSidebar();\n      } else {\n        this.openSidebar();\n      }\n    },\n\n    openSidebar: function () {\n      this.$body.addClass('has-sidebar');\n      this.$content.addClass('has-sidebar');\n      this.$sidebar.removeClass('hidden');\n      this.$sidebarToggleBtn.attr('aria-expanded', 'true');\n      this.$sidebar.find(':focusable').first().focus();\n\n      Garnish.uiLayerManager.addLayer(this.$sidebar);\n      Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n        this.closeSidebar();\n\n        // If the focus is currently inside the sidebar, refocus the toggle\n        const $focusedEl = Garnish.getFocusedElement();\n        if ($.contains(this.$sidebar.get(0), $focusedEl.get(0)))\n          this.$sidebarToggleBtn.focus();\n      });\n    },\n\n    closeSidebar: function () {\n      if (!this.$sidebarToggleBtn) return;\n\n      if (this.sidebarIsOpen()) {\n        Garnish.uiLayerManager.removeLayer();\n        this.$sidebar.addClass('hidden');\n        this.$sidebarToggleBtn.attr('aria-expanded', 'false');\n      }\n\n      this.$body.removeClass('has-sidebar');\n      this.$content.removeClass('has-sidebar');\n    },\n\n    getActiveSourceName: function () {\n      return this.$sidebar.find('.sel').text();\n    },\n\n    onFadeIn: function () {\n      if (!this.elementIndex) {\n        this._createElementIndex();\n      } else {\n        // Auto-focus the Search box\n        if (!Garnish.isMobileBrowser(true)) {\n          this.elementIndex.$search.trigger('focus');\n        }\n      }\n\n      this.base();\n    },\n\n    onSelectionChange: function () {\n      this.updateSelectBtnState();\n    },\n\n    onSelectSource: function () {\n      this.updateHeading();\n      this.updateModalBottomPadding();\n    },\n\n    updateHeading: function () {\n      if (!this.$mainHeading) return;\n\n      this.$mainHeading.text(this.getActiveSourceName());\n    },\n\n    updateSelectBtnState: function () {\n      if (this.$selectBtn) {\n        if (this.elementIndex.getSelectedElements().length) {\n          this.enableSelectBtn();\n        } else {\n          this.disableSelectBtn();\n        }\n      }\n    },\n\n    enableSelectBtn: function () {\n      this.$selectBtn.removeClass('disabled').attr('aria-disabled', 'false');\n    },\n\n    disableSelectBtn: function () {\n      this.$selectBtn.addClass('disabled').attr('aria-disabled', 'true');\n    },\n\n    enableCancelBtn: function () {\n      this.$cancelBtn.removeClass('disabled');\n    },\n\n    disableCancelBtn: function () {\n      this.$cancelBtn.addClass('disabled');\n    },\n\n    showFooterSpinner: function () {\n      this.$selectBtn.addClass('loading');\n    },\n\n    hideFooterSpinner: function () {\n      this.$selectBtn.removeClass('loading');\n    },\n\n    cancel: function () {\n      if (!this.$cancelBtn.hasClass('disabled')) {\n        this.hide();\n      }\n    },\n\n    selectElements: function () {\n      if (this.elementIndex && this.elementIndex.getSelectedElements().length) {\n        // TODO: This code shouldn't know about views' elementSelect objects\n        this.elementIndex.view.elementSelect.clearMouseUpTimeout();\n\n        var $selectedElements = this.elementIndex.getSelectedElements(),\n          elementInfo = this.getElementInfo($selectedElements);\n\n        this.onSelect(elementInfo);\n\n        if (this.settings.disableElementsOnSelect) {\n          this.elementIndex.disableElements(\n            this.elementIndex.getSelectedElements()\n          );\n        }\n\n        if (this.settings.hideOnSelect) {\n          this.hide();\n        }\n      }\n    },\n\n    getElementInfo: function ($selectedElements) {\n      var info = [];\n\n      for (var i = 0; i < $selectedElements.length; i++) {\n        var $element = $($selectedElements[i]);\n        var elementInfo = Craft.getElementInfo($element);\n\n        info.push(elementInfo);\n      }\n\n      return info;\n    },\n\n    onShow: function () {\n      this.updateSelectBtnState();\n\n      // Add listeners again since they get removed during modal close\n      this.addListener(Garnish.$win, 'resize', this.updateSidebarView);\n      this.addListener(Garnish.$win, 'resize', this.updateModalBottomPadding);\n\n      this.updateModalBottomPadding();\n      this.updateSidebarView();\n      this.base();\n    },\n\n    onHide: function () {\n      this.closeSidebar();\n      this.base();\n    },\n\n    onSelect: function (elementInfo) {\n      this.settings.onSelect(elementInfo);\n    },\n\n    disable: function () {\n      if (this.elementIndex) {\n        this.elementIndex.disable();\n      }\n\n      this.base();\n    },\n\n    enable: function () {\n      if (this.elementIndex) {\n        this.elementIndex.enable();\n      }\n\n      this.base();\n    },\n\n    _createElementIndex: function () {\n      // Get the modal body HTML based on the settings\n      var data = {\n        context: 'modal',\n        elementType: this.elementType,\n        sources: this.settings.sources,\n      };\n\n      if (\n        this.settings.showSiteMenu !== null &&\n        this.settings.showSiteMenu !== 'auto'\n      ) {\n        data.showSiteMenu = this.settings.showSiteMenu ? '1' : '0';\n      }\n\n      Craft.sendActionRequest('POST', this.settings.bodyAction, {data}).then(\n        (response) => {\n          this.$body.html(response.data.html);\n\n          if (this.$body.has('.sidebar:not(.hidden)').length) {\n            this.$body.addClass('has-sidebar');\n            this.supportSidebarToggleView = true;\n          }\n\n          // Initialize the element index\n          this.elementIndex = Craft.createElementIndex(\n            this.elementType,\n            this.$body,\n            Object.assign(\n              {\n                context: 'modal',\n                modal: this,\n                storageKey: this.settings.storageKey,\n                condition: this.settings.condition,\n                criteria: this.settings.criteria,\n                disabledElementIds: this.settings.disabledElementIds,\n                selectable: true,\n                multiSelect: this.settings.multiSelect,\n                buttonContainer: this.$secondaryButtons,\n                onSelectionChange: this.onSelectionChange.bind(this),\n                onSelectSource: this.onSelectSource.bind(this),\n                hideSidebar: this.settings.hideSidebar,\n                defaultSiteId: this.settings.defaultSiteId,\n                defaultSource: this.settings.defaultSource,\n              },\n              this.settings.indexSettings\n            )\n          );\n\n          this.$main = this.elementIndex.$main;\n          this.$sidebar = this.elementIndex.$sidebar;\n          this.$content = this.$body.find('.content');\n\n          this.updateSidebarView();\n          this.updateModalBottomPadding();\n\n          // Double-clicking or double-tapping should select the elements\n          this.addListener(\n            this.elementIndex.$elements,\n            'doubletap',\n            function (ev, touchData) {\n              // Make sure the touch targets are the same\n              // (they may be different if Command/Ctrl/Shift-clicking on multiple elements quickly)\n              if (touchData.firstTap.target === touchData.secondTap.target) {\n                this.selectElements();\n              }\n            }\n          );\n        }\n      );\n    },\n  },\n  {\n    defaults: {\n      fullscreen: false,\n      resizable: true,\n      storageKey: null,\n      sources: null,\n      condition: null,\n      criteria: null,\n      multiSelect: false,\n      showSiteMenu: null,\n      disabledElementIds: [],\n      disableElementsOnSelect: false,\n      hideOnSelect: true,\n      modalTitle: Craft.t('app', 'Select element'),\n      onCancel: $.noop,\n      onSelect: $.noop,\n      hideSidebar: false,\n      defaultSiteId: null,\n      defaultSource: null,\n      bodyAction: 'element-selector-modals/body',\n      indexSettings: {},\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Input Generator\n */\nCraft.BaseInputGenerator = Garnish.Base.extend({\n  $source: null,\n  $target: null,\n  $form: null,\n  settings: null,\n\n  listening: null,\n  timeout: null,\n\n  init: function (source, target, settings) {\n    this.$source = $(source);\n    this.$target = $(target);\n    this.$form = this.$source.closest('form');\n\n    this.setSettings(settings);\n\n    this.startListening();\n  },\n\n  setNewSource: function (source) {\n    var listening = this.listening;\n    this.stopListening();\n\n    this.$source = $(source);\n\n    if (listening) {\n      this.startListening();\n    }\n  },\n\n  startListening: function () {\n    if (this.listening) {\n      return;\n    }\n\n    this.listening = true;\n\n    this.addListener(this.$source, 'input', 'onSourceTextChange');\n    this.addListener(this.$target, 'input', 'onTargetTextChange');\n    this.addListener(this.$form, 'submit', 'onFormSubmit');\n  },\n\n  stopListening: function () {\n    if (!this.listening) {\n      return;\n    }\n\n    this.listening = false;\n\n    if (this.timeout) {\n      clearTimeout(this.timeout);\n    }\n\n    this.removeAllListeners(this.$source);\n    this.removeAllListeners(this.$target);\n    this.removeAllListeners(this.$form);\n  },\n\n  onSourceTextChange: function () {\n    if (this.timeout) {\n      clearTimeout(this.timeout);\n    }\n\n    this.timeout = setTimeout(this.updateTarget.bind(this), 250);\n  },\n\n  onTargetTextChange: function () {\n    if (this.$target.get(0) === document.activeElement) {\n      this.stopListening();\n    }\n  },\n\n  onFormSubmit: function () {\n    if (this.timeout) {\n      clearTimeout(this.timeout);\n    }\n\n    this.updateTarget();\n  },\n\n  updateTarget: function () {\n    if (!this.$target.is(':visible')) {\n      return;\n    }\n\n    var sourceVal = this.$source.val();\n\n    if (typeof sourceVal === 'undefined') {\n      // The source input may not exist anymore\n      return;\n    }\n\n    var targetVal = this.generateTargetValue(sourceVal);\n\n    this.$target.val(targetVal);\n\n    for (let i = 0; i < this.$target.length; i++) {\n      this.$target[i].dispatchEvent(\n        new InputEvent('input', {\n          inputType: 'insertText',\n        })\n      );\n      this.$target[i].dispatchEvent(new Event('input'));\n    }\n\n    // If the target already has focus, select its whole value to mimic\n    // the behavior if the value had already been generated and they just tabbed in\n    if (this.$target.is(':focus')) {\n      Craft.selectFullValue(this.$target);\n    }\n  },\n\n  generateTargetValue: function (sourceVal) {\n    return sourceVal;\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Category index class\n */\nCraft.CategoryIndex = Craft.BaseElementIndex.extend({\n  editableGroups: null,\n  $newCategoryBtnGroup: null,\n  $newCategoryBtn: null,\n\n  init: function (elementType, $container, settings) {\n    this.editableGroups = [];\n    this.on('selectSource', this.updateButton.bind(this));\n    this.on('selectSite', this.updateButton.bind(this));\n    this.base(elementType, $container, settings);\n  },\n\n  afterInit: function () {\n    // Find which of the visible groups the user has permission to create new categories in\n    this.editableGroups = Craft.editableCategoryGroups.filter(\n      (g) => !!this.getSourceByKey(`group:${g.uid}`)\n    );\n\n    this.base();\n  },\n\n  getDefaultSourceKey: function () {\n    // Did they request a specific category group in the URL?\n    if (\n      this.settings.context === 'index' &&\n      typeof defaultGroupHandle !== 'undefined'\n    ) {\n      for (let i = 0; i < this.$sources.length; i++) {\n        const $source = $(this.$sources[i]);\n        if ($source.data('handle') === defaultGroupHandle) {\n          return $source.data('key');\n        }\n      }\n    }\n\n    return this.base();\n  },\n\n  updateButton: function () {\n    if (!this.$source) {\n      return;\n    }\n\n    // Get the handle of the selected source\n    const selectedSourceHandle = this.$source.data('handle');\n\n    // Update the New Category button\n    // ---------------------------------------------------------------------\n\n    if (this.editableGroups.length) {\n      // Remove the old button, if there is one\n      if (this.$newCategoryBtnGroup) {\n        this.$newCategoryBtnGroup.remove();\n      }\n\n      // Determine if they are viewing a group that they have permission to create categories in\n      const selectedGroup = this.editableGroups.find(\n        (g) => g.handle === selectedSourceHandle\n      );\n\n      this.$newCategoryBtnGroup = $(\n        '<div class=\"btngroup submit\" data-wrapper/>'\n      );\n      let $menuBtn;\n      const menuId = 'new-category-menu-' + Craft.randomString(10);\n\n      // If they are, show a primary \"New category\" button, and a dropdown of the other groups (if any).\n      // Otherwise only show a menu button\n      if (selectedGroup) {\n        const visibleLabel =\n          this.settings.context === 'index'\n            ? Craft.t('app', 'New category')\n            : Craft.t('app', 'New {group} category', {\n                group: selectedGroup.name,\n              });\n        const ariaLabel =\n          this.settings.context === 'index'\n            ? Craft.t('app', 'New category in the {group} category group', {\n                group: selectedGroup.name,\n              })\n            : visibleLabel;\n\n        const role = this.settings.context === 'index' ? 'link' : null;\n\n        this.$newCategoryBtn = Craft.ui\n          .createButton({\n            label: visibleLabel,\n            ariaLabel: ariaLabel,\n            spinner: true,\n            role: role,\n          })\n          .addClass('submit add icon')\n          .appendTo(this.$newCategoryBtnGroup);\n\n        this.addListener(this.$newCategoryBtn, 'click mousedown', (ev) => {\n          // If this is the element index, check for Ctrl+clicks and middle button clicks\n          if (\n            this.settings.context === 'index' &&\n            ((ev.type === 'click' && Garnish.isCtrlKeyPressed(ev)) ||\n              (ev.type === 'mousedown' && ev.originalEvent.button === 1))\n          ) {\n            window.open(Craft.getUrl(`categories/${selectedGroup.handle}/new`));\n          } else if (ev.type === 'click') {\n            this._createCategory(selectedGroup.id);\n          }\n        });\n\n        if (this.editableGroups.length > 1) {\n          $menuBtn = $('<button/>', {\n            type: 'button',\n            class: 'btn submit menubtn btngroup-btn-last',\n            'aria-controls': menuId,\n            'data-disclosure-trigger': '',\n            'aria-label': Craft.t(\n              'app',\n              'New category, choose a category group'\n            ),\n          }).appendTo(this.$newCategoryBtnGroup);\n        }\n      } else {\n        this.$newCategoryBtn = $menuBtn = Craft.ui\n          .createButton({\n            label: Craft.t('app', 'New category'),\n            ariaLabel: Craft.t('app', 'New category, choose a category group'),\n            spinner: true,\n          })\n          .addClass('submit add icon menubtn btngroup-btn-last')\n          .attr('aria-controls', menuId)\n          .attr('data-disclosure-trigger', '')\n          .appendTo(this.$newCategoryBtnGroup);\n      }\n\n      this.addButton(this.$newCategoryBtnGroup);\n\n      if ($menuBtn) {\n        const $menuContainer = $('<div/>', {\n          id: menuId,\n          class: 'menu menu--disclosure',\n        }).appendTo(this.$newCategoryBtnGroup);\n        const $ul = $('<ul/>').appendTo($menuContainer);\n\n        for (const group of this.editableGroups) {\n          const anchorRole =\n            this.settings.context === 'index' ? 'link' : 'button';\n          if (this.settings.context === 'index' || group !== selectedGroup) {\n            const $li = $('<li/>').appendTo($ul);\n            const $a = $('<a/>', {\n              role: anchorRole === 'button' ? 'button' : null,\n              href: '#', // Allows for click listener and tab order\n              type: anchorRole === 'button' ? 'button' : null,\n              text: Craft.t('app', 'New {group} category', {\n                group: group.name,\n              }),\n            }).appendTo($li);\n            this.addListener($a, 'click', () => {\n              $menuBtn.data('trigger').hide();\n              this._createCategory(group.id);\n            });\n\n            if (anchorRole === 'button') {\n              this.addListener($a, 'keydown', (event) => {\n                if (event.keyCode === Garnish.SPACE_KEY) {\n                  event.preventDefault();\n                  $menuBtn.data('trigger').hide();\n                  this._createCategory(group.id);\n                }\n              });\n            }\n          }\n        }\n\n        new Garnish.DisclosureMenu($menuBtn);\n      }\n    }\n\n    // Update the URL if we're on the Categories index\n    // ---------------------------------------------------------------------\n\n    if (this.settings.context === 'index') {\n      let uri = 'categories';\n\n      if (selectedSourceHandle) {\n        uri += '/' + selectedSourceHandle;\n      }\n\n      Craft.setPath(uri);\n    }\n  },\n\n  _createCategory: function (groupId) {\n    if (this.$newCategoryBtn.hasClass('loading')) {\n      console.warn('New category creation already in progress.');\n      return;\n    }\n\n    // Find the group\n    const group = this.editableGroups.find((s) => s.id === groupId);\n\n    if (!group) {\n      throw `Invalid category group ID: ${groupId}`;\n    }\n\n    this.$newCategoryBtn.addClass('loading');\n\n    Craft.sendActionRequest('POST', 'elements/create', {\n      data: {\n        elementType: this.elementType,\n        siteId: this.siteId,\n        groupId: groupId,\n      },\n    })\n      .then((ev) => {\n        if (this.settings.context === 'index') {\n          document.location.href = Craft.getUrl(ev.data.cpEditUrl, {fresh: 1});\n        } else {\n          const slideout = Craft.createElementEditor(this.elementType, {\n            siteId: this.siteId,\n            elementId: ev.data.element.id,\n            draftId: ev.data.element.draftId,\n            params: {\n              fresh: 1,\n            },\n          });\n          slideout.on('submit', () => {\n            // Make sure the right group is selected\n            const groupSourceKey = `group:${group.uid}`;\n\n            if (this.sourceKey !== groupSourceKey) {\n              this.selectSourceByKey(groupSourceKey);\n            }\n\n            this.clearSearch();\n            this.selectElementAfterUpdate(ev.data.element.id);\n            this.updateElements();\n          });\n        }\n      })\n      .finally(() => {\n        this.$newCategoryBtn.removeClass('loading');\n      });\n  },\n});\n\n// Register it!\nCraft.registerElementIndexClass(\n  'craft\\\\elements\\\\Category',\n  Craft.CategoryIndex\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Category Select input\n * @deprecated in 4.3.0. Use Craft.BaseElementSelectInput instead.\n */\nCraft.CategorySelectInput = Craft.BaseElementSelectInput.extend({\n  setSettings: function () {\n    this.base.apply(this, arguments);\n    this.settings.sortable = false;\n  },\n\n  getModalSettings: function () {\n    var settings = this.base();\n    settings.hideOnSelect = false;\n    return settings;\n  },\n\n  getElements: function () {\n    return this.$elementsContainer.find('.element');\n  },\n\n  onModalSelect: function (elements) {\n    // Disable the modal\n    this.modal.disable();\n    this.modal.disableCancelBtn();\n    this.modal.disableSelectBtn();\n    this.modal.showFooterSpinner();\n\n    // Get the new category HTML\n    var selectedCategoryIds = this.getSelectedElementIds();\n\n    for (var i = 0; i < elements.length; i++) {\n      selectedCategoryIds.push(elements[i].id);\n    }\n\n    var data = {\n      categoryIds: selectedCategoryIds,\n      siteId: elements[0].siteId,\n      id: this.settings.id,\n      name: this.settings.name,\n      branchLimit: this.settings.branchLimit,\n      selectionLabel: this.settings.selectionLabel,\n    };\n\n    const onResponse = () => {\n      this.modal.enable();\n      this.modal.enableCancelBtn();\n      this.modal.enableSelectBtn();\n      this.modal.hideFooterSpinner();\n    };\n    Craft.sendActionRequest('POST', 'categories/input-html', {data})\n      .then((response) => {\n        onResponse();\n        var $newInput = $(response.data.html),\n          $newElementsContainer = $newInput.children('.elements');\n\n        this.$elementsContainer.replaceWith($newElementsContainer);\n        this.$elementsContainer = $newElementsContainer;\n        this.resetElements();\n\n        var filteredElements = [];\n\n        for (var i = 0; i < elements.length; i++) {\n          var element = elements[i],\n            $element = this.getElementById(element.id);\n\n          if ($element) {\n            this.animateElementIntoPlace(element.$element, $element);\n            filteredElements.push(element);\n          }\n        }\n\n        this.updateDisabledElementsInModal();\n        this.modal.hide();\n        this.onSelectElements(filteredElements);\n      })\n      .catch(({response}) => {\n        onResponse();\n      });\n  },\n\n  removeElement: function ($element) {\n    // Find any descendants this category might have\n    const $allCategories = $element.add(\n      $element.parent().siblings('ul').find('.element')\n    );\n\n    // Remove our record of them all at once\n    this.removeElements($allCategories);\n\n    // Animate them away one at a time\n    for (let i = 0; i < $allCategories.length; i++) {\n      this._animateCategoryAway($allCategories, i);\n    }\n  },\n\n  _animateCategoryAway: function ($allCategories, i) {\n    let callback;\n\n    // Is this the last one?\n    if (i === $allCategories.length - 1) {\n      callback = () => {\n        const $li = $allCategories.first().parent().parent();\n        const $ul = $li.parent();\n\n        if ($ul[0] === this.$elementsContainer[0] || $li.siblings().length) {\n          $li.remove();\n        } else {\n          $ul.remove();\n        }\n      };\n    }\n\n    const func = () => {\n      this.animateElementAway($allCategories.eq(i), callback);\n    };\n\n    if (i === 0) {\n      func();\n    } else {\n      setTimeout(func, 100 * i);\n    }\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Craft Charts\n */\n\nCraft.charts = {};\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.DataTable\n */\nCraft.charts.DataTable = Garnish.Base.extend({\n  columns: null,\n  rows: null,\n\n  init: function (data) {\n    let columns = data.columns;\n    let rows = data.rows;\n\n    rows.forEach((d) => {\n      $.each(d, function (cellIndex) {\n        var column = columns[cellIndex];\n\n        var parseTime;\n\n        switch (column.type) {\n          case 'date':\n            parseTime = d3.timeParse('%Y-%m-%d');\n            d[cellIndex] = parseTime(d[cellIndex]);\n            break;\n\n          case 'datetime':\n            parseTime = d3.timeParse('%Y-%m-%d %H:00:00');\n            d[cellIndex] = parseTime(d[cellIndex]);\n            break;\n\n          case 'percent':\n            d[cellIndex] = d[cellIndex] / 100;\n            break;\n\n          case 'number':\n            d[cellIndex] = +d[cellIndex];\n            break;\n\n          default:\n          // do nothing\n        }\n      });\n    });\n\n    this.columns = columns;\n    this.rows = rows;\n  },\n});\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.Tip\n */\n\nCraft.charts.Tip = Garnish.Base.extend({\n  $container: null,\n  $tip: null,\n\n  init: function ($container) {\n    this.$container = $container;\n\n    this.$tip = $('<div class=\"tooltip\"></div>').appendTo(this.$container);\n\n    this.hide();\n  },\n\n  setContent: function (html) {\n    this.$tip.html(html);\n  },\n\n  setPosition: function (position) {\n    this.$tip.css('left', `${position.left}px`);\n    this.$tip.css('top', `${position.top}px`);\n  },\n\n  show: function () {\n    this.$tip.css('display', 'block');\n  },\n\n  hide: function () {\n    this.$tip.css('display', 'none');\n  },\n});\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.BaseChart\n */\nCraft.charts.BaseChart = Garnish.Base.extend(\n  {\n    $container: null,\n    $chart: null,\n\n    chartBaseClass: 'cp-chart',\n    dataTable: null,\n\n    formatLocale: null,\n    timeFormatLocale: null,\n    orientation: null,\n\n    svg: null,\n    width: null,\n    height: null,\n\n    init: function (container, settings) {\n      this.$container = container;\n\n      this.setSettings(Craft.charts.BaseChart.defaults);\n      this.setSettings(settings);\n\n      var globalSettings = {\n        formats: window.d3Formats,\n        formatLocaleDefinition: window.d3FormatLocaleDefinition,\n        timeFormatLocaleDefinition: window.d3TimeFormatLocaleDefinition,\n      };\n\n      this.setSettings(globalSettings);\n\n      d3.select(window).on('resize', () => {\n        this.resize();\n      });\n    },\n\n    setSettings: function (settings, defaults) {\n      var baseSettings =\n        typeof this.settings === 'undefined' ? {} : this.settings;\n      this.settings = $.extend(true, {}, baseSettings, defaults, settings);\n    },\n\n    draw: function (dataTable, settings) {\n      // Settings and chart attributes\n\n      this.setSettings(settings);\n\n      this.dataTable = dataTable;\n      this.formatLocale = d3.formatLocale(this.settings.formatLocaleDefinition);\n      this.timeFormatLocale = d3.timeFormatLocale(\n        this.settings.timeFormatLocaleDefinition\n      );\n      this.orientation = this.settings.orientation;\n\n      // Set (or reset) the chart element\n\n      if (this.$chart) {\n        this.$chart.remove();\n      }\n\n      var className = this.chartBaseClass;\n\n      if (this.settings.chartClass) {\n        className += ' ' + this.settings.chartClass;\n      }\n\n      this.$chart = $(`<div class=\"${className}\" />`).appendTo(this.$container);\n    },\n\n    resize: function () {\n      this.draw(this.dataTable, this.settings);\n    },\n\n    onAfterDrawTicks: function () {\n      // White border for ticks' text\n      $('.tick', this.$chart).each(function (tickKey, tick) {\n        var $tickText = $('text', tick);\n\n        var $clone = $tickText.clone();\n        $clone.appendTo(tick);\n\n        $tickText.attr('stroke', '#ffffff');\n        $tickText.attr('stroke-width', 3);\n      });\n    },\n  },\n  {\n    defaults: {\n      formatLocaleDefinition: null,\n      timeFormatLocaleDefinition: null,\n      formats: {\n        numberFormat: ',.2f',\n        percentFormat: ',.2%',\n        currencyFormat: '$,.2f',\n        shortDateFormats: {\n          day: '%-m/%-d',\n          month: '%-m/%y',\n          year: '%Y',\n        },\n      },\n      margin: {top: 0, right: 0, bottom: 0, left: 0},\n      chartClass: null,\n      colors: ['#0594D1', '#DE3800', '#FF9A00', '#009802', '#9B009B'],\n    },\n  }\n);\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.Area\n */\nCraft.charts.Area = Craft.charts.BaseChart.extend(\n  {\n    tip: null,\n    drawingArea: null,\n\n    init: function (container, settings) {\n      this.base(container, Craft.charts.Area.defaults);\n\n      this.setSettings(settings);\n    },\n\n    draw: function (dataTable, settings) {\n      this.base(dataTable, settings);\n\n      if (this.tip) {\n        this.tip = null;\n      }\n\n      var margin = this.getChartMargin();\n\n      this.width = this.$chart.width() - margin.left - margin.right;\n      this.height = this.$chart.height() - margin.top - margin.bottom;\n\n      // Append SVG to chart element\n\n      var svg = {\n        width: this.width + (margin.left + margin.right),\n        height: this.height + (margin.top + margin.bottom),\n        translateX: this.orientation !== 'rtl' ? margin.left : margin.right,\n        translateY: margin.top,\n      };\n\n      this.svg = d3\n        .select(this.$chart.get(0))\n        .append('svg')\n        .attr('width', svg.width)\n        .attr('height', svg.height);\n\n      this.drawingArea = this.svg\n        .append('g')\n        .attr('transform', `translate(${svg.translateX},${svg.translateY})`);\n\n      // Draw elements\n\n      this.drawTicks();\n      this.drawAxes();\n      this.drawChart();\n      this.drawTipTriggers();\n    },\n\n    drawTicks: function () {\n      // Draw X ticks\n\n      var x = this.getX(true);\n      var xTicks = 3;\n      var xAxis = d3\n        .axisBottom(x)\n        .tickFormat(this.getXFormatter())\n        .ticks(xTicks);\n\n      this.drawingArea\n        .append('g')\n        .attr('class', 'x ticks-axis')\n        .attr('transform', `translate(0, ${this.height})`)\n        .call(xAxis);\n\n      // Draw Y ticks\n\n      var y = this.getY();\n      var yTicks = 2;\n      var yAxis;\n\n      if (this.orientation !== 'rtl') {\n        yAxis = d3\n          .axisLeft(y)\n          .tickFormat(this.getYFormatter())\n          .tickValues(this.getYTickValues())\n          .ticks(yTicks);\n\n        this.drawingArea.append('g').attr('class', 'y ticks-axis').call(yAxis);\n      } else {\n        yAxis = d3\n          .axisRight(y)\n          .tickFormat(this.getYFormatter())\n          .tickValues(this.getYTickValues())\n          .ticks(yTicks);\n\n        this.drawingArea\n          .append('g')\n          .attr('class', 'y ticks-axis')\n          .attr('transform', `translate(${this.width},0)`)\n          .call(yAxis);\n      }\n\n      // On after draw ticks\n\n      this.onAfterDrawTicks();\n    },\n\n    drawAxes: function () {\n      if (this.settings.xAxis.showAxis) {\n        var x = this.getX();\n        var xAxis = d3.axisBottom(x).ticks(0).tickSizeOuter(0);\n        this.drawingArea\n          .append('g')\n          .attr('class', 'x axis')\n          .attr('transform', `translate(0, ${this.height})`)\n          .call(xAxis);\n      }\n\n      if (this.settings.yAxis.showAxis) {\n        var y = this.getY();\n        var chartPadding = 0;\n        var yAxis;\n\n        if (this.orientation === 'rtl') {\n          yAxis = d3.axisLeft(y).ticks(0);\n          this.drawingArea\n            .append('g')\n            .attr('class', 'y axis')\n            .attr('transform', `translate(${this.width - chartPadding}, 0)`)\n            .call(yAxis);\n        } else {\n          yAxis = d3.axisRight(y).ticks(0);\n          this.drawingArea\n            .append('g')\n            .attr('class', 'y axis')\n            .attr('transform', `translate(${chartPadding}, 0)`)\n            .call(yAxis);\n        }\n      }\n    },\n\n    drawChart: function () {\n      var x = this.getX(true);\n      var y = this.getY();\n\n      // X & Y grid lines\n\n      if (this.settings.xAxis.gridlines) {\n        var xLineAxis = d3.axisBottom(x);\n\n        this.drawingArea\n          .append('g')\n          .attr('class', 'x grid-line')\n          .attr('transform', `translate(0,${this.height})`)\n          .call(xLineAxis.tickSize(-this.height, 0, 0).tickFormat(''));\n      }\n\n      var yTicks = 2;\n\n      if (this.settings.yAxis.gridlines) {\n        var yLineAxis = d3.axisLeft(y);\n\n        this.drawingArea\n          .append('g')\n          .attr('class', 'y grid-line')\n          .attr('transform', 'translate(0 , 0)')\n          .call(\n            yLineAxis\n              .tickSize(-this.width, 0)\n              .tickFormat('')\n              .tickValues(this.getYTickValues())\n              .ticks(yTicks)\n          );\n      }\n\n      // Line\n\n      var line = d3\n        .line()\n        .x(function (d) {\n          return x(d[0]);\n        })\n        .y(function (d) {\n          return y(d[1]);\n        });\n\n      this.drawingArea\n        .append('g')\n        .attr('class', 'chart-line')\n        .append('path')\n        .datum(this.dataTable.rows)\n        .style('fill', 'none')\n        .style('stroke', this.settings.colors[0])\n        .style('stroke-width', '3px')\n        .attr('d', line);\n\n      // Area\n\n      var area = d3\n        .area()\n        .x(function (d) {\n          return x(d[0]);\n        })\n        .y0(this.height)\n        .y1(function (d) {\n          return y(d[1]);\n        });\n\n      this.drawingArea\n        .append('g')\n        .attr('class', 'chart-area')\n        .append('path')\n        .datum(this.dataTable.rows)\n        .style('fill', this.settings.colors[0])\n        .style('fill-opacity', '0.3')\n        .attr('d', area);\n\n      // Plots\n\n      if (this.settings.plots) {\n        this.drawingArea\n          .append('g')\n          .attr('class', 'plots')\n          .selectAll('circle')\n          .data(this.dataTable.rows)\n          .enter()\n          .append('circle')\n          .style('fill', this.settings.colors[0])\n          .attr('class', (d, index) => `plot plot-${index}`)\n          .attr('r', 4)\n          .attr('cx', (d) => x(d[0]))\n          .attr('cy', (d) => y(d[1]));\n      }\n    },\n\n    drawTipTriggers: function () {\n      if (this.settings.tips) {\n        if (!this.tip) {\n          this.tip = new Craft.charts.Tip(this.$chart);\n        }\n\n        // Define xAxisTickInterval\n\n        var chartMargin = this.getChartMargin();\n        var tickSizeOuter = 6;\n        var length =\n          this.drawingArea.select('.x path.domain').node().getTotalLength() -\n          chartMargin.left -\n          chartMargin.right -\n          tickSizeOuter * 2;\n        var xAxisTickInterval = length / (this.dataTable.rows.length - 1);\n\n        // Tip trigger width\n\n        var tipTriggerWidth = Math.max(0, xAxisTickInterval);\n\n        // Draw triggers\n\n        var x = this.getX(true);\n        var y = this.getY();\n\n        this.drawingArea\n          .append('g')\n          .attr('class', 'tip-triggers')\n          .selectAll('rect')\n          .data(this.dataTable.rows)\n          .enter()\n          .append('rect')\n          .attr('class', 'tip-trigger')\n          .style('fill', 'transparent')\n          .style('fill-opacity', '1')\n          .attr('width', tipTriggerWidth)\n          .attr('height', this.height)\n          .attr('x', (d) => x(d[0]) - tipTriggerWidth / 2)\n          .on('mouseover', (d, index) => {\n            // Expand plot\n\n            this.drawingArea.select('.plot-' + index).attr('r', 5);\n\n            // Set tip content\n\n            var $content = $('<div />');\n            var $xValue = $('<div class=\"x-value\" />').appendTo($content);\n            var $yValue = $('<div class=\"y-value\" />').appendTo($content);\n\n            $xValue.html(this.getXFormatter()(d[0]));\n            $yValue.html(this.getYFormatter()(d[1]));\n\n            var content = $content.get(0);\n\n            this.tip.setContent(content);\n\n            // Set tip position\n\n            var margin = this.getChartMargin();\n\n            var offset = 24;\n            var top = y(d[1]) + offset;\n            var left;\n\n            if (this.orientation !== 'rtl') {\n              left = x(d[0]) + margin.left + offset;\n\n              var calcLeft =\n                this.$chart.offset().left + left + this.tip.$tip.width();\n              var maxLeft =\n                this.$chart.offset().left + this.$chart.width() - offset;\n\n              if (calcLeft > maxLeft) {\n                left = x(d[0]) - (this.tip.$tip.width() + offset);\n              }\n            } else {\n              left = x(d[0]) - (this.tip.$tip.width() + margin.left + offset);\n            }\n\n            if (left < 0) {\n              left = x(d[0]) + margin.left + offset;\n            }\n\n            var position = {\n              top: top,\n              left: left,\n            };\n\n            this.tip.setPosition(position);\n\n            // Show tip\n\n            this.tip.show();\n          })\n          .on('mouseout', (d, index) => {\n            // Unexpand Plot\n            this.drawingArea.select('.plot-' + index).attr('r', 4);\n\n            // Hide tip\n            this.tip.hide();\n          });\n      }\n    },\n\n    getChartMargin: function () {\n      var margin = this.settings.margin;\n\n      // Estimate the max width of y ticks and set it as the left margin\n\n      var values = this.getYTickValues();\n      var yTicksMaxWidth = 0;\n\n      $.each(values, (key, value) => {\n        var characterWidth = 8;\n\n        var formatter = this.getYFormatter();\n\n        var formattedValue = formatter(value);\n        var computedTickWidth = formattedValue.length * characterWidth;\n\n        if (computedTickWidth > yTicksMaxWidth) {\n          yTicksMaxWidth = computedTickWidth;\n        }\n      });\n\n      yTicksMaxWidth += 10;\n\n      margin.left = yTicksMaxWidth;\n\n      return margin;\n    },\n\n    getX: function (padded) {\n      var xDomainMin = d3.min(this.dataTable.rows, function (d) {\n        return d[0];\n      });\n\n      var xDomainMax = d3.max(this.dataTable.rows, function (d) {\n        return d[0];\n      });\n\n      var xDomain = [xDomainMin, xDomainMax];\n\n      if (this.orientation === 'rtl') {\n        xDomain = [xDomainMax, xDomainMin];\n      }\n\n      var left = 0;\n      var right = 0;\n\n      if (padded) {\n        left = 0;\n        right = 0;\n      }\n\n      var x = d3.scaleTime().range([left, this.width - right]);\n\n      x.domain(xDomain);\n\n      return x;\n    },\n\n    getY: function () {\n      var yDomain = [0, this.getYMaxValue()];\n\n      var y = d3.scaleLinear().range([this.height, 0]);\n\n      y.domain(yDomain);\n\n      return y;\n    },\n\n    getXFormatter: function () {\n      var formatter;\n\n      if (this.settings.xAxis.formatter !== $.noop) {\n        formatter = this.settings.xAxis.formatter(this);\n      } else {\n        formatter = Craft.charts.utils.getTimeFormatter(\n          this.timeFormatLocale,\n          this.settings\n        );\n      }\n\n      return formatter;\n    },\n\n    getYFormatter: function () {\n      var formatter;\n\n      if (this.settings.yAxis.formatter !== $.noop) {\n        formatter = this.settings.yAxis.formatter(this);\n      } else {\n        formatter = Craft.charts.utils.getNumberFormatter(\n          this.formatLocale,\n          this.dataTable.columns[1].type,\n          this.settings\n        );\n      }\n\n      return formatter;\n    },\n\n    getYMaxValue: function () {\n      return d3.max(this.dataTable.rows, function (d) {\n        return d[1];\n      });\n    },\n\n    getYTickValues: function () {\n      var maxValue = this.getYMaxValue();\n\n      if (maxValue > 1) {\n        return [maxValue / 2, maxValue];\n      } else {\n        return [0, maxValue];\n      }\n    },\n  },\n  {\n    defaults: {\n      chartClass: 'area',\n      margin: {top: 25, right: 5, bottom: 25, left: 0},\n      plots: true,\n      tips: true,\n      xAxis: {\n        gridlines: false,\n        showAxis: true,\n        formatter: $.noop,\n      },\n      yAxis: {\n        gridlines: true,\n        showAxis: false,\n        formatter: $.noop,\n      },\n    },\n  }\n);\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.Utils\n */\nCraft.charts.utils = {\n  getDuration: function (seconds) {\n    var secondsNum = parseInt(seconds, 10);\n\n    var duration = {\n      hours: Math.floor(secondsNum / 3600),\n      minutes: Math.floor((secondsNum - duration.hours * 3600) / 60),\n      seconds: secondsNum - duration.hours * 3600 - duration.minutes * 60,\n    };\n\n    if (duration.hours < 10) {\n      duration.hours = `0${duration.hours}`;\n    }\n\n    if (duration.minutes < 10) {\n      duration.minutes = `0${duration.minutes}`;\n    }\n\n    if (duration.seconds < 10) {\n      duration.seconds = `0${duration.seconds}`;\n    }\n\n    return `${duration.hours}:${duration.minutes}:${duration.seconds}`;\n  },\n\n  getTimeFormatter: function (timeFormatLocale, chartSettings) {\n    switch (chartSettings.dataScale) {\n      case 'year':\n        return timeFormatLocale.format('%Y');\n\n      case 'month':\n        return timeFormatLocale.format(\n          chartSettings.formats.shortDateFormats.month\n        );\n\n      case 'hour':\n        return timeFormatLocale.format(\n          `${chartSettings.formats.shortDateFormats.day} %H:00:00`\n        );\n\n      default:\n        return timeFormatLocale.format(\n          chartSettings.formats.shortDateFormats.day\n        );\n    }\n  },\n\n  getNumberFormatter: function (formatLocale, type, chartSettings) {\n    switch (type) {\n      case 'currency':\n        return formatLocale.format(chartSettings.formats.currencyFormat);\n\n      case 'percent':\n        return formatLocale.format(chartSettings.formats.percentFormat);\n\n      case 'time':\n        return Craft.charts.utils.getDuration;\n\n      case 'number':\n        return formatLocale.format(chartSettings.formats.numberFormat);\n    }\n  },\n};\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Color input\n */\nCraft.ColorInput = Garnish.Base.extend(\n  {\n    $container: null,\n    $input: null,\n    $colorContainer: null,\n    $colorPreview: null,\n    $colorInput: null,\n\n    init: function (container) {\n      this.$container = $(container);\n      this.$input = this.$container.find('.color-input');\n      this.$colorContainer = this.$container.children('.color');\n      this.$colorPreview = this.$colorContainer.children('.color-preview');\n\n      this.createColorInput();\n      this.handleTextChange();\n\n      this.addListener(this.$input, 'input', 'handleTextChange');\n    },\n\n    createColorInput: function () {\n      var input = document.createElement('input');\n      input.setAttribute('type', 'color');\n\n      if (input.type !== 'color') {\n        // The browser doesn't support input[type=color]\n        return;\n      }\n\n      this.$colorContainer.removeClass('static');\n      this.$colorInput = $(input)\n        .addClass('color-preview-input')\n        .attr({\n          'aria-controls': this.$input.attr('id'),\n          'aria-label': Craft.t('app', 'Color picker'),\n        })\n        .appendTo(this.$colorPreview);\n\n      this.addListener(this.$colorInput, 'click', function (ev) {\n        ev.stopPropagation();\n      });\n\n      this.addListener(this.$colorContainer, 'click', function () {\n        this.$colorInput.trigger('click');\n      });\n\n      this.addListener(this.$colorInput, 'input', 'updateColor');\n    },\n\n    updateColor: function () {\n      this.$input.val(this.$colorInput.val());\n      this.handleTextChange();\n    },\n\n    handleTextChange: function () {\n      let val = this.$input.val();\n\n      if (val !== (val = Craft.trim(val))) {\n        this.$input.val(val);\n      }\n\n      // Chop off the #\n      if (val.length && val[0] === '#') {\n        val = val.substring(1);\n        this.$input.val(val);\n      }\n\n      // If empty, set the preview to transparent\n      if (!val.length) {\n        this.$colorPreview.css('background-color', '');\n        return;\n      }\n\n      // Now normalize it for the UI stuff\n      if (val.length === 3) {\n        val = val[0].repeat(2) + val[1].repeat(2) + val[2].repeat(2);\n      }\n\n      if (val.match(/^[0-9a-f]{6}$/i)) {\n        this.$colorPreview.css('background-color', `#${val}`);\n        if (this.$colorInput) {\n          this.$colorInput.val(`#${val}`);\n        }\n      } else {\n        this.$colorPreview.css('background-color', '');\n      }\n    },\n  },\n  {\n    _browserSupportsColorInputs: null,\n\n    doesBrowserSupportColorInputs: function () {\n      if (Craft.ColorInput._browserSupportsColorInputs === null) {\n      }\n\n      return Craft.ColorInput._browserSupportsColorInputs;\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * CP Screen Slideout\n */\nCraft.CpScreenSlideout = Craft.Slideout.extend(\n  {\n    action: null,\n\n    namespace: null,\n\n    showingLoadSpinner: false,\n    hasTabs: false,\n    hasCpLink: false,\n    hasSidebar: false,\n\n    $header: null,\n    $toolbar: null,\n    $tabContainer: null,\n    $loadSpinner: null,\n    $editLink: null,\n    $sidebarBtn: null,\n\n    $body: null,\n    $content: null,\n\n    $sidebar: null,\n\n    $footer: null,\n    $noticeContainer: null,\n    $cancelBtn: null,\n    $saveBtn: null,\n\n    tabManager: null,\n    showingSidebar: false,\n\n    cancelToken: null,\n    ignoreFailedRequest: false,\n    fieldsWithErrors: null,\n\n    init: function (action, settings) {\n      this.action = action;\n      this.setSettings(settings, Craft.CpScreenSlideout.defaults);\n\n      this.fieldsWithErrors = [];\n\n      // Header\n      this.$header = $('<header/>', {class: 'pane-header'});\n      this.$toolbar = $('<div/>', {class: 'so-toolbar'}).appendTo(this.$header);\n      this.$tabContainer = $('<div/>', {class: 'pane-tabs'}).appendTo(\n        this.$toolbar\n      );\n      this.$loadSpinner = $('<div/>', {\n        class: 'spinner',\n        title: Craft.t('app', 'Loading'),\n        'aria-label': Craft.t('app', 'Loading'),\n      }).appendTo(this.$toolbar);\n      this.$editLink = $('<a/>', {\n        target: '_blank',\n        class: 'btn header-btn hidden',\n        title: Craft.t('app', 'Open the full edit page in a new tab'),\n        'aria-label': Craft.t('app', 'Open the full edit page in a new tab'),\n        'data-icon': 'external',\n      }).appendTo(this.$toolbar);\n      this.$sidebarBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn header-btn hidden sidebar-btn',\n        title: Craft.t('app', 'Show sidebar'),\n        'aria-label': Craft.t('app', 'Show sidebar'),\n        'data-icon': `sidebar-${Garnish.ltr ? 'right' : 'left'}`,\n        'aria-expanded': 'false',\n      }).appendTo(this.$toolbar);\n\n      this.addListener(this.$sidebarBtn, 'click', (ev) => {\n        ev.preventDefault();\n        if (!this.showingSidebar) {\n          this.showSidebar();\n        } else {\n          this.hideSidebar();\n        }\n      });\n\n      // Body\n      this.$body = $('<div/>', {class: 'so-body'});\n\n      // Content\n      this.$content = $('<div/>', {class: 'so-content'}).appendTo(this.$body);\n\n      // Sidebar\n      this.$sidebar = $('<div/>', {\n        class: 'so-sidebar details hidden',\n      }).appendTo(this.$body);\n\n      // Footer\n      this.$footer = $('<div/>', {class: 'so-footer hidden'});\n      this.$noticeContainer = $('<div/>', {class: 'so-notice'}).appendTo(\n        this.$footer\n      );\n      $('<div/>', {class: 'flex-grow'}).appendTo(this.$footer);\n      const $btnContainer = $('<div/>', {class: 'flex flex-nowrap'}).appendTo(\n        this.$footer\n      );\n      this.$cancelBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn',\n        text: Craft.t('app', 'Cancel'),\n      }).appendTo($btnContainer);\n      this.$saveBtn = Craft.ui\n        .createSubmitButton({\n          label: Craft.t('app', 'Save'),\n          spinner: true,\n        })\n        .appendTo($btnContainer);\n\n      let $contents = this.$header.add(this.$body).add(this.$footer);\n\n      this.base($contents, {\n        containerElement: 'form',\n        containerAttributes: {\n          id: `cp-screen-${Math.floor(Math.random() * 100000000)}`,\n          action: '',\n          method: 'post',\n          novalidate: '',\n          class: 'cp-screen',\n        },\n        closeOnEsc: false,\n        closeOnShadeClick: false,\n      });\n\n      this.$container.data('cpScreen', this);\n      this.on('beforeClose', () => {\n        this.hideSidebar();\n      });\n\n      // Register shortcuts & events\n      Garnish.uiLayerManager.registerShortcut(\n        {\n          keyCode: Garnish.S_KEY,\n          ctrl: true,\n        },\n        (ev) => {\n          this.handleSubmit(ev);\n        }\n      );\n      Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n        this.closeMeMaybe();\n      });\n      this.addListener(this.$cancelBtn, 'click', () => {\n        this.closeMeMaybe();\n      });\n      this.addListener(this.$shade, 'click', () => {\n        this.closeMeMaybe();\n      });\n      this.addListener(this.$container, 'click', (ev) => {\n        const $target = $(event.target);\n\n        if (\n          this.showingSidebar &&\n          !$target.closest(this.$sidebarBtn).length &&\n          !$target.closest(this.$sidebar).length\n        ) {\n          this.hideSidebar();\n        }\n      });\n      this.addListener(this.$container, 'submit', 'handleSubmit');\n\n      this.load();\n    },\n\n    /**\n     * @param {Object} [data={}]\n     * @param {boolean} [refreshInitialData=true]\n     * @returns {Promise}\n     */\n    load: function (data, refreshInitialData) {\n      return new Promise((resolve, reject) => {\n        this.trigger('beforeLoad');\n        this.showLoadSpinner();\n\n        if (this.cancelToken) {\n          this.ignoreFailedRequest = true;\n          this.cancelToken.cancel();\n        }\n\n        this.cancelToken = axios.CancelToken.source();\n\n        Craft.sendActionRequest(\n          'GET',\n          this.action,\n          $.extend(\n            {\n              params: Object.assign({}, this.getParams(), this.settings.params),\n              cancelToken: this.cancelToken.token,\n              headers: {\n                'X-Craft-Container-Id': this.$container.attr('id'),\n              },\n            },\n            this.settings.requestOptions\n          )\n        )\n          .then((response) => {\n            this.update(response.data)\n              .then(() => {\n                if (refreshInitialData !== false) {\n                  this.$container.data('delta-names', response.data.deltaNames);\n                  this.$container.data(\n                    'initial-delta-values',\n                    response.data.initialDeltaValues\n                  );\n                  this.$container.data(\n                    'initialSerializedValue',\n                    this.$container.serialize()\n                  );\n                }\n                resolve();\n              })\n              .catch((e) => {\n                reject(e);\n              });\n          })\n          .catch((e) => {\n            if (!this.ignoreFailedRequest) {\n              Craft.cp.displayError();\n              reject(e);\n            }\n            this.ignoreFailedRequest = false;\n          })\n          .finally(() => {\n            this.hideLoadSpinner();\n            this.cancelToken = null;\n          });\n      });\n    },\n\n    getParams: function () {\n      return {};\n    },\n\n    updateHeaderVisibility: function () {\n      // Should the header be shown regardless of viewport size?\n      const forceShow =\n        this.settings.showHeader ||\n        this.hasTabs ||\n        this.hasCpLink ||\n        this.showingLoadSpinner;\n\n      if (forceShow || this.hasSidebar) {\n        this.$header.removeClass('hidden');\n      } else {\n        this.$header.addClass('hidden');\n      }\n\n      if (forceShow) {\n        this.$header.addClass('so-visible');\n      } else {\n        this.$header.removeClass('so-visible');\n      }\n    },\n\n    showLoadSpinner: function () {\n      this.$loadSpinner.removeClass('hidden');\n      this.showingLoadSpinner = true;\n      this.updateHeaderVisibility();\n    },\n\n    hideLoadSpinner: function () {\n      this.$loadSpinner.addClass('hidden');\n      this.showingLoadSpinner = false;\n      this.updateHeaderVisibility();\n    },\n\n    /**\n     * @param {Object} data\n     * @returns {Promise}\n     */\n    update: function (data) {\n      return new Promise((resolve) => {\n        this.namespace = data.namespace;\n        this.$content.html(data.content);\n\n        if (data.submitButtonLabel) {\n          this.$saveBtn.text(data.submitButtonLabel);\n        }\n\n        this.updateTabs(data.tabs);\n\n        if (data.formAttributes) {\n          Craft.setElementAttributes(this.$container, data.formAttributes);\n        }\n\n        if (data.editUrl) {\n          this.$editLink.removeClass('hidden').attr('href', data.editUrl);\n          this.hasCpLink = true;\n        } else {\n          this.$editLink.addClass('hidden');\n          this.hasCpLink = false;\n        }\n\n        if (data.sidebar) {\n          this.$container.addClass('has-sidebar');\n          this.$sidebarBtn.removeClass('hidden');\n          this.$sidebar.html(data.sidebar);\n\n          // Open outbound links in new windows\n          this.$sidebar.find('a').each(function () {\n            if (\n              this.hostname.length &&\n              typeof $(this).attr('target') === 'undefined'\n            ) {\n              $(this).attr('target', '_blank');\n            }\n          });\n\n          this.hasSidebar = true;\n        } else {\n          this.$container.removeClass('has-sidebar');\n          this.$sidebarBtn.addClass('hidden');\n          this.$sidebar.addClass('hidden').html('');\n          this.hasSidebar = false;\n        }\n\n        if (data.notice) {\n          this.$noticeContainer.html(data.notice);\n        } else {\n          this.$noticeContainer.empty();\n        }\n\n        this.updateHeaderVisibility();\n        this.$footer.removeClass('hidden');\n\n        Garnish.requestAnimationFrame(() => {\n          Craft.appendHeadHtml(data.headHtml);\n          Craft.appendBodyHtml(data.bodyHtml);\n\n          Craft.initUiElements(this.$content);\n          new Craft.ElementThumbLoader().load($(this.$content));\n\n          if (data.sidebar) {\n            Craft.initUiElements(this.$sidebar);\n            new Craft.ElementThumbLoader().load(this.$sidebar);\n          }\n\n          if (!Garnish.isMobileBrowser()) {\n            Craft.setFocusWithin(this.$content);\n          }\n\n          resolve();\n          this.trigger('load');\n        });\n      });\n    },\n\n    updateTabs: function (tabs) {\n      if (this.tabManager) {\n        this.tabManager.destroy();\n        this.tabManager = null;\n        this.$tabContainer.html('');\n      }\n\n      this.hasTabs = !!tabs;\n\n      if (this.hasTabs) {\n        const $tabContainer = $(tabs);\n        this.$tabContainer.replaceWith($tabContainer);\n        this.$tabContainer = $tabContainer;\n        this.tabManager = new Craft.Tabs(this.$tabContainer);\n        this.tabManager.on('deselectTab', (ev) => {\n          $(ev.$tab.attr('href')).addClass('hidden');\n        });\n        this.tabManager.on('selectTab', (ev) => {\n          $(ev.$tab.attr('href')).removeClass('hidden');\n          Garnish.$win.trigger('resize');\n          this.$body.trigger('scroll');\n        });\n      }\n    },\n\n    showSidebar: function () {\n      if (this.showingSidebar) {\n        return;\n      }\n\n      this.$body.scrollTop(0).addClass('no-scroll');\n\n      this.$sidebar\n        .off('transitionend.so')\n        .css(this._closedSidebarStyles())\n        .removeClass('hidden');\n\n      // Hack to force CSS animations\n      this.$sidebar[0].offsetWidth;\n\n      this.$sidebar.css(this._openedSidebarStyles());\n\n      if (!Garnish.isMobileBrowser()) {\n        this.$sidebar.one('transitionend.so', () => {\n          Craft.setFocusWithin(this.$sidebar);\n        });\n      }\n\n      Craft.trapFocusWithin(this.$sidebar);\n\n      this.$sidebarBtn.addClass('active').attr({\n        'aria-expanded': 'true',\n      });\n\n      Garnish.$win.trigger('resize');\n      this.$sidebar.trigger('scroll');\n\n      Garnish.uiLayerManager.addLayer();\n      Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n        this.hideSidebar();\n      });\n\n      this.showingSidebar = true;\n    },\n\n    hideSidebar: function () {\n      if (!this.showingSidebar) {\n        return;\n      }\n\n      this.$body.removeClass('no-scroll');\n\n      this.$sidebar\n        .off('transitionend.so')\n        .css(this._closedSidebarStyles())\n        .one('transitionend.so', () => {\n          this.$sidebar.addClass('hidden');\n          this.$sidebarBtn.focus();\n        });\n\n      this.$sidebarBtn.removeClass('active').attr({\n        'aria-expanded': 'false',\n      });\n\n      Garnish.uiLayerManager.removeLayer();\n\n      this.showingSidebar = false;\n    },\n\n    _openedSidebarStyles: function () {\n      return {\n        [Garnish.ltr ? 'right' : 'left']: '0',\n      };\n    },\n\n    _closedSidebarStyles: function () {\n      return {\n        [Garnish.ltr ? 'right' : 'left']: '-350px',\n      };\n    },\n\n    showSubmitSpinner: function () {\n      this.$saveBtn.addClass('loading');\n    },\n\n    hideSubmitSpinner: function () {\n      this.$saveBtn.removeClass('loading');\n    },\n\n    handleSubmit: function (ev) {\n      ev.preventDefault();\n      this.submit();\n    },\n\n    submit: function () {\n      this.showSubmitSpinner();\n\n      const data = Craft.findDeltaData(\n        this.$container.data('initialSerializedValue'),\n        this.$container.serialize(),\n        this.$container.data('delta-names'),\n        null,\n        this.$container.data('initial-delta-values')\n      );\n\n      Craft.sendActionRequest('POST', null, {\n        data,\n        headers: {\n          'X-Craft-Namespace': this.namespace,\n        },\n      })\n        .then((response) => {\n          this.handleSubmitResponse(response);\n        })\n        .catch((error) => {\n          this.handleSubmitError(error);\n        })\n        .finally(() => {\n          this.hideSubmitSpinner();\n        });\n    },\n\n    handleSubmitResponse: function (response) {\n      this.clearErrors();\n      const data = response.data || {};\n      if (data.message) {\n        Craft.cp.displaySuccess(data.message, data.notificationSettings);\n      }\n      this.trigger('submit', {\n        response: response,\n        data: (data.modelName && data[data.modelName]) || {},\n      });\n      if (this.settings.closeOnSubmit) {\n        this.close();\n      }\n    },\n\n    handleSubmitError: function (error) {\n      if (\n        !error.isAxiosError ||\n        !error.response ||\n        !error.response.status === 400\n      ) {\n        Craft.cp.displayError();\n        throw error;\n      }\n\n      const data = error.response.data || {};\n      Craft.cp.displayError(data.message);\n      if (data.errors) {\n        this.showErrors(data.errors);\n      }\n    },\n\n    /**\n     * @param {string[]} errors\n     */\n    showErrors: function (errors) {\n      this.clearErrors();\n\n      Object.entries(errors).forEach(([name, fieldErrors]) => {\n        const $field = this.$container.find(`[data-attribute=\"${name}\"]`);\n        if ($field) {\n          Craft.ui.addErrorsToField($field, fieldErrors);\n          this.fieldsWithErrors.push($field);\n        }\n      });\n    },\n\n    clearErrors: function () {\n      this.fieldsWithErrors.forEach(($field) => {\n        Craft.ui.clearErrorsFromField($field);\n      });\n    },\n\n    isDirty: function () {\n      return (\n        typeof this.$container.data('initialSerializedValue') !== 'undefined' &&\n        this.$container.serialize() !==\n          this.$container.data('initialSerializedValue')\n      );\n    },\n\n    closeMeMaybe: function () {\n      if (!this.isOpen) {\n        return;\n      }\n\n      if (\n        !this.isDirty() ||\n        confirm(\n          Craft.t(\n            'app',\n            'Are you sure you want to close this screen? Any changes will be lost.'\n          )\n        )\n      ) {\n        this.close();\n      }\n    },\n\n    close: function () {\n      this.base();\n\n      if (this.cancelToken) {\n        this.ignoreFailedRequest = true;\n        this.cancelToken.cancel();\n      }\n    },\n  },\n  {\n    defaults: {\n      params: {},\n      requestOptions: {},\n      showHeader: null,\n      closeOnSubmit: true,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n// Use old jQuery prefilter behavior\n// see https://jquery.com/upgrade-guide/3.5/\nvar rxhtmlTag =\n  /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi;\njQuery.htmlPrefilter = function (html) {\n  return html.replace(rxhtmlTag, '<$1></$2>');\n};\n\n// Set all the standard Craft.* stuff\n$.extend(Craft, {\n  navHeight: 48,\n\n  /**\n   * @callback indexKeyCallback\n   * @param {Object} currentValue\n   * @param {number} [index]\n   * @returns {string}\n   */\n  /**\n   * Indexes an array of objects by a specified key\n   *\n   * @param {Object[]} arr\n   * @param {(string|indexKeyCallback)} key\n   */\n  index: function (arr, key) {\n    if (!$.isArray(arr)) {\n      throw 'The first argument passed to Craft.index() must be an array.';\n    }\n\n    return arr.reduce((index, obj, i) => {\n      index[typeof key === 'string' ? obj[key] : key(obj, i)] = obj;\n      return index;\n    }, {});\n  },\n\n  /**\n   * Groups an array of objects by a specified key\n   *\n   * @param {Object[]} arr\n   * @param {(string|indexKeyCallback)} key\n   */\n  group: function (arr, key) {\n    if (!$.isArray(arr)) {\n      throw 'The first argument passed to Craft.group() must be an array.';\n    }\n\n    let index = {};\n\n    return arr.reduce((grouped, obj, i) => {\n      const thisKey = typeof key === 'string' ? obj[key] : key(obj, i);\n      if (!index.hasOwnProperty(thisKey)) {\n        index[thisKey] = [[], thisKey];\n        grouped.push(index[thisKey]);\n      }\n      index[thisKey][0].push(obj);\n      return grouped;\n    }, []);\n  },\n\n  /**\n   * Get a translated message.\n   *\n   * @param {string} category\n   * @param {string} message\n   * @param {Object} params\n   * @returns {string}\n   */\n  t: function (category, message, params) {\n    if (\n      typeof Craft.translations[category] !== 'undefined' &&\n      typeof Craft.translations[category][message] !== 'undefined'\n    ) {\n      message = Craft.translations[category][message];\n    }\n\n    if (params) {\n      return this.formatMessage(message, params);\n    }\n\n    return message;\n  },\n\n  formatMessage: function (pattern, args) {\n    let tokens;\n    if ((tokens = this._tokenizePattern(pattern)) === false) {\n      throw 'Message pattern is invalid.';\n    }\n    for (let i = 0; i < tokens.length; i++) {\n      let token = tokens[i];\n      if (typeof token === 'object') {\n        if ((tokens[i] = this._parseToken(token, args)) === false) {\n          throw 'Message pattern is invalid.';\n        }\n      }\n    }\n    return tokens.join('');\n  },\n\n  _tokenizePattern: function (pattern) {\n    let depth = 1,\n      start,\n      pos;\n    // Get an array of the string characters (factoring in 3+ byte chars)\n    const chars = [...pattern];\n    if ((start = pos = chars.indexOf('{')) === -1) {\n      return [pattern];\n    }\n    let tokens = [chars.slice(0, pos).join('')];\n    while (true) {\n      let open = chars.indexOf('{', pos + 1);\n      let close = chars.indexOf('}', pos + 1);\n      if (open === -1) {\n        open = false;\n      }\n      if (close === -1) {\n        close = false;\n      }\n      if (open === false && close === false) {\n        break;\n      }\n      if (open === false) {\n        open = chars.length;\n      }\n      if (close > open) {\n        depth++;\n        pos = open;\n      } else {\n        depth--;\n        pos = close;\n      }\n      if (depth === 0) {\n        tokens.push(\n          chars\n            .slice(start + 1, pos)\n            .join('')\n            .split(',', 3)\n        );\n        start = pos + 1;\n        tokens.push(chars.slice(start, open).join(''));\n        start = open;\n      }\n\n      if (depth !== 0 && (open === false || close === false)) {\n        break;\n      }\n    }\n    if (depth !== 0) {\n      return false;\n    }\n\n    return tokens;\n  },\n\n  _parseToken: function (token, args) {\n    // parsing pattern based on ICU grammar:\n    // http://icu-project.org/apiref/icu4c/classMessageFormat.html#details\n    const param = Craft.trim(token[0]);\n    if (typeof args[param] === 'undefined') {\n      return `{${token.join(',')}}`;\n    }\n    const arg = args[param];\n    const type =\n      typeof token[1] !== 'undefined' ? Craft.trim(token[1]) : 'none';\n    switch (type) {\n      case 'number':\n        return (() => {\n          let format =\n            typeof token[2] !== 'undefined' ? Craft.trim(token[2]) : null;\n          if (format !== null && format !== 'integer') {\n            throw `Message format 'number' is only supported for integer values.`;\n          }\n          let number = Craft.formatNumber(arg);\n          let pos;\n          if (format === null && (pos = `${arg}`.indexOf('.')) !== -1) {\n            number += `.${arg.substring(pos + 1)}`;\n          }\n          return number;\n        })();\n      case 'none':\n        return arg;\n      case 'select':\n        return (() => {\n          /* http://icu-project.org/apiref/icu4c/classicu_1_1SelectFormat.html\n                        selectStyle = (selector '{' message '}')+\n                        */\n          if (typeof token[2] === 'undefined') {\n            return false;\n          }\n          let select = this._tokenizePattern(token[2]);\n          let c = select.length;\n          let message = false;\n          for (let i = 0; i + 1 < c; i++) {\n            if (Garnish.isArray(select[i]) || !Garnish.isArray(select[i + 1])) {\n              return false;\n            }\n            let selector = Craft.trim(select[i++]);\n            if (\n              (message === false && selector === 'other') ||\n              selector == arg\n            ) {\n              message = select[i].join(',');\n            }\n          }\n          if (message === false) {\n            return false;\n          }\n          return this.formatMessage(message, args);\n        })();\n      case 'plural':\n        return (() => {\n          /* http://icu-project.org/apiref/icu4c/classicu_1_1PluralFormat.html\n                        pluralStyle = [offsetValue] (selector '{' message '}')+\n                        offsetValue = \"offset:\" number\n                        selector = explicitValue | keyword\n                        explicitValue = '=' number  // adjacent, no white space in between\n                        keyword = [^[[:Pattern_Syntax:][:Pattern_White_Space:]]]+\n                        message: see MessageFormat\n                        */\n          if (typeof token[2] === 'undefined') {\n            return false;\n          }\n          let plural = this._tokenizePattern(token[2]);\n          const c = plural.length;\n          let message = false;\n          let offset = 0;\n          for (let i = 0; i + 1 < c; i++) {\n            if (\n              typeof plural[i] === 'object' ||\n              typeof plural[i + 1] !== 'object'\n            ) {\n              return false;\n            }\n            let selector = Craft.trim(plural[i++]);\n            let selectorChars = [...selector];\n\n            if (i === 1 && selector.substring(0, 7) === 'offset:') {\n              let pos = [...selector.replace(/[\\n\\r\\t]/g, ' ')].indexOf(' ', 7);\n              if (pos === -1) {\n                throw 'Message pattern is invalid.';\n              }\n              offset = parseInt(\n                Craft.trim(selectorChars.slice(7, pos).join(''))\n              );\n              selector = Craft.trim(\n                selectorChars\n                  .slice(pos + 1, pos + 1 + selectorChars.length)\n                  .join('')\n              );\n            }\n            if (\n              (message === false && selector === 'other') ||\n              (selector[0] === '=' &&\n                parseInt(\n                  selectorChars.slice(1, 1 + selectorChars.length).join('')\n                ) === arg) ||\n              (selector === 'one' && arg - offset === 1)\n            ) {\n              message = (\n                typeof plural[i] === 'string' ? [plural[i]] : plural[i]\n              )\n                .map((p) => {\n                  return p.replace('#', arg - offset);\n                })\n                .join(',');\n            }\n          }\n          if (message === false) {\n            return false;\n          }\n          return this.formatMessage(message, args);\n        })();\n      default:\n        throw `Message format '${type}' is not supported.`;\n    }\n  },\n\n  formatDate: function (date) {\n    if (typeof date !== 'object') {\n      date = new Date(date);\n    }\n\n    return $.datepicker.formatDate(Craft.datepickerOptions.dateFormat, date);\n  },\n\n  /**\n   * Formats a number.\n   *\n   * @param {string} number\n   * @param {string} [format] D3 format\n   * @returns {string}\n   */\n  formatNumber: function (number, format) {\n    if (typeof format == 'undefined') {\n      format = ',.0f';\n    }\n\n    var formatter = d3.formatLocale(d3FormatLocaleDefinition).format(format);\n\n    return formatter(number);\n  },\n\n  /**\n   * @param {string} key\n   * @param {boolean} shift\n   * @param {boolean} alt\n   */\n  shortcutText: function (key, shift, alt) {\n    if (Craft.clientOs === 'Mac') {\n      return (alt ? '⌥' : '') + (shift ? '⇧' : '') + '⌘' + key;\n    }\n    return 'Ctrl+' + (alt ? 'Alt+' : '') + (shift ? 'Shift+' : '') + key;\n  },\n\n  /**\n   * Escapes some HTML.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  escapeHtml: function (str) {\n    return $('<div/>').text(str).html();\n  },\n\n  /**\n   * Escapes special regular expression characters.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  escapeRegex: function (str) {\n    // h/t https://stackoverflow.com/a/9310752\n    return str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n  },\n\n  /**\n   * Returns the text in a string that might contain HTML tags.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  getText: function (str) {\n    return $('<div/>').html(str).text();\n  },\n\n  /**\n   * Encodes a URI copmonent. Mirrors PHP's rawurlencode().\n   *\n   * @param {string} str\n   * @returns {string}\n   * @see http://stackoverflow.com/questions/1734250/what-is-the-equivalent-of-javascripts-encodeuricomponent-in-php\n   */\n  encodeUriComponent: function (str) {\n    str = encodeURIComponent(str);\n\n    var differences = {\n      '!': '%21',\n      '*': '%2A',\n      \"'\": '%27',\n      '(': '%28',\n      ')': '%29',\n    };\n\n    for (var chr in differences) {\n      var re = new RegExp('\\\\' + chr, 'g');\n      str = str.replace(re, differences[chr]);\n    }\n\n    return str;\n  },\n\n  /**\n   * Selects the full value of a given text input.\n   *\n   * @param {(jQuery|HTMLElement|string)} input\n   */\n  selectFullValue: function (input) {\n    var $input = $(input);\n    var val = $input.val();\n\n    // Does the browser support setSelectionRange()?\n    if (typeof $input[0].setSelectionRange !== 'undefined') {\n      // Select the whole value\n      var length = val.length * 2;\n      $input[0].setSelectionRange(0, length);\n    } else {\n      // Refresh the value to get the cursor positioned at the end\n      $input.val(val);\n    }\n  },\n\n  /**\n   * Formats an ID out of an input name.\n   *\n   * @param {string} inputName\n   * @returns {string}\n   */\n  formatInputId: function (inputName) {\n    return this.rtrim(inputName.replace(/[^\\w\\-]+/g, '-'), '-');\n  },\n\n  /**\n   * @param {string} [path]\n   * @param {(Object|string)} [params]\n   * @param {string} [baseUrl]\n   * @returns {string}\n   */\n  getUrl: function (path, params, baseUrl) {\n    if (typeof path !== 'string') {\n      path = '';\n    }\n\n    // Normalize the params\n    let anchor = null;\n    if ($.isPlainObject(params)) {\n      if (typeof params['#'] !== 'undefined') {\n        anchor = params['#'];\n        delete params['#'];\n      }\n    } else if (typeof params === 'string') {\n      let anchorPos = params.indexOf('#');\n      if (anchorPos !== -1) {\n        anchor = params.substring(anchorPos + 1);\n        params = params.substring(0, anchorPos);\n      }\n      params = Object.fromEntries(new URLSearchParams(params).entries());\n    } else {\n      params = {};\n    }\n\n    // Was there already an anchor on the path?\n    let anchorPos = path.indexOf('#');\n    if (anchorPos !== -1) {\n      // Only keep it if the params didn't specify a new anchor\n      if (!anchor) {\n        anchor = path.substring(anchorPos + 1);\n      }\n      path = path.substring(0, anchorPos);\n    }\n\n    // Were there already any query string params in the path?\n    let qsPos = path.indexOf('?');\n    if (qsPos !== -1) {\n      params = $.extend(\n        Object.fromEntries(\n          new URLSearchParams(path.substring(qsPos + 1)).entries()\n        ),\n        params\n      );\n      path = path.substring(0, qsPos);\n    }\n\n    // Return path if it appears to be an absolute URL.\n    if (path.search('://') !== -1 || path[0] === '/') {\n      return (\n        path +\n        (!$.isEmptyObject(params) ? `?${$.param(params)}` : '') +\n        (anchor ? `#${anchor}` : '')\n      );\n    }\n\n    path = Craft.trim(path, '/');\n\n    // Put it all together\n    let url;\n\n    if (baseUrl) {\n      url = baseUrl;\n\n      if (path && Craft.pathParam) {\n        // Does baseUrl already contain a path?\n        var pathMatch = url.match(\n          new RegExp('[&?]' + Craft.escapeRegex(Craft.pathParam) + '=[^&]+')\n        );\n        if (pathMatch) {\n          url = url.replace(\n            pathMatch[0],\n            Craft.rtrim(pathMatch[0], '/') + '/' + path\n          );\n          path = '';\n        }\n      }\n    } else {\n      url = Craft.baseUrl;\n    }\n\n    // Does the base URL already have a query string?\n    qsPos = url.indexOf('?');\n    if (qsPos !== -1) {\n      params = $.extend(\n        Object.fromEntries(\n          new URLSearchParams(url.substring(qsPos + 1)).entries()\n        ),\n        params\n      );\n      url = url.substring(0, qsPos);\n    }\n\n    if (!Craft.omitScriptNameInUrls && path) {\n      if (Craft.usePathInfo || !Craft.pathParam) {\n        // Make sure that the script name is in the URL\n        if (url.search(Craft.scriptName) === -1) {\n          url = Craft.rtrim(url, '/') + '/' + Craft.scriptName;\n        }\n      } else {\n        // Move the path into the query string params\n\n        // Is the path param already set?\n        if (typeof params[Craft.pathParam] !== 'undefined') {\n          let basePath = Craft.rtrim(params[Craft.pathParam]);\n          path = basePath + (path ? '/' + path : '');\n        }\n\n        params[Craft.pathParam] = path;\n        path = null;\n      }\n    }\n\n    if (path) {\n      url = Craft.rtrim(url, '/') + '/' + path;\n    }\n\n    if (!$.isEmptyObject(params)) {\n      url += `?${$.param(params)}`;\n    }\n\n    if (anchor) {\n      url += `#${anchor}`;\n    }\n\n    return url;\n  },\n\n  /**\n   * @param {string} [path]\n   * @param {(Object|string)} [params]\n   * @returns {string}\n   */\n  getCpUrl: function (path, params) {\n    return this.getUrl(path, params, Craft.baseCpUrl);\n  },\n\n  /**\n   * @param {string} [path]\n   * @param {(Object|string)} [params]\n   * @returns {string}\n   */\n  getSiteUrl: function (path, params) {\n    return this.getUrl(path, params, Craft.baseSiteUrl);\n  },\n\n  /**\n   * Returns an action URL.\n   *\n   * @param {string} action\n   * @param {(Object|string)} [params]\n   * @returns {string}\n   */\n  getActionUrl: function (action, params) {\n    return Craft.getUrl(action, params, Craft.actionUrl);\n  },\n\n  /**\n   * Redirects the window to a given URL.\n   *\n   * @param {string} url\n   */\n  redirectTo: function (url) {\n    document.location.href = this.getUrl(url);\n  },\n\n  /**\n   * Replaces the page’s current URL.\n   *\n   * The location hash will be left intact, unless the given URL specifies one.\n   *\n   * @param {string} url\n   */\n  setUrl: function (url) {\n    if (typeof history === 'undefined') {\n      return;\n    }\n\n    if (!url.match(/#/)) {\n      url += document.location.hash;\n    }\n\n    history.replaceState({}, '', url);\n  },\n\n  /**\n   * Replaces the page’s current URL based on the given path, leaving the current query string and hash intact.\n   *\n   * @param {string} path\n   */\n  setPath: function (path) {\n    this.path = path;\n    this.setUrl(Craft.getUrl(path, document.location.search));\n  },\n\n  /**\n   * Replaces the page’s current URL based on the given query param name and value, leaving the current URI, other query params, and hash intact.\n   *\n   * @param {string} name\n   * @param {*} value\n   */\n  setQueryParam(name, value) {\n    const baseUrl = document.location.origin + document.location.pathname;\n    const params = this.getQueryParams();\n\n    if (typeof value !== 'undefined' && value !== null && value !== false) {\n      params[name] = value;\n    } else {\n      delete params[name];\n    }\n\n    this.setUrl(Craft.getUrl(baseUrl, params));\n  },\n\n  /**\n   * Returns the current URL with a certain page added to it.\n   *\n   * @param {int} page\n   * @returns {string}\n   */\n  getPageUrl: function (page) {\n    let url = document.location.origin + document.location.pathname;\n    url = Craft.rtrim(url, '/');\n\n    let qs = document.location.search\n      ? document.location.search.substring(1)\n      : '';\n\n    // query string-based pagination?\n    if (Craft.pageTrigger[0] === '?') {\n      const pageParam = Craft.pageTrigger.substring(1);\n      // remove the existing page param\n      if (document.location.search) {\n        const params = Object.fromEntries(new URLSearchParams(qs).entries());\n        delete params[pageParam];\n        qs = $.param(params);\n      }\n      if (page !== 1) {\n        qs += (qs !== '' ? '&' : '') + `${pageParam}=${page}`;\n      }\n    } else {\n      // Remove the existing page segment(s)\n      url = url.replace(\n        new RegExp('/' + Craft.escapeRegex(Craft.pageTrigger) + '\\\\d+$'),\n        ''\n      );\n\n      if (page !== 1) {\n        url += `/${Craft.pageTrigger}${page}`;\n      }\n    }\n\n    return url + (qs ? `?${qs}` : '') + document.location.hash;\n  },\n\n  /**\n   * Returns a hidden CSRF token input, if CSRF protection is enabled.\n   *\n   * @returns {string}\n   */\n  getCsrfInput: function () {\n    if (Craft.csrfTokenName) {\n      return (\n        '<input type=\"hidden\" name=\"' +\n        Craft.csrfTokenName +\n        '\" value=\"' +\n        Craft.csrfTokenValue +\n        '\"/>'\n      );\n    } else {\n      return '';\n    }\n  },\n\n  /**\n   * @callback postActionRequestCallback\n   * @param {?Object} response\n   * @param {string} textStatus\n   * @param {Object} jqXHR\n   */\n  /**\n   * Posts an action request to the server.\n   *\n   * @param {string} action\n   * @param {Object} [data]\n   * @param {postActionRequestCallback} [callback]\n   * @param {Object} [options]\n   * @returns {Object}\n   * @deprecated in 3.4.6. sendActionRequest() should be used instead\n   */\n  postActionRequest: function (action, data, callback, options) {\n    // Make 'data' optional\n    if (typeof data === 'function') {\n      options = callback;\n      callback = data;\n      data = {};\n    }\n\n    options = options || {};\n\n    if (options.contentType && options.contentType.match(/\\bjson\\b/)) {\n      if (typeof data === 'object') {\n        data = JSON.stringify(data);\n      }\n      options.contentType = 'application/json; charset=utf-8';\n    }\n\n    var jqXHR = $.ajax(\n      $.extend(\n        {\n          url: Craft.getActionUrl(action),\n          type: 'POST',\n          dataType: 'json',\n          headers: this._actionHeaders(),\n          data: data,\n          success: callback,\n          error: function (jqXHR, textStatus, errorThrown) {\n            // Ignore incomplete requests, likely due to navigating away from the page\n            // h/t https://stackoverflow.com/a/22107079/1688568\n            if (jqXHR.readyState !== 4) {\n              return;\n            }\n\n            if (jqXHR.status !== 400) {\n              if (typeof Craft.cp !== 'undefined') {\n                Craft.cp.displayError();\n              } else {\n                alert(Craft.t('app', 'A server error occurred.'));\n              }\n            }\n\n            if (callback) {\n              callback(\n                jqXHR.status === 400 ? jqXHR.responseJSON : null,\n                textStatus,\n                jqXHR\n              );\n            }\n          },\n        },\n        options\n      )\n    );\n\n    // Call the 'send' callback\n    if (typeof options.send === 'function') {\n      options.send(jqXHR);\n    }\n\n    return jqXHR;\n  },\n\n  _actionHeaders: function () {\n    let headers = {\n      'X-Registered-Asset-Bundles': Object.keys(\n        Craft.registeredAssetBundles\n      ).join(','),\n      'X-Registered-Js-Files': Object.keys(Craft.registeredJsFiles).join(','),\n    };\n\n    if (Craft.csrfTokenValue) {\n      headers['X-CSRF-Token'] = Craft.csrfTokenValue;\n    }\n\n    return headers;\n  },\n\n  /**\n   * Sends a request to a Craft/plugin action\n   * @param {string} method The request action to use ('GET' or 'POST')\n   * @param {?string} [action] The action to request\n   * @param {Object} [options] Axios request options\n   * @returns {Promise}\n   * @since 3.4.6\n   */\n  sendActionRequest: function (method, action, options = {}) {\n    if ($.isPlainObject(action)) {\n      options = action;\n      action = null;\n    }\n\n    if (method.toUpperCase() === 'POST' && action && options.data) {\n      // Avoid conflicting `action` params\n      if (typeof options.data === 'string') {\n        const namespace =\n          options && options.headers && options.headers['X-Craft-Namespace'];\n        const actionName = this.namespaceInputName('action', namespace);\n        options.data += `&${actionName}=${action}`;\n      } else {\n        delete options.data.action;\n      }\n    }\n\n    return new Promise((resolve, reject) => {\n      options = options ? $.extend({}, options) : {};\n      options.method = method;\n      options.url = action ? Craft.getActionUrl(action) : Craft.getCpUrl();\n      options.headers = $.extend(\n        {\n          'X-Requested-With': 'XMLHttpRequest',\n        },\n        options.headers || {},\n        this._actionHeaders()\n      );\n      options.params = $.extend({}, options.params || {}, {\n        // Force Safari to not load from cache\n        v: new Date().getTime(),\n      });\n      axios.request(options).then(resolve).catch(reject);\n    });\n  },\n\n  /**\n   * Sends a request to the Craftnet API.\n   * @param {string} method The request action to use ('GET' or 'POST')\n   * @param {string} uri The API endpoint URI\n   * @param {Object} options Axios request options\n   * @returns {Promise}\n   * @since 3.3.16\n   */\n  sendApiRequest: function (method, uri, options) {\n    return new Promise((resolve, reject) => {\n      options = options ? $.extend({}, options) : {};\n      let cancelToken = options.cancelToken || null;\n\n      // Get the latest headers\n      this._getApiHeaders(cancelToken)\n        .then((apiHeaders) => {\n          // Send the API request\n          options.method = method;\n          options.baseURL = Craft.baseApiUrl;\n          options.url = uri;\n          options.headers = $.extend(apiHeaders, options.headers || {});\n          options.params = $.extend(\n            Craft.apiParams || {},\n            options.params || {},\n            {\n              // Force Safari to not load from cache\n              v: new Date().getTime(),\n            }\n          );\n\n          // Force the API to process the Craft headers if this is the first API request\n          if (!this._apiHeaders) {\n            options.params.processCraftHeaders = 1;\n          }\n\n          if (Craft.httpProxy) {\n            options.proxy = Craft.httpProxy;\n          }\n\n          axios\n            .request(options)\n            .then((apiResponse) => {\n              // Process the response headers\n              this._processApiHeaders(apiResponse.headers, cancelToken)\n                .then(() => {\n                  // Finally return the API response data\n                  resolve(apiResponse.data);\n                })\n                .catch(reject);\n            })\n            .catch(reject);\n        })\n        .catch(reject);\n    });\n  },\n\n  _loadingApiHeaders: false,\n  _apiHeaders: null,\n  _apiHeaderWaitlist: [],\n\n  /**\n   * Returns the headers that should be sent with API requests.\n   *\n   * @param {Object} [cancelToken]\n   * @returns {Promise}\n   */\n  _getApiHeaders: function (cancelToken) {\n    return new Promise((resolve, reject) => {\n      // Are we already loading them?\n      if (this._loadingApiHeaders) {\n        this._apiHeaderWaitlist.push([resolve, reject]);\n        return;\n      }\n\n      // Are the headers already cached?\n      if (this._apiHeaders) {\n        resolve(this._apiHeaders);\n        return;\n      }\n\n      this._loadingApiHeaders = true;\n      this.sendActionRequest('POST', 'app/api-headers', {\n        cancelToken: cancelToken,\n      })\n        .then((response) => {\n          // Make sure we even are waiting for these anymore\n          if (!this._loadingApiHeaders) {\n            reject(e);\n            return;\n          }\n\n          resolve(response.data);\n        })\n        .catch((e) => {\n          this._rejectApiRequests(reject, e);\n        });\n    });\n  },\n\n  _processApiHeaders: function (headers, cancelToken) {\n    return new Promise((resolve, reject) => {\n      // Have we already processed them?\n      if (this._apiHeaders) {\n        resolve();\n        return;\n      }\n\n      this.sendActionRequest('POST', 'app/process-api-response-headers', {\n        data: {\n          headers: headers,\n        },\n        cancelToken: cancelToken,\n      })\n        .then((response) => {\n          // Make sure we even are waiting for these anymore\n          if (!this._loadingApiHeaders) {\n            reject(e);\n            return;\n          }\n\n          this._apiHeaders = response.data;\n          this._loadingApiHeaders = false;\n\n          resolve();\n\n          // Was anything else waiting for them?\n          while (this._apiHeaderWaitlist.length) {\n            this._apiHeaderWaitlist.shift()[0](this._apiHeaders);\n          }\n        })\n        .catch((e) => {\n          this._rejectApiRequests(reject, e);\n        });\n    });\n  },\n\n  _rejectApiRequests: function (reject, e) {\n    this._loadingApiHeaders = false;\n    reject(e);\n    while (this._apiHeaderWaitlist.length) {\n      this._apiHeaderWaitlist.shift()[1](e);\n    }\n  },\n\n  /**\n   * Clears the cached API headers.\n   */\n  clearCachedApiHeaders: function () {\n    this._apiHeaders = null;\n    this._loadingApiHeaders = false;\n\n    // Reject anything in the header waitlist\n    while (this._apiHeaderWaitlist.length) {\n      this._apiHeaderWaitlist.shift()[1]();\n    }\n  },\n\n  /**\n   * Requests a URL and downloads the response.\n   *\n   * @param {string} method the request method to use\n   * @param {string} url the URL\n   * @param {(string|Object)} [body] the request body, if method = POST\n   * @returns {Promise}\n   */\n  downloadFromUrl: function (method, url, body) {\n    return new Promise((resolve, reject) => {\n      // h/t https://nehalist.io/downloading-files-from-post-requests/\n      let request = new XMLHttpRequest();\n      request.open(method, url, true);\n      if (typeof body === 'object') {\n        request.setRequestHeader(\n          'Content-Type',\n          'application/json; charset=UTF-8'\n        );\n        body = JSON.stringify(body);\n      } else {\n        request.setRequestHeader(\n          'Content-Type',\n          'application/x-www-form-urlencoded; charset=UTF-8'\n        );\n      }\n      request.responseType = 'blob';\n\n      request.onload = () => {\n        // Only handle status code 200\n        if (request.status === 200) {\n          // Try to find out the filename from the content disposition `filename` value\n          let disposition = request.getResponseHeader('content-disposition');\n          let matches = /\"([^\"]*)\"/.exec(disposition);\n          let filename =\n            matches != null && matches[1] ? matches[1] : 'Download';\n\n          // Encode the download into an anchor href\n          let contentType = request.getResponseHeader('content-type');\n          let blob = new Blob([request.response], {type: contentType});\n          let link = document.createElement('a');\n          link.href = window.URL.createObjectURL(blob);\n          link.download = filename;\n          document.body.appendChild(link);\n          link.click();\n          document.body.removeChild(link);\n\n          resolve();\n        } else {\n          reject();\n        }\n      };\n\n      request.send(body);\n    });\n  },\n\n  /**\n   * Converts a comma-delimited string into an array.\n   *\n   * @param {string} str\n   * @returns array\n   */\n  stringToArray: function (str) {\n    if (typeof str !== 'string') {\n      return str;\n    }\n\n    var arr = str.split(',');\n    for (var i = 0; i < arr.length; i++) {\n      arr[i] = $.trim(arr[i]);\n    }\n    return arr;\n  },\n\n  /**\n   * @callback findDeltaDataCallback\n   * @param {string} deltaName\n   * @param {Array} params\n   */\n  /**\n   * Compares old and new post data, and removes any values that haven't\n   * changed within the given list of delta namespaces.\n   *\n   * @param {string} oldData\n   * @param {string} newData\n   * @param {Object} deltaNames\n   * @param {findDeltaDataCallback} [callback] Callback function that should be called whenever a new group of modified params has been found\n   * @param {Object} [initialDeltaValues] Initial delta values. If undefined, `Craft.initialDeltaValues` will be used.\n   * @param {Object} [modifiedDeltaNames} List of delta names that should be considered modified regardles of their param values\n   * @returns {string}\n   */\n  findDeltaData: function (\n    oldData,\n    newData,\n    deltaNames,\n    callback,\n    initialDeltaValues,\n    modifiedDeltaNames\n  ) {\n    // Make sure oldData and newData are always strings. This is important because further below String.split is called.\n    oldData = typeof oldData === 'string' ? oldData : '';\n    newData = typeof newData === 'string' ? newData : '';\n    deltaNames = $.isArray(deltaNames) ? deltaNames : [];\n    initialDeltaValues = $.isPlainObject(initialDeltaValues)\n      ? initialDeltaValues\n      : {};\n    modifiedDeltaNames = $.isArray(modifiedDeltaNames)\n      ? modifiedDeltaNames\n      : [];\n\n    // Sort the delta namespaces from least -> most specific\n    deltaNames.sort(function (a, b) {\n      if (a.length === b.length) {\n        return 0;\n      }\n      return a.length > b.length ? 1 : -1;\n    });\n\n    // Group all of the old & new params by namespace\n    var groupedOldParams = this._groupParamsByDeltaNames(\n      oldData.split('&'),\n      deltaNames,\n      false,\n      initialDeltaValues\n    );\n    var groupedNewParams = this._groupParamsByDeltaNames(\n      newData.split('&'),\n      deltaNames,\n      true,\n      false\n    );\n\n    // Figure out which of the new params should actually be posted\n    var params = groupedNewParams.__root__;\n    for (var n = 0; n < deltaNames.length; n++) {\n      if (\n        Craft.inArray(deltaNames[n], modifiedDeltaNames) ||\n        (typeof groupedNewParams[deltaNames[n]] === 'object' &&\n          (typeof groupedOldParams[deltaNames[n]] !== 'object' ||\n            JSON.stringify(groupedOldParams[deltaNames[n]]) !==\n              JSON.stringify(groupedNewParams[deltaNames[n]])))\n      ) {\n        params = params.concat(groupedNewParams[deltaNames[n]]);\n        params.push('modifiedDeltaNames[]=' + deltaNames[n]);\n        if (callback) {\n          callback(deltaNames[n], groupedNewParams[deltaNames[n]]);\n        }\n      }\n    }\n\n    return params.join('&');\n  },\n\n  /**\n   * @param {Object} params\n   * @param {Object} deltaNames\n   * @param {boolean} withRoot\n   * @param {(boolean|Object)} initialValues\n   * @returns {Object}\n   * @private\n   */\n  _groupParamsByDeltaNames: function (\n    params,\n    deltaNames,\n    withRoot,\n    initialValues\n  ) {\n    const grouped = {};\n\n    if (withRoot) {\n      grouped.__root__ = [];\n    }\n\n    const encodeURIComponentExceptEqualChar = (o) =>\n      encodeURIComponent(o).replace('%3D', '=');\n\n    params = params.map((p) => decodeURIComponent(p));\n\n    paramLoop: for (let p = 0; p < params.length; p++) {\n      // loop through the delta names from most -> least specific\n      for (let n = deltaNames.length - 1; n >= 0; n--) {\n        const paramName = params[p].substring(0, deltaNames[n].length + 1);\n        if (\n          paramName === deltaNames[n] + '=' ||\n          paramName === deltaNames[n] + '['\n        ) {\n          if (typeof grouped[deltaNames[n]] === 'undefined') {\n            grouped[deltaNames[n]] = [];\n          }\n          grouped[deltaNames[n]].push(\n            encodeURIComponentExceptEqualChar(params[p])\n          );\n          continue paramLoop;\n        }\n      }\n\n      if (withRoot) {\n        grouped.__root__.push(encodeURIComponentExceptEqualChar(params[p]));\n      }\n    }\n\n    if (initialValues) {\n      const serializeParam = (name, value) => {\n        if ($.isArray(value) || $.isPlainObject(value)) {\n          value = $.param(value);\n        } else if (typeof value === 'string') {\n          value = encodeURIComponent(value);\n        } else if (value === null) {\n          value = '';\n        }\n        return `${encodeURIComponent(name)}=${value}`;\n      };\n\n      for (let name in initialValues) {\n        if (initialValues.hasOwnProperty(name)) {\n          if ($.isPlainObject(initialValues[name])) {\n            grouped[name] = [];\n            for (let subName in initialValues[name]) {\n              if (initialValues[name].hasOwnProperty(subName)) {\n                grouped[name].push(\n                  serializeParam(\n                    `${name}[${subName}]`,\n                    initialValues[name][subName]\n                  )\n                );\n              }\n            }\n          } else {\n            grouped[name] = [serializeParam(name, initialValues[name])];\n          }\n        }\n      }\n    }\n\n    return grouped;\n  },\n\n  /**\n   * Expands an object of POST array-style strings into an actual array.\n   *\n   * @param {Object} arr\n   * @returns {Array}\n   */\n  expandPostArray: function (arr) {\n    var expanded = {};\n    var i;\n\n    for (var key in arr) {\n      if (!arr.hasOwnProperty(key)) {\n        continue;\n      }\n\n      var value = arr[key],\n        m = key.match(/^(\\w+)(\\[.*)?/),\n        keys;\n\n      if (m[2]) {\n        // Get all of the nested keys\n        keys = m[2].match(/\\[[^\\[\\]]*\\]/g);\n\n        // Chop off the brackets\n        for (i = 0; i < keys.length; i++) {\n          keys[i] = keys[i].substring(1, keys[i].length - 1);\n        }\n      } else {\n        keys = [];\n      }\n\n      keys.unshift(m[1]);\n\n      var parentElem = expanded;\n\n      for (i = 0; i < keys.length; i++) {\n        if (i < keys.length - 1) {\n          if (typeof parentElem[keys[i]] !== 'object') {\n            // Figure out what this will be by looking at the next key\n            if (!keys[i + 1] || parseInt(keys[i + 1]) == keys[i + 1]) {\n              parentElem[keys[i]] = [];\n            } else {\n              parentElem[keys[i]] = {};\n            }\n          }\n\n          parentElem = parentElem[keys[i]];\n        } else {\n          // Last one. Set the value\n          if (!keys[i]) {\n            keys[i] = parentElem.length;\n          }\n\n          parentElem[keys[i]] = value;\n        }\n      }\n    }\n\n    return expanded;\n  },\n\n  /**\n   * Creates a form element populated with hidden inputs based on a string of serialized form data.\n   *\n   * @param {string} data\n   * @returns {(jQuery|HTMLElement)}\n   */\n  createForm: function (data) {\n    var $form = $('<form/>', {\n      attr: {\n        method: 'post',\n        action: '',\n        'accept-charset': 'UTF-8',\n      },\n    });\n\n    if (typeof data === 'string') {\n      var values = data.split('&');\n      var chunks;\n      for (var i = 0; i < values.length; i++) {\n        chunks = values[i].split('=', 2);\n        $('<input/>', {\n          type: 'hidden',\n          name: decodeURIComponent(chunks[0]),\n          value: decodeURIComponent(chunks[1] || ''),\n        }).appendTo($form);\n      }\n    }\n\n    return $form;\n  },\n\n  /**\n   * Compares two variables and returns whether they are equal in value.\n   * Recursively compares array and object values.\n   *\n   * @param {*} obj1\n   * @param {*} obj2\n   * @param {boolean} [sortObjectKeys] Whether object keys should be sorted before being compared. Default is true.\n   * @returns boolean\n   */\n  compare: function (obj1, obj2, sortObjectKeys) {\n    // Compare the types\n    if (typeof obj1 !== typeof obj2) {\n      return false;\n    }\n\n    if (typeof obj1 === 'object') {\n      // Compare the lengths\n      if (obj1.length !== obj2.length) {\n        return false;\n      }\n\n      // Is one of them an array but the other is not?\n      if (obj1 instanceof Array !== obj2 instanceof Array) {\n        return false;\n      }\n\n      // If they're actual objects (not arrays), compare the keys\n      if (!(obj1 instanceof Array)) {\n        if (typeof sortObjectKeys === 'undefined' || sortObjectKeys === true) {\n          if (\n            !Craft.compare(\n              Craft.getObjectKeys(obj1).sort(),\n              Craft.getObjectKeys(obj2).sort()\n            )\n          ) {\n            return false;\n          }\n        } else {\n          if (\n            !Craft.compare(Craft.getObjectKeys(obj1), Craft.getObjectKeys(obj2))\n          ) {\n            return false;\n          }\n        }\n      }\n\n      // Compare each value\n      for (var i in obj1) {\n        if (!obj1.hasOwnProperty(i)) {\n          continue;\n        }\n\n        if (!Craft.compare(obj1[i], obj2[i])) {\n          return false;\n        }\n      }\n\n      // All clear\n      return true;\n    } else {\n      return obj1 === obj2;\n    }\n  },\n\n  /**\n   * Returns an array of an object's keys.\n   *\n   * @param {Object} obj\n   * @returns {string[]}\n   */\n  getObjectKeys: function (obj) {\n    var keys = [];\n\n    for (var key in obj) {\n      if (!obj.hasOwnProperty(key)) {\n        continue;\n      }\n\n      keys.push(key);\n    }\n\n    return keys;\n  },\n\n  /**\n   * Takes an array or string of chars, and places a backslash before each one, returning the combined string.\n   *\n   * Userd by ltrim() and rtrim()\n   *\n   * @param {(string|Object)} chars\n   * @returns {string}\n   */\n  escapeChars: function (chars) {\n    if (!Garnish.isArray(chars)) {\n      chars = chars.split();\n    }\n\n    var escaped = '';\n\n    for (var i = 0; i < chars.length; i++) {\n      escaped += '\\\\' + chars[i];\n    }\n\n    return escaped;\n  },\n\n  /**\n   * Trim characters off of the beginning of a string.\n   *\n   * @param {string} str\n   * @param {(string|Object)} [chars] The characters to trim off. Defaults to a space if left blank.\n   * @returns {string}\n   */\n  ltrim: function (str, chars) {\n    if (!str) {\n      return str;\n    }\n    if (typeof chars === 'undefined') {\n      chars = ' \\t\\n\\r\\0\\x0B';\n    }\n    var re = new RegExp('^[' + Craft.escapeChars(chars) + ']+');\n    return str.replace(re, '');\n  },\n\n  /**\n   * Trim characters off of the end of a string.\n   *\n   * @param {string} str\n   * @param {(string|Object)} [chars] The characters to trim off. Defaults to a space if left blank.\n   * @returns {string}\n   */\n  rtrim: function (str, chars) {\n    if (!str) {\n      return str;\n    }\n    if (typeof chars === 'undefined') {\n      chars = ' \\t\\n\\r\\0\\x0B';\n    }\n    var re = new RegExp('[' + Craft.escapeChars(chars) + ']+$');\n    return str.replace(re, '');\n  },\n\n  /**\n   * Trim characters off of the beginning and end of a string.\n   *\n   * @param {string} str\n   * @param {(string|Object)} [chars] The characters to trim off. Defaults to a space if left blank.\n   * @returns {string}\n   */\n  trim: function (str, chars) {\n    str = Craft.ltrim(str, chars);\n    str = Craft.rtrim(str, chars);\n    return str;\n  },\n\n  /**\n   * Returns whether a string starts with another string.\n   *\n   * @param {string} str\n   * @param {string} substr\n   * @returns {boolean}\n   */\n  startsWith: function (str, substr) {\n    return str.substring(0, substr.length) === substr;\n  },\n\n  /**\n   * @callback filterArrayCallback\n   * @param {*} value\n   * @param {number} index\n   * @return {boolean}\n   */\n  /**\n   * Filters an array.\n   *\n   * @param {Object} arr\n   * @param {filterArrayCallback} [callback] A user-defined callback function. If null, we'll just remove any elements that equate to false.\n   * @returns {Array}\n   */\n  filterArray: function (arr, callback) {\n    var filtered = [];\n\n    for (var i = 0; i < arr.length; i++) {\n      var include;\n\n      if (typeof callback === 'function') {\n        include = callback(arr[i], i);\n      } else {\n        include = arr[i];\n      }\n\n      if (include) {\n        filtered.push(arr[i]);\n      }\n    }\n\n    return filtered;\n  },\n\n  /**\n   * Returns whether an element is in an array (unlike jQuery.inArray(), which returns the element’s index, or -1).\n   *\n   * @param {*} elem\n   * @param {(Object|Array)} arr\n   * @returns {boolean}\n   */\n  inArray: function (elem, arr) {\n    if ($.isPlainObject(arr)) {\n      arr = Object.values(arr);\n    }\n    return arr.includes(elem);\n  },\n\n  /**\n   * Removes an element from an array.\n   *\n   * @param {*} elem\n   * @param {Array} arr\n   * @returns {boolean} Whether the element could be found or not.\n   */\n  removeFromArray: function (elem, arr) {\n    var index = $.inArray(elem, arr);\n    if (index !== -1) {\n      arr.splice(index, 1);\n      return true;\n    } else {\n      return false;\n    }\n  },\n\n  /**\n   * Returns the last element in an array.\n   *\n   * @param {Array} arr\n   * @returns {*}\n   */\n  getLast: function (arr) {\n    if (!arr.length) {\n      return null;\n    } else {\n      return arr[arr.length - 1];\n    }\n  },\n\n  /**\n   * Makes the first character of a string uppercase.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  uppercaseFirst: function (str) {\n    return str.charAt(0).toUpperCase() + str.slice(1);\n  },\n\n  /**\n   * Makes the first character of a string lowercase.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  lowercaseFirst: function (str) {\n    return str.charAt(0).toLowerCase() + str.slice(1);\n  },\n\n  parseUrl: function (url) {\n    var m = url.match(\n      /^(?:(https?):\\/\\/|\\/\\/)([^\\/\\:]*)(?:\\:(\\d+))?(\\/[^\\?]*)?(?:\\?([^#]*))?(#.*)?/\n    );\n    if (!m) {\n      return {};\n    }\n    return {\n      scheme: m[1],\n      host: m[2] + (m[3] ? ':' + m[3] : ''),\n      hostname: m[2],\n      port: m[3] || null,\n      path: m[4] || '/',\n      query: m[5] || null,\n      hash: m[6] || null,\n    };\n  },\n\n  getQueryParams: function () {\n    return Object.fromEntries(\n      new URLSearchParams(window.location.search).entries()\n    );\n  },\n\n  getQueryParam: function (name) {\n    // h/t https://stackoverflow.com/a/901144/1688568\n    const params = new Proxy(new URLSearchParams(window.location.search), {\n      get: (searchParams, prop) => searchParams.get(prop),\n    });\n    return params[name];\n  },\n\n  isSameHost: function (url) {\n    var requestUrlInfo = this.parseUrl(document.location.href);\n    if (!requestUrlInfo) {\n      return false;\n    }\n    var urlInfo = this.parseUrl(url);\n    if (!urlInfo) {\n      return false;\n    }\n    return requestUrlInfo.host === urlInfo.host;\n  },\n\n  /**\n   * Converts a number of seconds into a human-facing time duration.\n   */\n  secondsToHumanTimeDuration: function (seconds, showSeconds) {\n    if (typeof showSeconds === 'undefined') {\n      showSeconds = true;\n    }\n\n    var secondsInWeek = 604800,\n      secondsInDay = 86400,\n      secondsInHour = 3600,\n      secondsInMinute = 60;\n\n    var weeks = Math.floor(seconds / secondsInWeek);\n    seconds = seconds % secondsInWeek;\n\n    var days = Math.floor(seconds / secondsInDay);\n    seconds = seconds % secondsInDay;\n\n    var hours = Math.floor(seconds / secondsInHour);\n    seconds = seconds % secondsInHour;\n\n    var minutes;\n\n    if (showSeconds) {\n      minutes = Math.floor(seconds / secondsInMinute);\n      seconds = seconds % secondsInMinute;\n    } else {\n      minutes = Math.round(seconds / secondsInMinute);\n      seconds = 0;\n    }\n\n    var timeComponents = [];\n\n    if (weeks) {\n      timeComponents.push(\n        weeks +\n          ' ' +\n          (weeks === 1 ? Craft.t('app', 'week') : Craft.t('app', 'weeks'))\n      );\n    }\n\n    if (days) {\n      timeComponents.push(\n        days +\n          ' ' +\n          (days === 1 ? Craft.t('app', 'day') : Craft.t('app', 'days'))\n      );\n    }\n\n    if (hours) {\n      timeComponents.push(\n        hours +\n          ' ' +\n          (hours === 1 ? Craft.t('app', 'hour') : Craft.t('app', 'hours'))\n      );\n    }\n\n    if (minutes || (!showSeconds && !weeks && !days && !hours)) {\n      timeComponents.push(\n        minutes +\n          ' ' +\n          (minutes === 1 ? Craft.t('app', 'minute') : Craft.t('app', 'minutes'))\n      );\n    }\n\n    if (seconds || (showSeconds && !weeks && !days && !hours && !minutes)) {\n      timeComponents.push(\n        seconds +\n          ' ' +\n          (seconds === 1 ? Craft.t('app', 'second') : Craft.t('app', 'seconds'))\n      );\n    }\n\n    return timeComponents.join(', ');\n  },\n\n  /**\n   * Converts extended ASCII characters to ASCII.\n   *\n   * @param {string} str\n   * @param {Object} [charMap]\n   * @returns {string}\n   */\n  asciiString: function (str, charMap) {\n    // Normalize NFD chars to NFC\n    str = str.normalize('NFC');\n\n    var asciiStr = '';\n    var char;\n\n    for (var i = 0; i < str.length; i++) {\n      char = str.charAt(i);\n      asciiStr +=\n        typeof (charMap || Craft.asciiCharMap)[char] === 'string'\n          ? (charMap || Craft.asciiCharMap)[char]\n          : char;\n    }\n\n    return asciiStr;\n  },\n\n  uuid: function () {\n    if (typeof crypto.randomUUID === 'function') {\n      return crypto.randomUUID();\n    }\n\n    // h/t https://stackoverflow.com/a/2117523/1688568\n    return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>\n      (\n        c ^\n        (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))\n      ).toString(16)\n    );\n  },\n\n  /**\n   * @param {string} name\n   * @param {string} [namespace]\n   * @returns {string}\n   */\n  namespaceInputName: function (name, namespace) {\n    if (!namespace) {\n      return name;\n    }\n\n    return name.replace(/([^'\"\\[\\]]+)([^'\"]*)/, `${namespace}[$1]$2`);\n  },\n\n  /**\n   * @param {string} id\n   * @param {string} [namespace]\n   * @returns {string}\n   */\n  namespaceId: function (id, namespace) {\n    return Craft.formatInputId(namespace ? `${namespace}-${id}` : id);\n  },\n\n  randomString: function (length) {\n    // h/t https://stackoverflow.com/a/1349426/1688568\n    var result = '';\n    var characters =\n      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n    for (var i = 0; i < length; i++) {\n      result += characters.charAt(Math.floor(Math.random() * 62));\n    }\n    return result;\n  },\n\n  /**\n   * Creates a validation error list.\n   *\n   * @param {Object} errors\n   * @returns {jQuery}\n   */\n  createErrorList: function (errors) {\n    var $ul = $(document.createElement('ul')).addClass('errors');\n\n    for (var i = 0; i < errors.length; i++) {\n      var $li = $(document.createElement('li'));\n      $li.appendTo($ul);\n      $li.html(errors[i]);\n    }\n\n    return $ul;\n  },\n\n  /**\n   * Appends HTML to the page `<head>`.\n   *\n   * @param {string} html\n   */\n  appendHeadHtml: function (html) {\n    if (!html) {\n      return;\n    }\n\n    // Prune out any link tags that are already included\n    var $existingCss = $('link[href]');\n\n    if ($existingCss.length) {\n      var existingCss = [];\n      var href;\n\n      for (var i = 0; i < $existingCss.length; i++) {\n        href = $existingCss.eq(i).attr('href').replace(/&/g, '&amp;');\n        existingCss.push(Craft.escapeRegex(href));\n      }\n\n      const regexp = new RegExp(\n        '<link\\\\s[^>]*href=\"(?:' + existingCss.join('|') + ')\".*?></link>',\n        'g'\n      );\n\n      html = html.replace(regexp, '');\n    }\n\n    $('head').append(html);\n  },\n\n  /**\n   * Appends HTML to the page `<body>`.\n   *\n   * @param {string} html\n   */\n  appendBodyHtml: function (html) {\n    if (!html) {\n      return;\n    }\n\n    // Prune out any script tags that are already included\n    var $existingJs = $('script[src]');\n\n    if ($existingJs.length) {\n      var existingJs = [];\n      var src;\n\n      for (var i = 0; i < $existingJs.length; i++) {\n        src = $existingJs.eq(i).attr('src').replace(/&/g, '&amp;');\n        existingJs.push(Craft.escapeRegex(src));\n      }\n\n      var regexp = new RegExp(\n        '<script\\\\s[^>]*src=\"(?:' + existingJs.join('|') + ')\".*?></script>',\n        'g'\n      );\n\n      html = html.replace(regexp, '');\n    }\n\n    Garnish.$bod.append(html);\n  },\n\n  /**\n   * Appends HTML to the page `<body>`.\n   *\n   * @deprecated in 4.0.0. `appendBodyHtml()` should be used instead\n   */\n  appendFootHtml: function (html) {\n    console.warn(\n      'Craft.appendFootHtml() is deprecated. Craft.appendBodyHtml() should be used instead.'\n    );\n    this.appendBodyHtml(html);\n  },\n\n  /**\n   * Initializes any common UI elements in a given container.\n   *\n   * @param {Object} $container\n   */\n  initUiElements: function ($container) {\n    $('.grid', $container).grid();\n    $('.info', $container).infoicon();\n    $('.checkbox-select', $container).checkboxselect();\n    $('.fieldtoggle', $container).fieldtoggle();\n    $('.lightswitch', $container).lightswitch();\n    $('.nicetext', $container).nicetext();\n    $('.formsubmit', $container).formsubmit();\n    $('.menubtn:not([data-disclosure-trigger])', $container).menubtn();\n    $('[data-disclosure-trigger]', $container).disclosureMenu();\n    $('.datetimewrapper', $container).datetime();\n    $(\n      '.datewrapper > input[type=\"date\"], .timewrapper > input[type=\"time\"]',\n      $container\n    ).datetimeinput();\n\n    // Open outbound links in new windows\n    // hat tip: https://stackoverflow.com/a/2911045/1688568\n    $('a', $container).each(function () {\n      if (\n        this.hostname.length &&\n        this.hostname !== location.hostname &&\n        typeof $(this).attr('target') === 'undefined'\n      ) {\n        $(this).attr('rel', 'noopener').attr('target', '_blank');\n      }\n    });\n  },\n\n  _elementIndexClasses: {},\n  _elementSelectorModalClasses: {},\n  _elementEditorClasses: {},\n\n  /**\n   * Registers an element index class for a given element type.\n   *\n   * @param {string} elementType\n   * @param {function} func\n   */\n  registerElementIndexClass: function (elementType, func) {\n    if (typeof this._elementIndexClasses[elementType] !== 'undefined') {\n      throw (\n        'An element index class has already been registered for the element type “' +\n        elementType +\n        '”.'\n      );\n    }\n\n    this._elementIndexClasses[elementType] = func;\n  },\n\n  /**\n   * Registers an element selector modal class for a given element type.\n   *\n   * @param {string} elementType\n   * @param {function} func\n   */\n  registerElementSelectorModalClass: function (elementType, func) {\n    if (typeof this._elementSelectorModalClasses[elementType] !== 'undefined') {\n      throw (\n        'An element selector modal class has already been registered for the element type “' +\n        elementType +\n        '”.'\n      );\n    }\n\n    this._elementSelectorModalClasses[elementType] = func;\n  },\n\n  /**\n   * Registers an element editor class for a given element type.\n   *\n   * @param {string} elementType\n   * @param {function} func\n   */\n  registerElementEditorClass: function (elementType, func) {\n    if (typeof this._elementEditorClasses[elementType] !== 'undefined') {\n      throw (\n        'An element editor class has already been registered for the element type “' +\n        elementType +\n        '”.'\n      );\n    }\n\n    this._elementEditorClasses[elementType] = func;\n  },\n\n  /**\n   * Creates a new element index for a given element type.\n   *\n   * @param {string} elementType\n   * @param {jQuery} $container\n   * @param {Object} settings\n   * @returns {BaseElementIndex}\n   */\n  createElementIndex: function (elementType, $container, settings) {\n    var func;\n\n    if (typeof this._elementIndexClasses[elementType] !== 'undefined') {\n      func = this._elementIndexClasses[elementType];\n    } else {\n      func = Craft.BaseElementIndex;\n    }\n\n    return new func(elementType, $container, settings);\n  },\n\n  /**\n   * Creates a new element selector modal for a given element type.\n   *\n   * @param {string} elementType\n   * @param {Object} settings\n   */\n  createElementSelectorModal: function (elementType, settings) {\n    var func;\n\n    if (typeof this._elementSelectorModalClasses[elementType] !== 'undefined') {\n      func = this._elementSelectorModalClasses[elementType];\n    } else {\n      func = Craft.BaseElementSelectorModal;\n    }\n\n    return new func(elementType, settings);\n  },\n\n  /**\n   * Creates a new element editor slideout for a given element type.\n   *\n   * @param {string} elementType\n   * @param {(jQuery|HTMLElement|string)} element\n   * @param {Object} settings\n   */\n  createElementEditor: function (elementType, element, settings) {\n    // Param mapping\n    if (typeof settings === 'undefined' && $.isPlainObject(element)) {\n      // (settings)\n      settings = element;\n      element = null;\n    } else if (typeof settings !== 'object') {\n      settings = {};\n    }\n\n    if (!settings.elementType) {\n      settings.elementType = elementType;\n    }\n\n    return new Craft.ElementEditorSlideout(element, settings);\n  },\n\n  /**\n   * Retrieves a value from localStorage if it exists.\n   *\n   * @param {string} key\n   * @param {*} defaultValue\n   */\n  getLocalStorage: function (key, defaultValue) {\n    key = 'Craft-' + Craft.systemUid + '.' + key;\n\n    if (\n      typeof localStorage !== 'undefined' &&\n      typeof localStorage[key] !== 'undefined'\n    ) {\n      return JSON.parse(localStorage[key]);\n    } else {\n      return defaultValue;\n    }\n  },\n\n  /**\n   * Saves a value to localStorage.\n   *\n   * @param {string} key\n   * @param {*} value\n   */\n  setLocalStorage: function (key, value) {\n    if (typeof localStorage !== 'undefined') {\n      key = 'Craft-' + Craft.systemUid + '.' + key;\n\n      // localStorage might be filled all the way up.\n      // Especially likely if this is a private window in Safari 8+, where localStorage technically exists,\n      // but has a max size of 0 bytes.\n      try {\n        localStorage[key] = JSON.stringify(value);\n      } catch (e) {}\n    }\n  },\n\n  /**\n   * Removes a value from localStorage.\n   * @param {string} key\n   */\n  removeLocalStorage: function (key) {\n    if (typeof localStorage !== 'undefined') {\n      localStorage.removeItem(`Craft-${Craft.systemUid}.${key}`);\n    }\n  },\n\n  /**\n   * Returns a cookie value, if it exists, otherwise returns `false`\n   * @returns {(string|boolean)}\n   */\n  getCookie: function (name) {\n    // Adapted from https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie\n    return document.cookie.replace(\n      new RegExp(\n        `(?:(?:^|.*;\\\\s*)Craft-${Craft.systemUid}:${name}\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$`\n      ),\n      '$1'\n    );\n  },\n\n  /**\n   * Sets a cookie value.\n   * @param {string} name\n   * @param {string} value\n   * @param {Object} [options]\n   * @param {string} [options.path] The cookie path.\n   * @param {string} [options.domain] The cookie domain. Defaults to the `defaultCookieDomain` config setting.\n   * @param {number} [options.maxAge] The max age of the cookie (in seconds)\n   * @param {Date} [options.expires] The expiry date of the cookie. Defaults to none (session-based cookie).\n   * @param {boolean} [options.secure] Whether this is a secure cookie. Defaults to the `useSecureCookies`\n   * config setting.\n   * @param {string} [options.sameSite] The SameSite value (`lax` or `strict`). Defaults to the\n   * `sameSiteCookieValue` config setting.\n   */\n  setCookie: function (name, value, options) {\n    options = $.extend({}, this.defaultCookieOptions, options);\n    let cookie = `Craft-${Craft.systemUid}:${name}=${encodeURIComponent(\n      value\n    )}`;\n    if (options.path) {\n      cookie += `;path=${options.path}`;\n    }\n    if (options.domain) {\n      cookie += `;domain=${options.domain}`;\n    }\n    if (options.maxAge) {\n      cookie += `;max-age-in-seconds=${options.maxAge}`;\n    } else if (options.expires) {\n      cookie += `;expires=${options.expires.toUTCString()}`;\n    }\n    if (options.secure) {\n      cookie += ';secure';\n    }\n    document.cookie = cookie;\n  },\n\n  /**\n   * Removes a cookie\n   * @param {string} name\n   */\n  removeCookie: function (name) {\n    this.setCookie(name, '', new Date('1970-01-01T00:00:00'));\n  },\n\n  /**\n   * Returns element information from its DOM element.\n   *\n   * @param {(jQuery|HTMLElement|string)} element\n   * @returns {Object}\n   */\n  getElementInfo: function (element) {\n    var $element = $(element);\n\n    if (!$element.hasClass('element')) {\n      $element = $element.find('.element:first');\n    }\n\n    return {\n      id: $element.data('id'),\n      siteId: $element.data('site-id'),\n      label: $element.data('label'),\n      status: $element.data('status'),\n      url: $element.data('url'),\n      hasThumb: $element.hasClass('hasthumb'),\n      $element: $element,\n    };\n  },\n\n  /**\n   * Changes an element to the requested size.\n   *\n   * @param {(jQuery|HTMLElement|string))} element\n   * @param {string} size\n   */\n  setElementSize: function (element, size) {\n    var $element = $(element);\n\n    if (size !== 'small' && size !== 'large') {\n      size = 'small';\n    }\n\n    if ($element.hasClass(size)) {\n      return;\n    }\n\n    var otherSize = size === 'small' ? 'large' : 'small';\n\n    $element.addClass(size).removeClass(otherSize);\n\n    if ($element.hasClass('hasthumb')) {\n      var $oldImg = $element.find('> .elementthumb > img'),\n        imgSize = size === 'small' ? '30' : '100',\n        $newImg = $('<img/>', {\n          sizes: imgSize + 'px',\n          srcset: $oldImg.attr('srcset') || $oldImg.attr('data-pfsrcset'),\n        });\n\n      $oldImg.replaceWith($newImg);\n\n      picturefill({\n        elements: [$newImg[0]],\n      });\n    }\n  },\n\n  /**\n   * Submits a form.\n   * @param {Object} $form\n   * @param {Object} [options]\n   * @param {string} [options.action] The `action` param value override\n   * @param {string} [options.redirect] The `redirect` param value override\n   * @param {string} [options.confirm] A confirmation message that should be shown to the user before submit\n   * @param {Object} [options.params] Additional params that should be added to the form, defined as name/value pairs\n   * @param {Object} [options.data] Additional data to be passed to the submit event\n   * @param {boolean} [options.retainScroll] Whether the scroll position should be stored and reapplied on the next page load\n   */\n  submitForm: function ($form, options) {\n    if (typeof options === 'undefined') {\n      options = {};\n    }\n\n    if (options.confirm && !confirm(options.confirm)) {\n      return;\n    }\n\n    if (options.action) {\n      $('<input/>', {\n        type: 'hidden',\n        name: 'action',\n        val: options.action,\n      }).appendTo($form);\n    }\n\n    if (options.redirect) {\n      $('<input/>', {\n        type: 'hidden',\n        name: 'redirect',\n        val: options.redirect,\n      }).appendTo($form);\n    }\n\n    if (options.params) {\n      for (let name in options.params) {\n        let value = options.params[name];\n        $('<input/>', {\n          type: 'hidden',\n          name: name,\n          val: value,\n        }).appendTo($form);\n      }\n    }\n\n    if (options.retainScroll) {\n      this.setLocalStorage('scrollY', window.scrollY);\n    }\n\n    $form.trigger($.extend({type: 'submit'}, options.data));\n  },\n\n  /**\n   * Traps focus within a container, so when focus is tabbed out of it, it’s cycled back into it.\n   * @param {Object} container\n   */\n  trapFocusWithin: function (container) {\n    Garnish.trapFocusWithin(container);\n  },\n\n  /**\n   * Sets focus to the first focusable element within a container.\n   * @param {Object} container\n   */\n  setFocusWithin: function (container) {\n    Garnish.setFocusWithin(container);\n  },\n\n  /**\n   * Reduces an input’s value to characters that match the given regex pattern.\n   * @param {jQuery|HTMLElement} input\n   * @param {RegExp} regex\n   */\n  filterInputVal: function (input, regex) {\n    const $input = $(input);\n    const val = $input.val();\n    let selectionStart = $input[0].selectionStart;\n    let newVal = '';\n    for (let i = 0; i < val.length; i++) {\n      if (val[i].match(regex)) {\n        newVal += val[i];\n      } else if (i < selectionStart) {\n        selectionStart--;\n      }\n    }\n    if (newVal !== val) {\n      $input.val(newVal);\n      $input[0].setSelectionRange(selectionStart, selectionStart);\n    }\n  },\n\n  /**\n   * Reduces an input’s value to numeric characters.\n   * @param {jQuery|HTMLElement} input\n   * @param {RegExp} regex\n   */\n  filterNumberInputVal: function (input) {\n    this.filterInputVal(input, /[0-9.,\\-]/);\n  },\n\n  /**\n   * Sets/removes attributes on an element.\n   *\n   * Attributes set to `null` or `false` will be removed.\n   *\n   * @param {(jQuery|HTMLElement|string)} element\n   * @param {Object} attributes\n   */\n  setElementAttributes: function (element, attributes) {\n    const $element = $(element);\n\n    for (let name in attributes) {\n      if (!attributes.hasOwnProperty(name)) {\n        continue;\n      }\n\n      let value = attributes[name];\n\n      if (value === null || value === false) {\n        $element.removeAttr(name);\n      } else if (value === true) {\n        $element.attr(name, '');\n      } else if ($.isArray(value) || $.isPlainObject(value)) {\n        if (Craft.dataAttributes.includes(name)) {\n          // Make sure it's an object\n          value = Object.assign({}, value);\n          for (let n in value) {\n            if (!value.hasOwnProperty(n)) {\n              continue;\n            }\n            let subValue = value[n];\n            if (subValue === null || subValue === false) {\n              continue;\n            }\n            if ($.isPlainObject(subValue) || $.isArray(subValue)) {\n              subValue = JSON.stringify(subValue);\n            } else if (subValue === true) {\n              subValue = '';\n            } else {\n              subValue = this.escapeHtml(subValue);\n            }\n            $element.attr(`${name}-${n}`, subValue);\n          }\n        } else if (name === 'class') {\n          // Make sure it's an array\n          if ($.isPlainObject(value)) {\n            value = Object.values(value);\n          }\n          for (let c of value) {\n            $element.addClass(c);\n          }\n        } else if (name === 'style') {\n          $element.css(value);\n        } else {\n          $element.attr(name, JSON.stringify(value));\n        }\n      } else {\n        $element.attr(name, this.escapeHtml(value));\n      }\n    }\n  },\n\n  isVisible: function () {\n    return (\n      typeof document.visibilityState === 'undefined' ||\n      document.visibilityState === 'visible'\n    );\n  },\n\n  useMobileStyles: function () {\n    return Garnish.isMobileBrowser() || document.body.clientWidth < 600;\n  },\n});\n\n// -------------------------------------------\n//  Broadcast channel\n// -------------------------------------------\n\nCraft.pageId = Craft.uuid();\n\nif (typeof BroadcastChannel !== 'undefined') {\n  const channelName = `CraftCMS:${Craft.appId}`;\n  Craft.broadcaster = new BroadcastChannel(channelName);\n  Craft.messageReceiver = new BroadcastChannel(channelName);\n\n  Craft.messageReceiver.addEventListener('message', (ev) => {\n    if (ev.data.event === 'saveElement') {\n      // Are there any instances of the same element on the page?\n      const $elements = $(\n        `div.element[data-id=\"${ev.data.id}\"][data-settings]`\n      );\n      if (!$elements.length) {\n        return;\n      }\n      const data = {\n        type: $elements.data('type'),\n        id: ev.data.id,\n        instances: [],\n      };\n      for (let i = 0; i < $elements.length; i++) {\n        const $element = $elements.eq(i);\n        data.instances.push(\n          Object.assign(\n            {\n              siteId: $element.data('site-id'),\n            },\n            $element.data('settings')\n          )\n        );\n      }\n      Craft.sendActionRequest('POST', 'app/render-element', {data}).then(\n        ({data}) => {\n          for (let i = 0; i < $elements.length; i++) {\n            const $element = $elements.eq(i);\n            if (data.elementHtml[i]) {\n              const $replacement = $(data.elementHtml[i]);\n              for (let attribute of $replacement[0].attributes) {\n                if (attribute.name === 'class') {\n                  $element.addClass(attribute.value);\n                } else {\n                  $element.attr(attribute.name, attribute.value);\n                }\n              }\n              const $inputs = $element.find('input,button').detach();\n              $element.html($replacement.html());\n              if ($inputs.length) {\n                $inputs.prependTo($element);\n              }\n            }\n          }\n          new Craft.ElementThumbLoader().load($elements);\n        }\n      );\n    }\n  });\n}\n\n// -------------------------------------------\n//  Custom jQuery plugins\n// -------------------------------------------\n\n$.extend($.fn, {\n  animateLeft: function (pos, duration, easing, complete) {\n    if (Craft.orientation === 'ltr') {\n      return this.velocity({left: pos}, duration, easing, complete);\n    } else {\n      return this.velocity({right: pos}, duration, easing, complete);\n    }\n  },\n\n  animateRight: function (pos, duration, easing, complete) {\n    if (Craft.orientation === 'ltr') {\n      return this.velocity({right: pos}, duration, easing, complete);\n    } else {\n      return this.velocity({left: pos}, duration, easing, complete);\n    }\n  },\n\n  /**\n   * Disables elements by adding a .disabled class and preventing them from receiving focus.\n   */\n  disable: function () {\n    return this.each(function () {\n      var $elem = $(this);\n      $elem.addClass('disabled');\n\n      if ($elem.data('activatable')) {\n        $elem.removeAttr('tabindex');\n      }\n    });\n  },\n\n  /**\n   * Enables elements by removing their .disabled class and allowing them to receive focus.\n   */\n  enable: function () {\n    return this.each(function () {\n      var $elem = $(this);\n      $elem.removeClass('disabled');\n\n      if ($elem.data('activatable')) {\n        $elem.attr('tabindex', '0');\n      }\n    });\n  },\n\n  /**\n   * Sets the element as the container of a grid.\n   */\n  grid: function () {\n    return this.each(function () {\n      var $container = $(this),\n        settings = {};\n\n      if ($container.data('item-selector')) {\n        settings.itemSelector = $container.data('item-selector');\n      }\n      if ($container.data('cols')) {\n        settings.cols = parseInt($container.data('cols'));\n      }\n      if ($container.data('max-cols')) {\n        settings.maxCols = parseInt($container.data('max-cols'));\n      }\n      if ($container.data('min-col-width')) {\n        settings.minColWidth = parseInt($container.data('min-col-width'));\n      }\n      if ($container.data('mode')) {\n        settings.mode = $container.data('mode');\n      }\n      if ($container.data('fill-mode')) {\n        settings.fillMode = $container.data('fill-mode');\n      }\n      if ($container.data('col-class')) {\n        settings.colClass = $container.data('col-class');\n      }\n      if ($container.data('snap-to-grid')) {\n        settings.snapToGrid = !!$container.data('snap-to-grid');\n      }\n\n      new Craft.Grid(this, settings);\n    });\n  },\n\n  infoicon: function () {\n    return this.each(function () {\n      new Craft.InfoIcon(this);\n    });\n  },\n\n  /**\n   * Sets the element as a container for a checkbox select.\n   */\n  checkboxselect: function () {\n    return this.each(function () {\n      if (!$.data(this, 'checkboxselect')) {\n        new Garnish.CheckboxSelect(this);\n      }\n    });\n  },\n\n  /**\n   * Sets the element as a field toggle trigger.\n   */\n  fieldtoggle: function () {\n    return this.each(function () {\n      if (!$.data(this, 'fieldtoggle')) {\n        new Craft.FieldToggle(this);\n      }\n    });\n  },\n\n  lightswitch: function (settings, settingName, settingValue) {\n    // param mapping\n    if (settings === 'settings') {\n      if (typeof settingName === 'string') {\n        settings = {};\n        settings[settingName] = settingValue;\n      } else {\n        settings = settingName;\n      }\n\n      return this.each(function () {\n        var obj = $.data(this, 'lightswitch');\n        if (obj) {\n          obj.setSettings(settings);\n        }\n      });\n    } else {\n      if (!$.isPlainObject(settings)) {\n        settings = {};\n      }\n\n      return this.each(function () {\n        var thisSettings = $.extend({}, settings);\n\n        if (Garnish.hasAttr(this, 'data-value')) {\n          thisSettings.value = $(this).attr('data-value');\n        }\n\n        if (Garnish.hasAttr(this, 'data-indeterminate-value')) {\n          thisSettings.indeterminateValue = $(this).attr(\n            'data-indeterminate-value'\n          );\n        }\n\n        if (!$.data(this, 'lightswitch')) {\n          new Craft.LightSwitch(this, thisSettings);\n        }\n      });\n    }\n  },\n\n  nicetext: function () {\n    return this.each(function () {\n      if (!$.data(this, 'nicetext')) {\n        new Garnish.NiceText(this);\n      }\n    });\n  },\n\n  formsubmit: function () {\n    // Secondary form submit buttons\n    return this.on('click', function (ev) {\n      let $btn = $(ev.currentTarget);\n      let params = $btn.data('params') || {};\n      if ($btn.data('param')) {\n        params[$btn.data('param')] = $btn.data('value');\n      }\n\n      let $anchor = $btn.data('menu') ? $btn.data('menu').$anchor : $btn;\n      let $form = $anchor.attr('data-form')\n        ? $('#' + $anchor.attr('data-form'))\n        : $anchor.closest('form');\n\n      Craft.submitForm($form, {\n        confirm: $btn.data('confirm'),\n        action: $btn.data('action'),\n        redirect: $btn.data('redirect'),\n        params: params,\n        data: $.extend(\n          {\n            customTrigger: $btn,\n          },\n          $btn.data('event-data')\n        ),\n      });\n    });\n  },\n\n  menubtn: function () {\n    return this.each(function () {\n      var $btn = $(this);\n\n      if (!$btn.data('menubtn') && $btn.next().hasClass('menu')) {\n        var settings = {};\n\n        if ($btn.data('menu-anchor')) {\n          settings.menuAnchor = $btn.data('menu-anchor');\n        }\n\n        new Garnish.MenuBtn($btn, settings);\n      }\n    });\n  },\n\n  disclosureMenu: function () {\n    return this.each(function () {\n      const $trigger = $(this);\n      // Only instantiate if it's not already a disclosure trigger, and it references a disclosure content\n      if (!$trigger.data('trigger') && $trigger.attr('aria-controls')) {\n        new Garnish.DisclosureMenu($trigger);\n      }\n    });\n  },\n\n  datetime: function () {\n    return this.each(function () {\n      let $wrapper = $(this);\n      let $inputs = $wrapper.find('input:not([name$=\"[timezone]\"])');\n      let checkValue = () => {\n        let hasValue = false;\n        for (let i = 0; i < $inputs.length; i++) {\n          if ($inputs.eq(i).val()) {\n            hasValue = true;\n            break;\n          }\n        }\n        if (hasValue) {\n          if (!$wrapper.children('.clear-btn').length) {\n            let $btn = $('<button/>', {\n              type: 'button',\n              class: 'clear-btn',\n              title: Craft.t('app', 'Clear'),\n              'aria-label': Craft.t('app', 'Clear'),\n            })\n              .appendTo($wrapper)\n              .on('click', () => {\n                for (let i = 0; i < $inputs.length; i++) {\n                  $inputs.eq(i).val('').trigger('input').trigger('change');\n                }\n                $btn.remove();\n                $inputs.first().filter('[type=\"text\"]').focus();\n              });\n          }\n        } else {\n          $wrapper.children('.clear-btn').remove();\n        }\n      };\n      $inputs.on('change', checkValue);\n      checkValue();\n    });\n  },\n\n  datetimeinput: function () {\n    return this.each(function () {\n      const $input = $(this);\n      const checkValue = () => {\n        if ($input.val() === '') {\n          $input.addClass('empty-value');\n        } else {\n          $input.removeClass('empty-value');\n        }\n      };\n      $input.on('input', checkValue);\n      checkValue();\n    });\n  },\n});\n\n// Override Garnish.NiceText.charsLeftHtml() to be more accessible\nGarnish.NiceText.charsLeftHtml = (charsLeft) => {\n  return Craft.t(\n    'app',\n    '<span class=\"visually-hidden\">Characters left:</span> {chars, number}',\n    {\n      chars: charsLeft,\n    }\n  );\n};\n\nGarnish.$doc.ready(function () {\n  Craft.initUiElements();\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Customize Sources modal\n */\nCraft.CustomizeSourcesModal = Garnish.Modal.extend({\n  elementIndex: null,\n  $elementIndexSourcesContainer: null,\n\n  $sidebar: null,\n  $sidebarToggleBtn: null,\n  $sourcesContainer: null,\n  $sourcesHeader: null,\n  $sourcesHeading: null,\n  $sourceSettingsContainer: null,\n  $sourceSettingsHeader: null,\n  $addSourceMenu: null,\n  addSourceMenu: null,\n  $footer: null,\n  $footerBtnContainer: null,\n  $saveBtn: null,\n  $cancelBtn: null,\n  $loadingSpinner: null,\n\n  sourceSort: null,\n  sources: null,\n  selectedSource: null,\n\n  elementTypeName: null,\n  baseSortOptions: null,\n  availableTableAttributes: null,\n  customFieldAttributes: null,\n\n  conditionBuilderHtml: null,\n  conditionBuilderJs: null,\n  userGroups: null,\n\n  init: function (elementIndex, settings) {\n    this.base();\n\n    this.setSettings(settings, {\n      resizable: true,\n    });\n\n    this.elementIndex = elementIndex;\n    this.$elementIndexSourcesContainer = this.elementIndex.$sidebar\n      .children('nav')\n      .children('ul');\n\n    const $container = $(\n      '<form class=\"modal customize-sources-modal\"/>'\n    ).appendTo(Garnish.$bod);\n\n    this.$sidebar = $('<div class=\"cs-sidebar block-types\"/>')\n      .appendTo($container)\n      .attr({\n        role: 'navigation',\n        'aria-label': Craft.t('app', 'Source'),\n      });\n    this.$sourcesContainer = $('<div class=\"sources\">').appendTo(this.$sidebar);\n    this.$sourceSettingsContainer = $('<div class=\"source-settings\">').appendTo(\n      $container\n    );\n\n    this.$footer = $('<div class=\"footer\"/>').appendTo($container);\n    this.$footerBtnContainer = $('<div class=\"buttons right\"/>').appendTo(\n      this.$footer\n    );\n    this.$cancelBtn = $('<button/>', {\n      type: 'button',\n      class: 'btn',\n      text: Craft.t('app', 'Cancel'),\n    }).appendTo(this.$footerBtnContainer);\n    this.$saveBtn = Craft.ui\n      .createSubmitButton({\n        class: 'disabled',\n        label: Craft.t('app', 'Save'),\n        spinner: true,\n      })\n      .appendTo(this.$footerBtnContainer);\n\n    this.$loadingSpinner = $('<div class=\"spinner\"/>').appendTo(\n      this.$sourceSettingsContainer\n    );\n\n    this.setContainer($container);\n    this.show();\n\n    Craft.sendActionRequest(\n      'POST',\n      'element-index-settings/get-customize-sources-modal-data',\n      {\n        data: {\n          elementType: this.elementIndex.elementType,\n        },\n      }\n    )\n      .then((response) => {\n        this.$saveBtn.removeClass('disabled');\n        this.buildModal(response.data);\n      })\n      .finally(() => {\n        this.$loadingSpinner.remove();\n        Garnish.setFocusWithin(this.$sidebar);\n      });\n\n    this.addListener(this.$cancelBtn, 'click', 'hide');\n    this.addListener(this.$saveBtn, 'click', 'save');\n    this.addListener(this.$container, 'submit', 'save');\n  },\n\n  buildModal: function (response) {\n    this.baseSortOptions = response.baseSortOptions;\n    this.defaultSortOptions = response.defaultSortOptions;\n    this.availableTableAttributes = response.availableTableAttributes;\n    this.customFieldAttributes = response.customFieldAttributes;\n    this.elementTypeName = response.elementTypeName;\n    this.conditionBuilderHtml = response.conditionBuilderHtml;\n    this.conditionBuilderJs = response.conditionBuilderJs;\n    this.userGroups = response.userGroups;\n\n    if (response.headHtml) {\n      Craft.appendHeadHtml(response.headHtml);\n    }\n    if (response.bodyHtml) {\n      Craft.appendBodyHtml(response.bodyHtml);\n    }\n\n    // Create the source item sorter\n    this.sourceSort = new Garnish.DragSort({\n      handle: '.move',\n      axis: 'y',\n    });\n\n    // Create the sources\n    this.sources = [];\n\n    for (let i = 0; i < response.sources.length; i++) {\n      this.sources.push(this.addSource(response.sources[i]));\n    }\n\n    if (!this.selectedSource && typeof this.sources[0] !== 'undefined') {\n      this.sources[0].select();\n    }\n\n    const $menuBtnContainer = $(\n      '<div class=\"buttons left\" data-wrapper/>'\n    ).appendTo(this.$footer);\n    const $menuBtn = $('<button/>', {\n      type: 'button',\n      class: 'btn menubtn add icon',\n      'aria-label': Craft.t('app', 'Add…'),\n      'aria-controls': 'add-source-menu',\n      title: Craft.t('app', 'Add…'),\n      'data-disclosure-trigger': '',\n    }).appendTo($menuBtnContainer);\n\n    this.$addSourceMenu = $('<div/>', {\n      id: 'add-source-menu',\n      class: 'menu menu--disclosure',\n    }).appendTo($menuBtnContainer);\n\n    const addSource = (sourceData) => {\n      const source = this.addSource(sourceData, true);\n      Garnish.scrollContainerToElement(this.$sidebar, source.$item);\n      source.select();\n      this.addSourceMenu.hide();\n    };\n\n    const $newHeadingBtn = $('<button/>', {\n      type: 'button',\n      class: 'menu-option',\n      text: Craft.t('app', 'New heading'),\n    }).on('click', () => {\n      addSource({\n        type: 'heading',\n      });\n      this.focusLabelInput();\n    });\n\n    const $newCustomSourceBtn = $('<button/>', {\n      type: 'button',\n      class: 'menu-option',\n      text: Craft.t('app', 'New custom source'),\n      'data-type': 'custom',\n    }).on('click', () => {\n      const sortOptions = this.baseSortOptions.slice(0);\n      sortOptions.push(this.defaultSortOptions);\n\n      addSource({\n        type: 'custom',\n        key: `custom:${Craft.uuid()}`,\n        sortOptions: sortOptions,\n        defaultSort: [sortOptions[0].attr, sortOptions[1].defaultDir],\n        tableAttributes: [],\n        availableTableAttributes: [],\n      });\n      this.focusLabelInput();\n    });\n\n    const $ul = $('<ul/>')\n      .append($('<li/>').append($newHeadingBtn))\n      .appendTo(this.$addSourceMenu);\n\n    if (response.conditionBuilderHtml) {\n      $('<li/>').append($newCustomSourceBtn).appendTo($ul);\n    }\n\n    if (Craft.useMobileStyles()) {\n      this.buildSidebarToggleView();\n    }\n\n    // Add resize listener to enable/disable sidebar toggle view\n    this.addListener(Garnish.$win, 'resize', this.updateSidebarView);\n\n    this.addSourceMenu = new Garnish.DisclosureMenu($menuBtn);\n  },\n\n  focusLabelInput: function () {\n    this.selectedSource.$labelInput.trigger('focus');\n  },\n\n  getSourceName: function () {\n    return this.selectedSource\n      ? this.selectedSource.sourceData.label\n      : this.sources[0].sourceData.label;\n  },\n\n  updateSidebarView: function () {\n    if (Craft.useMobileStyles()) {\n      if (!this.$sidebarToggleBtn) this.buildSidebarToggleView();\n    } else {\n      if (this.$sidebarToggleBtn) this.resetView();\n    }\n  },\n\n  resetView: function () {\n    if (this.$sourceSettingsHeader) {\n      this.$sourceSettingsHeader.remove();\n    }\n\n    if (this.$sourcesHeader) {\n      this.$sourcesHeader.remove();\n    }\n\n    this.$sidebarToggleBtn = null;\n    this.$container.removeClass('sidebar-hidden');\n  },\n\n  updateHeading: function () {\n    if (!this.$sourcesHeading) return;\n\n    this.$sourcesHeading.text(this.getSourceName());\n  },\n\n  buildSidebarToggleView: function () {\n    this.$sourcesHeader = $('<div class=\"sources-header\"/>')\n      .addClass('sidebar-header')\n      .prependTo(this.$sourcesContainer);\n\n    this.$sidebarCloseBtn = Craft.ui\n      .createButton({\n        class: 'nav-close close-btn',\n      })\n      .attr('aria-label', Craft.t('app', 'Close'))\n      .removeClass('btn')\n      .appendTo(this.$sourcesHeader);\n\n    this.$sourcesHeading = $('<h1 class=\"main-heading\"/>').text(\n      this.getSourceName()\n    );\n\n    this.$sourceSettingsHeader = $('<div class=\"source-settings-header\"/>')\n      .addClass('main-header')\n      .append(this.$sourcesHeading)\n      .prependTo(this.$sourceSettingsContainer);\n\n    // Toggle sidebar button\n    const buttonConfig = {\n      toggle: true,\n      controls: 'modal-sidebar',\n      class: 'nav-toggle',\n    };\n\n    this.$sidebarToggleBtn = Craft.ui\n      .createButton(buttonConfig)\n      .removeClass('btn')\n      .attr('aria-label', Craft.t('app', 'Show sidebar'))\n      .appendTo(this.$sourceSettingsHeader);\n\n    this.closeSidebar();\n\n    // Add listeners\n    this.addListener(this.$sidebarToggleBtn, 'click', () => {\n      this.toggleSidebar();\n    });\n\n    this.addListener(this.$sidebarCloseBtn, 'click', () => {\n      this.toggleSidebar();\n      this.$sidebarToggleBtn.trigger('focus');\n    });\n  },\n\n  toggleSidebar: function () {\n    if (this.sidebarIsOpen()) {\n      this.closeSidebar();\n    } else {\n      this.openSidebar();\n    }\n  },\n\n  openSidebar: function () {\n    this.$container.removeClass('sidebar-hidden');\n    this.$sidebarToggleBtn.attr('aria-expanded', 'true');\n    this.$sidebar.find(':focusable').first().focus();\n\n    Garnish.uiLayerManager.addLayer(this.$sidebar);\n\n    Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n      this.closeSidebar();\n\n      if (Garnish.focusIsInside(this.$sidebar)) {\n        this.$sidebarToggleBtn.focus();\n      }\n    });\n  },\n\n  closeSidebar: function () {\n    this.$container.addClass('sidebar-hidden');\n\n    if (this.$sidebarToggleBtn) {\n      this.$sidebarToggleBtn.attr('aria-expanded', 'false');\n    }\n\n    // if sidebar is topmost layer, remove layer\n    if (Garnish.uiLayerManager.currentLayer.$container.hasClass('cs-sidebar')) {\n      Garnish.uiLayerManager.removeLayer();\n    }\n  },\n\n  sidebarIsOpen: function () {\n    return this.$sidebarToggleBtn.attr('aria-expanded') === 'true';\n  },\n\n  addSource: function (sourceData, isNew) {\n    const $item = $('<div class=\"customize-sources-item\"/>').appendTo(\n      this.$sourcesContainer\n    );\n    const $itemLabel = $('<div class=\"label customize-sources-item__btn\"/>')\n      .attr({\n        tabindex: '0',\n        role: 'button',\n      })\n      .appendTo($item);\n    const $itemInput = $('<input type=\"hidden\"/>').appendTo($item);\n    $(\n      `<a class=\"move icon customize-sources-item__move\" title=\"${Craft.t(\n        'app',\n        'Reorder'\n      )}\" role=\"button\"></a>`\n    ).appendTo($item);\n\n    let source;\n\n    if (sourceData.type === 'heading') {\n      $item.addClass('heading');\n      $itemInput.attr('name', 'sourceOrder[][heading]');\n      source = new Craft.CustomizeSourcesModal.Heading(\n        this,\n        $item,\n        $itemLabel,\n        $itemInput,\n        sourceData,\n        isNew\n      );\n      source.updateItemLabel(sourceData.heading);\n    } else {\n      $itemInput.attr('name', 'sourceOrder[][key]').val(sourceData.key);\n      if (sourceData.type === 'native') {\n        source = new Craft.CustomizeSourcesModal.Source(\n          this,\n          $item,\n          $itemLabel,\n          $itemInput,\n          sourceData,\n          isNew\n        );\n      } else {\n        source = new Craft.CustomizeSourcesModal.CustomSource(\n          this,\n          $item,\n          $itemLabel,\n          $itemInput,\n          sourceData,\n          isNew\n        );\n      }\n      source.updateItemLabel(sourceData.label);\n\n      // Select this by default?\n      if (sourceData.key === this.elementIndex.rootSourceKey) {\n        source.select();\n      }\n    }\n\n    this.sourceSort.addItems($item);\n    return source;\n  },\n\n  save: function (ev) {\n    if (ev) {\n      ev.preventDefault();\n    }\n\n    if (\n      this.$saveBtn.hasClass('disabled') ||\n      this.$saveBtn.hasClass('loading')\n    ) {\n      return;\n    }\n\n    this.$saveBtn.addClass('loading');\n\n    Craft.sendActionRequest(\n      'POST',\n      'element-index-settings/save-customize-sources-modal-settings',\n      {\n        data:\n          this.$container.serialize() +\n          `&elementType=${this.elementIndex.elementType}`,\n      }\n    )\n      .then(({data}) => {\n        // Figure out which source to select\n        let sourceKey = null;\n        if (\n          this.selectedSource &&\n          this.selectedSource.sourceData.key &&\n          !data.disabledSourceKeys.includes(this.selectedSource.sourceData.key)\n        ) {\n          sourceKey = this.selectedSource.sourceData.key;\n        } else if (!this.elementIndex.sourceKey) {\n          sourceKey = this.elementIndex.$visibleSources.first().data('key');\n        }\n\n        if (sourceKey) {\n          this.elementIndex.selectSourceByKey(sourceKey);\n        }\n\n        window.location.reload();\n      })\n      .catch(() => {\n        Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n      })\n      .finally(() => {\n        this.$saveBtn.removeClass('loading');\n      });\n  },\n\n  appendIndexSourceItem: function ($sourceItem, $lastSourceItem) {\n    if (!$lastSourceItem) {\n      $sourceItem.prependTo(this.$elementIndexSourcesContainer);\n    } else {\n      const isHeading = $sourceItem.hasClass('heading');\n      if ($lastSourceItem.hasClass('heading') && !isHeading) {\n        // First source to be placed below a new heading\n        $sourceItem.appendTo($lastSourceItem.children('ul'));\n      } else {\n        if (isHeading) {\n          // New heading. Swap $lastSourceItem with the top level <li> if it's nested\n          const $lastTopLevelSource = $lastSourceItem\n            .parentsUntil(this.$elementIndexSourcesContainer, 'li')\n            .last();\n          if ($lastTopLevelSource.length) {\n            $lastSourceItem = $lastTopLevelSource;\n          }\n        }\n        $sourceItem.insertAfter($lastSourceItem);\n      }\n    }\n  },\n\n  destroy: function () {\n    for (let i = 0; i < this.sources.length; i++) {\n      this.sources[i].destroy();\n    }\n\n    if (this.addSourceMenu) {\n      this.addSourceMenu.destroy();\n      this.$addSourceMenu.remove();\n    }\n\n    delete this.sources;\n    this.base();\n  },\n});\n\nCraft.CustomizeSourcesModal.BaseSource = Garnish.Base.extend({\n  modal: null,\n\n  $item: null,\n  $itemLabel: null,\n  $itemInput: null,\n  $settingsContainer: null,\n\n  sourceData: null,\n  isNew: null,\n\n  init: function (modal, $item, $itemLabel, $itemInput, sourceData, isNew) {\n    this.modal = modal;\n    this.$item = $item;\n    this.$itemLabel = $itemLabel;\n    this.$itemInput = $itemInput;\n    this.sourceData = sourceData;\n    this.isNew = isNew;\n\n    this.$item.data('source', this);\n\n    this.addListener(this.$itemLabel, 'click', 'select');\n    this.addListener(this.$itemLabel, 'keypress', (e) =>\n      Garnish.handleActivatingKeypress(e, this.select.bind(this))\n    );\n  },\n\n  isHeading: function () {\n    return false;\n  },\n\n  isNative: function () {\n    return false;\n  },\n\n  isSelected: function () {\n    return this.modal.selectedSource === this;\n  },\n\n  select: function () {\n    if (this.isSelected()) {\n      return;\n    }\n\n    if (this.modal.selectedSource) {\n      this.modal.selectedSource.deselect();\n    }\n\n    this.$item.addClass('sel');\n    this.$itemLabel.attr({\n      'aria-current': 'true',\n    });\n    this.modal.selectedSource = this;\n    this.modal.updateHeading();\n\n    if (!this.$settingsContainer) {\n      this.$settingsContainer = $('<div/>').appendTo(\n        this.modal.$sourceSettingsContainer\n      );\n      this.createSettings(this.$settingsContainer);\n    } else {\n      this.$settingsContainer.removeClass('hidden');\n    }\n\n    this.modal.$sourceSettingsContainer.scrollTop(0);\n  },\n\n  createSettings: function () {},\n\n  getIndexSourceItem: function () {},\n\n  deselect: function () {\n    this.$item.removeClass('sel');\n    this.$itemLabel.attr({\n      'aria-current': 'false',\n    });\n    this.modal.selectedSource = null;\n    this.$settingsContainer.addClass('hidden');\n  },\n\n  updateItemLabel: function (val) {\n    if (val) {\n      this.$itemLabel.text(val);\n    } else {\n      this.$itemLabel.html('&nbsp;');\n    }\n  },\n\n  destroy: function () {\n    this.modal.sourceSort.removeItems(this.$item);\n    this.modal.sources.splice($.inArray(this, this.modal.sources), 1);\n\n    if (this.isSelected()) {\n      this.deselect();\n\n      if (this.modal.sources.length) {\n        this.modal.sources[0].select();\n      }\n\n      Garnish.setFocusWithin(this.modal.$sourceSettingsContainer);\n    }\n\n    this.$item.data('source', null);\n    this.$item.remove();\n\n    if (this.$settingsContainer) {\n      this.$settingsContainer.remove();\n    }\n\n    this.base();\n  },\n});\n\nCraft.CustomizeSourcesModal.Source =\n  Craft.CustomizeSourcesModal.BaseSource.extend({\n    $sortAttributeSelect: null,\n    $sortDirectionPicker: null,\n    $sortDirectionInput: null,\n    sortDirectionListbox: null,\n\n    isNative: function () {\n      return true;\n    },\n\n    createSettings: function ($container) {\n      Craft.ui\n        .createLightswitchField({\n          label: Craft.t('app', 'Enabled'),\n          name: `sources[${this.sourceData.key}][enabled]`,\n          on: !this.sourceData.disabled,\n        })\n        .appendTo($container);\n      this.createSortField($container);\n      this.createTableAttributesField($container);\n    },\n\n    createSortField: function ($container) {\n      const $inputContainer = $('<div class=\"flex\"/>');\n\n      const $sortAttributeSelectContainer = Craft.ui\n        .createSelect({\n          name: `sources[${this.sourceData.key}][defaultSort][0]`,\n          options: this.sourceData.sortOptions.map((o) => {\n            return {\n              label: o.label,\n              value: o.attr,\n            };\n          }),\n          value: this.sourceData.defaultSort[0],\n        })\n        .addClass('fullwidth')\n        .appendTo($('<div/>').appendTo($inputContainer));\n\n      this.$sortAttributeSelect = $sortAttributeSelectContainer\n        .children('select')\n        .attr('aria-label', Craft.t('app', 'Sort attribute'));\n\n      this.$sortDirectionPicker = $('<section/>', {\n        class: 'btngroup btngroup--exclusive',\n        'aria-label': Craft.t('app', 'Sort direction'),\n      })\n        .append(\n          $('<button/>', {\n            type: 'button',\n            class: 'btn',\n            title: Craft.t('app', 'Sort ascending'),\n            'aria-label': Craft.t('app', 'Sort ascending'),\n            'aria-pressed': 'false',\n            'data-icon': 'asc',\n            'data-dir': 'asc',\n          })\n        )\n        .append(\n          $('<button/>', {\n            type: 'button',\n            class: 'btn',\n            title: Craft.t('app', 'Sort descending'),\n            'aria-label': Craft.t('app', 'Sort descending'),\n            'aria-pressed': 'false',\n            'data-icon': 'desc',\n            'data-dir': 'desc',\n          })\n        )\n        .appendTo($inputContainer);\n\n      this.$sortDirectionInput = $('<input/>', {\n        type: 'hidden',\n        name: `sources[${this.sourceData.key}][defaultSort][1]`,\n      }).appendTo($inputContainer);\n\n      this.sortDirectionListbox = new Craft.Listbox(this.$sortDirectionPicker, {\n        onChange: ($selectedOption) => {\n          this.$sortDirectionInput.val($selectedOption.data('dir'));\n        },\n      });\n\n      this.$sortAttributeSelect.on('change', () => {\n        this.handleSortAttributeChange();\n      });\n\n      this.handleSortAttributeChange(true);\n\n      Craft.ui\n        .createField($inputContainer, {\n          label: Craft.t('app', 'Default Sort'),\n          fieldset: true,\n        })\n        .appendTo($container)\n        .addClass('sort-field');\n    },\n\n    handleSortAttributeChange: function (useDefaultDir) {\n      const attr = this.$sortAttributeSelect.val();\n\n      if (attr === 'structure') {\n        this.sortDirectionListbox.select(0);\n        this.sortDirectionListbox.disable();\n        this.$sortDirectionPicker.addClass('disabled');\n      } else {\n        this.sortDirectionListbox.enable();\n        this.$sortDirectionPicker.removeClass('disabled');\n\n        const dir = useDefaultDir\n          ? this.sourceData.defaultSort[1]\n          : this.sourceData.sortOptions.find((o) => o.attr === attr).defaultDir;\n        this.sortDirectionListbox.select(dir === 'asc' ? 0 : 1);\n      }\n    },\n\n    createTableAttributesField: function ($container) {\n      const availableTableAttributes = this.availableTableAttributes();\n\n      if (\n        !this.sourceData.tableAttributes.length &&\n        !availableTableAttributes.length\n      ) {\n        return;\n      }\n\n      const $columnCheckboxes = $('<div/>');\n      const selectedAttributes = [];\n\n      $(\n        `<input type=\"hidden\" name=\"sources[${this.sourceData.key}][tableAttributes][]\" value=\"\"/>`\n      ).appendTo($columnCheckboxes);\n\n      // Add the selected columns, in the selected order\n      for (let i = 0; i < this.sourceData.tableAttributes.length; i++) {\n        let [key, label] = this.sourceData.tableAttributes[i];\n        $columnCheckboxes.append(\n          this.createTableColumnOption(key, label, true)\n        );\n        selectedAttributes.push(key);\n      }\n\n      // Add the rest\n      for (let i = 0; i < availableTableAttributes.length; i++) {\n        const [key, label] = availableTableAttributes[i];\n        if (!Craft.inArray(key, selectedAttributes)) {\n          $columnCheckboxes.append(\n            this.createTableColumnOption(key, label, false)\n          );\n        }\n      }\n\n      new Garnish.DragSort($columnCheckboxes.children(), {\n        handle: '.move',\n        axis: 'y',\n      });\n\n      Craft.ui\n        .createField($columnCheckboxes, {\n          label: Craft.t('app', 'Default Table Columns'),\n          instructions: Craft.t(\n            'app',\n            'Choose which table columns should be visible for this source by default.'\n          ),\n        })\n        .appendTo($container);\n    },\n\n    availableTableAttributes: function () {\n      const attributes = this.modal.availableTableAttributes.slice(0);\n      attributes.push(...this.sourceData.availableTableAttributes);\n      return attributes;\n    },\n\n    createTableColumnOption: function (key, label, checked) {\n      return $('<div class=\"customize-sources-table-column\"/>')\n        .append('<div class=\"icon move\"/>')\n        .append(\n          Craft.ui.createCheckbox({\n            label: Craft.escapeHtml(label),\n            name: `sources[${this.sourceData.key}][tableAttributes][]`,\n            value: key,\n            checked: checked,\n          })\n        );\n    },\n\n    getIndexSourceItem: function () {\n      const $source = this.modal.elementIndex.getSourceByKey(\n        this.sourceData.key\n      );\n\n      if ($source) {\n        return $source.closest('li');\n      }\n    },\n  });\n\nCraft.CustomizeSourcesModal.CustomSource =\n  Craft.CustomizeSourcesModal.Source.extend({\n    $labelInput: null,\n\n    createSettings: function ($container) {\n      const $labelField = Craft.ui\n        .createTextField({\n          label: Craft.t('app', 'Label'),\n          name: `sources[${this.sourceData.key}][label]`,\n          value: this.sourceData.label,\n        })\n        .appendTo($container);\n      this.$labelInput = $labelField.find('.text');\n      const defaultId = `condition${Math.floor(Math.random() * 1000000)}`;\n\n      const swapPlaceholders = (str) =>\n        str\n          .replace(/__ID__/g, defaultId)\n          .replace(\n            /__SOURCE_KEY__(?=-)/g,\n            Craft.formatInputId(this.sourceData.key)\n          )\n          .replace(/__SOURCE_KEY__/g, this.sourceData.key);\n\n      const conditionBuilderHtml =\n        this.sourceData.conditionBuilderHtml ||\n        swapPlaceholders(this.modal.conditionBuilderHtml);\n      const conditionBuilderJs =\n        this.sourceData.conditionBuilderJs ||\n        swapPlaceholders(this.modal.conditionBuilderJs);\n\n      Craft.ui\n        .createField($('<div/>').append(conditionBuilderHtml), {\n          id: 'criteria',\n          label: Craft.t('app', '{type} Criteria', {\n            type: this.modal.elementTypeName,\n          }),\n        })\n        .appendTo($container);\n      Craft.appendBodyHtml(conditionBuilderJs);\n\n      this.createSortField($container);\n      this.createTableAttributesField($container);\n\n      if (this.modal.userGroups.length) {\n        Craft.ui\n          .createCheckboxSelectField({\n            label: Craft.t('app', 'User Groups'),\n            instructions: Craft.t(\n              'app',\n              'Choose which user groups should have access to this source.'\n            ),\n            name: `sources[${this.sourceData.key}][userGroups]`,\n            options: this.modal.userGroups,\n            values: this.sourceData.userGroups || '*',\n            showAllOption: true,\n          })\n          .appendTo($container);\n      }\n\n      $container.append('<hr/>');\n\n      this.$deleteBtn = $('<a class=\"error delete\"/>')\n        .attr({\n          role: 'button',\n          tabindex: '0',\n        })\n        .text(Craft.t('app', 'Delete custom source'))\n        .appendTo($container);\n\n      this.addListener(this.$labelInput, 'input', 'handleLabelInputChange');\n      this.addListener(this.$deleteBtn, 'click', 'destroy');\n      this.addListener(this.$deleteBtn, 'keypress', (e) => {\n        Garnish.handleActivatingKeypress(e, this.destroy.bind(this));\n      });\n    },\n\n    availableTableAttributes: function () {\n      const attributes = this.base();\n      if (this.isNew) {\n        attributes.push(...this.modal.customFieldAttributes);\n      }\n      return attributes;\n    },\n\n    handleLabelInputChange: function () {\n      this.updateItemLabel(this.$labelInput.val());\n    },\n\n    getIndexSourceItem: function () {\n      let $source = this.base();\n      let $label;\n\n      if ($source) {\n        $label = $source.find('.label');\n      } else {\n        $label = $('<span/>', {class: 'label'});\n        $source = $('<li/>').append(\n          $('<a/>', {\n            'data-key': this.sourceData.key,\n          }).append($label)\n        );\n      }\n\n      if (this.$labelInput) {\n        let label = Craft.trim(this.$labelInput.val());\n        if (label === '') {\n          label = Craft.t('app', '(blank)');\n        }\n        $label.text(label);\n      }\n\n      return $source;\n    },\n  });\n\nCraft.CustomizeSourcesModal.Heading =\n  Craft.CustomizeSourcesModal.BaseSource.extend({\n    $labelInput: null,\n    $deleteBtn: null,\n\n    isHeading: function () {\n      return true;\n    },\n\n    createSettings: function ($container) {\n      const $labelField = Craft.ui\n        .createTextField({\n          label: Craft.t('app', 'Heading'),\n          instructions: Craft.t(\n            'app',\n            'This can be left blank if you just want an unlabeled separator.'\n          ),\n          value: this.sourceData.heading || '',\n        })\n        .appendTo($container);\n      this.$labelInput = $labelField.find('.text');\n\n      $container.append('<hr/>');\n\n      this.$deleteBtn = $('<a class=\"error delete\"/>')\n        .text(Craft.t('app', 'Delete heading'))\n        .attr({\n          role: 'button',\n          tabindex: '0',\n        })\n        .appendTo($container);\n\n      this.addListener(this.$labelInput, 'input', 'handleLabelInputChange');\n      this.addListener(this.$deleteBtn, 'click', 'destroy');\n      this.addListener(this.$deleteBtn, 'keypress', (e) => {\n        Garnish.handleActivatingKeypress(e, this.destroy.bind(this));\n      });\n    },\n\n    handleLabelInputChange: function () {\n      this.updateItemLabel(this.$labelInput.val());\n    },\n\n    updateItemLabel: function (val) {\n      this.$itemLabel.html(\n        (val\n          ? Craft.escapeHtml(val)\n          : `<em>${Craft.t('app', '(blank)')}</em>`) + '&nbsp;'\n      );\n      this.$itemInput.val(val);\n    },\n\n    getIndexSourceItem: function () {\n      const label =\n        (this.$labelInput ? this.$labelInput.val() : null) ||\n        this.sourceData.heading ||\n        '';\n      return $('<li class=\"heading\"/>')\n        .append($('<span/>').text(label))\n        .append('<ul/>');\n    },\n  });\n","/** global: Craft */\n/** global: Garnish */\n/**\n * DataTableSorter\n */\nCraft.DataTableSorter = Garnish.DragSort.extend(\n  {\n    $table: null,\n\n    init: function (table, settings) {\n      this.$table = $(table);\n      var $rows = this.$table.children('tbody').children(':not(.filler)');\n\n      settings = $.extend({}, Craft.DataTableSorter.defaults, settings);\n\n      settings.container = this.$table.children('tbody');\n      settings.helper = this.getHelper.bind(this);\n      settings.caboose = '<tr/>';\n      settings.axis = Garnish.Y_AXIS;\n      settings.magnetStrength = 4;\n      settings.helperLagBase = 1.5;\n\n      this.base($rows, settings);\n    },\n\n    getHelper: function ($helperRow) {\n      var $helper = $(\n          '<div class=\"' + this.settings.helperClass + '\"/>'\n        ).appendTo(Garnish.$bod),\n        $table = $('<table/>').appendTo($helper),\n        $tbody = $('<tbody/>').appendTo($table);\n\n      $helperRow.appendTo($tbody);\n\n      // Copy the table width and classes\n      $table.width(this.$table.width());\n      $table.prop('className', this.$table.prop('className'));\n\n      // Copy the column widths\n      var $firstRow = this.$table.find('tr:first'),\n        $cells = $firstRow.children(),\n        $helperCells = $helperRow.children();\n\n      for (var i = 0; i < $helperCells.length; i++) {\n        $($helperCells[i]).width($($cells[i]).width());\n      }\n\n      return $helper;\n    },\n  },\n  {\n    defaults: {\n      handle: '.move',\n      helperClass: 'datatablesorthelper',\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Delete User Modal\n */\nCraft.DeleteUserModal = Garnish.Modal.extend(\n  {\n    id: null,\n    userId: null,\n\n    $deleteActionRadios: null,\n    $deleteSubmitBtn: null,\n\n    userSelect: null,\n    _deleting: false,\n\n    init: function (userId, settings) {\n      this.id = Math.floor(Math.random() * 1000000000);\n      this.userId = userId;\n      settings = $.extend(Craft.DeleteUserModal.defaults, settings);\n\n      let $form = $(\n        '<form class=\"modal fitted deleteusermodal\" method=\"post\" accept-charset=\"UTF-8\">' +\n          Craft.getCsrfInput() +\n          '<input type=\"hidden\" name=\"action\" value=\"users/delete-user\"/>' +\n          (!Garnish.isArray(this.userId)\n            ? '<input type=\"hidden\" name=\"userId\" value=\"' + this.userId + '\"/>'\n            : '') +\n          (settings.redirect\n            ? '<input type=\"hidden\" name=\"redirect\" value=\"' +\n              settings.redirect +\n              '\"/>'\n            : '') +\n          '</form>'\n      ).appendTo(Garnish.$bod);\n      let $body = $(\n        '<div class=\"body\">' +\n          '<div class=\"content-summary\">' +\n          '<p>' +\n          Craft.t('app', 'What do you want to do with their content?') +\n          '</p>' +\n          '<ul class=\"bullets\"></ul>' +\n          '</div>' +\n          '<div class=\"options\">' +\n          '<label><input type=\"radio\" name=\"contentAction\" value=\"transfer\"/> ' +\n          Craft.t('app', 'Transfer it to:') +\n          '</label>' +\n          '<div id=\"transferselect' +\n          this.id +\n          '\" class=\"elementselect\">' +\n          '<div class=\"elements\"></div>' +\n          '<button type=\"button\" class=\"btn add icon dashed\">' +\n          Craft.t('app', 'Choose a user') +\n          '</button>' +\n          '</div>' +\n          '</div>' +\n          '<div>' +\n          '<label class=\"error\"><input type=\"radio\" name=\"contentAction\" value=\"delete\"/> ' +\n          Craft.t('app', 'Delete their content') +\n          '</label>' +\n          '</div>' +\n          '</div>'\n      ).appendTo($form);\n      let $buttons = $('<div class=\"buttons right\"/>').appendTo($body);\n      let $cancelBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn',\n        text: Craft.t('app', 'Cancel'),\n      }).appendTo($buttons);\n\n      if (settings.contentSummary.length) {\n        for (let i = 0; i < settings.contentSummary.length; i++) {\n          $body\n            .find('ul')\n            .append($('<li/>', {text: settings.contentSummary[i]}));\n        }\n      } else {\n        $body.find('ul').remove();\n      }\n\n      this.$deleteActionRadios = $body.find('input[type=radio]');\n      this.$deleteSubmitBtn = Craft.ui\n        .createSubmitButton({\n          class: 'disabled',\n          label: this._submitBtnLabel(false),\n          spinner: true,\n        })\n        .appendTo($buttons);\n\n      var idParam;\n\n      if (Garnish.isArray(this.userId)) {\n        idParam = ['and'];\n\n        for (let i = 0; i < this.userId.length; i++) {\n          idParam.push('not ' + this.userId[i]);\n        }\n      } else {\n        idParam = 'not ' + this.userId;\n      }\n\n      this.userSelect = new Craft.BaseElementSelectInput({\n        id: 'transferselect' + this.id,\n        name: 'transferContentTo',\n        elementType: 'craft\\\\elements\\\\User',\n        criteria: {\n          id: idParam,\n        },\n        limit: 1,\n        modalSettings: {\n          closeOtherModals: false,\n        },\n        onSelectElements: () => {\n          this.updateSizeAndPosition();\n\n          if (!this.$deleteActionRadios.first().prop('checked')) {\n            this.$deleteActionRadios.first().trigger('click');\n          } else {\n            this.validateDeleteInputs();\n          }\n        },\n        onRemoveElements: this.validateDeleteInputs.bind(this),\n        selectable: false,\n        editable: false,\n      });\n\n      this.addListener($cancelBtn, 'click', 'hide');\n\n      this.addListener(\n        this.$deleteActionRadios,\n        'change',\n        'validateDeleteInputs'\n      );\n      this.addListener($form, 'submit', 'handleSubmit');\n\n      this.base($form, settings);\n    },\n\n    _submitBtnLabel: function (withContent) {\n      let message = withContent\n        ? 'Delete {num, plural, =1{user} other{users}} and content'\n        : 'Delete {num, plural, =1{user} other{users}}';\n\n      return Craft.t('app', message, {\n        num: Garnish.isArray(this.userId) ? this.userId.length : 1,\n      });\n    },\n\n    validateDeleteInputs: function () {\n      var validates = false;\n\n      if (this.$deleteActionRadios.eq(1).prop('checked')) {\n        validates = true;\n        this.$deleteSubmitBtn.find('.label').text(this._submitBtnLabel(true));\n      } else {\n        this.$deleteSubmitBtn.find('.label').text(this._submitBtnLabel(false));\n        if (this.$deleteActionRadios.eq(0).prop('checked')) {\n          validates = !!this.userSelect.totalSelected;\n        }\n      }\n\n      this.updateSizeAndPosition();\n\n      if (validates) {\n        this.$deleteSubmitBtn.removeClass('disabled');\n      } else {\n        this.$deleteSubmitBtn.addClass('disabled');\n      }\n\n      return validates;\n    },\n\n    handleSubmit: function (ev) {\n      if (this._deleting || !this.validateDeleteInputs()) {\n        ev.preventDefault();\n        return;\n      }\n\n      this.$deleteSubmitBtn.addClass('loading');\n      this.disable();\n      this.userSelect.disable();\n      this._deleting = true;\n\n      // Let the onSubmit callback prevent the form from getting submitted\n      try {\n        if (this.settings.onSubmit() === false) {\n          ev.preventDefault();\n        }\n      } catch (e) {\n        ev.preventDefault();\n        this.$deleteSubmitBtn.removeClass('loading');\n        throw e;\n      }\n    },\n\n    onFadeIn: function () {\n      // Auto-focus the first radio\n      if (!Garnish.isMobileBrowser(true)) {\n        this.$deleteActionRadios.first().trigger('focus');\n      }\n\n      this.base();\n    },\n  },\n  {\n    defaults: {\n      contentSummary: [],\n      onSubmit: $.noop,\n      redirect: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Handle Generator\n */\nCraft.DynamicGenerator = Craft.BaseInputGenerator.extend({\n  callback: $.noop,\n\n  init: function (source, target, callback) {\n    this.callback = callback;\n    this.base(source, target);\n  },\n\n  generateTargetValue: function (sourceVal) {\n    return this.callback(sourceVal);\n  },\n});\n","/* jshint -W083 */\n/**\n * Editable table class\n */\nCraft.EditableTable = Garnish.Base.extend(\n  {\n    initialized: false,\n\n    id: null,\n    baseName: null,\n    columns: null,\n    sorter: null,\n    biggestId: -1,\n\n    $table: null,\n    $tbody: null,\n    $addRowBtn: null,\n    $tableParent: null,\n    $statusMessage: null,\n\n    rowCount: 0,\n    hasMaxRows: false,\n    hasMinRows: false,\n\n    radioCheckboxes: null,\n\n    init: function (id, baseName, columns, settings) {\n      this.id = id;\n      this.baseName = baseName;\n      this.columns = columns;\n      this.setSettings(settings, Craft.EditableTable.defaults);\n      this.radioCheckboxes = {};\n\n      this.$table = $('#' + id);\n      this.$tbody = this.$table.children('tbody');\n      this.$tableParent = this.$table.parent();\n      this.$statusMessage = this.$tableParent.find('[data-status-message]');\n      this.rowCount = this.$tbody.find('tr').length;\n\n      // Is this already an editable table?\n      if (this.$table.data('editable-table')) {\n        console.warn('Double-instantiating an editable table on an element');\n        this.$table.data('editable-table').destroy();\n      }\n\n      this.$table.data('editable-table', this);\n\n      this.sorter = new Craft.DataTableSorter(this.$table, {\n        helperClass: 'editabletablesorthelper',\n        copyDraggeeInputValuesToHelper: true,\n        onSortChange: () => {\n          this.updateAllRows();\n        },\n      });\n\n      if (this.isVisible()) {\n        this.initialize();\n      } else {\n        // Give everything a chance to initialize\n        window.setTimeout(this.initializeIfVisible.bind(this), 500);\n      }\n\n      if (this.settings.minRows && this.rowCount < this.settings.minRows) {\n        for (var i = this.rowCount; i < this.settings.minRows; i++) {\n          this.addRow();\n        }\n      }\n    },\n\n    isVisible: function () {\n      return this.$table.parent().height() > 0;\n    },\n\n    initialize: function () {\n      if (this.initialized) {\n        return false;\n      }\n\n      this.initialized = true;\n      this.removeListener(Garnish.$win, 'resize');\n\n      var $rows = this.$tbody.children();\n\n      for (var i = 0; i < $rows.length; i++) {\n        this.createRowObj($rows[i]);\n      }\n\n      const $container = this.$table.parent('.input');\n      if ($container.length && this.$table.width() > $container.width()) {\n        $container.css('overflow-x', 'auto');\n      }\n\n      this.$addRowBtn = this.$table.next('.add');\n      this.updateAddRowButton();\n      this.addListener(this.$addRowBtn, 'activate', 'addRow');\n      return true;\n    },\n    initializeIfVisible: function () {\n      this.removeListener(Garnish.$win, 'resize');\n\n      if (this.isVisible()) {\n        this.initialize();\n      } else {\n        this.addListener(Garnish.$win, 'resize', 'initializeIfVisible');\n      }\n    },\n    updateAddRowButton: function () {\n      if (!this.canAddRow()) {\n        this.$addRowBtn.css('opacity', '0.2');\n        this.$addRowBtn.css('pointer-events', 'none');\n        this.$addRowBtn.attr('aria-disabled', 'true');\n      } else {\n        this.$addRowBtn.css('opacity', '1');\n        this.$addRowBtn.css('pointer-events', 'auto');\n        this.$addRowBtn.attr('aria-disabled', 'false');\n      }\n    },\n    updateAllRows: function () {\n      if (this.settings.staticRows) {\n        return;\n      }\n      const $rows = this.$table.find('> tbody > tr');\n      for (let i = 0; i < $rows.length; i++) {\n        this.updateRow($rows.eq(i));\n      }\n    },\n    updateRow: function ($row) {\n      if (this.settings.staticRows) {\n        return;\n      }\n\n      const $deleteBtn = $row.find('button.delete');\n\n      if ($deleteBtn.length) {\n        $deleteBtn.attr(\n          'aria-label',\n          Craft.t('app', 'Delete row {index}', {\n            index: $row.index() + 1,\n          })\n        );\n        if (this.canDeleteRow()) {\n          $deleteBtn.removeAttr('disabled').removeClass('disabled');\n        } else {\n          $deleteBtn.attr('disabled', 'disabled').addClass('disabled');\n        }\n      }\n    },\n    /**\n     * @deprecated\n     */\n    updateDeleteRowButton: function (rowId) {\n      this.updateRow(this.$table.find(`tr[data-id=\"${rowId}\"]`));\n    },\n    updateStatusMessage: function () {\n      this.$statusMessage.empty();\n      let message;\n\n      if (!this.canAddRow()) {\n        message = Craft.t(\n          'app',\n          'Row could not be added. Maximum number of rows reached.'\n        );\n      } else {\n        message = Craft.t(\n          'app',\n          'Row could not be deleted. Minimum number of rows reached.'\n        );\n      }\n\n      setTimeout(() => {\n        this.$statusMessage.text(message);\n      }, 250);\n    },\n    canDeleteRow: function () {\n      if (!this.settings.allowDelete) {\n        return false;\n      }\n\n      return this.rowCount > this.settings.minRows;\n    },\n    deleteRow: function (row) {\n      if (!this.canDeleteRow()) {\n        this.updateStatusMessage();\n        return;\n      }\n\n      this.sorter.removeItems(row.$tr);\n      row.$tr.remove();\n\n      this.rowCount--;\n\n      this.updateAllRows();\n      this.updateAddRowButton();\n\n      if (this.rowCount === 0) {\n        this.$table.addClass('hidden');\n        this.$addRowBtn.trigger('focus');\n      } else {\n        // Focus element in previous row\n        this.$tbody.find(':focusable').last().trigger('focus');\n      }\n\n      // onDeleteRow callback\n      this.settings.onDeleteRow(row.$tr);\n\n      row.destroy();\n    },\n    canAddRow: function () {\n      if (!this.settings.allowAdd) {\n        return false;\n      }\n\n      if (this.settings.maxRows) {\n        return this.rowCount < this.settings.maxRows;\n      }\n\n      return true;\n    },\n    addRow: function (focus, prepend) {\n      if (!this.canAddRow()) {\n        this.updateStatusMessage();\n        return;\n      }\n\n      var rowId = this.settings.rowIdPrefix + (this.biggestId + 1),\n        $tr = this.createRow(\n          rowId,\n          this.columns,\n          this.baseName,\n          $.extend({}, this.settings.defaultValues)\n        );\n\n      if (prepend) {\n        $tr.prependTo(this.$tbody);\n      } else {\n        $tr.appendTo(this.$tbody);\n      }\n\n      var row = this.createRowObj($tr);\n      this.sorter.addItems($tr);\n\n      // Focus the first input in the row\n      if (focus !== false) {\n        $tr\n          .find('input:visible,textarea:visible,select:visible')\n          .first()\n          .trigger('focus');\n      }\n\n      this.rowCount++;\n      this.updateAllRows();\n      this.updateAddRowButton();\n      this.$table.removeClass('hidden');\n\n      // onAddRow callback\n      this.settings.onAddRow($tr);\n\n      return row;\n    },\n\n    createRow: function (rowId, columns, baseName, values) {\n      return Craft.EditableTable.createRow(\n        rowId,\n        columns,\n        baseName,\n        values,\n        this.settings.allowReorder,\n        this.settings.allowDelete\n      );\n    },\n\n    createRowObj: function ($tr) {\n      return new Craft.EditableTable.Row(this, $tr);\n    },\n\n    focusOnPrevRow: function ($tr, tdIndex, blurTd) {\n      var $prevTr = $tr.prev('tr');\n      var prevRow;\n\n      if ($prevTr.length) {\n        prevRow = $prevTr.data('editable-table-row');\n      } else {\n        prevRow = this.addRow(false, true);\n      }\n\n      // Focus on the same cell in the previous row\n      if (!prevRow) {\n        return;\n      }\n\n      if (!prevRow.$tds[tdIndex]) {\n        return;\n      }\n\n      if ($(prevRow.$tds[tdIndex]).hasClass('disabled')) {\n        if ($prevTr) {\n          this.focusOnPrevRow($prevTr, tdIndex, blurTd);\n        }\n        return;\n      }\n\n      var $input = $('textarea,input.text', prevRow.$tds[tdIndex]);\n      if ($input.length) {\n        $(blurTd).trigger('blur');\n        $input.trigger('focus');\n      }\n    },\n\n    focusOnNextRow: function ($tr, tdIndex, blurTd) {\n      var $nextTr = $tr.next('tr');\n      var nextRow;\n\n      if ($nextTr.length) {\n        nextRow = $nextTr.data('editable-table-row');\n      } else {\n        nextRow = this.addRow(false);\n      }\n\n      // Focus on the same cell in the next row\n      if (!nextRow) {\n        return;\n      }\n\n      if (!nextRow.$tds[tdIndex]) {\n        return;\n      }\n\n      if ($(nextRow.$tds[tdIndex]).hasClass('disabled')) {\n        if ($nextTr) {\n          this.focusOnNextRow($nextTr, tdIndex, blurTd);\n        }\n        return;\n      }\n\n      var $input = $('textarea,input.text', nextRow.$tds[tdIndex]);\n      if ($input.length) {\n        $(blurTd).trigger('blur');\n        $input.trigger('focus');\n      }\n    },\n\n    importData: function (data, row, tdIndex) {\n      let lines = data.split(/\\r?\\n|\\r/);\n      for (let i = 0; i < lines.length; i++) {\n        let values = lines[i].split('\\t');\n        for (let j = 0; j < values.length; j++) {\n          let value = values[j];\n          row.$tds\n            .eq(tdIndex + j)\n            .find('textarea,input[type!=hidden]')\n            .val(value)\n            .trigger('input');\n        }\n\n        // move onto the next row\n        let $nextTr = row.$tr.next('tr');\n        if ($nextTr.length) {\n          row = $nextTr.data('editable-table-row');\n        } else {\n          row = this.addRow(false);\n        }\n      }\n    },\n\n    destroy: function () {\n      this.$table.removeData('editable-table');\n      this.base();\n    },\n  },\n  {\n    textualColTypes: [\n      'autosuggest',\n      'color',\n      'date',\n      'email',\n      'multiline',\n      'number',\n      'singleline',\n      'template',\n      'time',\n      'url',\n    ],\n    defaults: {\n      rowIdPrefix: '',\n      defaultValues: {},\n      allowAdd: false,\n      allowReorder: false,\n      allowDelete: false,\n      minRows: null,\n      maxRows: null,\n      onAddRow: $.noop,\n      onDeleteRow: $.noop,\n    },\n\n    createRow: function (\n      rowId,\n      columns,\n      baseName,\n      values,\n      allowReorder,\n      allowDelete\n    ) {\n      var $tr = $('<tr/>', {\n        'data-id': rowId,\n      });\n\n      for (var colId in columns) {\n        if (!columns.hasOwnProperty(colId)) {\n          continue;\n        }\n\n        var col = columns[colId],\n          value = typeof values[colId] !== 'undefined' ? values[colId] : '',\n          $cell;\n\n        if (col.type === 'heading') {\n          $cell = $('<th/>', {\n            scope: 'row',\n            class: col['class'],\n            html: value,\n          });\n        } else {\n          var name = baseName + '[' + rowId + '][' + colId + ']';\n\n          $cell = $('<td/>', {\n            class: `${col.class} ${col.type}-cell`,\n            width: col.width,\n          });\n\n          if (Craft.inArray(col.type, Craft.EditableTable.textualColTypes)) {\n            $cell.addClass('textual');\n          }\n\n          if (col.code) {\n            $cell.addClass('code');\n          }\n\n          switch (col.type) {\n            case 'checkbox':\n              $('<div class=\"checkbox-wrapper\"/>')\n                .append(\n                  Craft.ui.createCheckbox({\n                    name: name,\n                    value: col.value || '1',\n                    checked: !!value,\n                  })\n                )\n                .appendTo($cell);\n              break;\n\n            case 'color':\n              Craft.ui\n                .createColorInput({\n                  name: name,\n                  value: value,\n                  small: true,\n                })\n                .appendTo($cell);\n              break;\n\n            case 'date':\n              Craft.ui\n                .createDateInput({\n                  name: name,\n                  value: value,\n                })\n                .appendTo($cell);\n              break;\n\n            case 'lightswitch':\n              Craft.ui\n                .createLightswitch({\n                  name: name,\n                  value: col.value || '1',\n                  on: !!value,\n                  small: true,\n                })\n                .appendTo($cell);\n              break;\n\n            case 'select':\n              Craft.ui\n                .createSelect({\n                  name: name,\n                  options: col.options,\n                  value:\n                    value ||\n                    (function () {\n                      for (var key in col.options) {\n                        if (\n                          col.options.hasOwnProperty(key) &&\n                          col.options[key].default\n                        ) {\n                          return typeof col.options[key].value !== 'undefined'\n                            ? col.options[key].value\n                            : key;\n                        }\n                      }\n                      return null;\n                    })(),\n                  class: 'small',\n                })\n                .appendTo($cell);\n              break;\n\n            case 'time':\n              Craft.ui\n                .createTimeInput({\n                  name: name,\n                  value: value,\n                })\n                .appendTo($cell);\n              break;\n\n            case 'email':\n            case 'url':\n              Craft.ui\n                .createTextInput({\n                  name: name,\n                  value: value,\n                  type: col.type,\n                  placeholder: col.placeholder || null,\n                })\n                .appendTo($cell);\n              break;\n\n            default:\n              $('<textarea/>', {\n                name: name,\n                rows: col.rows || 1,\n                val: value,\n                placeholder: col.placeholder,\n              }).appendTo($cell);\n          }\n        }\n\n        $cell.appendTo($tr);\n      }\n\n      if (allowReorder) {\n        $('<td/>', {\n          class: 'thin action',\n        })\n          .append(\n            $('<a/>', {\n              class: 'move icon',\n              title: Craft.t('app', 'Reorder'),\n              role: 'button',\n              type: 'button',\n            })\n          )\n          .appendTo($tr);\n      }\n\n      if (allowDelete) {\n        $('<td/>', {\n          class: 'thin action',\n        })\n          .append(\n            $('<button/>', {\n              class: 'delete icon',\n              title: Craft.t('app', 'Delete'),\n              type: 'button',\n            })\n          )\n          .appendTo($tr);\n      }\n\n      return $tr;\n    },\n  }\n);\n\n/**\n * Editable table row class\n */\nCraft.EditableTable.Row = Garnish.Base.extend(\n  {\n    table: null,\n    id: null,\n    niceTexts: null,\n\n    $tr: null,\n    $tds: null,\n    tds: null,\n    $textareas: null,\n    $deleteBtn: null,\n\n    init: function (table, tr) {\n      this.table = table;\n      this.$tr = $(tr);\n      this.$tds = this.$tr.children();\n      this.tds = [];\n      this.id = this.$tr.attr('data-id');\n\n      this.$tr.data('editable-table-row', this);\n\n      // Get the row ID, sans prefix\n      var id = parseInt(\n        this.id.substring(this.table.settings.rowIdPrefix.length)\n      );\n\n      if (id > this.table.biggestId) {\n        this.table.biggestId = id;\n      }\n\n      this.$textareas = $();\n      this.niceTexts = [];\n      var textareasByColId = {};\n\n      var i = 0;\n      var colId, col, td, $textarea, $checkbox;\n\n      for (colId in this.table.columns) {\n        if (!this.table.columns.hasOwnProperty(colId)) {\n          continue;\n        }\n\n        col = this.table.columns[colId];\n        td = this.tds[colId] = this.$tds[i];\n\n        if (Craft.inArray(col.type, Craft.EditableTable.textualColTypes)) {\n          $textarea = $('textarea', td);\n          this.$textareas = this.$textareas.add($textarea);\n\n          this.addListener($textarea, 'focus', 'onTextareaFocus');\n          this.addListener($textarea, 'mousedown', 'ignoreNextTextareaFocus');\n\n          this.niceTexts.push(\n            new Garnish.NiceText($textarea, {\n              onHeightChange: this.onTextareaHeightChange.bind(this),\n            })\n          );\n\n          this.addListener(\n            $textarea,\n            'keypress',\n            {tdIndex: i, type: col.type},\n            'handleKeypress'\n          );\n          this.addListener(\n            $textarea,\n            'input',\n            {type: col.type},\n            'validateValue'\n          );\n          $textarea.trigger('input');\n\n          if (col.type !== 'multiline') {\n            this.addListener(\n              $textarea,\n              'paste',\n              {tdIndex: i, type: col.type},\n              'handlePaste'\n            );\n          }\n\n          textareasByColId[colId] = $textarea;\n        } else if (col.type === 'checkbox') {\n          $checkbox = $('input[type=\"checkbox\"]', td);\n\n          if (col.radioMode) {\n            if (typeof this.table.radioCheckboxes[colId] === 'undefined') {\n              this.table.radioCheckboxes[colId] = [];\n            }\n            this.table.radioCheckboxes[colId].push($checkbox[0]);\n            this.addListener(\n              $checkbox,\n              'change',\n              {colId},\n              'onRadioCheckboxChange'\n            );\n          }\n\n          if (col.toggle) {\n            this.addListener($checkbox, 'change', {colId}, function (ev) {\n              this.applyToggleCheckbox(ev.data.colId);\n            });\n          }\n        }\n\n        if (!$(td).hasClass('disabled')) {\n          this.addListener(td, 'click', {td}, function (ev) {\n            if (ev.target === ev.data.td) {\n              $(ev.data.td).find('textarea,input,select,.lightswitch').focus();\n            }\n          });\n        }\n\n        i++;\n      }\n\n      // Now that all of the text cells have been nice-ified, let's normalize the heights\n      this.onTextareaHeightChange();\n\n      // See if we need to apply any checkbox toggles now that we've indexed all the TDs\n      for (colId in this.table.columns) {\n        if (!this.table.columns.hasOwnProperty(colId)) {\n          continue;\n        }\n        col = this.table.columns[colId];\n        if (col.type === 'checkbox' && col.toggle) {\n          this.applyToggleCheckbox(colId);\n        }\n      }\n\n      // Now look for any autopopulate columns\n      for (colId in this.table.columns) {\n        if (!this.table.columns.hasOwnProperty(colId)) {\n          continue;\n        }\n\n        col = this.table.columns[colId];\n\n        if (\n          col.autopopulate &&\n          typeof textareasByColId[col.autopopulate] !== 'undefined' &&\n          !textareasByColId[colId].val()\n        ) {\n          new Craft.HandleGenerator(\n            textareasByColId[colId],\n            textareasByColId[col.autopopulate],\n            {\n              allowNonAlphaStart: true,\n            }\n          );\n        }\n      }\n\n      var $deleteBtn = this.$tr.children().last().find('.delete');\n      this.addListener($deleteBtn, 'click', 'deleteRow');\n\n      var $inputs = this.$tr.find('input,textarea,select,.lightswitch');\n      this.addListener($inputs, 'focus', function (ev) {\n        $(ev.currentTarget).closest('td:not(.disabled)').addClass('focus');\n      });\n      this.addListener($inputs, 'blur', function (ev) {\n        $(ev.currentTarget).closest('td').removeClass('focus');\n      });\n    },\n\n    onTextareaFocus: function (ev) {\n      this.onTextareaHeightChange();\n\n      var $textarea = $(ev.currentTarget);\n\n      if ($textarea.data('ignoreNextFocus')) {\n        $textarea.data('ignoreNextFocus', false);\n        return;\n      }\n\n      window.setTimeout(function () {\n        Craft.selectFullValue($textarea);\n      }, 0);\n    },\n\n    onRadioCheckboxChange: function (ev) {\n      if (ev.currentTarget.checked) {\n        for (\n          var i = 0;\n          i < this.table.radioCheckboxes[ev.data.colId].length;\n          i++\n        ) {\n          var checkbox = this.table.radioCheckboxes[ev.data.colId][i];\n          checkbox.checked = checkbox === ev.currentTarget;\n        }\n      }\n    },\n\n    applyToggleCheckbox: function (checkboxColId) {\n      var checkboxCol = this.table.columns[checkboxColId];\n      var checked = $('input[type=\"checkbox\"]', this.tds[checkboxColId]).prop(\n        'checked'\n      );\n      var colId, colIndex, neg;\n      for (var i = 0; i < checkboxCol.toggle.length; i++) {\n        colId = checkboxCol.toggle[i];\n        colIndex = this.table.colum;\n        neg = colId[0] === '!';\n        if (neg) {\n          colId = colId.substring(1);\n        }\n        if ((checked && !neg) || (!checked && neg)) {\n          $(this.tds[colId])\n            .removeClass('disabled')\n            .find('textarea, input')\n            .prop('disabled', false);\n        } else {\n          $(this.tds[colId])\n            .addClass('disabled')\n            .find('textarea, input')\n            .prop('disabled', true);\n        }\n      }\n    },\n\n    ignoreNextTextareaFocus: function (ev) {\n      $.data(ev.currentTarget, 'ignoreNextFocus', true);\n    },\n\n    handleKeypress: function (ev) {\n      var keyCode = ev.keyCode ? ev.keyCode : ev.charCode;\n      var ctrl = Garnish.isCtrlKeyPressed(ev);\n\n      // Going to the next/previous row?\n      if (\n        keyCode === Garnish.RETURN_KEY &&\n        (ev.data.type !== 'multiline' || ctrl)\n      ) {\n        ev.preventDefault();\n        if (ev.shiftKey) {\n          this.table.focusOnPrevRow(\n            this.$tr,\n            ev.data.tdIndex,\n            ev.currentTarget\n          );\n        } else {\n          this.table.focusOnNextRow(\n            this.$tr,\n            ev.data.tdIndex,\n            ev.currentTarget\n          );\n        }\n        return;\n      }\n    },\n\n    handlePaste: function (ev) {\n      let data = Craft.trim(\n        ev.originalEvent.clipboardData.getData('Text'),\n        ' \\n\\r'\n      );\n      if (!data.match(/[\\t\\r\\n]/)) {\n        return;\n      }\n      ev.preventDefault();\n      this.table.importData(data, this, ev.data.tdIndex);\n    },\n\n    validateValue: function (ev) {\n      if (ev.data.type === 'multiline') {\n        return;\n      }\n\n      if (ev.data.type === 'number') {\n        Craft.filterNumberInputVal(ev.currentTarget);\n        return;\n      }\n\n      // Strip any newlines\n      const safeValue = ev.currentTarget.value.replace(/[\\r\\n]/g, '');\n      if (safeValue !== ev.currentTarget.value) {\n        ev.currentTarget.value = safeValue;\n      }\n    },\n\n    onTextareaHeightChange: function () {\n      // Keep all the textareas' heights in sync\n      var tallestTextareaHeight = -1;\n\n      for (var i = 0; i < this.niceTexts.length; i++) {\n        if (this.niceTexts[i].height > tallestTextareaHeight) {\n          tallestTextareaHeight = this.niceTexts[i].height;\n        }\n      }\n\n      this.$textareas.css('min-height', tallestTextareaHeight);\n\n      // If the <td> is still taller, go with that instead\n      var tdHeight = this.$textareas\n        .filter(':visible')\n        .first()\n        .parent()\n        .height();\n\n      if (tdHeight > tallestTextareaHeight) {\n        this.$textareas.css('min-height', tdHeight);\n      }\n    },\n\n    deleteRow: function () {\n      this.table.deleteRow(this);\n    },\n  },\n  {\n    /** @deprecated */\n    numericKeyCodes: [\n      9 /* (tab) */, 8 /* (delete) */, 37, 38, 39, 40 /* (arrows) */, 45,\n      91 /* (minus) */, 46, 190 /* period */, 48, 49, 50, 51, 52, 53, 54, 55,\n      56, 57 /* (0-9) */,\n    ],\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element Action Trigger\n */\nCraft.ElementActionTrigger = Garnish.Base.extend(\n  {\n    maxLevels: null,\n    newChildUrl: null,\n    $trigger: null,\n    $selectedItems: null,\n    triggerEnabled: true,\n\n    init: function (settings) {\n      if (!$.isPlainObject(settings)) {\n        settings = {};\n      }\n\n      // batch => bulk\n      if (typeof settings.batch !== 'undefined') {\n        settings.bulk = settings.batch;\n        delete settings.batch;\n      }\n      Object.defineProperty(settings, 'batch', {\n        get() {\n          return this.bulk;\n        },\n        set(v) {\n          this.bulk = v;\n        },\n      });\n\n      this.setSettings(settings, Craft.ElementActionTrigger.defaults);\n\n      this.$trigger = $(\n        '#' + settings.type.replace(/[\\[\\]\\\\]+/g, '-') + '-actiontrigger'\n      );\n\n      // Do we have a custom handler?\n      if (this.settings.activate) {\n        // Prevent the element index's click handler\n        this.$trigger.data('custom-handler', true);\n\n        // Is this a custom trigger?\n        if (this.$trigger.prop('nodeName') === 'FORM') {\n          this.addListener(this.$trigger, 'submit', 'handleTriggerActivation');\n        } else {\n          this.addListener(this.$trigger, 'click', 'handleTriggerActivation');\n        }\n      }\n\n      this.updateTrigger();\n      Craft.elementIndex.on('selectionChange', this.updateTrigger.bind(this));\n    },\n\n    updateTrigger: function () {\n      // Ignore if the last element was just unselected\n      if (Craft.elementIndex.getSelectedElements().length === 0) {\n        return;\n      }\n\n      if (this.validateSelection()) {\n        this.enableTrigger();\n      } else {\n        this.disableTrigger();\n      }\n    },\n\n    /**\n     * Determines if this action can be performed on the currently selected elements.\n     *\n     * @returns {boolean}\n     */\n    validateSelection: function () {\n      var valid = true;\n      this.$selectedItems = Craft.elementIndex.getSelectedElements();\n\n      if (!this.settings.bulk && this.$selectedItems.length > 1) {\n        valid = false;\n      } else if (typeof this.settings.validateSelection === 'function') {\n        valid = this.settings.validateSelection(this.$selectedItems);\n      }\n\n      return valid;\n    },\n\n    enableTrigger: function () {\n      if (this.triggerEnabled) {\n        return;\n      }\n\n      this.$trigger.removeClass('disabled');\n      this.triggerEnabled = true;\n    },\n\n    disableTrigger: function () {\n      if (!this.triggerEnabled) {\n        return;\n      }\n\n      this.$trigger.addClass('disabled');\n      this.triggerEnabled = false;\n    },\n\n    handleTriggerActivation: function (ev) {\n      ev.preventDefault();\n      ev.stopPropagation();\n\n      if (this.triggerEnabled) {\n        this.settings.activate(this.$selectedItems);\n      }\n    },\n  },\n  {\n    defaults: {\n      type: null,\n      bulk: true,\n      validateSelection: null,\n      activate: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Element Editor\n */\nCraft.ElementEditor = Garnish.Base.extend(\n  {\n    isFullPage: null,\n    $container: null,\n    $tabContainer: null,\n    $contentContainer: null,\n    $revisionBtn: null,\n    $revisionLabel: null,\n    $spinner: null,\n    $expandSiteStatusesBtn: null,\n    $statusIcon: null,\n    $previewBtn: null,\n\n    $editMetaBtn: null,\n    metaHud: null,\n    $nameTextInput: null,\n    $saveMetaBtn: null,\n\n    $siteStatusPane: null,\n    $globalLightswitch: null,\n    $siteLightswitches: null,\n    $additionalSiteField: null,\n\n    siteIds: null,\n    newSiteIds: null,\n\n    enableAutosave: null,\n    lastSerializedValue: null,\n    listeningForChanges: false,\n    pauseLevel: 0,\n    timeout: null,\n    cancelToken: null,\n    ignoreFailedRequest: false,\n    queue: null,\n    submittingForm: false,\n\n    duplicatedElements: null,\n    failed: false,\n    httpStatus: null,\n    httpError: null,\n\n    openingPreview: false,\n    preview: null,\n    activatedPreviewToken: false,\n    previewTokenQueue: null,\n    previewLinks: null,\n    scrollY: null,\n\n    hiddenTipsStorageKey: 'Craft-' + Craft.systemUid + '.TipField.hiddenTips',\n\n    get tipDismissBtn() {\n      return this.$container.find('.tip-dismiss-btn');\n    },\n\n    get slideout() {\n      return this.$container.data('slideout');\n    },\n\n    init: function (container, settings) {\n      this.$container = $(container);\n\n      if (this.$container.prop('tagName') !== 'FORM') {\n        throw 'Element editors may only be used with forms.';\n      }\n\n      if (this.$container.data('elementEditor')) {\n        console.warn('Double-instantiating an element editor on an element.');\n        this.$container.data('elementEditor').destroy();\n      }\n\n      this.$container.data('elementEditor', this);\n      this.$container.attr('data-element-editor', '');\n\n      this.setSettings(settings, Craft.ElementEditor.defaults);\n\n      this.isFullPage = this.$container[0] === Craft.cp.$primaryForm[0];\n\n      if (this.isFullPage) {\n        this.$tabContainer = $('#tabs');\n        this.$contentContainer = $('#content');\n      } else {\n        this.$tabContainer = this.slideout.$tabContainer;\n        this.$contentContainer = this.slideout.$content;\n      }\n\n      this.queue = this._createQueue();\n      this.previewTokenQueue = this._createQueue();\n\n      this.duplicatedElements = {};\n      this.enableAutosave = Craft.autosaveDrafts;\n      this.previewLinks = [];\n\n      this.siteIds = Object.keys(this.settings.siteStatuses).map((siteId) => {\n        return parseInt(siteId);\n      });\n\n      this.$revisionBtn = this.$container.find('.context-btn');\n      this.$revisionLabel = this.$container.find('.revision-label');\n      this.$previewBtn = this.$container.find('.preview-btn');\n\n      const $spinnerContainer = this.isFullPage\n        ? $('#page-title')\n        : this.slideout.$toolbar;\n      this.$spinner = $('<div/>', {\n        class: 'revision-spinner spinner hidden',\n        title: Craft.t('app', 'Saving'),\n      }).appendTo($spinnerContainer);\n      this.$statusIcon = $('<div/>', {\n        class: `revision-status ${this.isFullPage ? 'invisible' : 'hidden'}`,\n      }).appendTo($spinnerContainer);\n      this.$statusMessage = $('<div/>', {\n        class: 'revision-status-message visually-hidden',\n        'aria-live': 'polite',\n      }).appendTo($spinnerContainer);\n\n      this.$expandSiteStatusesBtn = $('.expand-status-btn');\n\n      if (this.settings.canEditMultipleSites) {\n        this.addListener(\n          this.$expandSiteStatusesBtn,\n          'click',\n          'expandSiteStatuses'\n        );\n      }\n\n      if (this.settings.previewTargets.length && this.isFullPage) {\n        if (this.settings.enablePreview) {\n          this.addListener(this.$previewBtn, 'click', 'openPreview');\n        }\n\n        const $previewBtnContainer = this.$container.find(\n          '.preview-btn-container'\n        );\n\n        if (this.settings.previewTargets.length === 1) {\n          const [target] = this.settings.previewTargets;\n          this.createPreviewLink(target)\n            .addClass('view-btn btn')\n            .attr('aria-label', Craft.t('app', 'View'))\n            .appendTo($previewBtnContainer);\n        } else {\n          this.createShareMenu($previewBtnContainer);\n        }\n      }\n\n      // If this is a revision, we're done here\n      if (this.settings.revisionId) {\n        return;\n      }\n\n      // Override the serializer to use our own\n      this.$container.data('serializer', () => this.serializeForm(true));\n      this.$container.data('initialSerializedValue', this.serializeForm(true));\n\n      if (this.isFullPage) {\n        this.addListener(this.$container, 'submit', 'handleSubmit');\n      }\n\n      if (this.settings.isProvisionalDraft) {\n        this.initForProvisionalDraft();\n      } else if (this.settings.draftId && !this.settings.isUnpublishedDraft) {\n        this.initForDraft();\n      } else if (!this.settings.canSaveCanonical) {\n        // Override the save shortcut to create a draft too\n        this.addListener(this.$container, 'submit.saveShortcut', (ev) => {\n          if (ev.saveShortcut) {\n            ev.preventDefault();\n            this.createDraft();\n            this.removeListener(this.$container, 'submit.saveShortcut');\n          }\n        });\n      }\n\n      this.listenForChanges();\n\n      this.addListener(this.$statusIcon, 'click', () => {\n        this.showStatusHud(this.$statusIcon);\n      });\n\n      // handle closing tips\n      this.handleDismissibleTips();\n\n      if (this.isFullPage && Craft.messageReceiver) {\n        // Listen on Craft.broadcaster to ignore any messages sent by this very page\n        Craft.broadcaster.addEventListener('message', (ev) => {\n          if (\n            (ev.data.event === 'saveDraft' &&\n              ev.data.canonicalId === this.settings.canonicalId &&\n              (ev.data.draftId === this.settings.draftId ||\n                (ev.data.isProvisionalDraft && !this.settings.draftId))) ||\n            (ev.data.event === 'saveElement' &&\n              ev.data.id === this.settings.canonicalId &&\n              !this.settings.draftId)\n          ) {\n            Craft.setLocalStorage('scrollY', window.scrollY);\n            window.location.reload();\n          } else if (\n            ev.data.event === 'deleteDraft' &&\n            ev.data.canonicalId === this.settings.canonicalId &&\n            ev.data.draftId === this.settings.draftId\n          ) {\n            const url = new URL(window.location.href);\n            url.searchParams.delete('draftId');\n            if (url.href !== document.location.href) {\n              window.location.href = url;\n            } else {\n              Craft.setLocalStorage('scrollY', window.scrollY);\n              window.location.reload();\n            }\n          }\n        });\n      }\n    },\n\n    _createQueue: function () {\n      const queue = new Craft.Queue();\n      queue.on('beforeRun', () => {\n        this.showSpinner();\n      });\n      queue.on('afterRun', () => {\n        this.hideSpinner();\n      });\n      return queue;\n    },\n\n    get namespace() {\n      if (this.isFullPage) {\n        return null;\n      }\n\n      return this.slideout.namespace;\n    },\n\n    namespaceInputName(name) {\n      return Craft.namespaceInputName(name, this.namespace);\n    },\n\n    namespaceId(id) {\n      return Craft.namespaceId(id, this.namespace);\n    },\n\n    listenForChanges: function () {\n      if (\n        this.listeningForChanges ||\n        this.pauseLevel > 0 ||\n        !this.enableAutosave ||\n        !this.settings.canCreateDrafts\n      ) {\n        return;\n      }\n\n      this.listeningForChanges = true;\n\n      // Listen for events on the body when editing a full page form, so we don’t miss events from Live Preview\n      const $target = this.isFullPage ? Garnish.$bod : this.$container;\n\n      this.addListener(\n        $target,\n        'keypress,keyup,change,focus,blur,click,mousedown,mouseup',\n        (ev) => {\n          if ($(ev.target).is(this.statusIcons())) {\n            return;\n          }\n          clearTimeout(this.timeout);\n          // If they are typing, wait half a second before checking the form\n          if (['keypress', 'keyup', 'change'].includes(ev.type)) {\n            this.timeout = setTimeout(this.checkForm.bind(this), 500);\n          } else {\n            this.checkForm();\n          }\n        }\n      );\n    },\n\n    stopListeningForChanges: function () {\n      if (!this.listeningForChanges) {\n        return;\n      }\n\n      this.removeListener(\n        Garnish.$bod,\n        'keypress,keyup,change,focus,blur,click,mousedown,mouseup'\n      );\n      clearTimeout(this.timeout);\n      this.listeningForChanges = false;\n    },\n\n    pause: function () {\n      this.pauseLevel++;\n      this.stopListeningForChanges();\n    },\n\n    resume: function () {\n      if (this.pauseLevel === 0) {\n        throw 'Craft.ElementEditor::resume() should only be called after pause().';\n      }\n\n      // Only actually resume operation if this has been called the same\n      // number of times that pause() was called\n      this.pauseLevel--;\n      if (this.pauseLevel === 0) {\n        if (this.enableAutosave) {\n          this.checkForm();\n          this.listenForChanges();\n        }\n      }\n    },\n\n    initForProvisionalDraft: function () {\n      let $discardButton = this.$container.find('.discard-changes-btn');\n\n      if (!$discardButton.length) {\n        let initialHeight, scrollTop;\n\n        let $noticeContainer;\n        if (this.isFullPage) {\n          initialHeight = $('#content').height();\n          scrollTop = Garnish.$win.scrollTop();\n          $noticeContainer = Craft.cp.$noticeContainer;\n        } else {\n          $noticeContainer = this.$container.find('.so-notice');\n        }\n\n        const $notice = $('<div/>', {\n          class: 'draft-notice',\n        })\n          .append(\n            $('<div/>', {\n              class: 'draft-icon',\n              'aria-hidden': 'true',\n              'data-icon': 'edit',\n            })\n          )\n          .append(\n            $('<p/>', {\n              text: Craft.t('app', 'Showing your unsaved changes.'),\n            })\n          )\n          .appendTo($noticeContainer);\n\n        $discardButton = $('<button/>', {\n          type: 'button',\n          class: 'discard-changes-btn btn',\n          text: Craft.t('app', 'Discard'),\n        }).appendTo($notice);\n\n        if (this.isFullPage) {\n          const heightDiff = $('#content').height() - initialHeight;\n          Garnish.$win.scrollTop(scrollTop + heightDiff);\n\n          // If there isn’t enough content to simulate the same scroll position, slide it down instead\n          if (Garnish.$win.scrollTop() === scrollTop) {\n            // Disable pointer events until half a second after the animation is complete\n            Craft.cp.$contentContainer.css('pointer-events', 'none');\n\n            $('#content-header').css('min-height', 'auto');\n            const height = $noticeContainer.height();\n            $noticeContainer\n              .css({height: height - heightDiff, overflow: 'hidden'})\n              .velocity({height: height}, 'fast', () => {\n                $('#content-header').css('min-height', '');\n                $noticeContainer.css({height: '', overflow: ''});\n\n                setTimeout(() => {\n                  Craft.cp.$contentContainer.css('pointer-events', '');\n                }, 300);\n              });\n          }\n        }\n      }\n\n      this.addListener(\n        $discardButton,\n        'keypress,keyup,change,focus,blur,click,mousedown,mouseup',\n        (ev) => {\n          ev.stopPropagation();\n        }\n      );\n\n      this.addListener($discardButton, 'click', () => {\n        if (\n          confirm(\n            Craft.t('app', 'Are you sure you want to discard your changes?')\n          )\n        ) {\n          this.queue.unshift(\n            () =>\n              new Promise((resolve, reject) => {\n                if (this.isFullPage) {\n                  Craft.submitForm(this.$container, {\n                    action: 'elements/delete-draft',\n                    redirect: this.settings.hashedCpEditUrl,\n                    params: {\n                      draftId: this.settings.draftId,\n                      provisional: 1,\n                    },\n                  });\n                } else {\n                  Craft.sendActionRequest('POST', 'elements/delete-draft', {\n                    data: {\n                      elementId: this.settings.canonicalId,\n                      draftId: this.settings.draftId,\n                      provisional: 1,\n                    },\n                  })\n                    .then((response) => {\n                      Craft.cp.displaySuccess(response.data.message);\n                      this.slideout.close();\n                    })\n                    .catch(reject);\n                }\n              })\n          );\n        }\n      });\n    },\n\n    initForDraft: function () {\n      // Create the edit draft button\n      this.createEditMetaBtn();\n\n      if (this.settings.canSaveCanonical) {\n        Garnish.uiLayerManager.registerShortcut(\n          {\n            keyCode: Garnish.S_KEY,\n            ctrl: true,\n            alt: true,\n          },\n          () => {\n            Craft.submitForm(this.$container, {\n              action: 'elements/apply-draft',\n              redirect: this.settings.hashedCpEditUrl,\n            });\n          },\n          0\n        );\n      }\n    },\n\n    expandSiteStatuses: function () {\n      this.removeListener(this.$expandSiteStatusesBtn, 'click');\n      this.$expandSiteStatusesBtn.velocity({opacity: 0}, 'fast', () => {\n        this.$expandSiteStatusesBtn.remove();\n      });\n\n      const $enabledForSiteField = this.$container.find(\n        `.enabled-for-site-${this.settings.siteId}-field`\n      );\n      this.$siteStatusPane = $enabledForSiteField.parent();\n\n      // If this is a revision, just show the site statuses statically and be done\n      if (this.settings.revisionId) {\n        this._getOtherSupportedSites().forEach((s) =>\n          this._createSiteStatusField(s)\n        );\n        return;\n      }\n\n      $enabledForSiteField.addClass('nested');\n      const $globalField = Craft.ui\n        .createLightswitchField({\n          label: Craft.t('app', 'Enabled for all sites'),\n          name: this.namespaceInputName('enabled'),\n        })\n        .insertBefore($enabledForSiteField);\n      $globalField.find('label').css('font-weight', 'bold');\n      this.$globalLightswitch = $globalField.find('.lightswitch');\n\n      if (!this.settings.revisionId) {\n        this._showField($globalField);\n      }\n\n      // Figure out what the \"Enabled everywhere\" lightswitch would have been set to when the page first loaded\n      const siteStatusValues = Object.values(this.settings.siteStatuses);\n      const hasEnabled = siteStatusValues.includes(true);\n      const hasDisabled = siteStatusValues.includes(false);\n      const originalEnabledValue =\n        hasEnabled && hasDisabled ? '-' : hasEnabled ? '1' : '';\n      const originalSerializedStatus =\n        encodeURIComponent(\n          this.namespaceInputName(`enabledForSite[${this.settings.siteId}]`)\n        ) +\n        '=' +\n        (this.settings.enabledForSite ? '1' : '');\n\n      this.$siteLightswitches = $enabledForSiteField\n        .find('.lightswitch')\n        .on('change', this._updateGlobalStatus.bind(this));\n\n      this._getOtherSupportedSites().forEach((s) =>\n        this._createSiteStatusField(s)\n      );\n\n      let serializedStatuses =\n        encodeURIComponent(this.namespaceInputName('enabled')) +\n        `=${originalEnabledValue}`;\n      for (let i = 0; i < this.$siteLightswitches.length; i++) {\n        const $input = this.$siteLightswitches.eq(i).data('lightswitch').$input;\n        serializedStatuses +=\n          '&' + encodeURIComponent($input.attr('name')) + '=' + $input.val();\n      }\n\n      this.$container.data(\n        'initialSerializedValue',\n        this.$container\n          .data('initialSerializedValue')\n          .replace(originalSerializedStatus, serializedStatuses)\n      );\n\n      if (this.lastSerializedValue) {\n        this.lastSerializedValue = this.lastSerializedValue.replace(\n          originalSerializedStatus,\n          serializedStatuses\n        );\n      }\n\n      // Are there additional sites that can be added?\n      if (\n        this.settings.additionalSites &&\n        this.settings.additionalSites.length &&\n        this.isFullPage\n      ) {\n        this._createAddlSiteField();\n      }\n\n      // Focus on first lightswitch\n      this.$globalLightswitch.focus();\n\n      this.$globalLightswitch.on('change', this._updateSiteStatuses.bind(this));\n      this._updateGlobalStatus();\n    },\n\n    /**\n     * @returns {Array}\n     */\n    _getOtherSupportedSites: function () {\n      return Craft.sites.filter(\n        (s) => s.id != this.settings.siteId && this.siteIds.includes(s.id)\n      );\n    },\n\n    _showField: function ($field) {\n      const height = $field.height();\n      $field\n        .css({\n          overflow: 'hidden',\n          'min-height': 'auto',\n        })\n        .height(0)\n        .velocity({height}, 'fast', () => {\n          $field.css({\n            overflow: '',\n            height: '',\n            'min-height': '',\n          });\n        });\n    },\n\n    _removeField: function ($field) {\n      $field\n        .css({\n          overflow: 'hidden',\n          'min-height': 'auto',\n        })\n        .velocity({height: 0}, 'fast', () => {\n          $field.remove();\n        });\n    },\n\n    _updateGlobalStatus: function () {\n      let allEnabled = true,\n        allDisabled = true;\n      this.$siteLightswitches.each(function () {\n        const enabled = $(this).data('lightswitch').on;\n        if (enabled) {\n          allDisabled = false;\n        } else {\n          allEnabled = false;\n        }\n        if (!allEnabled && !allDisabled) {\n          return false;\n        }\n      });\n      if (allEnabled) {\n        this.$globalLightswitch.data('lightswitch').turnOn(true);\n      } else if (allDisabled) {\n        this.$globalLightswitch.data('lightswitch').turnOff(true);\n      } else {\n        this.$globalLightswitch.data('lightswitch').turnIndeterminate(true);\n      }\n    },\n\n    _updateSiteStatuses: function () {\n      const enabled = this.$globalLightswitch.data('lightswitch').on;\n      this.$siteLightswitches.each(function () {\n        if (enabled) {\n          $(this).data('lightswitch').turnOn(true);\n        } else {\n          $(this).data('lightswitch').turnOff(true);\n        }\n      });\n    },\n\n    _createSiteStatusField: function (site, status) {\n      const $field = Craft.ui.createLightswitchField({\n        fieldClass: `enabled-for-site-${site.id}-field`,\n        label: site.name,\n        name: this.namespaceInputName(`enabledForSite[${site.id}]`),\n        on:\n          typeof status != 'undefined'\n            ? status\n            : this.settings.siteStatuses.hasOwnProperty(site.id)\n            ? this.settings.siteStatuses[site.id]\n            : true,\n        disabled: !!this.settings.revisionId,\n      });\n\n      if (this.$additionalSiteField) {\n        $field.insertBefore(this.$additionalSiteField);\n      } else {\n        $field.appendTo(this.$siteStatusPane);\n      }\n\n      if (!this.settings.revisionId) {\n        $field.addClass('nested');\n        const $lightswitch = $field\n          .find('.lightswitch')\n          .on('change', this._updateGlobalStatus.bind(this));\n        this.$siteLightswitches = this.$siteLightswitches.add($lightswitch);\n      }\n\n      this._showField($field);\n\n      return $field;\n    },\n\n    _createAddlSiteField: function () {\n      const additionalSites = Craft.sites.filter((site) => {\n        return (\n          !this.siteIds.includes(site.id) &&\n          this.settings.additionalSites.some((s) => s.siteId == site.id)\n        );\n      });\n\n      if (!additionalSites.length) {\n        return;\n      }\n\n      const selectLabelId = 'add-site-label';\n\n      const $addlSiteSelectLabel = $('<span/>', {\n        text: Craft.t('app', 'Add a site...'),\n        class: 'visually-hidden',\n        id: selectLabelId,\n      });\n\n      const $addlSiteSelectContainer = Craft.ui\n        .createSelect({\n          options: [\n            {label: Craft.t('app', 'Add a site…')},\n            ...additionalSites.map((s) => {\n              return {label: s.name, value: s.id};\n            }),\n          ],\n          labelledBy: selectLabelId,\n        })\n        .addClass('fullwidth');\n\n      this.$additionalSiteField = Craft.ui\n        .createField($addlSiteSelectContainer, {})\n        .addClass('nested add')\n        .appendTo(this.$siteStatusPane);\n\n      $addlSiteSelectLabel.prependTo(this.$additionalSiteField);\n\n      const $addlSiteSelect = $addlSiteSelectContainer.find('select');\n\n      $addlSiteSelect.on('change', () => {\n        const siteId = parseInt($addlSiteSelect.val());\n        const site = Craft.sites.find((s) => s.id === siteId);\n\n        if (!site) {\n          return;\n        }\n\n        const addlSiteInfo = this.settings.additionalSites.find(\n          (s) => s.siteId == site.id\n        );\n        this._createSiteStatusField(site, addlSiteInfo.enabledByDefault);\n        this._updateGlobalStatus();\n\n        $addlSiteSelect.val('').find(`option[value=\"${siteId}\"]`).remove();\n\n        if (this.newSiteIds === null) {\n          this.newSiteIds = [];\n        }\n\n        this.siteIds.push(siteId);\n        this.newSiteIds.push(siteId);\n\n        // Was that the last site?\n        if ($addlSiteSelect.find('option').length === 1) {\n          this._removeField(this.$additionalSiteField);\n        }\n      });\n\n      this._showField(this.$additionalSiteField);\n    },\n\n    showStatusHud: function (target) {\n      let bodyHtml;\n\n      if (!this.failed) {\n        bodyHtml = `<p>${this._saveSuccessMessage()}</p>`;\n      } else {\n        bodyHtml = `<p class=\"error\"><strong>${this._saveFailMessage()}</strong></p>`;\n\n        if (this.httpError) {\n          bodyHtml += `<p class=\"http-error code\">${Craft.escapeHtml(\n            this.httpError\n          )}</p>`;\n        }\n\n        if (this.httpStatus === 400) {\n          bodyHtml += `<button class=\"btn refresh-btn\">${Craft.t(\n            'app',\n            'Refresh'\n          )}</button>`;\n        }\n      }\n\n      const hud = new Garnish.HUD(target, bodyHtml, {\n        hudClass: 'hud revision-status-hud',\n        onHide: function () {\n          hud.destroy();\n        },\n      });\n\n      hud.$mainContainer.find('.refresh-btn').on('click', () => {\n        window.location.reload();\n      });\n    },\n\n    /**\n     * @returns {string}\n     */\n    _saveSuccessMessage: function () {\n      return this.settings.isProvisionalDraft ||\n        this.settings.isUnpublishedDraft\n        ? Craft.t('app', 'Your changes have been stored.')\n        : Craft.t('app', 'The draft has been saved.');\n    },\n\n    /**\n     * @returns {string}\n     */\n    _saveFailMessage: function () {\n      return this.settings.isProvisionalDraft ||\n        this.settings.isUnpublishedDraft\n        ? Craft.t('app', 'Your changes could not be stored.')\n        : Craft.t('app', 'The draft could not be saved.');\n    },\n\n    spinners: function () {\n      return this.preview\n        ? this.$spinner.add(this.preview.$spinner)\n        : this.$spinner;\n    },\n\n    showSpinner: function () {\n      this.spinners().removeClass('hidden');\n    },\n\n    hideSpinner: function () {\n      this.spinners().addClass('hidden');\n    },\n\n    statusIcons: function () {\n      return this.preview\n        ? this.$statusIcon.add(this.preview.$statusIcon)\n        : this.$statusIcon;\n    },\n\n    statusMessage: function () {\n      return this.preview\n        ? this.$statusMessage.add(this.preview.$statusMessage)\n        : this.$statusMessage;\n    },\n\n    createEditMetaBtn: function () {\n      const $btnGroup = this.$container.find('.context-btngroup');\n      this.$editMetaBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn edit icon',\n        'aria-expanded': 'false',\n        'aria-label': Craft.t('app', 'Edit draft settings'),\n        title: Craft.t('app', 'Edit draft settings'),\n      }).appendTo($btnGroup);\n      $btnGroup.find('.btngroup-btn-last').removeClass('btngroup-btn-last');\n      this.addListener(this.$editMetaBtn, 'click', 'showMetaHud');\n    },\n\n    createPreviewLink: function (target, label) {\n      const $a = $('<a/>', {\n        href: this.getTokenizedPreviewUrl(target.url, null, false),\n        text: label || Craft.t('app', 'View'),\n        target: '_blank',\n        data: {\n          targetUrl: target.url,\n          targetLabel: target.label,\n        },\n      });\n\n      this.addListener($a, 'click', () => {\n        setTimeout(() => {\n          this.activatePreviewToken();\n        }, 1);\n      });\n\n      this.previewLinks.push($a);\n      return $a;\n    },\n\n    updatePreviewLinks: function () {\n      this.previewLinks.forEach(($a) => {\n        this.updatePreviewLinkHref($a);\n        if (this.activatedPreviewToken) {\n          this.removeListener($a, 'click');\n        }\n      });\n    },\n\n    updatePreviewLinkHref: function ($a) {\n      $a.attr(\n        'href',\n        this.getTokenizedPreviewUrl($a.data('targetUrl'), null, false)\n      );\n    },\n\n    activatePreviewToken: function () {\n      if (this.settings.isLive) {\n        // don't do anything yet, but leave the event in case we need it later\n        return;\n      }\n\n      this.activatedPreviewToken = true;\n      this.updatePreviewLinks();\n    },\n\n    createShareMenu: function ($container) {\n      const $btn = $('<button/>', {\n        type: 'button',\n        class: 'view-btn btn menubtn',\n        text: Craft.t('app', 'View'),\n      }).appendTo($container);\n\n      const $menu = $('<div/>', {class: 'menu'}).appendTo($container);\n      const $ul = $('<ul/>').appendTo($menu);\n\n      this.settings.previewTargets.forEach((target) => {\n        $('<li/>')\n          .append(this.createPreviewLink(target, target.label))\n          .appendTo($ul);\n      });\n\n      new Garnish.MenuBtn($btn);\n    },\n\n    getPreviewTokenParams: function () {\n      const params = {\n        elementType: this.settings.elementType,\n        canonicalId: this.settings.canonicalId,\n        siteId: this.settings.siteId,\n        revisionId: this.settings.revisionId,\n        previewToken: this.settings.previewToken,\n      };\n\n      if (this.settings.draftId && !this.settings.isProvisionalDraft) {\n        params.draftId = this.settings.draftId;\n      }\n\n      return params;\n    },\n\n    getPreviewToken: function () {\n      return this.previewTokenQueue.push(() => {\n        return new Promise((resolve, reject) => {\n          if (this.activatedPreviewToken) {\n            resolve(this.settings.previewToken);\n            return;\n          }\n\n          Craft.sendActionRequest('POST', 'preview/create-token', {\n            data: this.getPreviewTokenParams(),\n          })\n            .then(() => {\n              this.activatePreviewToken();\n              resolve(this.settings.previewToken);\n            })\n            .catch(reject);\n        });\n      });\n    },\n\n    /**\n     * @param {string} url\n     * @param {?string} [randoParam]\n     * @param {boolean} [asPromise=false]\n     * @returns {(Promise|string)}\n     */\n    getTokenizedPreviewUrl: function (url, randoParam, asPromise) {\n      if (typeof asPromise === 'undefined') {\n        asPromise = true;\n      }\n\n      const params = {};\n\n      if (randoParam || !this.settings.isLive) {\n        // Randomize the URL so CDNs don't return cached pages\n        params[randoParam || 'x-craft-preview'] = Craft.randomString(10);\n      }\n\n      if (this.settings.siteToken) {\n        params[Craft.siteToken] = this.settings.siteToken;\n      }\n\n      // No need for a token if we're looking at a live element\n      if (this.settings.isLive) {\n        const previewUrl = Craft.getUrl(url, params);\n\n        if (asPromise) {\n          return new Promise((resolve) => {\n            resolve(previewUrl);\n          });\n        }\n\n        return previewUrl;\n      }\n\n      if (!this.settings.previewToken) {\n        throw 'Missing preview token';\n      }\n\n      params[Craft.tokenParam] = this.settings.previewToken;\n      const previewUrl = Craft.getUrl(url, params);\n\n      if (this.activatedPreviewToken) {\n        if (asPromise) {\n          return new Promise((resolve) => {\n            resolve(previewUrl);\n          });\n        }\n\n        return previewUrl;\n      }\n\n      if (asPromise) {\n        return new Promise((resolve, reject) => {\n          this.getPreviewToken()\n            .then(() => {\n              resolve(previewUrl);\n            })\n            .catch(reject);\n        });\n      }\n\n      const createTokenParams = this.getPreviewTokenParams();\n      createTokenParams.redirect = previewUrl;\n      return Craft.getActionUrl('preview/create-token', createTokenParams);\n    },\n\n    getPreview: function () {\n      if (!this.preview) {\n        this.preview = new Craft.Preview(this);\n        if (!this.enableAutosave) {\n          this.preview.on('open', () => {\n            this.enableAutosave = true;\n            this.listenForChanges();\n          });\n          this.preview.on('close', () => {\n            this.enableAutosave = false;\n            this.stopListeningForChanges();\n\n            // Hide the status icon if the save was successful\n            const $statusIcons = this.statusIcons();\n            if ($statusIcons.hasClass('checkmark-icon')) {\n              $statusIcons.addClass('hidden');\n            }\n          });\n        }\n        this.preview.on('close', () => {\n          if (this.scrollY) {\n            window.scrollTo(0, this.scrollY);\n            this.scrollY = null;\n          }\n        });\n      }\n      return this.preview;\n    },\n\n    openPreview: function () {\n      if (Garnish.hasAttr(this.$previewBtn, 'aria-disabled')) {\n        return;\n      }\n\n      this.$previewBtn.attr('aria-disabled', true);\n      this.$previewBtn.addClass('loading');\n\n      this.queue.push(\n        () =>\n          new Promise((resolve, reject) => {\n            this.openingPreview = true;\n            this.ensureIsDraftOrRevision(true)\n              .then(() => {\n                this.scrollY = window.scrollY;\n                this.$previewBtn.removeAttr('aria-disabled');\n                this.$previewBtn.removeClass('loading');\n                this.getPreview().open();\n                this.openingPreview = false;\n                resolve();\n              })\n              .catch(reject);\n          })\n      );\n    },\n\n    ensureIsDraftOrRevision: function (onlyIfChanged) {\n      return new Promise((resolve, reject) => {\n        if (!this.settings.draftId && !this.settings.revisionId) {\n          if (\n            onlyIfChanged &&\n            this.serializeForm(true) ===\n              this.$container.data('initialSerializedValue')\n          ) {\n            resolve();\n            return;\n          }\n\n          this.createDraft().then(resolve).catch(reject);\n        } else {\n          resolve();\n        }\n      });\n    },\n\n    serializeForm: function (removeActionParams) {\n      let data = this.$container.serialize();\n\n      if (this.isPreviewActive()) {\n        // Replace the temp input with the preview form data\n        data = data.replace(\n          '__PREVIEW_FIELDS__=1',\n          this.preview.$editor.serialize()\n        );\n      }\n\n      if (removeActionParams && !this.settings.isUnpublishedDraft) {\n        // Remove action and redirect params\n        const actionName = this.namespaceInputName('action');\n        const redirectName = this.namespaceInputName('redirect');\n        data = data.replace(\n          new RegExp(`&${Craft.escapeRegex(actionName)}=[^&]*`),\n          ''\n        );\n        data = data.replace(\n          new RegExp(`&${Craft.escapeRegex(redirectName)}=[^&]*`),\n          ''\n        );\n      }\n\n      return data;\n    },\n\n    /**\n     * @param {boolean} [force=false]\n     * @returns {Promise}\n     */\n    checkForm: function (force) {\n      return this.queue.push(\n        () =>\n          new Promise((resolve, reject) => {\n            // If this isn't a draft and there's no active preview, then there's nothing to check\n            if (\n              this.settings.revisionId ||\n              this.pauseLevel > 0 ||\n              !this.enableAutosave ||\n              !this.settings.canCreateDrafts\n            ) {\n              resolve();\n              return;\n            }\n\n            clearTimeout(this.timeout);\n            this.timeout = null;\n\n            // If we haven't had a chance to fetch the initial data yet, try again in a bit\n            if (\n              typeof this.$container.data('initialSerializedValue') ===\n              'undefined'\n            ) {\n              this.timeout = setTimeout(this.checkForm.bind(this), 500);\n              return;\n            }\n\n            // Has anything changed?\n            const data = this.serializeForm(true);\n            if (\n              !force &&\n              data ===\n                (this.lastSerializedValue ||\n                  this.$container.data('initialSerializedValue'))\n            ) {\n              resolve();\n              return;\n            }\n\n            this.saveDraft(data)\n              .then(resolve)\n              .catch((e) => {\n                console.warn('Couldn’t save draft:', e);\n                reject(e);\n              });\n          })\n      );\n    },\n\n    isPreviewActive: function () {\n      return this.preview && this.preview.isActive;\n    },\n\n    createDraft: function () {\n      return this.queue.push(\n        () =>\n          new Promise((resolve, reject) => {\n            this.saveDraft(this.serializeForm(true))\n              .then(resolve)\n              .catch(reject);\n          })\n      );\n    },\n\n    /**\n     * @param {Object} data\n     * @returns {Promise}\n     */\n    saveDraft: function (data) {\n      return new Promise((resolve, reject) => {\n        // Ignore if we're already submitting the main form\n        if (this.submittingForm) {\n          reject('Form already being submitted.');\n          return;\n        }\n\n        this.lastSerializedValue = data;\n        this.failed = false;\n        this.httpStatus = null;\n        this.httpError = null;\n        this.cancelToken = axios.CancelToken.source();\n\n        this.statusIcons()\n          .velocity('stop')\n          .css('opacity', '')\n          .removeClass('hidden invisible checkmark-icon alert-icon fade-out')\n          .addClass('hidden');\n\n        // Clear previous status message\n        this.statusMessage().empty();\n\n        if (this.$saveMetaBtn) {\n          this.$saveMetaBtn.addClass('active');\n        }\n\n        // Prep the data to be saved, keeping track of the first input name for each delta group\n        let modifiedFieldNames = [];\n        let preparedData = this.prepareData(\n          data,\n          !this.settings.isUnpublishedDraft\n            ? (deltaName, params) => {\n                if (params.length) {\n                  modifiedFieldNames.push(\n                    decodeURIComponent(params[0].split('=')[0])\n                  );\n                }\n              }\n            : null\n        );\n\n        const extraData = {\n          [this.namespaceInputName('visibleLayoutElements')]:\n            this.settings.visibleLayoutElements,\n        };\n\n        // Are we saving a provisional draft?\n        if (this.settings.isProvisionalDraft || !this.settings.draftId) {\n          extraData[this.namespaceInputName('provisional')] = 1;\n        }\n\n        const selectedTabId = this.$contentContainer\n          .children('[data-layout-tab]:not(.hidden)')\n          .data('id');\n        if (selectedTabId) {\n          extraData[this.namespaceInputName('selectedTab')] = selectedTabId;\n        }\n\n        preparedData += `&${$.param(extraData)}`;\n\n        Craft.sendActionRequest('POST', 'elements/save-draft', {\n          cancelToken: this.cancelToken.token,\n          headers: this._saveHeaders,\n          data: preparedData,\n        })\n          .then((response) => {\n            this._afterSaveDraft();\n\n            const createdProvisionalDraft = !this.settings.draftId;\n\n            if (createdProvisionalDraft) {\n              this.settings.isProvisionalDraft = true;\n              this.$revisionLabel.append(\n                $('<span/>', {\n                  text: ` — ${Craft.t('app', 'Edited')}`,\n                })\n              );\n            }\n\n            if (this.isFullPage) {\n              if (response.data.title) {\n                this.$container.find('.screen-title').text(response.data.title);\n              }\n\n              if (response.data.docTitle) {\n                document.title = response.data.docTitle;\n              }\n            }\n\n            if (!this.settings.isProvisionalDraft) {\n              this.$revisionLabel.text(response.data.draftName);\n              this.settings.draftName = response.data.draftName;\n            }\n\n            let revisionMenu = this.$revisionBtn.data('menubtn')\n              ? this.$revisionBtn.data('menubtn').menu\n              : null;\n\n            // Did we just add a site?\n            if (this.newSiteIds) {\n              // Do we need to create the revision menu?\n              if (!revisionMenu) {\n                this.$revisionBtn.removeClass('disabled').addClass('menubtn');\n                new Garnish.MenuBtn(this.$revisionBtn);\n                revisionMenu = this.$revisionBtn.data('menubtn').menu;\n                revisionMenu.$container.removeClass('hidden');\n              }\n              this.newSiteIds.forEach((siteId) => {\n                const $option = revisionMenu.$options.filter(\n                  `[data-site-id=${siteId}]`\n                );\n                const siteSettings = this.settings.additionalSites.find(\n                  (s) => s.siteId == siteId\n                );\n                if (\n                  !siteSettings ||\n                  typeof siteSettings.enabledByDefault === 'undefined' ||\n                  siteSettings.enabledByDefault\n                ) {\n                  $option\n                    .find('.status')\n                    .removeClass('disabled')\n                    .addClass('enabled');\n                }\n                const $li = $option.parent().removeClass('hidden');\n                $li.closest('.site-group').removeClass('hidden');\n              });\n              revisionMenu.$container\n                .find('.revision-hr')\n                .removeClass('hidden');\n              this.newSiteIds = null;\n            }\n\n            if (this.settings.isProvisionalDraft) {\n              if (createdProvisionalDraft) {\n                // Replace the action\n                this.$container\n                  .find('input.action-input')\n                  .attr('value', 'elements/apply-draft');\n\n                // Update the editor settings\n                this.settings.draftId = response.data.draftId;\n                this.settings.isLive = false;\n                this.previewToken = null;\n\n                this.initForProvisionalDraft();\n              }\n            } else if (revisionMenu) {\n              revisionMenu.$options\n                .filter('.sel')\n                .find('.draft-name')\n                .text(response.data.draftName);\n              revisionMenu.$options\n                .filter('.sel')\n                .find('.draft-meta')\n                .text(\n                  response.data.creator\n                    ? Craft.t('app', 'Saved {timestamp} by {creator}', {\n                        timestamp: response.data.timestamp,\n                        creator: response.data.creator,\n                      })\n                    : Craft.t('app', 'Saved {timestamp}', {\n                        timestamp: response.data.timestamp,\n                      })\n                );\n            }\n\n            // Did the controller send us updated preview targets?\n            if (\n              response.data.previewTargets &&\n              JSON.stringify(response.data.previewTargets) !==\n                JSON.stringify(this.settings.previewTargets)\n            ) {\n              this.updatePreviewTargets(response.data.previewTargets);\n            }\n\n            if (createdProvisionalDraft) {\n              this.updatePreviewLinks();\n              this.trigger('createProvisionalDraft');\n            }\n\n            if (this.$nameTextInput) {\n              this.checkMetaValues();\n            }\n\n            for (const oldId in response.data.duplicatedElements) {\n              if (\n                oldId != this.settings.canonicalId &&\n                response.data.duplicatedElements.hasOwnProperty(oldId)\n              ) {\n                this.duplicatedElements[oldId] =\n                  response.data.duplicatedElements[oldId];\n              }\n            }\n\n            // Add missing field modified indicators\n            const selectors = response.data.modifiedAttributes\n              .map((attr) => {\n                attr = this.namespaceInputName(attr);\n                return `[name=\"${attr}\"],[name^=\"${attr}[\"]`;\n              })\n              .concat(modifiedFieldNames.map((name) => `[name=\"${name}\"]`));\n\n            const $fields = $(selectors.join(','))\n              .parents()\n              .filter('.field:not(:has(> .status-badge))');\n            for (let i = 0; i < $fields.length; i++) {\n              $fields.eq(i).prepend(\n                $('<div/>', {\n                  class: 'status-badge modified',\n                  title: Craft.t('app', 'This field has been modified.'),\n                }).append(\n                  $('<span/>', {\n                    class: 'visually-hidden',\n                    html: Craft.t('app', 'This field has been modified.'),\n                  })\n                )\n              );\n            }\n\n            // Keep track of whether anything changed while we were waiting.\n            // If not, we can safely update lastSerializedValue after swapping out the fields\n            const noChanges = this.serializeForm(true) === data;\n\n            // Update the visible elements\n            let $allTabContainers = $();\n            const visibleLayoutElements = {};\n            let changedElements = false;\n\n            for (let i = 0; i < response.data.missingElements.length; i++) {\n              const tabInfo = response.data.missingElements[i];\n              let $tabContainer = this.$contentContainer.children(\n                `[data-layout-tab=\"${tabInfo.uid}\"]`\n              );\n\n              if (!$tabContainer.length) {\n                $tabContainer = $('<div/>', {\n                  id: this.namespaceId(tabInfo.id),\n                  class: 'flex-fields',\n                  'data-id': tabInfo.id,\n                  'data-layout-tab': tabInfo.uid,\n                });\n                if (tabInfo.id !== selectedTabId) {\n                  $tabContainer.addClass('hidden');\n                }\n                $tabContainer.appendTo(this.$contentContainer);\n              }\n\n              $allTabContainers = $allTabContainers.add($tabContainer);\n\n              for (let j = 0; j < tabInfo.elements.length; j++) {\n                const elementInfo = tabInfo.elements[j];\n\n                if (elementInfo.html !== false) {\n                  if (!visibleLayoutElements[tabInfo.uid]) {\n                    visibleLayoutElements[tabInfo.uid] = [];\n                  }\n                  visibleLayoutElements[tabInfo.uid].push(elementInfo.uid);\n\n                  if (typeof elementInfo.html === 'string') {\n                    const $oldElement = $tabContainer.children(\n                      `[data-layout-element=\"${elementInfo.uid}\"]`\n                    );\n                    const $newElement = $(elementInfo.html);\n                    if ($oldElement.length) {\n                      $oldElement.replaceWith($newElement);\n                    } else {\n                      $newElement.appendTo($tabContainer);\n                    }\n                    Craft.initUiElements($newElement);\n                    changedElements = true;\n                  }\n                } else {\n                  const $oldElement = $tabContainer.children(\n                    `[data-layout-element=\"${elementInfo.uid}\"]`\n                  );\n                  if (\n                    !$oldElement.length ||\n                    !Garnish.hasAttr(\n                      $oldElement,\n                      'data-layout-element-placeholder'\n                    )\n                  ) {\n                    const $placeholder = $('<div/>', {\n                      class: 'hidden',\n                      'data-layout-element': elementInfo.uid,\n                      'data-layout-element-placeholder': '',\n                    });\n\n                    if ($oldElement.length) {\n                      $oldElement.replaceWith($placeholder);\n                    } else {\n                      $placeholder.appendTo($tabContainer);\n                    }\n\n                    changedElements = true;\n                  }\n                }\n              }\n            }\n\n            // Remove any unused tab content containers\n            // (`[data-layout-tab=\"\"]` == unconditional containers, so ignore those)\n            const $unusedTabContainers = this.$contentContainer\n              .children('[data-layout-tab]')\n              .not($allTabContainers)\n              .not('[data-layout-tab=\"\"]');\n            if ($unusedTabContainers.length) {\n              $unusedTabContainers.remove();\n              changedElements = true;\n            }\n\n            // Make the first tab visible if no others are\n            if (!$allTabContainers.filter(':not(.hidden)').length) {\n              $allTabContainers.first().removeClass('hidden');\n            }\n\n            this.settings.visibleLayoutElements = visibleLayoutElements;\n\n            // Update the tabs\n            if (this.isFullPage) {\n              Craft.cp.updateTabs(response.data.tabs);\n            } else {\n              this.slideout.updateTabs(response.data.tabs);\n            }\n\n            Craft.appendHeadHtml(response.data.headHtml);\n            Craft.appendBodyHtml(response.data.bodyHtml);\n\n            // Did any layout elements get added or removed?\n            if (changedElements) {\n              if (response.data.initialDeltaValues) {\n                Object.assign(\n                  this.$container.data('initial-delta-values'),\n                  response.data.initialDeltaValues\n                );\n              }\n\n              if (noChanges) {\n                // Update our record of the last serialized value to avoid a pointless resave\n                this.lastSerializedValue = this.serializeForm(true);\n              }\n            }\n\n            // re-grab dismissible tips, re-attach listener, hide on re-load\n            this.handleDismissibleTips();\n\n            this.afterUpdate(data);\n\n            if (Craft.broadcaster) {\n              Craft.broadcaster.postMessage({\n                pageId: Craft.pageId,\n                event: 'saveDraft',\n                canonicalId: this.settings.canonicalId,\n                draftId: this.settings.draftId,\n                isProvisionalDraft: this.settings.isProvisionalDraft,\n              });\n            }\n\n            resolve();\n          })\n          .catch((e) => {\n            this._afterSaveDraft();\n\n            if (!this.ignoreFailedRequest) {\n              this.failed = true;\n              if (e && e.response) {\n                this.httpStatus = e.response.status;\n                this.httpError = e.response.data\n                  ? e.response.data.message\n                  : null;\n              }\n              this._showFailStatus();\n              reject(e);\n            }\n\n            this.ignoreFailedRequest = false;\n          });\n      });\n    },\n\n    _afterSaveDraft: function () {\n      if (this.$saveMetaBtn) {\n        this.$saveMetaBtn.removeClass('active');\n      }\n    },\n\n    _showFailStatus: function () {\n      this.statusIcons()\n        .velocity('stop')\n        .css('opacity', '')\n        .removeClass('hidden checkmark-icon')\n        .addClass('alert-icon');\n\n      this.setStatusMessage(this._saveFailMessage());\n    },\n\n    /**\n     * @param {string} data\n     * @param {findDeltaDataCallback} [deltaCallback] Callback function that should be passed to `Craft.findDeltaData()`\n     * @returns {string}\n     */\n    prepareData: function (data, deltaCallback) {\n      // Filter out anything that hasn't changed since the last time the form was submitted\n      data = Craft.findDeltaData(\n        this.$container.data('initialSerializedValue'),\n        data,\n        this.$container.data('delta-names'),\n        deltaCallback,\n        this.$container.data('initial-delta-values'),\n        this.$container.data('modified-delta-names')\n      );\n\n      // Swap out element IDs with their duplicated ones\n      data = this.swapDuplicatedElementIds(data);\n\n      const extraData = {};\n\n      // Add the draft info\n      if (this.settings.draftId) {\n        extraData[this.namespaceInputName('draftId')] = this.settings.draftId;\n\n        if (this.settings.isProvisionalDraft) {\n          extraData[this.namespaceInputName('provisional')] = 1;\n        }\n      }\n\n      if (this.settings.draftName !== null) {\n        extraData[this.namespaceInputName('draftName')] =\n          this.settings.draftName;\n      }\n\n      if (!$.isEmptyObject(extraData)) {\n        data += `&${$.param(extraData)}`;\n      }\n\n      return data;\n    },\n\n    get _saveHeaders() {\n      const headers = {\n        'content-type': 'application/x-www-form-urlencoded',\n      };\n\n      if (this.namespace) {\n        headers['X-Craft-Namespace'] = this.namespace;\n      }\n\n      return headers;\n    },\n\n    /**\n     * @param {string} data\n     * @returns {string}\n     */\n    swapDuplicatedElementIds: function (data) {\n      const idsRE = Object.keys(this.duplicatedElements).join('|');\n      if (idsRE === '') {\n        return data;\n      }\n      const lb = encodeURIComponent('[');\n      const rb = encodeURIComponent(']');\n      let namespacedFields = this.namespaceInputName('fields');\n\n      if (this.isFullPage) {\n        namespacedFields = Craft.escapeRegex(namespacedFields);\n      } else {\n        // don't escape namespaced input names, but URI encode them (for cases like: cnuvbcxlgq[fields])\n        namespacedFields = encodeURIComponent(namespacedFields);\n      }\n\n      // Keep replacing field IDs until data stops changing\n      while (true) {\n        if (\n          data ===\n          (data = data\n            // &fields[...][X]\n            .replace(\n              new RegExp(\n                `(&${namespacedFields}${lb}[^=]+${rb}${lb})(${idsRE})(${rb})`,\n                'g'\n              ),\n              (m, pre, id, post) => {\n                let duplicate = false;\n                try {\n                  duplicate = this._filterFieldInputName(pre);\n                } catch (e) {\n                  console.warn(`Unexpected input name: ${m}`);\n                }\n                if (!duplicate) {\n                  return m;\n                }\n                return pre + this.duplicatedElements[id] + post;\n              }\n            )\n            // &fields[...=X\n            .replace(\n              new RegExp(`&(${namespacedFields}${lb}[^=]+)=(${idsRE})\\\\b`, 'g'),\n              (m, name, id) => {\n                // Ignore param names that end in `[enabled]`, `[type]`, etc.\n                // (`[sortOrder]` should pass here, which could be set to a specific order index, but *not* `[sortOrder][]`!)\n                let duplicate = false;\n                try {\n                  duplicate =\n                    this._filterFieldInputName(name) &&\n                    !name.match(\n                      new RegExp(`${lb}(enabled|sortOrder|type|typeId)${rb}$`)\n                    );\n                } catch (e) {\n                  console.warn(`Unexpected input name: ${m}`);\n                }\n                if (!duplicate) {\n                  return m;\n                }\n                return `&${name}=${this.duplicatedElements[id]}`;\n              }\n            ))\n        ) {\n          break;\n        }\n      }\n      return data;\n    },\n\n    _filterFieldInputName: function (name) {\n      // Find the last referenced field handle\n      const lb = encodeURIComponent('[');\n      const rb = encodeURIComponent(']');\n      const nestedNames = name.match(\n        new RegExp(`(\\\\bfields|${lb}fields${rb})${lb}[^${rb}]+${rb}`, 'g')\n      );\n      if (!nestedNames) {\n        throw `Unexpected input name: ${name}`;\n      }\n      const lastHandle = nestedNames[nestedNames.length - 1].match(\n        new RegExp(`(?:\\\\bfields|${lb}fields${rb})${lb}([^${rb}]+)${rb}`)\n      )[1];\n      return Craft.fieldsWithoutContent.includes(lastHandle);\n    },\n\n    updatePreviewTargets: function (previewTargets) {\n      previewTargets.forEach((newTarget) => {\n        const currentTarget = this.settings.previewTargets.find(\n          (t) => t.label === newTarget.label\n        );\n        if (currentTarget) {\n          currentTarget.url = newTarget.url;\n        }\n\n        const $previewLink = this.previewLinks.find(\n          ($a) => $a.data('targetLabel') === newTarget.label\n        );\n        if ($previewLink) {\n          $previewLink.data('targetUrl', newTarget.url);\n          this.updatePreviewLinkHref($previewLink);\n        }\n      });\n    },\n\n    afterUpdate: function (data) {\n      this.$container.data('initialSerializedValue', data);\n      this.$container.data('initial-delta-values', {});\n\n      const $statusIcons = this.statusIcons()\n        .velocity('stop')\n        .css('opacity', '')\n        .removeClass('hidden')\n        .addClass('checkmark-icon');\n\n      this.setStatusMessage(this._saveSuccessMessage());\n\n      if (!Craft.autosaveDrafts) {\n        // Fade the icon out after a couple seconds, since it won't be accurate as content continues to change\n        $statusIcons.velocity('stop').velocity(\n          {\n            opacity: 0,\n          },\n          {\n            delay: 2000,\n            complete: () => {\n              $statusIcons.addClass('hidden');\n            },\n          }\n        );\n      }\n\n      this.trigger('update');\n    },\n\n    setStatusMessage: function (message) {\n      this.statusIcons().attr('title', message);\n      this.statusMessage()\n        .empty()\n        .append(\n          $('<span/>', {\n            class: 'visually-hidden',\n            text: message,\n          })\n        );\n    },\n\n    showMetaHud: function () {\n      if (!this.metaHud) {\n        this.createMetaHud();\n        this.onMetaHudShow();\n      } else {\n        this.metaHud.show();\n      }\n\n      if (!Garnish.isMobileBrowser(true)) {\n        this.$nameTextInput.trigger('focus');\n      }\n    },\n\n    createMetaHud: function () {\n      const $hudBody = $('<div/>');\n\n      // Add the Name field\n      const $nameField = $(\n        '<div class=\"field\"><div class=\"heading\"><label for=\"draft-name\">' +\n          Craft.t('app', 'Draft Name') +\n          '</label></div></div>'\n      ).appendTo($hudBody);\n      const $nameInputContainer = $('<div class=\"input\"/>').appendTo(\n        $nameField\n      );\n      this.$nameTextInput = $(\n        '<input type=\"text\" class=\"text fullwidth\" id=\"draft-name\"/>'\n      )\n        .appendTo($nameInputContainer)\n        .val(this.settings.draftName);\n\n      // HUD footer\n      const $footer = $('<div class=\"hud-footer flex flex-center\"/>').appendTo(\n        $hudBody\n      );\n\n      $('<div class=\"flex-grow\"></div>').appendTo($footer);\n      this.$saveMetaBtn = $('<button/>', {\n        type: 'submit',\n        class: 'btn submit disabled',\n        'aria-disabled': 'true',\n        text: Craft.t('app', 'Save'),\n      }).appendTo($footer);\n\n      this.metaHud = new Garnish.HUD(this.$editMetaBtn, $hudBody, {\n        onSubmit: this.saveMeta.bind(this),\n      });\n\n      this.addListener(this.$nameTextInput, 'input', 'checkMetaValues');\n\n      this.metaHud.on('show', this.onMetaHudShow.bind(this));\n      this.metaHud.on('hide', this.onMetaHudHide.bind(this));\n      this.metaHud.on('escape', this.onMetaHudEscape.bind(this));\n    },\n\n    onMetaHudShow: function () {\n      this.$editMetaBtn.addClass('active');\n      this.$editMetaBtn.attr('aria-expanded', 'true');\n    },\n\n    onMetaHudHide: function () {\n      this.$editMetaBtn.removeClass('active');\n      this.$editMetaBtn.attr('aria-expanded', 'false');\n\n      if (Garnish.focusIsInside(this.metaHud.$body)) {\n        this.$editMetaBtn.trigger('focus');\n      }\n    },\n\n    onMetaHudEscape: function () {\n      this.$nameTextInput.val(this.settings.draftName);\n    },\n\n    checkMetaValues: function () {\n      if (\n        this.$nameTextInput.val() &&\n        this.$nameTextInput.val() !== this.settings.draftName\n      ) {\n        this.$saveMetaBtn.removeClass('disabled');\n        this.$saveMetaBtn.removeAttr('aria-disabled');\n        return true;\n      }\n\n      this.$saveMetaBtn.addClass('disabled');\n      this.$saveMetaBtn.attr('aria-disabled', 'true');\n      return false;\n    },\n\n    shakeMetaHud: function () {\n      Garnish.shake(this.metaHud.$hud);\n    },\n\n    saveMeta: function () {\n      return new Promise((resolve, reject) => {\n        if (!this.checkMetaValues()) {\n          this.shakeMetaHud();\n          reject();\n          return;\n        }\n\n        this.settings.draftName = this.$nameTextInput.val();\n        this.metaHud.hide();\n        this.checkForm(true).then(resolve).catch(reject);\n      });\n    },\n\n    handleSubmit: function (ev) {\n      ev.preventDefault();\n      ev.stopPropagation();\n\n      // Prevent double form submits\n      if (this.submittingForm) {\n        return;\n      }\n\n      // If this a draft and was this a normal save (either via submit button or save shortcut),\n      // then trigger an autosave\n      if (\n        this.settings.draftId &&\n        !this.settings.isUnpublishedDraft &&\n        !this.settings.isProvisionalDraft &&\n        (typeof ev.autosave === 'undefined' || ev.autosave) &&\n        (ev.saveShortcut ||\n          (ev.customTrigger &&\n            ev.customTrigger.data('action') === 'elements/save-draft')) &&\n        this.enableAutosave\n      ) {\n        this.checkForm(true);\n        return;\n      }\n\n      this.submittingForm = true;\n\n      // Prevent the normal unload confirmation dialog\n      Craft.cp.$confirmUnloadForms = Craft.cp.$confirmUnloadForms.not(\n        this.$container\n      );\n\n      // Abort the current save request if there is one\n      if (this.cancelToken) {\n        this.ignoreFailedRequest = true;\n        this.cancelToken.cancel();\n      }\n\n      this.trigger('beforeSubmit');\n\n      // Duplicate the form with normalized data\n      const data = this.prepareData(this.serializeForm(false));\n\n      if (this.isFullPage) {\n        this.stopListeningForChanges();\n        const $form = Craft.createForm(data);\n        $form.appendTo(Garnish.$bod);\n        $form.submit();\n      } else {\n        this.slideout.showSubmitSpinner();\n        Craft.sendActionRequest('POST', null, {\n          headers: this._saveHeaders,\n          data,\n        })\n          .then((response) => {\n            this.slideout.handleSubmitResponse(response);\n          })\n          .catch((error) => {\n            this.slideout.handleSubmitError(error);\n          })\n          .finally(() => {\n            this.submittingForm = false;\n            this.slideout.hideSubmitSpinner();\n          });\n      }\n    },\n\n    handleDismissibleTips: function () {\n      this.addListener(this.tipDismissBtn, 'click', (e) => {\n        this.hideTip(e);\n      });\n    },\n\n    getHiddenTipsUids: function () {\n      return Craft.getLocalStorage('dismissedTips', []);\n    },\n\n    setHiddenTipsUids: function (uids) {\n      Craft.setLocalStorage('dismissedTips', uids);\n    },\n\n    hideTip: function (ev) {\n      const targetElement = ev.target;\n      if (targetElement) {\n        const $targetParent = $(targetElement).closest('.readable');\n        if ($targetParent.length) {\n          const layoutElementUid = $targetParent.data('layout-element');\n          $targetParent.remove();\n          // add info to local storage\n          if (typeof Storage !== 'undefined') {\n            const hiddenTips = this.getHiddenTipsUids();\n            if (!hiddenTips.includes(layoutElementUid)) {\n              hiddenTips.push(layoutElementUid);\n              this.setHiddenTipsUids(hiddenTips);\n            }\n          }\n        }\n      }\n    },\n  },\n  {\n    defaults: {\n      additionalSites: [],\n      canCreateDrafts: false,\n      canEditMultipleSites: false,\n      canSaveCanonical: false,\n      canonicalId: null,\n      draftId: null,\n      draftName: null,\n      elementType: null,\n      enablePreview: false,\n      enabled: false,\n      enabledForSite: false,\n      hashedCpEditUrl: null,\n      isLive: false,\n      isProvisionalDraft: false,\n      isUnpublishedDraft: false,\n      previewTargets: [],\n      previewToken: null,\n      revisionId: null,\n      siteId: null,\n      siteStatuses: null,\n      siteToken: null,\n      visibleLayoutElements: {},\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element Editor Slideout\n */\nCraft.ElementEditorSlideout = Craft.CpScreenSlideout.extend(\n  {\n    $element: null,\n\n    init: function (element, settings) {\n      this.$element = $(element);\n\n      settings = Object.assign(\n        {},\n        Craft.ElementEditorSlideout.defaults,\n        settings,\n        {\n          showHeader: true,\n        }\n      );\n      this.base('elements/edit', settings);\n\n      this.on('load', () => {\n        const editor = this.$container.data('elementEditor');\n        if (editor) {\n          editor.on('beforeSubmit', () => {\n            Object.keys(this.settings.saveParams).forEach((name) => {\n              $('<input/>', {\n                class: 'hidden',\n                name: editor.namespaceInputName(name),\n                value: this.settings.saveParams[name],\n              }).appendTo(this.$container);\n            });\n          });\n        }\n      });\n\n      this.on('submit', (ev) => {\n        if (Craft.broadcaster) {\n          Craft.broadcaster.postMessage({\n            event: 'saveElement',\n            id: ev.response.data.element.id,\n          });\n        }\n\n        // Pass the response data off to onSaveElement() for backwards compatibility\n        if (this.settings.onSaveElement) {\n          const data = Object.assign(\n            {},\n            ev.response.data,\n            ev.response.data.element\n          );\n          delete data.element;\n          delete data.modelName;\n          delete data.message;\n          this.settings.onSaveElement(data);\n        }\n\n        // Refresh Live Preview\n        Craft.Preview.refresh();\n      });\n    },\n\n    getParams: function () {\n      const params = {};\n\n      if (this.settings.elementType) {\n        params.elementType = this.settings.elementType;\n      }\n\n      if (this.settings.elementId) {\n        params.elementId = this.settings.elementId;\n      } else if (this.$element && this.$element.data('id')) {\n        params.elementId = this.$element.data('id');\n      }\n\n      if (this.settings.draftId) {\n        params.draftId = this.settings.draftId;\n      } else if (this.$element && this.$element.data('draft-id')) {\n        params.draftId = this.$element.data('draft-id');\n      } else if (this.settings.revisionId) {\n        params.revisionId = this.settings.revisionId;\n      } else if (this.$element && this.$element.data('revision-id')) {\n        params.revisionId = this.$element.data('revision-id');\n      }\n\n      if (this.settings.siteId) {\n        params.siteId = this.settings.siteId;\n      } else if (this.$element && this.$element.data('site-id')) {\n        params.siteId = this.$element.data('site-id');\n      }\n\n      if (this.settings.prevalidate) {\n        params.prevalidate = 1;\n      }\n\n      return params;\n    },\n\n    handleSubmit: function (ev) {\n      this.$container.data('elementEditor').handleSubmit(ev);\n    },\n  },\n  {\n    defaults: {\n      elementId: null,\n      draftId: null,\n      revisionId: null,\n      elementType: null,\n      siteId: null,\n      prevalidate: false,\n      saveParams: {},\n      onSaveElement: null,\n      validators: [],\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\nCraft.ElementFieldSettings = Garnish.Base.extend({\n  allowMultipleSources: null,\n  $maintainHierarchyField: null,\n  $maintainHierarchyInput: null,\n  $sourcesField: null,\n  $sourceSelect: null,\n  $branchLimitField: null,\n  $maxRelationsField: null,\n  $minRelationsField: null,\n\n  init: function (\n    allowMultipleSources,\n    maintainHierarchyFieldId,\n    sourcesFieldId,\n    branchLimitFieldId,\n    minRelationsFieldId,\n    maxRelationsFieldId\n  ) {\n    debugger;\n    this.allowMultipleSources = allowMultipleSources;\n    this.$maintainHierarchyField = $(`#${maintainHierarchyFieldId}`);\n    this.$maintainHierarchyInput = this.$maintainHierarchyField.find(\n      'input[type=\"checkbox\"]'\n    );\n    this.$sourcesField = $(`#${sourcesFieldId}`);\n    if (!this.allowMultipleSources) {\n      this.$sourceSelect = this.$sourcesField.find('select');\n    }\n    this.$branchLimitField = $(`#${branchLimitFieldId}`);\n    this.$minRelationsField = $(`#${minRelationsFieldId}`);\n    this.$maxRelationsField = $(`#${maxRelationsFieldId}`);\n\n    this.updateLimitFields();\n    this.addListener(\n      this.$maintainHierarchyInput,\n      'change',\n      'updateLimitFields'\n    );\n\n    if (this.allowMultipleSources) {\n      this.$sourcesField.find('[type=checkbox]').each(\n        function (index, checkbox) {\n          this.addListener(\n            $(checkbox),\n            'change',\n            'updateMaintainHierarchyField'\n          );\n        }.bind(this)\n      );\n    } else {\n      this.addListener(\n        this.$sourceSelect,\n        'change',\n        'updateMaintainHierarchyField'\n      );\n    }\n    this.updateMaintainHierarchyField();\n  },\n\n  updateLimitFields: function () {\n    if (\n      !this.$maintainHierarchyField.hasClass('hidden') &&\n      this.$maintainHierarchyInput.is(':checked')\n    ) {\n      this.$minRelationsField.addClass('hidden');\n      this.$maxRelationsField.addClass('hidden');\n      this.$branchLimitField.removeClass('hidden');\n    } else {\n      this.$branchLimitField.addClass('hidden');\n      this.$minRelationsField.removeClass('hidden');\n      this.$maxRelationsField.removeClass('hidden');\n    }\n  },\n\n  updateMaintainHierarchyField: function () {\n    let showField;\n    if (this.allowMultipleSources) {\n      const $checkedInputs = this.$sourcesField.find(\n        '[type=\"checkbox\"]:checked'\n      );\n      showField =\n        $checkedInputs.length === 1 && $checkedInputs.data('structure-id');\n    } else {\n      showField = this.$sourceSelect\n        .children('option:selected')\n        .data('structure-id');\n    }\n\n    if (showField) {\n      this.$maintainHierarchyField.removeClass('hidden');\n    } else {\n      this.$maintainHierarchyField.addClass('hidden');\n    }\n\n    this.updateLimitFields();\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Base Element Index View\n */\nCraft.ElementThumbLoader = Garnish.Base.extend(\n  {\n    queue: null,\n    workers: [],\n\n    init: function () {\n      this.queue = [];\n\n      for (var i = 0; i < 3; i++) {\n        this.workers.push(new Craft.ElementThumbLoader.Worker(this));\n      }\n    },\n\n    load: function ($elements) {\n      // Only immediately load the visible images\n      let $thumbs = $elements.find('.elementthumb');\n      for (let i = 0; i < $thumbs.length; i++) {\n        let $thumb = $thumbs.eq(i);\n        let $scrollParent = $thumb.scrollParent();\n        if ($scrollParent.prop('nodeName') === 'FIELDSET') {\n          $scrollParent = $scrollParent.scrollParent();\n        }\n        if ($scrollParent[0] === document.body) {\n          $scrollParent = Garnish.$doc;\n        }\n        if (this.isVisible($thumb, $scrollParent)) {\n          this.addToQueue($thumb[0]);\n        } else {\n          let key = 'thumb' + Math.floor(Math.random() * 1000000);\n          Craft.ElementThumbLoader.invisibleThumbs[key] = [\n            this,\n            $thumb,\n            $scrollParent,\n          ];\n          $scrollParent.on(\n            `scroll.${key}`,\n            {\n              $thumb: $thumb,\n              $scrollParent: $scrollParent,\n              key: key,\n            },\n            (ev) => {\n              if (this.isVisible(ev.data.$thumb, ev.data.$scrollParent)) {\n                delete Craft.ElementThumbLoader.invisibleThumbs[ev.data.key];\n                $scrollParent.off(`scroll.${ev.data.key}`);\n                this.addToQueue(ev.data.$thumb[0]);\n              }\n            }\n          );\n        }\n      }\n    },\n\n    addToQueue: function (thumb) {\n      this.queue.push(thumb);\n\n      // See if there are any inactive workers\n      for (var i = 0; i < this.workers.length; i++) {\n        if (!this.workers[i].active) {\n          this.workers[i].loadNext();\n        }\n      }\n    },\n\n    isVisible: function ($thumb, $scrollParent) {\n      let thumbOffset = $thumb.offset().top;\n      let scrollParentOffset, scrollParentHeight;\n      if ($scrollParent[0] === document) {\n        scrollParentOffset = $scrollParent.scrollTop();\n        scrollParentHeight = Garnish.$win.height();\n      } else {\n        scrollParentOffset = $scrollParent.offset().top;\n        scrollParentHeight = $scrollParent.height();\n      }\n      return (\n        thumbOffset > scrollParentOffset &&\n        thumbOffset < scrollParentOffset + scrollParentHeight + 1000\n      );\n    },\n\n    destroy: function () {\n      for (var i = 0; i < this.workers.length; i++) {\n        this.workers[i].destroy();\n      }\n\n      this.base();\n    },\n  },\n  {\n    invisibleThumbs: {},\n    retryAll: function () {\n      for (let key in Craft.ElementThumbLoader.invisibleThumbs) {\n        let [queue, $thumb, $scrollParent] =\n          Craft.ElementThumbLoader.invisibleThumbs[key];\n        delete Craft.ElementThumbLoader.invisibleThumbs[key];\n        $scrollParent.off(`scroll.${key}`);\n        queue.load($thumb.parent());\n      }\n    },\n  }\n);\n\nCraft.ElementThumbLoader.Worker = Garnish.Base.extend({\n  loader: null,\n  active: false,\n\n  init: function (loader) {\n    this.loader = loader;\n  },\n\n  loadNext: function () {\n    var container = this.loader.queue.shift();\n    if (typeof container === 'undefined') {\n      this.active = false;\n      return;\n    }\n\n    this.active = true;\n    var $container = $(container);\n    if ($container.find('img').length) {\n      this.loadNext();\n      return;\n    }\n    var $img = $('<img/>', {\n      sizes: $container.attr('data-sizes'),\n      srcset: $container.attr('data-srcset'),\n      alt: $container.attr('data-alt') || '',\n    });\n    this.addListener($img, 'load,error', 'loadNext');\n    $img.appendTo($container);\n    picturefill({\n      elements: [$img[0]],\n    });\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Elevated Session Form\n */\nCraft.ElevatedSessionForm = Garnish.Base.extend({\n  $form: null,\n  inputs: null,\n\n  init: function (form, inputs) {\n    this.$form = $(form);\n\n    // Only check specific inputs?\n    if (typeof inputs !== 'undefined') {\n      this.inputs = [];\n      inputs = $.makeArray(inputs);\n\n      for (var i = 0; i < inputs.length; i++) {\n        var $inputs = $(inputs[i]);\n\n        for (var j = 0; j < $inputs.length; j++) {\n          var $input = $inputs.eq(j);\n\n          this.inputs.push({\n            input: $input,\n            val: Garnish.getInputPostVal($input),\n          });\n        }\n      }\n    }\n\n    this.addListener(this.$form, 'submit', 'handleFormSubmit');\n  },\n\n  handleFormSubmit: function (ev) {\n    // Ignore if we're in the middle of getting the elevated session timeout\n    if (Craft.elevatedSessionManager.fetchingTimeout) {\n      ev.preventDefault();\n      ev.stopImmediatePropagation();\n      return;\n    }\n\n    // Are we only interested in certain inputs?\n    if (this.inputs) {\n      var inputsChanged = false;\n      var $input;\n\n      for (var i = 0; i < this.inputs.length; i++) {\n        $input = this.inputs[i].input;\n        // Is this a password input?\n        if ($input.data('passwordInput')) {\n          $input = $input.data('passwordInput').$currentInput;\n        }\n\n        // Has this input's value changed?\n        if (Garnish.getInputPostVal($input) !== this.inputs[i].val) {\n          inputsChanged = true;\n          break;\n        }\n      }\n\n      if (!inputsChanged) {\n        // No need to interrupt the submit\n        return;\n      }\n    }\n\n    // Prevent the form from submitting until the user has an elevated session\n    ev.preventDefault();\n    ev.stopImmediatePropagation();\n    Craft.elevatedSessionManager.requireElevatedSession(\n      this.submitForm.bind(this)\n    );\n  },\n\n  submitForm: function () {\n    // Don't let handleFormSubmit() interrupt this time\n    this.disable();\n    this.$form.trigger('submit');\n    this.enable();\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Elevated Session Manager\n */\nCraft.ElevatedSessionManager = Garnish.Base.extend(\n  {\n    fetchingTimeout: false,\n\n    passwordModal: null,\n    $passwordInput: null,\n    $submitBtn: null,\n    $errorPara: null,\n\n    callback: null,\n\n    /**\n     * @callback requireElevatedSessionCallback\n     */\n    /**\n     * Requires that the user has an elevated session.\n     *\n     * @param {requireElevatedSessionCallback} callback The callback function that should be called once the user has an elevated session\n     */\n    requireElevatedSession: function (callback) {\n      this.callback = callback;\n\n      // Check the time remaining on the user’s elevated session (if any)\n      this.fetchingTimeout = true;\n\n      Craft.sendActionRequest('POST', 'users/get-elevated-session-timeout')\n        .then((response) => {\n          this.fetchingTimeout = false;\n          if (\n            response.data.timeout === false ||\n            response.data.timeout >=\n              Craft.ElevatedSessionManager.minSafeElevatedSessionTimeout\n          ) {\n            this.callback();\n          } else {\n            // Show the password modal\n            this.showPasswordModal();\n          }\n        })\n        .catch(() => {\n          this.fetchingTimeout = false;\n        });\n    },\n\n    showPasswordModal: function () {\n      if (!this.passwordModal) {\n        var $passwordModal = $(\n            '<form id=\"elevatedsessionmodal\" class=\"modal secure fitted\"/>'\n          ),\n          $body = $(\n            '<div class=\"body\"><p>' +\n              Craft.t('app', 'Enter your password to continue.') +\n              '</p></div>'\n          ).appendTo($passwordModal),\n          $inputContainer = $('<div class=\"inputcontainer\">').appendTo($body),\n          $inputsFlexContainer = $('<div class=\"flex\"/>').appendTo(\n            $inputContainer\n          ),\n          $passwordContainer = $('<div class=\"flex-grow\"/>').appendTo(\n            $inputsFlexContainer\n          ),\n          $buttonContainer = $('<td/>').appendTo($inputsFlexContainer),\n          $passwordWrapper = $('<div class=\"passwordwrapper\"/>').appendTo(\n            $passwordContainer\n          );\n\n        this.$passwordInput = $(\n          '<input type=\"password\" class=\"text password fullwidth\" placeholder=\"' +\n            Craft.t('app', 'Password') +\n            '\" autocomplete=\"current-password\"/>'\n        ).appendTo($passwordWrapper);\n        this.$submitBtn = Craft.ui\n          .createSubmitButton({\n            class: 'disabled',\n            label: Craft.t('app', 'Submit'),\n            spinner: true,\n          })\n          .appendTo($buttonContainer);\n        this.$errorPara = $('<p class=\"error\"/>').appendTo($body);\n\n        this.passwordModal = new Garnish.Modal($passwordModal, {\n          closeOtherModals: false,\n          onFadeIn: () => {\n            setTimeout(this.focusPasswordInput.bind(this), 100);\n          },\n          onFadeOut: () => {\n            this.$passwordInput.val('');\n          },\n        });\n\n        new Craft.PasswordInput(this.$passwordInput, {\n          onToggleInput: ($newPasswordInput) => {\n            this.$passwordInput = $newPasswordInput;\n          },\n        });\n\n        this.addListener(this.$passwordInput, 'input', 'validatePassword');\n        this.addListener($passwordModal, 'submit', 'submitPassword');\n      } else {\n        this.passwordModal.show();\n      }\n    },\n\n    focusPasswordInput: function () {\n      if (!Garnish.isMobileBrowser(true)) {\n        this.$passwordInput.trigger('focus');\n      }\n    },\n\n    validatePassword: function () {\n      if (this.$passwordInput.val().length >= 6) {\n        this.$submitBtn.removeClass('disabled');\n        return true;\n      } else {\n        this.$submitBtn.addClass('disabled');\n        return false;\n      }\n    },\n\n    submitPassword: function (ev) {\n      if (ev) {\n        ev.preventDefault();\n      }\n\n      if (!this.validatePassword()) {\n        return;\n      }\n\n      this.$submitBtn.addClass('loading');\n      this.clearLoginError();\n\n      var data = {\n        currentPassword: this.$passwordInput.val(),\n      };\n\n      Craft.sendActionRequest('POST', 'users/start-elevated-session', {data})\n        .then((response) => {\n          this.$submitBtn.removeClass('loading');\n          this.passwordModal.hide();\n          this.callback();\n        })\n        .catch(({response}) => {\n          this.$submitBtn.removeClass('loading');\n          this.showPasswordError(\n            response.data.message || Craft.t('app', 'Incorrect password.')\n          );\n          Garnish.shake(this.passwordModal.$container);\n          this.focusPasswordInput();\n        });\n    },\n\n    showPasswordError: function (error) {\n      if (error === null || typeof error === 'undefined') {\n        error = Craft.t('app', 'A server error occurred.');\n      }\n\n      this.$errorPara.text(error);\n      this.passwordModal.updateSizeAndPosition();\n    },\n\n    clearLoginError: function () {\n      this.showPasswordError('');\n    },\n  },\n  {\n    minSafeElevatedSessionTimeout: 5,\n  }\n);\n\n// Instantiate it\nCraft.elevatedSessionManager = new Craft.ElevatedSessionManager();\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Entry index class\n */\nCraft.EntryIndex = Craft.BaseElementIndex.extend({\n  publishableSections: null,\n  $newEntryBtnGroup: null,\n  $newEntryBtn: null,\n\n  init: function (elementType, $container, settings) {\n    this.publishableSections = [];\n    this.on('selectSource', this.updateButton.bind(this));\n    this.on('selectSite', this.updateButton.bind(this));\n    this.base(elementType, $container, settings);\n  },\n\n  afterInit: function () {\n    // Find which of the visible sections the user has permission to create new entries in\n    this.publishableSections = Craft.publishableSections.filter(\n      (s) => !!this.getSourceByKey(`section:${s.uid}`)\n    );\n\n    this.base();\n  },\n\n  getDefaultSourceKey: function () {\n    // Did they request a specific section in the URL?\n    if (\n      this.settings.context === 'index' &&\n      typeof defaultSectionHandle !== 'undefined'\n    ) {\n      if (defaultSectionHandle === 'singles') {\n        return 'singles';\n      }\n\n      for (let i = 0; i < this.$sources.length; i++) {\n        const $source = $(this.$sources[i]);\n        if ($source.data('handle') === defaultSectionHandle) {\n          return $source.data('key');\n        }\n      }\n    }\n\n    return this.base();\n  },\n\n  updateButton: function () {\n    if (!this.$source) {\n      return;\n    }\n\n    let handle;\n\n    // Get the handle of the selected source\n    if (this.$source.data('key') === 'singles') {\n      handle = 'singles';\n    } else {\n      handle = this.$source.data('handle');\n    }\n\n    // Update the New Entry button\n    // ---------------------------------------------------------------------\n\n    if (this.publishableSections.length) {\n      // Remove the old button, if there is one\n      if (this.$newEntryBtnGroup) {\n        this.$newEntryBtnGroup.remove();\n      }\n\n      // Determine if they are viewing a section that they have permission to create entries in\n      const selectedSection = this.publishableSections.find(\n        (s) => s.handle === handle\n      );\n\n      this.$newEntryBtnGroup = $('<div class=\"btngroup submit\" data-wrapper/>');\n      let $menuBtn;\n      const menuId = 'new-entry-menu-' + Craft.randomString(10);\n\n      // If they are, show a primary \"New entry\" button, and a dropdown of the other sections (if any).\n      // Otherwise only show a menu button\n      if (selectedSection) {\n        const visibleLabel =\n          this.settings.context === 'index'\n            ? Craft.t('app', 'New entry')\n            : Craft.t('app', 'New {section} entry', {\n                section: selectedSection.name,\n              });\n\n        const ariaLabel =\n          this.settings.context === 'index'\n            ? Craft.t('app', 'New entry in the {section} section', {\n                section: selectedSection.name,\n              })\n            : visibleLabel;\n\n        // In index contexts, the button functions as a link\n        // In non-index contexts, the button triggers a slideout editor\n        const role = this.settings.context === 'index' ? 'link' : null;\n\n        this.$newEntryBtn = Craft.ui\n          .createButton({\n            label: visibleLabel,\n            ariaLabel: ariaLabel,\n            spinner: true,\n            role: role,\n          })\n          .addClass('submit add icon')\n          .appendTo(this.$newEntryBtnGroup);\n\n        this.addListener(this.$newEntryBtn, 'click mousedown', (ev) => {\n          // If this is the element index, check for Ctrl+clicks and middle button clicks\n          if (\n            this.settings.context === 'index' &&\n            ((ev.type === 'click' && Garnish.isCtrlKeyPressed(ev)) ||\n              (ev.type === 'mousedown' && ev.originalEvent.button === 1))\n          ) {\n            window.open(Craft.getUrl(`entries/${selectedSection.handle}/new`));\n          } else if (ev.type === 'click') {\n            this._createEntry(selectedSection.id);\n          }\n        });\n\n        if (this.publishableSections.length > 1) {\n          $menuBtn = $('<button/>', {\n            type: 'button',\n            class: 'btn submit menubtn btngroup-btn-last',\n            'aria-controls': menuId,\n            'data-disclosure-trigger': '',\n            'aria-label': Craft.t('app', 'New entry, choose a section'),\n          }).appendTo(this.$newEntryBtnGroup);\n        }\n      } else {\n        this.$newEntryBtn = $menuBtn = Craft.ui\n          .createButton({\n            label: Craft.t('app', 'New entry'),\n            ariaLabel: Craft.t('app', 'New entry, choose a section'),\n            spinner: true,\n          })\n          .addClass('submit add icon menubtn btngroup-btn-last')\n          .attr('aria-controls', menuId)\n          .attr('data-disclosure-trigger', '')\n          .appendTo(this.$newEntryBtnGroup);\n      }\n\n      this.addButton(this.$newEntryBtnGroup);\n\n      if ($menuBtn) {\n        const $menuContainer = $('<div/>', {\n          id: menuId,\n          class: 'menu menu--disclosure',\n        }).appendTo(this.$newEntryBtnGroup);\n        const $ul = $('<ul/>').appendTo($menuContainer);\n\n        for (const section of this.publishableSections) {\n          const anchorRole =\n            this.settings.context === 'index' ? 'link' : 'button';\n          if (\n            (this.settings.context === 'index' &&\n              $.inArray(this.siteId, section.sites) !== -1) ||\n            (this.settings.context !== 'index' && section !== selectedSection)\n          ) {\n            const $li = $('<li/>').appendTo($ul);\n            const $a = $('<a/>', {\n              role: anchorRole === 'button' ? 'button' : null,\n              href: '#', // Allows for click listener and tab order\n              type: anchorRole === 'button' ? 'button' : null,\n              text: Craft.t('app', 'New {section} entry', {\n                section: section.name,\n              }),\n            }).appendTo($li);\n            this.addListener($a, 'click', () => {\n              $menuBtn.data('trigger').hide();\n              this._createEntry(section.id);\n            });\n\n            if (anchorRole === 'button') {\n              this.addListener($a, 'keydown', (event) => {\n                if (event.keyCode === Garnish.SPACE_KEY) {\n                  event.preventDefault();\n                  $menuBtn.data('trigger').hide();\n                  this._createEntry(section.id);\n                }\n              });\n            }\n          }\n        }\n\n        new Garnish.DisclosureMenu($menuBtn);\n      }\n    }\n\n    // Update the URL if we're on the Entries index\n    // ---------------------------------------------------------------------\n\n    if (this.settings.context === 'index') {\n      let uri = 'entries';\n\n      if (handle) {\n        uri += '/' + handle;\n      }\n\n      Craft.setPath(uri);\n    }\n  },\n\n  _createEntry: function (sectionId) {\n    if (this.$newEntryBtn.hasClass('loading')) {\n      console.warn('New entry creation already in progress.');\n      return;\n    }\n\n    // Find the section\n    const section = this.publishableSections.find((s) => s.id === sectionId);\n\n    if (!section) {\n      throw `Invalid section ID: ${sectionId}`;\n    }\n\n    this.$newEntryBtn.addClass('loading');\n\n    Craft.sendActionRequest('POST', 'entries/create', {\n      data: {\n        siteId: this.siteId,\n        section: section.handle,\n      },\n    })\n      .then(({data}) => {\n        if (this.settings.context === 'index') {\n          document.location.href = Craft.getUrl(data.cpEditUrl, {fresh: 1});\n        } else {\n          const slideout = Craft.createElementEditor(this.elementType, {\n            siteId: this.siteId,\n            elementId: data.entry.id,\n            draftId: data.entry.draftId,\n            params: {\n              fresh: 1,\n            },\n          });\n          slideout.on('submit', () => {\n            // Make sure the right section is selected\n            const sectionSourceKey = `section:${section.uid}`;\n\n            if (this.sourceKey !== sectionSourceKey) {\n              this.selectSourceByKey(sectionSourceKey);\n            }\n\n            this.clearSearch();\n            this.setSelectedSortAttribute('dateCreated', 'desc');\n            this.selectElementAfterUpdate(data.entry.id);\n            this.updateElements();\n          });\n        }\n      })\n      .finally(() => {\n        this.$newEntryBtn.removeClass('loading');\n      });\n  },\n});\n\n// Register it!\nCraft.registerElementIndexClass('craft\\\\elements\\\\Entry', Craft.EntryIndex);\n","/** global: Craft */\n/** global: Garnish */\nCraft.FieldLayoutDesigner = Garnish.Base.extend(\n  {\n    $container: null,\n    $configInput: null,\n    $tabContainer: null,\n    $newTabBtn: null,\n    $sidebar: null,\n    $libraryToggle: null,\n    $selectedLibrary: null,\n    $fieldLibrary: null,\n    $uiLibrary: null,\n    $uiLibraryElements: null,\n    $fieldSearch: null,\n    $clearFieldSearchBtn: null,\n    $fieldGroups: null,\n    $fields: null,\n\n    tabGrid: null,\n    elementDrag: null,\n\n    _config: null,\n\n    init: function (container, settings) {\n      this.$container = $(container);\n      this.setSettings(settings, Craft.FieldLayoutDesigner.defaults);\n\n      this.$configInput = this.$container.children('input[data-config-input]');\n      this._config = JSON.parse(this.$configInput.val());\n      if (!this._config.tabs) {\n        this._config.tabs = [];\n      }\n\n      let $workspace = this.$container.children('.fld-workspace');\n      this.$tabContainer = $workspace.children('.fld-tabs');\n      this.$newTabBtn = $workspace.children('.fld-new-tab-btn');\n      this.$sidebar = this.$container.children('.fld-sidebar');\n\n      this.$fieldLibrary = this.$selectedLibrary =\n        this.$sidebar.children('.fld-field-library');\n      let $fieldSearchContainer = this.$fieldLibrary.children('.search');\n      this.$fieldSearch = $fieldSearchContainer.children('input');\n      this.$clearFieldSearchBtn = $fieldSearchContainer.children('.clear');\n      this.$fieldGroups = this.$sidebar.find('.fld-field-group');\n      this.$fields = this.$fieldGroups.children('.fld-element');\n      this.$uiLibrary = this.$sidebar.children('.fld-ui-library');\n      this.$uiLibraryElements = this.$uiLibrary.children();\n\n      // Set up the layout grids\n      this.tabGrid = new Craft.Grid(this.$tabContainer, {\n        itemSelector: '.fld-tab',\n        minColWidth: 24 * 11,\n        fillMode: 'grid',\n        snapToGrid: 24,\n      });\n\n      let $tabs = this.$tabContainer.children();\n      for (let i = 0; i < $tabs.length; i++) {\n        this.initTab($($tabs[i]));\n      }\n\n      this.elementDrag = new Craft.FieldLayoutDesigner.ElementDrag(this);\n\n      if (this.settings.customizableTabs) {\n        this.tabDrag = new Craft.FieldLayoutDesigner.TabDrag(this);\n\n        this.addListener(this.$newTabBtn, 'activate', 'addTab');\n      }\n\n      // Set up the sidebar\n      if (this.settings.customizableUi) {\n        let $libraryPicker = this.$sidebar.children('.btngroup');\n        new Craft.Listbox($libraryPicker, {\n          onChange: ($selectedOption) => {\n            this.$selectedLibrary.addClass('hidden');\n            this.$selectedLibrary =\n              this[`$${$selectedOption.data('library')}Library`].removeClass(\n                'hidden'\n              );\n          },\n        });\n      }\n\n      this.addListener(this.$fieldSearch, 'input', () => {\n        let val = this.$fieldSearch.val().toLowerCase().replace(/['\"]/g, '');\n        if (!val) {\n          this.$fieldLibrary.find('.filtered').removeClass('filtered');\n          this.$clearFieldSearchBtn.addClass('hidden');\n          return;\n        }\n\n        this.$clearFieldSearchBtn.removeClass('hidden');\n        let $matches = this.$fields\n          .filter(`[data-keywords*=\"${val}\"]`)\n          .add(\n            this.$fieldGroups\n              .filter(`[data-name*=\"${val}\"]`)\n              .children('.fld-element')\n          )\n          .removeClass('filtered');\n        this.$fields.not($matches).addClass('filtered');\n\n        // hide any groups that don't have any results\n        for (let i = 0; i < this.$fieldGroups.length; i++) {\n          let $group = this.$fieldGroups.eq(i);\n          if ($group.find('.fld-element:not(.hidden):not(.filtered)').length) {\n            $group.removeClass('filtered');\n          } else {\n            $group.addClass('filtered');\n          }\n        }\n      });\n\n      this.addListener(this.$fieldSearch, 'keydown', (ev) => {\n        switch (ev.keyCode) {\n          case Garnish.ESC_KEY:\n            this.$fieldSearch.val('').trigger('input');\n            break;\n          case Garnish.RETURN_KEY:\n            // they most likely don't want to submit the form from here\n            ev.preventDefault();\n            break;\n        }\n      });\n\n      // Clear the search when the X button is clicked\n      this.addListener(this.$clearFieldSearchBtn, 'click', () => {\n        this.$fieldSearch.val('').trigger('input');\n      });\n    },\n\n    initTab: function ($tab) {\n      return new Craft.FieldLayoutDesigner.Tab(this, $tab);\n    },\n\n    removeFieldByHandle: function (attribute) {\n      this.$fields\n        .filter(`[data-attribute=\"${attribute}\"]:first`)\n        .removeClass('hidden')\n        .closest('.fld-field-group')\n        .removeClass('hidden');\n    },\n\n    addTab: function () {\n      if (!this.settings.customizableTabs) {\n        return;\n      }\n\n      const name = Craft.escapeHtml(\n        prompt(Craft.t('app', 'Give your tab a name.'))\n      );\n\n      if (!name) {\n        return;\n      }\n\n      const $tab = $(`\n<div class=\"fld-tab\">\n  <div class=\"tabs\">\n    <div class=\"tab sel draggable\">\n      <span>${name}</span>\n      <a class=\"settings icon\" title=\"${Craft.t('app', 'Settings')}\"></a>\n    </div>\n  </div>\n  <div class=\"fld-tabcontent\"></div>\n</div>\n`).appendTo(this.$tabContainer);\n\n      this.tabGrid.addItems($tab);\n      this.tabDrag.addItems($tab);\n\n      const tab = this.initTab($tab);\n      tab.updatePositionInConfig();\n    },\n\n    get config() {\n      return this._config;\n    },\n\n    set config(config) {\n      this._config = config;\n      this.$configInput.val(JSON.stringify(config));\n    },\n\n    updateConfig: function (callback) {\n      const config = callback(this.config);\n      if (config !== false) {\n        this.config = config;\n      }\n    },\n  },\n  {\n    defaults: {\n      customizableTabs: true,\n      customizableUi: true,\n    },\n\n    createSlideout: function (contents, js) {\n      const $body = $('<div/>', {class: 'fld-element-settings-body'});\n      $('<div/>', {class: 'fields', html: contents}).appendTo($body);\n      const $footer = $('<div/>', {class: 'fld-element-settings-footer'});\n      $('<div/>', {class: 'flex-grow'}).appendTo($footer);\n      const $cancelBtn = Craft.ui\n        .createButton({\n          label: Craft.t('app', 'Close'),\n          spinner: true,\n        })\n        .appendTo($footer);\n      Craft.ui\n        .createSubmitButton({\n          class: 'secondary',\n          label: Craft.t('app', 'Apply'),\n          spinner: true,\n        })\n        .appendTo($footer);\n      const $contents = $body.add($footer);\n\n      const slideout = new Craft.Slideout($contents, {\n        containerElement: 'form',\n        containerAttributes: {\n          action: '',\n          method: 'post',\n          novalidate: '',\n          class: 'fld-element-settings',\n        },\n      });\n      slideout.on('open', () => {\n        // Hold off a sec until it's positioned...\n        Garnish.requestAnimationFrame(() => {\n          // Focus on the first text input\n          slideout.$container.find('.text:first').trigger('focus');\n        });\n      });\n\n      $cancelBtn.on('click', () => {\n        slideout.close();\n      });\n\n      if (js) {\n        eval(js);\n      }\n\n      Craft.initUiElements(slideout.$container);\n\n      return slideout;\n    },\n  }\n);\n\nCraft.FieldLayoutDesigner.Tab = Garnish.Base.extend({\n  designer: null,\n  uid: null,\n  $container: null,\n  slideout: null,\n  destroyed: false,\n\n  init: function (designer, $container) {\n    this.designer = designer;\n    this.$container = $container;\n    this.$container.data('fld-tab', this);\n    this.uid = this.$container.data('uid');\n\n    // New tab?\n    if (!this.uid) {\n      this.uid = Craft.uuid();\n      this.config = {\n        uid: this.uid,\n        name: this.$container.find('.tabs .tab span').text(),\n        elements: [],\n      };\n      this.$container.data(\n        'settings-namespace',\n        this.designer.$container\n          .data('new-tab-settings-namespace')\n          .replace(/\\bTAB_UID\\b/g, this.uid)\n      );\n      this.$container.data(\n        'settings-html',\n        this.designer.$container\n          .data('new-tab-settings-html')\n          .replace(/\\bTAB_UID\\b/g, this.uid)\n          .replace(/\\bTAB_NAME\\b/g, this.config.name)\n      );\n      this.$container.data(\n        'settings-js',\n        this.designer.$container\n          .data('new-tab-settings-js')\n          .replace(/\\bTAB_UID\\b/g, this.uid)\n      );\n    }\n\n    if (this.designer.settings.customizableTabs) {\n      this.settingsNamespace = this.$container.data('settings-namespace');\n      this.createMenu();\n    }\n\n    // initialize the elements\n    const $elements = this.$container.children('.fld-tabcontent').children();\n\n    for (let i = 0; i < $elements.length; i++) {\n      this.initElement($($elements[i]));\n    }\n  },\n\n  createMenu: function () {\n    const $editBtn = this.$container.find('.tabs .settings');\n\n    $('<div class=\"menu\" data-align=\"center\"/>')\n      .insertAfter($editBtn)\n      .append(\n        $('<ul/>')\n          .append(\n            $('<li/>').append(\n              $('<a/>', {\n                'data-action': 'settings',\n                text: Craft.t('app', 'Settings'),\n              })\n            )\n          )\n          .append(\n            $('<li/>').append(\n              $('<a/>', {\n                'data-action': 'remove',\n                text: Craft.t('app', 'Remove'),\n              })\n            )\n          )\n      )\n      .append($('<hr/>'))\n      .append(\n        $('<ul/>')\n          .append(\n            $('<li/>').append(\n              $('<a/>', {\n                'data-action': 'moveLeft',\n                text: Craft.t('app', 'Move to the left'),\n              })\n            )\n          )\n          .append(\n            $('<li/>').append(\n              $('<a/>', {\n                'data-action': 'moveRight',\n                text: Craft.t('app', 'Move to the right'),\n              })\n            )\n          )\n      );\n\n    let menuBtn = new Garnish.MenuBtn($editBtn, {\n      onOptionSelect: this.onTabOptionSelect.bind(this),\n    });\n\n    menuBtn.menu.on('show', () => {\n      if (this.$container.prev('.fld-tab').length) {\n        menuBtn.menu.$container\n          .find('[data-action=moveLeft]')\n          .removeClass('disabled');\n      } else {\n        menuBtn.menu.$container\n          .find('[data-action=moveLeft]')\n          .addClass('disabled');\n      }\n\n      if (this.$container.next('.fld-tab').length) {\n        menuBtn.menu.$container\n          .find('[data-action=moveRight]')\n          .removeClass('disabled');\n      } else {\n        menuBtn.menu.$container\n          .find('[data-action=moveRight]')\n          .addClass('disabled');\n      }\n    });\n  },\n\n  onTabOptionSelect: function (option) {\n    if (!this.designer.settings.customizableTabs) {\n      return;\n    }\n\n    let $option = $(option);\n    let action = $option.data('action');\n\n    switch (action) {\n      case 'settings':\n        if (!this.slideout) {\n          this.createSettings();\n        } else {\n          this.slideout.open();\n        }\n        break;\n      case 'remove':\n        this.destroy();\n        break;\n      case 'moveLeft':\n        let $prev = this.$container.prev('.fld-tab');\n        if ($prev.length) {\n          this.$container.insertBefore($prev);\n          this.updatePositionInConfig();\n        }\n        break;\n      case 'moveRight':\n        let $next = this.$container.next('.fld-tab');\n        if ($next.length) {\n          this.$container.insertAfter($next);\n          this.updatePositionInConfig();\n        }\n        break;\n    }\n  },\n\n  createSettings: function () {\n    const settingsHtml = this.$container.data('settings-html');\n    const settingsJs = this.$container.data('settings-js');\n    this.slideout = Craft.FieldLayoutDesigner.createSlideout(\n      settingsHtml,\n      settingsJs\n    );\n\n    this.slideout.$container.on('submit', (ev) => {\n      ev.preventDefault();\n      this.applySettings();\n    });\n  },\n\n  applySettings: function () {\n    if (!this.slideout.$container.find('[name$=\"[name]\"]').val()) {\n      alert(Craft.t('app', 'You must specify a tab name.'));\n      return;\n    }\n\n    // update the UI\n    let $submitBtn = this.slideout.$container\n      .find('button[type=submit]')\n      .addClass('loading');\n\n    const config = $.extend({}, this.config);\n    delete config.elements;\n\n    Craft.sendActionRequest('POST', 'fields/apply-layout-tab-settings', {\n      data: {\n        config: config,\n        settingsNamespace: this.settingsNamespace,\n        settings: this.slideout.$container.serialize(),\n      },\n    })\n      .then((response) => {\n        this.updateConfig((config) =>\n          $.extend(response.data.config, {elements: config.elements})\n        );\n        debugger;\n        const $label = this.$container.find('.tabs .tab span');\n        const $indicator = $label.children('.fld-indicator');\n        if (response.data.hasConditions) {\n          if (!$indicator.length) {\n            $label.append(\n              $('<div/>', {\n                class: 'fld-indicator',\n                title: Craft.t('app', 'This tab is conditional'),\n                'aria-label': Craft.t('app', 'This tab is conditional'),\n                'data-icon': 'condition',\n              })\n            );\n          }\n        } else if ($indicator.length) {\n          $indicator.remove();\n        }\n        this.slideout.close();\n      })\n      .catch((e) => {\n        Craft.cp.displayError();\n        console.error(e);\n      })\n      .finally(() => {\n        $submitBtn.removeClass('loading');\n        this.slideout.close();\n      });\n  },\n\n  initElement: function ($element) {\n    return new Craft.FieldLayoutDesigner.Element(this, $element);\n  },\n\n  get index() {\n    return this.designer.config.tabs.findIndex((c) => c.uid === this.uid);\n  },\n\n  get config() {\n    if (!this.uid) {\n      throw 'Tab is missing its UID';\n    }\n    let config = this.designer.config.tabs.find((c) => c.uid === this.uid);\n    if (!config) {\n      config = {\n        uid: this.uid,\n        elements: [],\n      };\n      this.config = config;\n    }\n    return config;\n  },\n\n  set config(config) {\n    if (this.destroyed) {\n      return;\n    }\n\n    // Is the name changing?\n    if (config.name && config.name !== this.config.name) {\n      this.$container.find('.tabs .tab span').text(config.name);\n    }\n\n    const designerConfig = this.designer.config;\n    const index = this.index;\n    if (index !== -1) {\n      designerConfig.tabs[index] = config;\n    } else {\n      const newIndex = $.inArray(\n        this.$container[0],\n        this.$container.parent().children('.fld-tab')\n      );\n      designerConfig.tabs.splice(newIndex, 0, config);\n    }\n    this.designer.config = designerConfig;\n  },\n\n  updateConfig: function (callback) {\n    if (this.destroyed) {\n      return;\n    }\n\n    const config = callback(this.config);\n    if (config !== false) {\n      this.config = config;\n    }\n  },\n\n  updatePositionInConfig: function () {\n    if (this.destroyed) {\n      return;\n    }\n\n    this.designer.updateConfig((config) => {\n      const tabConfig = this.config;\n      const oldIndex = this.index;\n      const newIndex = $.inArray(\n        this.$container[0],\n        this.$container.parent().children('.fld-tab')\n      );\n      if (oldIndex !== -1) {\n        config.tabs.splice(oldIndex, 1);\n      }\n      config.tabs.splice(newIndex, 0, tabConfig);\n      return config;\n    });\n  },\n\n  destroy: function () {\n    if (this.destroyed) {\n      return;\n    }\n\n    this.destroyed = true;\n\n    this.designer.updateConfig((config) => {\n      const index = this.index;\n      if (index === -1) {\n        return false;\n      }\n      config.tabs.splice(index, 1);\n      return config;\n    });\n\n    // First destroy the tab's elements\n    let $elements = this.$container.find('.fld-element');\n    for (let i = 0; i < $elements.length; i++) {\n      $elements.eq(i).data('fld-element').destroy();\n    }\n\n    this.designer.tabGrid.removeItems(this.$container);\n    this.designer.tabDrag.removeItems(this.$container);\n    this.$container.remove();\n\n    this.base();\n  },\n});\n\nCraft.FieldLayoutDesigner.Element = Garnish.Base.extend({\n  tab: null,\n  $container: null,\n  $settingsContainer: null,\n  $editBtn: null,\n\n  uid: null,\n  isField: false,\n  attribute: null,\n  requirable: false,\n  hasCustomWidth: false,\n  hasSettings: false,\n  settingsNamespace: null,\n  slideout: null,\n\n  init: function (tab, $container) {\n    this.tab = tab;\n    this.$container = $container;\n    this.$container.data('fld-element', this);\n    this.uid = this.$container.data('uid');\n\n    // New element?\n    if (!this.uid) {\n      this.uid = Craft.uuid();\n      this.config = $.extend(this.$container.data('config'), {uid: this.uid});\n    }\n\n    this.isField = this.$container.hasClass('fld-field');\n    this.requirable =\n      this.isField && Garnish.hasAttr(this.$container, 'data-requirable');\n\n    if (this.isField) {\n      this.attribute = this.$container.data('attribute');\n    }\n\n    this.settingsNamespace = this.$container\n      .data('settings-namespace')\n      .replace(/\\bELEMENT_UID\\b/g, this.uid);\n    let settingsHtml = (this.$container.data('settings-html') || '').replace(\n      /\\bELEMENT_UID\\b/g,\n      this.uid\n    );\n    let isRequired =\n      this.requirable && this.$container.hasClass('fld-required');\n    this.hasCustomWidth =\n      this.tab.designer.settings.customizableUi &&\n      Garnish.hasAttr(this.$container, 'data-has-custom-width');\n    this.hasSettings = settingsHtml || this.requirable;\n\n    if (this.hasSettings) {\n      // create the setting container\n      this.$settingsContainer = $('<div/>', {\n        class: 'hidden',\n      });\n\n      // create the edit button\n      this.$editBtn = $('<a/>', {\n        role: 'button',\n        tabindex: 0,\n        class: 'settings icon',\n        title: Craft.t('app', 'Edit'),\n      });\n\n      const showSettings = () => {\n        if (!this.slideout) {\n          this.createSettings(settingsHtml, isRequired);\n        } else {\n          this.slideout.open();\n        }\n      };\n\n      this.$editBtn.on('click', showSettings);\n      this.$container.on('dblclick', showSettings);\n    }\n\n    this.initUi();\n\n    // cleanup\n    this.$container.attr('data-keywords', null);\n    this.$container.attr('data-settings-html', null);\n  },\n\n  initUi: function () {\n    if (this.hasCustomWidth) {\n      let widthSlider = new Craft.SlidePicker(this.config.width || 100, {\n        min: 25,\n        max: 100,\n        step: 25,\n        valueLabel: (width) => {\n          return Craft.t('app', '{pct} width', {pct: `${width}%`});\n        },\n        onChange: (width) => {\n          this.updateConfig((config) => {\n            config.width = width;\n            return config;\n          });\n        },\n      });\n      widthSlider.$container.appendTo(this.$container);\n    }\n\n    if (this.hasSettings) {\n      this.$editBtn.appendTo(this.$container);\n    }\n  },\n\n  createSettings: function (settingsHtml, isRequired) {\n    const settingsJs = (this.$container.data('settings-js') || '').replace(\n      /\\bELEMENT_UID\\b/g,\n      this.uid\n    );\n    this.slideout = Craft.FieldLayoutDesigner.createSlideout(\n      settingsHtml,\n      settingsJs\n    );\n\n    this.slideout.$container.on('submit', (ev) => {\n      ev.preventDefault();\n      this.applySettings();\n    });\n\n    if (this.requirable) {\n      const $fieldsContainer = this.slideout.$container.find('.fields:first');\n      Craft.ui\n        .createLightswitchField({\n          label: Craft.t('app', 'Required'),\n          name: `${this.settingsNamespace}[required]`,\n          on: isRequired,\n        })\n        .prependTo($fieldsContainer);\n    }\n\n    this.trigger('createSettings');\n  },\n\n  applySettings: function () {\n    // update the UI\n    let $submitBtn = this.slideout.$container\n      .find('button[type=submit]')\n      .addClass('loading');\n\n    Craft.sendActionRequest('POST', 'fields/apply-layout-element-settings', {\n      data: {\n        config: this.config,\n        settingsNamespace: this.settingsNamespace,\n        settings: this.slideout.$container.serialize(),\n      },\n    })\n      .then((response) => {\n        this.config = response.data.config;\n        this.$editBtn.detach();\n        this.$container.html($(response.data.selectorHtml).html());\n        this.initUi();\n      })\n      .catch((e) => {\n        Craft.cp.displayError();\n        console.error(e);\n      })\n      .finally(() => {\n        $submitBtn.removeClass('loading');\n        this.updateRequiredClass();\n        this.slideout.close();\n      });\n  },\n\n  updateRequiredClass: function () {\n    if (!this.requirable) {\n      return;\n    }\n\n    if (this.config.required) {\n      this.$container.addClass('fld-required');\n    } else {\n      this.$container.removeClass('fld-required');\n    }\n  },\n\n  get index() {\n    const tabConfig = this.tab.config;\n    if (typeof tabConfig === 'undefined') {\n      return -1;\n    }\n    return tabConfig.elements.findIndex((c) => c.uid === this.uid);\n  },\n\n  get config() {\n    if (!this.uid) {\n      throw 'Tab is missing its UID';\n    }\n    let config = this.tab.config.elements.find((c) => c.uid === this.uid);\n    if (!config) {\n      config = {\n        uid: this.uid,\n      };\n      this.config = config;\n    }\n    return config;\n  },\n\n  set config(config) {\n    const tabConfig = this.tab.config;\n    const index = this.index;\n    if (index !== -1) {\n      tabConfig.elements[index] = config;\n    } else {\n      const newIndex = $.inArray(\n        this.$container[0],\n        this.$container.parent().children('.fld-element')\n      );\n      tabConfig.elements.splice(newIndex, 0, config);\n    }\n    this.tab.config = tabConfig;\n  },\n\n  updateConfig: function (callback) {\n    const config = callback(this.config);\n    if (config !== false) {\n      this.config = config;\n    }\n  },\n\n  updatePositionInConfig: function () {\n    this.tab.updateConfig((config) => {\n      const elementConfig = this.config;\n      const oldIndex = this.index;\n      const newIndex = $.inArray(\n        this.$container[0],\n        this.$container.parent().children('.fld-element')\n      );\n      if (oldIndex !== -1) {\n        config.elements.splice(oldIndex, 1);\n      }\n      config.elements.splice(newIndex, 0, elementConfig);\n      return config;\n    });\n  },\n\n  destroy: function () {\n    this.tab.updateConfig((config) => {\n      const index = this.index;\n      if (index === -1) {\n        return false;\n      }\n      config.elements.splice(index, 1);\n      return config;\n    });\n\n    this.tab.designer.elementDrag.removeItems(this.$container);\n    this.$container.remove();\n\n    if (this.isField) {\n      this.tab.designer.removeFieldByHandle(this.attribute);\n    }\n\n    this.base();\n  },\n});\n\nCraft.FieldLayoutDesigner.BaseDrag = Garnish.Drag.extend({\n  designer: null,\n  $insertion: null,\n  showingInsertion: false,\n  $caboose: null,\n\n  /**\n   * Constructor\n   */\n  init: function (designer, settings) {\n    this.designer = designer;\n    this.base(this.findItems(), settings);\n  },\n\n  /**\n   * On Drag Start\n   */\n  onDragStart: function () {\n    this.base();\n\n    // Create the insertion\n    this.$insertion = this.createInsertion();\n\n    // Add the caboose\n    this.$caboose = this.createCaboose();\n    this.$items = $().add(this.$items.add(this.$caboose));\n\n    Garnish.$bod.addClass('dragging');\n  },\n\n  removeCaboose: function () {\n    this.$items = this.$items.not(this.$caboose);\n    this.$caboose.remove();\n  },\n\n  swapDraggeeWithInsertion: function () {\n    this.$insertion.insertBefore(this.$draggee);\n    this.$draggee.detach();\n    this.$items = $().add(this.$items.not(this.$draggee).add(this.$insertion));\n    this.showingInsertion = true;\n  },\n\n  swapInsertionWithDraggee: function () {\n    this.$insertion.replaceWith(this.$draggee);\n    this.$items = $().add(this.$items.not(this.$insertion).add(this.$draggee));\n    this.showingInsertion = false;\n  },\n\n  /**\n   * Sets the item midpoints up front so we don't have to keep checking on every mouse move\n   */\n  setMidpoints: function () {\n    for (let i = 0; i < this.$items.length; i++) {\n      let $item = $(this.$items[i]);\n      let offset = $item.offset();\n\n      // Skip library elements\n      if ($item.hasClass('unused')) {\n        continue;\n      }\n\n      $item.data('midpoint', {\n        left: offset.left + $item.outerWidth() / 2,\n        top: offset.top + $item.outerHeight() / 2,\n      });\n    }\n  },\n\n  /**\n   * Returns the closest item to the cursor.\n   */\n  getClosestItem: function () {\n    this.getClosestItem._closestItem = null;\n    this.getClosestItem._closestItemMouseDiff = null;\n\n    for (\n      this.getClosestItem._i = 0;\n      this.getClosestItem._i < this.$items.length;\n      this.getClosestItem._i++\n    ) {\n      this.getClosestItem._$item = $(this.$items[this.getClosestItem._i]);\n\n      this.getClosestItem._midpoint =\n        this.getClosestItem._$item.data('midpoint');\n      if (!this.getClosestItem._midpoint) {\n        continue;\n      }\n\n      this.getClosestItem._mouseDiff = Garnish.getDist(\n        this.getClosestItem._midpoint.left,\n        this.getClosestItem._midpoint.top,\n        this.mouseX,\n        this.mouseY\n      );\n\n      if (\n        this.getClosestItem._closestItem === null ||\n        this.getClosestItem._mouseDiff <\n          this.getClosestItem._closestItemMouseDiff\n      ) {\n        this.getClosestItem._closestItem = this.getClosestItem._$item[0];\n        this.getClosestItem._closestItemMouseDiff =\n          this.getClosestItem._mouseDiff;\n      }\n    }\n\n    return this.getClosestItem._closestItem;\n  },\n\n  checkForNewClosestItem: function () {\n    // Is there a new closest item?\n    this.checkForNewClosestItem._closestItem = this.getClosestItem();\n\n    if (this.checkForNewClosestItem._closestItem === this.$insertion[0]) {\n      return;\n    }\n\n    if (\n      this.showingInsertion &&\n      $.inArray(this.$insertion[0], this.$items) <\n        $.inArray(this.checkForNewClosestItem._closestItem, this.$items) &&\n      $.inArray(this.checkForNewClosestItem._closestItem, this.$caboose) === -1\n    ) {\n      this.$insertion.insertAfter(this.checkForNewClosestItem._closestItem);\n    } else {\n      this.$insertion.insertBefore(this.checkForNewClosestItem._closestItem);\n    }\n\n    this.$items = $().add(this.$items.add(this.$insertion));\n    this.showingInsertion = true;\n    this.designer.tabGrid.refreshCols(true);\n    this.setMidpoints();\n  },\n\n  /**\n   * On Drag Stop\n   */\n  onDragStop: function () {\n    if (this.showingInsertion) {\n      this.swapInsertionWithDraggee();\n    }\n\n    this.removeCaboose();\n\n    this.designer.tabGrid.refreshCols(true);\n\n    // return the helpers to the draggees\n    let offset = this.$draggee.offset();\n    if (!offset || (offset.top === 0 && offset.left === 0)) {\n      this.$draggee\n        .css({\n          display: this.draggeeDisplay,\n          visibility: 'visible',\n          opacity: 0,\n        })\n        .velocity({opacity: 1}, Garnish.FX_DURATION);\n      this.helpers[0].velocity({opacity: 0}, Garnish.FX_DURATION, () => {\n        this._showDraggee();\n      });\n    } else {\n      this.returnHelpersToDraggees();\n    }\n\n    this.base();\n\n    Garnish.$bod.removeClass('dragging');\n  },\n});\n\nCraft.FieldLayoutDesigner.TabDrag = Craft.FieldLayoutDesigner.BaseDrag.extend({\n  /**\n   * Constructor\n   */\n  init: function (designer) {\n    let settings = {\n      handle: '.tab',\n    };\n\n    this.base(designer, settings);\n  },\n\n  findItems: function () {\n    return this.designer.$tabContainer.find('> div.fld-tab');\n  },\n\n  /**\n   * On Drag Start\n   */\n  onDragStart: function () {\n    this.base();\n    this.swapDraggeeWithInsertion();\n    this.setMidpoints();\n  },\n\n  swapDraggeeWithInsertion: function () {\n    this.base();\n    this.designer.tabGrid.removeItems(this.$draggee);\n    this.designer.tabGrid.addItems(this.$insertion);\n  },\n\n  swapInsertionWithDraggee: function () {\n    this.base();\n    this.designer.tabGrid.removeItems(this.$insertion);\n    this.designer.tabGrid.addItems(this.$draggee);\n  },\n\n  /**\n   * On Drag\n   */\n  onDrag: function () {\n    this.checkForNewClosestItem();\n    this.base();\n  },\n\n  /**\n   * On Drag Stop\n   */\n  onDragStop: function () {\n    this.base();\n\n    // \"show\" the tab, but make it invisible\n    this.$draggee.css({\n      display: this.draggeeDisplay,\n      visibility: 'hidden',\n    });\n\n    this.$draggee.data('fld-tab').updatePositionInConfig();\n  },\n\n  /**\n   * Creates the caboose\n   */\n  createCaboose: function () {\n    let $caboose = $('<div class=\"fld-tab fld-tab-caboose\"/>').appendTo(\n      this.designer.$tabContainer\n    );\n    this.designer.tabGrid.addItems($caboose);\n    return $caboose;\n  },\n\n  /**\n   * Removes the caboose\n   */\n  removeCaboose: function () {\n    this.base();\n    this.designer.tabGrid.removeItems(this.$caboose);\n  },\n\n  /**\n   * Creates the insertion\n   */\n  createInsertion: function () {\n    let $tab = this.$draggee.find('.tab');\n\n    return $(`\n<div class=\"fld-tab fld-insertion\" style=\"height: ${this.$draggee.height()}px;\">\n  <div class=\"tabs\"><div class=\"tab sel draggable\" style=\"width: ${$tab.width()}px; height: ${$tab.height()}px;\"></div></div>\n  <div class=\"fld-tabcontent\" style=\"height: ${this.$draggee\n    .find('.fld-tabcontent')\n    .height()}px;\"></div>\n</div>\n`);\n  },\n});\n\nCraft.FieldLayoutDesigner.ElementDrag =\n  Craft.FieldLayoutDesigner.BaseDrag.extend({\n    draggingLibraryElement: false,\n    draggingField: false,\n    originalTab: null,\n\n    /**\n     * On Drag Start\n     */\n    onDragStart: function () {\n      this.base();\n\n      // Are we dragging an element from the library?\n      this.draggingLibraryElement = this.$draggee.hasClass('unused');\n\n      // Is it a field?\n      this.draggingField = this.$draggee.hasClass('fld-field');\n\n      // keep UI elements visible\n      if (this.draggingLibraryElement && !this.draggingField) {\n        this.$draggee.css({\n          display: this.draggeeDisplay,\n          visibility: 'visible',\n        });\n      }\n\n      // Swap the draggee with the insertion if dragging a selected item\n      if (!this.draggingLibraryElement) {\n        this.originalTab = this.$draggee.closest('.fld-tab').data('fld-tab');\n        this.swapDraggeeWithInsertion();\n      } else {\n        this.originalTab = null;\n      }\n\n      this.setMidpoints();\n    },\n\n    /**\n     * On Drag\n     */\n    onDrag: function () {\n      if (this.isDraggeeMandatory() || this.isHoveringOverTab()) {\n        this.checkForNewClosestItem();\n      } else if (this.showingInsertion) {\n        this.$insertion.remove();\n        this.$items = $().add(this.$items.not(this.$insertion));\n        this.showingInsertion = false;\n        this.designer.tabGrid.refreshCols(true);\n        this.setMidpoints();\n      }\n\n      this.base();\n    },\n\n    isDraggeeMandatory: function () {\n      return Garnish.hasAttr(this.$draggee, 'data-mandatory');\n    },\n\n    isHoveringOverTab: function () {\n      for (let i = 0; i < this.designer.tabGrid.$items.length; i++) {\n        if (\n          Garnish.hitTest(\n            this.mouseX,\n            this.mouseY,\n            this.designer.tabGrid.$items.eq(i)\n          )\n        ) {\n          return true;\n        }\n      }\n\n      return false;\n    },\n\n    findItems: function () {\n      // Return all of the used + unused fields\n      return this.designer.$tabContainer\n        .find('.fld-element')\n        .add(this.designer.$sidebar.find('.fld-element'));\n    },\n\n    /**\n     * Creates the caboose\n     */\n    createCaboose: function () {\n      let $caboose = $();\n      let $fieldContainers = this.designer.$tabContainer.find(\n        '> .fld-tab > .fld-tabcontent'\n      );\n\n      for (let i = 0; i < $fieldContainers.length; i++) {\n        $caboose = $caboose.add($('<div/>').appendTo($fieldContainers[i]));\n      }\n\n      return $caboose;\n    },\n\n    /**\n     * Creates the insertion\n     */\n    createInsertion: function () {\n      return $(\n        `<div class=\"fld-element fld-insertion\" style=\"height: ${this.$draggee.outerHeight()}px;\"/>`\n      );\n    },\n\n    /**\n     * On Drag Stop\n     */\n    onDragStop: function () {\n      let showingInsertion = this.showingInsertion;\n      if (showingInsertion) {\n        if (this.draggingLibraryElement) {\n          // Create a new element based on that one\n          const $element = this.$draggee.clone().removeClass('unused');\n\n          if (this.draggingField) {\n            // Hide the library field\n            this.$draggee\n              .css({visibility: 'inherit', display: 'field'})\n              .addClass('hidden');\n\n            // Hide the group too?\n            if (\n              this.$draggee.siblings('.fld-field:not(.hidden)').length === 0\n            ) {\n              this.$draggee.closest('.fld-field-group').addClass('hidden');\n            }\n          }\n\n          // Set this.$draggee to the clone, as if we were dragging that all along\n          this.$draggee = $element;\n\n          // Remember it for later\n          this.addItems($element);\n        }\n      } else if (!this.draggingLibraryElement) {\n        let $libraryElement = this.draggingField\n          ? this.designer.$fields.filter(\n              `[data-attribute=\"${this.$draggee.data('attribute')}\"]:first`\n            )\n          : this.designer.$uiLibraryElements.filter(\n              `[data-type=\"${this.$draggee.data('type')}\"]:first`\n            );\n\n        if (this.draggingField) {\n          // show the field in the library\n          $libraryElement.removeClass('hidden');\n          $libraryElement.closest('.fld-field-group').removeClass('hidden');\n        }\n\n        // Destroy the original element\n        this.$draggee.data('fld-element').destroy();\n\n        // Set this.$draggee to the library element, as if we were dragging that all along\n        this.$draggee = $libraryElement;\n      }\n\n      this.base();\n\n      this.$draggee.css({\n        display: this.draggeeDisplay,\n        visibility:\n          this.draggingField || showingInsertion ? 'hidden' : 'visible',\n      });\n\n      if (showingInsertion) {\n        const tab = this.$draggee.closest('.fld-tab').data('fld-tab');\n        let element;\n\n        if (this.draggingLibraryElement) {\n          element = tab.initElement(this.$draggee);\n        } else {\n          element = this.$draggee.data('fld-element');\n\n          // New tab?\n          if (tab !== this.originalTab) {\n            const config = element.config;\n\n            this.originalTab.updateConfig((config) => {\n              const index = element.index;\n              if (index === -1) {\n                return false;\n              }\n              config.elements.splice(index, 1);\n              return config;\n            });\n\n            this.$draggee.data('fld-element').tab = tab;\n            element.config = config;\n          }\n        }\n\n        element.updatePositionInConfig();\n      }\n    },\n  });\n","/** global: Craft */\n/** global: Garnish */\n/**\n * FieldToggle\n */\nCraft.FieldToggle = Garnish.Base.extend({\n  $toggle: null,\n  targetPrefix: null,\n  targetSelector: null,\n  reverseTargetSelector: null,\n\n  _$target: null,\n  _$reverseTarget: null,\n  type: null,\n\n  init: function (toggle) {\n    this.$toggle = $(toggle);\n\n    // Is this already a field toggle?\n    if (this.$toggle.data('fieldtoggle')) {\n      console.warn('Double-instantiating a field toggle on an element');\n      this.$toggle.data('fieldtoggle').destroy();\n    }\n\n    this.$toggle.data('fieldtoggle', this);\n\n    this.type = this.getType();\n\n    if (this.type === 'select' || this.type === 'fieldset') {\n      this.targetPrefix = this.$toggle.attr('data-target-prefix') || '';\n    } else {\n      this.targetSelector = this.normalizeTargetSelector(\n        this.$toggle.data('target')\n      );\n      this.reverseTargetSelector = this.normalizeTargetSelector(\n        this.$toggle.data('reverse-target')\n      );\n    }\n\n    this.findTargets();\n\n    switch (this.type) {\n      case 'link':\n        this.addListener(this.$toggle, 'click', 'onToggleChange');\n        break;\n      case 'fieldset':\n        this.addListener(\n          this.$toggle.find('input'),\n          'change',\n          'onToggleChange'\n        );\n        break;\n      default:\n        this.addListener(this.$toggle, 'change', 'onToggleChange');\n        this.onToggleChange();\n    }\n  },\n\n  normalizeTargetSelector: function (selector) {\n    if (selector && !selector.match(/^[#\\.]/)) {\n      selector = '#' + selector;\n    }\n\n    return selector;\n  },\n\n  getType: function () {\n    let nodeName = this.$toggle.prop('nodeName');\n    if (\n      (nodeName === 'INPUT' && this.$toggle.attr('type') === 'checkbox') ||\n      this.$toggle.attr('role') === 'checkbox' ||\n      this.$toggle.attr('role') === 'switch'\n    ) {\n      return 'checkbox';\n    }\n\n    switch (nodeName) {\n      case 'SELECT':\n        if (Garnish.hasAttr(this.$toggle, 'data-boolean-menu')) {\n          return 'booleanMenu';\n        }\n        return 'select';\n      case 'A':\n        return 'link';\n      default:\n        return 'fieldset';\n    }\n  },\n\n  findTargets: function () {\n    if (this.type === 'select' || this.type === 'fieldset') {\n      var toggleVal = this.getToggleVal();\n      this._$target = $(\n        this.normalizeTargetSelector(this.targetPrefix + this.getToggleVal())\n      );\n    } else {\n      if (this.targetSelector) {\n        this._$target = $(this.targetSelector);\n      }\n\n      if (this.reverseTargetSelector) {\n        this._$reverseTarget = $(this.reverseTargetSelector);\n      }\n    }\n  },\n\n  getToggleVal: function () {\n    switch (this.type) {\n      case 'checkbox':\n        if (typeof this.$toggle.prop('checked') !== 'undefined') {\n          return this.$toggle.prop('checked');\n        }\n        return this.$toggle.attr('aria-checked') === 'true';\n\n      case 'booleanMenu':\n        const boolean = this.$toggle.data('boolean');\n        if (typeof boolean !== 'undefined') {\n          return boolean;\n        }\n        const val = this.$toggle.val();\n        return val && val !== '0';\n\n      default:\n        let postVal;\n        if (this.type === 'fieldset') {\n          postVal = this.$toggle.find('input:checked:first').val();\n        } else {\n          postVal = Garnish.getInputPostVal(this.$toggle);\n        }\n\n        // Normalize the value\n        return typeof postVal === 'undefined' || postVal === null\n          ? null\n          : postVal.replace(/[^\\w]+/g, '-');\n    }\n  },\n\n  onToggleChange: function () {\n    if (this.type === 'select' || this.type === 'fieldset') {\n      this.hideTarget(this._$target);\n      this.findTargets();\n      this.showTarget(this._$target);\n    } else {\n      this.findTargets();\n\n      if (this.type === 'link') {\n        this.onToggleChange._show =\n          this.$toggle.hasClass('collapsed') ||\n          !this.$toggle.hasClass('expanded');\n      } else {\n        this.onToggleChange._show = !!this.getToggleVal();\n      }\n\n      if (this.onToggleChange._show) {\n        this.showTarget(this._$target);\n        this.hideTarget(this._$reverseTarget);\n      } else {\n        this.hideTarget(this._$target);\n        this.showTarget(this._$reverseTarget);\n      }\n\n      delete this.onToggleChange._show;\n    }\n  },\n\n  showTarget: function ($target) {\n    if ($target && $target.length) {\n      this.showTarget._currentHeight = $target.height();\n\n      $target.removeClass('hidden');\n\n      if (this.type !== 'select' && this.type !== 'fieldset') {\n        if (this.type === 'link') {\n          this.$toggle.removeClass('collapsed');\n          this.$toggle.addClass('expanded');\n        }\n\n        for (let i = 0; i < $target.length; i++) {\n          (($t) => {\n            if ($t.prop('nodeName') !== 'SPAN') {\n              $t.height('auto');\n              this.showTarget._targetHeight = $t.height();\n              $t.css({\n                height: this.showTarget._currentHeight,\n                overflow: 'hidden',\n              });\n\n              $t.velocity('stop');\n\n              $t.velocity(\n                {height: this.showTarget._targetHeight},\n                'fast',\n                function () {\n                  $t.css({\n                    height: '',\n                    overflow: '',\n                  });\n                }\n              );\n            }\n          })($target.eq(i));\n        }\n\n        delete this.showTarget._targetHeight;\n      }\n\n      delete this.showTarget._currentHeight;\n\n      // Trigger a resize event in case there are any grids in the target that need to initialize\n      Garnish.$win.trigger('resize');\n    }\n  },\n\n  hideTarget: function ($target) {\n    if ($target && $target.length) {\n      if (this.type === 'select' || this.type === 'fieldset') {\n        $target.addClass('hidden');\n      } else {\n        if (this.type === 'link') {\n          this.$toggle.removeClass('expanded');\n          this.$toggle.addClass('collapsed');\n        }\n\n        for (let i = 0; i < $target.length; i++) {\n          (($t) => {\n            if ($t.hasClass('hidden')) {\n              return;\n            }\n            if ($t.prop('nodeName') === 'SPAN') {\n              $t.addClass('hidden');\n            } else {\n              $t.css('overflow', 'hidden');\n              $t.velocity('stop');\n              $t.velocity({height: 0}, 'fast', function () {\n                $t.addClass('hidden');\n              });\n            }\n          })($target.eq(i));\n        }\n      }\n    }\n  },\n\n  destroy: function () {\n    this.$toggle.removeData('fieldtoggle');\n    this.base();\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\nCraft.Grid = Garnish.Base.extend(\n  {\n    $container: null,\n\n    $items: null,\n    items: null,\n    totalCols: null,\n    colGutterDrop: null,\n    colPctWidth: null,\n\n    possibleItemColspans: null,\n    possibleItemPositionsByColspan: null,\n\n    itemPositions: null,\n    itemColspansByPosition: null,\n\n    layouts: null,\n    layout: null,\n    itemHeights: null,\n    leftPadding: null,\n\n    _refreshingCols: false,\n    _refreshColsAfterRefresh: false,\n    _forceRefreshColsAfterRefresh: false,\n\n    init: function (container, settings) {\n      this.$container = $(container);\n\n      // Is this already a grid?\n      if (this.$container.data('grid')) {\n        console.warn('Double-instantiating a grid on an element');\n        this.$container.data('grid').destroy();\n      }\n\n      this.$container.data('grid', this);\n\n      this.setSettings(settings, Craft.Grid.defaults);\n\n      // Set the refreshCols() proxy that container resizes will trigger\n      this.handleContainerHeightProxy = () => {\n        this.refreshCols(false, true);\n      };\n\n      this.$items = this.$container.children(this.settings.itemSelector);\n      this.setItems();\n      this.refreshCols(true, false);\n\n      Garnish.$doc.ready(() => {\n        this.refreshCols(false, false);\n      });\n    },\n\n    addItems: function (items) {\n      this.$items = $().add(this.$items.add(items));\n      this.setItems();\n      this.refreshCols(true, true);\n    },\n\n    removeItems: function (items) {\n      this.$items = $().add(this.$items.not(items));\n      this.setItems();\n      this.refreshCols(true, true);\n    },\n\n    resetItemOrder: function () {\n      this.$items = $().add(this.$items);\n      this.setItems();\n      this.refreshCols(true, true);\n    },\n\n    setItems: function () {\n      this.setItems._ = {};\n\n      this.items = [];\n\n      for (\n        this.setItems._.i = 0;\n        this.setItems._.i < this.$items.length;\n        this.setItems._.i++\n      ) {\n        this.items.push($(this.$items[this.setItems._.i]));\n      }\n\n      delete this.setItems._;\n    },\n\n    refreshCols: function (force) {\n      if (this._refreshingCols) {\n        this._refreshColsAfterRefresh = true;\n        if (force) {\n          this._forceRefreshColsAfterRefresh = true;\n        }\n        return;\n      }\n\n      this._refreshingCols = true;\n\n      if (!this.items.length) {\n        this.completeRefreshCols();\n        return;\n      }\n\n      this.refreshCols._ = {};\n\n      // Check to see if the grid is actually visible\n      this.refreshCols._.oldHeight = this.$container[0].style.height;\n      this.$container[0].style.height = 1;\n      this.refreshCols._.scrollHeight = this.$container[0].scrollHeight;\n      this.$container[0].style.height = this.refreshCols._.oldHeight;\n\n      if (this.refreshCols._.scrollHeight === 0) {\n        this.completeRefreshCols();\n        return;\n      }\n\n      if (this.settings.cols) {\n        this.refreshCols._.totalCols = this.settings.cols;\n      } else {\n        this.refreshCols._.totalCols = Math.floor(\n          this.$container.width() / this.settings.minColWidth\n        );\n\n        // If we're adding a new column, require an extra 20 pixels in case a scrollbar shows up\n        if (\n          this.totalCols !== null &&\n          this.refreshCols._.totalCols > this.totalCols\n        ) {\n          this.refreshCols._.totalCols = Math.floor(\n            (this.$container.width() - 20) / this.settings.minColWidth\n          );\n        }\n\n        if (\n          this.settings.maxCols &&\n          this.refreshCols._.totalCols > this.settings.maxCols\n        ) {\n          this.refreshCols._.totalCols = this.settings.maxCols;\n        }\n      }\n\n      if (this.refreshCols._.totalCols === 0) {\n        this.refreshCols._.totalCols = 1;\n      }\n\n      // Same number of columns as before?\n      if (force !== true && this.totalCols === this.refreshCols._.totalCols) {\n        this.completeRefreshCols();\n        return;\n      }\n\n      this.totalCols = this.refreshCols._.totalCols;\n      this.colGutterDrop =\n        (this.settings.gutter * (this.totalCols - 1)) / this.totalCols;\n\n      // Temporarily stop listening to container resizes\n      this.removeListener(this.$container, 'resize');\n\n      if (this.settings.fillMode === 'grid') {\n        this.refreshCols._.itemIndex = 0;\n\n        while (this.refreshCols._.itemIndex < this.items.length) {\n          // Append the next X items and figure out which one is the tallest\n          this.refreshCols._.tallestItemHeight = -1;\n          this.refreshCols._.colIndex = 0;\n\n          for (\n            this.refreshCols._.i = this.refreshCols._.itemIndex;\n            this.refreshCols._.i <\n              this.refreshCols._.itemIndex + this.totalCols &&\n            this.refreshCols._.i < this.items.length;\n            this.refreshCols._.i++\n          ) {\n            this.refreshCols._.itemHeight = this.items[this.refreshCols._.i]\n              .height('auto')\n              .height();\n\n            if (\n              this.refreshCols._.itemHeight >\n              this.refreshCols._.tallestItemHeight\n            ) {\n              this.refreshCols._.tallestItemHeight =\n                this.refreshCols._.itemHeight;\n            }\n\n            this.refreshCols._.colIndex++;\n          }\n\n          if (this.settings.snapToGrid) {\n            this.refreshCols._.remainder =\n              this.refreshCols._.tallestItemHeight % this.settings.snapToGrid;\n\n            if (this.refreshCols._.remainder) {\n              this.refreshCols._.tallestItemHeight +=\n                this.settings.snapToGrid - this.refreshCols._.remainder;\n            }\n          }\n\n          // Now set their heights to the tallest one\n          for (\n            this.refreshCols._.i = this.refreshCols._.itemIndex;\n            this.refreshCols._.i <\n              this.refreshCols._.itemIndex + this.totalCols &&\n            this.refreshCols._.i < this.items.length;\n            this.refreshCols._.i++\n          ) {\n            this.items[this.refreshCols._.i].height(\n              this.refreshCols._.tallestItemHeight\n            );\n          }\n\n          // set the this.refreshCols._.itemIndex pointer to the next one up\n          this.refreshCols._.itemIndex += this.totalCols;\n        }\n      } else {\n        this.removeListener(this.$items, 'resize');\n\n        // If there's only one column, sneak out early\n        if (this.totalCols === 1) {\n          this.$container.height('auto');\n          this.$items\n            .show()\n            .css({\n              position: 'relative',\n              width: 'auto',\n              top: 0,\n            })\n            .css(Craft.left, 0);\n        } else {\n          this.$items.css('position', 'absolute');\n          this.colPctWidth = 100 / this.totalCols;\n\n          // The setup\n\n          this.layouts = [];\n\n          this.itemPositions = [];\n          this.itemColspansByPosition = [];\n\n          // Figure out all of the possible colspans for each item,\n          // as well as all the possible positions for each item at each of its colspans\n\n          this.possibleItemColspans = [];\n          this.possibleItemPositionsByColspan = [];\n          this.itemHeightsByColspan = [];\n\n          for (\n            this.refreshCols._.item = 0;\n            this.refreshCols._.item < this.items.length;\n            this.refreshCols._.item++\n          ) {\n            this.possibleItemColspans[this.refreshCols._.item] = [];\n            this.possibleItemPositionsByColspan[this.refreshCols._.item] = {};\n            this.itemHeightsByColspan[this.refreshCols._.item] = {};\n\n            this.refreshCols._.$item =\n              this.items[this.refreshCols._.item].show();\n            this.refreshCols._.positionRight =\n              this.refreshCols._.$item.data('position') === 'right';\n            this.refreshCols._.positionLeft =\n              this.refreshCols._.$item.data('position') === 'left';\n            this.refreshCols._.minColspan = this.refreshCols._.$item.data(\n              'colspan'\n            )\n              ? this.refreshCols._.$item.data('colspan')\n              : this.refreshCols._.$item.data('min-colspan')\n              ? this.refreshCols._.$item.data('min-colspan')\n              : 1;\n            this.refreshCols._.maxColspan = this.refreshCols._.$item.data(\n              'colspan'\n            )\n              ? this.refreshCols._.$item.data('colspan')\n              : this.refreshCols._.$item.data('max-colspan')\n              ? this.refreshCols._.$item.data('max-colspan')\n              : this.totalCols;\n\n            if (this.refreshCols._.minColspan > this.totalCols) {\n              this.refreshCols._.minColspan = this.totalCols;\n            }\n            if (this.refreshCols._.maxColspan > this.totalCols) {\n              this.refreshCols._.maxColspan = this.totalCols;\n            }\n\n            for (\n              this.refreshCols._.colspan = this.refreshCols._.minColspan;\n              this.refreshCols._.colspan <= this.refreshCols._.maxColspan;\n              this.refreshCols._.colspan++\n            ) {\n              // Get the height for this colspan\n              this.refreshCols._.$item.css(\n                'width',\n                this.getItemWidthCss(this.refreshCols._.colspan)\n              );\n              this.itemHeightsByColspan[this.refreshCols._.item][\n                this.refreshCols._.colspan\n              ] = this.refreshCols._.$item.outerHeight();\n\n              this.possibleItemColspans[this.refreshCols._.item].push(\n                this.refreshCols._.colspan\n              );\n              this.possibleItemPositionsByColspan[this.refreshCols._.item][\n                this.refreshCols._.colspan\n              ] = [];\n\n              if (this.refreshCols._.positionLeft) {\n                this.refreshCols._.minPosition = 0;\n                this.refreshCols._.maxPosition = 0;\n              } else if (this.refreshCols._.positionRight) {\n                this.refreshCols._.minPosition =\n                  this.totalCols - this.refreshCols._.colspan;\n                this.refreshCols._.maxPosition = this.refreshCols._.minPosition;\n              } else {\n                this.refreshCols._.minPosition = 0;\n                this.refreshCols._.maxPosition =\n                  this.totalCols - this.refreshCols._.colspan;\n              }\n\n              for (\n                this.refreshCols._.position = this.refreshCols._.minPosition;\n                this.refreshCols._.position <= this.refreshCols._.maxPosition;\n                this.refreshCols._.position++\n              ) {\n                this.possibleItemPositionsByColspan[this.refreshCols._.item][\n                  this.refreshCols._.colspan\n                ].push(this.refreshCols._.position);\n              }\n            }\n          }\n\n          // Find all the possible layouts\n\n          this.refreshCols._.colHeights = [];\n\n          for (\n            this.refreshCols._.i = 0;\n            this.refreshCols._.i < this.totalCols;\n            this.refreshCols._.i++\n          ) {\n            this.refreshCols._.colHeights.push(0);\n          }\n\n          this.createLayouts(0, [], [], this.refreshCols._.colHeights, 0);\n\n          // Now find the layout that looks the best.\n\n          // First find the layouts with the highest number of used columns\n          this.refreshCols._.layoutTotalCols = [];\n\n          for (\n            this.refreshCols._.i = 0;\n            this.refreshCols._.i < this.layouts.length;\n            this.refreshCols._.i++\n          ) {\n            this.refreshCols._.layoutTotalCols[this.refreshCols._.i] = 0;\n\n            for (\n              this.refreshCols._.j = 0;\n              this.refreshCols._.j < this.totalCols;\n              this.refreshCols._.j++\n            ) {\n              if (\n                this.layouts[this.refreshCols._.i].colHeights[\n                  this.refreshCols._.j\n                ]\n              ) {\n                this.refreshCols._.layoutTotalCols[this.refreshCols._.i]++;\n              }\n            }\n          }\n\n          this.refreshCols._.highestTotalCols = Math.max.apply(\n            null,\n            this.refreshCols._.layoutTotalCols\n          );\n\n          // Filter out the ones that aren't using as many columns as they could be\n          for (\n            this.refreshCols._.i = this.layouts.length - 1;\n            this.refreshCols._.i >= 0;\n            this.refreshCols._.i--\n          ) {\n            if (\n              this.refreshCols._.layoutTotalCols[this.refreshCols._.i] !==\n              this.refreshCols._.highestTotalCols\n            ) {\n              this.layouts.splice(this.refreshCols._.i, 1);\n            }\n          }\n\n          // Find the layout(s) with the least overall height\n          this.refreshCols._.layoutHeights = [];\n\n          for (\n            this.refreshCols._.i = 0;\n            this.refreshCols._.i < this.layouts.length;\n            this.refreshCols._.i++\n          ) {\n            this.refreshCols._.layoutHeights.push(\n              Math.max.apply(\n                null,\n                this.layouts[this.refreshCols._.i].colHeights\n              )\n            );\n          }\n\n          this.refreshCols._.shortestHeight = Math.min.apply(\n            null,\n            this.refreshCols._.layoutHeights\n          );\n          this.refreshCols._.shortestLayouts = [];\n          this.refreshCols._.emptySpaces = [];\n\n          for (\n            this.refreshCols._.i = 0;\n            this.refreshCols._.i < this.refreshCols._.layoutHeights.length;\n            this.refreshCols._.i++\n          ) {\n            if (\n              this.refreshCols._.layoutHeights[this.refreshCols._.i] ===\n              this.refreshCols._.shortestHeight\n            ) {\n              this.refreshCols._.shortestLayouts.push(\n                this.layouts[this.refreshCols._.i]\n              );\n\n              // Now get its total empty space, including any trailing empty space\n              this.refreshCols._.emptySpace =\n                this.layouts[this.refreshCols._.i].emptySpace;\n\n              for (\n                this.refreshCols._.j = 0;\n                this.refreshCols._.j < this.totalCols;\n                this.refreshCols._.j++\n              ) {\n                this.refreshCols._.emptySpace +=\n                  this.refreshCols._.shortestHeight -\n                  this.layouts[this.refreshCols._.i].colHeights[\n                    this.refreshCols._.j\n                  ];\n              }\n\n              this.refreshCols._.emptySpaces.push(\n                this.refreshCols._.emptySpace\n              );\n            }\n          }\n\n          // And the layout with the least empty space is...\n          this.layout =\n            this.refreshCols._.shortestLayouts[\n              $.inArray(\n                Math.min.apply(null, this.refreshCols._.emptySpaces),\n                this.refreshCols._.emptySpaces\n              )\n            ];\n\n          // Set the item widths and left positions\n          for (\n            this.refreshCols._.i = 0;\n            this.refreshCols._.i < this.items.length;\n            this.refreshCols._.i++\n          ) {\n            this.refreshCols._.css = {\n              width: this.getItemWidthCss(\n                this.layout.colspans[this.refreshCols._.i]\n              ),\n            };\n            this.refreshCols._.css[Craft.left] = this.getItemLeftPosCss(\n              this.layout.positions[this.refreshCols._.i]\n            );\n            this.items[this.refreshCols._.i].css(this.refreshCols._.css);\n          }\n\n          // If every item is at position 0, then let them lay out au naturel\n          if (this.isSimpleLayout()) {\n            this.$container.height('auto');\n            this.$items.css({\n              position: 'relative',\n              top: 0,\n              'margin-bottom': this.settings.gutter + 'px',\n            });\n          } else {\n            this.$items.css('position', 'absolute');\n\n            // Now position the items\n            this.positionItems();\n\n            // Update the positions as the items' heigthts change\n            this.addListener(this.$items, 'resize', 'onItemResize');\n          }\n        }\n      }\n\n      this.completeRefreshCols();\n\n      // Resume container resize listening\n      this.addListener(\n        this.$container,\n        'resize',\n        this.handleContainerHeightProxy\n      );\n\n      this.onRefreshCols();\n    },\n\n    completeRefreshCols: function () {\n      // Delete the internal variable object\n      if (typeof this.refreshCols._ !== 'undefined') {\n        delete this.refreshCols._;\n      }\n\n      this._refreshingCols = false;\n\n      if (this._refreshColsAfterRefresh) {\n        var force = this._forceRefreshColsAfterRefresh;\n        this._refreshColsAfterRefresh = false;\n        this._forceRefreshColsAfterRefresh = false;\n\n        Garnish.requestAnimationFrame(() => {\n          this.refreshCols(force);\n        });\n      }\n    },\n\n    getItemWidth: function (colspan) {\n      return this.colPctWidth * colspan;\n    },\n\n    getItemWidthCss: function (colspan) {\n      return (\n        'calc(' +\n        this.getItemWidth(colspan) +\n        '% - ' +\n        this.colGutterDrop +\n        'px)'\n      );\n    },\n\n    getItemWidthInPx: function (colspan) {\n      return (\n        (this.getItemWidth(colspan) / 100) * this.$container.width() -\n        this.colGutterDrop\n      );\n    },\n\n    getItemLeftPosCss: function (position) {\n      return (\n        'calc(' +\n        '(' +\n        this.getItemWidth(1) +\n        '% + ' +\n        (this.settings.gutter - this.colGutterDrop) +\n        'px) * ' +\n        position +\n        ')'\n      );\n    },\n\n    getItemLeftPosInPx: function (position) {\n      return (\n        ((this.getItemWidth(1) / 100) * this.$container.width() +\n          (this.settings.gutter - this.colGutterDrop)) *\n        position\n      );\n    },\n\n    createLayouts: function (\n      item,\n      prevPositions,\n      prevColspans,\n      prevColHeights,\n      prevEmptySpace\n    ) {\n      new Craft.Grid.LayoutGenerator(this).createLayouts(\n        item,\n        prevPositions,\n        prevColspans,\n        prevColHeights,\n        prevEmptySpace\n      );\n    },\n\n    isSimpleLayout: function () {\n      this.isSimpleLayout._ = {};\n\n      for (\n        this.isSimpleLayout._.i = 0;\n        this.isSimpleLayout._.i < this.layout.positions.length;\n        this.isSimpleLayout._.i++\n      ) {\n        if (this.layout.positions[this.isSimpleLayout._.i] !== 0) {\n          delete this.isSimpleLayout._;\n          return false;\n        }\n      }\n\n      delete this.isSimpleLayout._;\n      return true;\n    },\n\n    positionItems: function () {\n      this.positionItems._ = {};\n\n      this.positionItems._.colHeights = [];\n\n      for (\n        this.positionItems._.i = 0;\n        this.positionItems._.i < this.totalCols;\n        this.positionItems._.i++\n      ) {\n        this.positionItems._.colHeights.push(0);\n      }\n\n      for (\n        this.positionItems._.i = 0;\n        this.positionItems._.i < this.items.length;\n        this.positionItems._.i++\n      ) {\n        this.positionItems._.endingCol =\n          this.layout.positions[this.positionItems._.i] +\n          this.layout.colspans[this.positionItems._.i] -\n          1;\n        this.positionItems._.affectedColHeights = [];\n\n        for (\n          this.positionItems._.col =\n            this.layout.positions[this.positionItems._.i];\n          this.positionItems._.col <= this.positionItems._.endingCol;\n          this.positionItems._.col++\n        ) {\n          this.positionItems._.affectedColHeights.push(\n            this.positionItems._.colHeights[this.positionItems._.col]\n          );\n        }\n\n        this.positionItems._.top = Math.max.apply(\n          null,\n          this.positionItems._.affectedColHeights\n        );\n        if (this.positionItems._.top > 0) {\n          this.positionItems._.top += this.settings.gutter;\n        }\n\n        this.items[this.positionItems._.i].css('top', this.positionItems._.top);\n\n        // Now add the new heights to those columns\n        for (\n          this.positionItems._.col =\n            this.layout.positions[this.positionItems._.i];\n          this.positionItems._.col <= this.positionItems._.endingCol;\n          this.positionItems._.col++\n        ) {\n          this.positionItems._.colHeights[this.positionItems._.col] =\n            this.positionItems._.top +\n            this.itemHeightsByColspan[this.positionItems._.i][\n              this.layout.colspans[this.positionItems._.i]\n            ];\n        }\n      }\n\n      // Set the container height\n      this.$container.height(\n        Math.max.apply(null, this.positionItems._.colHeights)\n      );\n\n      delete this.positionItems._;\n    },\n\n    onItemResize: function (ev) {\n      this.onItemResize._ = {};\n\n      // Prevent this from bubbling up to the container, which has its own resize listener\n      ev.stopPropagation();\n\n      this.onItemResize._.item = $.inArray(ev.currentTarget, this.$items);\n\n      if (this.onItemResize._.item !== -1) {\n        // Update the height and reposition the items\n        this.onItemResize._.newHeight =\n          this.items[this.onItemResize._.item].outerHeight();\n\n        if (\n          this.onItemResize._.newHeight !==\n          this.itemHeightsByColspan[this.onItemResize._.item][\n            this.layout.colspans[this.onItemResize._.item]\n          ]\n        ) {\n          this.itemHeightsByColspan[this.onItemResize._.item][\n            this.layout.colspans[this.onItemResize._.item]\n          ] = this.onItemResize._.newHeight;\n          this.positionItems(false);\n        }\n      }\n\n      delete this.onItemResize._;\n    },\n\n    onRefreshCols: function () {\n      this.trigger('refreshCols');\n      this.settings.onRefreshCols();\n    },\n\n    destroy: function () {\n      this.$container.removeData('grid');\n      this.base();\n    },\n  },\n  {\n    defaults: {\n      itemSelector: '.item',\n      cols: null,\n      maxCols: null,\n      minColWidth: 320,\n      gutter: 14,\n      fillMode: 'top',\n      colClass: 'col',\n      snapToGrid: null,\n\n      onRefreshCols: $.noop,\n    },\n  }\n);\n\nCraft.Grid.LayoutGenerator = Garnish.Base.extend({\n  grid: null,\n  _: null,\n\n  init: function (grid) {\n    this.grid = grid;\n  },\n\n  createLayouts: function (\n    item,\n    prevPositions,\n    prevColspans,\n    prevColHeights,\n    prevEmptySpace\n  ) {\n    this._ = {};\n\n    // Loop through all possible colspans\n    for (\n      this._.c = 0;\n      this._.c < this.grid.possibleItemColspans[item].length;\n      this._.c++\n    ) {\n      this._.colspan = this.grid.possibleItemColspans[item][this._.c];\n\n      // Loop through all the possible positions for this colspan,\n      // and find the one that is closest to the top\n\n      this._.tallestColHeightsByPosition = [];\n\n      for (\n        this._.p = 0;\n        this._.p <\n        this.grid.possibleItemPositionsByColspan[item][this._.colspan].length;\n        this._.p++\n      ) {\n        this._.position =\n          this.grid.possibleItemPositionsByColspan[item][this._.colspan][\n            this._.p\n          ];\n\n        this._.colHeightsForPosition = [];\n        this._.endingCol = this._.position + this._.colspan - 1;\n\n        for (\n          this._.col = this._.position;\n          this._.col <= this._.endingCol;\n          this._.col++\n        ) {\n          this._.colHeightsForPosition.push(prevColHeights[this._.col]);\n        }\n\n        this._.tallestColHeightsByPosition[this._.p] = Math.max.apply(\n          null,\n          this._.colHeightsForPosition\n        );\n      }\n\n      // And the shortest position for this colspan is...\n      this._.p = $.inArray(\n        Math.min.apply(null, this._.tallestColHeightsByPosition),\n        this._.tallestColHeightsByPosition\n      );\n      this._.position =\n        this.grid.possibleItemPositionsByColspan[item][this._.colspan][\n          this._.p\n        ];\n\n      // Now log the colspan/position placement\n      this._.positions = prevPositions.slice(0);\n      this._.colspans = prevColspans.slice(0);\n      this._.colHeights = prevColHeights.slice(0);\n      this._.emptySpace = prevEmptySpace;\n\n      this._.positions.push(this._.position);\n      this._.colspans.push(this._.colspan);\n\n      // Add the new heights to those columns\n      this._.tallestColHeight = this._.tallestColHeightsByPosition[this._.p];\n      this._.endingCol = this._.position + this._.colspan - 1;\n\n      for (\n        this._.col = this._.position;\n        this._.col <= this._.endingCol;\n        this._.col++\n      ) {\n        this._.emptySpace +=\n          this._.tallestColHeight - this._.colHeights[this._.col];\n        this._.colHeights[this._.col] =\n          this._.tallestColHeight +\n          this.grid.itemHeightsByColspan[item][this._.colspan];\n      }\n\n      // If this is the last item, create the layout\n      if (item === this.grid.items.length - 1) {\n        this.grid.layouts.push({\n          positions: this._.positions,\n          colspans: this._.colspans,\n          colHeights: this._.colHeights,\n          emptySpace: this._.emptySpace,\n        });\n      } else {\n        // Dive deeper\n        this.grid.createLayouts(\n          item + 1,\n          this._.positions,\n          this._.colspans,\n          this._.colHeights,\n          this._.emptySpace\n        );\n      }\n    }\n\n    delete this._;\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Handle Generator\n */\nCraft.HandleGenerator = Craft.BaseInputGenerator.extend({\n  generateTargetValue: function (sourceVal) {\n    // Remove HTML tags\n    var handle = sourceVal.replace('/<(.*?)>/g', '');\n\n    // Remove inner-word punctuation\n    handle = handle.replace(/['\"‘’“”\\[\\]\\(\\)\\{\\}:]/g, '');\n\n    // Make it lowercase\n    handle = handle.toLowerCase();\n\n    // Convert extended ASCII characters to basic ASCII\n    handle = Craft.asciiString(handle);\n\n    if (!this.settings.allowNonAlphaStart) {\n      // Handle must start with a letter\n      handle = handle.replace(/^[^a-z]+/, '');\n    }\n\n    // Get the \"words\"\n    var words = Craft.filterArray(handle.split(/[^a-z0-9]+/));\n    handle = '';\n\n    if (Craft.handleCasing === 'snake') {\n      return words.join('_');\n    }\n\n    // Make it camelCase\n    for (let i = 0; i < words.length; i++) {\n      if (Craft.handleCasing !== 'pascal' && i === 0) {\n        handle += words[i];\n      } else {\n        handle += words[i].charAt(0).toUpperCase() + words[i].substring(1);\n      }\n    }\n\n    return handle;\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Image upload class for user photos, site icon and logo.\n */\nCraft.ImageUpload = Garnish.Base.extend(\n  {\n    $container: null,\n    progressBar: null,\n    uploader: null,\n\n    init: function (settings) {\n      this.setSettings(settings, Craft.ImageUpload.defaults);\n      this.initImageUpload();\n    },\n\n    initImageUpload: function () {\n      this.$container = $(this.settings.containerSelector);\n      this.progressBar = new Craft.ProgressBar(\n        $('<div class=\"progress-shade\"></div>').appendTo(this.$container)\n      );\n\n      var options = {\n        url: Craft.getActionUrl(this.settings.uploadAction),\n        formData: this.settings.postParameters,\n        fileInput: this.$container.find(this.settings.fileInputSelector),\n        paramName: this.settings.uploadParamName,\n      };\n\n      // If CSRF protection isn't enabled, these won't be defined.\n      if (\n        typeof Craft.csrfTokenName !== 'undefined' &&\n        typeof Craft.csrfTokenValue !== 'undefined'\n      ) {\n        // Add the CSRF token\n        options.formData[Craft.csrfTokenName] = Craft.csrfTokenValue;\n      }\n\n      options.events = {};\n      options.events.fileuploadstart = this._onUploadStart.bind(this);\n      options.events.fileuploadprogressall = this._onUploadProgress.bind(this);\n      options.events.fileuploaddone = this._onUploadComplete.bind(this);\n      options.events.fileuploadfail = this._onUploadFailure.bind(this);\n\n      this.uploader = new Craft.Uploader(this.$container, options);\n\n      this.initButtons();\n    },\n\n    initButtons: function () {\n      this.$container\n        .find(this.settings.uploadButtonSelector)\n        .on('click', (ev) => {\n          this.$container\n            .find(this.settings.fileInputSelector)\n            .trigger('click');\n        });\n\n      this.$container\n        .find(this.settings.deleteButtonSelector)\n        .on('click', (ev) => {\n          if (\n            confirm(\n              Craft.t('app', 'Are you sure you want to delete this image?')\n            )\n          ) {\n            $(ev.currentTarget)\n              .parent()\n              .append('<div class=\"blocking-modal\"></div>');\n\n            Craft.sendActionRequest('POST', this.settings.deleteAction, {\n              data: this.settings.postParameters,\n            }).then(({data}) => {\n              this.refreshImage(data);\n            });\n          }\n        });\n    },\n\n    refreshImage: function (response) {\n      $(this.settings.containerSelector).replaceWith(response.html);\n      this.settings.onAfterRefreshImage(response);\n      this.initImageUpload();\n    },\n\n    /**\n     * On upload start.\n     */\n    _onUploadStart: function (event) {\n      this.progressBar.$progressBar.css({\n        top: Math.round(this.$container.outerHeight() / 2) - 6,\n      });\n\n      this.$container.addClass('uploading');\n      this.progressBar.resetProgressBar();\n      this.progressBar.showProgressBar();\n    },\n\n    /**\n     * On upload progress.\n     */\n    _onUploadProgress: function (event, data) {\n      var progress = parseInt((data.loaded / data.total) * 100, 10);\n      this.progressBar.setProgressPercentage(progress);\n    },\n\n    /**\n     * On a file being uploaded.\n     */\n    _onUploadComplete: function (event, data) {\n      if (data.result.error) {\n        alert(data.result.error);\n      } else {\n        var html = $(data.result.html);\n        this.refreshImage(data.result);\n      }\n\n      // Last file\n      if (this.uploader.isLastUpload()) {\n        this.progressBar.hideProgressBar();\n        this.$container.removeClass('uploading');\n      }\n    },\n\n    /**\n     * On Upload Failure.\n     */\n    _onUploadFailure: function (event, data) {\n      const response = data.response();\n      let {message, filename} = response?.jqXHR?.responseJSON || {};\n\n      if (!message) {\n        message = filename\n          ? Craft.t('app', 'Upload failed for “{filename}”.', {filename})\n          : Craft.t('app', 'Upload failed.');\n      }\n\n      alert(message);\n      this.progressBar.hideProgressBar();\n      this.$container.removeClass('uploading');\n    },\n  },\n  {\n    defaults: {\n      postParameters: {},\n      uploadAction: '',\n      deleteAction: '',\n      fileInputSelector: '',\n\n      onAfterRefreshImage: $.noop,\n      containerSelector: null,\n\n      uploadButtonSelector: null,\n      deleteButtonSelector: null,\n\n      uploadParamName: 'files',\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Info icon class\n */\nCraft.InfoIcon = Garnish.Base.extend({\n  $container: null,\n  $icon: null,\n  $liveRegion: null,\n  content: null,\n  hud: null,\n\n  init: function (icon) {\n    this.$icon = $(icon);\n    this.$liveRegion = $('<span/>', {\n      role: 'status',\n      class: 'visually-hidden',\n    });\n\n    if (this.$icon.data('infoicon')) {\n      console.warn('Double-instantiating an info icon on an element');\n      this.content = this.$icon.data('infoicon').content;\n      this.$icon.data('infoicon').destroy();\n    } else {\n      this.content = this.$icon.html();\n      this.$icon\n        .html('')\n        .attr({\n          tabindex: 0,\n          role: 'button',\n          type: 'button',\n          'aria-label': Craft.t('app', 'More info'),\n        })\n        .wrap(\n          $('<span/>', {\n            class: 'infoicon-container',\n          })\n        );\n\n      this.$container = this.$icon.parent();\n      this.$container.append(this.$liveRegion);\n    }\n\n    this.$icon.data('infoicon', this);\n\n    if (\n      this.$icon[0].previousSibling &&\n      this.$icon[0].previousSibling.nodeType === Node.TEXT_NODE\n    ) {\n      // Make sure it's in a .nowrap container\n      const $parent = this.$icon.parent();\n      if (!$parent.hasClass('nowrap')) {\n        // Find the last word in the text\n        const m = this.$icon[0].previousSibling.nodeValue.match(/[^\\s\\-]+\\s*$/);\n        if (m) {\n          this.$icon[0].previousSibling.nodeValue =\n            this.$icon[0].previousSibling.nodeValue.substring(0, m.index);\n          $('<span/>', {\n            class: 'nowrap',\n            html: m[0].replace(/\\s+$/, '') + ' ',\n          })\n            .insertAfter(this.$icon[0].previousSibling)\n            .append(this.$icon);\n        }\n      }\n    }\n\n    this.addListener(this.$icon, 'click', (ev) => {\n      ev.preventDefault();\n      ev.stopPropagation();\n      this.showHud();\n    });\n\n    this.addListener(this.$icon, 'keydown', (ev) => {\n      if (\n        !(this.hud && this.hud.showing) &&\n        [Garnish.SPACE_KEY, Garnish.RETURN_KEY].includes(ev.keyCode)\n      ) {\n        ev.preventDefault();\n        ev.stopPropagation();\n        this.showHud();\n      }\n    });\n  },\n\n  showHud: function (ev) {\n    if (!this.hud) {\n      this.hud = new Garnish.HUD(this.$icon, this.content, {\n        hudClass: 'hud info-hud',\n        closeOtherHUDs: false,\n        onShow: () => {\n          Garnish.uiLayerManager.registerShortcut(Garnish.SPACE_KEY, () => {\n            this.hud.hide();\n          });\n\n          this.$liveRegion.html('');\n\n          setTimeout(() => {\n            this.$liveRegion.html(this.content);\n          }, 200);\n        },\n        onHide: () => {\n          this.$liveRegion.html('');\n        },\n      });\n      Craft.initUiElements(this.hud.$body);\n    } else {\n      this.hud.show();\n    }\n  },\n\n  destroy: function () {\n    this.$icon.removeData('infoicon');\n    this.base();\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Light Switch\n */\nCraft.LightSwitch = Garnish.Base.extend(\n  {\n    settings: null,\n    $outerContainer: null,\n    $innerContainer: null,\n    $input: null,\n    small: false,\n    on: false,\n    indeterminate: false,\n    dragger: null,\n\n    dragStartMargin: null,\n\n    init: function (outerContainer, settings) {\n      this.$outerContainer = $(outerContainer);\n\n      // Is this already a lightswitch?\n      if (this.$outerContainer.data('lightswitch')) {\n        console.warn('Double-instantiating a lightswitch on an element');\n        this.$outerContainer.data('lightswitch').destroy();\n      }\n\n      this.$outerContainer.data('lightswitch', this);\n\n      this.small = this.$outerContainer.hasClass('small');\n\n      this.setSettings(settings, Craft.LightSwitch.defaults);\n\n      this.$innerContainer = this.$outerContainer.find(\n        '.lightswitch-container:first'\n      );\n      this.$input = this.$outerContainer.find('input:first');\n\n      // If the input is disabled, go no further\n      if (this.$input.prop('disabled')) {\n        return;\n      }\n\n      this.on = this.$outerContainer.hasClass('on');\n      this.indeterminate = this.$outerContainer.hasClass('indeterminate');\n\n      this.addListener(this.$outerContainer, 'mousedown', '_onMouseDown');\n      this.addListener(this.$outerContainer, 'keydown', '_onKeyDown');\n\n      this.dragger = new Garnish.BaseDrag(this.$outerContainer, {\n        axis: Garnish.X_AXIS,\n        ignoreHandleSelector: null,\n        onDragStart: this._onDragStart.bind(this),\n        onDrag: this._onDrag.bind(this),\n        onDragStop: this._onDragStop.bind(this),\n      });\n\n      // Does the input have on/off labels?\n      let $wrapper = this.$outerContainer.parent(\n        '.lightswitch-inner-container'\n      );\n      if ($wrapper.length) {\n        this.addListener(\n          $wrapper.children('span[data-toggle=\"off\"]'),\n          'click',\n          this.turnOff\n        );\n        this.addListener(\n          $wrapper.children('span[data-toggle=\"on\"]'),\n          'click',\n          this.turnOn\n        );\n      }\n    },\n\n    turnOn: function (muteEvent) {\n      var changed = !this.on;\n\n      this.on = true;\n      this.indeterminate = false;\n\n      this.$outerContainer.addClass('dragging');\n\n      if (Garnish.prefersReducedMotion()) {\n        this.$innerContainer.css('margin-' + Craft.left, 0);\n      } else {\n        var animateCss = {};\n        animateCss['margin-' + Craft.left] = 0;\n        this.$innerContainer\n          .velocity('stop')\n          .velocity(\n            animateCss,\n            Craft.LightSwitch.animationDuration,\n            this._onSettle.bind(this)\n          );\n      }\n\n      this.$input.val(this.settings.value);\n      this.$outerContainer.addClass('on');\n      this.$outerContainer.removeClass('indeterminate');\n      this.$outerContainer.attr('aria-checked', 'true');\n\n      if (changed && muteEvent !== true) {\n        this.onChange();\n      }\n    },\n\n    turnOff: function (muteEvent) {\n      var changed = this.on || this.indeterminate;\n\n      this.on = false;\n      this.indeterminate = false;\n\n      this.$outerContainer.addClass('dragging');\n\n      if (Garnish.prefersReducedMotion()) {\n        this.$innerContainer.css('margin-' + Craft.left, this._getOffMargin());\n      } else {\n        var animateCss = {};\n        animateCss['margin-' + Craft.left] = this._getOffMargin();\n        this.$innerContainer\n          .velocity('stop')\n          .velocity(\n            animateCss,\n            Craft.LightSwitch.animationDuration,\n            this._onSettle.bind(this)\n          );\n      }\n\n      this.$input.val('');\n      this.$outerContainer.removeClass('on');\n      this.$outerContainer.removeClass('indeterminate');\n      this.$outerContainer.attr('aria-checked', 'false');\n\n      if (changed && muteEvent !== true) {\n        this.onChange();\n      }\n    },\n\n    turnIndeterminate: function (muteEvent) {\n      var changed = !this.indeterminate;\n\n      this.on = false;\n      this.indeterminate = true;\n\n      this.$outerContainer.addClass('dragging');\n      var animateCss = {};\n      animateCss['margin-' + Craft.left] = this._getOffMargin() / 2;\n      this.$innerContainer\n        .velocity('stop')\n        .velocity(\n          animateCss,\n          Craft.LightSwitch.animationDuration,\n          this._onSettle.bind(this)\n        );\n\n      this.$input.val(this.settings.indeterminateValue);\n      this.$outerContainer.removeClass('on');\n      this.$outerContainer.addClass('indeterminate');\n      this.$outerContainer.attr('aria-checked', 'mixed');\n\n      if (changed && muteEvent !== true) {\n        this.onChange();\n      }\n    },\n\n    toggle: function () {\n      if (this.indeterminate || !this.on) {\n        this.turnOn();\n      } else {\n        this.turnOff();\n      }\n    },\n\n    onChange: function () {\n      this.trigger('change');\n      this.settings.onChange(this.on);\n      this.$outerContainer.trigger('change');\n    },\n\n    _onMouseDown: function () {\n      this.addListener(Garnish.$doc, 'mouseup', '_onMouseUp');\n    },\n\n    _onMouseUp: function () {\n      this.removeListener(Garnish.$doc, 'mouseup');\n\n      // Was this a click?\n      if (!this.dragger.dragging) {\n        this.toggle();\n      }\n    },\n\n    _onKeyDown: function (event) {\n      switch (event.keyCode) {\n        case Garnish.SPACE_KEY: {\n          this.toggle();\n          event.preventDefault();\n          break;\n        }\n        case Garnish.RIGHT_KEY: {\n          if (Craft.orientation === 'ltr') {\n            this.turnOn();\n          } else {\n            this.turnOff();\n          }\n\n          event.preventDefault();\n          break;\n        }\n        case Garnish.LEFT_KEY: {\n          if (Craft.orientation === 'ltr') {\n            this.turnOff();\n          } else {\n            this.turnOn();\n          }\n\n          event.preventDefault();\n          break;\n        }\n      }\n    },\n\n    _getMargin: function () {\n      return parseInt(this.$innerContainer.css('margin-' + Craft.left));\n    },\n\n    _onDragStart: function () {\n      this.$outerContainer.addClass('dragging');\n      this.dragStartMargin = this._getMargin();\n    },\n\n    _onDrag: function () {\n      var margin;\n\n      if (Craft.orientation === 'ltr') {\n        margin = this.dragStartMargin + this.dragger.mouseDistX;\n      } else {\n        margin = this.dragStartMargin - this.dragger.mouseDistX;\n      }\n\n      if (margin < this._getOffMargin()) {\n        margin = this._getOffMargin();\n      } else if (margin > 0) {\n        margin = 0;\n      }\n\n      this.$innerContainer.css('margin-' + Craft.left, margin);\n    },\n\n    _onDragStop: function () {\n      var margin = this._getMargin();\n\n      if (margin > this._getOffMargin() / 2) {\n        this.turnOn();\n      } else {\n        this.turnOff();\n      }\n    },\n\n    _onSettle: function () {\n      this.$outerContainer.removeClass('dragging');\n    },\n\n    destroy: function () {\n      this.$outerContainer.removeData('lightswitch');\n      this.base();\n      this.dragger.destroy();\n    },\n\n    _getOffMargin: function () {\n      return this.small ? -10 : -12;\n    },\n  },\n  {\n    animationDuration: 100,\n    defaults: {\n      value: '1',\n      indeterminateValue: '-',\n      onChange: $.noop,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Listbox\n */\nCraft.Listbox = Garnish.Base.extend(\n  {\n    $container: null,\n    $options: null,\n    $selectedOption: null,\n    selectedOptionIndex: null,\n\n    init: function (container, settings) {\n      this.$container = $(container);\n      this.setSettings(settings, Craft.Listbox.defaults);\n\n      // Is this already a listbox?\n      if (this.$container.data('listbox')) {\n        console.warn('Double-instantiating a listbox on an element');\n        this.$container.data('listbox').destroy();\n      }\n\n      this.$container.data('listbox', this);\n      // todo: drop [role=option] in Craft 5\n      this.$options = this.$container.find('button,[role=option]');\n\n      // is there already a selected option?\n      // todo: drop [aria-selected=true] & attr normalization in Craft 5\n      this.$selectedOption = this.$options\n        .filter('[aria-pressed=true],[aria-selected=true]')\n        .removeAttr('aria-selected')\n        .attr('aria-pressed', 'true');\n      if (this.$selectedOption.length) {\n        this.selectedOptionIndex = this.$options.index(this.$selectedOption);\n      } else {\n        this.$selectedOption = null;\n      }\n\n      this.addListener(this.$options, 'click', (ev) => {\n        this.select(this.$options.index($(ev.currentTarget)));\n        ev.preventDefault();\n      });\n    },\n\n    select: function (index) {\n      if (\n        index < 0 ||\n        index >= this.$options.length ||\n        index === this.selectedOptionIndex\n      ) {\n        return;\n      }\n\n      if (this.$selectedOption) {\n        this.$selectedOption\n          .removeClass(this.settings.selectedClass)\n          .attr('aria-pressed', 'false');\n      }\n\n      this.$selectedOption = this.$options\n        .eq(index)\n        .addClass(this.settings.selectedClass)\n        .attr('aria-pressed', 'true');\n\n      this.selectedOptionIndex = index;\n\n      this.settings.onChange(this.$selectedOption, index);\n      this.trigger('change', {\n        $selectedOption: this.$selectedOption,\n        selectedOptionIndex: index,\n      });\n    },\n\n    disable: function () {\n      this.base();\n      this.$container.attr('aria-disabled', 'true');\n    },\n\n    enable: function () {\n      this.base();\n      this.$container.removeAttr('aria-disabled');\n    },\n\n    destroy: function () {\n      this.$container.removeData('listbox');\n      this.base();\n    },\n  },\n  {\n    defaults: {\n      selectedClass: 'active',\n      focusClass: 'focus',\n      onChange: $.noop,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Live Preview\n */\nCraft.LivePreview = Garnish.Base.extend(\n  {\n    $extraFields: null,\n    $trigger: null,\n    $shade: null,\n    $editorContainer: null,\n    $editor: null,\n    $dragHandle: null,\n    $previewContainer: null,\n    $iframeContainer: null,\n    $iframe: null,\n    $fieldPlaceholder: null,\n\n    previewUrl: null,\n    token: null,\n    basePostData: null,\n    inPreviewMode: false,\n    fields: null,\n    lastPostData: null,\n    updateIframeInterval: null,\n    loading: false,\n    checkAgain: false,\n\n    dragger: null,\n    dragStartEditorWidth: null,\n\n    _slideInOnIframeLoad: false,\n\n    _scrollX: null,\n    _scrollY: null,\n\n    _editorWidth: null,\n    _editorWidthInPx: null,\n\n    init: function (settings) {\n      this.setSettings(settings, Craft.LivePreview.defaults);\n\n      // Should preview requests use a specific URL?\n      // This won't affect how the request gets routed (the action param will override it),\n      // but it will allow the templates to change behavior based on the request URI.\n      if (this.settings.previewUrl) {\n        this.previewUrl = this.settings.previewUrl;\n      } else {\n        this.previewUrl = Craft.baseSiteUrl.replace(/\\/+$/, '') + '/';\n      }\n\n      // Load the preview over SSL if the current request is\n      if (document.location.protocol === 'https:') {\n        this.previewUrl = this.previewUrl.replace(/^http:/, 'https:');\n      }\n\n      // Set the base post data\n      this.basePostData = $.extend({}, this.settings.previewParams);\n\n      // Find the DOM elements\n      this.$extraFields = $(this.settings.extraFields);\n      this.$trigger = $(this.settings.trigger);\n      this.$fieldPlaceholder = $('<div/>');\n\n      // Set the initial editor width\n      this.editorWidth = Craft.getLocalStorage(\n        'LivePreview.editorWidth',\n        Craft.LivePreview.defaultEditorWidth\n      );\n\n      // Event Listeners\n      this.addListener(this.$trigger, 'activate', 'toggle');\n\n      Craft.cp.on('beforeSaveShortcut', () => {\n        if (this.inPreviewMode) {\n          this.moveFieldsBack();\n        }\n      });\n\n      Craft.Preview.instances.push(this);\n    },\n\n    get editorWidth() {\n      return this._editorWidth;\n    },\n\n    get editorWidthInPx() {\n      return this._editorWidthInPx;\n    },\n\n    set editorWidth(width) {\n      var inPx;\n\n      // Is this getting set in pixels?\n      if (width >= 1) {\n        inPx = width;\n        width /= Garnish.$win.width();\n      } else {\n        inPx = Math.round(width * Garnish.$win.width());\n      }\n\n      // Make sure it's no less than the minimum\n      if (inPx < Craft.LivePreview.minEditorWidthInPx) {\n        inPx = Craft.LivePreview.minEditorWidthInPx;\n        width = inPx / Garnish.$win.width();\n      }\n\n      this._editorWidth = width;\n      this._editorWidthInPx = inPx;\n    },\n\n    toggle: function () {\n      if (this.inPreviewMode) {\n        this.exit();\n      } else {\n        this.enter();\n      }\n    },\n\n    enter: function () {\n      if (this.inPreviewMode) {\n        return;\n      }\n\n      if (!this.token) {\n        this.createToken();\n        return;\n      }\n\n      this.trigger('beforeEnter');\n\n      $(document.activeElement).trigger('blur');\n\n      if (!this.$editor) {\n        this.$shade = $('<div/>', {class: 'modal-shade dark'}).appendTo(\n          Garnish.$bod\n        );\n        this.$previewContainer = $('<div/>', {\n          class: 'lp-preview-container',\n        }).appendTo(Garnish.$bod);\n        this.$iframeContainer = $('<div/>', {\n          class: 'lp-iframe-container',\n        }).appendTo(this.$previewContainer);\n        this.$editorContainer = $('<div/>', {\n          class: 'lp-editor-container',\n        }).appendTo(Garnish.$bod);\n\n        var $editorHeader = $('<header/>', {class: 'flex'}).appendTo(\n          this.$editorContainer\n        );\n        this.$editor = $('<form/>', {class: 'lp-editor'}).appendTo(\n          this.$editorContainer\n        );\n        this.$dragHandle = $('<div/>', {class: 'lp-draghandle'}).appendTo(\n          this.$editorContainer\n        );\n        var $closeBtn = $('<button/>', {\n          type: 'button',\n          class: 'btn',\n          text: Craft.t('app', 'Close Preview'),\n        }).appendTo($editorHeader);\n        $('<div/>', {class: 'flex-grow'}).appendTo($editorHeader);\n        let $saveBtn = $('<button/>', {\n          type: 'button',\n          class: 'btn submit',\n          text: Craft.t('app', 'Save'),\n        }).appendTo($editorHeader);\n\n        this.dragger = new Garnish.BaseDrag(this.$dragHandle, {\n          axis: Garnish.X_AXIS,\n          onDragStart: this._onDragStart.bind(this),\n          onDrag: this._onDrag.bind(this),\n          onDragStop: this._onDragStop.bind(this),\n        });\n\n        this.addListener($closeBtn, 'click', 'exit');\n        this.addListener($saveBtn, 'click', 'save');\n      }\n\n      // Set the sizes\n      this.handleWindowResize();\n      this.addListener(Garnish.$win, 'resize', 'handleWindowResize');\n\n      this.$editorContainer.css(Craft.left, -this.editorWidthInPx + 'px');\n      this.$previewContainer.css(Craft.right, -this.getIframeWidth());\n\n      // Move all the fields into the editor rather than copying them\n      // so any JS that's referencing the elements won't break.\n      this.fields = [];\n      var $fields = $(this.settings.fields);\n\n      for (var i = 0; i < $fields.length; i++) {\n        var $field = $($fields[i]),\n          $clone = this._getClone($field);\n\n        // It's important that the actual field is added to the DOM *after* the clone,\n        // so any radio buttons in the field get deselected from the clone rather than the actual field.\n        this.$fieldPlaceholder.insertAfter($field);\n        $field.detach();\n        this.$fieldPlaceholder.replaceWith($clone);\n        $field.appendTo(this.$editor);\n\n        this.fields.push({\n          $field: $field,\n          $clone: $clone,\n        });\n      }\n\n      if (this.updateIframe()) {\n        this._slideInOnIframeLoad = true;\n      } else {\n        this.slideIn();\n      }\n\n      Craft.ElementThumbLoader.retryAll();\n\n      Garnish.uiLayerManager.addLayer(this.$sidebar);\n      Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n        this.exit();\n      });\n\n      this.inPreviewMode = true;\n      this.trigger('enter');\n    },\n\n    createToken: function () {\n      const data = {previewAction: this.settings.previewAction};\n      Craft.sendActionRequest('POST', 'live-preview/create-token', {data}).then(\n        (response) => {\n          this.token = response.data.token;\n          this.enter();\n        }\n      );\n    },\n\n    save: function () {\n      Craft.cp.submitPrimaryForm();\n    },\n\n    handleWindowResize: function () {\n      // Reset the width so the min width is enforced\n      this.editorWidth = this.editorWidth;\n\n      // Update the editor/iframe sizes\n      this.updateWidths();\n    },\n\n    slideIn: function () {\n      $('html').addClass('noscroll');\n      this.$shade.velocity('fadeIn');\n\n      this.$editorContainer\n        .show()\n        .velocity('stop')\n        .animateLeft(0, 'slow', () => {\n          this.trigger('slideIn');\n          Garnish.$win.trigger('resize');\n        });\n\n      this.$previewContainer\n        .show()\n        .velocity('stop')\n        .animateRight(0, 'slow', () => {\n          this.updateIframeInterval = setInterval(\n            this.updateIframe.bind(this),\n            1000\n          );\n        });\n    },\n\n    exit: function () {\n      if (!this.inPreviewMode) {\n        return;\n      }\n\n      this.trigger('beforeExit');\n\n      $('html').removeClass('noscroll');\n\n      this.removeListener(Garnish.$win, 'resize');\n      Garnish.uiLayerManager.removeLayer();\n\n      if (this.updateIframeInterval) {\n        clearInterval(this.updateIframeInterval);\n      }\n\n      this.moveFieldsBack();\n\n      this.$shade.delay(200).velocity('fadeOut');\n\n      this.$editorContainer\n        .velocity('stop')\n        .animateLeft(-this.editorWidthInPx, 'slow', () => {\n          for (var i = 0; i < this.fields.length; i++) {\n            this.fields[i].$newClone.remove();\n          }\n          this.$editorContainer.hide();\n          this.trigger('slideOut');\n        });\n\n      this.$previewContainer\n        .velocity('stop')\n        .animateRight(-this.getIframeWidth(), 'slow', () => {\n          this.$previewContainer.hide();\n        });\n\n      Craft.ElementThumbLoader.retryAll();\n\n      this.inPreviewMode = false;\n      this.trigger('exit');\n    },\n\n    moveFieldsBack: function () {\n      for (var i = 0; i < this.fields.length; i++) {\n        var field = this.fields[i];\n        field.$newClone = this._getClone(field.$field);\n\n        // It's important that the actual field is added to the DOM *after* the clone,\n        // so any radio buttons in the field get deselected from the clone rather than the actual field.\n        this.$fieldPlaceholder.insertAfter(field.$field);\n        field.$field.detach();\n        this.$fieldPlaceholder.replaceWith(field.$newClone);\n        field.$clone.replaceWith(field.$field);\n      }\n\n      Garnish.$win.trigger('resize');\n    },\n\n    getIframeWidth: function () {\n      return Garnish.$win.width() - this.editorWidthInPx;\n    },\n\n    updateWidths: function () {\n      this.$editorContainer.css('width', this.editorWidthInPx + 'px');\n      this.$previewContainer.width(this.getIframeWidth());\n    },\n\n    updateIframe: function (force) {\n      if (force) {\n        this.lastPostData = null;\n      }\n\n      if (!this.inPreviewMode) {\n        return false;\n      }\n\n      if (this.loading) {\n        this.checkAgain = true;\n        return false;\n      }\n\n      // Has the post data changed?\n      var postData = $.extend(\n        Garnish.getPostData(this.$editor),\n        Garnish.getPostData(this.$extraFields)\n      );\n\n      if (\n        !this.lastPostData ||\n        !Craft.compare(postData, this.lastPostData, false)\n      ) {\n        this.lastPostData = postData;\n        this.loading = true;\n\n        var $doc = this.$iframe\n          ? $(this.$iframe[0].contentWindow.document)\n          : null;\n\n        this._scrollX = $doc ? $doc.scrollLeft() : 0;\n        this._scrollY = $doc ? $doc.scrollTop() : 0;\n\n        $.ajax({\n          url:\n            this.previewUrl +\n            (this.previewUrl.indexOf('?') !== -1 ? '&' : '?') +\n            Craft.tokenParam +\n            '=' +\n            this.token,\n          method: 'POST',\n          data: $.extend({}, postData, this.basePostData),\n          headers: {\n            'X-Craft-Token': this.token,\n          },\n          xhrFields: {\n            withCredentials: true,\n          },\n          crossDomain: true,\n          success: this.handleSuccess.bind(this),\n          error: this.handleError.bind(this),\n        });\n\n        return true;\n      } else {\n        return false;\n      }\n    },\n\n    forceUpdateIframe: function () {\n      return this.updateIframe(true);\n    },\n\n    handleSuccess: function (data) {\n      var html =\n        data +\n        '<script type=\"text/javascript\">window.scrollTo(' +\n        this._scrollX +\n        ', ' +\n        this._scrollY +\n        ');</script>';\n\n      // Create a new iframe\n      var $iframe = $('<iframe class=\"lp-preview\" frameborder=\"0\"/>');\n      if (this.$iframe) {\n        $iframe.insertBefore(this.$iframe);\n      } else {\n        $iframe.appendTo(this.$iframeContainer);\n      }\n\n      this.addListener($iframe, 'load', function () {\n        if (this.$iframe) {\n          this.$iframe.remove();\n        }\n        this.$iframe = $iframe;\n\n        if (this._slideInOnIframeLoad) {\n          this.slideIn();\n          this._slideInOnIframeLoad = false;\n        }\n\n        this.removeListener($iframe, 'load');\n      });\n\n      Garnish.requestAnimationFrame(() => {\n        $iframe[0].contentWindow.document.open();\n        $iframe[0].contentWindow.document.write(html);\n        $iframe[0].contentWindow.document.close();\n        this.onResponse();\n      });\n    },\n\n    handleError: function () {\n      this.onResponse();\n    },\n\n    onResponse: function () {\n      this.loading = false;\n\n      if (this.checkAgain) {\n        this.checkAgain = false;\n        this.updateIframe();\n      }\n    },\n\n    _getClone: function ($field) {\n      var $clone = $field.clone();\n\n      // clone() won't account for input values that have changed since the original HTML set them\n      Garnish.copyInputValues($field, $clone);\n\n      // Remove any id= attributes\n      $clone.attr('id', '');\n      $clone.find('[id]').attr('id', '');\n\n      return $clone;\n    },\n\n    _onDragStart: function () {\n      this.dragStartEditorWidth = this.editorWidthInPx;\n      this.$previewContainer.addClass('dragging');\n    },\n\n    _onDrag: function () {\n      if (Craft.orientation === 'ltr') {\n        this.editorWidth = this.dragStartEditorWidth + this.dragger.mouseDistX;\n      } else {\n        this.editorWidth = this.dragStartEditorWidth - this.dragger.mouseDistX;\n      }\n\n      this.updateWidths();\n    },\n\n    _onDragStop: function () {\n      this.$previewContainer.removeClass('dragging');\n      Craft.setLocalStorage('LivePreview.editorWidth', this.editorWidth);\n    },\n\n    destroy: function () {\n      Craft.Preview.instances = Craft.Preview.instances.filter(\n        (o) => o !== this\n      );\n      this.base();\n    },\n  },\n  {\n    defaultEditorWidth: 0.33,\n    minEditorWidthInPx: 320,\n    instances: [],\n\n    defaults: {\n      trigger: '.livepreviewbtn',\n      fields: null,\n      extraFields: null,\n      previewUrl: null,\n      previewAction: null,\n      previewParams: {},\n    },\n  }\n);\n\nCraft.LivePreview.init = function (settings) {\n  Craft.livePreview = new Craft.LivePreview(settings);\n};\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Password Input\n */\nCraft.PasswordInput = Garnish.Base.extend(\n  {\n    $passwordWrapper: null,\n    $passwordInput: null,\n    $textInput: null,\n    $currentInput: null,\n\n    $showPasswordToggle: null,\n    showingPassword: null,\n\n    init: function (passwordInput, settings) {\n      this.$passwordInput = $(passwordInput);\n      this.$passwordWrapper = this.$passwordInput.parent('.passwordwrapper');\n      this.settings = $.extend({}, Craft.PasswordInput.defaults, settings);\n\n      // Is this already a password input?\n      if (this.$passwordInput.data('passwordInput')) {\n        console.warn('Double-instantiating a password input on an element');\n        this.$passwordInput.data('passwordInput').destroy();\n      }\n\n      this.$passwordInput.data('passwordInput', this);\n\n      this.$showPasswordToggle = $(\n        '<button type=\"button\" class=\"invisible\" />'\n      );\n      this.$showPasswordToggle.addClass('password-toggle');\n      this.$showPasswordToggle.insertAfter(this.$passwordInput);\n\n      this.initInputFocusEvents(this.$passwordInput);\n      this.addListener(this.$showPasswordToggle, 'click', 'onClick');\n      this.hidePassword();\n\n      this.addListener(\n        this.$passwordWrapper.closest('form'),\n        'submit',\n        'hidePassword'\n      );\n    },\n\n    setCurrentInput: function ($input) {\n      if (this.$currentInput) {\n        // Swap the inputs, while preventing the focus animation\n        $input.insertAfter(this.$currentInput);\n        this.$currentInput.detach();\n        $input.trigger('focus');\n\n        // Restore the input value\n        $input.val(this.$currentInput.val());\n      }\n\n      this.$currentInput = $input;\n\n      this.addListener(\n        this.$currentInput,\n        'keypress,keyup,change,blur',\n        'onInputChange'\n      );\n    },\n\n    updateToggleLabel: function (label) {\n      this.$showPasswordToggle.text(label);\n    },\n\n    initInputFocusEvents: function ($input) {\n      this.addListener($input, 'focus', function () {\n        this.$passwordWrapper.addClass('focus');\n      });\n      this.addListener($input, 'blur', function () {\n        this.$passwordWrapper.removeClass('focus');\n      });\n    },\n\n    showPassword: function () {\n      if (this.showingPassword) {\n        return;\n      }\n\n      if (!this.$textInput) {\n        this.$textInput = this.$passwordInput.clone(true);\n        this.$textInput.attr({\n          type: 'text',\n          autocapitalize: 'off',\n        });\n        this.initInputFocusEvents(this.$textInput);\n      }\n\n      this.setCurrentInput(this.$textInput);\n      this.updateToggleLabel(Craft.t('app', 'Hide'));\n      this.showingPassword = true;\n    },\n\n    hidePassword: function () {\n      // showingPassword could be null, which is acceptable\n      if (this.showingPassword === false) {\n        return;\n      }\n\n      this.setCurrentInput(this.$passwordInput);\n      this.updateToggleLabel(Craft.t('app', 'Show'));\n      this.showingPassword = false;\n    },\n\n    togglePassword: function () {\n      if (this.showingPassword) {\n        this.hidePassword();\n      } else {\n        this.showPassword();\n      }\n\n      this.settings.onToggleInput(this.$currentInput);\n    },\n\n    onInputChange: function () {\n      if (this.$currentInput.val()) {\n        this.$showPasswordToggle.removeClass('invisible');\n      } else {\n        this.$showPasswordToggle.addClass('invisible');\n      }\n    },\n\n    onClick: function (ev) {\n      if (this.$currentInput[0].setSelectionRange) {\n        var selectionStart = this.$currentInput[0].selectionStart,\n          selectionEnd = this.$currentInput[0].selectionEnd;\n\n        this.togglePassword();\n        this.$currentInput[0].setSelectionRange(selectionStart, selectionEnd);\n      } else {\n        this.togglePassword();\n      }\n    },\n\n    destroy: function () {\n      this.$passwordInput.removeData('passwordInput');\n      this.base();\n    },\n  },\n  {\n    defaults: {\n      onToggleInput: $.noop,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Preview\n */\nCraft.Preview = Garnish.Base.extend(\n  {\n    elementEditor: null,\n\n    $shade: null,\n    $editorContainer: null,\n    $editor: null,\n    $spinner: null,\n    $statusIcon: null,\n    $dragHandle: null,\n    $previewWrapper: null,\n    $previewContainer: null,\n    $previewSkipLink: null,\n    $bumperLink: null,\n    $notifier: null,\n    $iframeContainer: null,\n    $previewHeader: null,\n    $targetBtn: null,\n    $targetMenu: null,\n    $deviceTypeContainer: null,\n    $orientationBtn: null,\n    $refreshBtn: null,\n    $deviceMask: null,\n    $devicePreviewContainer: null,\n    $iframe: null,\n    iframeLoaded: false,\n    $tempInput: null,\n    $fieldPlaceholder: null,\n\n    isActive: false,\n    isVisible: false,\n    activeTarget: 0,\n\n    animationDuration: 'slow',\n\n    currentDeviceType: 'desktop',\n    deviceOrientation: null,\n    deviceWidth: '',\n    deviceHeight: '',\n    deviceMaskDimensions: {\n      phone: {\n        width: 375,\n        height: 753,\n      },\n      tablet: {\n        width: 768,\n        height: 1110,\n      },\n    },\n\n    draftId: null,\n    url: null,\n    fields: null,\n\n    iframeHeight: null,\n    scrollTop: null,\n\n    dragger: null,\n    dragStartEditorWidth: null,\n\n    _updateIframeProxy: null,\n\n    _editorWidth: null,\n    _editorWidthInPx: null,\n\n    init: function (elementEditor) {\n      this.elementEditor = elementEditor;\n\n      this._updateIframeProxy = this.updateIframe.bind(this);\n\n      this.$tempInput = $('<input/>', {\n        type: 'hidden',\n        name: '__PREVIEW_FIELDS__',\n        value: '1',\n      });\n      this.$fieldPlaceholder = $('<div/>');\n\n      // Set the initial editor width\n      this.editorWidth = Craft.getLocalStorage(\n        'LivePreview.editorWidth',\n        Craft.Preview.defaultEditorWidth\n      );\n\n      Craft.Preview.instances.push(this);\n    },\n\n    get editorWidth() {\n      return this._editorWidth;\n    },\n\n    get editorWidthInPx() {\n      return this._editorWidthInPx;\n    },\n\n    set editorWidth(width) {\n      var inPx;\n\n      // Is this getting set in pixels?\n      if (width >= 1) {\n        inPx = width;\n        width /= Garnish.$win.width();\n      } else {\n        inPx = Math.round(width * Garnish.$win.width());\n      }\n\n      // Make sure it's no less than the minimum\n      if (inPx < Craft.Preview.minEditorWidthInPx) {\n        inPx = Craft.Preview.minEditorWidthInPx;\n        width = inPx / Garnish.$win.width();\n      }\n\n      this._editorWidth = width;\n      this._editorWidthInPx = inPx;\n    },\n\n    open: function () {\n      if (this.isActive) {\n        return;\n      }\n\n      this.isActive = true;\n      this.trigger('beforeOpen');\n\n      $(document.activeElement).trigger('blur');\n\n      if (!this.$editor) {\n        const previewSkipLinkText = Craft.t('app', 'Skip to {title}', {\n          title: Craft.t('app', 'Top of preview'),\n        });\n\n        this.$shade = $('<div/>', {class: 'modal-shade dark'}).appendTo(\n          Garnish.$bod\n        );\n        this.$previewWrapper = $('<div/>', {\n          role: 'dialog',\n          'aria-modal': 'true',\n          'aria-labelledby': 'lp-preview-heading',\n        }).appendTo(Garnish.$bod);\n        this.$modalLabel = $('<h2/>', {\n          id: 'lp-preview-heading',\n          class: 'visually-hidden',\n          html: Craft.t('app', 'Preview'),\n        }).appendTo(this.$previewWrapper);\n        this.$editorContainer = $('<div/>', {\n          class: 'lp-editor-container',\n        }).appendTo(this.$previewWrapper);\n        this.$previewContainer = $('<div/>', {\n          class: 'lp-preview-container',\n          id: 'lp-preview-container',\n        }).appendTo(this.$previewWrapper);\n        this.$notifier = $('<span/>', {\n          class: 'visually-hidden',\n          'aria-live': 'assertive',\n        }).appendTo(this.$previewContainer);\n\n        var $editorHeader = $('<header/>', {class: 'flex'}).appendTo(\n          this.$editorContainer\n        );\n        this.$editor = $('<form/>', {class: 'lp-editor'}).appendTo(\n          this.$editorContainer\n        );\n        this.$dragHandle = $('<div/>', {class: 'lp-draghandle'}).appendTo(\n          this.$editorContainer\n        );\n        var $closeBtn = $('<button/>', {\n          type: 'button',\n          class: 'btn',\n          text: Craft.t('app', 'Close Preview'),\n        }).appendTo($editorHeader);\n        $('<div/>', {class: 'flex-grow'}).appendTo($editorHeader);\n        this.$spinner = $('<div/>', {\n          class: 'spinner hidden',\n          title: Craft.t('app', 'Saving'),\n        }).appendTo($editorHeader);\n        this.$statusIcon = $('<div/>', {class: 'invisible'}).appendTo(\n          $editorHeader\n        );\n        this.$statusMessage = $('<span/>', {\n          class: 'visually-hidden',\n          'aria-live': 'polite',\n        }).appendTo($editorHeader);\n        this.$previewSkipLink = $('<a/>', {\n          class: 'skip-link btn',\n          href: '#lp-preview-container',\n          html: previewSkipLinkText,\n        }).appendTo($editorHeader);\n\n        if (Craft.Pro) {\n          this.$previewHeader = $('<header/>', {\n            class: 'lp-preview-header',\n          }).appendTo(this.$previewContainer);\n\n          // Preview targets\n          if (this.elementEditor.settings.previewTargets.length > 1) {\n            this.$targetBtn = $('<button/>', {\n              type: 'button',\n              class: 'btn menubtn',\n              text: this.elementEditor.settings.previewTargets[0].label,\n            }).appendTo(this.$previewHeader);\n            this.$targetMenu = $('<div/>', {\n              class: 'menu lp-target-menu',\n            }).insertAfter(this.$targetBtn);\n            const $ul = $('<ul/>', {class: 'padded'}).appendTo(\n              this.$targetMenu\n            );\n            let $li, $a;\n            for (\n              let i = 0;\n              i < this.elementEditor.settings.previewTargets.length;\n              i++\n            ) {\n              $li = $('<li/>').appendTo($ul);\n              $a = $('<a/>', {\n                data: {target: i},\n                text: this.elementEditor.settings.previewTargets[i].label,\n                class: i === 0 ? 'sel' : null,\n              }).appendTo($li);\n            }\n            new Garnish.MenuBtn(this.$targetBtn, {\n              onOptionSelect: (option) => {\n                this.switchTarget($(option).data('target'));\n              },\n            });\n\n            $('<div class=\"flex-grow\"/>').appendTo(this.$previewHeader);\n          }\n\n          this._buildDeviceTypeFieldset();\n\n          $('<div class=\"flex-grow\"/>').appendTo(this.$previewHeader);\n          const $buttonContainer = $('<div class=\"buttons\"/>').appendTo(\n            this.$previewHeader\n          );\n\n          // Orientation toggle\n          this.$orientationBtn = $('<button/>', {\n            type: 'button',\n            class: 'btn disabled',\n            'data-icon': 'rotate',\n            'aria-disabled': 'true',\n            text: Craft.t('app', 'Rotate'),\n            'aria-label': Craft.t('app', 'Rotate'),\n          }).appendTo($buttonContainer);\n          this.addListener(this.$orientationBtn, 'click', 'switchOrientation');\n\n          // Refresh button\n          this.$refreshBtn = $('<button/>', {\n            type: 'button',\n            class: 'btn',\n            text: Craft.t('app', 'Refresh'),\n            'data-icon': 'refresh',\n          }).appendTo($buttonContainer);\n          this.addListener(this.$refreshBtn, 'click', () => {\n            this.updateIframe(false, true);\n          });\n\n          // Get the last stored orientation\n          this.deviceOrientation = Craft.getLocalStorage(\n            'LivePreview.orientation'\n          );\n        }\n\n        this.$iframeContainer = $('<div/>', {\n          class: 'lp-iframe-container',\n        }).appendTo(this.$previewContainer);\n        this.$devicePreviewContainer = $('<div/>', {\n          class: 'lp-device-preview-container',\n        }).appendTo(this.$iframeContainer);\n        this.$deviceMask = $('<div/>', {\n          class: 'lp-device-mask',\n        }).appendTo(this.$iframeContainer);\n\n        /* Prevents focus trap bug caused by iframe as last element */\n        this.$bumperLink = $('<a/>', {\n          class: 'skip-link btn lp-preview-container__bumper-link',\n          html: previewSkipLinkText,\n          href: '#lp-preview-container',\n        });\n        this.$bumperLink.appendTo(this.$previewContainer);\n\n        this.dragger = new Garnish.BaseDrag(this.$dragHandle, {\n          axis: Garnish.X_AXIS,\n          onDragStart: this._onDragStart.bind(this),\n          onDrag: this._onDrag.bind(this),\n          onDragStop: this._onDragStop.bind(this),\n        });\n\n        this.addListener($closeBtn, 'click', 'close');\n        this.addListener(this.$statusIcon, 'click', () => {\n          this.elementEditor.showStatusHud(this.$statusIcon);\n        });\n      }\n\n      // Set the sizes\n      this.handleWindowResize();\n      this.addListener(Garnish.$win, 'resize', 'handleWindowResize');\n\n      this.$editorContainer.css(Craft.left, -this.editorWidthInPx + 'px');\n      this.$previewContainer.css(Craft.right, -this.getIframeWidth());\n\n      // Find the fields, excluding nested fields\n      this.fields = [];\n      var $fields = $('#content .field').not($('#content .field .field'));\n\n      if ($fields.length) {\n        // Insert our temporary input before the first field so we know where to swap in the serialized form values\n        this.$tempInput.insertBefore($fields.get(0));\n\n        // Move all the fields into the editor rather than copying them\n        // so any JS that's referencing the elements won't break.\n        for (let i = 0; i < $fields.length; i++) {\n          let $field = $($fields[i]),\n            $clone = this._getClone($field);\n\n          // It's important that the actual field is added to the DOM *after* the clone,\n          // so any radio buttons in the field get deselected from the clone rather than the actual field.\n          this.$fieldPlaceholder.insertAfter($field);\n          $field.detach();\n          this.$fieldPlaceholder.replaceWith($clone);\n          $field.appendTo(this.$editor);\n\n          this.fields.push({\n            $field: $field,\n            $clone: $clone,\n          });\n        }\n      }\n\n      this.updateIframe();\n\n      this.elementEditor.on('update', this._updateIframeProxy);\n\n      Craft.ElementThumbLoader.retryAll();\n\n      this.trigger('open');\n    },\n\n    _getDeviceTypeTranslation: function (type) {\n      let translation;\n      switch (type) {\n        case 'phone':\n          translation = Craft.t('app', 'Mobile');\n          break;\n        case 'tablet':\n          translation = Craft.t('app', 'Tablet');\n          break;\n        default:\n          translation = Craft.t('app', 'Desktop');\n          break;\n      }\n      return translation;\n    },\n\n    _getDeviceOrientationTranslation: function (orientation) {\n      return orientation === 'portrait'\n        ? Craft.t('app', 'Portrait')\n        : Craft.t('app', 'Landscape');\n    },\n\n    _buildDeviceTypeFieldset: function () {\n      // Device type buttons\n      this.$deviceTypeContainer = $('<section/>', {\n        class: 'btngroup lp-device-type',\n        'aria-label': Craft.t('app', 'Device type'),\n      }).appendTo(this.$previewHeader);\n      $('<button/>', {\n        type: 'button',\n        class: 'btn lp-device-type-btn--desktop active',\n        title: Craft.t('app', 'Desktop'),\n        'aria-label': Craft.t('app', 'Desktop'),\n        'aria-pressed': 'true',\n        data: {\n          width: '',\n          height: '',\n          deviceType: 'desktop',\n        },\n      }).appendTo(this.$deviceTypeContainer);\n      $('<button/>', {\n        type: 'button',\n        class: 'btn lp-device-type-btn--tablet',\n        title: Craft.t('app', 'Tablet'),\n        'aria-label': Craft.t('app', 'Tablet'),\n        'aria-pressed': 'false',\n        data: {\n          width: 768,\n          height: 1024,\n          deviceType: 'tablet',\n        },\n      }).appendTo(this.$deviceTypeContainer);\n      $('<button/>', {\n        type: 'button',\n        class: 'btn lp-device-type-btn--phone',\n        title: Craft.t('app', 'Mobile'),\n        'aria-label': Craft.t('app', 'Mobile'),\n        'aria-pressed': 'false',\n        data: {\n          width: 375,\n          height: 667,\n          deviceType: 'phone',\n        },\n      }).appendTo(this.$deviceTypeContainer);\n\n      // Add functionality\n      this.deviceBtnGroup = new Craft.Listbox(this.$deviceTypeContainer, {\n        onChange: ($selectedOption) => {\n          this.switchDeviceType($selectedOption);\n        },\n      });\n    },\n\n    _activeTarget: function () {\n      return this.elementEditor.settings.previewTargets[this.activeTarget];\n    },\n\n    /**\n     * @returns {boolean}\n     * @private\n     */\n    _autoRefresh: function () {\n      const target = this._activeTarget();\n      return typeof typeof target.refresh === 'undefined' || !!target.refresh;\n    },\n\n    switchTarget: function (i) {\n      this.activeTarget = i;\n      this.$targetBtn.text(this.elementEditor.settings.previewTargets[i].label);\n      this.$targetMenu.find('a.sel').removeClass('sel');\n      this.$targetMenu.find('a').eq(i).addClass('sel');\n      this.updateIframe(true);\n      this.trigger('switchTarget', {\n        previewTarget: this.elementEditor.settings.previewTargets[i],\n      });\n    },\n\n    handleWindowResize: function () {\n      // Reset the width so the min width is enforced\n      this.editorWidth = this.editorWidth;\n\n      // Update the editor/iframe sizes\n      this.updateWidths();\n    },\n\n    slideIn: function () {\n      if (!this.isActive || this.isVisible) {\n        return;\n      }\n\n      $('html').addClass('noscroll');\n      this.$shade.velocity('fadeIn');\n\n      this.$editorContainer\n        .show()\n        .velocity('stop')\n        .animateLeft(\n          0,\n          Garnish.getUserPreferredAnimationDuration(this.animationDuration),\n          () => {\n            this.trigger('slideIn');\n            Garnish.$win.trigger('resize');\n          }\n        );\n\n      this.$previewContainer\n        .show()\n        .velocity('stop')\n        .animateRight(\n          0,\n          Garnish.getUserPreferredAnimationDuration(this.animationDuration)\n        );\n\n      this.isVisible = true;\n\n      Garnish.uiLayerManager.addLayer(this.$previewWrapper);\n      Garnish.hideModalBackgroundLayers();\n      Craft.setFocusWithin(this.$previewWrapper);\n      Craft.trapFocusWithin(this.$previewWrapper);\n      Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n        this.close();\n      });\n    },\n\n    close: function () {\n      if (!this.isActive || !this.isVisible) {\n        return;\n      }\n\n      this.trigger('beforeClose');\n\n      $('html').removeClass('noscroll');\n\n      this.removeListener(Garnish.$win, 'resize');\n      Garnish.uiLayerManager.removeLayer();\n      Garnish.resetModalBackgroundLayerVisibility();\n\n      // Remove our temporary input and move the preview fields back into place\n      this.$tempInput.detach();\n      this.moveFieldsBack();\n\n      // Delay shade fade-out when animation is present\n      if (Garnish.prefersReducedMotion()) {\n        this.$shade.velocity('fadeOut');\n      } else {\n        this.$shade.delay(200).velocity('fadeOut');\n      }\n\n      this.$editorContainer\n        .velocity('stop')\n        .animateLeft(\n          -this.editorWidthInPx,\n          Garnish.getUserPreferredAnimationDuration(this.animationDuration),\n          () => {\n            for (var i = 0; i < this.fields.length; i++) {\n              this.fields[i].$newClone.remove();\n            }\n            this.$editorContainer.hide();\n            this.trigger('slideOut');\n          }\n        );\n\n      this.$previewContainer\n        .velocity('stop')\n        .animateRight(\n          -this.getIframeWidth(),\n          Garnish.getUserPreferredAnimationDuration(this.animationDuration),\n          () => {\n            this.$iframeContainer.removeClass('lp-iframe-container--rotating');\n            this.$previewContainer.hide();\n          }\n        );\n\n      this.elementEditor.off('update', this._updateIframeProxy);\n\n      Craft.ElementThumbLoader.retryAll();\n\n      if (this.elementEditor.$previewBtn) {\n        this.elementEditor.$previewBtn.focus();\n      }\n\n      this.isActive = false;\n      this.isVisible = false;\n      this.trigger('close');\n    },\n\n    moveFieldsBack: function () {\n      for (var i = 0; i < this.fields.length; i++) {\n        var field = this.fields[i];\n        field.$newClone = this._getClone(field.$field);\n\n        // It's important that the actual field is added to the DOM *after* the clone,\n        // so any radio buttons in the field get deselected from the clone rather than the actual field.\n        this.$fieldPlaceholder.insertAfter(field.$field);\n        field.$field.detach();\n        this.$fieldPlaceholder.replaceWith(field.$newClone);\n        field.$clone.replaceWith(field.$field);\n      }\n\n      Garnish.$win.trigger('resize');\n      Garnish.$doc.trigger('scroll');\n    },\n\n    getIframeWidth: function () {\n      return Garnish.$win.width() - this.editorWidthInPx;\n    },\n\n    updateWidths: function () {\n      this.$editorContainer.css('width', this.editorWidthInPx + 'px');\n      this.$previewContainer.width(this.getIframeWidth());\n      if (this._devicePreviewIsActive()) {\n        this.updateDevicePreview();\n      }\n    },\n\n    _useIframeResizer: function () {\n      return Craft.previewIframeResizerOptions !== false;\n    },\n\n    /**\n     * @param {boolean} [resetScroll=false]\n     * @param {boolean} [refresh]\n     */\n    updateIframe: function (resetScroll, refresh) {\n      if (!this.isActive) {\n        return false;\n      }\n\n      // Ignore non-boolean resetScroll values\n      resetScroll = resetScroll === true;\n\n      // If the draft ID has changed or there's no iframe, we definitely need to refresh\n      if (\n        this.draftId !== (this.draftId = this.elementEditor.settings.draftId) ||\n        !this.$iframe\n      ) {\n        refresh = true;\n      }\n\n      const target = this._activeTarget();\n      if (typeof refresh === 'undefined') {\n        refresh = resetScroll || this._autoRefresh();\n      }\n\n      this.trigger('beforeUpdateIframe', {\n        previewTarget: target,\n        resetScroll: resetScroll,\n        refresh: refresh,\n      });\n\n      // If this is an existing preview target, make sure it wants to be refreshed automatically\n      if (!refresh) {\n        this.slideIn();\n        return;\n      }\n\n      this.elementEditor\n        .getTokenizedPreviewUrl(target.url, 'x-craft-live-preview')\n        .then((url) => {\n          // Maintain the current scroll position?\n          let sameHost;\n          if (resetScroll) {\n            this.scrollTop = null;\n          } else if (this.iframeLoaded && this.$iframe) {\n            if (this._useIframeResizer()) {\n              this.iframeHeight = this.$iframe.height();\n              this.scrollTop = this.$iframeContainer.scrollTop();\n            } else {\n              sameHost = Craft.isSameHost(url);\n              if (sameHost && this.$iframe[0].contentWindow) {\n                this.scrollTop = $(\n                  this.$iframe[0].contentWindow.document\n                ).scrollTop();\n              }\n            }\n          }\n\n          this.iframeLoaded = false;\n\n          var $iframe = $('<iframe/>', {\n            class: 'lp-preview',\n            frameborder: 0,\n            src: url,\n            title: Craft.t('app', 'Preview'),\n          });\n\n          if (this.$iframe) {\n            this.$iframe.replaceWith($iframe);\n          } else {\n            $iframe.appendTo(this.$devicePreviewContainer);\n          }\n\n          // Keep the iframe height consistent with its content\n          if (this._useIframeResizer()) {\n            if (!resetScroll && this.iframeHeight !== null) {\n              $iframe.height(this.iframeHeight);\n              this.$iframeContainer.scrollTop(this.scrollTop);\n            }\n\n            iFrameResize(\n              $.extend(\n                {\n                  checkOrigin: false,\n                  // Allow iframe scrolling until we've successfully initialized the resizer\n                  scrolling: true,\n                  onInit: (iframe) => {\n                    this.iframeLoaded = true;\n                    this.iframeHeight = null;\n                    this.scrollTop = null;\n                    iframe.scrolling = 'no';\n                  },\n                },\n                Craft.previewIframeResizerOptions || {}\n              ),\n              $iframe[0]\n            );\n          } else {\n            $iframe.on('load', () => {\n              this.iframeLoaded = true;\n              if (!resetScroll && sameHost && this.scrollTop !== null) {\n                $($iframe[0].contentWindow.document).scrollTop(this.scrollTop);\n              }\n            });\n          }\n\n          this.url = url;\n          this.$iframe = $iframe;\n\n          if (this._devicePreviewIsActive()) {\n            this.updateDevicePreview();\n          }\n\n          this.trigger('afterUpdateIframe', {\n            previewTarget:\n              this.elementEditor.settings.previewTargets[this.activeTarget],\n            $iframe: this.$iframe,\n          });\n\n          this.slideIn();\n        });\n    },\n\n    _devicePreviewIsActive: function () {\n      return this.currentDeviceType !== 'desktop';\n    },\n\n    _updateNotifier: function () {\n      this.$notifier.html = '';\n\n      const translation =\n        this.currentDeviceType === 'desktop'\n          ? 'Previewing {type} device'\n          : 'Previewing {type} device in {orientation}';\n      let params = {\n        type: this._getDeviceTypeTranslation(this.currentDeviceType),\n      };\n\n      if (this.currentDeviceType !== 'desktop') {\n        params = {\n          ...params,\n          ...{\n            orientation: this._getDeviceOrientationTranslation(\n              this.deviceOrientation\n            ),\n          },\n        };\n      }\n\n      const message = Craft.t('app', translation, params);\n\n      setTimeout(() => {\n        this.$notifier.text(message);\n      }, 200);\n    },\n\n    switchDeviceType: function ($option) {\n      this.$iframeContainer.removeClass('lp-iframe-container--rotating');\n\n      const newDeviceType = $option.data('deviceType');\n      // Bail if we’re just smashing the same button\n      if (newDeviceType === this.currentDeviceType) {\n        return false;\n      }\n\n      // Store new device type data\n      this.currentDeviceType = newDeviceType;\n      this.deviceWidth = $option.data('width');\n      this.deviceHeight = $option.data('height');\n\n      if (this.currentDeviceType === 'desktop') {\n        // Disable the orientation button\n        this.$orientationBtn.addClass('disabled').attr('aria-disabled', 'true');\n\n        this.$iframeContainer.removeClass(\n          'lp-iframe-container--has-device-preview'\n        );\n      } else {\n        // Enable the orientation button\n        this.$orientationBtn\n          .removeClass('disabled')\n          .removeAttr('aria-disabled');\n\n        this.$iframeContainer.addClass(\n          'lp-iframe-container--has-device-preview'\n        );\n      }\n\n      // Add the tablet class if needed\n      if (this.currentDeviceType === 'tablet') {\n        this.$iframeContainer.addClass('lp-iframe-container--tablet');\n      } else {\n        this.$iframeContainer.removeClass('lp-iframe-container--tablet');\n      }\n\n      this._updateNotifier();\n\n      if (this.currentDeviceType !== 'desktop') {\n        this.updateDevicePreview();\n      }\n    },\n\n    switchOrientation: function () {\n      if (!this._devicePreviewIsActive()) {\n        return false;\n      }\n\n      // Switch to whichever orientation is currently not stored\n      if (!this.deviceOrientation || this.deviceOrientation === 'portrait') {\n        this.deviceOrientation = 'landscape';\n      } else {\n        this.deviceOrientation = 'portrait';\n      }\n\n      // Store the new one\n      Craft.setLocalStorage('LivePreview.orientation', this.deviceOrientation);\n\n      // Allow the animation to take place\n      this.$iframeContainer.addClass('lp-iframe-container--rotating');\n\n      // Update the device preview\n      this.updateDevicePreview();\n      this._updateNotifier();\n\n      setTimeout(() => {\n        this.$iframeContainer.removeClass('lp-iframe-container--rotating');\n      }, 300);\n    },\n\n    updateDevicePreview: function () {\n      // Figure out the best zoom\n      let hZoom = 1;\n      let wZoom = 1;\n      let zoom = 1;\n      let previewHeight = this.$previewContainer.height() - 50 - 48; // 50px for the header bar and 24px clearance\n      let previewWidth = this.$previewContainer.width() - 48;\n      let maskHeight = this.deviceMaskDimensions[this.currentDeviceType].height;\n      let maskWidth = this.deviceMaskDimensions[this.currentDeviceType].width;\n\n      if (this.deviceOrientation === 'landscape') {\n        if (previewWidth < maskHeight) {\n          hZoom = previewWidth / maskHeight;\n        }\n        if (previewHeight < maskWidth) {\n          wZoom = previewHeight / maskWidth;\n        }\n      } else {\n        if (previewHeight < maskHeight) {\n          hZoom = previewHeight / maskHeight;\n        }\n        if (previewWidth < maskWidth) {\n          wZoom = previewWidth / maskWidth;\n        }\n      }\n\n      zoom = hZoom;\n      if (wZoom < hZoom) {\n        zoom = wZoom;\n      }\n\n      // Figure out the css values\n      const translate = -(100 / zoom / 2);\n      const rotationDeg =\n        this.deviceOrientation === 'landscape' ? '-90deg' : '0deg';\n\n      // Apply first to the device mask\n      this.$deviceMask.css({\n        width: this.deviceMaskDimensions[this.currentDeviceType].width + 'px',\n        height: this.deviceMaskDimensions[this.currentDeviceType].height + 'px',\n        transform:\n          'scale(' +\n          zoom +\n          ') translate(' +\n          translate +\n          '%, ' +\n          translate +\n          '%) rotate(' +\n          rotationDeg +\n          ')',\n      });\n\n      if (this.deviceOrientation === 'landscape') {\n        this.$devicePreviewContainer.css({\n          width: this.deviceHeight + 'px',\n          height: this.deviceWidth + 'px',\n          transform:\n            'scale(' +\n            zoom +\n            ') translate(' +\n            translate +\n            '%, ' +\n            translate +\n            '%)',\n          marginTop: 0,\n          marginLeft: '-' + 12 * zoom + 'px',\n        });\n      } else {\n        this.$devicePreviewContainer.css({\n          width: this.deviceWidth + 'px',\n          height: this.deviceHeight + 'px',\n          transform:\n            'scale(' +\n            zoom +\n            ') translate(' +\n            translate +\n            '%, ' +\n            translate +\n            '%)',\n          marginTop: '-' + 12 * zoom + 'px',\n          marginLeft: 0,\n        });\n      }\n    },\n\n    _getClone: function ($field) {\n      var $clone = $field.clone();\n\n      // clone() won't account for input values that have changed since the original HTML set them\n      Garnish.copyInputValues($field, $clone);\n\n      // Remove any id= attributes\n      $clone.attr('id', '');\n      $clone.find('[id]').attr('id', '');\n\n      // Disable anything with a name attribute\n      $clone.find('[name]').prop('disabled', true);\n\n      return $clone;\n    },\n\n    _onDragStart: function () {\n      this.dragStartEditorWidth = this.editorWidthInPx;\n      this.$previewContainer.addClass('dragging');\n    },\n\n    _onDrag: function () {\n      if (Craft.orientation === 'ltr') {\n        this.editorWidth = this.dragStartEditorWidth + this.dragger.mouseDistX;\n      } else {\n        this.editorWidth = this.dragStartEditorWidth - this.dragger.mouseDistX;\n      }\n\n      this.updateWidths();\n    },\n\n    _onDragStop: function () {\n      this.$previewContainer.removeClass('dragging');\n      Craft.setLocalStorage('LivePreview.editorWidth', this.editorWidth);\n    },\n\n    destroy: function () {\n      Craft.Preview.instances = Craft.Preview.instances.filter(\n        (o) => o !== this\n      );\n      this.base();\n    },\n  },\n  {\n    defaultEditorWidth: 0.33,\n    minEditorWidthInPx: 320,\n    instances: [],\n\n    refresh: function () {\n      for (preview of Craft.Preview.instances) {\n        preview.updateIframe();\n      }\n      for (preview of Craft.LivePreview.instances) {\n        preview.forceUpdateIframe();\n      }\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Preview File Modal\n */\nCraft.PreviewFileModal = Garnish.Modal.extend(\n  {\n    assetId: null,\n    $spinner: null,\n    $triggerElement: null,\n    $bumperButtonStart: null,\n    $bumperButtonEnd: null,\n    elementSelect: null,\n    type: null,\n    loaded: null,\n    requestId: 0,\n\n    /**\n     * Initialize the preview file modal.\n     * @returns {*|void}\n     */\n    init: function (assetId, elementSelect, settings) {\n      settings = $.extend(this.defaultSettings, settings);\n      this.$triggerElement = Garnish.getFocusedElement();\n\n      settings.onHide = this._onHide.bind(this);\n\n      if (Craft.PreviewFileModal.openInstance) {\n        var instance = Craft.PreviewFileModal.openInstance;\n\n        if (instance.assetId !== assetId) {\n          instance.loadAsset(\n            assetId,\n            settings.startingWidth,\n            settings.startingHeight\n          );\n          instance.elementSelect = elementSelect;\n        }\n\n        return this.destroy();\n      }\n\n      Craft.PreviewFileModal.openInstance = this;\n      this.elementSelect = elementSelect;\n\n      this.$container = $('<div class=\"modal previewmodal loading\"/>').appendTo(\n        Garnish.$bod\n      );\n\n      this.base(\n        this.$container,\n        $.extend(\n          {\n            resizable: true,\n          },\n          settings\n        )\n      );\n\n      // Cut the flicker, just show the nice person the preview.\n      if (this.$container) {\n        this.$container.velocity('stop');\n        this.$container.show().css('opacity', 1);\n\n        this.$shade.velocity('stop');\n        this.$shade.show().css('opacity', 1);\n\n        Garnish.setFocusWithin(this.$container);\n      }\n\n      // Add bumper elements to maintain focus trap\n      this.$bumperButtonStart = Craft.ui.createButton({\n        html: Craft.t('app', 'Close Preview'),\n        class: 'skip-link',\n      });\n\n      this.addListener(this.$bumperButtonStart, 'click', () => {\n        this.hide();\n      });\n      this.$bumperButtonEnd = this.$bumperButtonStart.clone(true);\n\n      this.loadAsset(assetId, settings.startingWidth, settings.startingHeight);\n    },\n\n    /**\n     * When hiding, remove all traces and focus last focused element.\n     * @private\n     */\n    _onHide: function () {\n      Craft.PreviewFileModal.openInstance = null;\n      if (this.elementSelect) {\n        this.elementSelect.focusItem(this.elementSelect.$focusedItem);\n      } else if (this.$triggerElement && this.$triggerElement.length) {\n        this.$triggerElement.trigger('focus');\n      }\n\n      this.$shade.remove();\n\n      return this.destroy();\n    },\n\n    _addBumperButtons: function () {\n      this.$container\n        .prepend(this.$bumperButtonStart)\n        .append(this.$bumperButtonEnd);\n    },\n\n    _addModalName: function () {\n      const headingId = 'preview-heading';\n\n      this.$container\n        .prepend(\n          $('h1')\n            .attr({\n              class: 'visually-hidden',\n              id: headingId,\n            })\n            .text(Craft.t('app', 'Preview file'))\n        )\n        .attr('aria-labelledby', headingId);\n    },\n\n    /**\n     * Disappear immediately forever.\n     * @returns {boolean}\n     */\n    selfDestruct: function () {\n      var instance = Craft.PreviewFileModal.openInstance;\n\n      instance.hide();\n      instance.$shade.remove();\n      instance.destroy();\n\n      Craft.PreviewFileModal.openInstance = null;\n      Craft.focalPoint.destruct();\n      Craft.focalPoint = null;\n\n      return true;\n    },\n\n    /**\n     * Load an asset, using starting width and height, if applicable\n     * @param {number} assetId\n     * @param {number} [startingWidth]\n     * @param {number} [startingHeight]\n     */\n    loadAsset: function (assetId, startingWidth, startingHeight) {\n      this.assetId = assetId;\n\n      this.$container.empty();\n      this.loaded = false;\n\n      this.desiredHeight = null;\n      this.desiredWidth = null;\n\n      var containerHeight = Garnish.$win.height() * 0.66;\n      var containerWidth = Math.min(\n        (containerHeight / 3) * 4,\n        Garnish.$win.width() - this.settings.minGutter * 2\n      );\n      containerHeight = (containerWidth / 4) * 3;\n\n      if (startingWidth && startingHeight) {\n        var ratio = startingWidth / startingHeight;\n        containerWidth = Math.min(\n          startingWidth,\n          Garnish.$win.width() - this.settings.minGutter * 2\n        );\n        containerHeight = Math.min(\n          containerWidth / ratio,\n          Garnish.$win.height() - this.settings.minGutter * 2\n        );\n        containerWidth = containerHeight * ratio;\n\n        // This might actually have put width over the viewport limits, so doublecheck\n        if (\n          containerWidth >\n          Math.min(\n            startingWidth,\n            Garnish.$win.width() - this.settings.minGutter * 2\n          )\n        ) {\n          containerWidth = Math.min(\n            startingWidth,\n            Garnish.$win.width() - this.settings.minGutter * 2\n          );\n          containerHeight = containerWidth / ratio;\n        }\n      }\n\n      this._resizeContainer(containerWidth, containerHeight);\n\n      this.$spinner = $('<div class=\"spinner centeralign\"></div>').appendTo(\n        this.$container\n      );\n      var top =\n          this.$container.height() / 2 - this.$spinner.height() / 2 + 'px',\n        left = this.$container.width() / 2 - this.$spinner.width() / 2 + 'px';\n\n      this.$spinner.css({left: left, top: top, position: 'absolute'});\n      this.requestId++;\n\n      let data = {assetId: assetId, requestId: this.requestId};\n      let onResponse = () => {\n        this.$container.removeClass('loading');\n        this.$spinner.remove();\n        this.loaded = true;\n      };\n      Craft.sendActionRequest('POST', 'assets/preview-file', {data})\n        .then((response) => {\n          onResponse();\n\n          if (response.data.requestId != this.requestId) {\n            return;\n          }\n\n          if (!response.data.previewHtml) {\n            this.$container.addClass('zilch');\n            this.$container.append(\n              $('<p/>', {text: Craft.t('app', 'No preview available.')})\n            );\n            this._addBumperButtons();\n            return;\n          }\n\n          this.$container.removeClass('zilch');\n          this.$container.attr('data-asset-id', this.assetId);\n          this.$container.append(response.data.previewHtml);\n          this._addBumperButtons();\n          this._addModalName();\n          Craft.appendHeadHtml(response.data.headHtml);\n          Craft.appendBodyHtml(response.data.bodyHtml);\n        })\n        .catch(({response}) => {\n          onResponse();\n          alert(response.data.message);\n          this.hide();\n        });\n    },\n\n    /**\n     * Resize the container to specified dimensions\n     * @param {number} containerWidth\n     * @param {number} containerHeight\n     * @private\n     */\n    _resizeContainer: function (containerWidth, containerHeight) {\n      this.$container.css({\n        width: containerWidth,\n        'min-width': containerWidth,\n        'max-width': containerWidth,\n        height: containerHeight,\n        'min-height': containerHeight,\n        'max-height': containerHeight,\n        top: (Garnish.$win.height() - containerHeight) / 2,\n        left: (Garnish.$win.width() - containerWidth) / 2,\n      });\n    },\n  },\n  {\n    defaultSettings: {\n      startingWidth: null,\n      startingHeight: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * File Manager.\n */\nCraft.ProgressBar = Garnish.Base.extend({\n  $progressBar: null,\n  $innerProgressBar: null,\n  $progressBarStatus: null,\n\n  _itemCount: 0,\n  _processedItemCount: 0,\n  _displaySteps: false,\n\n  init: function ($element, displaySteps) {\n    if (displaySteps) {\n      this._displaySteps = true;\n    }\n\n    this.$progressBar = $('<div class=\"progressbar pending hidden\"/>').appendTo(\n      $element\n    );\n    this.$innerProgressBar = $('<div class=\"progressbar-inner\"/>').appendTo(\n      this.$progressBar\n    );\n    this.$progressBarStatus = $(\n      '<div class=\"progressbar-status hidden\" />'\n    ).insertAfter(this.$progressBar);\n\n    this.resetProgressBar();\n  },\n\n  /**\n   * Reset the progress bar\n   */\n  resetProgressBar: function () {\n    // Since setting the progress percentage implies that there is progress to be shown\n    // It removes the pending class - we must add it back.\n    this.setProgressPercentage(100);\n    this.$progressBar.addClass('pending');\n\n    // Reset all the counters\n    this.setItemCount(1);\n    this.setProcessedItemCount(0);\n    this.$progressBarStatus.html('');\n\n    if (this._displaySteps) {\n      this.$progressBar.addClass('has-status');\n    }\n  },\n\n  /**\n   * Fade to invisible, hide it using a class and reset opacity to visible\n   */\n  hideProgressBar: function () {\n    this.$progressBar.fadeTo('fast', 0.01, () => {\n      this.$progressBar.addClass('hidden').fadeTo(1, 1, $.noop);\n    });\n    this.$progressBarStatus.fadeTo('fast', 0.01, () => {\n      this.$progressBarStatus.addClass('hidden').fadeTo(1, 1, $.noop);\n    });\n  },\n\n  showProgressBar: function () {\n    this.$progressBar.removeClass('hidden');\n    this.$progressBarStatus.removeClass('hidden');\n  },\n\n  setItemCount: function (count) {\n    this._itemCount = count;\n  },\n\n  incrementItemCount: function (count) {\n    this._itemCount += count;\n  },\n\n  setProcessedItemCount: function (count) {\n    this._processedItemCount = count;\n  },\n\n  incrementProcessedItemCount: function (count) {\n    this._processedItemCount += count;\n  },\n\n  updateProgressBar: function () {\n    // Only fools would allow accidental division by zero.\n    this._itemCount = Math.max(this._itemCount, 1);\n\n    var width = Math.min(\n      100,\n      Math.round((100 * this._processedItemCount) / this._itemCount)\n    );\n\n    this.setProgressPercentage(width);\n\n    if (this._displaySteps) {\n      this.$progressBarStatus.html(\n        this._processedItemCount + ' / ' + this._itemCount\n      );\n    }\n  },\n\n  setProgressPercentage: function (percentage, animate) {\n    if (percentage === 0) {\n      this.$progressBar.addClass('pending');\n    } else {\n      this.$progressBar.removeClass('pending');\n\n      if (animate) {\n        this.$innerProgressBar\n          .velocity('stop')\n          .velocity({width: percentage + '%'}, 'fast');\n      } else {\n        this.$innerProgressBar.velocity('stop').width(percentage + '%');\n      }\n    }\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * File Manager.\n */\nCraft.PromptHandler = Garnish.Base.extend({\n  modal: null,\n  $modalContainerDiv: null,\n  $prompt: null,\n  $promptApplyToRemainingContainer: null,\n  $promptApplyToRemainingCheckbox: null,\n  $promptApplyToRemainingLabel: null,\n  $pomptChoices: null,\n\n  _prompts: [],\n  _promptBatchCallback: $.noop,\n  _promptBatchReturnData: [],\n  _promptBatchNum: 0,\n\n  resetPrompts: function () {\n    this._prompts = [];\n    this._promptBatchCallback = $.noop;\n    this._promptBatchReturnData = [];\n    this._promptBatchNum = 0;\n  },\n\n  addPrompt: function (prompt) {\n    this._prompts.push(prompt);\n  },\n\n  getPromptCount: function () {\n    return this._prompts.length;\n  },\n\n  showBatchPrompts: function (callback) {\n    this._promptBatchCallback = callback;\n    this._promptBatchReturnData = [];\n    this._promptBatchNum = 0;\n\n    this._showNextPromptInBatch();\n  },\n\n  _showNextPromptInBatch: function () {\n    var prompt = this._prompts[this._promptBatchNum].prompt,\n      remainingInBatch = this._prompts.length - (this._promptBatchNum + 1);\n\n    this._showPrompt(\n      prompt.message,\n      prompt.choices,\n      this._handleBatchPromptSelection.bind(this),\n      remainingInBatch\n    );\n  },\n\n  /**\n   * Handles a prompt choice selection.\n   *\n   * @param {string} choice\n   * @param {boolean} applyToRemaining\n   * @private\n   */\n  _handleBatchPromptSelection: function (choice, applyToRemaining) {\n    var prompt = this._prompts[this._promptBatchNum],\n      remainingInBatch = this._prompts.length - (this._promptBatchNum + 1);\n\n    // Record this choice\n    var choiceData = $.extend(prompt, {choice});\n    this._promptBatchReturnData.push(choiceData);\n\n    // Are there any remaining items in the batch?\n    if (remainingInBatch) {\n      // Get ready to deal with the next prompt\n      this._promptBatchNum++;\n\n      // Apply the same choice to the remaining items?\n      if (applyToRemaining) {\n        this._handleBatchPromptSelection(choice, true);\n      } else {\n        // Show the next prompt\n        this._showNextPromptInBatch();\n      }\n    } else {\n      // All done! Call the callback\n      if (typeof this._promptBatchCallback === 'function') {\n        this._promptBatchCallback(this._promptBatchReturnData);\n      }\n    }\n  },\n\n  /**\n   * @callback showPromptCallback\n   * @param {string} choice\n   * @param {boolean} applyToRemaining\n   */\n  /**\n   * Show the user prompt with a given message and choices, plus an optional \"Apply to remaining\" checkbox.\n   *\n   * @param {string} message\n   * @param {Array} choices\n   * @param {showPromptCallback} callback\n   * @param {number} itemsToGo\n   */\n  _showPrompt: function (message, choices, callback, itemsToGo) {\n    this._promptCallback = callback;\n\n    if (this.modal === null) {\n      this.modal = new Garnish.Modal({closeOtherModals: false});\n    }\n\n    if (this.$modalContainerDiv === null) {\n      this.$modalContainerDiv = $(\n        '<div class=\"modal fitted prompt-modal\"></div>'\n      )\n        .addClass()\n        .appendTo(Garnish.$bod);\n    }\n\n    this.$prompt = $('<div class=\"body\"></div>').appendTo(\n      this.$modalContainerDiv.empty()\n    );\n\n    this.$promptMessage = $('<p class=\"prompt-msg\"/>').appendTo(this.$prompt);\n\n    this.$promptChoices = $('<div class=\"options\"></div>').appendTo(\n      this.$prompt\n    );\n\n    this.$promptApplyToRemainingContainer = $(\n      '<label class=\"assets-applytoremaining\"/>'\n    )\n      .appendTo(this.$prompt)\n      .hide();\n    this.$promptApplyToRemainingCheckbox = $(\n      '<input type=\"checkbox\"/>'\n    ).appendTo(this.$promptApplyToRemainingContainer);\n    this.$promptApplyToRemainingLabel = $('<span/>').appendTo(\n      this.$promptApplyToRemainingContainer\n    );\n\n    this.$promptButtons = $('<div class=\"buttons right\"/>').appendTo(\n      this.$prompt\n    );\n\n    this.modal.setContainer(this.$modalContainerDiv);\n\n    this.$promptMessage.html(message);\n\n    let $cancelBtn = $('<button/>', {\n      type: 'button',\n      class: 'btn',\n      text: Craft.t('app', 'Cancel'),\n    }).appendTo(this.$promptButtons);\n    let $submitBtn = $('<button/>', {\n      type: 'submit',\n      class: 'btn submit disabled',\n      text: Craft.t('app', 'OK'),\n    }).appendTo(this.$promptButtons);\n\n    for (var i = 0; i < choices.length; i++) {\n      var $radioButtonHtml = $(\n          '<div><label><input type=\"radio\" name=\"promptAction\" value=\"' +\n            choices[i].value +\n            '\"/> ' +\n            choices[i].title +\n            '</label></div>'\n        ).appendTo(this.$promptChoices),\n        $radioButton = $radioButtonHtml.find('input');\n\n      this.addListener($radioButton, 'click', function () {\n        $submitBtn.removeClass('disabled');\n      });\n    }\n\n    this.addListener($submitBtn, 'activate', function (ev) {\n      var choice = $(ev.currentTarget)\n          .parents('.modal')\n          .find('input[name=promptAction]:checked')\n          .val(),\n        applyToRemaining = this.$promptApplyToRemainingCheckbox.prop('checked');\n\n      this._selectPromptChoice(choice, applyToRemaining);\n    });\n\n    this.addListener($cancelBtn, 'activate', function () {\n      var choice = 'cancel',\n        applyToRemaining = this.$promptApplyToRemainingCheckbox.prop('checked');\n\n      this._selectPromptChoice(choice, applyToRemaining);\n    });\n\n    if (itemsToGo) {\n      this.$promptApplyToRemainingContainer.show();\n      this.$promptApplyToRemainingLabel.html(\n        ' ' +\n          Craft.t('app', 'Apply this to the {number} remaining conflicts?', {\n            number: itemsToGo,\n          })\n      );\n    }\n\n    this.modal.show();\n    this.modal.removeListener(Garnish.Modal.$shade, 'click');\n    this.addListener(Garnish.Modal.$shade, 'click', '_cancelPrompt');\n  },\n\n  /**\n   * Handles when a user selects one of the prompt choices.\n   *\n   * @param {string} choice\n   * @param {boolean} applyToRemaining\n   * @private\n   */\n  _selectPromptChoice: function (choice, applyToRemaining) {\n    this.$prompt.fadeOut('fast', () => {\n      this.modal.hide();\n      this._promptCallback(choice, applyToRemaining);\n    });\n  },\n\n  /**\n   * Cancels the prompt.\n   */\n  _cancelPrompt: function () {\n    this._selectPromptChoice('cancel', true);\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Queue\n */\nCraft.Queue = Garnish.Base.extend({\n  running: false,\n  paused: false,\n  pausedForVisibility: false,\n  jobs: null,\n\n  get length() {\n    return this.jobs.length;\n  },\n\n  get isPaused() {\n    return this.paused || this.pausedForVisibility;\n  },\n\n  init: function () {\n    this.jobs = [];\n\n    Garnish.$doc.on('visibilitychange', () => {\n      if (this.pausedForVisibility && Craft.isVisible()) {\n        this.pausedForVisibility = false;\n        this._resume();\n      }\n    });\n  },\n\n  /**\n   * Adds a job to the queue.\n   * @param {function} job\n   * @returns {Promise}\n   */\n  push: function (job) {\n    return this._add(job, 'push');\n  },\n\n  /**\n   * Adds a job to the beginning of the queue.\n   * @param {function} job\n   * @returns {Promise}\n   */\n  unshift: function (job) {\n    return this._add(job, 'unshift');\n  },\n\n  pause: function () {\n    if (!this.paused) {\n      this.paused = true;\n      if (!this.pausedForVisibility) {\n        this.trigger('pause');\n      }\n    }\n  },\n\n  resume: function () {\n    if (this.paused) {\n      this.paused = false;\n      this._resume();\n    }\n  },\n\n  /**\n   * Adds a job to the queue.\n   * @param {function} job\n   * @param {string} method\n   * @returns {Promise}\n   * @private\n   */\n  _add: function (job, method) {\n    return new Promise((resolve, reject) => {\n      this.jobs[method](() => {\n        return new Promise((qResolve, qReject) => {\n          job()\n            .then((value) => {\n              // ...arguments doesn't work here :(\n              resolve(value);\n              qResolve();\n            })\n            .catch((value) => {\n              // ...arguments doesn't work here :(\n              reject(value);\n              qReject();\n            });\n        });\n      });\n\n      if (!this.running) {\n        this.trigger('beforeRun');\n        this.running = true;\n        this._exec();\n      }\n    });\n  },\n\n  clear: function () {\n    this.jobs.length = 0;\n  },\n\n  /**\n   * Runs the next job in the queue.\n   * @private\n   */\n  _exec: function () {\n    if (!this.jobs.length) {\n      this.running = false;\n      this.trigger('afterRun');\n      return;\n    }\n\n    if (!this.pausedForVisibility && !Craft.isVisible()) {\n      this.pausedForVisibility = true;\n      if (!this.paused) {\n        this.trigger('pause');\n      }\n    }\n\n    if (this.paused || this.pausedForVisibility) {\n      return;\n    }\n\n    this.trigger('beforeExec');\n    const job = this.jobs.shift();\n    job().finally(() => {\n      this.trigger('afterExec');\n      this._exec();\n    });\n  },\n\n  _resume: function () {\n    if (!this.isPaused) {\n      this.trigger('resume');\n      this._exec();\n    }\n  },\n});\n\nCraft.queue = new Craft.Queue();\n","(function ($) {\n  /** global: Craft */\n  /** global: Garnish */\n  /**\n   * Slide Picker\n   */\n  Craft.SlidePicker = Garnish.Base.extend(\n    {\n      min: null,\n      max: null,\n      totalSteps: null,\n      value: null,\n      label: null,\n      describedBy: null,\n\n      $container: null,\n      $buttons: null,\n\n      init: function (value, settings) {\n        this.setSettings(settings, Craft.SlidePicker.defaults);\n\n        this.$container = $('<div/>', {\n          class: 'slide-picker',\n          role: 'slider',\n          tabindex: 0,\n        });\n\n        this.refresh();\n        this.setValue(value, false);\n\n        this.addListener(this.$container, 'keydown', (ev) => {\n          switch (ev.keyCode) {\n            case Garnish.UP_KEY:\n              this.setValue(this.value + this.settings.step);\n              ev.preventDefault();\n              break;\n            case Garnish.DOWN_KEY:\n              this.setValue(this.value - this.settings.step);\n              ev.preventDefault();\n              break;\n            case Garnish.RIGHT_KEY:\n              if (Craft.orientation === 'ltr') {\n                this.setValue(this.value + this.settings.step);\n              } else {\n                this.setValue(this.value - this.settings.step);\n              }\n              ev.preventDefault();\n              break;\n            case Garnish.LEFT_KEY:\n              if (Craft.orientation === 'ltr') {\n                this.setValue(this.value - this.settings.step);\n              } else {\n                this.setValue(this.value + this.settings.step);\n              }\n              ev.preventDefault();\n              break;\n            case Garnish.HOME_KEY:\n              this.setValue(this.min);\n              ev.preventDefault();\n              break;\n            case Garnish.END_KEY:\n              this.setValue(this.max);\n              ev.preventDefault();\n              break;\n          }\n        });\n      },\n\n      refresh: function () {\n        // Figure out what the min/max values are\n        this.min = this._min();\n        this.max = this._max();\n        this.totalSteps = (this.max - this.min) / this.settings.step;\n\n        // Set label\n        this.label = this.settings.label;\n        this.describedBy = this.settings.describedBy;\n\n        if (!Number.isInteger(this.totalSteps)) {\n          throw 'Invalid SlidePicker config';\n        }\n\n        if (this.$buttons) {\n          this.$buttons.remove();\n        }\n\n        this.$container.attr('aria-valuemin', this.min);\n        this.$container.attr('aria-valuemax', this.max);\n\n        if (this.label) {\n          this.$container.attr('aria-label', this.label);\n        }\n\n        if (this.describedBy) {\n          this.$container.attr('aria-describedby', this.describedBy);\n        }\n\n        this.$buttons = $();\n\n        // Create the buttons\n        for (\n          let value = this.min;\n          value <= this.max;\n          value += this.settings.step\n        ) {\n          this.$buttons = this.$buttons.add(\n            $('<a/>', {\n              title: this.settings.valueLabel(value),\n              data: {value},\n            })\n          );\n        }\n\n        this.$buttons.appendTo(this.$container);\n\n        if (this.value !== null) {\n          let value = this.value;\n          this.value = null;\n          this.setValue(value, false);\n        }\n\n        this.addListener(this.$buttons, 'mouseover', (ev) => {\n          this.$buttons.removeClass('active-hover last-active-hover');\n          $(ev.currentTarget)\n            .addClass('active-hover last-active-hover')\n            .prevAll()\n            .addClass('active-hover');\n        });\n\n        this.addListener(this.$buttons, 'mouseout', () => {\n          this.$buttons.removeClass('active-hover');\n        });\n\n        this.addListener(this.$buttons, 'click', (ev) => {\n          this.setValue($.data(ev.currentTarget, 'value'));\n          ev.stopPropagation();\n          this.$container.focus();\n        });\n      },\n\n      setValue: function (value, triggerEvent) {\n        value = Math.max(Math.min(value, this.max), this.min);\n\n        if (this.value === (this.value = value)) {\n          return;\n        }\n\n        this.$container.attr({\n          'aria-valuenow': this.value,\n          'aria-valuetext': this.settings.valueLabel(this.value),\n        });\n\n        this.$buttons.removeClass('last-active active');\n        let $activeButton = this.$buttons.eq(\n          (this.value - this.min) / this.settings.step\n        );\n        $activeButton.add($activeButton.prevAll()).addClass('active');\n        $activeButton.addClass('last-active');\n\n        if (triggerEvent !== false) {\n          this.settings.onChange(value);\n        }\n      },\n\n      _min: function () {\n        if (typeof this.settings.min === 'function') {\n          return this.settings.min();\n        }\n        return this.settings.min;\n      },\n\n      _max: function () {\n        if (typeof this.settings.max === 'function') {\n          return this.settings.max();\n        }\n        return this.settings.max;\n      },\n    },\n    {\n      defaults: {\n        min: 0,\n        max: 100,\n        step: 10,\n        valueLabel: null,\n        onChange: $.noop,\n      },\n    }\n  );\n})(jQuery);\n","/** global: Garnish */\n\nCraft.SlideRuleInput = Garnish.Base.extend({\n  $container: null,\n  $options: null,\n  $selectedOption: null,\n  $input: null,\n  value: null,\n\n  startPositionX: null,\n\n  init: function (id, settings) {\n    this.setSettings(settings, Craft.SlideRuleInput.defaultSettings);\n\n    this.value = 0;\n    this.graduationsMin = -70;\n    this.graduationsMax = 70;\n    this.slideMin = -45;\n    this.slideMax = 45;\n\n    this.$container = $('#' + id);\n    this.$overlay = $('<div class=\"overlay\"></div>').appendTo(this.$container);\n    this.$cursor = $('<div class=\"cursor\"></div>').appendTo(this.$container);\n    this.$graduations = $('<div class=\"graduations\"></div>').appendTo(\n      this.$container\n    );\n    this.$graduationsUl = $('<ul></ul>').appendTo(this.$graduations);\n\n    this.$container.attr({\n      role: 'slider',\n      tabindex: '0',\n      'aria-valuemin': this.slideMin,\n      'aria-valuemax': this.slideMax,\n      'aria-valuenow': '0',\n      'aria-valuetext': Craft.t(\n        'app',\n        '{num, number} {num, plural, =1{degree} other{degrees}}',\n        {\n          num: 0,\n        }\n      ),\n    });\n\n    for (var i = this.graduationsMin; i <= this.graduationsMax; i++) {\n      var $li = $(\n        '<li class=\"graduation\" data-graduation=\"' +\n          i +\n          '\"><div class=\"label\">' +\n          i +\n          '</div></li>'\n      ).appendTo(this.$graduationsUl);\n\n      if (i % 5 === 0) {\n        $li.addClass('main-graduation');\n      }\n\n      if (i === 0) {\n        $li.addClass('selected');\n      }\n    }\n\n    this.$options = this.$container.find('.graduation');\n\n    this.addListener(this.$container, 'resize', this._handleResize.bind(this));\n    this.addListener(\n      this.$container,\n      'tapstart',\n      this._handleTapStart.bind(this)\n    );\n    this.addListener(Garnish.$bod, 'tapmove', this._handleTapMove.bind(this));\n    this.addListener(Garnish.$bod, 'tapend', this._handleTapEnd.bind(this));\n    this.addListener(\n      this.$container,\n      'keydown',\n      this._handleKeypress.bind(this)\n    );\n\n    // Set to zero\n\n    // this.setValue(0);\n\n    setTimeout(() => {\n      // (n -1) options because the border is placed on the left of the 10px box\n      this.graduationsCalculatedWidth = (this.$options.length - 1) * 10;\n      this.$graduationsUl.css(\n        'left',\n        -this.graduationsCalculatedWidth / 2 + this.$container.width() / 2\n      );\n    }, 50);\n  },\n\n  _handleResize: function () {\n    var left = this.valueToPosition(this.value);\n    this.$graduationsUl.css('left', left);\n  },\n\n  _handleKeypress: function (event) {\n    const current = parseInt(this.$container.attr('aria-valuenow'), 10);\n\n    switch (event.keyCode) {\n      case Garnish.UP_KEY:\n      case Garnish.RIGHT_KEY:\n        this.setValue(current + 1);\n        break;\n      case Garnish.DOWN_KEY:\n      case Garnish.LEFT_KEY:\n        this.setValue(current - 1);\n        break;\n      case Garnish.PAGE_UP_KEY:\n        this.setValue(current + 10);\n        break;\n      case Garnish.PAGE_DOWN_KEY:\n        this.setValue(current - 10);\n        break;\n      case Garnish.HOME_KEY:\n        this.setValue(this.slideMin);\n        break;\n      case Garnish.END_KEY:\n        this.setValue(this.slideMax);\n        break;\n    }\n\n    this.onChange();\n  },\n\n  _handleTapStart: function (ev, touch) {\n    ev.preventDefault();\n\n    this.startPositionX = touch.position.x;\n    this.startLeft = this.$graduationsUl.position().left;\n\n    this.dragging = true;\n    this.onStart();\n  },\n\n  _handleTapMove: function (ev, touch) {\n    if (this.dragging) {\n      ev.preventDefault();\n\n      var curX = this.startPositionX - touch.position.x;\n      var left = this.startLeft - curX;\n      var value = this.positionToValue(left);\n\n      this.setValue(value);\n\n      this.onChange();\n    }\n  },\n\n  setValue: function (value) {\n    var left = this.valueToPosition(value);\n    if (value < this.slideMin) {\n      value = this.slideMin;\n      left = this.valueToPosition(value);\n    } else if (value > this.slideMax) {\n      value = this.slideMax;\n      left = this.valueToPosition(value);\n    }\n\n    this.$graduationsUl.css('left', left);\n\n    if (value >= this.slideMin && value <= this.slideMax) {\n      this.$options.removeClass('selected');\n\n      $.each(this.$options, function (key, option) {\n        if ($(option).data('graduation') > 0) {\n          if ($(option).data('graduation') <= value) {\n            $(option).addClass('selected');\n          }\n        }\n        if ($(option).data('graduation') < 0) {\n          if ($(option).data('graduation') >= value) {\n            $(option).addClass('selected');\n          }\n        }\n\n        if ($(option).data('graduation') == 0) {\n          $(option).addClass('selected');\n        }\n      });\n    }\n\n    this.$container.attr({\n      'aria-valuenow': value,\n      'aria-valuetext': Craft.t(\n        'app',\n        '{num, number} {num, plural, =1{degree} other{degrees}}',\n        {num: parseInt(value, 10)}\n      ),\n    });\n    this.value = value;\n  },\n\n  _handleTapEnd: function (ev) {\n    if (this.dragging) {\n      ev.preventDefault();\n      this.dragging = false;\n      this.onEnd();\n    }\n  },\n\n  positionToValue: function (position) {\n    var scaleMin = this.graduationsMin * -1;\n    var scaleMax = (this.graduationsMin - this.graduationsMax) * -1;\n\n    return (\n      ((this.$graduations.width() / 2 + position * -1) /\n        this.graduationsCalculatedWidth) *\n        scaleMax -\n      scaleMin\n    );\n  },\n\n  valueToPosition: function (value) {\n    var scaleMin = this.graduationsMin * -1;\n    var scaleMax = (this.graduationsMin - this.graduationsMax) * -1;\n\n    return -(\n      ((value + scaleMin) * this.graduationsCalculatedWidth) / scaleMax -\n      this.$graduations.width() / 2\n    );\n  },\n\n  onStart: function () {\n    if (typeof this.settings.onChange === 'function') {\n      this.settings.onStart(this);\n    }\n  },\n\n  onChange: function () {\n    if (typeof this.settings.onChange === 'function') {\n      this.settings.onChange(this);\n    }\n  },\n\n  onEnd: function () {\n    if (typeof this.settings.onChange === 'function') {\n      this.settings.onEnd(this);\n    }\n  },\n\n  defaultSettings: {\n    onStart: $.noop,\n    onChange: $.noop,\n    onEnd: $.noop,\n  },\n});\n","(function ($) {\n  /** global: Craft */\n  /** global: Garnish */\n  /**\n   * Slide Picker\n   */\n  Craft.Slideout = Garnish.Base.extend(\n    {\n      $outerContainer: null,\n      $container: null,\n      $shade: null,\n      isOpen: false,\n\n      init: function (contents, settings) {\n        this.setSettings(settings, Craft.Slideout.defaults);\n\n        if (!Craft.useMobileStyles()) {\n          this.$shade = $('<div class=\"slideout-shade\"/>').appendTo(\n            Garnish.$bod\n          );\n\n          if (this.settings.closeOnShadeClick) {\n            this.addListener(this.$shade, 'click', (ev) => {\n              ev.stopPropagation();\n              this.close();\n            });\n          }\n        }\n\n        this.$outerContainer = $('<div/>', {\n          class: 'slideout-container hidden',\n        });\n        this.$container = $(\n          `<${this.settings.containerElement}/>`,\n          this.settings.containerAttributes\n        )\n          .attr('data-slideout', '')\n          .addClass('slideout')\n          .append(contents)\n          .data('slideout', this)\n          .appendTo(this.$outerContainer);\n\n        Garnish.addModalAttributes(this.$outerContainer);\n\n        if (Craft.useMobileStyles()) {\n          this.$container.addClass('so-mobile');\n        }\n\n        Craft.trapFocusWithin(this.$container);\n\n        if (this.settings.autoOpen) {\n          this.open();\n        }\n      },\n\n      open: function () {\n        if (this.isOpen) {\n          return;\n        }\n\n        this.setTriggerElement(document.activeElement);\n\n        this._cancelTransitionListeners();\n\n        // Move the shade + container to the end of <body> so they get the highest sub-z-indexes\n        if (this.$shade) {\n          this.$shade.appendTo(Garnish.$bod).show();\n        }\n\n        this.$outerContainer.appendTo(Garnish.$bod).removeClass('hidden');\n\n        if (Craft.useMobileStyles()) {\n          this.$container.css('top', '100vh');\n        } else {\n          this.$container.css(Garnish.ltr ? 'left' : 'right', '100vw');\n        }\n\n        this.$container.one('transitionend.slideout', () => {\n          Craft.setFocusWithin(this.$container);\n        });\n\n        if (this.$shade) {\n          this.$shade[0].offsetWidth;\n          this.$shade.addClass('so-visible');\n        }\n\n        this.$container[0].offsetWidth;\n        Craft.Slideout.addPanel(this);\n\n        this.enable();\n        Garnish.uiLayerManager.addLayer(this.$outerContainer);\n        Garnish.hideModalBackgroundLayers();\n\n        if (this.settings.closeOnEsc) {\n          Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n            this.close();\n          });\n        }\n\n        this.isOpen = true;\n        this.trigger('open');\n      },\n\n      setTriggerElement: function (trigger) {\n        this.settings.triggerElement = trigger;\n      },\n\n      close: function () {\n        if (!this.isOpen) {\n          return;\n        }\n\n        this.trigger('beforeClose');\n        this.disable();\n        this.isOpen = false;\n\n        this._cancelTransitionListeners();\n\n        if (this.$shade) {\n          this.$shade\n            .removeClass('so-visible')\n            .one('transitionend.slideout', () => {\n              this.$shade.hide();\n            });\n        }\n\n        Craft.Slideout.removePanel(this);\n        Garnish.uiLayerManager.removeLayer();\n        Garnish.resetModalBackgroundLayerVisibility();\n        this.$container.one('transitionend.slideout', () => {\n          this.$outerContainer.addClass('hidden');\n          this.trigger('close');\n        });\n\n        if (this.settings.triggerElement) {\n          this.settings.triggerElement.focus();\n        }\n      },\n\n      _cancelTransitionListeners: function () {\n        if (this.$shade) {\n          this.$shade.off('transitionend.slideout');\n        }\n\n        this.$container.off('transitionend.slideout');\n      },\n\n      /**\n       * Destroy\n       */\n      destroy: function () {\n        if (this.$shade) {\n          this.$shade.remove();\n          this.$shade = null;\n        }\n\n        this.$outerContainer.remove();\n        this.$outerContainer = null;\n        this.$container = null;\n\n        this.base();\n      },\n    },\n    {\n      defaults: {\n        containerElement: 'div',\n        containerAttributes: {},\n        autoOpen: true,\n        closeOnEsc: true,\n        closeOnShadeClick: true,\n        triggerElement: null,\n      },\n      openPanels: [],\n      addPanel: function (panel) {\n        Craft.Slideout.openPanels.unshift(panel);\n        if (Craft.useMobileStyles()) {\n          panel.$container.css('top', 0);\n        } else {\n          Craft.Slideout.updateStyles();\n        }\n      },\n      removePanel: function (panel) {\n        Craft.Slideout.openPanels = Craft.Slideout.openPanels.filter(\n          (m) => m !== panel\n        );\n        if (Craft.useMobileStyles()) {\n          panel.$container.css('top', '100vh');\n        } else {\n          panel.$container.css(Garnish.ltr ? 'left' : 'right', '100vw');\n          Craft.Slideout.updateStyles();\n        }\n      },\n      updateStyles: function () {\n        const totalPanels = Craft.Slideout.openPanels.length;\n        Craft.Slideout.openPanels.forEach((panel, i) => {\n          panel.$container.css(\n            Garnish.ltr ? 'left' : 'right',\n            `${50 * ((totalPanels - i) / totalPanels)}vw`\n          );\n        });\n\n        if (totalPanels !== 0) {\n          Garnish.$bod.addClass('no-scroll');\n        } else {\n          Garnish.$bod.removeClass('no-scroll');\n        }\n      },\n    }\n  );\n})(jQuery);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Slug Generator\n */\nCraft.SlugGenerator = Craft.BaseInputGenerator.extend({\n  generateTargetValue: function (sourceVal) {\n    // Remove HTML tags\n    sourceVal = sourceVal.replace(/<(.*?)>/g, '');\n\n    // Remove inner-word punctuation\n    sourceVal = sourceVal.replace(/['\"‘’“”\\[\\]\\(\\)\\{\\}:]/g, '');\n\n    // Make it lowercase\n    if (!Craft.allowUppercaseInSlug) {\n      sourceVal = sourceVal.toLowerCase();\n    }\n\n    if (Craft.limitAutoSlugsToAscii) {\n      // Convert extended ASCII characters to basic ASCII\n      sourceVal = Craft.asciiString(sourceVal, this.settings.charMap);\n    }\n\n    // Get the \"words\". Split on anything that is not alphanumeric.\n    // Reference: http://www.regular-expressions.info/unicode.html\n    var words = Craft.filterArray(\n      XRegExp.matchChain(sourceVal, [XRegExp('[\\\\p{L}\\\\p{N}\\\\p{M}]+')])\n    );\n\n    if (words.length) {\n      return words.join(Craft.slugWordSeparator);\n    } else {\n      return '';\n    }\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Structure class\n */\nCraft.Structure = Garnish.Base.extend(\n  {\n    id: null,\n\n    $container: null,\n    state: null,\n    structureDrag: null,\n\n    /**\n     * Init\n     */\n    init: function (id, container, settings) {\n      this.id = id;\n      this.$container = $(container);\n      this.setSettings(settings, Craft.Structure.defaults);\n\n      // Is this already a structure?\n      if (this.$container.data('structure')) {\n        console.warn('Double-instantiating a structure on an element');\n        this.$container.data('structure').destroy();\n      }\n\n      this.$container.data('structure', this);\n\n      this.state = {};\n\n      if (this.settings.storageKey) {\n        $.extend(\n          this.state,\n          Craft.getLocalStorage(this.settings.storageKey, {})\n        );\n      }\n\n      if (typeof this.state.collapsedElementIds === 'undefined') {\n        this.state.collapsedElementIds = [];\n      }\n\n      var $parents = this.$container.find('ul').prev('.row');\n\n      for (var i = 0; i < $parents.length; i++) {\n        var $row = $($parents[i]),\n          $li = $row.parent(),\n          $toggle = $(\n            '<div class=\"toggle\" title=\"' +\n              Craft.t('app', 'Show/hide children') +\n              '\"/>'\n          ).prependTo($row);\n\n        if (\n          $.inArray(\n            $row.children('.element').data('id'),\n            this.state.collapsedElementIds\n          ) !== -1\n        ) {\n          $li.addClass('collapsed');\n        }\n\n        this.initToggle($toggle);\n      }\n\n      if (this.settings.sortable) {\n        this.structureDrag = new Craft.StructureDrag(\n          this,\n          this.settings.maxLevels\n        );\n      }\n\n      if (this.settings.newChildUrl) {\n        this.initNewChildMenus(this.$container.find('.add'));\n      }\n    },\n\n    initToggle: function ($toggle) {\n      $toggle.on('click', (ev) => {\n        var $li = $(ev.currentTarget).closest('li'),\n          elementId = $li.children('.row').find('.element:first').data('id'),\n          viewStateKey = $.inArray(elementId, this.state.collapsedElementIds);\n\n        if ($li.hasClass('collapsed')) {\n          $li.removeClass('collapsed');\n\n          if (viewStateKey !== -1) {\n            this.state.collapsedElementIds.splice(viewStateKey, 1);\n          }\n        } else {\n          $li.addClass('collapsed');\n\n          if (viewStateKey === -1) {\n            this.state.collapsedElementIds.push(elementId);\n          }\n        }\n\n        if (this.settings.storageKey) {\n          Craft.setLocalStorage(this.settings.storageKey, this.state);\n        }\n      });\n    },\n\n    initNewChildMenus: function ($addBtns) {\n      this.addListener($addBtns, 'click', 'onNewChildMenuClick');\n    },\n\n    onNewChildMenuClick: function (ev) {\n      var $btn = $(ev.currentTarget);\n\n      if (!$btn.data('menubtn')) {\n        var elementId = $btn.parent().children('.element').data('id'),\n          newChildUrl = Craft.getUrl(\n            this.settings.newChildUrl,\n            'parentId=' + elementId\n          );\n\n        $(\n          '<div class=\"menu\"><ul><li><a href=\"' +\n            newChildUrl +\n            '\">' +\n            Craft.t('app', 'New child') +\n            '</a></li></ul></div>'\n        ).insertAfter($btn);\n\n        var menuBtn = new Garnish.MenuBtn($btn);\n        menuBtn.showMenu();\n      }\n    },\n\n    getIndent: function (level) {\n      return (\n        Craft.Structure.baseIndent + (level - 1) * Craft.Structure.nestedIndent\n      );\n    },\n\n    addElement: function ($element) {\n      var $li = $('<li data-level=\"1\"/>').appendTo(this.$container),\n        $row = $(\n          '<div class=\"row\" style=\"margin-' +\n            Craft.left +\n            ': -' +\n            Craft.Structure.baseIndent +\n            'px; padding-' +\n            Craft.left +\n            ': ' +\n            Craft.Structure.baseIndent +\n            'px;\">'\n        ).appendTo($li);\n\n      $row.append($element);\n\n      if (this.settings.sortable) {\n        $row.append(\n          '<a class=\"move icon\" title=\"' + Craft.t('app', 'Move') + '\"></a>'\n        );\n        this.structureDrag.addItems($li);\n      }\n\n      if (this.settings.newChildUrl) {\n        var $addBtn = $(\n          '<a class=\"add icon\" title=\"' + Craft.t('app', 'New child') + '\"></a>'\n        ).appendTo($row);\n        this.initNewChildMenus($addBtn);\n      }\n\n      $row.css('margin-bottom', -30);\n      $row.velocity({'margin-bottom': 0}, 'fast');\n    },\n\n    removeElement: function ($element) {\n      var $li = $element.parent().parent();\n\n      if (this.settings.sortable) {\n        this.structureDrag.removeItems($li);\n      }\n\n      var $parentUl;\n\n      if (!$li.siblings().length) {\n        $parentUl = $li.parent();\n      }\n\n      $li\n        .css('visibility', 'hidden')\n        .velocity({marginBottom: -$li.height()}, 'fast', () => {\n          $li.remove();\n\n          if (typeof $parentUl !== 'undefined') {\n            this._removeUl($parentUl);\n          }\n        });\n    },\n\n    _removeUl: function ($ul) {\n      $ul.siblings('.row').children('.toggle').remove();\n      $ul.remove();\n    },\n\n    destroy: function () {\n      this.$container.removeData('structure');\n      this.base();\n    },\n  },\n  {\n    baseIndent: 8,\n    nestedIndent: 35,\n\n    defaults: {\n      storageKey: null,\n      sortable: false,\n      newChildUrl: null,\n      maxLevels: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Structure drag class\n */\nCraft.StructureDrag = Garnish.Drag.extend({\n  structure: null,\n  maxLevels: null,\n  draggeeLevel: null,\n\n  $helperLi: null,\n  $targets: null,\n  draggeeHeight: null,\n\n  init: function (structure, maxLevels) {\n    this.structure = structure;\n    this.maxLevels = maxLevels;\n\n    this.$insertion = $('<li class=\"draginsertion\"/>');\n\n    var $items = this.structure.$container.find('li');\n\n    this.base($items, {\n      handle: '.element:first, .move:first',\n      helper: this.getHelper.bind(this),\n    });\n  },\n\n  getHelper: function ($helper) {\n    this.$helperLi = $helper;\n    var $ul = $('<ul class=\"structure draghelper\"/>').append($helper);\n    $helper.css(\n      'padding-' + Craft.left,\n      this.$draggee.css('padding-' + Craft.left)\n    );\n    $helper.find('.move').removeAttr('title');\n    return $ul;\n  },\n\n  onDragStart: function () {\n    this.$targets = $();\n\n    // Recursively find each of the targets, in the order they appear to be in\n    this.findTargets(this.structure.$container);\n\n    // How deep does the rabbit hole go?\n    this.draggeeLevel = 0;\n    var $level = this.$draggee;\n    do {\n      this.draggeeLevel++;\n      $level = $level.find('> ul > li');\n    } while ($level.length);\n\n    // Collapse the draggee\n    this.draggeeHeight = this.$draggee.height();\n    this.$draggee.velocity(\n      {\n        height: 0,\n      },\n      'fast',\n      () => {\n        this.$draggee.addClass('hidden');\n      }\n    );\n    this.base();\n\n    this.addListener(Garnish.$doc, 'keydown', function (ev) {\n      if (ev.keyCode === Garnish.ESC_KEY) {\n        this.cancelDrag();\n      }\n    });\n  },\n\n  findTargets: function ($ul) {\n    var $lis = $ul.children().not(this.$draggee);\n\n    for (var i = 0; i < $lis.length; i++) {\n      var $li = $($lis[i]);\n      this.$targets = this.$targets.add($li.children('.row'));\n\n      if (!$li.hasClass('collapsed')) {\n        this.findTargets($li.children('ul'));\n      }\n    }\n  },\n\n  onDrag: function () {\n    if (this._.$closestTarget) {\n      this._.$closestTarget.removeClass('draghover');\n      this.$insertion.remove();\n    }\n\n    // First let's find the closest target\n    this._.$closestTarget = null;\n    this._.closestTargetPos = null;\n    this._.closestTargetYDiff = null;\n    this._.closestTargetOffset = null;\n    this._.closestTargetHeight = null;\n\n    for (this._.i = 0; this._.i < this.$targets.length; this._.i++) {\n      this._.$target = $(this.$targets[this._.i]);\n      this._.targetOffset = this._.$target.offset();\n      this._.targetHeight = this._.$target.outerHeight();\n      this._.targetYMidpoint =\n        this._.targetOffset.top + this._.targetHeight / 2;\n      this._.targetYDiff = Math.abs(this.mouseY - this._.targetYMidpoint);\n\n      if (\n        this._.i === 0 ||\n        (this.mouseY >= this._.targetOffset.top + 5 &&\n          this._.targetYDiff < this._.closestTargetYDiff)\n      ) {\n        this._.$closestTarget = this._.$target;\n        this._.closestTargetPos = this._.i;\n        this._.closestTargetYDiff = this._.targetYDiff;\n        this._.closestTargetOffset = this._.targetOffset;\n        this._.closestTargetHeight = this._.targetHeight;\n      } else {\n        // Getting colder\n        break;\n      }\n    }\n\n    if (!this._.$closestTarget) {\n      return;\n    }\n\n    // Are we hovering above the first row?\n    if (\n      this._.closestTargetPos === 0 &&\n      this.mouseY < this._.closestTargetOffset.top + 5\n    ) {\n      this.$insertion.prependTo(this.structure.$container);\n    } else {\n      this._.$closestTargetLi = this._.$closestTarget.parent();\n      this._.closestTargetLevel = this._.$closestTargetLi.data('level');\n\n      // Is there a next row?\n      if (this._.closestTargetPos < this.$targets.length - 1) {\n        this._.$nextTargetLi = $(\n          this.$targets[this._.closestTargetPos + 1]\n        ).parent();\n        this._.nextTargetLevel = this._.$nextTargetLi.data('level');\n      } else {\n        this._.$nextTargetLi = null;\n        this._.nextTargetLevel = null;\n      }\n\n      // Are we hovering between this row and the next one?\n      this._.hoveringBetweenRows =\n        this.mouseY >=\n        this._.closestTargetOffset.top + this._.closestTargetHeight - 5;\n\n      /**\n       * Scenario 1: Both rows have the same level.\n       *\n       *     * Row 1\n       *     ----------------------\n       *     * Row 2\n       */\n\n      if (\n        this._.$nextTargetLi &&\n        this._.nextTargetLevel == this._.closestTargetLevel\n      ) {\n        if (this._.hoveringBetweenRows) {\n          if (\n            !this.maxLevels ||\n            this.maxLevels >= this._.closestTargetLevel + this.draggeeLevel - 1\n          ) {\n            // Position the insertion after the closest target\n            this.$insertion.insertAfter(this._.$closestTargetLi);\n          }\n        } else {\n          if (\n            !this.maxLevels ||\n            this.maxLevels >= this._.closestTargetLevel + this.draggeeLevel\n          ) {\n            this._.$closestTarget.addClass('draghover');\n          }\n        }\n      } else if (\n        /**\n         * Scenario 2: Next row is a child of this one.\n         *\n         *     * Row 1\n         *     ----------------------\n         *         * Row 2\n         */\n        this._.$nextTargetLi &&\n        this._.nextTargetLevel > this._.closestTargetLevel\n      ) {\n        if (\n          !this.maxLevels ||\n          this.maxLevels >= this._.nextTargetLevel + this.draggeeLevel - 1\n        ) {\n          if (this._.hoveringBetweenRows) {\n            // Position the insertion as the first child of the closest target\n            this.$insertion.insertBefore(this._.$nextTargetLi);\n          } else {\n            this._.$closestTarget.addClass('draghover');\n            this.$insertion.appendTo(this._.$closestTargetLi.children('ul'));\n          }\n        }\n      } else {\n        /**\n         * Scenario 3: Next row is a child of a parent node, or there is no next row.\n         *\n         *         * Row 1\n         *     ----------------------\n         *     * Row 2\n         */\n        if (this._.hoveringBetweenRows) {\n          // Determine which <li> to position the insertion after\n          this._.draggeeX = this.mouseX - this.targetItemMouseDiffX;\n\n          if (Craft.orientation === 'rtl') {\n            this._.draggeeX += this.$helperLi.width();\n          }\n\n          this._.$parentLis = this._.$closestTarget.parentsUntil(\n            this.structure.$container,\n            'li'\n          );\n          this._.$closestParentLi = null;\n          this._.closestParentLiXDiff = null;\n          this._.closestParentLevel = null;\n\n          for (this._.i = 0; this._.i < this._.$parentLis.length; this._.i++) {\n            this._.$parentLi = $(this._.$parentLis[this._.i]);\n            this._.parentLiX = this._.$parentLi.offset().left;\n\n            if (Craft.orientation === 'rtl') {\n              this._.parentLiX += this._.$parentLi.width();\n            }\n\n            this._.parentLiXDiff = Math.abs(this._.parentLiX - this._.draggeeX);\n            this._.parentLevel = this._.$parentLi.data('level');\n\n            if (\n              (!this.maxLevels ||\n                this.maxLevels >= this._.parentLevel + this.draggeeLevel - 1) &&\n              (!this._.$closestParentLi ||\n                (this._.parentLiXDiff < this._.closestParentLiXDiff &&\n                  (!this._.$nextTargetLi ||\n                    this._.parentLevel >= this._.nextTargetLevel)))\n            ) {\n              this._.$closestParentLi = this._.$parentLi;\n              this._.closestParentLiXDiff = this._.parentLiXDiff;\n              this._.closestParentLevel = this._.parentLevel;\n            }\n          }\n\n          if (this._.$closestParentLi) {\n            this.$insertion.insertAfter(this._.$closestParentLi);\n          }\n        } else {\n          if (\n            !this.maxLevels ||\n            this.maxLevels >= this._.closestTargetLevel + this.draggeeLevel\n          ) {\n            this._.$closestTarget.addClass('draghover');\n          }\n        }\n      }\n    }\n  },\n\n  cancelDrag: function () {\n    this.$insertion.remove();\n\n    if (this._.$closestTarget) {\n      this._.$closestTarget.removeClass('draghover');\n    }\n\n    this.onMouseUp();\n  },\n\n  onDragStop: function () {\n    // Are we repositioning the draggee?\n    if (\n      this._.$closestTarget &&\n      (this.$insertion.parent().length ||\n        this._.$closestTarget.hasClass('draghover'))\n    ) {\n      var $draggeeParent, moved;\n\n      // Are we about to leave the draggee's original parent childless?\n      if (!this.$draggee.siblings().length) {\n        $draggeeParent = this.$draggee.parent();\n      }\n\n      if (this.$insertion.parent().length) {\n        // Make sure the insertion isn't right next to the draggee\n        var $closestSiblings = this.$insertion\n          .next()\n          .add(this.$insertion.prev());\n\n        if ($.inArray(this.$draggee[0], $closestSiblings) === -1) {\n          this.$insertion.replaceWith(this.$draggee);\n          moved = true;\n        } else {\n          this.$insertion.remove();\n          moved = false;\n        }\n      } else {\n        var $ul = this._.$closestTargetLi.children('ul');\n\n        // Make sure this is a different parent than the draggee's\n        if (!$draggeeParent || !$ul.length || $ul[0] !== $draggeeParent[0]) {\n          if (!$ul.length) {\n            var $toggle = $(\n              '<div class=\"toggle\" title=\"' +\n                Craft.t('app', 'Show/hide children') +\n                '\"/>'\n            ).prependTo(this._.$closestTarget);\n            this.structure.initToggle($toggle);\n\n            $ul = $('<ul>').appendTo(this._.$closestTargetLi);\n          } else if (this._.$closestTargetLi.hasClass('collapsed')) {\n            this._.$closestTarget.children('.toggle').trigger('click');\n          }\n\n          this.$draggee.appendTo($ul);\n          moved = true;\n        } else {\n          moved = false;\n        }\n      }\n\n      // Remove the class either way\n      this._.$closestTarget.removeClass('draghover');\n\n      if (moved) {\n        // Now deal with the now-childless parent\n        if ($draggeeParent) {\n          this.structure._removeUl($draggeeParent);\n        }\n\n        // Has the level changed?\n        var newLevel =\n          this.$draggee.parentsUntil(this.structure.$container, 'li').length +\n          1;\n\n        var animateCss;\n\n        if (newLevel != this.$draggee.data('level')) {\n          // Correct the helper's padding if moving to/from level 1\n          if (this.$draggee.data('level') == 1) {\n            animateCss = {};\n            animateCss['padding-' + Craft.left] = 38;\n            this.$helperLi.velocity(animateCss, 'fast');\n          } else if (newLevel == 1) {\n            animateCss = {};\n            animateCss['padding-' + Craft.left] = Craft.Structure.baseIndent;\n            this.$helperLi.velocity(animateCss, 'fast');\n          }\n\n          this.setLevel(this.$draggee, newLevel);\n        }\n\n        // Make it real\n        var $element = this.$draggee.children('.row').children('.element');\n\n        var data = {\n          structureId: this.structure.id,\n          elementId: $element.data('id'),\n          siteId: $element.data('site-id'),\n          prevId: this.$draggee\n            .prev()\n            .children('.row')\n            .children('.element')\n            .data('id'),\n          parentId: this.$draggee\n            .parent('ul')\n            .parent('li')\n            .children('.row')\n            .children('.element')\n            .data('id'),\n        };\n\n        Craft.sendActionRequest('POST', 'structures/move-element', {data}).then(\n          (response) => {\n            Craft.cp.displaySuccess(Craft.t('app', 'New order saved.'));\n          }\n        );\n      }\n    }\n\n    // Animate things back into place\n    this.$draggee\n      .velocity('stop')\n      .removeClass('hidden')\n      .velocity(\n        {\n          height: this.draggeeHeight,\n        },\n        'fast',\n        () => {\n          this.$draggee.css('height', 'auto');\n        }\n      );\n\n    this.returnHelpersToDraggees();\n\n    this.base();\n  },\n\n  setLevel: function ($li, level) {\n    $li.data('level', level);\n\n    var indent = this.structure.getIndent(level);\n\n    var css = {};\n    css['margin-' + Craft.left] = '-' + indent + 'px';\n    css['padding-' + Craft.left] = indent + 'px';\n    this.$draggee.children('.row').css(css);\n\n    var $childLis = $li.children('ul').children();\n\n    for (var i = 0; i < $childLis.length; i++) {\n      this.setLevel($($childLis[i]), level + 1);\n    }\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\nCraft.StructureTableSorter = Garnish.DragSort.extend(\n  {\n    tableView: null,\n    structureId: null,\n    maxLevels: null,\n\n    _basePadding: null,\n    _helperMargin: null,\n\n    _$firstRowCells: null,\n    _$titleHelperCell: null,\n\n    _titleHelperCellOuterWidth: null,\n\n    _ancestors: null,\n    _updateAncestorsFrame: null,\n\n    _draggeeLevel: null,\n    _draggeeLevelDelta: null,\n    draggingLastElements: null,\n    _loadingDraggeeLevelDelta: false,\n\n    _targetLevel: null,\n    _targetLevelBounds: null,\n\n    _positionChanged: null,\n\n    /**\n     * Constructor\n     */\n    init: function (tableView, $elements, settings) {\n      this.tableView = tableView;\n      this.structureId = this.tableView.$table.data('structure-id');\n      this.maxLevels = parseInt(this.tableView.$table.attr('data-max-levels'));\n\n      this._basePadding = 14 + (this.tableView.elementIndex.actions ? 34 : 24); // see _elements/tableview/elements.html\n      this._helperMargin = this.tableView.elementIndex.actions ? 54 : 0;\n\n      settings = $.extend({}, Craft.StructureTableSorter.defaults, settings, {\n        handle: '.move',\n        collapseDraggees: true,\n        singleHelper: true,\n        helperSpacingY: 2,\n        magnetStrength: 4,\n        helper: this.getHelper.bind(this),\n        helperLagBase: 1.5,\n        axis: Garnish.Y_AXIS,\n      });\n\n      this.base($elements, settings);\n    },\n\n    /**\n     * Returns the draggee rows (including any descendent rows).\n     */\n    findDraggee: function () {\n      this._draggeeLevel = this._targetLevel = this.$targetItem.data('level');\n      this._draggeeLevelDelta = 0;\n\n      var $draggee = $(this.$targetItem),\n        $nextRow = this.$targetItem.next();\n\n      while ($nextRow.length) {\n        // See if this row is a descendant of the draggee\n        var nextRowLevel = $nextRow.data('level');\n\n        if (nextRowLevel <= this._draggeeLevel) {\n          break;\n        }\n\n        // Is this the deepest descendant we've seen so far?\n        var nextRowLevelDelta = nextRowLevel - this._draggeeLevel;\n\n        if (nextRowLevelDelta > this._draggeeLevelDelta) {\n          this._draggeeLevelDelta = nextRowLevelDelta;\n        }\n\n        // Add it and prep the next row\n        $draggee = $draggee.add($nextRow);\n        $nextRow = $nextRow.next();\n      }\n\n      // Are we dragging the last elements on the page?\n      this.draggingLastElements = !$nextRow.length;\n\n      // Do we have a maxLevels to enforce,\n      // and does it look like this draggee has descendants we don't know about yet?\n      if (\n        this.maxLevels &&\n        this.draggingLastElements &&\n        this.tableView.getMorePending()\n      ) {\n        // Only way to know the true descendant level delta is to ask PHP\n        this._loadingDraggeeLevelDelta = true;\n\n        var data = this._getAjaxBaseData(this.$targetItem);\n\n        Craft.sendActionRequest('POST', 'structures/get-element-level-delta', {\n          data,\n        }).then((response) => {\n          this._loadingDraggeeLevelDelta = false;\n\n          if (this.dragging) {\n            this._draggeeLevelDelta = response.data.delta;\n            this.drag(false);\n          }\n        });\n      }\n\n      return $draggee;\n    },\n\n    /**\n     * Returns the drag helper.\n     */\n    getHelper: function ($helperRow) {\n      var $outerContainer = $(\n          '<div class=\"elements datatablesorthelper\"/>'\n        ).appendTo(Garnish.$bod),\n        $innerContainer = $('<div class=\"tableview\"/>').appendTo(\n          $outerContainer\n        ),\n        $table = $('<table class=\"data\"/>').appendTo($innerContainer),\n        $tbody = $('<tbody/>').appendTo($table);\n\n      $helperRow.appendTo($tbody);\n\n      // Copy the column widths\n      this._$firstRowCells = this.tableView.$elementContainer\n        .children('tr:first')\n        .children();\n      var $helperCells = $helperRow.children();\n\n      for (var i = 0; i < $helperCells.length; i++) {\n        var $helperCell = $($helperCells[i]);\n\n        // Skip the checkbox cell\n        if ($helperCell.hasClass('checkbox-cell')) {\n          $helperCell.remove();\n          continue;\n        }\n\n        // Hard-set the cell widths\n        var $firstRowCell = $(this._$firstRowCells[i]);\n        var width = $firstRowCell[0].getBoundingClientRect().width;\n\n        $firstRowCell.css('width', width + 'px');\n        $helperCell.css('width', width + 'px');\n\n        // Is this the title cell?\n        if (Garnish.hasAttr($firstRowCell, 'data-titlecell')) {\n          this._$titleHelperCell = $helperCell;\n          var padding = parseInt($firstRowCell.css('padding-' + Craft.left));\n          this._titleHelperCellOuterWidth = width;\n\n          $helperCell.css('padding-' + Craft.left, this._basePadding);\n        }\n      }\n\n      return $outerContainer;\n    },\n\n    /**\n     * Returns whether the draggee can be inserted before a given item.\n     */\n    canInsertBefore: function ($item) {\n      if (this._loadingDraggeeLevelDelta) {\n        return false;\n      }\n\n      return this._getLevelBounds($item.prev(), $item) !== false;\n    },\n\n    /**\n     * Returns whether the draggee can be inserted after a given item.\n     */\n    canInsertAfter: function ($item) {\n      if (this._loadingDraggeeLevelDelta) {\n        return false;\n      }\n\n      return this._getLevelBounds($item, $item.next()) !== false;\n    },\n\n    // Events\n    // -------------------------------------------------------------------------\n\n    /**\n     * On Drag Start\n     */\n    onDragStart: function () {\n      // Get the initial set of ancestors, before the item gets moved\n      this._ancestors = this._getAncestors(\n        this.$targetItem,\n        this.$targetItem.data('level')\n      );\n\n      // Set the initial target level bounds\n      this._setTargetLevelBounds();\n\n      // Check to see if we should load more elements now\n      this.tableView.maybeLoadMore();\n\n      this.base();\n    },\n\n    /**\n     * On Drag\n     */\n    onDrag: function () {\n      this.base();\n      this._updateIndent();\n    },\n\n    /**\n     * On Insertion Point Change\n     */\n    onInsertionPointChange: function () {\n      this._setTargetLevelBounds();\n      this._updateAncestorsBeforeRepaint();\n      this.base();\n    },\n\n    /**\n     * On Drag Stop\n     */\n    onDragStop: function () {\n      this._positionChanged = false;\n      this.base();\n\n      // Update the draggee's padding if the position just changed\n      // ---------------------------------------------------------------------\n\n      if (this._targetLevel != this._draggeeLevel) {\n        var levelDiff = this._targetLevel - this._draggeeLevel;\n\n        for (var i = 0; i < this.$draggee.length; i++) {\n          var $draggee = $(this.$draggee[i]),\n            oldLevel = $draggee.data('level'),\n            newLevel = oldLevel + levelDiff,\n            padding = this._basePadding + this._getLevelIndent(newLevel);\n\n          $draggee.data('level', newLevel);\n          $draggee.find('.element').data('level', newLevel);\n          $draggee\n            .children('[data-titlecell]:first')\n            .css('padding-' + Craft.left, padding);\n        }\n\n        this._positionChanged = true;\n      }\n\n      // Keep in mind this could have also been set by onSortChange()\n      if (this._positionChanged) {\n        // Tell the server about the new position\n        // -----------------------------------------------------------------\n\n        var data = this._getAjaxBaseData(this.$draggee);\n\n        // Find the previous sibling/parent, if there is one\n        var $prevRow = this.$draggee.first().prev();\n\n        while ($prevRow.length) {\n          var prevRowLevel = $prevRow.data('level');\n\n          if (prevRowLevel == this._targetLevel) {\n            data.prevId = $prevRow.data('id');\n            break;\n          }\n\n          if (prevRowLevel < this._targetLevel) {\n            data.parentId = $prevRow.data('id');\n\n            // Is this row collapsed?\n            var $toggle = $prevRow.find('> th > .toggle');\n\n            if (!$toggle.hasClass('expanded')) {\n              // Make it look expanded\n              $toggle.addClass('expanded');\n\n              // Add a temporary row\n              var $spinnerRow = this.tableView._createSpinnerRowAfter($prevRow);\n\n              // Remove the target item\n              if (this.tableView.elementSelect) {\n                this.tableView.elementSelect.removeItems(this.$targetItem);\n              }\n\n              this.removeItems(this.$targetItem);\n              this.$targetItem.remove();\n              this.tableView._totalVisible--;\n            }\n\n            break;\n          }\n\n          $prevRow = $prevRow.prev();\n        }\n\n        Craft.sendActionRequest('POST', 'structures/move-element', {data})\n          .then((response) => {\n            Craft.cp.displaySuccess(Craft.t('app', 'New position saved.'));\n            this.onPositionChange();\n\n            // Were we waiting on this to complete so we can expand the new parent?\n            if ($spinnerRow && $spinnerRow.parent().length) {\n              $spinnerRow.remove();\n              this.tableView._expandElement($toggle, true);\n            }\n\n            // See if we should run any pending tasks\n            Craft.cp.runQueue();\n          })\n          .catch(({response}) => {\n            Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n            this.tableView.elementIndex.updateElements();\n            return;\n          });\n      }\n    },\n\n    onSortChange: function () {\n      if (this.tableView.elementSelect) {\n        this.tableView.elementSelect.resetItemOrder();\n      }\n\n      this._positionChanged = true;\n      this.base();\n    },\n\n    onPositionChange: function () {\n      Garnish.requestAnimationFrame(() => {\n        this.trigger('positionChange');\n        this.settings.onPositionChange();\n      });\n    },\n\n    onReturnHelpersToDraggees: function () {\n      this._$firstRowCells.css('width', '');\n\n      // If we were dragging the last elements on the page and ended up loading any additional elements in,\n      // there could be a gap between the last draggee item and whatever now comes after it.\n      // So remove the post-draggee elements and possibly load up the next batch.\n      if (this.draggingLastElements && this.tableView.getMorePending()) {\n        // Update the element index's record of how many items are actually visible\n        this.tableView._totalVisible +=\n          this.newDraggeeIndexes[0] - this.oldDraggeeIndexes[0];\n\n        var $postDraggeeItems = this.$draggee.last().nextAll();\n\n        if ($postDraggeeItems.length) {\n          this.removeItems($postDraggeeItems);\n          $postDraggeeItems.remove();\n          this.tableView.maybeLoadMore();\n        }\n      }\n\n      this.base();\n    },\n\n    /**\n     * Returns the min and max levels that the draggee could occupy between\n     * two given rows, or false if it’s not going to work out.\n     */\n    _getLevelBounds: function ($prevRow, $nextRow) {\n      // Can't go any lower than the next row, if there is one\n      if ($nextRow && $nextRow.length) {\n        this._getLevelBounds._minLevel = $nextRow.data('level');\n      } else {\n        this._getLevelBounds._minLevel = 1;\n      }\n\n      // Can't go any higher than the previous row + 1\n      if ($prevRow && $prevRow.length) {\n        this._getLevelBounds._maxLevel = $prevRow.data('level') + 1;\n      } else {\n        this._getLevelBounds._maxLevel = 1;\n      }\n\n      // Does this structure have a max level?\n      if (this.maxLevels) {\n        // Make sure it's going to fit at all here\n        if (\n          this._getLevelBounds._minLevel != 1 &&\n          this._getLevelBounds._minLevel + this._draggeeLevelDelta >\n            this.maxLevels\n        ) {\n          return false;\n        }\n\n        // Limit the max level if we have to\n        if (\n          this._getLevelBounds._maxLevel + this._draggeeLevelDelta >\n          this.maxLevels\n        ) {\n          this._getLevelBounds._maxLevel =\n            this.maxLevels - this._draggeeLevelDelta;\n\n          if (this._getLevelBounds._maxLevel < this._getLevelBounds._minLevel) {\n            this._getLevelBounds._maxLevel = this._getLevelBounds._minLevel;\n          }\n        }\n      }\n\n      return {\n        min: this._getLevelBounds._minLevel,\n        max: this._getLevelBounds._maxLevel,\n      };\n    },\n\n    /**\n     * Determines the min and max possible levels at the current draggee's position.\n     */\n    _setTargetLevelBounds: function () {\n      this._targetLevelBounds = this._getLevelBounds(\n        this.$draggee.first().prev(),\n        this.$draggee.last().next()\n      );\n    },\n\n    /**\n     * Determines the target level based on the current mouse position.\n     */\n    _updateIndent: function (forcePositionChange) {\n      // Figure out the target level\n      // ---------------------------------------------------------------------\n\n      // How far has the cursor moved?\n      this._updateIndent._mouseDist = this.realMouseX - this.mousedownX;\n\n      // Flip that if this is RTL\n      if (Craft.orientation === 'rtl') {\n        this._updateIndent._mouseDist *= -1;\n      }\n\n      // What is that in indentation levels?\n      this._updateIndent._indentationDist = Math.round(\n        this._updateIndent._mouseDist / Craft.StructureTableSorter.LEVEL_INDENT\n      );\n\n      // Combine with the original level to get the new target level\n      this._updateIndent._targetLevel =\n        this._draggeeLevel + this._updateIndent._indentationDist;\n\n      // Contain it within our min/max levels\n      if (this._updateIndent._targetLevel < this._targetLevelBounds.min) {\n        this._updateIndent._indentationDist +=\n          this._targetLevelBounds.min - this._updateIndent._targetLevel;\n        this._updateIndent._targetLevel = this._targetLevelBounds.min;\n      } else if (\n        this._updateIndent._targetLevel > this._targetLevelBounds.max\n      ) {\n        this._updateIndent._indentationDist -=\n          this._updateIndent._targetLevel - this._targetLevelBounds.max;\n        this._updateIndent._targetLevel = this._targetLevelBounds.max;\n      }\n\n      // Has the target level changed?\n      if (\n        this._targetLevel !==\n        (this._targetLevel = this._updateIndent._targetLevel)\n      ) {\n        // Target level is changing, so update the ancestors\n        this._updateAncestorsBeforeRepaint();\n      }\n\n      // Update the UI\n      // ---------------------------------------------------------------------\n\n      // How far away is the cursor from the exact target level distance?\n      this._updateIndent._targetLevelMouseDiff =\n        this._updateIndent._mouseDist -\n        this._updateIndent._indentationDist *\n          Craft.StructureTableSorter.LEVEL_INDENT;\n\n      // What's the magnet impact of that?\n      this._updateIndent._magnetImpact = Math.round(\n        this._updateIndent._targetLevelMouseDiff / 15\n      );\n\n      // Put it on a leash\n      if (\n        Math.abs(this._updateIndent._magnetImpact) >\n        Craft.StructureTableSorter.MAX_GIVE\n      ) {\n        this._updateIndent._magnetImpact =\n          (this._updateIndent._magnetImpact > 0 ? 1 : -1) *\n          Craft.StructureTableSorter.MAX_GIVE;\n      }\n\n      // Apply the new margin/width\n      this._updateIndent._closestLevelMagnetIndent =\n        this._getLevelIndent(this._targetLevel) +\n        this._updateIndent._magnetImpact;\n      this.helpers[0].css(\n        'margin-' + Craft.left,\n        this._updateIndent._closestLevelMagnetIndent + this._helperMargin\n      );\n      this._$titleHelperCell.css(\n        'width',\n        this._titleHelperCellOuterWidth -\n          this._updateIndent._closestLevelMagnetIndent\n      );\n    },\n\n    /**\n     * Returns the indent size for a given level\n     */\n    _getLevelIndent: function (level) {\n      return (level - 1) * Craft.StructureTableSorter.LEVEL_INDENT;\n    },\n\n    /**\n     * Returns the base data that should be sent with StructureController Ajax requests.\n     */\n    _getAjaxBaseData: function ($row) {\n      return {\n        structureId: this.structureId,\n        elementId: $row.data('id'),\n        siteId: $row.find('.element:first').data('site-id'),\n      };\n    },\n\n    /**\n     * Returns a row's ancestor rows\n     */\n    _getAncestors: function ($row, targetLevel) {\n      this._getAncestors._ancestors = [];\n\n      if (targetLevel != 0) {\n        this._getAncestors._level = targetLevel;\n        this._getAncestors._$prevRow = $row.prev();\n\n        while (this._getAncestors._$prevRow.length) {\n          if (\n            this._getAncestors._$prevRow.data('level') <\n            this._getAncestors._level\n          ) {\n            this._getAncestors._ancestors.unshift(this._getAncestors._$prevRow);\n            this._getAncestors._level =\n              this._getAncestors._$prevRow.data('level');\n\n            // Did we just reach the top?\n            if (this._getAncestors._level == 0) {\n              break;\n            }\n          }\n\n          this._getAncestors._$prevRow = this._getAncestors._$prevRow.prev();\n        }\n      }\n\n      return this._getAncestors._ancestors;\n    },\n\n    /**\n     * Prepares to have the ancestors updated before the screen is repainted.\n     */\n    _updateAncestorsBeforeRepaint: function () {\n      if (this._updateAncestorsFrame) {\n        Garnish.cancelAnimationFrame(this._updateAncestorsFrame);\n      }\n\n      this._updateAncestorsFrame = Garnish.requestAnimationFrame(\n        this._updateAncestors.bind(this)\n      );\n    },\n\n    _updateAncestors: function () {\n      this._updateAncestorsFrame = null;\n\n      // Update the old ancestors\n      // -----------------------------------------------------------------\n\n      for (\n        this._updateAncestors._i = 0;\n        this._updateAncestors._i < this._ancestors.length;\n        this._updateAncestors._i++\n      ) {\n        this._updateAncestors._$ancestor =\n          this._ancestors[this._updateAncestors._i];\n\n        // One less descendant now\n        this._updateAncestors._$ancestor.data(\n          'descendants',\n          this._updateAncestors._$ancestor.data('descendants') - 1\n        );\n\n        // Is it now childless?\n        if (this._updateAncestors._$ancestor.data('descendants') == 0) {\n          // Remove its toggle\n          this._updateAncestors._$ancestor\n            .find('> th > .toggle:first')\n            .remove();\n        }\n      }\n\n      // Update the new ancestors\n      // -----------------------------------------------------------------\n\n      this._updateAncestors._newAncestors = this._getAncestors(\n        this.$targetItem,\n        this._targetLevel\n      );\n\n      for (\n        this._updateAncestors._i = 0;\n        this._updateAncestors._i < this._updateAncestors._newAncestors.length;\n        this._updateAncestors._i++\n      ) {\n        this._updateAncestors._$ancestor =\n          this._updateAncestors._newAncestors[this._updateAncestors._i];\n\n        // One more descendant now\n        this._updateAncestors._$ancestor.data(\n          'descendants',\n          this._updateAncestors._$ancestor.data('descendants') + 1\n        );\n\n        // Is this its first child?\n        if (this._updateAncestors._$ancestor.data('descendants') == 1) {\n          // Create its toggle\n          const ancestorTitle = this._updateAncestors._$ancestor.data('title');\n          $(\n            '<button class=\"toggle expanded\" type=\"button\" aria-expanded=\"true\" title=\"' +\n              Craft.t('app', 'Show/hide children') +\n              '\" aria-label=\"' +\n              Craft.t('app', 'Show {title} children', {title: ancestorTitle}) +\n              '\"></button>'\n          ).insertAfter(\n            this._updateAncestors._$ancestor.find('> th .move:first')\n          );\n        }\n      }\n\n      this._ancestors = this._updateAncestors._newAncestors;\n\n      delete this._updateAncestors._i;\n      delete this._updateAncestors._$ancestor;\n      delete this._updateAncestors._newAncestors;\n    },\n  },\n  {\n    HELPER_MARGIN: 0,\n    LEVEL_INDENT: 44,\n    MAX_GIVE: 22,\n\n    defaults: {\n      onPositionChange: $.noop,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Table Element Index View\n */\nCraft.TableElementIndexView = Craft.BaseElementIndexView.extend({\n  $table: null,\n  $tableCaption: null,\n  $selectedSortHeader: null,\n  $statusMessage: null,\n\n  structureTableSort: null,\n\n  _totalVisiblePostStructureTableDraggee: null,\n  _morePendingPostStructureTableDraggee: false,\n\n  _broadcastListener: null,\n\n  getElementContainer: function () {\n    // Save a reference to the table\n    this.$table = this.$container.find('table:first');\n    return this.$table.children('tbody:first');\n  },\n\n  afterInit: function () {\n    // Set table caption\n    this.$tableCaption = this.$table.find('caption');\n\n    this.$statusMessage = this.$table.parent().find('[data-status-message]');\n\n    // Set the sort header\n    this.initTableHeaders();\n\n    // Add callback for after elements are updated\n    this.elementIndex.on('updateElements', () => {\n      this._updateScreenReaderStatus();\n    });\n\n    // Create the Structure Table Sorter\n    if (\n      this.elementIndex.settings.context === 'index' &&\n      this.elementIndex.getSelectedSortAttribute() === 'structure' &&\n      Garnish.hasAttr(this.$table, 'data-structure-id')\n    ) {\n      this.structureTableSort = new Craft.StructureTableSorter(\n        this,\n        this.getAllElements()\n      );\n    } else {\n      this.structureTableSort = null;\n    }\n\n    // Handle expand/collapse toggles for Structures\n    if (this.elementIndex.getSelectedSortAttribute() === 'structure') {\n      this.addListener(this.$elementContainer, 'click', function (ev) {\n        var $target = $(ev.target);\n\n        if ($target.hasClass('toggle')) {\n          if (this._collapseElement($target) === false) {\n            this._expandElement($target);\n          }\n        }\n      });\n    }\n\n    // Set up the broadcast listener\n    if (Craft.messageReceiver) {\n      this._broadcastListener = (ev) => {\n        if (ev.data.event === 'saveElement') {\n          const $rows = this.$table.find(\n            `> tbody > tr[data-id=\"${ev.data.id}\"]`\n          );\n          if ($rows.length) {\n            const data = {\n              elementType: this.elementIndex.elementType,\n              source: this.elementIndex.sourceKey,\n              id: ev.data.id,\n              siteId: this.elementIndex.siteId,\n            };\n            Craft.sendActionRequest(\n              'POST',\n              'element-indexes/element-table-html',\n              {data}\n            ).then(({data}) => {\n              for (let i = 0; i < $rows.length; i++) {\n                const $row = $rows.eq(i);\n                $row\n                  .find('> th[data-titlecell] .element')\n                  .replaceWith(data.elementHtml);\n                for (let attribute in data.attributeHtml) {\n                  if (data.attributeHtml.hasOwnProperty(attribute)) {\n                    $row\n                      .find(`> td[data-attr=\"${attribute}\"]`)\n                      .html(data.attributeHtml[attribute]);\n                  }\n                }\n              }\n              new Craft.ElementThumbLoader().load($rows);\n            });\n          }\n        }\n      };\n\n      Craft.messageReceiver.addEventListener(\n        'message',\n        this._broadcastListener\n      );\n    }\n  },\n\n  initTableHeaders: function () {\n    const [selectedSortAttr] = this.elementIndex.getSortAttributeAndDirection();\n    const $tableHeaders = this.$table\n      .children('thead')\n      .children()\n      .children('[data-attribute]');\n\n    for (let i = 0; i < $tableHeaders.length; i++) {\n      const $header = $tableHeaders.eq(i);\n      const attr = $header.attr('data-attribute');\n      let sortValue = 'none';\n\n      // Is this the selected sort attribute?\n      if (attr === selectedSortAttr) {\n        this.$selectedSortHeader = $header;\n        const selectedSortDir = this.elementIndex.getSelectedSortDirection();\n        sortValue = selectedSortDir === 'asc' ? 'ascending' : 'descending';\n        $header.addClass('ordered ' + selectedSortDir);\n        this.makeColumnSortable($header, true);\n      } else {\n        // Is this attribute sortable?\n        if (this.elementIndex.getSortOption(attr)) {\n          this.makeColumnSortable($header);\n        }\n      }\n\n      $header.attr('aria-sort', sortValue);\n    }\n  },\n\n  makeColumnSortable: function ($header, sorted = false) {\n    $header.addClass('orderable');\n\n    const headerHtml = $header.html();\n    const $instructions = this.$tableCaption.find('[data-sort-instructions]');\n    const $headerButton = $('<button/>', {\n      id: `${this.elementIndex.idPrefix}-${$header.attr('data-attribute')}`,\n      type: 'button',\n      'aria-pressed': 'false',\n    }).html(headerHtml);\n\n    if ($instructions.length) {\n      $headerButton.attr('aria-describedby', $instructions.attr('id'));\n    }\n\n    if (sorted) {\n      $headerButton.attr('aria-pressed', 'true');\n      $headerButton.on('click', this._handleSelectedSortHeaderClick.bind(this));\n    } else {\n      $headerButton.on(\n        'click',\n        this._handleUnselectedSortHeaderClick.bind(this)\n      );\n    }\n\n    $header.empty().append($headerButton);\n  },\n\n  isVerticalList: function () {\n    return true;\n  },\n\n  getTotalVisible: function () {\n    if (this._isStructureTableDraggingLastElements()) {\n      return this._totalVisiblePostStructureTableDraggee;\n    } else {\n      return this._totalVisible;\n    }\n  },\n\n  setTotalVisible: function (totalVisible) {\n    if (this._isStructureTableDraggingLastElements()) {\n      this._totalVisiblePostStructureTableDraggee = totalVisible;\n    } else {\n      this._totalVisible = totalVisible;\n    }\n  },\n\n  getMorePending: function () {\n    if (this._isStructureTableDraggingLastElements()) {\n      return this._morePendingPostStructureTableDraggee;\n    } else {\n      return this._morePending;\n    }\n  },\n\n  setMorePending: function (morePending) {\n    if (this._isStructureTableDraggingLastElements()) {\n      this._morePendingPostStructureTableDraggee = morePending;\n    } else {\n      this._morePending = this._morePendingPostStructureTableDraggee =\n        morePending;\n    }\n  },\n\n  getLoadMoreParams: function () {\n    var params = this.base();\n\n    // If we are dragging the last elements on the page,\n    // tell the controller to only load elements positioned after the draggee.\n    if (this._isStructureTableDraggingLastElements()) {\n      params.criteria.positionedAfter =\n        this.structureTableSort.$targetItem.data('id');\n    }\n\n    return params;\n  },\n\n  appendElements: function ($newElements) {\n    this.base($newElements);\n\n    if (this.structureTableSort) {\n      this.structureTableSort.addItems($newElements);\n    }\n\n    Craft.cp.updateResponsiveTables();\n  },\n\n  _collapseElement: function ($toggle, force) {\n    if (!force && !$toggle.hasClass('expanded')) {\n      return false;\n    }\n\n    $toggle.removeClass('expanded');\n    $toggle.attr('aria-expanded', 'false');\n\n    // Find and remove the descendant rows\n    var $row = $toggle.parent().parent(),\n      id = $row.data('id'),\n      level = $row.data('level'),\n      $nextRow = $row.next();\n\n    while ($nextRow.length) {\n      if (!Garnish.hasAttr($nextRow, 'data-spinnerrow')) {\n        if ($nextRow.data('level') <= level) {\n          break;\n        }\n\n        if (this.elementSelect) {\n          this.elementSelect.removeItems($nextRow);\n        }\n\n        if (this.structureTableSort) {\n          this.structureTableSort.removeItems($nextRow);\n        }\n\n        this._totalVisible--;\n      }\n\n      var $nextNextRow = $nextRow.next();\n      $nextRow.remove();\n      $nextRow = $nextNextRow;\n    }\n\n    // Remember that this row should be collapsed\n    if (!this.elementIndex.instanceState.collapsedElementIds) {\n      this.elementIndex.instanceState.collapsedElementIds = [];\n    }\n\n    this.elementIndex.instanceState.collapsedElementIds.push(id);\n    this.elementIndex.setInstanceState(\n      'collapsedElementIds',\n      this.elementIndex.instanceState.collapsedElementIds\n    );\n\n    // Bottom of the index might be viewable now\n    this.maybeLoadMore();\n  },\n\n  _expandElement: function ($toggle, force) {\n    if (!force && $toggle.hasClass('expanded')) {\n      return false;\n    }\n\n    $toggle.addClass('expanded');\n    $toggle.attr('aria-expanded', 'true');\n\n    // Remove this element from our list of collapsed elements\n    if (this.elementIndex.instanceState.collapsedElementIds) {\n      var $row = $toggle.parent().parent(),\n        id = $row.data('id'),\n        index = $.inArray(\n          id,\n          this.elementIndex.instanceState.collapsedElementIds\n        );\n\n      if (index !== -1) {\n        this.elementIndex.instanceState.collapsedElementIds.splice(index, 1);\n        this.elementIndex.setInstanceState(\n          'collapsedElementIds',\n          this.elementIndex.instanceState.collapsedElementIds\n        );\n\n        // Add a temporary row\n        var $spinnerRow = this._createSpinnerRowAfter($row);\n\n        // Load the nested elements\n        let data = $.extend(true, {}, this.settings.params);\n        data.criteria.descendantOf = id;\n\n        Craft.sendActionRequest('POST', this.settings.loadMoreElementsAction, {\n          data,\n        })\n          .then((response) => {\n            // Do we even care about this anymore?\n            if (!$spinnerRow.parent().length) {\n              return;\n            }\n\n            let $newElements = $(response.data.html);\n\n            // Are there more descendants we didn't get in this batch?\n            let totalVisible = this._totalVisible + $newElements.length;\n            let morePending =\n              this.settings.batchSize &&\n              $newElements.length === this.settings.batchSize;\n\n            if (morePending) {\n              // Remove all the elements after it\n              let $nextRows = $spinnerRow.nextAll();\n\n              if (this.elementSelect) {\n                this.elementSelect.removeItems($nextRows);\n              }\n\n              if (this.structureTableSort) {\n                this.structureTableSort.removeItems($nextRows);\n              }\n\n              $nextRows.remove();\n              totalVisible -= $nextRows.length;\n            } else {\n              // Maintain the current 'more' status\n              morePending = this._morePending;\n            }\n\n            $spinnerRow.replaceWith($newElements);\n            this.thumbLoader.load($newElements);\n\n            if (this.elementIndex.actions || this.settings.selectable) {\n              this.elementSelect.addItems(\n                $newElements.filter(':not(.disabled)')\n              );\n              this.elementIndex.updateActionTriggers();\n            }\n\n            if (this.structureTableSort) {\n              this.structureTableSort.addItems($newElements);\n            }\n\n            Craft.appendHeadHtml(response.data.headHtml);\n            Craft.appendBodyHtml(response.data.bodyHtml);\n            Craft.cp.updateResponsiveTables();\n\n            this.setTotalVisible(totalVisible);\n            this.setMorePending(morePending);\n\n            // Is there room to load more right now?\n            this.maybeLoadMore();\n          })\n          .catch((e) => {\n            Craft.cp.displayError();\n            if (!$spinnerRow.parent().length) {\n              return;\n            }\n          });\n      }\n    }\n  },\n\n  _createSpinnerRowAfter: function ($row) {\n    return $(\n      '<tr data-spinnerrow>' +\n        '<td class=\"centeralign\" colspan=\"' +\n        $row.children().length +\n        '\">' +\n        '<div class=\"spinner\"/>' +\n        '</td>' +\n        '</tr>'\n    ).insertAfter($row);\n  },\n\n  _isStructureTableDraggingLastElements: function () {\n    return (\n      this.structureTableSort &&\n      this.structureTableSort.dragging &&\n      this.structureTableSort.draggingLastElements\n    );\n  },\n\n  _handleSelectedSortHeaderClick: function (ev) {\n    var $header = $(ev.currentTarget).closest('th');\n\n    if ($header.hasClass('loading')) {\n      return;\n    }\n\n    // Reverse the sort direction\n    var selectedSortDir = this.elementIndex.getSelectedSortDirection(),\n      newSortDir = selectedSortDir === 'asc' ? 'desc' : 'asc';\n\n    this.elementIndex.setSelectedSortDirection(newSortDir);\n    this._handleSortHeaderClick(ev, $header);\n  },\n\n  _handleUnselectedSortHeaderClick: function (ev) {\n    var $header = $(ev.currentTarget).closest('th');\n\n    if ($header.hasClass('loading')) {\n      return;\n    }\n\n    var attr = $header.attr('data-attribute');\n\n    this.elementIndex.setSelectedSortAttribute(attr);\n    this._handleSortHeaderClick(ev, $header);\n  },\n\n  _handleSortHeaderClick: function (ev, $header) {\n    if (this.$selectedSortHeader) {\n      this.$selectedSortHeader.removeClass('ordered asc desc');\n    }\n\n    $header.addClass('ordered loading');\n    this.elementIndex.updateElements();\n\n    // No need for two spinners\n    this.elementIndex.setIndexAvailable();\n  },\n\n  _updateScreenReaderStatus: function () {\n    const attribute = this.elementIndex.getSelectedSortAttribute();\n    const direction =\n      this.elementIndex.getSelectedSortDirection() === 'asc'\n        ? Craft.t('app', 'Ascending')\n        : Craft.t('app', 'Descending');\n    const label = this.elementIndex.getSortLabel(attribute);\n\n    if (!attribute && !direction && !label) return;\n\n    const message = Craft.t(\n      'app',\n      'Table {name} sorted by {attribute}, {direction}',\n      {\n        name: this.$table.attr('data-name'),\n        attribute: label,\n        direction: direction,\n      }\n    );\n\n    this.$statusMessage.empty();\n    this.$statusMessage.text(message);\n  },\n\n  _updateTableAttributes: function ($element, tableAttributes) {\n    var $tr = $element.closest('tr');\n\n    for (var attr in tableAttributes) {\n      if (!tableAttributes.hasOwnProperty(attr)) {\n        continue;\n      }\n\n      $tr\n        .children('[data-attr=\"' + attr + '\"]:first')\n        .html(tableAttributes[attr]);\n    }\n  },\n\n  destroy: function () {\n    if (this._broadcastListener) {\n      Craft.messageReceiver.removeEventListener(\n        'message',\n        this._broadcastListener\n      );\n      delete this._broadcastListener;\n    }\n\n    this.base();\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Tab manager\n */\nCraft.Tabs = Garnish.Base.extend({\n  $container: null,\n  $tablist: null,\n  $menuBtn: null,\n  $tabs: null,\n  $firstTab: null,\n  $lastTab: null,\n  $selectedTab: null,\n  $focusableTab: null,\n  menu: null,\n\n  init: function (container) {\n    this.$container = $(container);\n    this.$tablist = this.$container.find('> [role=\"tablist\"]:first');\n    this.$tabs = this.$tablist.find('> [role=\"tab\"]');\n    this.$firstTab = this.$tabs.first();\n    this.$lastTab = this.$tabs.last();\n    this.$selectedTab = this.$tabs.filter('.sel:first');\n    this.$focusableTab = this.$tabs.filter('[tabindex=0]:first');\n    this.$menuBtn = this.$container.find('> .menubtn:first').menubtn();\n    this.menu = this.$menuBtn.data('menubtn').menu;\n\n    // Is there already a tab manager?\n    if (this.$container.data('tabs')) {\n      console.warn('Double-instantiating a tab manager on an element');\n      this.$container.data('tabs').destroy();\n    }\n\n    this.$container.data('tabs', this);\n\n    for (let i = 0; i < this.$tabs.length; i++) {\n      const $a = this.$tabs.eq(i);\n\n      // Does it link to an anchor?\n      const href = $a.attr('href');\n      if (href && href.charAt(0) === '#') {\n        this.addListener($a, 'keydown', (ev) => {\n          if ([Garnish.SPACE_KEY, Garnish.RETURN_KEY].includes(ev.keyCode)) {\n            ev.preventDefault();\n            this.selectTab(ev.currentTarget);\n          }\n        });\n        this.addListener($a, 'click', (ev) => {\n          ev.preventDefault();\n          this.selectTab(ev.currentTarget);\n        });\n      }\n\n      this.addListener($a, 'keydown', (ev) => {\n        let $tab;\n        if (\n          [Garnish.LEFT_KEY, Garnish.RIGHT_KEY].includes(ev.keyCode) &&\n          $.contains(this.$tablist[0], ev.currentTarget)\n        ) {\n          if (\n            ev.keyCode ===\n            (Craft.orientation === 'ltr' ? Garnish.LEFT_KEY : Garnish.RIGHT_KEY)\n          ) {\n            $tab = $(ev.currentTarget).prevAll(\n              '[role=\"tab\"]:not(.hidden):first'\n            );\n            $tab = $tab.length ? $tab : this.$lastTab;\n          } else {\n            $tab = $(ev.currentTarget).nextAll(\n              '[role=\"tab\"]:not(.hidden):first'\n            );\n            $tab = $tab.length ? $tab : this.$firstTab;\n          }\n        } else if (\n          ev.keyCode === Garnish.HOME_KEY ||\n          ev.keyCode === Garnish.END_KEY\n        ) {\n          $tab =\n            ev.keyCode === Garnish.HOME_KEY ? this.$firstTab : this.$lastTab;\n        }\n\n        if ($tab) {\n          ev.preventDefault();\n          this.makeTabFocusable($tab);\n          $tab.focus();\n          this.scrollToTab($tab);\n        }\n      });\n    }\n\n    this.updateMenuBtn();\n\n    Garnish.$win.on('resize', () => {\n      this.updateMenuBtn();\n    });\n\n    // Prevent menu options from updating the URL\n    this.menu.$options.on('click', (ev) => {\n      const $option = $(ev.currentTarget);\n      const href = $option.attr('href');\n      if (href && href.charAt(0) === '#') {\n        ev.preventDefault();\n      }\n    });\n\n    this.menu.on('optionselect', (ev) => {\n      this.selectTab($(ev.selectedOption).data('id'));\n    });\n  },\n\n  selectTab: function (tab) {\n    const $tab = this._getTab(tab);\n\n    if ($tab[0] === this.$selectedTab[0]) {\n      return;\n    }\n\n    this.deselectTab();\n    this.$selectedTab = $tab.addClass('sel').attr('aria-selected', 'true');\n    this.makeTabFocusable($tab);\n    $tab.focus();\n    this.scrollToTab($tab);\n\n    this.menu.$options.removeClass('sel');\n    this.menu.$options.filter(`[data-id=\"${$tab.data('id')}\"]`).addClass('sel');\n\n    this.trigger('selectTab', {\n      $tab: $tab,\n    });\n\n    $('#content').trigger('scroll');\n  },\n\n  deselectTab: function () {\n    const $tab = this.$selectedTab\n      .removeClass('sel')\n      .attr('aria-selected', 'false');\n    this.$selectedTab = null;\n\n    this.trigger('deselectTab', {\n      $tab: $tab,\n    });\n  },\n\n  makeTabFocusable: function (tab) {\n    const $tab = this._getTab(tab);\n\n    if ($tab[0] === this.$focusableTab[0]) {\n      return;\n    }\n\n    this.$focusableTab.attr('tabindex', '-1');\n    this.$focusableTab = $tab.attr('tabindex', '0');\n  },\n\n  scrollToTab: function (tab) {\n    const $tab = this._getTab(tab);\n    const scrollLeft = this.$tablist.scrollLeft();\n    const tabOffset = $tab.offset().left;\n    const elemScrollOffset = tabOffset - this.$tablist.offset().left;\n    let targetScrollLeft = false;\n\n    // Is the tab hidden on the left?\n    if (elemScrollOffset < 0) {\n      targetScrollLeft = scrollLeft + elemScrollOffset - 24;\n    } else {\n      const tabWidth = $tab.outerWidth();\n      const ulWidth = this.$tablist.prop('clientWidth');\n\n      // Is it hidden to the right?\n      if (elemScrollOffset + tabWidth > ulWidth) {\n        targetScrollLeft =\n          scrollLeft + (elemScrollOffset - (ulWidth - tabWidth)) + 24;\n      }\n    }\n\n    if (targetScrollLeft !== false) {\n      this.$tablist.scrollLeft(targetScrollLeft);\n    }\n  },\n\n  updateMenuBtn: function () {\n    if (\n      Math.floor(this.$tablist.prop('scrollWidth') - 48) >\n      this.$container.prop('clientWidth')\n    ) {\n      this.$tablist.addClass('scrollable');\n      this.$menuBtn.removeClass('hidden');\n    } else {\n      this.$tablist.removeClass('scrollable');\n      this.$menuBtn.addClass('hidden');\n    }\n  },\n\n  _getTab: function (tab) {\n    if (tab instanceof jQuery) {\n      return tab;\n    }\n\n    if (tab instanceof HTMLElement) {\n      return $(tab);\n    }\n\n    if (typeof tab !== 'string') {\n      throw 'Invalid tab ID';\n    }\n\n    const $tab = this.$tabs.filter(`[data-id=\"${tab}\"]`);\n\n    if (!$tab.length) {\n      throw `Invalid tab ID: ${tab}`;\n    }\n\n    return $tab;\n  },\n\n  destroy: function () {\n    this.$container.removeData('tabs');\n    this.base();\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Tag select input\n */\nCraft.TagSelectInput = Craft.BaseElementSelectInput.extend(\n  {\n    searchTimeout: null,\n    searchMenu: null,\n\n    $container: null,\n    $elementsContainer: null,\n    $elements: null,\n    $addTagInput: null,\n    $spinner: null,\n\n    _ignoreBlur: false,\n\n    init: function (settings) {\n      // Normalize the settings\n      // ---------------------------------------------------------------------\n\n      // Are they still passing in a bunch of arguments?\n      if (!$.isPlainObject(settings)) {\n        // Loop through all of the old arguments and apply them to the settings\n        var normalizedSettings = {},\n          args = ['id', 'name', 'tagGroupId', 'sourceElementId'];\n\n        for (var i = 0; i < args.length; i++) {\n          if (typeof arguments[i] !== 'undefined') {\n            normalizedSettings[args[i]] = arguments[i];\n          } else {\n            break;\n          }\n        }\n\n        settings = normalizedSettings;\n      }\n\n      this.base($.extend({}, Craft.TagSelectInput.defaults, settings));\n\n      this.$addTagInput = this.$container.children('.add').children('.text');\n      this.$spinner = this.$addTagInput.next();\n\n      this.addListener(this.$addTagInput, 'input', () => {\n        if (this.searchTimeout) {\n          clearTimeout(this.searchTimeout);\n        }\n\n        this.searchTimeout = setTimeout(this.searchForTags.bind(this), 500);\n      });\n\n      this.addListener(this.$addTagInput, 'keydown', function (ev) {\n        if (ev.keyCode === Garnish.RETURN_KEY) {\n          ev.preventDefault();\n        }\n\n        let $option;\n\n        switch (ev.keyCode) {\n          case Garnish.RETURN_KEY: {\n            ev.preventDefault();\n            if (this.searchMenu) {\n              this.selectTag(this.searchMenu.$options.filter('.hover'));\n            }\n            return;\n          }\n\n          case Garnish.DOWN_KEY: {\n            ev.preventDefault();\n            if (this.searchMenu) {\n              let $hoverOption = this.searchMenu.$options.filter('.hover');\n              if ($hoverOption.length) {\n                let $nextOption = $hoverOption\n                  .parent()\n                  .nextAll()\n                  .find('a:not(.disabled)')\n                  .first();\n                if ($nextOption.length) {\n                  this.focusOption($nextOption);\n                }\n              } else {\n                this.focusOption(this.searchMenu.$options.eq(0));\n              }\n            }\n            return;\n          }\n\n          case Garnish.UP_KEY: {\n            ev.preventDefault();\n            if (this.searchMenu) {\n              let $hoverOption = this.searchMenu.$options.filter('.hover');\n              if ($hoverOption.length) {\n                let $prevOption = $hoverOption\n                  .parent()\n                  .prevAll()\n                  .find('a:not(.disabled)')\n                  .last();\n                if ($prevOption.length) {\n                  this.focusOption($prevOption);\n                }\n              } else {\n                this.focusOption(\n                  this.searchMenu.$options.eq(\n                    this.searchMenu.$options.length - 1\n                  )\n                );\n              }\n            }\n            return;\n          }\n        }\n      });\n\n      this.addListener(this.$addTagInput, 'focus', function () {\n        if (this.searchMenu) {\n          this.searchMenu.show();\n        }\n      });\n\n      this.addListener(this.$addTagInput, 'blur', function () {\n        if (this._ignoreBlur) {\n          this._ignoreBlur = false;\n          return;\n        }\n\n        setTimeout(() => {\n          if (this.searchMenu) {\n            this.searchMenu.hide();\n          }\n        }, 1);\n      });\n    },\n\n    focusOption: function ($option) {\n      this.searchMenu.$options.removeClass('hover');\n      $option.addClass('hover');\n      this.searchMenu.$menuList.attr(\n        'aria-activedescendant',\n        $option.attr('id')\n      );\n    },\n\n    // No \"add\" button\n    getAddElementsBtn: $.noop,\n\n    getElementSortAxis: function () {\n      return null;\n    },\n\n    searchForTags: function () {\n      if (this.searchMenu) {\n        this.killSearchMenu();\n      }\n\n      var val = this.$addTagInput.val();\n\n      if (val) {\n        this.$spinner.removeClass('hidden');\n\n        var excludeIds = [];\n\n        for (var i = 0; i < this.$elements.length; i++) {\n          var id = $(this.$elements[i]).data('id');\n\n          if (id) {\n            excludeIds.push(id);\n          }\n        }\n\n        if (this.settings.sourceElementId) {\n          excludeIds.push(this.settings.sourceElementId);\n        }\n\n        var data = {\n          search: this.$addTagInput.val(),\n          tagGroupId: this.settings.tagGroupId,\n          excludeIds: excludeIds,\n        };\n\n        Craft.sendActionRequest('POST', 'tags/search-for-tags', {data})\n          .then((response) => {\n            if (this.searchMenu) {\n              this.killSearchMenu();\n            }\n            this.$spinner.addClass('hidden');\n            var $menu = $('<div class=\"menu tagmenu\"/>').appendTo(Garnish.$bod),\n              $ul = $('<ul/>').appendTo($menu);\n\n            var $li;\n\n            for (var i = 0; i < response.data.tags.length; i++) {\n              $li = $('<li/>').appendTo($ul);\n\n              $('<a data-icon=\"tag\"/>')\n                .appendTo($li)\n                .text(response.data.tags[i].title)\n                .data('id', response.data.tags[i].id)\n                .addClass(response.data.tags[i].exclude ? 'disabled' : '');\n            }\n\n            if (!response.data.exactMatch) {\n              $li = $('<li/>').appendTo($ul);\n              $('<a data-icon=\"plus\"/>').appendTo($li).text(data.search);\n            }\n\n            $ul.find('a:not(.disabled):first').addClass('hover');\n\n            this.searchMenu = new Garnish.Menu($menu, {\n              attachToElement: this.$addTagInput,\n              onOptionSelect: this.selectTag.bind(this),\n            });\n\n            this.addListener($menu, 'mousedown', () => {\n              this._ignoreBlur = true;\n            });\n\n            this.searchMenu.show();\n          })\n          .catch(({response}) => {\n            // Just in case\n            if (this.searchMenu) {\n              this.killSearchMenu();\n            }\n\n            this.$spinner.addClass('hidden');\n          });\n      } else {\n        this.$spinner.addClass('hidden');\n      }\n    },\n\n    selectTag: function (option) {\n      var $option = $(option);\n\n      if ($option.hasClass('disabled')) {\n        return;\n      }\n\n      var id = $option.data('id');\n      var title = $option.text();\n\n      var $element = $('<div/>', {\n        class: 'element small removable',\n        'data-id': id,\n        'data-site-id': this.settings.targetSiteId,\n        'data-label': title,\n        'data-editable': '1',\n      }).appendTo(this.$elementsContainer);\n\n      var $input = $('<input/>', {\n        type: 'hidden',\n        name: this.settings.name + '[]',\n        value: id,\n      }).appendTo($element);\n\n      $('<button/>', {\n        class: 'delete icon',\n        title: Craft.t('app', 'Remove'),\n        type: 'button',\n        'aria-label': Craft.t('app', 'Remove {label}', {\n          label: title,\n        }),\n      }).appendTo($element);\n\n      var $titleContainer = $('<div/>', {\n        class: 'label',\n      }).appendTo($element);\n\n      $('<span/>', {\n        class: 'title',\n        text: title,\n      }).appendTo($titleContainer);\n\n      var margin = -($element.outerWidth() + 10);\n      this.$addTagInput.css('margin-' + Craft.left, margin + 'px');\n\n      var animateCss = {};\n      animateCss['margin-' + Craft.left] = 0;\n      this.$addTagInput.velocity(animateCss, 'fast');\n\n      this.$elements = this.$elements.add($element);\n\n      this.addElements($element);\n\n      this.killSearchMenu();\n      this.$addTagInput.val('');\n      this.$addTagInput.trigger('focus');\n\n      if (!id) {\n        // We need to create the tag first\n        $element.addClass('loading disabled');\n\n        var data = {\n          groupId: this.settings.tagGroupId,\n          title: title,\n        };\n\n        Craft.sendActionRequest('POST', 'tags/create-tag', {data})\n          .then((response) => {\n            $element.attr('data-id', response.data.id);\n            $input.val(response.data.id);\n\n            $element.removeClass('loading disabled');\n          })\n          .catch(({response}) => {\n            this.removeElement($element);\n            Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n          });\n      }\n    },\n\n    killSearchMenu: function () {\n      this.searchMenu.hide();\n      this.searchMenu.destroy();\n      this.searchMenu = null;\n    },\n  },\n  {\n    defaults: {\n      tagGroupId: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Thumb Element Index View\n */\nCraft.ThumbsElementIndexView = Craft.BaseElementIndexView.extend({\n  getElementContainer: function () {\n    return this.$container.children('ul');\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\nCraft.ui = {\n  createButton: function (config) {\n    const $btn = $('<button/>', {\n      type: config.type || 'button',\n      class: 'btn',\n    });\n    if (config.id) {\n      $btn.attr('id', config.id);\n    }\n    if (config.class) {\n      $btn.addClass(config.class);\n    }\n    if (config.ariaLabel) {\n      $btn.attr('aria-label', config.ariaLabel);\n    }\n    if (config.role) {\n      $btn.attr('role', config.role);\n    }\n    if (config.html) {\n      $btn.html(config.html);\n    } else if (config.label) {\n      $btn.append($('<div class=\"label\"/>').text(config.label));\n    } else {\n      $btn.addClass('btn-empty');\n    }\n    if (config.toggle) {\n      $btn.attr('aria-expanded', 'false');\n    }\n    if (config.controls) {\n      $btn.attr('aria-controls', config.controls);\n    }\n    if (config.spinner) {\n      $btn.append($('<div class=\"spinner spinner-absolute\"/>'));\n    }\n    return $btn;\n  },\n\n  createSubmitButton: function (config) {\n    const $btn = this.createButton(\n      Object.assign({}, config, {\n        type: 'submit',\n        label: config.label || Craft.t('app', 'Submit'),\n      })\n    );\n    $btn.addClass('submit');\n    return $btn;\n  },\n\n  createTextInput: function (config) {\n    config = $.extend(\n      {\n        autocomplete: false,\n      },\n      config\n    );\n    var $input = $('<input/>', {\n      attr: {\n        class: 'text',\n        type: config.type || 'text',\n        inputmode: config.inputmode,\n        id: config.id,\n        size: config.size,\n        name: config.name,\n        value: config.value,\n        maxlength: config.maxlength,\n        autofocus: this.getAutofocusValue(config.autofocus),\n        autocomplete:\n          typeof config.autocomplete === 'boolean'\n            ? config.autocomplete\n              ? 'on'\n              : 'off'\n            : config.autocomplete,\n        disabled: this.getDisabledValue(config.disabled),\n        readonly: config.readonly,\n        title: config.title,\n        placeholder: config.placeholder,\n        step: config.step,\n        min: config.min,\n        max: config.max,\n      },\n    });\n\n    if (config.class) {\n      $input.addClass(config.class);\n    }\n    if (config.placeholder) {\n      $input.addClass('nicetext');\n    }\n    if (config.type === 'password') {\n      $input.addClass('password');\n    }\n    if (config.disabled) {\n      $input.addClass('disabled');\n    }\n    if (!config.size) {\n      $input.addClass('fullwidth');\n    }\n\n    if (config.showCharsLeft && config.maxlength) {\n      $input\n        .attr('data-show-chars-left')\n        .css(\n          'padding-' + (Craft.orientation === 'ltr' ? 'right' : 'left'),\n          7.2 * config.maxlength.toString().length + 14 + 'px'\n        );\n    }\n\n    if (config.placeholder || config.showCharsLeft) {\n      new Garnish.NiceText($input);\n    }\n\n    if (config.type === 'password') {\n      return $('<div class=\"passwordwrapper\"/>').append($input);\n    } else {\n      return $input;\n    }\n  },\n\n  createTextField: function (config) {\n    if (!config.id) {\n      config.id = 'text' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createTextInput(config), config);\n  },\n\n  createCopyTextInput: function (config) {\n    let id = config.id || 'copytext' + Math.floor(Math.random() * 1000000000);\n    let buttonId = config.buttonId || `${id}-btn`;\n\n    let $container = $('<div/>', {\n      class: 'copytext',\n    });\n\n    let $input = this.createTextInput(\n      $.extend({}, config, {\n        readonly: true,\n      })\n    ).appendTo($container);\n\n    let $btn = $('<button/>', {\n      type: 'button',\n      id: buttonId,\n      class: 'btn',\n      'data-icon': 'clipboard',\n      title: Craft.t('app', 'Copy to clipboard'),\n      'aria-label': Craft.t('app', 'Copy to clipboard'),\n    }).appendTo($container);\n\n    $btn.on('click', () => {\n      $input[0].select();\n      document.execCommand('copy');\n      Craft.cp.displayNotice(Craft.t('app', 'Copied to clipboard.'));\n      $container.trigger('copy');\n      $input[0].setSelectionRange(0, 0);\n    });\n\n    return $container;\n  },\n\n  createCopyTextBtn: function (config) {\n    let id = config.id || 'copytext' + Math.floor(Math.random() * 1000000000);\n    let value = config.value;\n\n    let $btn = $('<div/>', {\n      id,\n      class: 'copytextbtn',\n      role: 'button',\n      title: Craft.t('app', 'Copy to clipboard'),\n      'aria-label': Craft.t('app', 'Copy to clipboard'),\n      tabindex: '0',\n    });\n\n    if (config.class) {\n      $btn.addClass(config.class);\n    }\n\n    let $input = $('<input/>', {\n      value,\n      readonly: true,\n      size: value.length,\n      tabindex: '-1',\n    }).appendTo($btn);\n\n    let $icon = $('<span/>', {\n      'data-icon': 'clipboard',\n      'aria-hidden': 'true',\n    }).appendTo($btn);\n\n    const copyValue = function () {\n      $input[0].select();\n      document.execCommand('copy');\n      Craft.cp.displayNotice(Craft.t('app', 'Copied to clipboard.'));\n      $btn.trigger('copy');\n      $input[0].setSelectionRange(0, 0);\n      $btn.focus();\n    };\n\n    $btn.on('click', () => {\n      copyValue();\n    });\n\n    $btn.on('keydown', (ev) => {\n      if (ev.keyCode === Garnish.SPACE_KEY) {\n        copyValue();\n        ev.preventDefault();\n      }\n    });\n\n    return $btn;\n  },\n\n  createCopyTextField: function (config) {\n    if (!config.id) {\n      config.id = 'copytext' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createCopyTextInput(config), config);\n  },\n\n  createCopyTextPrompt: function (config) {\n    let $container = $('<div/>', {\n      class: 'modal fitted',\n    });\n    let $body = $('<div/>', {\n      class: 'body',\n    }).appendTo($container);\n    this.createCopyTextField(\n      $.extend(\n        {\n          size: Math.max(Math.min(config.value.length, 50), 25),\n        },\n        config\n      )\n    ).appendTo($body);\n\n    const $label = $body.find('label');\n\n    // Provide accessible name for modal dialog\n    if ($label.length > 0 && $label.attr('id')) {\n      $container.attr('aria-labelledby', $label.attr('id'));\n    }\n\n    let modal = new Garnish.Modal($container, {\n      closeOtherModals: false,\n    });\n    $container.on('copy', () => {\n      modal.hide();\n    });\n    return $container;\n  },\n\n  createTextarea: function (config) {\n    var $textarea = $('<textarea/>', {\n      class: 'text',\n      rows: config.rows || 2,\n      cols: config.cols || 50,\n      id: config.id,\n      name: config.name,\n      maxlength: config.maxlength,\n      autofocus: config.autofocus && !Garnish.isMobileBrowser(true),\n      disabled: !!config.disabled,\n      placeholder: config.placeholder,\n      html: config.value,\n    });\n\n    if (config.showCharsLeft) {\n      $textarea.attr('data-show-chars-left', '');\n    }\n\n    if (config.class) {\n      $textarea.addClass(config.class);\n    }\n\n    if (!config.size) {\n      $textarea.addClass('fullwidth');\n    }\n\n    return $textarea;\n  },\n\n  createTextareaField: function (config) {\n    if (!config.id) {\n      config.id = 'textarea' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createTextarea(config), config);\n  },\n\n  createSelect: function (config) {\n    var $container = $('<div/>', {\n      class: 'select',\n    });\n\n    if (config.class) {\n      $container.addClass(config.class);\n    }\n\n    var $select = $('<select/>', {\n      id: config.id,\n      name: config.name,\n      autofocus: config.autofocus && Garnish.isMobileBrowser(true),\n      disabled: config.disabled,\n      'data-target-prefix': config.targetPrefix,\n      'aria-labelledby': config.labelledBy,\n    }).appendTo($container);\n\n    // Normalize the options into an array\n    if ($.isPlainObject(config.options)) {\n      let options = [];\n      for (var key in config.options) {\n        if (!config.options.hasOwnProperty(key)) {\n          continue;\n        }\n        let option = config.options[key];\n        if ($.isPlainObject(option)) {\n          if (typeof option.optgroup !== 'undefined') {\n            options.push(option);\n          } else {\n            options.push({\n              label: option.label,\n              value: typeof option.value !== 'undefined' ? option.value : key,\n              disabled:\n                typeof option.disabled !== 'undefined'\n                  ? option.disabled\n                  : false,\n            });\n          }\n        } else {\n          options.push({\n            label: option,\n            value: key,\n          });\n        }\n      }\n      config.options = options;\n    }\n\n    var $optgroup = null;\n\n    for (let i = 0; i < config.options.length; i++) {\n      let option = config.options[i];\n\n      // Starting a new <optgroup>?\n      if (typeof option.optgroup !== 'undefined') {\n        $optgroup = $('<optgroup/>', {\n          label: option.label,\n        }).appendTo($select);\n      } else {\n        $('<option/>', {\n          value: option.value,\n          selected: option.value == config.value,\n          disabled:\n            typeof option.disabled !== 'undefined' ? option.disabled : false,\n          html: option.label,\n        }).appendTo($optgroup || $select);\n      }\n    }\n\n    if (config.toggle) {\n      $select.addClass('fieldtoggle');\n      new Craft.FieldToggle($select);\n    }\n\n    return $container;\n  },\n\n  createSelectField: function (config) {\n    if (!config.id) {\n      config.id = 'select' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createSelect(config), config);\n  },\n\n  createCheckbox: function (config) {\n    var id = config.id || 'checkbox' + Math.floor(Math.random() * 1000000000);\n\n    var $input = $('<input/>', {\n      type: 'checkbox',\n      value: typeof config.value !== 'undefined' ? config.value : '1',\n      id: id,\n      class: 'checkbox',\n      name: config.name,\n      checked: config.checked ? 'checked' : null,\n      autofocus: this.getAutofocusValue(config.autofocus),\n      disabled: this.getDisabledValue(config.disabled),\n      'data-target': config.toggle,\n      'data-reverse-target': config.reverseToggle,\n    });\n\n    if (config.class) {\n      $input.addClass(config.class);\n    }\n\n    if (config.toggle || config.reverseToggle) {\n      $input.addClass('fieldtoggle');\n      new Craft.FieldToggle($input);\n    }\n\n    var $label = $('<label/>', {\n      for: id,\n      html: config.label,\n    });\n\n    // Should we include a hidden input first?\n    if (\n      config.name &&\n      (config.name.length < 3 || config.name.slice(-2) !== '[]')\n    ) {\n      return $([\n        $('<input/>', {\n          type: 'hidden',\n          name: config.name,\n          value: '',\n        })[0],\n        $input[0],\n        $label[0],\n      ]);\n    } else {\n      return $([$input[0], $label[0]]);\n    }\n  },\n\n  createCheckboxField: function (config) {\n    if (!config.id) {\n      config.id = 'checkbox' + Math.floor(Math.random() * 1000000000);\n    }\n\n    var $field = $('<div class=\"field checkboxfield\"/>', {\n      id: `${config.id}-field`,\n    });\n\n    if (config.first) {\n      $field.addClass('first');\n    }\n    if (config.instructions) {\n      $field.addClass('has-instructions');\n    }\n\n    this.createCheckbox(config).appendTo($field);\n\n    if (config.instructions) {\n      $('<div class=\"instructions\"/>')\n        .text(config.instructions)\n        .appendTo($field);\n    }\n\n    return $field;\n  },\n\n  createCheckboxSelect: function (config) {\n    var $container = $('<fieldset class=\"checkbox-select\"/>');\n\n    if (config.class) {\n      $container.addClass(config.class);\n    }\n\n    var allValue, allChecked;\n\n    if (config.showAllOption) {\n      allValue = config.allValue || '*';\n      allChecked = config.values == allValue;\n\n      // Create the \"All\" checkbox\n      $('<div/>')\n        .appendTo($container)\n        .append(\n          this.createCheckbox({\n            id: config.id,\n            class: 'all',\n            label: '<b>' + (config.allLabel || Craft.t('app', 'All')) + '</b>',\n            name: config.name,\n            value: allValue,\n            checked: allChecked,\n            autofocus: config.autofocus,\n          })\n        );\n    } else {\n      allChecked = false;\n    }\n\n    // Create the actual options\n    for (var i = 0; i < config.options.length; i++) {\n      var option = config.options[i];\n\n      if (option.value == allValue) {\n        continue;\n      }\n\n      $('<div/>')\n        .appendTo($container)\n        .append(\n          this.createCheckbox({\n            label: option.label,\n            name: config.name ? config.name + '[]' : null,\n            value: option.value,\n            checked: allChecked || (config.values || []).includes(option.value),\n            disabled: allChecked,\n          })\n        );\n    }\n\n    new Garnish.CheckboxSelect($container);\n\n    return $container;\n  },\n\n  createCheckboxSelectField: function (config) {\n    config.fieldset = true;\n    if (!config.id) {\n      config.id = 'checkboxselect' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createCheckboxSelect(config), config);\n  },\n\n  createLightswitch: function (config) {\n    var value = config.value || '1';\n    var indeterminateValue = config.indeterminateValue || '-';\n\n    var $container = $('<button/>', {\n      type: 'button',\n      class: 'lightswitch',\n      'data-value': value,\n      'data-indeterminate-value': indeterminateValue,\n      id: config.id,\n      role: 'switch',\n      'aria-checked': config.on\n        ? 'true'\n        : config.indeterminate\n        ? 'mixed'\n        : 'false',\n      'aria-labelledby': config.labelId,\n      'data-target': config.toggle,\n      'data-reverse-target': config.reverseToggle,\n    });\n\n    if (config.on) {\n      $container.addClass('on');\n    } else if (config.indeterminate) {\n      $container.addClass('indeterminate');\n    }\n\n    if (config.small) {\n      $container.addClass('small');\n    }\n\n    if (config.disabled) {\n      $container.addClass('disabled');\n    }\n\n    $(\n      '<div class=\"lightswitch-container\">' +\n        '<div class=\"handle\"></div>' +\n        '</div>'\n    ).appendTo($container);\n\n    if (config.name) {\n      $('<input/>', {\n        type: 'hidden',\n        name: config.name,\n        value: config.on\n          ? value\n          : config.indeterminate\n          ? indeterminateValue\n          : '',\n        disabled: config.disabled,\n      }).appendTo($container);\n    }\n\n    if (config.toggle || config.reverseToggle) {\n      $container.addClass('fieldtoggle');\n      new Craft.FieldToggle($container);\n    }\n\n    new Craft.LightSwitch($container, {\n      onChange: config.onChange || $.noop,\n    });\n\n    return $container;\n  },\n\n  createLightswitchField: function (config) {\n    if (!config.id) {\n      config.id = 'lightswitch' + Math.floor(Math.random() * 1000000000);\n    }\n    if (!config.labelId) {\n      config.labelId = `${config.id}-label`;\n    }\n    return this.createField(this.createLightswitch(config), config).addClass(\n      'lightswitch-field'\n    );\n  },\n\n  createColorInput: function (config) {\n    const id = config.id || 'color' + Math.floor(Math.random() * 1000000000);\n    const containerId = config.containerId || id + '-container';\n    const name = config.name || null;\n    const value = config.value || null;\n    const small = config.small || false;\n    const autofocus = config.autofocus && Garnish.isMobileBrowser(true);\n    const disabled = config.disabled || false;\n\n    const $container = $('<div/>', {\n      id: containerId,\n      class: 'flex color-container',\n    });\n\n    const $colorPreviewContainer = $('<div/>', {\n      class: 'color static' + (small ? ' small' : ''),\n    }).appendTo($container);\n\n    const $colorPreview = $('<div/>', {\n      class: 'color-preview',\n      style: config.value ? {backgroundColor: config.value} : null,\n    }).appendTo($colorPreviewContainer);\n\n    const $inputContainer = $('<div/>', {\n      class: 'color-input-container',\n    })\n      .append(\n        $('<div/>', {\n          class: 'color-hex-indicator light code',\n          'aria-hidden': 'true',\n          text: '#',\n        })\n      )\n      .appendTo($container);\n\n    const $input = this.createTextInput({\n      id: id,\n      name: name,\n      value: Craft.ltrim(value, '#'),\n      size: 10,\n      class: 'color-input',\n      autofocus: autofocus,\n      disabled: disabled,\n      'aria-label': Craft.t('app', 'Color hex value'),\n    }).appendTo($inputContainer);\n\n    new Craft.ColorInput($container);\n    return $container;\n  },\n\n  createColorField: function (config) {\n    config.fieldset = true;\n    o;\n    if (!config.id) {\n      config.id = 'color' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createColorInput(config), config);\n  },\n\n  createDateInput: function (config) {\n    const isMobile = Garnish.isMobileBrowser();\n    const id =\n      (config.id || 'date' + Math.floor(Math.random() * 1000000000)) + '-date';\n    const name = config.name || null;\n    const inputName = name ? name + '[date]' : null;\n    const value =\n      config.value && typeof config.value.getMonth === 'function'\n        ? config.value\n        : null;\n    const autofocus = config.autofocus && Garnish.isMobileBrowser(true);\n    const disabled = config.disabled || false;\n\n    const $container = $('<div/>', {\n      class: 'datewrapper',\n    });\n\n    const $input = this.createTextInput({\n      id: id,\n      type: isMobile ? 'date' : 'text',\n      class: isMobile && !value ? 'empty-value' : false,\n      name: inputName,\n      value: value\n        ? isMobile\n          ? value.toISOString().split('T')[0]\n          : Craft.formatDate(value)\n        : '',\n      placeholder: ' ',\n      autocomplete: false,\n      autofocus: autofocus,\n      disabled: disabled,\n    }).appendTo($container);\n\n    $('<div data-icon=\"date\"></div>').appendTo($container);\n\n    if (name) {\n      $('<input/>', {\n        type: 'hidden',\n        name: name + '[timezone]',\n        val: Craft.timezone,\n      }).appendTo($container);\n    }\n\n    if (isMobile) {\n      $input.datetimeinput();\n    } else {\n      $input.datepicker(\n        $.extend(\n          {\n            defaultDate: value || new Date(),\n          },\n          Craft.datepickerOptions\n        )\n      );\n    }\n\n    if (config.hasOuterContainer) {\n      return $container;\n    }\n\n    return $('<div class=\"datetimewrapper\"/>').append($container).datetime();\n  },\n\n  createDateField: function (config) {\n    if (!config.id) {\n      config.id = 'date' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createDateInput(config), config);\n  },\n\n  createDateRangePicker: function (config) {\n    var now = new Date();\n    var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n    config = $.extend(\n      {\n        class: '',\n        options: [\n          'today',\n          'thisWeek',\n          'thisMonth',\n          'thisYear',\n          'past7Days',\n          'past30Days',\n          'past90Days',\n          'pastYear',\n        ],\n        onChange: $.noop,\n        selected: null,\n        startDate: null,\n        endDate: null,\n      },\n      config\n    );\n\n    var $menu = $('<div/>', {class: 'menu'});\n    var $ul = $('<ul/>', {class: 'padded'}).appendTo($menu);\n    var $allOption = $('<a/>')\n      .addClass('sel')\n      .text(Craft.t('app', 'All'))\n      .data('handle', 'all');\n\n    $('<li/>').append($allOption).appendTo($ul);\n\n    var option;\n    var selectedOption;\n    for (var i = 0; i < config.options.length; i++) {\n      var handle = config.options[i];\n      switch (handle) {\n        case 'today':\n          option = {\n            label: Craft.t('app', 'Today'),\n            startDate: today,\n            endDate: today,\n          };\n          break;\n        case 'thisWeek':\n          var firstDayOffset = now.getDay() - Craft.datepickerOptions.firstDay;\n          if (firstDayOffset < 0) {\n            firstDayOffset += 7;\n          }\n          option = {\n            label: Craft.t('app', 'This week'),\n            startDate: new Date(\n              now.getFullYear(),\n              now.getMonth(),\n              now.getDate() - firstDayOffset\n            ),\n            endDate: today,\n          };\n          break;\n        case 'thisMonth':\n          option = {\n            label: Craft.t('app', 'This month'),\n            startDate: new Date(now.getFullYear(), now.getMonth()),\n            endDate: today,\n          };\n          break;\n        case 'thisYear':\n          option = {\n            label: Craft.t('app', 'This year'),\n            startDate: new Date(now.getFullYear(), 0),\n            endDate: today,\n          };\n          break;\n        case 'past7Days':\n          option = {\n            label: Craft.t('app', 'Past {num} days', {num: 7}),\n            startDate: new Date(\n              now.getFullYear(),\n              now.getMonth(),\n              now.getDate() - 7\n            ),\n            endDate: today,\n          };\n          break;\n        case 'past30Days':\n          option = {\n            label: Craft.t('app', 'Past {num} days', {num: 30}),\n            startDate: new Date(\n              now.getFullYear(),\n              now.getMonth(),\n              now.getDate() - 30\n            ),\n            endDate: today,\n          };\n          break;\n        case 'past90Days':\n          option = {\n            label: Craft.t('app', 'Past {num} days', {num: 90}),\n            startDate: new Date(\n              now.getFullYear(),\n              now.getMonth(),\n              now.getDate() - 90\n            ),\n            endDate: today,\n          };\n          break;\n        case 'pastYear':\n          option = {\n            label: Craft.t('app', 'Past year'),\n            startDate: new Date(\n              now.getFullYear(),\n              now.getMonth(),\n              now.getDate() - 365\n            ),\n            endDate: today,\n          };\n          break;\n      }\n\n      var $li = $('<li/>');\n      var $a = $('<a/>', {text: option.label})\n        .data('handle', handle)\n        .data('startDate', option.startDate)\n        .data('endDate', option.endDate)\n        .data('startTime', option.startDate ? option.startDate.getTime() : null)\n        .data('endTime', option.endDate ? option.endDate.getTime() : null);\n\n      if (config.selected && handle == config.selected) {\n        selectedOption = $a[0];\n      }\n\n      $li.append($a);\n      $li.appendTo($ul);\n    }\n\n    $('<hr/>').appendTo($menu);\n\n    var $flex = $('<div/>', {class: 'flex flex-nowrap padded'}).appendTo($menu);\n    var $startDate = this.createDateField({label: Craft.t('app', 'From')})\n      .appendTo($flex)\n      .find('input');\n    var $endDate = this.createDateField({label: Craft.t('app', 'To')})\n      .appendTo($flex)\n      .find('input');\n\n    // prevent ESC keypresses in the date inputs from closing the menu\n    var $dateInputs = $startDate.add($endDate);\n    $dateInputs.on('keyup', function (ev) {\n      if (\n        ev.keyCode === Garnish.ESC_KEY &&\n        $(this).data('datepicker') &&\n        $(this).data('datepicker').dpDiv.is(':visible')\n      ) {\n        ev.stopPropagation();\n      }\n    });\n\n    // prevent clicks in the datepicker divs from closing the menu\n    if ($startDate.data('datepicker')) {\n      $startDate.data('datepicker').dpDiv.on('mousedown', function (ev) {\n        ev.stopPropagation();\n      });\n    }\n    if ($endDate.data('datepicker')) {\n      $endDate.data('datepicker').dpDiv.on('mousedown', function (ev) {\n        ev.stopPropagation();\n      });\n    }\n\n    var menu = new Garnish.Menu($menu, {\n      onOptionSelect: function (option) {\n        var $option = $(option);\n        $btn.text($option.text());\n        menu.setPositionRelativeToAnchor();\n        $menu.find('.sel').removeClass('sel');\n        $option.addClass('sel');\n\n        // Update the start/end dates\n        $startDate.datepicker('setDate', $option.data('startDate'));\n        $endDate.datepicker('setDate', $option.data('endDate'));\n\n        config.onChange(\n          $option.data('startDate') || null,\n          $option.data('endDate') || null,\n          $option.data('handle')\n        );\n      },\n    });\n\n    $dateInputs.on('change', function () {\n      // Do the start & end dates match one of our options?\n      let startDate = $startDate.datepicker('getDate');\n      let endDate = $endDate.datepicker('getDate');\n      let startTime = startDate ? startDate.getTime() : null;\n      let endTime = endDate ? endDate.getTime() : null;\n\n      let $options = $ul.find('a');\n      let $option;\n      let foundOption = false;\n\n      for (let i = 0; i < $options.length; i++) {\n        $option = $options.eq(i);\n        if (\n          startTime === ($option.data('startTime') || null) &&\n          endTime === ($option.data('endTime') || null)\n        ) {\n          menu.selectOption($option[0]);\n          foundOption = true;\n          config.onChange(null, null, $option.data('handle'));\n          break;\n        }\n      }\n\n      if (!foundOption) {\n        $menu.find('.sel').removeClass('sel');\n        $flex.addClass('sel');\n\n        if (!startTime && !endTime) {\n          $btn.text(Craft.t('app', 'All'));\n        } else if (startTime && endTime) {\n          $btn.text($startDate.val() + ' - ' + $endDate.val());\n        } else if (startTime) {\n          $btn.text(Craft.t('app', 'From {date}', {date: $startDate.val()}));\n        } else {\n          $btn.text(Craft.t('app', 'To {date}', {date: $endDate.val()}));\n        }\n        menu.setPositionRelativeToAnchor();\n\n        config.onChange(startDate, endDate, 'custom');\n      }\n    });\n\n    menu.on('hide', function () {\n      $startDate.datepicker('hide');\n      $endDate.datepicker('hide');\n    });\n\n    let btnClasses = 'btn menubtn';\n    if (config.class) {\n      btnClasses = btnClasses + ' ' + config.class;\n    }\n\n    let $btn = $('<button/>', {\n      type: 'button',\n      class: btnClasses,\n      'data-icon': 'date',\n      text: Craft.t('app', 'All'),\n    });\n\n    new Garnish.MenuBtn($btn, menu);\n\n    if (selectedOption) {\n      menu.selectOption(selectedOption);\n    }\n\n    if (config.startDate) {\n      $startDate.datepicker('setDate', config.startDate);\n    }\n\n    if (config.endDate) {\n      $endDate.datepicker('setDate', config.endDate);\n    }\n\n    if (config.startDate || config.endDate) {\n      $dateInputs.trigger('change');\n    }\n\n    return $btn;\n  },\n\n  createTimeInput: function (config) {\n    const isMobile = Garnish.isMobileBrowser();\n    const id =\n      (config.id || 'time' + Math.floor(Math.random() * 1000000000)) + '-time';\n    const name = config.name || null;\n    const inputName = name ? name + '[time]' : null;\n    const value =\n      config.value && typeof config.value.getMonth === 'function'\n        ? config.value\n        : null;\n    const autofocus = config.autofocus && Garnish.isMobileBrowser(true);\n    const disabled = config.disabled || false;\n\n    const $container = $('<div/>', {\n      class: 'timewrapper',\n    });\n\n    const $input = this.createTextInput({\n      id: id,\n      type: isMobile ? 'time' : 'text',\n      class: isMobile && !value ? 'empty-value' : false,\n      name: inputName,\n      placeholder: ' ',\n      autocomplete: false,\n      autofocus: autofocus,\n      disabled: disabled,\n    }).appendTo($container);\n\n    $('<div data-icon=\"time\"></div>').appendTo($container);\n\n    if (name) {\n      $('<input/>', {\n        type: 'hidden',\n        name: name + '[timezone]',\n        val: Craft.timezone,\n      }).appendTo($container);\n    }\n\n    if (isMobile) {\n      if (value) {\n        $input.val(value.toISOString().split('T')[1]);\n      }\n      $input.datetimeinput();\n    } else {\n      $input.timepicker(Craft.timepickerOptions);\n      if (value) {\n        $input.timepicker(\n          'setTime',\n          value.getHours() * 3600 + value.getMinutes() * 60 + value.getSeconds()\n        );\n      }\n    }\n\n    if (config.hasOuterContainer) {\n      return $container;\n    }\n\n    return $('<div class=\"datetimewrapper\"/>').append($container).datetime();\n  },\n\n  createTimeField: function (config) {\n    if (!config.id) {\n      config.id = 'time' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createTimeInput(config), config);\n  },\n\n  createField: function (input, config) {\n    const label =\n      config.label && config.label !== '__blank__' ? config.label : null;\n\n    const $field = $(config.fieldset ? '<fieldset/>' : '<div/>', {\n      class: 'field',\n      id: config.fieldId || (config.id ? config.id + '-field' : null),\n    });\n\n    if (config.first) {\n      $field.addClass('first');\n    }\n\n    if (config.fieldClass) {\n      $field.addClass(config.fieldClass);\n    }\n\n    if (label && config.fieldset) {\n      $('<legend/>', {\n        text: label,\n        class: 'visually-hidden',\n        'data-label': label,\n      }).appendTo($field);\n    }\n\n    if (label) {\n      const $heading = $('<div class=\"heading\"/>').appendTo($field);\n\n      $(config.fieldset ? '<legend/>' : '<label/>', {\n        id:\n          config.labelId ||\n          (config.id\n            ? `${config.id}-${config.fieldset ? 'legend' : 'label'}`\n            : null),\n        class: config.required ? 'required' : null,\n        for: (!config.fieldset && config.id) || null,\n        text: label,\n      }).appendTo($heading);\n    }\n\n    if (config.instructions) {\n      $('<div class=\"instructions\"/>')\n        .text(config.instructions)\n        .appendTo($field);\n    }\n\n    $('<div class=\"input\"/>').append(input).appendTo($field);\n\n    if (config.tip) {\n      const $tip = $('<p class=\"notice has-icon\"/>');\n      $('<span class=\"icon\" aria-hidden=\"true\"/>').appendTo($tip);\n      $('<span class=\"visually-hidden\"/>')\n        .text(Craft.t('app', 'Tip') + ': ')\n        .appendTo($tip);\n      $('<span/>').text(config.tip).appendTo($tip);\n      $tip.appendTo($field);\n    }\n\n    if (config.warning) {\n      const $warning = $('<p class=\"warning has-icon\"/>');\n      $('<span class=\"icon\" aria-hidden=\"true\"/>').appendTo($warning);\n      $('<span class=\"visually-hidden\"/>')\n        .text(Craft.t('app', 'Warning') + ': ')\n        .appendTo($warning);\n      $('<span/>').text(config.warning).appendTo($warning);\n      $warning.appendTo($field);\n    }\n\n    if (config.errors) {\n      this.addErrorsToField($field, config.errors);\n    }\n\n    return $field;\n  },\n\n  createErrorList: function (errors) {\n    var $list = $('<ul class=\"errors\"/>');\n\n    if (errors) {\n      this.addErrorsToList($list, errors);\n    }\n\n    return $list;\n  },\n\n  addErrorsToList: function ($list, errors) {\n    for (var i = 0; i < errors.length; i++) {\n      $('<li/>').text(errors[i]).appendTo($list);\n    }\n  },\n\n  addErrorsToField: function ($field, errors) {\n    if (!errors) {\n      return;\n    }\n\n    $field.addClass('has-errors');\n    $field.children('.input').addClass('errors');\n\n    var $errors = $field.children('ul.errors');\n\n    if (!$errors.length) {\n      $errors = this.createErrorList().appendTo($field);\n    }\n\n    this.addErrorsToList($errors, errors);\n  },\n\n  clearErrorsFromField: function ($field) {\n    $field.removeClass('has-errors');\n    $field.children('.input').removeClass('errors');\n    $field.children('ul.errors').remove();\n  },\n\n  getAutofocusValue: function (autofocus) {\n    return autofocus && !Garnish.isMobileBrowser(true) ? 'autofocus' : null;\n  },\n\n  getDisabledValue: function (disabled) {\n    return disabled ? 'disabled' : null;\n  },\n};\n","/** global: Craft */\n/** global: Garnish */\n/**\n * File Manager.\n */\nCraft.Uploader = Garnish.Base.extend(\n  {\n    uploader: null,\n    allowedKinds: null,\n    $element: null,\n    settings: null,\n    _rejectedFiles: {},\n    _extensionList: null,\n    _totalFileCounter: 0,\n    _validFileCounter: 0,\n\n    init: function ($element, settings) {\n      this._rejectedFiles = {size: [], type: [], limit: []};\n      this.$element = $element;\n      this.allowedKinds = null;\n      this._extensionList = null;\n      this._totalFileCounter = 0;\n      this._validFileCounter = 0;\n\n      settings = $.extend({}, Craft.Uploader.defaults, settings);\n\n      var events = settings.events;\n      delete settings.events;\n\n      if (settings.allowedKinds && settings.allowedKinds.length) {\n        if (typeof settings.allowedKinds === 'string') {\n          settings.allowedKinds = [settings.allowedKinds];\n        }\n\n        this.allowedKinds = settings.allowedKinds;\n        delete settings.allowedKinds;\n      }\n\n      settings.autoUpload = false;\n\n      this.uploader = this.$element.fileupload(settings);\n      for (var event in events) {\n        if (!events.hasOwnProperty(event)) {\n          continue;\n        }\n\n        this.uploader.on(event, events[event]);\n      }\n\n      this.settings = settings;\n\n      this.uploader.on('fileuploadadd', this.onFileAdd.bind(this));\n    },\n\n    /**\n     * Set uploader parameters.\n     */\n    setParams: function (paramObject) {\n      // If CSRF protection isn't enabled, these won't be defined.\n      if (\n        typeof Craft.csrfTokenName !== 'undefined' &&\n        typeof Craft.csrfTokenValue !== 'undefined'\n      ) {\n        // Add the CSRF token\n        paramObject[Craft.csrfTokenName] = Craft.csrfTokenValue;\n      }\n\n      this.uploader.fileupload('option', {formData: paramObject});\n    },\n\n    /**\n     * Get the number of uploads in progress.\n     */\n    getInProgress: function () {\n      return this.uploader.fileupload('active');\n    },\n\n    /**\n     * Return true, if this is the last upload.\n     */\n    isLastUpload: function () {\n      // Processing the last file or not processing at all.\n      return this.getInProgress() < 2;\n    },\n\n    /**\n     * Called on file add.\n     */\n    onFileAdd: function (e, data) {\n      e.stopPropagation();\n\n      var validateExtension = false;\n\n      if (this.allowedKinds) {\n        if (!this._extensionList) {\n          this._createExtensionList();\n        }\n\n        validateExtension = true;\n      }\n\n      // Make sure that file API is there before relying on it\n      data.process().done(() => {\n        var file = data.files[0];\n        var pass = true;\n        if (validateExtension) {\n          var matches = file.name.match(/\\.([a-z0-4_]+)$/i);\n          var fileExtension = matches[1];\n          if (\n            $.inArray(fileExtension.toLowerCase(), this._extensionList) === -1\n          ) {\n            pass = false;\n            this._rejectedFiles.type.push('“' + file.name + '”');\n          }\n        }\n\n        if (file.size > this.settings.maxFileSize) {\n          this._rejectedFiles.size.push('“' + file.name + '”');\n          pass = false;\n        }\n\n        // If the validation has passed for this file up to now, check if we're not hitting any limits\n        if (\n          pass &&\n          typeof this.settings.canAddMoreFiles === 'function' &&\n          !this.settings.canAddMoreFiles(this._validFileCounter)\n        ) {\n          this._rejectedFiles.limit.push('“' + file.name + '”');\n          pass = false;\n        }\n\n        if (pass) {\n          this._validFileCounter++;\n          data.submit();\n        }\n\n        if (++this._totalFileCounter === data.originalFiles.length) {\n          this._totalFileCounter = 0;\n          this._validFileCounter = 0;\n          this.processErrorMessages();\n        }\n      });\n\n      return true;\n    },\n\n    /**\n     * Process error messages.\n     */\n    processErrorMessages: function () {\n      var str;\n\n      if (this._rejectedFiles.type.length) {\n        if (this._rejectedFiles.type.length === 1) {\n          str =\n            'The file {files} could not be uploaded. The allowed file kinds are: {kinds}.';\n        } else {\n          str =\n            'The files {files} could not be uploaded. The allowed file kinds are: {kinds}.';\n        }\n\n        str = Craft.t('app', str, {\n          files: this._rejectedFiles.type.join(', '),\n          kinds: this.allowedKinds.join(', '),\n        });\n        this._rejectedFiles.type = [];\n        alert(str);\n      }\n\n      if (this._rejectedFiles.size.length) {\n        if (this._rejectedFiles.size.length === 1) {\n          str =\n            'The file {files} could not be uploaded, because it exceeds the maximum upload size of {size}.';\n        } else {\n          str =\n            'The files {files} could not be uploaded, because they exceeded the maximum upload size of {size}.';\n        }\n\n        str = Craft.t('app', str, {\n          files: this._rejectedFiles.size.join(', '),\n          size: this.humanFileSize(Craft.maxUploadSize),\n        });\n        this._rejectedFiles.size = [];\n        alert(str);\n      }\n\n      if (this._rejectedFiles.limit.length) {\n        if (this._rejectedFiles.limit.length === 1) {\n          str =\n            'The file {files} could not be uploaded, because the field limit has been reached.';\n        } else {\n          str =\n            'The files {files} could not be uploaded, because the field limit has been reached.';\n        }\n\n        str = Craft.t('app', str, {\n          files: this._rejectedFiles.limit.join(', '),\n        });\n        this._rejectedFiles.limit = [];\n        alert(str);\n      }\n    },\n\n    humanFileSize: function (bytes) {\n      var threshold = 1024;\n\n      if (bytes < threshold) {\n        return bytes + ' B';\n      }\n\n      var units = ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n      var u = -1;\n\n      do {\n        bytes = bytes / threshold;\n        ++u;\n      } while (bytes >= threshold);\n\n      return bytes.toFixed(1) + ' ' + units[u];\n    },\n\n    _createExtensionList: function () {\n      this._extensionList = [];\n\n      for (var i = 0; i < this.allowedKinds.length; i++) {\n        var allowedKind = this.allowedKinds[i];\n\n        if (typeof Craft.fileKinds[allowedKind] !== 'undefined') {\n          for (\n            var j = 0;\n            j < Craft.fileKinds[allowedKind].extensions.length;\n            j++\n          ) {\n            var ext = Craft.fileKinds[allowedKind].extensions[j];\n            this._extensionList.push(ext);\n          }\n        }\n      }\n    },\n\n    destroy: function () {\n      this.$element.fileupload('destroy');\n      this.base();\n    },\n  },\n  {\n    defaults: {\n      dropZone: null,\n      pasteZone: null,\n      fileInput: null,\n      sequentialUploads: true,\n      maxFileSize: Craft.maxUploadSize,\n      allowedKinds: null,\n      events: {},\n      canAddMoreFiles: null,\n      headers: {Accept: 'application/json;q=0.9,*/*;q=0.8'},\n      paramName: 'assets-upload',\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Handle Generator\n */\nCraft.UriFormatGenerator = Craft.BaseInputGenerator.extend({\n  generateTargetValue: function (sourceVal) {\n    // Remove HTML tags\n    sourceVal = sourceVal.replace('/<(.*?)>/g', '');\n\n    // Make it lowercase\n    sourceVal = sourceVal.toLowerCase();\n\n    // Convert extended ASCII characters to basic ASCII\n    sourceVal = Craft.asciiString(sourceVal);\n\n    // Handle must start with a letter and end with a letter/number\n    sourceVal = sourceVal.replace(/^[^a-z]+/, '');\n    sourceVal = sourceVal.replace(/[^a-z0-9]+$/, '');\n\n    // Get the \"words\"\n    var words = Craft.filterArray(sourceVal.split(/[^a-z0-9]+/));\n\n    var uriFormat = words.join(Craft.slugWordSeparator);\n\n    if (uriFormat && this.settings.suffix) {\n      uriFormat += this.settings.suffix;\n    }\n\n    return uriFormat;\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * User index class\n */\nCraft.UserIndex = Craft.BaseElementIndex.extend({\n  init: function (elementType, $container, settings) {\n    this.on('selectSource', this.updateUrl.bind(this));\n    this.base(elementType, $container, settings);\n  },\n\n  getDefaultSourceKey: function () {\n    // Did they request a specific group in the URL?\n    if (\n      this.settings.context === 'index' &&\n      typeof defaultSourceSlug !== 'undefined'\n    ) {\n      for (let i = 0; i < this.$sources.length; i++) {\n        const $source = $(this.$sources[i]);\n        if ($source.data('slug') === defaultSourceSlug) {\n          return $source.data('key');\n        }\n      }\n    }\n\n    return this.base();\n  },\n\n  updateUrl: function () {\n    if (this.settings.context === 'index') {\n      let uri = 'users';\n      const slug = this.$source.data('slug');\n      if (slug) {\n        uri += `/${slug}`;\n      }\n      Craft.setPath(uri);\n    }\n  },\n});\n\n// Register it!\nCraft.registerElementIndexClass('craft\\\\elements\\\\User', Craft.UserIndex);\n","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ruleSet[1].rules[3].use[1]!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[3]!../../../../../../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[4]!./charts.scss\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"3790022a\", content, true, {});","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ruleSet[1].rules[3].use[1]!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[3]!../../../../../../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[4]!./craft.scss\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"80058a3c\", content, true, {});","/**\n * Translates the list format produced by css-loader into something\n * easier to manipulate.\n */\nexport default function listToStyles (parentId, list) {\n  var styles = []\n  var newStyles = {}\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i]\n    var id = item[0]\n    var css = item[1]\n    var media = item[2]\n    var sourceMap = item[3]\n    var part = {\n      id: parentId + ':' + i,\n      css: css,\n      media: media,\n      sourceMap: sourceMap\n    }\n    if (!newStyles[id]) {\n      styles.push(newStyles[id] = { id: id, parts: [part] })\n    } else {\n      newStyles[id].parts.push(part)\n    }\n  }\n  return styles\n}\n","/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n  Modified by Evan You @yyx990803\n*/\n\nimport listToStyles from './listToStyles'\n\nvar hasDocument = typeof document !== 'undefined'\n\nif (typeof DEBUG !== 'undefined' && DEBUG) {\n  if (!hasDocument) {\n    throw new Error(\n    'vue-style-loader cannot be used in a non-browser environment. ' +\n    \"Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.\"\n  ) }\n}\n\n/*\ntype StyleObject = {\n  id: number;\n  parts: Array<StyleObjectPart>\n}\n\ntype StyleObjectPart = {\n  css: string;\n  media: string;\n  sourceMap: ?string\n}\n*/\n\nvar stylesInDom = {/*\n  [id: number]: {\n    id: number,\n    refs: number,\n    parts: Array<(obj?: StyleObjectPart) => void>\n  }\n*/}\n\nvar head = hasDocument && (document.head || document.getElementsByTagName('head')[0])\nvar singletonElement = null\nvar singletonCounter = 0\nvar isProduction = false\nvar noop = function () {}\nvar options = null\nvar ssrIdKey = 'data-vue-ssr-id'\n\n// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n// tags it will allow on a page\nvar isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\\b/.test(navigator.userAgent.toLowerCase())\n\nexport default function addStylesClient (parentId, list, _isProduction, _options) {\n  isProduction = _isProduction\n\n  options = _options || {}\n\n  var styles = listToStyles(parentId, list)\n  addStylesToDom(styles)\n\n  return function update (newList) {\n    var mayRemove = []\n    for (var i = 0; i < styles.length; i++) {\n      var item = styles[i]\n      var domStyle = stylesInDom[item.id]\n      domStyle.refs--\n      mayRemove.push(domStyle)\n    }\n    if (newList) {\n      styles = listToStyles(parentId, newList)\n      addStylesToDom(styles)\n    } else {\n      styles = []\n    }\n    for (var i = 0; i < mayRemove.length; i++) {\n      var domStyle = mayRemove[i]\n      if (domStyle.refs === 0) {\n        for (var j = 0; j < domStyle.parts.length; j++) {\n          domStyle.parts[j]()\n        }\n        delete stylesInDom[domStyle.id]\n      }\n    }\n  }\n}\n\nfunction addStylesToDom (styles /* Array<StyleObject> */) {\n  for (var i = 0; i < styles.length; i++) {\n    var item = styles[i]\n    var domStyle = stylesInDom[item.id]\n    if (domStyle) {\n      domStyle.refs++\n      for (var j = 0; j < domStyle.parts.length; j++) {\n        domStyle.parts[j](item.parts[j])\n      }\n      for (; j < item.parts.length; j++) {\n        domStyle.parts.push(addStyle(item.parts[j]))\n      }\n      if (domStyle.parts.length > item.parts.length) {\n        domStyle.parts.length = item.parts.length\n      }\n    } else {\n      var parts = []\n      for (var j = 0; j < item.parts.length; j++) {\n        parts.push(addStyle(item.parts[j]))\n      }\n      stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }\n    }\n  }\n}\n\nfunction createStyleElement () {\n  var styleElement = document.createElement('style')\n  styleElement.type = 'text/css'\n  head.appendChild(styleElement)\n  return styleElement\n}\n\nfunction addStyle (obj /* StyleObjectPart */) {\n  var update, remove\n  var styleElement = document.querySelector('style[' + ssrIdKey + '~=\"' + obj.id + '\"]')\n\n  if (styleElement) {\n    if (isProduction) {\n      // has SSR styles and in production mode.\n      // simply do nothing.\n      return noop\n    } else {\n      // has SSR styles but in dev mode.\n      // for some reason Chrome can't handle source map in server-rendered\n      // style tags - source maps in <style> only works if the style tag is\n      // created and inserted dynamically. So we remove the server rendered\n      // styles and inject new ones.\n      styleElement.parentNode.removeChild(styleElement)\n    }\n  }\n\n  if (isOldIE) {\n    // use singleton mode for IE9.\n    var styleIndex = singletonCounter++\n    styleElement = singletonElement || (singletonElement = createStyleElement())\n    update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)\n    remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)\n  } else {\n    // use multi-style-tag mode in all other cases\n    styleElement = createStyleElement()\n    update = applyToTag.bind(null, styleElement)\n    remove = function () {\n      styleElement.parentNode.removeChild(styleElement)\n    }\n  }\n\n  update(obj)\n\n  return function updateStyle (newObj /* StyleObjectPart */) {\n    if (newObj) {\n      if (newObj.css === obj.css &&\n          newObj.media === obj.media &&\n          newObj.sourceMap === obj.sourceMap) {\n        return\n      }\n      update(obj = newObj)\n    } else {\n      remove()\n    }\n  }\n}\n\nvar replaceText = (function () {\n  var textStore = []\n\n  return function (index, replacement) {\n    textStore[index] = replacement\n    return textStore.filter(Boolean).join('\\n')\n  }\n})()\n\nfunction applyToSingletonTag (styleElement, index, remove, obj) {\n  var css = remove ? '' : obj.css\n\n  if (styleElement.styleSheet) {\n    styleElement.styleSheet.cssText = replaceText(index, css)\n  } else {\n    var cssNode = document.createTextNode(css)\n    var childNodes = styleElement.childNodes\n    if (childNodes[index]) styleElement.removeChild(childNodes[index])\n    if (childNodes.length) {\n      styleElement.insertBefore(cssNode, childNodes[index])\n    } else {\n      styleElement.appendChild(cssNode)\n    }\n  }\n}\n\nfunction applyToTag (styleElement, obj) {\n  var css = obj.css\n  var media = obj.media\n  var sourceMap = obj.sourceMap\n\n  if (media) {\n    styleElement.setAttribute('media', media)\n  }\n  if (options.ssrId) {\n    styleElement.setAttribute(ssrIdKey, obj.id)\n  }\n\n  if (sourceMap) {\n    // https://developer.chrome.com/devtools/docs/javascript-debugging\n    // this makes source maps inside style tags work properly in Chrome\n    css += '\\n/*# sourceURL=' + sourceMap.sources[0] + ' */'\n    // http://stackoverflow.com/a/26603875\n    css += '\\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'\n  }\n\n  if (styleElement.styleSheet) {\n    styleElement.styleSheet.cssText = css\n  } else {\n    while (styleElement.firstChild) {\n      styleElement.removeChild(styleElement.firstChild)\n    }\n    styleElement.appendChild(document.createTextNode(css))\n  }\n}\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 = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(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 = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var __WEBPACK_NAMESPACE_OBJECT__ = jQuery;","/** global: Craft */\n/** global: Garnish */\nimport $ from 'jquery';\n\n/**\n * CP class\n */\nCraft.CP = Garnish.Base.extend(\n  {\n    authManager: null,\n\n    $nav: null,\n    $navToggle: null,\n    $globalSidebar: null,\n    $globalContainer: null,\n    $mainContainer: null,\n    $alerts: null,\n    $crumbs: null,\n    $breadcrumbList: null,\n    $breadcrumbItems: null,\n    $notificationContainer: null,\n    $main: null,\n    $primaryForm: null,\n    $headerContainer: null,\n    $header: null,\n    $mainContent: null,\n    $details: null,\n    $sidebarContainer: null,\n    $sidebarToggle: null,\n    $sidebar: null,\n    $contentContainer: null,\n    $edition: null,\n\n    $confirmUnloadForms: null,\n    $deltaForms: null,\n    $collapsibleTables: null,\n\n    isMobile: null,\n    fixedHeader: false,\n\n    breadcrumbListWidth: 0,\n    breadcrumbDisclosureItem: `<li class=\"breadcrumb-toggle-wrapper\" data-disclosure-item><button data-disclosure-trigger aria-controls=\"breadcrumb-disclosure\" aria-haspopup=\"true\">${Craft.t(\n      'app',\n      'More…'\n    )}</button><div id=\"breadcrumb-disclosure\" class=\"menu menu--disclosure\" data-disclosure-menu><ul></ul></div></li>`,\n\n    tabManager: null,\n\n    enableQueue: true,\n    totalJobs: 0,\n    jobInfo: null,\n    displayedJobInfo: null,\n    displayedJobInfoUnchanged: 1,\n    trackJobProgressTimeout: null,\n    jobProgressIcon: null,\n\n    checkingForUpdates: false,\n    forcingRefreshOnUpdatesCheck: false,\n    includingDetailsOnUpdatesCheck: false,\n    checkForUpdatesCallbacks: null,\n\n    resizeTimeout: null,\n\n    init: function () {\n      // Is this session going to expire?\n      if (Craft.remainingSessionTime !== 0) {\n        this.authManager = new Craft.AuthManager();\n      }\n\n      // Find all the key elements\n      this.$nav = $('#nav');\n      this.$navToggle = $('#primary-nav-toggle');\n      this.$globalSidebar = $('#global-sidebar');\n      this.$globalContainer = $('#global-container');\n      this.$mainContainer = $('#main-container');\n      this.$alerts = $('#alerts');\n      this.$crumbs = $('#crumbs');\n      this.$breadcrumbList = $('.breadcrumb-list');\n      this.$breadcrumbItems = $('.breadcrumb-list li');\n      this.$notificationContainer = $('#notifications');\n      this.$main = $('#main');\n      this.$primaryForm = $('#main-form');\n      this.$headerContainer = $('#header-container');\n      this.$header = $('#header');\n      this.$mainContent = $('#main-content');\n      this.$details = $('#details');\n      this.$sidebarContainer = $('#sidebar-container');\n      this.$sidebarToggle = $('#sidebar-toggle');\n      this.$sidebar = $('#sidebar');\n      this.$contentContainer = $('#content-container');\n      this.$collapsibleTables = $('table.collapsible');\n\n      this.isMobile = Garnish.isMobileBrowser();\n\n      this.updateContentHeading();\n\n      // Swap any instruction text with info icons\n      let $allInstructions = this.$details.find(\n        '.meta > .field > .instructions'\n      );\n\n      for (let i = 0; i < $allInstructions.length; i++) {\n        let $instructions = $allInstructions.eq(i);\n        let $label = $instructions.siblings('.heading').children('label');\n        $('<span/>', {\n          class: 'info',\n          html: $instructions.children().html(),\n        }).appendTo($label);\n        $instructions.remove();\n      }\n\n      if (!this.isMobile && this.$header.length) {\n        this.addListener(Garnish.$win, 'scroll', 'updateFixedHeader');\n        this.updateFixedHeader();\n      }\n\n      Garnish.$doc.ready(() => {\n        // Update responsive tables on window resize\n        this.addListener(Garnish.$win, 'resize', (ev) => {\n          // Ignore element resizes\n          if (ev.target === window) {\n            this.handleWindowResize();\n\n            clearTimeout(this.resizeTimeout);\n            var cp = this;\n            this.resizeTimeout = setTimeout(function () {\n              cp.setSidebarNavAttributes();\n            }, 100);\n          }\n        });\n        this.handleWindowResize();\n        this.setSidebarNavAttributes();\n\n        // Wait a frame before initializing any confirm-unload forms,\n        // so other JS that runs on ready() has a chance to initialize\n        Garnish.requestAnimationFrame(this.initSpecialForms.bind(this));\n      });\n\n      // Alerts\n      if (this.$alerts.length) {\n        this.initAlerts();\n      }\n\n      // Toggles\n      this.addListener(this.$navToggle, 'click', 'toggleNav');\n      this.addListener(this.$sidebarToggle, 'click', 'toggleSidebar');\n\n      // Does this page have a primary form?\n      if (!this.$primaryForm.length) {\n        this.$primaryForm = $('form[data-saveshortcut]:first');\n      }\n\n      // Does the primary form support the save shortcut?\n      if (\n        this.$primaryForm.length &&\n        Garnish.hasAttr(this.$primaryForm, 'data-saveshortcut')\n      ) {\n        let shortcuts = [];\n        let actions = this.$primaryForm.data('actions');\n        if (typeof actions === 'undefined') {\n          shortcuts.push([\n            {\n              keyCode: Garnish.S_KEY,\n              ctrl: true,\n            },\n            {\n              redirect: this.$primaryForm.data('saveshortcut-redirect'),\n              retainScroll: Garnish.hasAttr(\n                this.$primaryForm,\n                'saveshortcut-scroll'\n              ),\n            },\n          ]);\n        } else {\n          for (let i = 0; i < actions.length; i++) {\n            let action = actions[i];\n            if (!action.shortcut) {\n              continue;\n            }\n            shortcuts.push([\n              {\n                keyCode: Garnish.S_KEY,\n                ctrl: true,\n                shift: !!action.shift,\n              },\n              {\n                action: action.action,\n                redirect: action.redirect,\n                confirm: action.confirm,\n                params: action.params,\n                data: action.data,\n                retainScroll: action.retainScroll,\n              },\n            ]);\n          }\n        }\n        for (let i = 0; i < shortcuts.length; i++) {\n          Garnish.uiLayerManager.registerShortcut(shortcuts[i][0], () => {\n            this.submitPrimaryForm(shortcuts[i][1]);\n          });\n        }\n      }\n\n      this.initTabs();\n\n      if (this.tabManager) {\n        if (window.LOCATION_HASH) {\n          const $tab = this.tabManager.$tabs.filter(\n            `[href=\"#${window.LOCATION_HASH}\"]`\n          );\n          if ($tab.length) {\n            this.tabManager.selectTab($tab);\n          }\n        }\n      }\n\n      // Should we match the previous scroll position?\n      let scrollY = Craft.getLocalStorage('scrollY');\n      if (typeof scrollY !== 'undefined') {\n        Craft.removeLocalStorage('scrollY');\n        Garnish.$doc.ready(() => {\n          Garnish.requestAnimationFrame(() => {\n            window.scrollTo(0, scrollY);\n          });\n        });\n      }\n\n      if ($.isTouchCapable()) {\n        this.$mainContainer.on(\n          'focus',\n          'input, textarea, .focusable-input',\n          this._handleInputFocus.bind(this)\n        );\n        this.$mainContainer.on(\n          'blur',\n          'input, textarea, .focusable-input',\n          this._handleInputBlur.bind(this)\n        );\n      }\n\n      // Announcements HUD\n      if (Craft.announcements.length) {\n        let $btn = $('#announcements-btn').removeClass('hidden');\n        const hasUnreads = Craft.announcements.some((a) => a.unread);\n        let $unreadMessage;\n        if (hasUnreads) {\n          $unreadMessage = $('<span/>', {\n            class: 'visually-hidden',\n            html: Craft.t('app', 'Unread messages'),\n          });\n          $btn.addClass('unread').append($unreadMessage);\n        }\n        let hud;\n        this.addListener($btn, 'click', () => {\n          if (!hud) {\n            let contents = '';\n            Craft.announcements.forEach((a) => {\n              contents +=\n                `<div class=\"announcement ${\n                  a.unread ? 'unread' : ''\n                }\" role=\"listitem\">` +\n                '<div class=\"announcement__header\">' +\n                `<h3 class=\"announcement__heading h2\">${a.heading}</h3>` +\n                '<div class=\"announcement-label-container\">' +\n                `<div class=\"announcement-icon\" aria-hidden=\"true\">${a.icon}</div>` +\n                `<div class=\"announcement-label\">${a.label}</div>` +\n                '</div>' +\n                '</div>' +\n                `<p>${a.body}</p>` +\n                '</div>';\n            });\n            hud = new Garnish.HUD(\n              $btn,\n              `<h2 class=\"visually-hidden\">${Craft.t(\n                'app',\n                'Announcements'\n              )}</h2><div id=\"announcements\" role=\"list\">${contents}</div>`,\n              {\n                onShow: () => {\n                  $btn.addClass('active');\n                },\n                onHide: () => {\n                  $btn.removeClass('active');\n                },\n              }\n            );\n\n            // Open outbound links in new windows\n            $('a', hud.$main).each(function () {\n              if (\n                this.hostname.length &&\n                this.hostname !== location.hostname &&\n                typeof $(this).attr('target') === 'undefined'\n              ) {\n                $(this).attr('rel', 'noopener').attr('target', '_blank');\n              }\n            });\n\n            if (hasUnreads) {\n              $btn.removeClass('unread');\n              $unreadMessage.remove();\n              Craft.sendActionRequest(\n                'POST',\n                'users/mark-announcements-as-read',\n                {\n                  data: {\n                    ids: Craft.announcements.map((a) => a.id),\n                  },\n                }\n              );\n            }\n          } else {\n            hud.show();\n          }\n        });\n      }\n\n      // Add .stuck class to #footer when stuck\n      // h/t https://stackoverflow.com/a/61115077/1688568\n      const footer = document.getElementById('footer');\n      if (footer) {\n        const observer = new IntersectionObserver(\n          ([ev]) => {\n            ev.target.classList.toggle('stuck', ev.intersectionRatio < 1);\n          },\n          {\n            rootMargin: '0px 0px -1px 0px',\n            threshold: [1],\n          }\n        );\n        observer.observe(footer);\n      }\n    },\n\n    get $contentHeader() {\n      const $contentHeader = $('#content-header');\n      if ($contentHeader.length) {\n        return $contentHeader;\n      }\n      return $('<header/>', {\n        id: 'content-header',\n        class: 'pane-header',\n      }).prependTo($('#content'));\n    },\n\n    get $noticeContainer() {\n      const $noticeContainer = $('#content-notice');\n      if ($noticeContainer.length) {\n        return $noticeContainer;\n      }\n      return $('<div id=\"content-notice\"/>')\n        .attr('role', 'status')\n        .prependTo(this.$contentHeader);\n    },\n\n    initSpecialForms: function () {\n      // Look for forms that we should watch for changes on\n      this.$confirmUnloadForms = $('form[data-confirm-unload]');\n      this.$deltaForms = $('form[data-delta]');\n\n      if (!this.$confirmUnloadForms.length) {\n        return;\n      }\n\n      const $forms = this.$confirmUnloadForms.add(this.$deltaForms);\n\n      for (let i = 0; i < $forms.length; i++) {\n        const $form = $forms.eq(i);\n        let serialized;\n        if (!$form.data('initialSerializedValue')) {\n          if (typeof $form.data('serializer') === 'function') {\n            serialized = $form.data('serializer')();\n          } else {\n            serialized = $form.serialize();\n          }\n          $form.data('initialSerializedValue', serialized);\n        }\n        this.addListener($form, 'submit', function (ev) {\n          if (Garnish.hasAttr($form, 'data-confirm-unload')) {\n            this.removeListener(Garnish.$win, 'beforeunload');\n          }\n          if (Garnish.hasAttr($form, 'data-delta')) {\n            ev.preventDefault();\n            let serialized;\n            if (typeof $form.data('serializer') === 'function') {\n              serialized = $form.data('serializer')();\n            } else {\n              serialized = $form.serialize();\n            }\n            const data = Craft.findDeltaData(\n              $form.data('initialSerializedValue'),\n              serialized,\n              $form.data('delta-names'),\n              null,\n              $form.data('initial-delta-values'),\n              $form.data('modified-delta-names')\n            );\n            Craft.createForm(data).appendTo(Garnish.$bod).submit();\n          }\n        });\n      }\n\n      this.addListener(Garnish.$win, 'beforeunload', function (ev) {\n        let confirmUnload = false;\n        if (\n          typeof Craft.livePreview !== 'undefined' &&\n          Craft.livePreview.inPreviewMode\n        ) {\n          confirmUnload = true;\n        } else {\n          for (let i = 0; i < this.$confirmUnloadForms.length; i++) {\n            const $form = this.$confirmUnloadForms.eq(i);\n            let serialized;\n            if (typeof $form.data('serializer') === 'function') {\n              serialized = $form.data('serializer')();\n            } else {\n              serialized = $form.serialize();\n            }\n            if ($form.data('initialSerializedValue') !== serialized) {\n              confirmUnload = true;\n              break;\n            }\n          }\n        }\n\n        if (confirmUnload) {\n          var message = Craft.t(\n            'app',\n            'Any changes will be lost if you leave this page.'\n          );\n\n          if (ev) {\n            ev.originalEvent.returnValue = message;\n          } else {\n            window.event.returnValue = message;\n          }\n\n          return message;\n        }\n      });\n    },\n\n    _handleInputFocus: function () {\n      this.updateFixedHeader();\n    },\n\n    _handleInputBlur: function () {\n      this.updateFixedHeader();\n    },\n\n    /**\n     * Submits a form.\n     * @param {Object} [options]\n     * @param {string} [options.action] The `action` param value override\n     * @param {string} [options.redirect] The `redirect` param value override\n     * @param {string} [options.confirm] A confirmation message that should be shown to the user before submit\n     * @param {Object} [options.params] Additional params that should be added to the form, defined as name/value pairs\n     * @param {Object} [options.data] Additional data to be passed to the submit event\n     * @param {boolean} [options.retainScroll] Whether the scroll position should be stored and reapplied on the next page load\n     */\n    submitPrimaryForm: function (options) {\n      // Give other stuff on the page a chance to prepare\n      this.trigger('beforeSaveShortcut');\n\n      if (typeof options !== 'object' || !$.isPlainObject(options)) {\n        options = {};\n      }\n\n      if (!options.redirect) {\n        options.redirect = this.$primaryForm.data('saveshortcut-redirect');\n      }\n\n      if (!options.data) {\n        options.data = {};\n      }\n      options.data.saveShortcut = true;\n\n      Craft.submitForm(this.$primaryForm, options);\n    },\n\n    updateSidebarMenuLabel: function () {\n      this.updateContentHeading();\n    },\n\n    updateContentHeading: function () {\n      const $item = this.$sidebar.find('a.sel:first');\n      const $label = $item.children('.label');\n      $('#content-heading').text($label.length ? $label.text() : $item.text());\n      Garnish.$bod.removeClass('showing-sidebar');\n    },\n\n    toggleNav: function () {\n      const isExpanded = this.navIsExpanded();\n\n      if (isExpanded === null) return;\n\n      if (isExpanded) {\n        this.disableGlobalSidebarLinks();\n        this.$navToggle.focus();\n        this.$navToggle.attr('aria-expanded', 'false');\n        Garnish.$bod.removeClass('showing-nav');\n      } else {\n        this.enableGlobalSidebarLinks();\n        this.$globalSidebar.find(':focusable')[0].focus();\n        this.$navToggle.attr('aria-expanded', 'true');\n        Garnish.$bod.addClass('showing-nav');\n      }\n    },\n\n    enableGlobalSidebarLinks: function () {\n      const focusableItems = this.$globalSidebar.find(':focusable');\n\n      $(focusableItems).each(function () {\n        $(this).attr('tabindex', '0');\n      });\n    },\n\n    disableGlobalSidebarLinks: function () {\n      const focusableItems = this.$globalSidebar.find(':focusable');\n\n      $(focusableItems).each(function () {\n        $(this).attr('tabindex', '-1');\n      });\n    },\n\n    setSidebarNavAttributes: function () {\n      const isExpanded = this.navIsExpanded();\n\n      if (isExpanded === null) return;\n\n      if (!isExpanded) {\n        this.disableGlobalSidebarLinks();\n      } else {\n        this.enableGlobalSidebarLinks();\n      }\n    },\n\n    navIsExpanded: function () {\n      if (!this.$globalSidebar[0]) return null;\n\n      const isAlwaysVisible = getComputedStyle(this.$globalSidebar[0])\n        .getPropertyValue('--is-always-visible')\n        .trim();\n\n      return (\n        this.$navToggle.attr('aria-expanded') === 'true' ||\n        isAlwaysVisible === 'true'\n      );\n    },\n\n    toggleSidebar: function () {\n      const expanded = this.$sidebarToggle.attr('aria-expanded') === 'true';\n      const newState = expanded ? 'false' : 'true';\n      this.$sidebarToggle.attr('aria-expanded', newState);\n      Garnish.$bod.toggleClass('showing-sidebar');\n    },\n\n    initTabs: function () {\n      if (this.tabManager) {\n        this.tabManager.destroy();\n        this.tabManager = null;\n      }\n\n      const $tabs = $('#tabs');\n      if (!$tabs.length) {\n        return;\n      }\n\n      this.tabManager = new Craft.Tabs($tabs);\n\n      this.tabManager.on('selectTab', (ev) => {\n        const href = ev.$tab.attr('href');\n\n        // Show its content area\n        if (href && href.charAt(0) === '#') {\n          $(href).removeClass('hidden');\n        }\n\n        // Trigger a resize event to update any UI components that are listening for it\n        Garnish.$win.trigger('resize');\n\n        // Fixes Redactor fixed toolbars on previously hidden panes\n        Garnish.$doc.trigger('scroll');\n\n        // If there is a revision menu, set its links to this tab ID\n        if (href && href.charAt(0) === '#') {\n          const menuBtn = $('#context-btn').menubtn().data('menubtn');\n          if (menuBtn) {\n            for (let i = 0; i < menuBtn.menu.$options.length; i++) {\n              let a = menuBtn.menu.$options[i];\n              if (a.href) {\n                a.href = a.href.match(/^[^#]*/)[0] + href;\n              }\n            }\n          }\n        }\n\n        if (typeof history !== 'undefined') {\n          // Delay changing the hash so it doesn't cause the browser to jump on page load\n          Garnish.requestAnimationFrame(() => {\n            history.replaceState(undefined, undefined, href);\n          });\n        }\n      });\n\n      this.tabManager.on('deselectTab', (ev) => {\n        const href = ev.$tab.attr('href');\n        if (href && href.charAt(0) === '#') {\n          // Hide its content area\n          $(ev.$tab.attr('href')).addClass('hidden');\n        }\n      });\n    },\n\n    updateTabs: function (tabs) {\n      if (tabs) {\n        const $tabContainer = $(tabs).attr('id', 'tabs');\n        if (this.tabManager) {\n          this.tabManager.$container.replaceWith($tabContainer);\n        } else {\n          $tabContainer.appendTo(this.$contentHeader);\n        }\n        this.initTabs();\n      } else if (this.tabManager) {\n        if (this.tabManager.$container.siblings().length) {\n          this.tabManager.$container.remove();\n        } else {\n          this.tabManager.$container.parent().remove();\n        }\n        this.tabManager.destroy();\n        this.tabManager = null;\n      }\n    },\n\n    /**\n     * @deprecated in 3.7.0\n     */\n    get $tabsContainer() {\n      return this.tabManager ? this.tabManager.$container : undefined;\n    },\n    /**\n     * @deprecated in 3.7.0\n     */\n    get $tabsList() {\n      return this.tabManager ? this.tabManager.$tablist : undefined;\n    },\n    /**\n     * @deprecated in 3.7.0\n     */\n    get $tabs() {\n      return this.tabManager ? this.tabManager.$tablist.find('> a') : undefined;\n    },\n    /**\n     * @deprecated in 3.7.0\n     */\n    get $selectedTab() {\n      return this.tabManager ? this.tabManager.$selectedTab : undefined;\n    },\n    /**\n     * @deprecated in 3.7.0\n     */\n    get selectedTabIndex() {\n      return this.tabManager\n        ? this.tabManager.$tabs.index(this.tabManager.$selectedTab)\n        : undefined;\n    },\n    /**\n     * @deprecated in 3.7.0\n     */\n    get $focusableTab() {\n      return this.tabManager ? this.tabManager.$focusableTab : undefined;\n    },\n    /**\n     * @param {(jQuery|HTMLElement|string)} tab\n     * @deprecated in 3.7.0\n     */\n    selectTab: function (tab) {\n      if (this.tabManager) {\n        this.tabManager.selectTab(tab);\n      }\n    },\n    /**\n     * @deprecated in 3.7.0\n     */\n    deselectTab: function () {\n      if (this.tabManager) {\n        this.tabManager.deselectTab();\n      }\n    },\n\n    handleWindowResize: function () {\n      this.updateResponsiveTables();\n      this.handleBreadcrumbVisibility();\n    },\n\n    breadcrumbItemsWrap: function () {\n      if (!this.$breadcrumbItems[0]) return;\n\n      this.$breadcrumbList.css(\n        Craft.orientation === 'ltr' ? 'margin-right' : 'margin-left',\n        ''\n      );\n      const listWidth = this.$breadcrumbList[0].getBoundingClientRect().width;\n      let totalItemWidth = 0;\n\n      // Iterate through all list items (inclusive of more button)\n      const $items = this.$breadcrumbList.find('li');\n      for (let i = 0; i < $items.length; i++) {\n        totalItemWidth += $items.get(i).getBoundingClientRect().width;\n      }\n\n      this.breadcrumbListWidth = listWidth;\n\n      if (totalItemWidth <= listWidth) {\n        return false;\n      }\n\n      // If it's less than a pixel off, it's probably just a rounding error.\n      // Give the container an extra pixel to be safe, though\n      if (totalItemWidth < listWidth + 1) {\n        this.$breadcrumbList.css(\n          Craft.orientation === 'ltr' ? 'margin-right' : 'margin-left',\n          '-1px'\n        );\n        return false;\n      }\n\n      return true;\n    },\n\n    handleBreadcrumbVisibility: function () {\n      if (!this.breadcrumbItemsWrap()) return;\n\n      if (this.$breadcrumbList.find('[data-disclosure-item]').length === 0) {\n        this.$breadcrumbList.append(this.breadcrumbDisclosureItem);\n      }\n\n      const triggerWidth = this.$breadcrumbList.find(\n        '[data-disclosure-item]'\n      )[0].offsetWidth;\n      let visibleItemWidth = triggerWidth;\n      let finalIndex;\n      let newWidth;\n      const listWidth = this.breadcrumbListWidth;\n\n      // Find breadcrumbs that should remain visible without overflowing\n      this.$breadcrumbItems.each(function (index) {\n        newWidth = visibleItemWidth + this.offsetWidth;\n\n        if (newWidth < listWidth) {\n          finalIndex = index;\n          visibleItemWidth += this.offsetWidth;\n        } else {\n          return false;\n        }\n      });\n\n      // Separate breadcrums that should remain visible vs. hidden\n      const shownItems = this.$breadcrumbItems.slice(0, finalIndex + 1);\n      const hiddenItems = this.$breadcrumbItems.slice(finalIndex + 1);\n\n      // Empty list DOM and add shown items and trigger item\n      this.$breadcrumbList.html('');\n      this.$breadcrumbList.append(shownItems);\n      this.$breadcrumbList.append(this.breadcrumbDisclosureItem);\n\n      // Add hidden items to disclosure menu and initialize\n      this.$breadcrumbList\n        .find('[data-disclosure-menu] ul')\n        .append(hiddenItems);\n      this.$breadcrumbList.find('[data-disclosure-trigger]').disclosureMenu();\n    },\n\n    updateResponsiveTables: function () {\n      for (\n        this.updateResponsiveTables._i = 0;\n        this.updateResponsiveTables._i < this.$collapsibleTables.length;\n        this.updateResponsiveTables._i++\n      ) {\n        this.updateResponsiveTables._$table = this.$collapsibleTables.eq(\n          this.updateResponsiveTables._i\n        );\n        this.updateResponsiveTables._containerWidth =\n          this.updateResponsiveTables._$table.parent().width();\n        this.updateResponsiveTables._check = false;\n\n        if (this.updateResponsiveTables._containerWidth > 0) {\n          // Is this the first time we've checked this table?\n          if (\n            typeof this.updateResponsiveTables._$table.data(\n              'lastContainerWidth'\n            ) === 'undefined'\n          ) {\n            this.updateResponsiveTables._check = true;\n          } else {\n            this.updateResponsiveTables._isCollapsed =\n              this.updateResponsiveTables._$table.hasClass('collapsed');\n\n            // Getting wider?\n            if (\n              this.updateResponsiveTables._containerWidth >\n              this.updateResponsiveTables._$table.data('lastContainerWidth')\n            ) {\n              if (this.updateResponsiveTables._isCollapsed) {\n                this.updateResponsiveTables._$table.removeClass('collapsed');\n                this.updateResponsiveTables._check = true;\n              }\n            } else if (!this.updateResponsiveTables._isCollapsed) {\n              this.updateResponsiveTables._check = true;\n            }\n          }\n\n          // Are we checking the table width?\n          if (this.updateResponsiveTables._check) {\n            if (\n              this.updateResponsiveTables._$table.width() - 30 >\n              this.updateResponsiveTables._containerWidth\n            ) {\n              this.updateResponsiveTables._$table.addClass('collapsed');\n            }\n          }\n\n          // Remember the container width for next time\n          this.updateResponsiveTables._$table.data(\n            'lastContainerWidth',\n            this.updateResponsiveTables._containerWidth\n          );\n        }\n      }\n    },\n\n    updateFixedHeader: function () {\n      if (this.isMobile) {\n        return;\n      }\n\n      // Have we scrolled passed the top of #main?\n      if (\n        this.$main.length &&\n        this.$headerContainer[0].getBoundingClientRect().top < 0\n      ) {\n        if (!this.fixedHeader) {\n          var headerHeight = this.$headerContainer.height();\n\n          // Hard-set the minimum content container height\n          this.$contentContainer.css(\n            'min-height',\n            'calc(100vh - ' + (headerHeight + 14 + 48 - 1) + 'px)'\n          );\n\n          // Hard-set the header container height\n          this.$headerContainer.height(headerHeight);\n          Garnish.$bod.addClass('fixed-header');\n\n          // Fix the sidebar and details pane positions if they are taller than #content-container\n          var contentHeight = this.$contentContainer.outerHeight();\n          var $detailsHeight = this.$details.outerHeight();\n          var css = {\n            top: headerHeight + 'px',\n            'max-height': 'calc(100vh - ' + headerHeight + 'px)',\n          };\n          this.$sidebar.addClass('fixed').css(css);\n          this.$details.addClass('fixed').css(css);\n          this.fixedHeader = true;\n        }\n      } else if (this.fixedHeader) {\n        this.$headerContainer.height('auto');\n        Garnish.$bod.removeClass('fixed-header');\n        this.$contentContainer.css('min-height', '');\n        this.$sidebar.removeClass('fixed').css({\n          top: '',\n          'max-height': '',\n        });\n        this.$details.removeClass('fixed').css({\n          top: '',\n          'max-height': '',\n        });\n        this.fixedHeader = false;\n      }\n    },\n\n    /**\n     * Dispays a notification.\n     *\n     * @param {string} type `notice`, `success`, or `error`\n     * @param {string} message\n     * @param {Object} [settings]\n     * @param {string} [settings.icon] The icon to show on the notification\n     * @param {string} [settings.iconLabel] The icon’s ARIA label\n     * @param {string} [settings.details] Any additional HTML that should be included below the message\n     * @returns {Object} The notification\n     */\n    displayNotification: function (type, message, settings) {\n      const notification = new Craft.CP.Notification(type, message, settings);\n\n      this.trigger('displayNotification', {\n        notificationType: type,\n        message,\n        notification,\n      });\n\n      return notification;\n    },\n\n    /**\n     * Displays a notice.\n     *\n     * @param {string} message\n     * @param {Object} [settings]\n     * @param {string} [settings.icon] The icon to show on the notification\n     * @param {string} [settings.iconLabel] The icon’s ARIA label\n     * @param {string} [settings.details] Any additional HTML that should be included below the message\n     * @returns {Object} The notification\n     */\n    displayNotice: function (message, settings) {\n      return this.displayNotification(\n        'notice',\n        message,\n        Object.assign(\n          {\n            icon: 'info',\n            iconLabel: Craft.t('app', 'Notice'),\n          },\n          settings\n        )\n      );\n    },\n\n    /**\n     * Displays a success notification.\n     *\n     * @param {string} message\n     * @param {Object} [settings]\n     * @param {string} [settings.icon] The icon to show on the notification\n     * @param {string} [settings.iconLabel] The icon’s ARIA label\n     * @param {string} [settings.details] Any additional HTML that should be included below the message\n     * @returns {Object} The notification\n     */\n    displaySuccess: function (message, settings) {\n      return this.displayNotification(\n        'success',\n        message,\n        Object.assign(\n          {\n            icon: 'check',\n            iconLabel: Craft.t('app', 'Success'),\n          },\n          settings\n        )\n      );\n    },\n\n    /**\n     * Displays an error.\n     *\n     * @param {string} message\n     * @param {Object} [settings]\n     * @param {string} [settings.icon] The icon to show on the notification\n     * @param {string} [settings.iconLabel] The icon’s ARIA label\n     * @param {string} [settings.details] Any additional HTML that should be included below the message\n     * @returns {Object} The notification\n     */\n    displayError: function (message, settings) {\n      if (!message || typeof message === 'object') {\n        settings = message;\n        message = Craft.t('app', 'A server error occurred.');\n      }\n\n      return this.displayNotification(\n        'error',\n        message,\n        Object.assign(\n          {\n            icon: 'alert',\n            iconLabel: Craft.t('app', 'Error'),\n          },\n          settings\n        )\n      );\n    },\n\n    fetchAlerts: function () {\n      return Craft.queue.push(\n        () =>\n          new Promise((resolve, reject) => {\n            const data = {\n              path: Craft.path,\n            };\n            Craft.sendActionRequest('POST', 'app/get-cp-alerts', {data})\n              .then(({data}) => {\n                resolve(data.alerts);\n              })\n              .catch(reject);\n          })\n      );\n    },\n\n    displayAlerts: function (alerts) {\n      this.$alerts.remove();\n\n      if (Garnish.isArray(alerts) && alerts.length) {\n        this.$alerts = $('<ul id=\"alerts\"/>').prependTo($('#page-container'));\n\n        for (var i = 0; i < alerts.length; i++) {\n          $(\n            `<li><span data-icon=\"alert\" aria-label=\"${Craft.t(\n              'app',\n              'Error'\n            )}\"></span> ${alerts[i]}</li>`\n          ).appendTo(this.$alerts);\n        }\n\n        var height = this.$alerts.outerHeight();\n        this.$alerts\n          .css('margin-top', -height)\n          .velocity({'margin-top': 0}, 'fast');\n\n        this.initAlerts();\n      }\n    },\n\n    initAlerts: function () {\n      // Are there any shunnable alerts?\n      var $shunnableAlerts = this.$alerts.find('a[class^=\"shun:\"]');\n\n      for (var i = 0; i < $shunnableAlerts.length; i++) {\n        this.addListener($shunnableAlerts[i], 'click', (ev) => {\n          ev.preventDefault();\n\n          Craft.queue.push(\n            () =>\n              new Promise((resolve, reject) => {\n                const $link = $(ev.currentTarget);\n                const data = {\n                  message: $link.prop('className').substring(5),\n                };\n                Craft.sendActionRequest('POST', 'app/shun-cp-alert', {data})\n                  .then(() => {\n                    $link.parent().remove();\n                    resolve();\n                  })\n                  .catch(({response}) => {\n                    this.displayError(response.data.message);\n                    reject();\n                  });\n              })\n          );\n        });\n      }\n    },\n\n    checkForUpdates: function (forceRefresh, includeDetails, callback) {\n      // Make 'includeDetails' optional\n      if (typeof includeDetails === 'function') {\n        callback = includeDetails;\n        includeDetails = false;\n      }\n\n      // If forceRefresh == true, we're currently checking for updates, and not currently forcing a refresh,\n      // then just set a new callback that re-checks for updates when the current one is done.\n      if (\n        this.checkingForUpdates &&\n        ((forceRefresh === true && !this.forcingRefreshOnUpdatesCheck) ||\n          (includeDetails === true && !this.includingDetailsOnUpdatesCheck))\n      ) {\n        var realCallback = callback;\n        callback = () => {\n          this.checkForUpdates(forceRefresh, includeDetails, realCallback);\n        };\n      }\n\n      // Callback function?\n      if (typeof callback === 'function') {\n        if (!Garnish.isArray(this.checkForUpdatesCallbacks)) {\n          this.checkForUpdatesCallbacks = [];\n        }\n\n        this.checkForUpdatesCallbacks.push(callback);\n      }\n\n      if (!this.checkingForUpdates) {\n        this.checkingForUpdates = true;\n        this.forcingRefreshOnUpdatesCheck = forceRefresh === true;\n        this.includingDetailsOnUpdatesCheck = includeDetails === true;\n\n        this._checkForUpdates(forceRefresh, includeDetails).then((info) => {\n          this.updateUtilitiesBadge();\n          this.checkingForUpdates = false;\n\n          if (Garnish.isArray(this.checkForUpdatesCallbacks)) {\n            var callbacks = this.checkForUpdatesCallbacks;\n            this.checkForUpdatesCallbacks = null;\n\n            for (var i = 0; i < callbacks.length; i++) {\n              callbacks[i](info);\n            }\n          }\n\n          this.trigger('checkForUpdates', {\n            updateInfo: info,\n          });\n        });\n      }\n    },\n\n    _checkForUpdates: function (forceRefresh, includeDetails) {\n      return new Promise((resolve, reject) => {\n        if (!forceRefresh) {\n          this._checkForCachedUpdates(includeDetails)\n            .then((info) => {\n              if (info.cached) {\n                resolve(info);\n                return;\n              }\n\n              this._getUpdates(includeDetails).then((info) => {\n                resolve(info);\n              });\n            })\n            .catch(reject);\n        } else {\n          this._getUpdates(includeDetails).then(resolve).catch(reject);\n        }\n      });\n    },\n\n    _checkForCachedUpdates: function (includeDetails) {\n      return new Promise(function (resolve, reject) {\n        var data = {\n          onlyIfCached: true,\n          includeDetails: includeDetails,\n        };\n\n        Craft.sendActionRequest('POST', 'app/check-for-updates', {data})\n          .then(({data}) => {\n            resolve(data);\n          })\n          .catch(() => {\n            resolve({cached: false});\n          });\n      });\n    },\n\n    _getUpdates: function (includeDetails) {\n      return new Promise((resolve, reject) => {\n        Craft.sendApiRequest('GET', 'updates')\n          .then((updates) => {\n            this._cacheUpdates(updates, includeDetails).then((data) => {\n              resolve(data);\n            });\n          })\n          .catch(reject);\n      });\n    },\n\n    _cacheUpdates: function (updates, includeDetails) {\n      return new Promise((resolve, reject) => {\n        const data = {\n          updates,\n          includeDetails,\n        };\n\n        Craft.sendActionRequest('POST', 'app/cache-updates', {data})\n          .then(({data}) => {\n            resolve(data);\n          })\n          .catch(reject);\n      });\n    },\n\n    updateUtilitiesBadge: function () {\n      var $utilitiesLink = $('#nav-utilities').find('> a:not(.sel)');\n\n      // Ignore if there is no (non-selected) Utilities nav item\n      if (!$utilitiesLink.length) {\n        return;\n      }\n\n      Craft.queue.push(\n        () =>\n          new Promise((resolve, reject) => {\n            Craft.sendActionRequest('POST', 'app/get-utilities-badge-count')\n              .then(({data}) => {\n                // Get the existing utility nav badge and screen reader text, if any\n                let $badge = $utilitiesLink.children('.badge');\n                let $screenReaderText = $utilitiesLink.children(\n                  '[data-notification]'\n                );\n\n                if (data.badgeCount) {\n                  if (!$badge.length) {\n                    $badge = $(\n                      '<span class=\"badge\" aria-hidden=\"true\"/>'\n                    ).appendTo($utilitiesLink);\n                  }\n\n                  if (!$screenReaderText.length) {\n                    $screenReaderText = $(\n                      '<span class=\"visually-hidden\" data-notification/>'\n                    ).appendTo($utilitiesLink);\n                  }\n\n                  $badge.text(data.badgeCount);\n                  $screenReaderText.text(\n                    Craft.t(\n                      'app',\n                      '{num, number} {num, plural, =1{notification} other{notifications}}',\n                      {\n                        num: data.badgeCount,\n                      }\n                    )\n                  );\n                } else if ($badge.length && $screenReaderText.length) {\n                  $badge.remove();\n                  $screenReaderText.remove();\n                }\n                resolve();\n              })\n              .catch(reject);\n          })\n      );\n    },\n\n    runQueue: function () {\n      if (!this.enableQueue) {\n        return;\n      }\n\n      if (Craft.runQueueAutomatically) {\n        Craft.queue.push(\n          () =>\n            new Promise((resolve, reject) => {\n              Craft.sendActionRequest('POST', 'queue/run')\n                .then(() => {\n                  this.trackJobProgress(false, true);\n                  resolve();\n                })\n                .catch(reject);\n            })\n        );\n      } else {\n        this.trackJobProgress(false, true);\n      }\n    },\n\n    trackJobProgress: function (delay, force) {\n      if (force && this.trackJobProgressTimeout) {\n        clearTimeout(this.trackJobProgressTimeout);\n        this.trackJobProgressTimeout = null;\n      }\n\n      // Ignore if we're already tracking jobs, or the queue is disabled\n      if (this.trackJobProgressTimeout || !this.enableQueue) {\n        return;\n      }\n\n      if (delay === true) {\n        // Determine the delay based on how long the displayed job info has remained unchanged\n        var timeout = Math.min(60000, this.displayedJobInfoUnchanged * 500);\n        this.trackJobProgressTimeout = setTimeout(\n          this._trackJobProgressInternal.bind(this),\n          timeout\n        );\n      } else {\n        this._trackJobProgressInternal();\n      }\n    },\n\n    _trackJobProgressInternal: function () {\n      Craft.queue.push(\n        () =>\n          new Promise((resolve, reject) => {\n            Craft.sendActionRequest(\n              'POST',\n              'queue/get-job-info?limit=50&dontExtendSession=1'\n            )\n              .then(({data}) => {\n                this.trackJobProgressTimeout = null;\n                this.totalJobs = data.total;\n                this.setJobInfo(data.jobs);\n                if (this.jobInfo.length) {\n                  // Check again after a delay\n                  this.trackJobProgress(true);\n                }\n                resolve();\n              })\n              .catch(reject);\n          })\n      );\n    },\n\n    setJobInfo: function (jobInfo) {\n      if (!this.enableQueue) {\n        return;\n      }\n\n      this.jobInfo = jobInfo;\n\n      // Update the displayed job info\n      var oldInfo = this.displayedJobInfo;\n      this.displayedJobInfo = this.getDisplayedJobInfo();\n\n      // Same old same old?\n      if (\n        oldInfo &&\n        this.displayedJobInfo &&\n        oldInfo.id === this.displayedJobInfo.id &&\n        oldInfo.progress === this.displayedJobInfo.progress &&\n        oldInfo.progressLabel === this.displayedJobInfo.progressLabel &&\n        oldInfo.status === this.displayedJobInfo.status\n      ) {\n        this.displayedJobInfoUnchanged++;\n      } else {\n        // Reset the counter\n        this.displayedJobInfoUnchanged = 1;\n      }\n\n      this.updateJobIcon();\n\n      // Fire a setJobInfo event\n      this.trigger('setJobInfo');\n    },\n\n    /**\n     * Returns info for the job that should be displayed in the control panel sidebar\n     */\n    getDisplayedJobInfo: function () {\n      if (!this.enableQueue) {\n        return null;\n      }\n\n      // Set the status preference order\n      var statuses = [\n        Craft.CP.JOB_STATUS_RESERVED,\n        Craft.CP.JOB_STATUS_FAILED,\n        Craft.CP.JOB_STATUS_WAITING,\n      ];\n\n      for (var i = 0; i < statuses.length; i++) {\n        for (var j = 0; j < this.jobInfo.length; j++) {\n          if (\n            this.jobInfo[j].status === statuses[i] &&\n            (statuses[i] !== Craft.CP.JOB_STATUS_WAITING ||\n              !this.jobInfo[j].delay)\n          ) {\n            return this.jobInfo[j];\n          }\n        }\n      }\n\n      return null;\n    },\n\n    updateJobIcon: function () {\n      if (!this.enableQueue || !this.$nav.length) {\n        return;\n      }\n\n      if (this.displayedJobInfo) {\n        if (!this.jobProgressIcon) {\n          this.jobProgressIcon = new JobProgressIcon();\n        }\n\n        if (\n          this.displayedJobInfo.status === Craft.CP.JOB_STATUS_RESERVED ||\n          this.displayedJobInfo.status === Craft.CP.JOB_STATUS_WAITING\n        ) {\n          this.jobProgressIcon.hideFailMode();\n          this.jobProgressIcon.setDescription(\n            this.displayedJobInfo.description,\n            this.displayedJobInfo.progressLabel\n          );\n          this.jobProgressIcon.setProgress(this.displayedJobInfo.progress);\n        } else if (\n          this.displayedJobInfo.status === Craft.CP.JOB_STATUS_FAILED\n        ) {\n          this.jobProgressIcon.showFailMode(Craft.t('app', 'Failed'));\n        }\n      } else {\n        if (this.jobProgressIcon) {\n          this.jobProgressIcon.hideFailMode();\n          this.jobProgressIcon.complete();\n          delete this.jobProgressIcon;\n        }\n      }\n    },\n\n    /**\n     * Returns the active site for the control panel\n     *\n     * @returns {number}\n     */\n    getSiteId: function () {\n      // If the old BaseElementIndex.siteId value is in localStorage, go aheand and remove & return that\n      let siteId = Craft.getLocalStorage('BaseElementIndex.siteId');\n      if (typeof siteId !== 'undefined') {\n        Craft.removeLocalStorage('BaseElementIndex.siteId');\n        try {\n          this.setSiteId(siteId);\n        } catch (e) {}\n      }\n      return Craft.siteId;\n    },\n\n    /**\n     * Sets the active site for the control panel\n     * @param {number} siteId\n     */\n    setSiteId: function (siteId) {\n      const site = Craft.sites.find((s) => s.id === siteId);\n\n      if (!site) {\n        throw `Invalid site ID: ${siteId}`;\n      }\n\n      Craft.siteId = siteId;\n\n      // update the base URLs used get Craft.getUrl(), etc.\n      Craft.actionUrl = Craft.getUrl(Craft.actionUrl, {site: site.handle});\n      Craft.baseCpUrl = Craft.getUrl(Craft.baseCpUrl, {site: site.handle});\n      Craft.baseUrl = Craft.getUrl(Craft.baseUrl, {site: site.handle});\n\n      // update the current URL\n      const url = Craft.getUrl(document.location.href, {site: site.handle});\n      history.replaceState({}, '', url);\n\n      // update the site--x body class\n      for (let className of document.body.classList) {\n        if (className.match(/^site--/)) {\n          document.body.classList.remove(className);\n        }\n      }\n      document.body.classList.add(`site--${site.handle}`);\n\n      // update other URLs on the page\n      $('a').each(function () {\n        if (\n          this.hostname.length &&\n          this.hostname === location.hostname &&\n          this.href.indexOf(Craft.cpTrigger) !== -1\n        ) {\n          this.href = Craft.getUrl(this.href, {site: site.handle});\n        }\n      });\n    },\n  },\n  {\n    //maxWidth: 1051, //1024,\n\n    /**\n     * @deprecated in 4.2.0. Use Craft.notificationDuration instead.\n     */\n    notificationDuration: 5000,\n\n    JOB_STATUS_WAITING: 1,\n    JOB_STATUS_RESERVED: 2,\n    JOB_STATUS_DONE: 3,\n    JOB_STATUS_FAILED: 4,\n  }\n);\n\nCraft.CP.Notification = Garnish.Base.extend({\n  type: null,\n  message: null,\n  settings: null,\n  closing: false,\n  closeTimeout: null,\n  _preventDelayedClose: false,\n  $container: null,\n  $closeBtn: null,\n  originalActiveElement: null,\n\n  init: function (type, message, settings) {\n    this.type = type;\n    this.message = message;\n    this.settings = settings || {};\n\n    this.$container = $('<div/>', {\n      class: 'notification',\n      'data-type': this.type,\n    }).appendTo(Craft.cp.$notificationContainer);\n\n    const $body = $('<div class=\"notification-body\"/>')\n      .appendTo(this.$container)\n      .attr('role', 'status');\n\n    if (this.settings.icon) {\n      const $icon = $('<span/>', {\n        class: 'notification-icon',\n        'data-icon': this.settings.icon,\n      }).appendTo($body);\n      if (this.settings.iconLabel) {\n        $icon.attr({\n          'aria-label': this.settings.iconLabel,\n          role: 'img',\n        });\n      } else {\n        $icon.attr('aria-hidden', 'true');\n      }\n    }\n\n    const $main = $('<div class=\"notification-main\"/>').appendTo($body);\n\n    $('<div/>', {\n      class: 'notification-message',\n      text: this.message,\n    }).appendTo($main);\n\n    const $closeBtnContainer = $('<div/>').appendTo(this.$container);\n    this.$closeBtn = $('<button/>', {\n      type: 'button',\n      class: 'notification-close-btn',\n      'aria-label': Craft.t('app', 'Close'),\n      'data-icon': 'remove',\n    }).appendTo($closeBtnContainer);\n\n    if (this.settings.details) {\n      const $detailsContainer = $('<div class=\"notification-details\"/>')\n        .append(this.settings.details)\n        .appendTo($main);\n\n      const $focusableElement = $detailsContainer.find('button,input');\n      if ($focusableElement.length) {\n        Garnish.uiLayerManager.addLayer(this.$container);\n        Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n          this.close();\n        });\n        this.originalActiveElement = document.activeElement;\n        this.$container.attr('tabindex', '-1').focus();\n        this.$container.on('keydown', (ev) => {\n          if (ev.keyCode === Garnish.ESC_KEY) {\n            ev.stopPropagation();\n            this.close();\n          }\n        });\n      }\n    }\n\n    this.$container\n      .css({\n        opacity: 0,\n        'margin-bottom': this._negMargin(),\n      })\n      .velocity({opacity: 1, 'margin-bottom': 0}, {duration: 'fast'});\n\n    Craft.initUiElements(this.$container);\n\n    this.addListener(this.$closeBtn, 'click', 'close');\n\n    if (Craft.notificationDuration) {\n      this._initDelayedClose();\n    }\n  },\n\n  _initDelayedClose: function () {\n    if (this._preventDelayedClose) {\n      return;\n    }\n\n    if (!Craft.isVisible()) {\n      Garnish.$doc.one('visibilitychange', () => {\n        this._initDelayedClose();\n      });\n      return;\n    }\n\n    this.delayedClose();\n\n    this.$container.on(\n      'keypress keyup change focus blur click mousedown mouseup',\n      (ev) => {\n        if (ev.target != this.$closeBtn[0]) {\n          this.$container.off(\n            'keypress keyup change focus blur click mousedown mouseup'\n          );\n          this.preventDelayedClose();\n        }\n      }\n    );\n  },\n\n  _negMargin: function () {\n    return `-${this.$container.outerHeight() + 12}px`;\n  },\n\n  close: function () {\n    if (this.closing) {\n      return;\n    }\n\n    if (this.closeTimeout) {\n      clearTimeout(this.closeTimeout);\n      this.closeTimeout = null;\n    }\n\n    this.closing = true;\n\n    if (\n      this.originalActiveElement &&\n      document.activeElement &&\n      (document.activeElement === this.$container[0] ||\n        $.contains(this.$container[0], document.activeElement))\n    ) {\n      $(this.originalActiveElement).focus();\n    }\n\n    this.$container.velocity(\n      {opacity: 0, 'margin-bottom': this._negMargin()},\n      {\n        duration: 'fast',\n        complete: () => {\n          this.$container.remove();\n        },\n      }\n    );\n  },\n\n  delayedClose: function () {\n    this.closeTimeout = setTimeout(() => {\n      this.close();\n    }, Craft.notificationDuration);\n\n    // Hold off on closing automatically on hover\n    this.$container.one('mouseover', () => {\n      clearTimeout(this.closeTimeout);\n      this.closeTimeout = null;\n\n      this.$container.on('mouseout', (ev) => {\n        if (ev.target == this.$container[0]) {\n          this.$container.off('mouseout');\n          this.delayedClose();\n        }\n      });\n    });\n  },\n\n  preventDelayedClose: function () {\n    this._preventDelayedClose = true;\n\n    if (this.closeTimeout) {\n      clearTimeout(this.closeTimeout);\n      this.closeTimeout = null;\n    }\n\n    this.$container.off('mouseover mouseout');\n  },\n});\n\nGarnish.$scrollContainer = Garnish.$win;\nCraft.cp = new Craft.CP();\n\n/**\n * Job progress icon class\n */\nvar JobProgressIcon = Garnish.Base.extend({\n  $li: null,\n  $a: null,\n  $label: null,\n  $progressLabel: null,\n\n  progress: null,\n  failMode: false,\n\n  _$bgCanvas: null,\n  _$staticCanvas: null,\n  _$hoverCanvas: null,\n  _$failCanvas: null,\n\n  _staticCtx: null,\n  _hoverCtx: null,\n  _canvasSize: null,\n  _arcPos: null,\n  _arcRadius: null,\n  _lineWidth: null,\n\n  _arcStartPos: 0,\n  _arcEndPos: 0,\n  _arcStartStepSize: null,\n  _arcEndStepSize: null,\n  _arcStep: null,\n  _arcStepTimeout: null,\n  _arcAnimateCallback: null,\n\n  _progressBar: null,\n\n  init: function () {\n    this.$li = $('<li/>').appendTo(Craft.cp.$nav.children('ul'));\n    this.$a = $('<a/>', {\n      id: 'job-icon',\n      href: Craft.canAccessQueueManager\n        ? Craft.getUrl('utilities/queue-manager')\n        : null,\n    }).appendTo(this.$li);\n    this.$canvasContainer = $('<span class=\"icon\"/>').appendTo(this.$a);\n    var $labelContainer = $('<span class=\"label\"/>').appendTo(this.$a);\n    this.$label = $('<span/>').appendTo($labelContainer);\n    this.$progressLabel = $('<span class=\"progress-label\"/>')\n      .appendTo($labelContainer)\n      .hide();\n\n    let m = window.devicePixelRatio > 1 ? 2 : 1;\n    this._canvasSize = 18 * m;\n    this._arcPos = this._canvasSize / 2;\n    this._arcRadius = 7 * m;\n    this._lineWidth = 3 * m;\n\n    this._$bgCanvas = this._createCanvas('bg', '#61666b');\n    this._$staticCanvas = this._createCanvas('static', '#d7d9db');\n    this._$hoverCanvas = this._createCanvas('hover', '#fff');\n    this._$failCanvas = this._createCanvas('fail', '#da5a47').hide();\n\n    this._staticCtx = this._$staticCanvas[0].getContext('2d');\n    this._hoverCtx = this._$hoverCanvas[0].getContext('2d');\n\n    this._drawArc(this._$bgCanvas[0].getContext('2d'), 0, 1);\n    this._drawArc(this._$failCanvas[0].getContext('2d'), 0, 1);\n  },\n\n  setDescription: function (description, progressLabel) {\n    this.$a.attr('title', description);\n    this.$label.text(description);\n    if (progressLabel) {\n      this.$progressLabel.text(progressLabel).show();\n    } else {\n      this.$progressLabel.hide();\n    }\n  },\n\n  setProgress: function (progress) {\n    if (progress == 0) {\n      this._$staticCanvas.hide();\n      this._$hoverCanvas.hide();\n    } else {\n      this._$staticCanvas.show();\n      this._$hoverCanvas.show();\n      if (this.progress && progress > this.progress) {\n        this._animateArc(0, progress / 100);\n      } else {\n        this._setArc(0, progress / 100);\n      }\n    }\n\n    this.progress = progress;\n  },\n\n  complete: function () {\n    this._animateArc(0, 1, () => {\n      this._$bgCanvas.velocity('fadeOut');\n\n      this._animateArc(1, 1, () => {\n        this.$a.remove();\n        this.destroy();\n      });\n    });\n  },\n\n  showFailMode: function (message) {\n    if (this.failMode) {\n      return;\n    }\n\n    this.failMode = true;\n    this.progress = null;\n\n    this._$bgCanvas.hide();\n    this._$staticCanvas.hide();\n    this._$hoverCanvas.hide();\n    this._$failCanvas.show();\n\n    this.setDescription(message);\n  },\n\n  hideFailMode: function () {\n    if (!this.failMode) {\n      return;\n    }\n\n    this.failMode = false;\n\n    this._$bgCanvas.show();\n    this._$staticCanvas.show();\n    this._$hoverCanvas.show();\n    this._$failCanvas.hide();\n  },\n\n  _createCanvas: function (id, color) {\n    var $canvas = $(\n        '<canvas id=\"job-icon-' +\n          id +\n          '\" width=\"' +\n          this._canvasSize +\n          '\" height=\"' +\n          this._canvasSize +\n          '\"/>'\n      ).appendTo(this.$canvasContainer),\n      ctx = $canvas[0].getContext('2d');\n\n    ctx.strokeStyle = color;\n    ctx.lineWidth = this._lineWidth;\n    ctx.lineCap = 'round';\n    return $canvas;\n  },\n\n  _setArc: function (startPos, endPos) {\n    this._arcStartPos = startPos;\n    this._arcEndPos = endPos;\n\n    this._drawArc(this._staticCtx, startPos, endPos);\n    this._drawArc(this._hoverCtx, startPos, endPos);\n  },\n\n  _drawArc: function (ctx, startPos, endPos) {\n    ctx.clearRect(0, 0, this._canvasSize, this._canvasSize);\n    ctx.beginPath();\n    ctx.arc(\n      this._arcPos,\n      this._arcPos,\n      this._arcRadius,\n      (1.5 + startPos * 2) * Math.PI,\n      (1.5 + endPos * 2) * Math.PI\n    );\n    ctx.stroke();\n    ctx.closePath();\n  },\n\n  _animateArc: function (targetStartPos, targetEndPos, callback) {\n    if (this._arcStepTimeout) {\n      clearTimeout(this._arcStepTimeout);\n    }\n\n    this._arcStep = 0;\n    this._arcStartStepSize = (targetStartPos - this._arcStartPos) / 10;\n    this._arcEndStepSize = (targetEndPos - this._arcEndPos) / 10;\n    this._arcAnimateCallback = callback;\n    this._takeNextArcStep();\n  },\n\n  _takeNextArcStep: function () {\n    this._setArc(\n      this._arcStartPos + this._arcStartStepSize,\n      this._arcEndPos + this._arcEndStepSize\n    );\n\n    this._arcStep++;\n\n    if (this._arcStep < 10) {\n      this._arcStepTimeout = setTimeout(this._takeNextArcStep.bind(this), 50);\n    } else if (this._arcAnimateCallback) {\n      this._arcAnimateCallback();\n    }\n  },\n});\n"],"names":["Craft","Accordion","Garnish","Base","extend","$trigger","targetSelector","_$target","init","trigger","this","$","data","console","warn","destroy","attr","addListener","event","key","keyCode","SPACE_KEY","RETURN_KEY","preventDefault","onTriggerClick","hideTarget","showTarget","$target","length","_currentHeight","height","removeClass","addClass","i","$t","prop","_targetHeight","css","overflow","velocity","getUserPreferredAnimationDuration","eq","$win","hasClass","removeData","base","AddressesInput","$container","$addBtn","$addBtnItem","$cards","container","settings","setSettings","defaults","find","closest","initCard","updateAddButton","createAddress","$card","ev","target","editAddress","$actionBtn","disclosureMenu","menu","$menu","$editBtn","stopPropagation","$deleteBtn","confirm","t","addressId","draftId","sendActionRequest","elementId","then","remove","not","createElementEditor","on","id","response","$newCard","html","replaceWith","insertBefore","initUiElements","add","canCreateAddress","maxAddresses","elementType","ownerId","element","AdminTable","totalItems","sorter","$noItems","$table","$tbody","$deleteBtns","allowDeleteAll","minItems","noItemsSelector","tableSelector","children","sortable","DataTableSorter","onSortChange","reorderItems","bind","handleDeleteBtnClick","updateUI","addRow","row","maxItems","$row","appendTo","addItems","ids","$items","idAttribute","push","JSON","stringify","reorderAction","onReorderItems","cp","displaySuccess","reorderSuccessMessage","displayError","reorderFailMessage","confirmDeleteItem","deleteItem","confirmDeleteMessage","name","getItemName","getItemId","deleteAction","handleDeleteItemSuccess","handleDeleteItemFailure","deleteFailMessage","removeItems","onDeleteItem","deleteSuccessMessage","escapeHtml","nameAttribute","hide","show","$moveButtons","newItemBtnSelector","noop","AssetImageEditor","Modal","$body","$footer","$imageTools","$buttons","$cancelBtn","$replaceBtn","$saveBtn","$focalPointBtn","$editorContainer","$straighten","$croppingCanvas","$spinner","$constraintContainer","$constraintRadioInputs","$customConstraints","canvas","image","viewport","focalPoint","grid","croppingCanvas","clipper","croppingRectangle","cropperHandles","cropperGrid","croppingShade","imageStraightenAngle","viewportRotation","originalWidth","originalHeight","imageVerticeCoords","zoomRatio","animationInProgress","currentView","assetId","cacheBust","draggingCropper","scalingCropper","draggingFocal","previousMouseX","previousMouseY","shiftKeyHeld","editorHeight","editorWidth","cropperState","scaleFactor","flipData","focalPointState","maxImageSize","lastLoadedDimensions","imageIsLoading","mouseMoveEvent","croppingConstraint","constraintOrientation","showingCustomConstraint","saving","renderImage","renderCropper","_queue","Queue","Date","now","allowDegreeFractions","isImagick","prefersReducedMotion","animationDuration","x","y","$bod","type","class","text","allowSavingAsNew","ui","createButton","label","spinner","saveImage","createSubmitButton","removeListener","$shade","getMaxImageSize","loadEditor","browserViewportWidth","$doc","get","documentElement","clientWidth","browserViewportHeight","clientHeight","Math","max","window","devicePixelRatio","alert","$tabs","$viewsContainer","$views","innerHeight","innerWidth","_showSpinner","updateSizeAndPosition","$customConstraintWrapper","filter","parent","append","size","value","val","test","fabric","StaticCanvas","width","enableRetinaScaling","requestAnimationFrame","renderAll","imageUrl","getActionUrl","Image","fromURL","imageObject","set","originX","originY","left","top","getHeight","getWidth","getScaledImageDimensions","_setFittedImageVerticeCoordinates","_repositionEditorElements","focalState","imageDimensions","offsetX","offsetY","focal","focalData","adjustedX","adjustedY","storeFocalPointState","_createFocalPoint","_createViewport","storeCropperState","_addControlListeners","_handleMouseMove","_handleMouseDown","_handleMouseUp","_handleMouseOut","_hideSpinner","first","_reloadImage","setSrc","outerHeight","previousEditorDimensions","setDimensions","currentScaledDimensions","getZoomToFitRatio","previouslyOccupiedArea","_getBoundingRectangle","_repositionCropper","getZoomToCoverRatio","_repositionImage","_repositionViewport","_repositionFocalPoint","_zoomImage","Rect","fill","globalCompositeOperation","sizeFactor","focalX","focalY","deltaX","deltaY","Group","Circle","radius","strokeWidth","stroke","toggleFocalPoint","dimensions","state","currentWidth","ratio","hasOrientationChanged","_","imageRatio","editorRatio","min","round","_getPrevTab","newTabIndex","activeTabIndex","_getActiveTabIndex","_getNextTab","_getActiveTab","$activeTab","index","_handleTabClick","LEFT_KEY","UP_KEY","$prevTab","activateTab","RIGHT_KEY","DOWN_KEY","$nextTab","rotateImage","flipImage","straighteningInput","SlideRuleInput","onStart","_showGrid","onChange","slider","straighten","onEnd","_hideGrid","_cleanupFocalPointAfterStraighten","SHIFT_KEY","_handleConstraintChange","_handleOrientationClick","_applyCustomConstraint","_handleConstraintClick","constraint","currentTarget","siblings","_showCustomConstraint","_hideCustomConstraint","setCroppingConstraint","enforceCroppingConstraint","$constraints","$constraint","labelSelector","$label","split","reverse","join","replace","_getCustomConstraint","w","h","parseFloat","isNaN","_setCustomConstraint","$tab","tab","view","tabindex","showView","enableSlider","disableSlider","Promise","resolve","reject","disableCropMode","enableCropMode","zoomFactor","degrees","parseInt","imageZoomRatio","newAngle","angle","scaledImageDimensions","viewportProperties","imageProperties","angleInRadians","PI","newDeltaX","cos","sin","newDeltaY","modifiedDeltaX","modifiedDeltaY","temp","animate","duration","onComplete","cleanAngle","_adjustFocalPointByAngle","_resetFocalPointPosition","axis","editorCenter","setValue","properties","scaleY","scaleX","previousAngle","_adjustEditorElementsOnStraighten","newCenterX","newCenterY","angleDelta","currentZoomRatio","adjustmentRatio","cropperCenterX","cropperCenterY","imageVertices","getImageVerticeCoords","rectangle","_getZoomRatioToFitRectangle","_isCenterInside","opacity","object","containingObject","newFocalX","newFocalY","adjustedFocalX","adjustedFocalY","containingVertices","vertex","rectangleVertices","_getRectangleVertices","verticeIndex","arePointsInsideRectangle","edge","_getEdgeCrossed","rectangleCenter","distanceFromVertexToEdge","abs","sqrt","pow","distanceFromCenterToEdge","$button","postData","imageRotation","cropData","zoom","onSave","broadcaster","postMessage","runQueue","Preview","refresh","message","scaledWidth","scaledHeight","boundingBox","_getImageBoundingBox","scale","vertScale","horiScale","getCombinedZoomRatio","strokeOptions","gridWidth","gridHeight","xStep","yStep","Line","onFadeOut","removeAllListeners","_editorModeTransition","cropperData","_showCropper","_hideCropper","targetZoom","inverseZoomFactor","imageOffsetX","imageOffsetY","callback","pause","resume","clipperData","_setupCropperLayer","_redrawCropperElements","backgroundColor","hoverCursor","selection","position","rectangleRatio","rectWidth","rectHeight","lineOptions","gridOptions","pathGroup","Path","cropTextTop","cropTextBackgroundColor","previousImageArea","currentOffset","areaFactor","coordinateSet","a","b","c","d","_isMouseOver","move","handle","_cropperHandleHitTest","pageX","pageY","_handleMouseMoveInternal","_handleFocalDrag","_handleCropperDrag","_handleCropperResize","_setMouseCursor","vertices","dxi","dyi","furthest","furthestDeltas","newX","newY","previousHeight","previousWidth","startingRectangle","_calculateNewCropperSizeByDeltas","cropperDirection","topDelta","leftDelta","change","match","isMobileBrowser","cursor","parentOffset","offset","mouseX","mouseY","lb","rb","tb","bb","topLeft","topRight","bottomRight","bottomLeft","zoomMode","topVerticalSegment","bottomVerticalSegment","rightHorizontalSegment","leftHorizontalSegment","verticalOffset","horizontalOffset","_debug","fabricObj","points","ab","_getVector","bc","scalarAbAb","_getScalarProduct","scalarBcBc","point","ap","bp","scalarAbAp","scalarBcBp","projectsOnAB","projectsOnBC","_getVectorMagnitude","vector","_getAngleBetweenVectors","acos","edgePoints","centerPoint","smallestDiff","edgeCrossed","edgeIndex","toCenter","edgeVector","toVertex","diff","box","proportion","AssetIndex","BaseElementIndex","$includeSubfoldersContainer","$includeSubfoldersCheckbox","showingIncludeSubfoldersCheckbox","$uploadButton","$uploadInput","$progressBar","$folders","uploader","promptHandler","progressBar","_uploadTotalFiles","_uploadFileProgress","_currentUploaderSettings","_assetDrag","_folderDrag","_expandDropTargetFolderTimeout","_tempExpandedFolders","_fileConflictTemplate","choices","title","_folderConflictTemplate","context","_initIndexPageMode","$main","modal","_positionProgressBar","initSources","initSource","$source","_createFolderContextMenu","getSourceLevel","updateDropTargets","deinitSource","contextMenu","selectable","multiSelect","DragDrop","activeDropTargetClass","helperOpacity","getSelectedElements","has","helper","$file","_getFileDragHelper","dropTargets","$draggee","targets","$sources","hasAttr","onDragStart","_onDragStart","onDropTargetChange","_onDropTargetChange","onDragStop","_onFileDragStop","helperBaseZindex","$draggeeHelper","$helperSidebar","$helperNav","$helperUl","draggedSourceIds","each","_getVolumeOrFolderUidFromSourceKey","inArray","_onFolderDragStop","$activeDropTarget","originatingSource","targetFolderId","originalAssetIds","originalAssetId","getElementInfo","setIndexBusy","resetProgressBar","setItemCount","showProgressBar","parameterArray","action","params","folderId","_performBatchRequests","onMoveFinish","responseArray","resetPrompts","conflict","addPrompt","suggestedFilename","prompt","error","setIndexAvailable","hideProgressBar","reloadIndex","performAfterMoveActions","sourceSelect","selectItem","_totalVisible","deselectAllElements","_collapseExtraExpandedFolders","updateElements","getPromptCount","fadeOutHelpers","showBatchPrompts","returnData","newParameterArray","choice","filename","force","apply","returnHelpersToDraggees","folderIds","sort","parentId","requestId","fileMoveList","newSourceKey","success","transferList","newFolderId","newFolderUid","merge","_performActualFolderMove","folderDeleteList","moveCallback","counter","limit","setInstanceState","refreshSources","_selectSourceByFolderId","$targetSource","_getSourceByKey","$parentSources","parents","$parentSource","selectSource","afterInit","style","addButton","PromptHandler","ProgressBar","options","url","fileInput","dropZone","events","fileuploadstart","_onUploadStart","fileuploadprogressall","_onUploadProgress","fileuploaddone","_onUploadSuccess","fileuploadalways","_onUploadAlways","fileuploadfail","_onUploadFailure","criteria","kind","allowedKinds","Uploader","isIndexBusy","getDefaultSourceKey","defaultSource","defaultSourceParts","volumeSource","toArray","s","subfolderSource","_getChildSources","_expandSource","onSelectSource","sourceKey","setParams","_updateUrl","$parent","nestedSources","$thisSource","getParentSource","unshift","uri","forEach","$s","setPath","m","startSearching","hideSidebar","floor","random","insertAfter","$search","$subContainer","setSelecetedSourceState","checked","getSelectedSourceState","marginBottom","stopSearching","complete","getViewParams","includeSubfolders","progress","loaded","total","setProgressPercentage","result","selectElementAfterUpdate","file","isLastUpload","_uploadFollowup","_updateAfterUpload","jqXHR","responseJSON","clearSearch","setSelectedSortAttribute","doFollowup","parameterIndex","followupAlways","incrementProcessedItemCount","updateProgressBar","followupSuccess","sourceAssetId","conflictingAssetId","targetFilename","followupFailure","onUpdateElements","_onUpdateElements","getAllElements","newElements","$newElements","removeAllItems","$elements","_onKeyDown","elementSelect","_onElementFocus","shiftKey","PreviewFileModal","openInstance","selfDestruct","$element","$focusedItem","_loadPreview","item","startingWidth","startingHeight","$outerContainer","$innerContainer","_$firstRowCells","$helperCells","$helperCell","$firstRowCell","$dropTarget","clearTimeout","dropTargetFolder","_hasSubfolders","_isExpanded","setTimeout","_expandFolder","dropTargetFolderId","$excludedSources","_collapseFolder","splice","getSourceActions","actions","onSelect","_createSubfolder","_renameFolder","destructive","_deleteFolder","menuOptions","onClick","ContextMenu","menuClass","$parentFolder","subfolderName","folderName","_prepareParentForChildren","$subfolder","folderUid","$a","_appendSubfolder","displayNotice","$targetFolder","folder","trim","_cleanUpTree","oldName","newName","initSourceToggle","$existingChildren","subfolderLabel","folderInserted","$existingChild","before","deinitSourceToggle","scrollTop","windowHeight","finalCallback","activeRequests","parameters","shift","registerElementIndexClass","AssetSelectInput","BaseElementSelectInput","hud","$uploadBtn","openPreviewTimeout","arguments","canUpload","_attachUploader","updateAddElementsBtn","$elementsContainer","openPreview","onAddElements","clearOpenPreviewTimeout","minGutter","formData","fieldId","sourceElementId","siteId","$addElementBtn","describedBy","multiple","csrfTokenName","csrfTokenValue","canAddMoreFiles","_onUploadComplete","next","enableAddElementsBtn","disableAddElementsBtn","selectUploadedFile","canAddMoreElements","$newElement","prepend","margin","outerWidth","animateCss","addElements","thumbSize","viewMode","appendHeadHtml","headHtml","slotsTaken","AssetSelectorModal","BaseElementSelectorModal","$selectTransformBtn","_selectedTransform","transforms","createSelectTransformButton","$btnGroup","$primaryButtons","$selectBtn","$menuList","MenuButton","MenuBtn","onOptionSelect","onSelectTransform","disable","onSelectionChange","$selectedElements","elementIndex","allowTransforms","enable","option","transform","selectImagesWithTransform","transformUrls","imageIdsWithMissingUrls","$item","showFooterSpinner","fetchMissingTransformUrls","hideFooterSpinner","selectElements","pop","info","elementInfo","canSelectImageTransforms","registerElementSelectorModalClass","AuthManager","remainingSessionTime","checkRemainingSessionTimer","showLoginModalTimer","decrementLogoutWarningInterval","showingLogoutWarningModal","showingLoginModal","logoutWarningModal","loginModal","$logoutWarningPara","$passwordInput","$loginBtn","$loginErrorPara","submitLoginIfLoggedOut","username","updateRemainingSessionTime","setCheckRemainingSessionTimer","seconds","checkRemainingSessionTime","extendSession","ajax","dataType","textStatus","timeout","minSafeSessionTime","showLogoutWarningModal","checkInterval","showLoginModal","submitLogin","hideLogoutWarningModal","hideLoginModal","quickShow","$form","$logoutBtn","$renewSessionBtn","prependTo","autoShow","closeOtherModals","hideOnEsc","hideOnShadeClick","shadeClass","onFadeIn","updateLogoutWarningMessage","setInterval","decrementLogoutWarning","time","secondsToHumanTimeDuration","clearInterval","quick","quickHide","$inputContainer","$inputsFlexContainer","$passwordContainer","$buttonContainer","$passwordWrapper","PasswordInput","onToggleInput","$newPasswordInput","logout","redirectTo","renewSession","validatePassword","removeAttr","login","clearLoginError","loginName","password","showLoginError","shake","initialized","idPrefix","instanceState","sourceStates","sourceStatesStorageKey","searchTimeout","$sidebar","showingSidebar","rootSourceKey","sourceViewModes","$rootSource","sourcesByKey","$visibleSources","$sourceActionsContainer","$sourceActionsBtn","$toolbar","toolbarOffset","$searchContainer","$filterBtn","searching","searchText","sortByScore","trashed","drafts","$clearSearchBtn","$statusMenuBtn","$statusMenuContainer","statusMenu","status","$siteMenuBtn","siteMenu","$updateSpinner","$viewModeBtnContainer","viewModeBtns","_autoSelectElements","$countSpinner","$countContainer","$actionsContainer","page","resultSet","totalResults","$exportBtn","actionsHeadHtml","actionsBodyHtml","$selectAllContainer","$selectAllCheckbox","showingActionTriggers","exporters","exportersByType","_$triggers","_ignoreFailedRequest","_cancelToken","viewMenus","activeViewMenu","filterHuds","randomString","getDefaultInstanceState","storageKey","getLocalStorage","toolbarSelector","menubtn","_handleStatusChange","$option","$options","_setSite","_handleSiteChange","defaultSiteId","getSiteId","$storedSiteOption","updateElementsIfSearchTextChanged","queryParams","getQueryParams","selector","selectOption","setQueryParam","selectDefaultSource","lastDashPos","lastIndexOf","substring","dir","setPage","pageNum","onAfterInit","_createCancelToken","axios","CancelToken","source","token","_cancelRequests","cancel","getSourceContainer","getSite","sites","_getSourcesInList","Select","multi","allowEmpty","vertical","_handleSourceSelectionChange","getQueryParam","getSourceByKey","refreshSourcesAction","expandedSources","indexOf","$toggle","_getSourceToggle","selectedSource","paths","path","getDefaultExpandedSources","updateSortField","storeInstanceState","setLocalStorage","getSourceState","defaultValue","viewState","k","hasOwnProperty","includes","storeSortAttributeAndDirection","getPageUrl","history","replaceState","_resetCount","updateSourceMenu","empty","groupedActions","administrative","group","_buildActionList","$ul","userIsAdmin","allowAdminChanges","createCustomizeSourcesModal","updateViewMenu","hideTrigger","ViewMenu","showTrigger","search","batchSize","canHaveDrafts","savedDraftsOnly","draftOf","condition","disabledElementIds","paginated","_isViewPaginated","getSortAttributeAndDirection","sortAttribute","sortDirection","order","collapsedElementIds","serialized","filters","preservePagination","pageChanged","updateElementsAction","cancelToken","$scrollContainer","_updateView","$elementContainer","getElementContainer","firstFocusableElement","e","showActionTriggers","_createTriggers","submitAction","actionParams","selectedElementIds","getSelectedElementIds","_findAction","viewParams","expandPostArray","elementAction","elementIds","download","downloadFromUrl","submitActionsAction","badgeCounts","_updateBadgeCounts","afterAction","actionClass","onAfterAction","hideActionTriggers","detach","updateActionTriggers","totalSelected","getEnabledElements","setStatus","getSelectedSortAttribute","attribute","getSortOption","getDefaultSort","getSelectedSortDirection","direction","setSortAttribute","sortOption","defaultDir","attributes","lastAttr","oldHistory","orderHistory","setSortDirection","setSelectedSortDirection","canSortByStructure","alt","getSortOptions","getSortLabel","getSelectedViewMode","parentsUntil","getRootSource","Object","keys","updateContentHeading","$firstOption","getViewModesForSource","sourceViewMode","$viewModeBtn","className","mode","icon","selectViewMode","doesSourceHaveViewMode","updateFilterBtn","urlParams","setUrl","getUrl","selectSourceByKey","sortOptions","o","defaultSort","getTableColumnOptions","getTableColumnOption","getDefaultTableColumns","getSelectedTableColumns","setSelectedTableColumns","tableColumns","updateTableColumnField","viewModes","createView","getViewClass","TableElementIndexView","ThumbsElementIndexView","rememberDisabledElementId","forgetDisabledElementId","enableElements","onEnableElements","disableElements","onDisableElements","getElementById","enableElementsById","makeArray","disableElementsById","getButtonContainer","isShowingSidebar","buttonContainer","CustomizeSourcesModal","onHide","onSelectSite","elements","$selectedItems","_handleActionTriggerSubmit","getPostData","_handleMenuActionTriggerSubmit","selectedOption","queryParam","firstSite","updateSourceVisibility","$heading","$headings","setSiteId","toString","_handleSelectionChange","_handleSourceDblClick","_toggleSource","_handleSourceToggleClick","prev","$list","topLevel","_collapseSource","$childSources","activeElement","document","_countResults","itemLabel","elementTypeNames","elementTypeName","toLowerCase","itemsLabel","elementTypePluralName","last","countLabel","items","$paginationContainer","totalPages","ceil","$paginationNav","$prevBtn","role","disabled","$nextBtn","appendBodyHtml","bodyHtml","selectAllElements","checkboxMode","body","contains","focus","selectElementById","$badge","countElementsAction","count","$btn","triggers","safeMenuActions","destructiveMenuActions","formatInputId","$menuTrigger","$safeList","_createMenuTriggerList","$destructiveList","$div","_showExportHud","typeOptions","$typeField","createSelectField","$formatField","$typeSelect","formattable","$limitField","createTextField","placeholder","$submitBtn","HUD","submitting","format","showFilterHud","FilterHud","showing","hasRules","$sortAttributeSelect","$sortDirectionPicker","sortDirectionListbox","$tableColumnsContainer","$revertContainer","$revertBtn","$closeBtn","_buildMenu","DisclosureMenu","tidyTableColumnField","FX_DURATION","$scoreOption","select","$lastContainer","lastIndex","$checkbox","$checkboxes","_getTableColumnCheckboxes","defaultOrder","map","column","reduce","obj","checkboxA","checkboxB","revert","$metaContainer","_createSortField","_createTableColumnsField","$footerContainer","_createRevertBtn","$sortAttributeSelectContainer","createSelect","Listbox","$selectedOption","$field","createField","fieldset","columns","createCheckbox","DragSort","_onTableColumnChange","$selectedCheckboxes","compare","loading","$clearBtn","cleared","$loadingContent","hudClass","$hud","$tip","hudHtml","$btnContainer","clear","setBusy","setReady","setFocus","elem","func","setFocusWithin","updateSizeAndPositionInternal","searchOffset","getBoundingClientRect","onShow","serialize","BaseElementIndexView","$loadingMoreSpinner","$scroller","thumbLoader","loadingMore","_morePending","_handleEnableElements","_handleDisableElements","setTotalVisible","setMorePending","ElementThumbLoader","load","isVerticalList","_handleElementEditing","isTouchCapable","maybeLoadMore","selectElement","selectAll","deselectAll","getTotalVisible","totalVisible","getMorePending","morePending","canLoadMore","loadMore","loadMoreElementsAction","getLoadMoreParams","appendElements","onAppendElements","off","elementSort","elementEditor","fieldLabel","_initialized","isPlainObject","normalizedSettings","args","modalStorageKey","maintainHierarchy","getContainer","getFieldLabel","getElementsContainer","getAddElementsBtn","getSpinner","initElementSelect","initElementSort","resetElements","getElements","$targetItem","getSelectedItems","ignoreHandleSelector","getElementSortAxis","collapseDraggees","magnetStrength","helperLagBase","resetItemOrder","updateButtonContainer","showSpinner","hideSpinner","focusNextLogicalElement","focusLastRemoveBtn","$removeBtns","removeElements","editable","_handleShowElementEditor","removeElement","BACKSPACE_KEY","DELETE_KEY","assign","elementSelectInput","prevalidate","replaceElement","replacementId","$existing","$nextDeleteBtn","lastElementIndex","onRemoveElements","$allElements","_animateStructureElementAway","animateElementAway","right","REMOVE_FX_DURATION","showModal","createModal","createElementSelectorModal","getModalSettings","sources","hideOnSelect","showSiteMenu","getDisabledElementIds","onModalSelect","onModalHide","triggerElement","modalTitle","modalSettings","allowSelfRelations","selectStructuredElements","slotsLeft","slice","updateDisabledElementsInModal","createNewElement","appendElement","animateElementIntoPlace","onSelectElements","disableCancelBtn","disableSelectBtn","containerId","branchLimit","selectionLabel","onResponse","enableCancelBtn","enableSelectBtn","$newElementsContainer","filteredElements","clone","removeText","setElementSize","single","$modalElement","$inputElement","origOffset","destOffset","$helper","zIndex","ADD_FX_DURATION","$li","editorSettings","supportSidebarToggleView","$content","$sourceToggles","$sidebarToggleBtn","$sidebarCloseBtn","$mainHeading","$secondaryButtons","$headingId","fullscreen","updateModalBottomPadding","footerHeight","updateSidebarView","sidebarShouldBeHidden","buildSidebarToggleView","resetView","$mainHeader","$sidebarHeader","getActiveSourceName","toggle","controls","closeSidebar","toggleSidebar","sidebarIsOpen","openSidebar","uiLayerManager","addLayer","registerShortcut","ESC_KEY","$focusedEl","getFocusedElement","removeLayer","_createElementIndex","updateSelectBtnState","updateHeading","clearMouseUpTimeout","disableElementsOnSelect","bodyAction","createElementIndex","indexSettings","touchData","firstTap","secondTap","resizable","onCancel","BaseInputGenerator","listening","startListening","setNewSource","stopListening","onSourceTextChange","updateTarget","onTargetTextChange","onFormSubmit","is","sourceVal","targetVal","generateTargetValue","dispatchEvent","InputEvent","inputType","Event","selectFullValue","CategoryIndex","editableGroups","$newCategoryBtnGroup","$newCategoryBtn","updateButton","editableCategoryGroups","g","uid","defaultGroupHandle","selectedSourceHandle","$menuBtn","selectedGroup","menuId","visibleLabel","ariaLabel","isCtrlKeyPressed","originalEvent","button","open","_createCategory","$menuContainer","anchorRole","href","groupId","location","cpEditUrl","fresh","groupSourceKey","CategorySelectInput","selectedCategoryIds","categoryIds","$allCategories","_animateCategoryAway","charts","DataTable","rows","cellIndex","parseTime","d3","timeParse","Tip","setContent","setPosition","BaseChart","$chart","chartBaseClass","dataTable","formatLocale","timeFormatLocale","orientation","svg","globalSettings","formats","d3Formats","formatLocaleDefinition","d3FormatLocaleDefinition","timeFormatLocaleDefinition","d3TimeFormatLocaleDefinition","resize","baseSettings","draw","chartClass","onAfterDrawTicks","tickKey","tick","$tickText","numberFormat","percentFormat","currencyFormat","shortDateFormats","day","month","year","bottom","colors","Area","tip","drawingArea","getChartMargin","translateX","translateY","drawTicks","drawAxes","drawChart","drawTipTriggers","getX","xAxis","axisBottom","tickFormat","getXFormatter","ticks","call","yAxis","getY","axisLeft","getYFormatter","tickValues","getYTickValues","axisRight","showAxis","tickSizeOuter","gridlines","xLineAxis","tickSize","yLineAxis","line","datum","area","y0","y1","plots","enter","tips","chartMargin","xAxisTickInterval","node","getTotalLength","tipTriggerWidth","$xValue","$yValue","content","values","yTicksMaxWidth","computedTickWidth","formatter","padded","xDomainMin","xDomainMax","xDomain","scaleTime","range","domain","yDomain","getYMaxValue","scaleLinear","utils","getTimeFormatter","getNumberFormatter","maxValue","getDuration","secondsNum","hours","minutes","chartSettings","dataScale","ColorInput","$input","$colorContainer","$colorPreview","$colorInput","createColorInput","handleTextChange","input","createElement","setAttribute","updateColor","repeat","_browserSupportsColorInputs","doesBrowserSupportColorInputs","CpScreenSlideout","Slideout","namespace","showingLoadSpinner","hasTabs","hasCpLink","hasSidebar","$header","$tabContainer","$loadSpinner","$editLink","$sidebarBtn","$noticeContainer","tabManager","ignoreFailedRequest","fieldsWithErrors","ltr","showSidebar","$contents","containerElement","containerAttributes","method","novalidate","closeOnEsc","closeOnShadeClick","S_KEY","ctrl","handleSubmit","closeMeMaybe","refreshInitialData","showLoadSpinner","getParams","headers","requestOptions","update","deltaNames","initialDeltaValues","hideLoadSpinner","updateHeaderVisibility","forceShow","showHeader","submitButtonLabel","updateTabs","tabs","formAttributes","setElementAttributes","editUrl","sidebar","hostname","notice","Tabs","_closedSidebarStyles","offsetWidth","_openedSidebarStyles","one","trapFocusWithin","showSubmitSpinner","hideSubmitSpinner","submit","findDeltaData","handleSubmitResponse","handleSubmitError","clearErrors","notificationSettings","modelName","closeOnSubmit","close","isAxiosError","errors","showErrors","entries","fieldErrors","addErrorsToField","clearErrorsFromField","isDirty","isOpen","rxhtmlTag","jQuery","htmlPrefilter","navHeight","arr","isArray","grouped","thisKey","category","translations","formatMessage","pattern","tokens","_tokenizePattern","_parseToken","start","pos","depth","chars","param","arg","number","formatNumber","plural","selectorChars","p","formatDate","date","datepicker","datepickerOptions","dateFormat","shortcutText","clientOs","str","escapeRegex","getText","encodeUriComponent","encodeURIComponent","differences","chr","re","RegExp","setSelectionRange","inputName","rtrim","baseUrl","anchor","anchorPos","fromEntries","URLSearchParams","qsPos","isEmptyObject","pathParam","pathMatch","omitScriptNameInUrls","usePathInfo","scriptName","getCpUrl","baseCpUrl","getSiteUrl","baseSiteUrl","actionUrl","hash","origin","pathname","qs","pageTrigger","pageParam","getCsrfInput","postActionRequest","contentType","_actionHeaders","errorThrown","readyState","send","registeredAssetBundles","registeredJsFiles","toUpperCase","actionName","namespaceInputName","v","getTime","request","sendApiRequest","_getApiHeaders","apiHeaders","baseURL","baseApiUrl","apiParams","_apiHeaders","processCraftHeaders","httpProxy","proxy","apiResponse","_processApiHeaders","_loadingApiHeaders","_apiHeaderWaitlist","_rejectApiRequests","clearCachedApiHeaders","XMLHttpRequest","setRequestHeader","responseType","onload","disposition","getResponseHeader","matches","exec","blob","Blob","link","URL","createObjectURL","appendChild","click","removeChild","stringToArray","oldData","newData","modifiedDeltaNames","groupedOldParams","_groupParamsByDeltaNames","groupedNewParams","__root__","n","concat","withRoot","initialValues","encodeURIComponentExceptEqualChar","decodeURIComponent","paramLoop","paramName","serializeParam","subName","expanded","parentElem","createForm","chunks","obj1","obj2","sortObjectKeys","Array","getObjectKeys","escapeChars","escaped","ltrim","startsWith","substr","filterArray","filtered","removeFromArray","getLast","uppercaseFirst","charAt","lowercaseFirst","parseUrl","scheme","host","port","query","Proxy","searchParams","isSameHost","requestUrlInfo","urlInfo","showSeconds","secondsInWeek","weeks","days","timeComponents","asciiString","charMap","normalize","char","asciiStr","asciiCharMap","uuid","crypto","randomUUID","getRandomValues","Uint8Array","namespaceId","createErrorList","$existingCss","existingCss","regexp","$existingJs","src","existingJs","appendFootHtml","infoicon","checkboxselect","fieldtoggle","lightswitch","nicetext","formsubmit","datetime","datetimeinput","_elementIndexClasses","_elementSelectorModalClasses","_elementEditorClasses","registerElementEditorClass","ElementEditorSlideout","systemUid","localStorage","parse","removeLocalStorage","removeItem","getCookie","cookie","setCookie","defaultCookieOptions","maxAge","expires","toUTCString","secure","removeCookie","hasThumb","otherSize","$oldImg","$newImg","sizes","srcset","picturefill","submitForm","redirect","retainScroll","scrollY","filterInputVal","regex","selectionStart","newVal","filterNumberInputVal","dataAttributes","subValue","isVisible","visibilityState","useMobileStyles","pageId","BroadcastChannel","channelName","appId","messageReceiver","addEventListener","instances","elementHtml","$replacement","$inputs","fn","animateLeft","easing","animateRight","$elem","itemSelector","cols","maxCols","minColWidth","fillMode","colClass","snapToGrid","Grid","InfoIcon","CheckboxSelect","FieldToggle","settingName","settingValue","thisSettings","indeterminateValue","LightSwitch","NiceText","$anchor","customTrigger","menuAnchor","$wrapper","checkValue","hasValue","charsLeftHtml","charsLeft","ready","$elementIndexSourcesContainer","$sourcesContainer","$sourcesHeader","$sourcesHeading","$sourceSettingsContainer","$sourceSettingsHeader","$addSourceMenu","addSourceMenu","$footerBtnContainer","$loadingSpinner","sourceSort","baseSortOptions","availableTableAttributes","customFieldAttributes","conditionBuilderHtml","conditionBuilderJs","userGroups","setContainer","buildModal","defaultSortOptions","addSource","$menuBtnContainer","sourceData","scrollContainerToElement","$newHeadingBtn","focusLabelInput","$newCustomSourceBtn","tableAttributes","$labelInput","getSourceName","focusIsInside","currentLayer","isNew","$itemLabel","$itemInput","Heading","updateItemLabel","heading","Source","CustomSource","save","disabledSourceKeys","reload","appendIndexSourceItem","$sourceItem","$lastSourceItem","isHeading","$lastTopLevelSource","BaseSource","$settingsContainer","handleActivatingKeypress","isNative","isSelected","deselect","createSettings","getIndexSourceItem","$sortDirectionInput","createLightswitchField","createSortField","createTableAttributesField","handleSortAttributeChange","useDefaultDir","$columnCheckboxes","selectedAttributes","createTableColumnOption","instructions","$labelField","defaultId","swapPlaceholders","createCheckboxSelectField","showAllOption","handleLabelInputChange","table","$rows","getHelper","caboose","Y_AXIS","$helperRow","helperClass","$cells","DeleteUserModal","userId","$deleteActionRadios","$deleteSubmitBtn","userSelect","_deleting","idParam","contentSummary","_submitBtnLabel","validateDeleteInputs","withContent","num","validates","onSubmit","DynamicGenerator","EditableTable","baseName","biggestId","$addRowBtn","$tableParent","$statusMessage","rowCount","hasMaxRows","hasMinRows","radioCheckboxes","copyDraggeeInputValuesToHelper","updateAllRows","initialize","initializeIfVisible","minRows","createRowObj","updateAddRowButton","canAddRow","staticRows","updateRow","canDeleteRow","updateDeleteRowButton","rowId","updateStatusMessage","allowDelete","deleteRow","$tr","onDeleteRow","allowAdd","maxRows","rowIdPrefix","createRow","defaultValues","onAddRow","allowReorder","Row","focusOnPrevRow","tdIndex","blurTd","prevRow","$prevTr","$tds","focusOnNextRow","nextRow","$nextTr","importData","lines","j","textualColTypes","colId","$cell","col","scope","code","small","createDateInput","createLightswitch","createTimeInput","createTextInput","niceTexts","tds","$textareas","tr","td","$textarea","textareasByColId","onHeightChange","onTextareaHeightChange","radioMode","applyToggleCheckbox","autopopulate","HandleGenerator","allowNonAlphaStart","onTextareaFocus","onRadioCheckboxChange","checkbox","checkboxColId","neg","checkboxCol","colum","ignoreNextTextareaFocus","handleKeypress","charCode","handlePaste","clipboardData","getData","validateValue","safeValue","tallestTextareaHeight","tdHeight","numericKeyCodes","ElementActionTrigger","maxLevels","newChildUrl","triggerEnabled","batch","bulk","defineProperty","activate","updateTrigger","validateSelection","enableTrigger","disableTrigger","valid","handleTriggerActivation","ElementEditor","isFullPage","$contentContainer","$revisionBtn","$revisionLabel","$expandSiteStatusesBtn","$statusIcon","$previewBtn","$editMetaBtn","metaHud","$nameTextInput","$saveMetaBtn","$siteStatusPane","$globalLightswitch","$siteLightswitches","$additionalSiteField","siteIds","newSiteIds","enableAutosave","lastSerializedValue","listeningForChanges","pauseLevel","queue","submittingForm","duplicatedElements","failed","httpStatus","httpError","openingPreview","preview","activatedPreviewToken","previewTokenQueue","previewLinks","hiddenTipsStorageKey","tipDismissBtn","slideout","$primaryForm","_createQueue","autosaveDrafts","siteStatuses","$spinnerContainer","canEditMultipleSites","previewTargets","enablePreview","$previewBtnContainer","createPreviewLink","createShareMenu","revisionId","serializeForm","isProvisionalDraft","initForProvisionalDraft","isUnpublishedDraft","initForDraft","canSaveCanonical","saveShortcut","createDraft","listenForChanges","showStatusHud","handleDismissibleTips","canonicalId","canCreateDrafts","statusIcons","checkForm","stopListeningForChanges","$discardButton","initialHeight","$notice","heightDiff","hashedCpEditUrl","provisional","createEditMetaBtn","expandSiteStatuses","$enabledForSiteField","_getOtherSupportedSites","_createSiteStatusField","$globalField","_showField","siteStatusValues","hasEnabled","hasDisabled","originalEnabledValue","originalSerializedStatus","enabledForSite","_updateGlobalStatus","serializedStatuses","additionalSites","_createAddlSiteField","_updateSiteStatuses","_removeField","allEnabled","allDisabled","turnOn","turnOff","turnIndeterminate","enabled","site","fieldClass","$lightswitch","some","selectLabelId","$addlSiteSelectLabel","$addlSiteSelectContainer","labelledBy","$addlSiteSelect","addlSiteInfo","enabledByDefault","_saveFailMessage","_saveSuccessMessage","$mainContainer","spinners","statusMessage","getTokenizedPreviewUrl","targetUrl","targetLabel","activatePreviewToken","updatePreviewLinks","updatePreviewLinkHref","isLive","getPreviewTokenParams","previewToken","getPreviewToken","randoParam","asPromise","siteToken","previewUrl","tokenParam","createTokenParams","getPreview","$statusIcons","scrollTo","ensureIsDraftOrRevision","onlyIfChanged","removeActionParams","isPreviewActive","$editor","redirectName","saveDraft","isActive","modifiedFieldNames","preparedData","prepareData","deltaName","extraData","visibleLayoutElements","selectedTabId","_saveHeaders","_afterSaveDraft","createdProvisionalDraft","docTitle","draftName","revisionMenu","oldId","siteSettings","creator","timestamp","updatePreviewTargets","checkMetaValues","selectors","modifiedAttributes","$fields","noChanges","$allTabContainers","changedElements","missingElements","tabInfo","$oldElement","$placeholder","$unusedTabContainers","afterUpdate","_showFailStatus","setStatusMessage","deltaCallback","swapDuplicatedElementIds","idsRE","namespacedFields","pre","post","duplicate","_filterFieldInputName","nestedNames","lastHandle","fieldsWithoutContent","newTarget","$previewLink","delay","showMetaHud","createMetaHud","onMetaHudShow","$hudBody","$nameField","$nameInputContainer","saveMeta","onMetaHudHide","onMetaHudEscape","shakeMetaHud","autosave","$confirmUnloadForms","hideTip","getHiddenTipsUids","setHiddenTipsUids","uids","targetElement","$targetParent","layoutElementUid","Storage","hiddenTips","editor","saveParams","onSaveElement","validators","ElementFieldSettings","allowMultipleSources","$maintainHierarchyField","$maintainHierarchyInput","$sourcesField","$sourceSelect","$branchLimitField","$maxRelationsField","$minRelationsField","maintainHierarchyFieldId","sourcesFieldId","branchLimitFieldId","minRelationsFieldId","maxRelationsFieldId","updateLimitFields","updateMaintainHierarchyField","showField","$checkedInputs","workers","Worker","$thumbs","$thumb","$scrollParent","scrollParent","addToQueue","invisibleThumbs","thumb","active","loadNext","scrollParentOffset","scrollParentHeight","thumbOffset","retryAll","loader","$img","ElevatedSessionForm","inputs","form","getInputPostVal","handleFormSubmit","elevatedSessionManager","fetchingTimeout","stopImmediatePropagation","inputsChanged","$currentInput","requireElevatedSession","ElevatedSessionManager","passwordModal","$errorPara","minSafeElevatedSessionTimeout","showPasswordModal","$passwordModal","focusPasswordInput","submitPassword","currentPassword","showPasswordError","EntryIndex","publishableSections","$newEntryBtnGroup","$newEntryBtn","defaultSectionHandle","selectedSection","section","_createEntry","sectionId","entry","sectionSourceKey","FieldLayoutDesigner","$configInput","$newTabBtn","$libraryToggle","$selectedLibrary","$fieldLibrary","$uiLibrary","$uiLibraryElements","$fieldSearch","$clearFieldSearchBtn","$fieldGroups","tabGrid","elementDrag","_config","$workspace","$fieldSearchContainer","initTab","ElementDrag","customizableTabs","tabDrag","TabDrag","customizableUi","$libraryPicker","$matches","$group","Tab","removeFieldByHandle","addTab","updatePositionInConfig","config","updateConfig","createSlideout","contents","js","eval","designer","destroyed","settingsNamespace","createMenu","initElement","menuBtn","onTabOptionSelect","$prev","$next","settingsHtml","settingsJs","applySettings","$indicator","hasConditions","Element","findIndex","designerConfig","newIndex","tabConfig","oldIndex","isField","requirable","hasCustomWidth","hasSettings","isRequired","showSettings","initUi","SlidePicker","step","valueLabel","pct","$fieldsContainer","selectorHtml","updateRequiredClass","required","elementConfig","BaseDrag","Drag","$insertion","showingInsertion","$caboose","findItems","createInsertion","createCaboose","removeCaboose","swapDraggeeWithInsertion","swapInsertionWithDraggee","setMidpoints","getClosestItem","_closestItem","_closestItemMouseDiff","_i","_$item","_midpoint","_mouseDiff","getDist","checkForNewClosestItem","refreshCols","display","draggeeDisplay","visibility","helpers","_showDraggee","onDrag","draggingLibraryElement","draggingField","originalTab","isDraggeeMandatory","isHoveringOverTab","hitTest","$fieldContainers","$libraryElement","targetPrefix","reverseTargetSelector","_$reverseTarget","getType","normalizeTargetSelector","findTargets","onToggleChange","nodeName","getToggleVal","boolean","postVal","_show","totalCols","colGutterDrop","colPctWidth","possibleItemColspans","possibleItemPositionsByColspan","itemPositions","itemColspansByPosition","layouts","layout","itemHeights","leftPadding","_refreshingCols","_refreshColsAfterRefresh","_forceRefreshColsAfterRefresh","handleContainerHeightProxy","setItems","oldHeight","scrollHeight","gutter","itemIndex","tallestItemHeight","colIndex","itemHeight","remainder","itemHeightsByColspan","positionRight","positionLeft","minColspan","maxColspan","colspan","getItemWidthCss","minPosition","maxPosition","colHeights","createLayouts","layoutTotalCols","highestTotalCols","layoutHeights","shortestHeight","shortestLayouts","emptySpaces","emptySpace","colspans","getItemLeftPosCss","positions","isSimpleLayout","positionItems","completeRefreshCols","onRefreshCols","getItemWidth","getItemWidthInPx","getItemLeftPosInPx","prevPositions","prevColspans","prevColHeights","prevEmptySpace","LayoutGenerator","endingCol","affectedColHeights","onItemResize","newHeight","tallestColHeightsByPosition","colHeightsForPosition","tallestColHeight","words","handleCasing","ImageUpload","initImageUpload","containerSelector","uploadAction","postParameters","fileInputSelector","uploadParamName","initButtons","uploadButtonSelector","deleteButtonSelector","refreshImage","onAfterRefreshImage","$icon","$liveRegion","wrap","previousSibling","nodeType","Node","TEXT_NODE","nodeValue","showHud","closeOtherHUDs","indeterminate","dragger","dragStartMargin","outerContainer","X_AXIS","_onDrag","_onDragStop","muteEvent","changed","_onSettle","_getOffMargin","_onMouseDown","_onMouseUp","dragging","_getMargin","mouseDistX","selectedOptionIndex","selectedClass","focusClass","LivePreview","$extraFields","$dragHandle","$previewContainer","$iframeContainer","$iframe","$fieldPlaceholder","basePostData","inPreviewMode","fields","lastPostData","updateIframeInterval","checkAgain","dragStartEditorWidth","_slideInOnIframeLoad","_scrollX","_scrollY","_editorWidth","_editorWidthInPx","protocol","previewParams","extraFields","defaultEditorWidth","moveFieldsBack","editorWidthInPx","inPx","minEditorWidthInPx","exit","$editorHeader","handleWindowResize","getIframeWidth","$clone","_getClone","updateIframe","slideIn","createToken","previewAction","submitPrimaryForm","updateWidths","$newClone","field","contentWindow","scrollLeft","xhrFields","withCredentials","crossDomain","handleSuccess","handleError","forceUpdateIframe","write","copyInputValues","livePreview","$textInput","$showPasswordToggle","showingPassword","passwordInput","initInputFocusEvents","hidePassword","setCurrentInput","updateToggleLabel","showPassword","autocapitalize","togglePassword","onInputChange","selectionEnd","$previewWrapper","$previewSkipLink","$bumperLink","$notifier","$previewHeader","$targetBtn","$targetMenu","$deviceTypeContainer","$orientationBtn","$refreshBtn","$deviceMask","$devicePreviewContainer","iframeLoaded","$tempInput","activeTarget","currentDeviceType","deviceOrientation","deviceWidth","deviceHeight","deviceMaskDimensions","phone","tablet","iframeHeight","_updateIframeProxy","previewSkipLinkText","$modalLabel","Pro","switchTarget","_buildDeviceTypeFieldset","_getDeviceTypeTranslation","translation","_getDeviceOrientationTranslation","deviceType","deviceBtnGroup","switchDeviceType","_activeTarget","_autoRefresh","previewTarget","hideModalBackgroundLayers","resetModalBackgroundLayerVisibility","_devicePreviewIsActive","updateDevicePreview","_useIframeResizer","previewIframeResizerOptions","resetScroll","sameHost","frameborder","iFrameResize","checkOrigin","scrolling","onInit","iframe","_updateNotifier","newDeviceType","switchOrientation","hZoom","wZoom","previewHeight","previewWidth","maskHeight","maskWidth","translate","rotationDeg","marginTop","marginLeft","$triggerElement","$bumperButtonStart","$bumperButtonEnd","defaultSettings","_onHide","instance","loadAsset","focusItem","_addBumperButtons","_addModalName","headingId","destruct","desiredHeight","desiredWidth","containerHeight","containerWidth","_resizeContainer","previewHtml","$innerProgressBar","$progressBarStatus","_itemCount","_processedItemCount","_displaySteps","displaySteps","setProcessedItemCount","fadeTo","incrementItemCount","percentage","$modalContainerDiv","$prompt","$promptApplyToRemainingContainer","$promptApplyToRemainingCheckbox","$promptApplyToRemainingLabel","$pomptChoices","_prompts","_promptBatchCallback","_promptBatchReturnData","_promptBatchNum","_showNextPromptInBatch","remainingInBatch","_showPrompt","_handleBatchPromptSelection","applyToRemaining","choiceData","itemsToGo","_promptCallback","$promptMessage","$promptChoices","$promptButtons","$radioButton","_selectPromptChoice","fadeOut","_cancelPrompt","running","paused","pausedForVisibility","jobs","isPaused","_resume","job","_add","qResolve","qReject","_exec","totalSteps","HOME_KEY","END_KEY","_min","_max","Number","isInteger","prevAll","triggerEvent","$activeButton","startPositionX","graduationsMin","graduationsMax","slideMin","slideMax","$overlay","$cursor","$graduations","$graduationsUl","_handleResize","_handleTapStart","_handleTapMove","_handleTapEnd","_handleKeypress","graduationsCalculatedWidth","valueToPosition","current","PAGE_UP_KEY","PAGE_DOWN_KEY","touch","startLeft","curX","positionToValue","scaleMin","scaleMax","addModalAttributes","autoOpen","setTriggerElement","_cancelTransitionListeners","addPanel","removePanel","openPanels","panel","updateStyles","totalPanels","SlugGenerator","allowUppercaseInSlug","limitAutoSlugsToAscii","XRegExp","matchChain","slugWordSeparator","Structure","structureDrag","$parents","initToggle","StructureDrag","initNewChildMenus","viewStateKey","$addBtns","onNewChildMenuClick","showMenu","getIndent","level","baseIndent","nestedIndent","addElement","$parentUl","_removeUl","structure","draggeeLevel","$helperLi","$targets","draggeeHeight","$level","cancelDrag","$lis","$closestTarget","closestTargetPos","closestTargetYDiff","closestTargetOffset","closestTargetHeight","targetOffset","targetHeight","targetYMidpoint","targetYDiff","$closestTargetLi","closestTargetLevel","$nextTargetLi","nextTargetLevel","hoveringBetweenRows","draggeeX","targetItemMouseDiffX","$parentLis","$closestParentLi","closestParentLiXDiff","closestParentLevel","$parentLi","parentLiX","parentLiXDiff","parentLevel","onMouseUp","$draggeeParent","moved","$closestSiblings","newLevel","setLevel","structureId","prevId","indent","$childLis","StructureTableSorter","tableView","_basePadding","_helperMargin","_$titleHelperCell","_titleHelperCellOuterWidth","_ancestors","_updateAncestorsFrame","_draggeeLevel","_draggeeLevelDelta","draggingLastElements","_loadingDraggeeLevelDelta","_targetLevel","_targetLevelBounds","_positionChanged","singleHelper","helperSpacingY","findDraggee","$nextRow","nextRowLevel","nextRowLevelDelta","_getAjaxBaseData","delta","drag","canInsertBefore","_getLevelBounds","canInsertAfter","_getAncestors","_setTargetLevelBounds","_updateIndent","onInsertionPointChange","_updateAncestorsBeforeRepaint","levelDiff","padding","_getLevelIndent","$prevRow","prevRowLevel","$spinnerRow","_createSpinnerRowAfter","onPositionChange","_expandElement","onReturnHelpersToDraggees","newDraggeeIndexes","oldDraggeeIndexes","$postDraggeeItems","nextAll","_minLevel","_maxLevel","forcePositionChange","_mouseDist","realMouseX","mousedownX","_indentationDist","LEVEL_INDENT","_targetLevelMouseDiff","_magnetImpact","MAX_GIVE","_closestLevelMagnetIndent","targetLevel","_level","_$prevRow","cancelAnimationFrame","_updateAncestors","_$ancestor","_newAncestors","ancestorTitle","HELPER_MARGIN","$tableCaption","$selectedSortHeader","structureTableSort","_totalVisiblePostStructureTableDraggee","_morePendingPostStructureTableDraggee","_broadcastListener","initTableHeaders","_updateScreenReaderStatus","_collapseElement","attributeHtml","selectedSortAttr","$tableHeaders","sortValue","selectedSortDir","makeColumnSortable","sorted","headerHtml","$instructions","$headerButton","_handleSelectedSortHeaderClick","_handleUnselectedSortHeaderClick","_isStructureTableDraggingLastElements","positionedAfter","updateResponsiveTables","$nextNextRow","descendantOf","$nextRows","newSortDir","_handleSortHeaderClick","_updateTableAttributes","removeEventListener","$tablist","$firstTab","$lastTab","$selectedTab","$focusableTab","selectTab","makeTabFocusable","scrollToTab","updateMenuBtn","_getTab","deselectTab","elemScrollOffset","targetScrollLeft","tabWidth","ulWidth","HTMLElement","TagSelectInput","searchMenu","$addTagInput","_ignoreBlur","searchForTags","selectTag","$hoverOption","$nextOption","focusOption","$prevOption","killSearchMenu","excludeIds","tagGroupId","tags","exclude","exactMatch","Menu","attachToElement","targetSiteId","$titleContainer","autocomplete","inputmode","maxlength","autofocus","getAutofocusValue","getDisabledValue","readonly","showCharsLeft","createCopyTextInput","buttonId","execCommand","createCopyTextBtn","copyValue","createCopyTextField","createCopyTextPrompt","createTextarea","createTextareaField","$select","optgroup","$optgroup","selected","reverseToggle","for","createCheckboxField","createCheckboxSelect","allValue","allChecked","allLabel","labelId","$colorPreviewContainer","createColorField","isMobile","getMonth","toISOString","timezone","defaultDate","hasOuterContainer","createDateField","createDateRangePicker","today","getFullYear","getDate","startDate","endDate","$allOption","firstDayOffset","getDay","firstDay","$flex","$startDate","$endDate","$dateInputs","dpDiv","setPositionRelativeToAnchor","startTime","endTime","foundOption","btnClasses","timepicker","timepickerOptions","getHours","getMinutes","getSeconds","createTimeField","warning","$warning","addErrorsToList","$errors","_rejectedFiles","_extensionList","_totalFileCounter","_validFileCounter","autoUpload","fileupload","onFileAdd","paramObject","getInProgress","validateExtension","_createExtensionList","process","done","files","pass","fileExtension","maxFileSize","originalFiles","processErrorMessages","kinds","humanFileSize","maxUploadSize","bytes","threshold","u","toFixed","allowedKind","fileKinds","extensions","ext","pasteZone","sequentialUploads","Accept","UriFormatGenerator","uriFormat","suffix","UserIndex","updateUrl","defaultSourceSlug","slug","__esModule","default","module","locals","exports","listToStyles","list","styles","newStyles","part","media","sourceMap","parts","hasDocument","DEBUG","Error","stylesInDom","head","getElementsByTagName","singletonElement","singletonCounter","isProduction","ssrIdKey","isOldIE","navigator","userAgent","addStylesClient","_isProduction","_options","addStylesToDom","newList","mayRemove","domStyle","refs","addStyle","createStyleElement","styleElement","querySelector","parentNode","styleIndex","applyToSingletonTag","applyToTag","newObj","textStore","replaceText","replacement","Boolean","styleSheet","cssText","cssNode","createTextNode","childNodes","ssrId","btoa","unescape","firstChild","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","getter","definition","enumerable","prototype","CP","authManager","$nav","$navToggle","$globalSidebar","$globalContainer","$alerts","$crumbs","$breadcrumbList","$breadcrumbItems","$notificationContainer","$headerContainer","$mainContent","$details","$sidebarContainer","$sidebarToggle","$edition","$deltaForms","$collapsibleTables","fixedHeader","breadcrumbListWidth","breadcrumbDisclosureItem","enableQueue","totalJobs","jobInfo","displayedJobInfo","displayedJobInfoUnchanged","trackJobProgressTimeout","jobProgressIcon","checkingForUpdates","forcingRefreshOnUpdatesCheck","includingDetailsOnUpdatesCheck","checkForUpdatesCallbacks","resizeTimeout","$allInstructions","updateFixedHeader","setSidebarNavAttributes","initSpecialForms","initAlerts","shortcuts","shortcut","initTabs","LOCATION_HASH","_handleInputFocus","_handleInputBlur","announcements","$unreadMessage","hasUnreads","unread","footer","IntersectionObserver","classList","intersectionRatio","rootMargin","observe","$contentHeader","$forms","confirmUnload","returnValue","updateSidebarMenuLabel","toggleNav","isExpanded","navIsExpanded","disableGlobalSidebarLinks","enableGlobalSidebarLinks","focusableItems","isAlwaysVisible","getComputedStyle","getPropertyValue","newState","toggleClass","$tabsContainer","$tabsList","selectedTabIndex","handleBreadcrumbVisibility","breadcrumbItemsWrap","listWidth","totalItemWidth","finalIndex","visibleItemWidth","shownItems","hiddenItems","_$table","_containerWidth","_check","_isCollapsed","headerHeight","displayNotification","notification","Notification","notificationType","iconLabel","fetchAlerts","alerts","displayAlerts","$shunnableAlerts","$link","checkForUpdates","forceRefresh","includeDetails","realCallback","_checkForUpdates","updateUtilitiesBadge","callbacks","updateInfo","_getUpdates","_checkForCachedUpdates","cached","onlyIfCached","updates","_cacheUpdates","$utilitiesLink","$screenReaderText","badgeCount","runQueueAutomatically","trackJobProgress","_trackJobProgressInternal","setJobInfo","oldInfo","getDisplayedJobInfo","progressLabel","updateJobIcon","statuses","JOB_STATUS_RESERVED","JOB_STATUS_FAILED","JOB_STATUS_WAITING","JobProgressIcon","hideFailMode","setDescription","description","setProgress","showFailMode","cpTrigger","notificationDuration","JOB_STATUS_DONE","closing","closeTimeout","_preventDelayedClose","originalActiveElement","$closeBtnContainer","details","_negMargin","_initDelayedClose","delayedClose","preventDelayedClose","$progressLabel","failMode","_$bgCanvas","_$staticCanvas","_$hoverCanvas","_$failCanvas","_staticCtx","_hoverCtx","_canvasSize","_arcPos","_arcRadius","_lineWidth","_arcStartPos","_arcEndPos","_arcStartStepSize","_arcEndStepSize","_arcStep","_arcStepTimeout","_arcAnimateCallback","_progressBar","canAccessQueueManager","$canvasContainer","$labelContainer","_createCanvas","getContext","_drawArc","_animateArc","_setArc","color","$canvas","ctx","strokeStyle","lineWidth","lineCap","startPos","endPos","clearRect","beginPath","arc","closePath","targetStartPos","targetEndPos","_takeNextArcStep"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"cp.js","mappings":"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","sources":["webpack:///./js/Accordion.js","webpack:///./js/AddressesInput.js","webpack:///./js/AdminTable.js","webpack:///./js/AssetImageEditor.js","webpack:///./js/AssetIndex.js","webpack:///./js/AssetSelectInput.js","webpack:///./js/AssetSelectorModal.js","webpack:///./js/AuthManager.js","webpack:///./js/BaseElementIndex.js","webpack:///./js/BaseElementIndexView.js","webpack:///./js/BaseElementSelectInput.js","webpack:///./js/BaseElementSelectorModal.js","webpack:///./js/BaseInputGenerator.js","webpack:///./js/CategoryIndex.js","webpack:///./js/CategorySelectInput.js","webpack:///./js/Chart.js","webpack:///./js/ColorInput.js","webpack:///./js/CpScreenSlideout.js","webpack:///./js/Craft.js","webpack:///./js/CustomizeSourcesModal.js","webpack:///./js/DataTableSorter.js","webpack:///./js/DeleteUserModal.js","webpack:///./js/DynamicGenerator.js","webpack:///./js/EditableTable.js","webpack:///./js/ElementActionTrigger.js","webpack:///./js/ElementEditor.js","webpack:///./js/ElementEditorSlideout.js","webpack:///./js/ElementFieldSettings.js","webpack:///./js/ElementThumbLoader.js","webpack:///./js/ElevatedSessionForm.js","webpack:///./js/ElevatedSessionManager.js","webpack:///./js/EntryIndex.js","webpack:///./js/FieldLayoutDesigner.js","webpack:///./js/FieldToggle.js","webpack:///./js/Grid.js","webpack:///./js/HandleGenerator.js","webpack:///./js/ImageUpload.js","webpack:///./js/InfoIcon.js","webpack:///./js/LightSwitch.js","webpack:///./js/Listbox.js","webpack:///./js/LivePreview.js","webpack:///./js/PasswordInput.js","webpack:///./js/Preview.js","webpack:///./js/PreviewFileModal.js","webpack:///./js/ProgressBar.js","webpack:///./js/PromptHandler.js","webpack:///./js/Queue.js","webpack:///./js/SlidePicker.js","webpack:///./js/SlideRuleInput.js","webpack:///./js/Slideout.js","webpack:///./js/SlugGenerator.js","webpack:///./js/Structure.js","webpack:///./js/StructureDrag.js","webpack:///./js/StructureTableSorter.js","webpack:///./js/TableElementIndexView.js","webpack:///./js/Tabs.js","webpack:///./js/TagSelectInput.js","webpack:///./js/ThumbsElementIndexView.js","webpack:///./js/UI.js","webpack:///./js/Uploader.js","webpack:///./js/UriFormatGenerator.js","webpack:///./js/UserIndex.js","webpack:///./css/charts.scss?4afb","webpack:///./css/craft.scss?1b58","webpack:///../../../../../node_modules/vue-style-loader/lib/listToStyles.js","webpack:///../../../../../node_modules/vue-style-loader/lib/addStylesClient.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///external var \"jQuery\"","webpack:///./js/CP.js"],"sourcesContent":["/** global: Craft */\n/** global: Garnish */\n/**\n * Accordion\n */\nCraft.Accordion = Garnish.Base.extend({\n  $trigger: null,\n  targetSelector: null,\n\n  _$target: null,\n\n  init: function (trigger) {\n    this.$trigger = $(trigger);\n\n    // Is this already an accordion trigger?\n    if (this.$trigger.data('accordion')) {\n      console.warn('Double-instantiating an accordion trigger on an element');\n      this.$trigger.data('accordion').destroy();\n    }\n\n    this.$trigger.data('accordion', this);\n    this.targetSelector = this.$trigger.attr('aria-controls')\n      ? `#${this.$trigger.attr('aria-controls')}`\n      : null;\n\n    if (this.targetSelector) {\n      this._$target = $(this.targetSelector);\n    }\n\n    this.addListener(this.$trigger, 'click', 'onTriggerClick');\n    this.addListener(this.$trigger, 'keypress', (event) => {\n      const key = event.keyCode;\n\n      if (key === Garnish.SPACE_KEY || key === Garnish.RETURN_KEY) {\n        event.preventDefault();\n        this.onTriggerClick();\n      }\n    });\n  },\n\n  onTriggerClick: function () {\n    const isOpen = this.$trigger.attr('aria-expanded') === 'true';\n\n    if (isOpen) {\n      this.hideTarget(this._$target);\n    } else {\n      this.showTarget(this._$target);\n    }\n  },\n\n  showTarget: function ($target) {\n    if ($target && $target.length) {\n      this.showTarget._currentHeight = $target.height();\n\n      $target.removeClass('hidden');\n\n      this.$trigger\n        .removeClass('collapsed')\n        .addClass('expanded')\n        .attr('aria-expanded', 'true');\n\n      for (let i = 0; i < $target.length; i++) {\n        (($t) => {\n          if ($t.prop('nodeName') !== 'SPAN') {\n            $t.height('auto');\n            this.showTarget._targetHeight = $t.height();\n            $t.css({\n              height: this.showTarget._currentHeight,\n              overflow: 'hidden',\n            });\n\n            $t.velocity('stop');\n\n            $t.velocity(\n              {height: this.showTarget._targetHeight},\n              Garnish.getUserPreferredAnimationDuration('fast'),\n              function () {\n                $t.css({\n                  height: '',\n                  overflow: '',\n                });\n              }\n            );\n          }\n        })($target.eq(i));\n      }\n\n      delete this.showTarget._targetHeight;\n      delete this.showTarget._currentHeight;\n\n      // Trigger a resize event in case there are any grids in the target that need to initialize\n      Garnish.$win.trigger('resize');\n    }\n  },\n\n  hideTarget: function ($target) {\n    if ($target && $target.length) {\n      this.$trigger\n        .removeClass('expanded')\n        .addClass('collapsed')\n        .attr('aria-expanded', 'false');\n\n      for (let i = 0; i < $target.length; i++) {\n        (($t) => {\n          if ($t.hasClass('hidden')) {\n            return;\n          }\n          if ($t.prop('nodeName') === 'SPAN') {\n            $t.addClass('hidden');\n          } else {\n            $t.css('overflow', 'hidden');\n            $t.velocity('stop');\n            $t.velocity(\n              {height: 0},\n              Garnish.getUserPreferredAnimationDuration('fast'),\n              function () {\n                $t.addClass('hidden');\n              }\n            );\n          }\n        })($target.eq(i));\n      }\n    }\n  },\n\n  destroy: function () {\n    this.$trigger.removeData('accordion');\n    this.base();\n  },\n});\n","/** global: Craft */\n\n/**\n * AddressInput class\n */\nCraft.AddressesInput = Garnish.Base.extend(\n  {\n    $container: null,\n    $addBtn: null,\n    $addBtnItem: null,\n    $cards: null,\n\n    init: function (container, settings) {\n      this.$container = $(container);\n      this.setSettings(settings, Craft.AddressesInput.defaults);\n\n      // Is this already an address input?\n      if (this.$container.data('addresses')) {\n        console.warn('Double-instantiating an address input on an element');\n        this.$container.data('addresses').destroy();\n      }\n\n      this.$container.data('addresses', this);\n\n      this.$addBtn = this.$container.find('.address-cards__add-btn');\n      this.$addBtnItem = this.$addBtn.closest('li');\n      this.$cards = this.$container.find('> .address-card');\n\n      for (let i = 0; i < this.$cards.length; i++) {\n        this.initCard(this.$cards.eq(i));\n      }\n\n      this.updateAddButton();\n\n      this.addListener(this.$addBtn, 'click', () => {\n        this.createAddress();\n      });\n    },\n\n    initCard: function ($card) {\n      this.addListener($card, 'click', (ev) => {\n        if (!$(ev.target).closest('.menubtn').length) {\n          this.editAddress($card);\n        }\n      });\n\n      const $actionBtn = $card.find('.menubtn').disclosureMenu();\n      if ($actionBtn.length) {\n        const menu = $actionBtn.data('trigger');\n        const $menu = menu.$container;\n\n        // Activate edit button\n        const $editBtn = $menu.find('[data-action=\"edit\"]');\n        this.addListener($editBtn, 'click', (ev) => {\n          ev.stopPropagation();\n          this.editAddress($card);\n        });\n\n        // Activate delete button\n        const $deleteBtn = $menu.find('[data-action=\"delete\"]');\n        this.addListener($deleteBtn, 'click', (ev) => {\n          ev.preventDefault();\n          ev.stopPropagation();\n          if (\n            confirm(\n              Craft.t('app', 'Are you sure you want to delete this address?')\n            )\n          ) {\n            this.$addBtn.addClass('loading');\n            const addressId = $card.data('id');\n            const draftId = $card.data('draft-id');\n            Craft.sendActionRequest('POST', 'elements/delete', {\n              data: {\n                elementId: addressId,\n                draftId: draftId,\n              },\n            })\n              .then(() => {\n                $card.remove();\n                $menu.remove();\n                menu.destroy();\n                this.$cards = this.$cards.not($card);\n                this.updateAddButton();\n\n                this.trigger('deleteAddress', {\n                  addressId,\n                  draftId,\n                });\n              })\n              .finally(() => {\n                this.$addBtn.removeClass('loading');\n              });\n          }\n        });\n      }\n    },\n\n    editAddress: function ($card, settings) {\n      const slideout = Craft.createElementEditor(\n        'craft\\\\elements\\\\Address',\n        $card,\n        settings\n      );\n\n      slideout.on('submit', (ev) => {\n        this.trigger('saveAddress', {\n          data: ev.data,\n        });\n\n        Craft.sendActionRequest('POST', 'addresses/card-html', {\n          data: {\n            addressId: ev.data.id,\n          },\n        }).then((response) => {\n          const $newCard = $(response.data.html);\n          if ($card) {\n            $card.replaceWith($newCard);\n            this.$cards = this.$cards.not($card);\n          } else {\n            $newCard.insertBefore(this.$addBtnItem);\n          }\n          Craft.initUiElements($newCard);\n          this.initCard($newCard);\n          this.$cards = this.$cards.add($newCard);\n          this.updateAddButton();\n        });\n      });\n    },\n\n    updateAddButton: function () {\n      if (this.canCreateAddress()) {\n        this.$addBtn.removeClass('hidden');\n      } else {\n        this.$addBtn.addClass('hidden');\n      }\n    },\n\n    canCreateAddress: function () {\n      return (\n        !this.settings.maxAddresses ||\n        this.$cards.length < this.settings.maxAddresses\n      );\n    },\n\n    createAddress: function () {\n      if (!this.canCreateAddress()) {\n        throw 'No more addresses can be created.';\n      }\n\n      this.$addBtn.addClass('loading');\n\n      Craft.sendActionRequest('POST', 'elements/create', {\n        data: {\n          elementType: 'craft\\\\elements\\\\Address',\n          ownerId: this.settings.ownerId,\n        },\n      })\n        .then((ev) => {\n          this.editAddress(null, {\n            elementId: ev.data.element.id,\n            draftId: ev.data.element.draftId,\n          });\n        })\n        .finally(() => {\n          this.$addBtn.removeClass('loading');\n        });\n    },\n\n    destroy: function () {\n      this.$container.removeData('addresses');\n      this.base();\n    },\n  },\n  {\n    ownerId: null,\n    defaults: {\n      maxAddresses: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Admin table class\n */\nCraft.AdminTable = Garnish.Base.extend(\n  {\n    settings: null,\n    totalItems: null,\n    sorter: null,\n\n    $noItems: null,\n    $table: null,\n    $tbody: null,\n    $deleteBtns: null,\n\n    init: function (settings) {\n      this.setSettings(settings, Craft.AdminTable.defaults);\n\n      if (!this.settings.allowDeleteAll) {\n        this.settings.minItems = 1;\n      }\n\n      this.$noItems = $(this.settings.noItemsSelector);\n      this.$table = $(this.settings.tableSelector);\n      this.$tbody = this.$table.children('tbody');\n      this.totalItems = this.$tbody.children().length;\n\n      if (this.settings.sortable) {\n        this.sorter = new Craft.DataTableSorter(this.$table, {\n          onSortChange: this.reorderItems.bind(this),\n        });\n      }\n\n      this.$deleteBtns = this.$table.find('.delete:not(.disabled)');\n      this.addListener(this.$deleteBtns, 'click', 'handleDeleteBtnClick');\n      this.addListener(this.$deleteBtns, 'keydown', (event) => {\n        if (\n          event.keyCode === Garnish.SPACE_KEY ||\n          event.keyCode === Garnish.RETURN_KEY\n        ) {\n          event.preventDefault();\n          this.handleDeleteBtnClick(event);\n        }\n      });\n\n      this.updateUI();\n    },\n\n    addRow: function (row) {\n      if (this.settings.maxItems && this.totalItems >= this.settings.maxItems) {\n        // Sorry pal.\n        return;\n      }\n\n      var $row = $(row).appendTo(this.$tbody),\n        $deleteBtn = $row.find('.delete');\n\n      if (this.settings.sortable) {\n        this.sorter.addItems($row);\n      }\n\n      this.$deleteBtns = this.$deleteBtns.add($deleteBtn);\n\n      this.addListener($deleteBtn, 'click', 'handleDeleteBtnClick');\n      this.totalItems++;\n\n      this.updateUI();\n    },\n\n    reorderItems: function () {\n      if (!this.settings.sortable) {\n        return;\n      }\n\n      // Get the new field order\n      var ids = [];\n\n      for (var i = 0; i < this.sorter.$items.length; i++) {\n        var id = $(this.sorter.$items[i]).attr(this.settings.idAttribute);\n        ids.push(id);\n      }\n\n      // Send it to the server\n      var data = {\n        ids: JSON.stringify(ids),\n      };\n\n      Craft.sendActionRequest('POST', this.settings.reorderAction, {data})\n        .then((response) => {\n          this.onReorderItems(ids);\n          Craft.cp.displaySuccess(\n            Craft.t('app', this.settings.reorderSuccessMessage)\n          );\n        })\n        .catch(({response}) => {\n          Craft.cp.displayError(\n            Craft.t('app', this.settings.reorderFailMessage)\n          );\n        });\n    },\n\n    handleDeleteBtnClick: function (event) {\n      if (this.settings.minItems && this.totalItems <= this.settings.minItems) {\n        // Sorry pal.\n        return;\n      }\n\n      var $row = $(event.target).closest('tr');\n\n      if (this.confirmDeleteItem($row)) {\n        this.deleteItem($row);\n      }\n    },\n\n    confirmDeleteItem: function ($row) {\n      if (!this.settings.confirmDeleteMessage) {\n        return true;\n      }\n\n      var name = this.getItemName($row);\n      return confirm(\n        Craft.t('app', this.settings.confirmDeleteMessage, {name})\n      );\n    },\n\n    deleteItem: function ($row) {\n      var data = {\n        id: this.getItemId($row),\n      };\n\n      Craft.sendActionRequest('POST', this.settings.deleteAction, {data})\n        .then((response) => this.handleDeleteItemSuccess(response.data, $row))\n        .catch(({response}) =>\n          this.handleDeleteItemFailure(response.data, $row)\n        );\n    },\n\n    handleDeleteItemFailure: function (data, $row) {\n      var id = this.getItemId($row),\n        name = this.getItemName($row);\n\n      Craft.cp.displayError(\n        Craft.t('app', this.settings.deleteFailMessage, {name})\n      );\n    },\n\n    handleDeleteItemSuccess: function (data, $row) {\n      var id = this.getItemId($row),\n        name = this.getItemName($row);\n\n      if (this.sorter) {\n        this.sorter.removeItems($row);\n      }\n\n      $row.remove();\n      this.totalItems--;\n      this.updateUI();\n      this.onDeleteItem(id);\n\n      if (this.settings.deleteSuccessMessage) {\n        Craft.cp.displaySuccess(\n          Craft.t('app', this.settings.deleteSuccessMessage, {name})\n        );\n      }\n    },\n\n    onReorderItems: function (ids) {\n      this.settings.onReorderItems(ids);\n    },\n\n    onDeleteItem: function (id) {\n      this.settings.onDeleteItem(id);\n    },\n\n    getItemId: function ($row) {\n      return $row.attr(this.settings.idAttribute);\n    },\n\n    getItemName: function ($row) {\n      return Craft.escapeHtml($row.attr(this.settings.nameAttribute));\n    },\n\n    updateUI: function () {\n      // Show the \"No Whatever Exists\" message if there aren't any\n      if (this.totalItems === 0) {\n        this.$table.hide();\n        this.$noItems.removeClass('hidden');\n      } else {\n        this.$table.show();\n        this.$noItems.addClass('hidden');\n      }\n\n      // Disable the sort buttons if there's only one row\n      if (this.settings.sortable) {\n        var $moveButtons = this.$table.find('.move');\n\n        if (this.totalItems === 1) {\n          $moveButtons.addClass('disabled');\n        } else {\n          $moveButtons.removeClass('disabled');\n        }\n      }\n\n      // Disable the delete buttons if we've reached the minimum items\n      if (this.settings.minItems && this.totalItems <= this.settings.minItems) {\n        this.$deleteBtns.addClass('disabled');\n      } else {\n        this.$deleteBtns.removeClass('disabled');\n      }\n\n      // Hide the New Whatever button if we've reached the maximum items\n      if (this.settings.newItemBtnSelector) {\n        if (\n          this.settings.maxItems &&\n          this.totalItems >= this.settings.maxItems\n        ) {\n          $(this.settings.newItemBtnSelector).addClass('hidden');\n        } else {\n          $(this.settings.newItemBtnSelector).removeClass('hidden');\n        }\n      }\n    },\n  },\n  {\n    defaults: {\n      tableSelector: null,\n      noItemsSelector: null,\n      newItemBtnSelector: null,\n      idAttribute: 'data-id',\n      nameAttribute: 'data-name',\n      sortable: false,\n      allowDeleteAll: true,\n      minItems: 0,\n      maxItems: null,\n      reorderAction: null,\n      deleteAction: null,\n      reorderSuccessMessage: Craft.t('app', 'New order saved.'),\n      reorderFailMessage: Craft.t('app', 'Couldn’t save new order.'),\n      confirmDeleteMessage: Craft.t(\n        'app',\n        'Are you sure you want to delete “{name}”?'\n      ),\n      deleteSuccessMessage: Craft.t('app', '“{name}” deleted.'),\n      deleteFailMessage: Craft.t('app', 'Couldn’t delete “{name}”.'),\n      onReorderItems: $.noop,\n      onDeleteItem: $.noop,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Asset image editor class\n */\n\nCraft.AssetImageEditor = Garnish.Modal.extend(\n  {\n    // jQuery objects\n    $body: null,\n    $footer: null,\n    $imageTools: null,\n    $buttons: null,\n    $cancelBtn: null,\n    $replaceBtn: null,\n    $saveBtn: null,\n    $focalPointBtn: null,\n    $editorContainer: null,\n    $straighten: null,\n    $croppingCanvas: null,\n    $spinner: null,\n    $constraintContainer: null,\n    $constraintRadioInputs: null,\n    $customConstraints: null,\n\n    // FabricJS objects\n    canvas: null,\n    image: null,\n    viewport: null,\n    focalPoint: null,\n    grid: null,\n    croppingCanvas: null,\n    clipper: null,\n    croppingRectangle: null,\n    cropperHandles: null,\n    cropperGrid: null,\n    croppingShade: null,\n\n    // Image state attributes\n    imageStraightenAngle: 0,\n    viewportRotation: 0,\n    originalWidth: 0,\n    originalHeight: 0,\n    imageVerticeCoords: null,\n    zoomRatio: 1,\n\n    // Editor state attributes\n    animationInProgress: false,\n    currentView: '',\n    assetId: null,\n    cacheBust: null,\n    draggingCropper: false,\n    scalingCropper: false,\n    draggingFocal: false,\n    previousMouseX: 0,\n    previousMouseY: 0,\n    shiftKeyHeld: false,\n    editorHeight: 0,\n    editorWidth: 0,\n    cropperState: false,\n    scaleFactor: 1,\n    flipData: {},\n    focalPointState: false,\n    maxImageSize: null,\n    lastLoadedDimensions: null,\n    imageIsLoading: false,\n    mouseMoveEvent: null,\n    croppingConstraint: false,\n    constraintOrientation: 'landscape',\n    showingCustomConstraint: false,\n    saving: false,\n\n    // Rendering proxy functions\n    renderImage: null,\n    renderCropper: null,\n\n    _queue: null,\n\n    init: function (assetId, settings) {\n      this._queue = new Craft.Queue();\n\n      this.cacheBust = Date.now();\n\n      this.setSettings(settings, Craft.AssetImageEditor.defaults);\n\n      if (this.settings.allowDegreeFractions === null) {\n        this.settings.allowDegreeFractions = Craft.isImagick;\n      }\n\n      if (Garnish.prefersReducedMotion()) {\n        this.settings.animationDuration = 1;\n      }\n\n      this.assetId = assetId;\n      this.flipData = {x: 0, y: 0};\n\n      // Build the modal\n      this.$container = $(\n        '<form class=\"modal fitted imageeditor\"></form>'\n      ).appendTo(Garnish.$bod);\n      this.$body = $('<div class=\"body\"></div>').appendTo(this.$container);\n      this.$footer = $('<div class=\"footer\"/>').appendTo(this.$container);\n\n      this.base(this.$container, this.settings);\n\n      this.$buttons = $('<div class=\"buttons right\"/>').appendTo(this.$footer);\n      this.$cancelBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn cancel',\n        text: Craft.t('app', 'Cancel'),\n      }).appendTo(this.$buttons);\n\n      if (this.settings.allowSavingAsNew) {\n        this.$saveBtn = Craft.ui\n          .createButton({\n            class: 'save copy',\n            label: Craft.t('app', 'Save as a new asset'),\n            spinner: true,\n          })\n          .appendTo(this.$buttons);\n        this.addListener(this.$saveBtn, 'activate', this.saveImage);\n      }\n\n      this.$replaceBtn = Craft.ui\n        .createSubmitButton({\n          class: 'save replace',\n          label: Craft.t('app', 'Save'),\n          spinner: true,\n        })\n        .appendTo(this.$buttons);\n\n      this.addListener(this.$replaceBtn, 'activate', this.saveImage);\n      this.addListener(this.$cancelBtn, 'activate', this.hide);\n      this.removeListener(this.$shade, 'click');\n\n      this.maxImageSize = this.getMaxImageSize();\n      Craft.sendActionRequest('POST', 'assets/image-editor', {\n        data: {assetId},\n      }).then((response) => this.loadEditor(response.data));\n    },\n\n    /**\n     * Get the max image size that is viewable in the editor currently\n     */\n    getMaxImageSize: function () {\n      var browserViewportWidth =\n        Garnish.$doc.get(0).documentElement.clientWidth;\n      var browserViewportHeight =\n        Garnish.$doc.get(0).documentElement.clientHeight;\n\n      return (\n        Math.max(browserViewportHeight, browserViewportWidth) *\n        (window.devicePixelRatio > 1 ? 2 : 1)\n      );\n    },\n\n    /**\n     * Load the editor markup and start loading components and the image.\n     *\n     * @param {Object} data\n     */\n    loadEditor: function (data) {\n      if (!data.html) {\n        alert(Craft.t('app', 'Could not load the image editor.'));\n      }\n\n      this.$body.html(data.html);\n      this.$tabs = $('.tabs li', this.$body);\n      this.$viewsContainer = $('.views', this.$body);\n      this.$views = $('> div', this.$viewsContainer);\n      this.$imageTools = $('.image-container .image-tools', this.$body);\n      this.$editorContainer = $('.image-container .image', this.$body);\n      this.$constraintContainer = $('.constraint-group', this.$body);\n      this.$constraintRadioInputs = $(\n        '[name=\"constraint\"]',\n        this.$constraintContainer\n      );\n      this.$focalPointBtn = $('.focal-point', this.$body);\n      this.editorHeight = this.$editorContainer.innerHeight();\n      this.editorWidth = this.$editorContainer.innerWidth();\n\n      this._showSpinner();\n\n      this.updateSizeAndPosition();\n\n      $customConstraintWrapper = this.$constraintRadioInputs\n        .filter('[value=\"custom\"]')\n        .parent();\n\n      // Add custom constraint inputs to fieldset\n      this.$customConstraints = $('<div/>', {\n        class: 'constraint custom hidden',\n        'data-constraint': 'custom',\n      })\n        .append(\n          $('<input/>', {\n            type: 'text',\n            class: 'custom-constraint-w',\n            size: 3,\n            value: 1,\n            'aria-label': Craft.t('app', 'Width unit'),\n          })\n        )\n        .append(\n          $('<span/>', {\n            class: 'custom-constraint-spacer',\n            text: 'x',\n            'aria-hidden': 'true',\n          })\n        )\n        .append(\n          $('<input/>', {\n            type: 'text',\n            class: 'custom-constraint-h',\n            size: 3,\n            value: 1,\n            'aria-label': Craft.t('app', 'Height unit'),\n          })\n        )\n        .appendTo($customConstraintWrapper);\n\n      // Specify which get flipped on orientation change\n      this.$constraintRadioInputs\n        .filter(function () {\n          const regex = /^\\d*\\.\\d+$/;\n          const value = $(this).val();\n          return regex.test(value);\n        })\n        .addClass('flip');\n\n      // Load the canvas on which we'll host our image and set up the proxy render function\n      this.canvas = new fabric.StaticCanvas('image-canvas');\n\n      // Set up the cropping canvas jquery element for tracking all the nice events\n      this.$croppingCanvas = $('#cropping-canvas', this.$editorContainer);\n      this.$croppingCanvas.width(this.editorWidth);\n      this.$croppingCanvas.height(this.editorHeight);\n\n      this.canvas.enableRetinaScaling = true;\n      this.renderImage = () => {\n        Garnish.requestAnimationFrame(this.canvas.renderAll.bind(this.canvas));\n      };\n\n      // Load the image from URL\n      var imageUrl = Craft.getActionUrl('assets/edit-image', {\n        assetId: this.assetId,\n        size: this.maxImageSize,\n        cacheBust: this.cacheBust,\n      });\n\n      // Load image and set up the initial properties\n      fabric.Image.fromURL(imageUrl, (imageObject) => {\n        this.image = imageObject;\n        this.image.set({\n          originX: 'center',\n          originY: 'center',\n          left: this.editorWidth / 2,\n          top: this.editorHeight / 2,\n        });\n        this.canvas.add(this.image);\n\n        this.originalHeight = this.image.getHeight();\n        this.originalWidth = this.image.getWidth();\n        this.zoomRatio = 1;\n\n        this.lastLoadedDimensions = this.getScaledImageDimensions();\n\n        // Set up the image bounding box, viewport and position everything\n        this._setFittedImageVerticeCoordinates();\n        this._repositionEditorElements();\n\n        // Set up the focal point\n        var focalState = {\n          imageDimensions: this.getScaledImageDimensions(),\n          offsetX: 0,\n          offsetY: 0,\n        };\n\n        var focal = false;\n        if (data.focalPoint) {\n          // Transform the focal point coordinates from relative to absolute\n          var focalData = data.focalPoint;\n\n          // Resolve for the current image dimensions.\n          var adjustedX = focalState.imageDimensions.width * focalData.x;\n          var adjustedY = focalState.imageDimensions.height * focalData.y;\n\n          focalState.offsetX = adjustedX - focalState.imageDimensions.width / 2;\n          focalState.offsetY =\n            adjustedY - focalState.imageDimensions.height / 2;\n\n          focal = true;\n        }\n\n        this.storeFocalPointState(focalState);\n\n        if (focal) {\n          this._createFocalPoint();\n        }\n\n        this._createViewport();\n        this.storeCropperState();\n\n        // Add listeners to buttons\n        this._addControlListeners();\n\n        // Add mouse event listeners\n        this.addListener(\n          this.$croppingCanvas,\n          'mousemove,touchmove',\n          this._handleMouseMove\n        );\n        this.addListener(\n          this.$croppingCanvas,\n          'mousedown,touchstart',\n          this._handleMouseDown\n        );\n        this.addListener(\n          this.$croppingCanvas,\n          'mouseup,touchend',\n          this._handleMouseUp\n        );\n        this.addListener(\n          this.$croppingCanvas,\n          'mouseout,touchcancel',\n          this._handleMouseOut\n        );\n\n        this._hideSpinner();\n\n        // Render it, finally\n        this.renderImage();\n\n        // Make sure verything gets fired for the first tab\n        this.$tabs.first().trigger('click');\n      });\n    },\n\n    /**\n     * Reload the image to better fit the current available image editor viewport.\n     */\n    _reloadImage: function () {\n      if (this.imageIsLoading) {\n        return;\n      }\n\n      this.imageIsLoading = true;\n      this.maxImageSize = this.getMaxImageSize();\n\n      // Load the image from URL\n      var imageUrl = Craft.getActionUrl('assets/edit-image', {\n        assetId: this.assetId,\n        size: this.maxImageSize,\n        cacheBust: this.cacheBust,\n      });\n\n      this.image.setSrc(imageUrl, (imageObject) => {\n        this.originalHeight = imageObject.getHeight();\n        this.originalWidth = imageObject.getWidth();\n        this.lastLoadedDimensions = {\n          width: this.originalHeight,\n          height: this.originalWidth,\n        };\n        this.updateSizeAndPosition();\n        this.renderImage();\n        this.imageIsLoading = false;\n      });\n    },\n\n    /**\n     * Update the modal size and position on browser resize\n     */\n    updateSizeAndPosition: function () {\n      if (!this.$container) {\n        return;\n      }\n\n      // Fullscreen modal\n      var innerWidth = window.innerWidth;\n      var innerHeight = window.innerHeight;\n\n      this.$container.css({\n        width: innerWidth,\n        'min-width': innerWidth,\n        left: 0,\n\n        height: innerHeight,\n        'min-height': innerHeight,\n        top: 0,\n      });\n\n      this.$body.css({\n        height: innerHeight - (this.$footer.outerHeight() - 1),\n      });\n\n      if (innerWidth < innerHeight) {\n        this.$container.addClass('vertical');\n      } else {\n        this.$container.removeClass('vertical');\n      }\n\n      // If image is already loaded, make sure it looks pretty.\n      if (this.$editorContainer && this.image) {\n        this._repositionEditorElements();\n      }\n    },\n\n    /**\n     * Reposition the editor elements to accurately reflect the editor state with current dimensions\n     */\n    _repositionEditorElements: function () {\n      // Remember what the dimensions were before the resize took place\n      var previousEditorDimensions = {\n        width: this.editorWidth,\n        height: this.editorHeight,\n      };\n\n      this.editorHeight = this.$editorContainer.innerHeight();\n      this.editorWidth = this.$editorContainer.innerWidth();\n\n      this.canvas.setDimensions({\n        width: this.editorWidth,\n        height: this.editorHeight,\n      });\n\n      var currentScaledDimensions = this.getScaledImageDimensions();\n\n      // If we're cropping now, we have to reposition the cropper correctly in case\n      // the area for image changes, forcing the image size to change as well.\n      if (this.currentView === 'crop') {\n        this.zoomRatio = this.getZoomToFitRatio(\n          this.getScaledImageDimensions()\n        );\n        var previouslyOccupiedArea = this._getBoundingRectangle(\n          this.imageVerticeCoords\n        );\n        this._setFittedImageVerticeCoordinates();\n        this._repositionCropper(previouslyOccupiedArea);\n      } else {\n        // Otherwise just recalculate the image zoom ratio\n        this.zoomRatio =\n          this.getZoomToCoverRatio(this.getScaledImageDimensions()) *\n          this.scaleFactor;\n      }\n\n      // Reposition the image relatively to the previous editor dimensions.\n      this._repositionImage(previousEditorDimensions);\n      this._repositionViewport();\n      this._repositionFocalPoint(previousEditorDimensions);\n      this._zoomImage();\n\n      this.renderImage();\n\n      if (\n        currentScaledDimensions.width / this.lastLoadedDimensions.width > 1.5 ||\n        currentScaledDimensions.height / this.lastLoadedDimensions.height > 1.5\n      ) {\n        this._reloadImage();\n      }\n    },\n\n    /**\n     * Reposition image based on how the editor dimensions have changed.\n     * This ensures keeping the image center offset, if there is any.\n     *\n     * @param {Object} previousEditorDimensions\n     */\n    _repositionImage: function (previousEditorDimensions) {\n      this.image.set({\n        left:\n          this.image.left -\n          (previousEditorDimensions.width - this.editorWidth) / 2,\n        top:\n          this.image.top -\n          (previousEditorDimensions.height - this.editorHeight) / 2,\n      });\n    },\n\n    /**\n     * Create the viewport for image editor.\n     */\n    _createViewport: function () {\n      this.viewport = new fabric.Rect({\n        width: this.image.width,\n        height: this.image.height,\n        fill: 'rgba(127,0,0,1)',\n        originX: 'center',\n        originY: 'center',\n        globalCompositeOperation: 'destination-in', // This clips everything outside of the viewport\n        left: this.image.left,\n        top: this.image.top,\n      });\n      this.canvas.add(this.viewport);\n      this.renderImage();\n    },\n\n    /**\n     * Create the focal point.\n     */\n    _createFocalPoint: function () {\n      var focalPointState = this.focalPointState;\n      var sizeFactor =\n        this.getScaledImageDimensions().width /\n        focalPointState.imageDimensions.width;\n\n      var focalX =\n        focalPointState.offsetX *\n        sizeFactor *\n        this.zoomRatio *\n        this.scaleFactor;\n      var focalY =\n        focalPointState.offsetY *\n        sizeFactor *\n        this.zoomRatio *\n        this.scaleFactor;\n\n      // Adjust by image margins\n      focalX += this.image.left;\n      focalY += this.image.top;\n\n      var deltaX = 0;\n      var deltaY = 0;\n\n      // When creating a fresh focal point, drop it dead in the center of the viewport, not the image.\n      if (\n        this.viewport &&\n        focalPointState.offsetX === 0 &&\n        focalPointState.offsetY === 0\n      ) {\n        if (this.currentView !== 'crop') {\n          deltaX = this.viewport.left - this.image.left;\n          deltaY = this.viewport.top - this.image.top;\n        } else {\n          // Unless we have a cropper showing, in which case drop it in the middle of the cropper\n          deltaX = this.clipper.left - this.image.left;\n          deltaY = this.clipper.top - this.image.top;\n        }\n\n        // Bump focal to middle of viewport\n        focalX += deltaX;\n        focalY += deltaY;\n\n        // Reflect changes in saved state\n        focalPointState.offsetX +=\n          deltaX / (sizeFactor * this.zoomRatio * this.scaleFactor);\n        focalPointState.offsetY +=\n          deltaY / (sizeFactor * this.zoomRatio * this.scaleFactor);\n      }\n\n      this.focalPoint = new fabric.Group(\n        [\n          new fabric.Circle({\n            radius: 8,\n            fill: 'rgba(0,0,0,0.5)',\n            strokeWidth: 2,\n            stroke: 'rgba(255,255,255,0.8)',\n            left: 0,\n            top: 0,\n            originX: 'center',\n            originY: 'center',\n          }),\n          new fabric.Circle({\n            radius: 1,\n            fill: 'rgba(255,255,255,0)',\n            strokeWidth: 2,\n            stroke: 'rgba(255,255,255,0.8)',\n            left: 0,\n            top: 0,\n            originX: 'center',\n            originY: 'center',\n          }),\n        ],\n        {\n          originX: 'center',\n          originY: 'center',\n          left: focalX,\n          top: focalY,\n        }\n      );\n\n      this.storeFocalPointState(focalPointState);\n      this.canvas.add(this.focalPoint);\n    },\n\n    /**\n     * Toggle focal point\n     */\n    toggleFocalPoint: function () {\n      if (!this.focalPoint) {\n        this._createFocalPoint();\n        this.$focalPointBtn.attr('aria-pressed', 'true');\n      } else {\n        this.canvas.remove(this.focalPoint);\n        this.focalPoint = null;\n        this.$focalPointBtn.attr('aria-pressed', 'false');\n      }\n\n      this.renderImage();\n    },\n\n    /**\n     * Reposition the viewport to handle editor resizing.\n     */\n    _repositionViewport: function () {\n      if (this.viewport) {\n        var dimensions = {\n          left: this.editorWidth / 2,\n          top: this.editorHeight / 2,\n        };\n\n        // If we're cropping, nothing exciting happens for the viewport\n        if (this.currentView === 'crop') {\n          dimensions.width = this.editorWidth;\n          dimensions.height = this.editorHeight;\n        } else {\n          // If this is the first initial reposition, no cropper state yet\n          if (this.cropperState) {\n            // Recall the state\n            var state = this.cropperState;\n\n            var scaledImageDimensions = this.getScaledImageDimensions();\n            // Make sure we have the correct current image size\n            var sizeFactor =\n              scaledImageDimensions.width / state.imageDimensions.width;\n\n            // Set the viewport dimensions\n            dimensions.width = state.width * sizeFactor * this.zoomRatio;\n            dimensions.height = state.height * sizeFactor * this.zoomRatio;\n\n            // Adjust the image position to show the correct part of the image in the viewport\n            this.image.set({\n              left: this.editorWidth / 2 - state.offsetX * sizeFactor,\n              top: this.editorHeight / 2 - state.offsetY * sizeFactor,\n            });\n          } else {\n            $.extend(dimensions, this.getScaledImageDimensions());\n          }\n        }\n        this.viewport.set(dimensions);\n      }\n    },\n\n    _repositionFocalPoint: function (previousEditorDimensions) {\n      if (this.focalPoint) {\n        var offsetX = this.focalPoint.left - this.editorWidth / 2;\n        var offsetY = this.focalPoint.top - this.editorHeight / 2;\n\n        var currentWidth = this.image.width;\n        var newWidth = this.getScaledImageDimensions().width * this.zoomRatio;\n        var ratio = newWidth / currentWidth / this.scaleFactor;\n\n        offsetX -= (previousEditorDimensions.width - this.editorWidth) / 2;\n        offsetY -= (previousEditorDimensions.height - this.editorHeight) / 2;\n\n        offsetX *= ratio;\n        offsetY *= ratio;\n\n        this.focalPoint.set({\n          left: this.editorWidth / 2 + offsetX,\n          top: this.editorHeight / 2 + offsetY,\n        });\n      }\n    },\n\n    /**\n     * Return true if the image orientation has changed\n     */\n    hasOrientationChanged: function () {\n      return this.viewportRotation % 180 !== 0;\n    },\n\n    /**\n     * Return the current image dimensions that would be used in the current image area with no straightening or rotation applied.\n     */\n    getScaledImageDimensions: function () {\n      if (typeof this.getScaledImageDimensions._ === 'undefined') {\n        this.getScaledImageDimensions._ = {};\n      }\n\n      this.getScaledImageDimensions._.imageRatio =\n        this.originalHeight / this.originalWidth;\n      this.getScaledImageDimensions._.editorRatio =\n        this.editorHeight / this.editorWidth;\n\n      this.getScaledImageDimensions._.dimensions = {};\n      if (\n        this.getScaledImageDimensions._.imageRatio >\n        this.getScaledImageDimensions._.editorRatio\n      ) {\n        this.getScaledImageDimensions._.dimensions.height = Math.min(\n          this.editorHeight,\n          this.originalHeight\n        );\n        this.getScaledImageDimensions._.dimensions.width = Math.round(\n          this.originalWidth /\n            (this.originalHeight /\n              this.getScaledImageDimensions._.dimensions.height)\n        );\n      } else {\n        this.getScaledImageDimensions._.dimensions.width = Math.min(\n          this.editorWidth,\n          this.originalWidth\n        );\n        this.getScaledImageDimensions._.dimensions.height = Math.round(\n          this.originalHeight *\n            (this.getScaledImageDimensions._.dimensions.width /\n              this.originalWidth)\n        );\n      }\n\n      return this.getScaledImageDimensions._.dimensions;\n    },\n\n    /**\n     * Set the image dimensions to reflect the current zoom ratio.\n     */\n    _zoomImage: function () {\n      if (typeof this._zoomImage._ === 'undefined') {\n        this._zoomImage._ = {};\n      }\n\n      this._zoomImage._.imageDimensions = this.getScaledImageDimensions();\n      this.image.set({\n        width: this._zoomImage._.imageDimensions.width * this.zoomRatio,\n        height: this._zoomImage._.imageDimensions.height * this.zoomRatio,\n      });\n    },\n\n    /**\n     * Gets previous tab element from currently-active.\n     */\n    _getPrevTab: function () {\n      const activeTabIndex = this._getActiveTabIndex();\n\n      if (activeTabIndex < 0) return;\n\n      let newTabIndex;\n\n      if (activeTabIndex > 0) {\n        newTabIndex = activeTabIndex - 1;\n      } else {\n        newTabIndex = this.$tabs.length - 1;\n      }\n\n      return this.$tabs.eq(newTabIndex);\n    },\n\n    /**\n     * Gets next tab element from currently-active.\n     */\n    _getNextTab: function () {\n      const activeTabIndex = this._getActiveTabIndex();\n\n      if (activeTabIndex < 0) return;\n\n      let newTabIndex;\n\n      if (activeTabIndex < this.$tabs.length - 1) {\n        newTabIndex = activeTabIndex + 1;\n      } else {\n        newTabIndex = 0;\n      }\n\n      return this.$tabs.eq(newTabIndex);\n    },\n\n    /**\n     * Gets active tab element\n     */\n    _getActiveTab: function () {\n      return this.$tabs.filter('[aria-selected=\"true\"]');\n    },\n\n    /**\n     * Gets index of active tab among sibling tabs\n     */\n    _getActiveTabIndex: function () {\n      const $activeTab = this._getActiveTab();\n\n      if (!$activeTab.length) return;\n\n      return $activeTab.index();\n    },\n\n    /**\n     * Set up listeners for the controls.\n     */\n    _addControlListeners: function () {\n      // Tabs\n      this.addListener(this.$tabs, 'click', this._handleTabClick);\n      this.addListener(this.$tabs, 'keydown', (event) => {\n        switch (event.keyCode) {\n          case Garnish.LEFT_KEY:\n          case Garnish.UP_KEY:\n            event.preventDefault();\n            const $prevTab = this._getPrevTab();\n            this.activateTab($prevTab);\n            break;\n          case Garnish.RIGHT_KEY:\n          case Garnish.DOWN_KEY:\n            event.preventDefault();\n            const $nextTab = this._getNextTab();\n            this.activateTab($nextTab);\n            break;\n        }\n      });\n\n      // Focal point\n      this.addListener(this.$focalPointBtn, 'click', this.toggleFocalPoint);\n\n      // Rotate controls\n      this.addListener($('.rotate-left'), 'click', function () {\n        this.rotateImage(-90);\n      });\n      this.addListener($('.rotate-right'), 'click', function () {\n        this.rotateImage(90);\n      });\n      this.addListener($('.flip-vertical'), 'click', function () {\n        this.flipImage('y');\n      });\n      this.addListener($('.flip-horizontal'), 'click', function () {\n        this.flipImage('x');\n      });\n\n      // Straighten slider\n      this.straighteningInput = new Craft.SlideRuleInput('slide-rule', {\n        onStart: () => {\n          this._showGrid();\n        },\n        onChange: (slider) => {\n          this.straighten(slider);\n        },\n        onEnd: () => {\n          this._hideGrid();\n          this._cleanupFocalPointAfterStraighten();\n        },\n      });\n\n      // Cropper scale modifier key\n      this.addListener(Garnish.$doc, 'keydown', function (ev) {\n        if (ev.keyCode === Garnish.SHIFT_KEY) {\n          this.shiftKeyHeld = true;\n        }\n      });\n      this.addListener(Garnish.$doc, 'keyup', function (ev) {\n        if (ev.keyCode === Garnish.SHIFT_KEY) {\n          this.shiftKeyHeld = false;\n        }\n      });\n\n      this.addListener(\n        this.$constraintRadioInputs,\n        'change',\n        this._handleConstraintChange\n      );\n      this.addListener(\n        $('.orientation input', this.$container),\n        'click',\n        this._handleOrientationClick\n      );\n      this.addListener(\n        $('.constraint-group .custom input', this.$container),\n        'keyup',\n        this._applyCustomConstraint\n      );\n    },\n\n    /**\n     * Handle a constraint button click.\n     *\n     * @param {Object} ev\n     */\n    _handleConstraintClick: function (ev) {\n      var constraint = $(ev.currentTarget).data('constraint');\n      var $target = $(ev.currentTarget);\n      $target.siblings().removeClass('active');\n      $target.addClass('active');\n\n      if (constraint == 'custom') {\n        this._showCustomConstraint();\n        this._applyCustomConstraint();\n        return;\n      }\n\n      this._hideCustomConstraint();\n\n      this.setCroppingConstraint(constraint);\n      this.enforceCroppingConstraint();\n    },\n\n    /**\n     * Handle a constraint change.\n     *\n     * @param {Object} ev\n     */\n    _handleConstraintChange: function (ev) {\n      const constraint = $(ev.target).val();\n\n      if (constraint == 'custom') {\n        this._showCustomConstraint();\n        this._applyCustomConstraint();\n        return;\n      }\n\n      this._hideCustomConstraint();\n\n      this.setCroppingConstraint(constraint);\n      this.enforceCroppingConstraint();\n    },\n\n    /**\n     * Handle an orientation switch click.\n     *\n     * @param {Object} ev\n     */\n    _handleOrientationClick: function (ev) {\n      if (ev.currentTarget.value === this.constraintOrientation) {\n        return;\n      }\n      this.constraintOrientation = ev.currentTarget.value;\n\n      const $constraints = $('.flip', this.$constraintContainer);\n\n      for (var i = 0; i < $constraints.length; i++) {\n        var $constraint = $($constraints[i]);\n        const labelSelector = 'label[for=\"' + $constraint.attr('id') + '\"]';\n        const $label = $(labelSelector, this.$constraintContainer);\n        $constraint.val(1 / $constraint.val());\n        $label.html(\n          $label.text().split(':').reverse().join(':').replace(/\\s/g, '')\n        );\n      }\n\n      $constraints.filter(':checked').trigger('change');\n    },\n\n    /**\n     * Apply the custom ratio set in the inputs\n     */\n    _applyCustomConstraint: function () {\n      var constraint = this._getCustomConstraint();\n\n      if (constraint.w > 0 && constraint.h > 0) {\n        this.setCroppingConstraint(constraint.w / constraint.h);\n        this.enforceCroppingConstraint();\n      }\n    },\n\n    /**\n     * Get the custom constraint.\n     *\n     * @returns {{w: *, h: *}}\n     */\n    _getCustomConstraint: function () {\n      var w = parseFloat($('.custom-constraint-w').val());\n      var h = parseFloat($('.custom-constraint-h').val());\n      return {\n        w: isNaN(w) ? 0 : w,\n        h: isNaN(h) ? 0 : h,\n      };\n    },\n\n    /**\n     * Set the custom constraint.\n     *\n     * @param {number} w\n     * @param {number} h\n     */\n    _setCustomConstraint: function (w, h) {\n      $('.custom-constraint-w').val(parseFloat(w));\n      $('.custom-constraint-h').val(parseFloat(h));\n    },\n\n    /**\n     * Hide the custom constraint inputs.\n     */\n    _hideCustomConstraint: function () {\n      this.showingCustomConstraint = false;\n      this.$customConstraints.addClass('hidden');\n      $('.orientation', this.$container).removeClass('hidden');\n    },\n\n    /**\n     * Show the custom constraint inputs.\n     */\n    _showCustomConstraint: function () {\n      if (this.showingCustomConstraint) {\n        return;\n      }\n\n      this.showingCustomConstraint = true;\n      this.$customConstraints.removeClass('hidden');\n      $('.orientation', this.$container).addClass('hidden');\n    },\n\n    /**\n     * Handle tab click.\n     *\n     * @param {Object} ev\n     */\n    _handleTabClick: function (ev) {\n      if (!this.animationInProgress) {\n        var $tab = $(ev.currentTarget);\n        this.activateTab($tab);\n      }\n    },\n\n    /**\n     * Activate a tab.\n     *\n     * @param {(jQuery|HTMLElement|string)} tab\n     */\n\n    activateTab: function (tab) {\n      const view = $(tab).data('view');\n      this.$tabs.removeClass('selected').attr({\n        'aria-selected': 'false',\n        tabindex: '-1',\n      });\n      $(tab)\n        .addClass('selected')\n        .attr({\n          'aria-selected': 'true',\n          tabindex: '0',\n        })\n        .trigger('focus');\n      this.showView(view);\n    },\n\n    /**\n     * Show a view.\n     *\n     * @param {string} view\n     */\n    showView: function (view) {\n      if (this.currentView === view) {\n        return;\n      }\n\n      this.$views.addClass('hidden');\n      var $view = this.$views.filter('[data-view=\"' + view + '\"]');\n      $view.removeClass('hidden');\n\n      if (view === 'rotate') {\n        this.enableSlider();\n      } else {\n        this.disableSlider();\n      }\n\n      // Now that most likely our editor dimensions have changed, time to reposition stuff\n      this.updateSizeAndPosition();\n\n      // See if we have to enable or disable crop mode as we transition between tabs\n      if (this.currentView === 'crop' && view !== 'crop') {\n        this._queue.push(\n          () =>\n            new Promise((resolve, reject) => {\n              this.disableCropMode();\n              resolve();\n            })\n        );\n      } else if (this.currentView !== 'crop' && view === 'crop') {\n        this._queue.push(\n          () =>\n            new Promise((resolve, reject) => {\n              this.enableCropMode();\n              resolve();\n            })\n        );\n      }\n\n      // Mark the current view\n      this.currentView = view;\n    },\n\n    /**\n     * Store the current cropper state.\n     *\n     * Cropper state is always assumed to be saved at a zoom ratio of 1 to be used\n     * as the basis for recalculating the cropper position and dimensions.\n     *\n     * @param {Object} [state]\n     */\n    storeCropperState: function (state) {\n      if (typeof this.storeCropperState._ === 'undefined') {\n        this.storeCropperState._ = {};\n      }\n\n      // If we're asked to store a specific state.\n      if (state) {\n        this.cropperState = state;\n      } else if (this.clipper) {\n        this.storeCropperState._.zoomFactor = 1 / this.zoomRatio;\n\n        this.cropperState = {\n          offsetX:\n            (this.clipper.left - this.image.left) *\n            this.storeCropperState._.zoomFactor,\n          offsetY:\n            (this.clipper.top - this.image.top) *\n            this.storeCropperState._.zoomFactor,\n          height: this.clipper.height * this.storeCropperState._.zoomFactor,\n          width: this.clipper.width * this.storeCropperState._.zoomFactor,\n          imageDimensions: this.getScaledImageDimensions(),\n        };\n      } else {\n        this.storeCropperState._.dimensions = this.getScaledImageDimensions();\n        this.cropperState = {\n          offsetX: 0,\n          offsetY: 0,\n          height: this.storeCropperState._.dimensions.height,\n          width: this.storeCropperState._.dimensions.width,\n          imageDimensions: this.storeCropperState._.dimensions,\n        };\n      }\n    },\n\n    /**\n     * Store focal point coordinates in a manner that is not tied to zoom ratio and rotation.\n     */\n    storeFocalPointState: function (state) {\n      if (typeof this.storeFocalPointState._ === 'undefined') {\n        this.storeFocalPointState._ = {};\n      }\n\n      // If we're asked to store a specific state.\n      if (state) {\n        this.focalPointState = state;\n      } else if (this.focalPoint) {\n        this.storeFocalPointState._.zoomFactor = 1 / this.zoomRatio;\n        this.focalPointState = {\n          offsetX:\n            ((this.focalPoint.left - this.image.left) *\n              this.storeFocalPointState._.zoomFactor) /\n            this.scaleFactor,\n          offsetY:\n            ((this.focalPoint.top - this.image.top) *\n              this.storeFocalPointState._.zoomFactor) /\n            this.scaleFactor,\n          imageDimensions: this.getScaledImageDimensions(),\n        };\n      }\n    },\n\n    /**\n     * Rotate the image along with the viewport.\n     *\n     * @param {number} degrees\n     */\n    rotateImage: function (degrees) {\n      if (!this.animationInProgress) {\n        // We're not that kind of an establishment, sir.\n        if (degrees !== 90 && degrees !== -90) {\n          return false;\n        }\n\n        this.animationInProgress = true;\n        this.viewportRotation += degrees;\n\n        // Normalize the viewport rotation angle so it's between 0 and 359\n        this.viewportRotation = parseInt(\n          (this.viewportRotation + 360) % 360,\n          10\n        );\n\n        var newAngle = this.image.angle + degrees;\n        var scaledImageDimensions = this.getScaledImageDimensions();\n        var imageZoomRatio;\n\n        if (this.hasOrientationChanged()) {\n          imageZoomRatio = this.getZoomToCoverRatio({\n            height: scaledImageDimensions.width,\n            width: scaledImageDimensions.height,\n          });\n        } else {\n          imageZoomRatio = this.getZoomToCoverRatio(scaledImageDimensions);\n        }\n\n        // In cases when for some reason we've already zoomed in on the image,\n        // use existing zoom.\n        if (this.zoomRatio > imageZoomRatio) {\n          imageZoomRatio = this.zoomRatio;\n        }\n\n        var viewportProperties = {\n          angle: degrees === 90 ? '+=90' : '-=90',\n        };\n\n        var imageProperties = {\n          angle: newAngle,\n          width: scaledImageDimensions.width * imageZoomRatio,\n          height: scaledImageDimensions.height * imageZoomRatio,\n        };\n\n        var scaleFactor = 1;\n        if (this.scaleFactor < 1) {\n          scaleFactor = 1 / this.scaleFactor;\n          this.scaleFactor = 1;\n        } else {\n          if (this.viewport.width > this.editorHeight) {\n            scaleFactor = this.editorHeight / this.viewport.width;\n          } else if (this.viewport.height > this.editorWidth) {\n            scaleFactor = this.editorWidth / this.viewport.height;\n          }\n          this.scaleFactor = scaleFactor;\n        }\n\n        if (scaleFactor < 1) {\n          imageProperties.width *= scaleFactor;\n          imageProperties.height *= scaleFactor;\n        }\n\n        var state = this.cropperState;\n\n        // Make sure we reposition the image as well to focus on the same image area\n        var deltaX = state.offsetX;\n        var deltaY = state.offsetY;\n        var angleInRadians = degrees * (Math.PI / 180);\n\n        // Calculate how the cropper would need to move in a circle to maintain\n        // the focus on the same region if the image was rotated with zoom intact.\n        var newDeltaX =\n          deltaX * Math.cos(angleInRadians) - deltaY * Math.sin(angleInRadians);\n        var newDeltaY =\n          deltaX * Math.sin(angleInRadians) + deltaY * Math.cos(angleInRadians);\n\n        var sizeFactor =\n          scaledImageDimensions.width / state.imageDimensions.width;\n\n        var modifiedDeltaX =\n          newDeltaX * sizeFactor * this.zoomRatio * this.scaleFactor;\n        var modifiedDeltaY =\n          newDeltaY * sizeFactor * this.zoomRatio * this.scaleFactor;\n\n        imageProperties.left = this.editorWidth / 2 - modifiedDeltaX;\n        imageProperties.top = this.editorHeight / 2 - modifiedDeltaY;\n\n        state.offsetX = newDeltaX;\n        state.offsetY = newDeltaY;\n\n        var temp = state.width;\n        state.width = state.height;\n        state.height = temp;\n\n        this.storeCropperState(state);\n\n        if (this.focalPoint) {\n          this.canvas.remove(this.focalPoint);\n        }\n\n        this.viewport.animate(viewportProperties, {\n          duration: this.settings.animationDuration,\n          onComplete: () => {\n            // If we're zooming the image in or out, better do the same to viewport\n            var temp = this.viewport.height * scaleFactor;\n            this.viewport.height = this.viewport.width * scaleFactor;\n            this.viewport.width = temp;\n            this.viewport.set({angle: 0});\n          },\n        });\n\n        // Animate the rotation and dimension change\n        this.image.animate(imageProperties, {\n          onChange: this.canvas.renderAll.bind(this.canvas),\n          duration: this.settings.animationDuration,\n          onComplete: () => {\n            var cleanAngle = parseFloat((this.image.angle + 360) % 360);\n            this.image.set({angle: cleanAngle});\n            this.animationInProgress = false;\n            if (this.focalPoint) {\n              this._adjustFocalPointByAngle(degrees);\n              this.straighten(this.straighteningInput);\n              this.canvas.add(this.focalPoint);\n            } else {\n              this._resetFocalPointPosition();\n            }\n          },\n        });\n      }\n    },\n\n    /**\n     * Flip an image along an axis.\n     *\n     * @param {string} axis\n     */\n    flipImage: function (axis) {\n      if (!this.animationInProgress) {\n        this.animationInProgress = true;\n\n        if (this.hasOrientationChanged()) {\n          axis = axis === 'y' ? 'x' : 'y';\n        }\n\n        if (this.focalPoint) {\n          this.canvas.remove(this.focalPoint);\n        } else {\n          this._resetFocalPointPosition();\n        }\n\n        var editorCenter = {x: this.editorWidth / 2, y: this.editorHeight / 2};\n        this.straighteningInput.setValue(-this.imageStraightenAngle);\n        this.imageStraightenAngle = -this.imageStraightenAngle;\n        var properties = {\n          angle: this.viewportRotation + this.imageStraightenAngle,\n        };\n\n        var deltaY, deltaX;\n        var cropperState = this.cropperState;\n        var focalPointState = this.focalPointState;\n\n        // Reposition the image, viewport, and stored cropper and focal point states.\n        if (\n          (axis === 'y' && this.hasOrientationChanged()) ||\n          (axis !== 'y' && !this.hasOrientationChanged())\n        ) {\n          cropperState.offsetX = -cropperState.offsetX;\n          focalPointState.offsetX = -focalPointState.offsetX;\n          deltaX = this.image.left - editorCenter.x;\n          properties.left = editorCenter.x - deltaX;\n        } else {\n          cropperState.offsetY = -cropperState.offsetY;\n          focalPointState.offsetY = -focalPointState.offsetY;\n          deltaY = this.image.top - editorCenter.y;\n          properties.top = editorCenter.y - deltaY;\n        }\n\n        if (axis === 'y') {\n          properties.scaleY = this.image.scaleY * -1;\n          this.flipData.y = 1 - this.flipData.y;\n        } else {\n          properties.scaleX = this.image.scaleX * -1;\n          this.flipData.x = 1 - this.flipData.x;\n        }\n\n        this.storeCropperState(cropperState);\n        this.storeFocalPointState(focalPointState);\n\n        this.image.animate(properties, {\n          onChange: this.canvas.renderAll.bind(this.canvas),\n          duration: this.settings.animationDuration,\n          onComplete: () => {\n            this.animationInProgress = false;\n            if (this.focalPoint) {\n              // Well this is handy\n              this._adjustFocalPointByAngle(0);\n              this.canvas.add(this.focalPoint);\n            }\n          },\n        });\n      }\n    },\n\n    /**\n     * Perform the straightening with input slider.\n     *\n     * @param {Craft.SlideRuleInput} slider\n     */\n    straighten: function (slider) {\n      if (!this.animationInProgress) {\n        this.animationInProgress = true;\n\n        var previousAngle = this.image.angle;\n\n        this.imageStraightenAngle =\n          (this.settings.allowDegreeFractions\n            ? parseFloat(slider.value)\n            : Math.round(parseFloat(slider.value))) % 360;\n\n        // Straighten the image\n        this.image.set({\n          angle: this.viewportRotation + this.imageStraightenAngle,\n        });\n\n        // Set the new zoom ratio\n        this.zoomRatio =\n          this.getZoomToCoverRatio(this.getScaledImageDimensions()) *\n          this.scaleFactor;\n        this._zoomImage();\n\n        if (this.cropperState) {\n          this._adjustEditorElementsOnStraighten(previousAngle);\n        }\n\n        this.renderImage();\n\n        this.animationInProgress = false;\n      }\n    },\n\n    /**\n     * Adjust the cropped viewport when straightening the image to correct for\n     * bumping into edges, keeping focus on the cropped area center and to\n     * maintain the illusion that the image is being straightened relative to the viewport center.\n     *\n     * @param {integer} previousAngle integer the previous image angle before straightening\n     */\n    _adjustEditorElementsOnStraighten: function (previousAngle) {\n      var scaledImageDimensions = this.getScaledImageDimensions();\n      var angleDelta = this.image.angle - previousAngle;\n      var state = this.cropperState;\n\n      var currentZoomRatio = this.zoomRatio;\n      var adjustmentRatio = 1;\n\n      var deltaX, deltaY, newCenterX, newCenterY, sizeFactor;\n\n      do {\n        // Get the cropper center coordinates\n        var cropperCenterX = state.offsetX;\n        var cropperCenterY = state.offsetY;\n        var angleInRadians = angleDelta * (Math.PI / 180);\n\n        // Calculate how the cropper would need to move in a circle to maintain\n        // the focus on the same region if the image was rotated with zoom intact.\n        newCenterX =\n          cropperCenterX * Math.cos(angleInRadians) -\n          cropperCenterY * Math.sin(angleInRadians);\n        newCenterY =\n          cropperCenterX * Math.sin(angleInRadians) +\n          cropperCenterY * Math.cos(angleInRadians);\n\n        sizeFactor = scaledImageDimensions.width / state.imageDimensions.width;\n\n        // Figure out the final image offset to keep the viewport focused where we need it\n        deltaX = newCenterX * currentZoomRatio * sizeFactor;\n        deltaY = newCenterY * currentZoomRatio * sizeFactor;\n\n        // If the image would creep in the viewport, figure out how to math around it.\n        var imageVertices = this.getImageVerticeCoords(currentZoomRatio);\n        var rectangle = {\n          width: this.viewport.width,\n          height: this.viewport.height,\n          left: this.editorWidth / 2 - this.viewport.width / 2 + deltaX,\n          top: this.editorHeight / 2 - this.viewport.height / 2 + deltaY,\n        };\n        adjustmentRatio = this._getZoomRatioToFitRectangle(\n          rectangle,\n          imageVertices\n        );\n        currentZoomRatio = currentZoomRatio * adjustmentRatio;\n\n        // If we had to make adjustments, do the calculations again\n      } while (adjustmentRatio !== 1);\n\n      // Reposition the image correctly\n      this.image.set({\n        left: this.editorWidth / 2 - deltaX,\n        top: this.editorHeight / 2 - deltaY,\n      });\n\n      // Finally, store the new cropper state to reflect the rotation change.\n      state.offsetX = newCenterX;\n      state.offsetY = newCenterY;\n      state.width = this.viewport.width / currentZoomRatio / sizeFactor;\n      state.height = this.viewport.height / currentZoomRatio / sizeFactor;\n\n      this.storeCropperState(state);\n\n      // Zoom the image in and we're done.\n      this.zoomRatio = currentZoomRatio;\n\n      if (this.focalPoint) {\n        this._adjustFocalPointByAngle(angleDelta);\n\n        if (!this._isCenterInside(this.focalPoint, this.viewport)) {\n          this.focalPoint.set({opacity: 0});\n        } else {\n          this.focalPoint.set({opacity: 1});\n        }\n      } else if (angleDelta !== 0) {\n        this._resetFocalPointPosition();\n      }\n\n      this._zoomImage();\n    },\n\n    /**\n     * If focal point is active and outside of viewport after straightening, reset it.\n     */\n    _cleanupFocalPointAfterStraighten: function () {\n      if (\n        this.focalPoint &&\n        !this._isCenterInside(this.focalPoint, this.viewport)\n      ) {\n        this.focalPoint.set({opacity: 1});\n        var state = this.focalPointState;\n        state.offsetX = 0;\n        state.offsetY = 0;\n        this.storeFocalPointState(state);\n        this.toggleFocalPoint();\n      }\n    },\n\n    /**\n     * Reset focal point to the middle of image.\n     */\n    _resetFocalPointPosition: function () {\n      var state = this.focalPointState;\n      state.offsetX = 0;\n      state.offsetY = 0;\n      this.storeFocalPointState(state);\n    },\n\n    /**\n     * Returns true if a center of an object is inside another rectangle shaped object that is not rotated.\n     *\n     * @param {Object} object\n     * @param {Object} containingObject\n     * @returns {boolean}\n     */\n    _isCenterInside: function (object, containingObject) {\n      return (\n        object.left > containingObject.left - containingObject.width / 2 &&\n        object.top > containingObject.top - containingObject.height / 2 &&\n        object.left < containingObject.left + containingObject.width / 2 &&\n        object.top < containingObject.top + containingObject.height / 2\n      );\n    },\n\n    /**\n     * Adjust the focal point by an angle in degrees.\n     * @param {number} angle\n     */\n    _adjustFocalPointByAngle: function (angle) {\n      var angleInRadians = angle * (Math.PI / 180);\n      var state = this.focalPointState;\n\n      var focalX = state.offsetX;\n      var focalY = state.offsetY;\n\n      // Calculate how the focal point would need to move in a circle to keep on the same spot\n      // on the image if it was rotated with zoom intact.\n      var newFocalX =\n        focalX * Math.cos(angleInRadians) - focalY * Math.sin(angleInRadians);\n      var newFocalY =\n        focalX * Math.sin(angleInRadians) + focalY * Math.cos(angleInRadians);\n      var sizeFactor =\n        this.getScaledImageDimensions().width / state.imageDimensions.width;\n\n      var adjustedFocalX = newFocalX * sizeFactor * this.zoomRatio;\n      var adjustedFocalY = newFocalY * sizeFactor * this.zoomRatio;\n\n      this.focalPoint.left = this.image.left + adjustedFocalX;\n      this.focalPoint.top = this.image.top + adjustedFocalY;\n\n      state.offsetX = newFocalX;\n      state.offsetY = newFocalY;\n      this.storeFocalPointState(state);\n    },\n\n    /**\n     * Get the zoom ratio required to fit a rectangle within another rectangle, that is defined by vertices.\n     * If the rectangle fits, 1 will be returned.\n     *\n     * @param {Object} rectangle\n     * @param {Object} containingVertices\n     */\n    _getZoomRatioToFitRectangle: function (rectangle, containingVertices) {\n      var rectangleVertices = this._getRectangleVertices(rectangle);\n      var vertex;\n\n      // Check if any of the viewport vertices end up out of bounds\n      for (\n        var verticeIndex = 0;\n        verticeIndex < rectangleVertices.length;\n        verticeIndex++\n      ) {\n        vertex = rectangleVertices[verticeIndex];\n\n        if (!this.arePointsInsideRectangle([vertex], containingVertices)) {\n          break;\n        }\n\n        vertex = false;\n      }\n\n      // If there's no vertex set after loop, it means that all of them are inside the image rectangle\n      var adjustmentRatio;\n\n      if (!vertex) {\n        adjustmentRatio = 1;\n      } else {\n        // Find out which edge got crossed by the vertex\n        var edge = this._getEdgeCrossed(containingVertices, vertex);\n\n        var rectangleCenter = {\n          x: rectangle.left + rectangle.width / 2,\n          y: rectangle.top + rectangle.height / 2,\n        };\n\n        // Calculate how much further that edge needs to be.\n        // https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Line_defined_by_two_points\n        var distanceFromVertexToEdge =\n          Math.abs(\n            (edge[1].y - edge[0].y) * vertex.x -\n              (edge[1].x - edge[0].x) * vertex.y +\n              edge[1].x * edge[0].y -\n              edge[1].y * edge[0].x\n          ) /\n          Math.sqrt(\n            Math.pow(edge[1].y - edge[0].y, 2) +\n              Math.pow(edge[1].x - edge[0].x, 2)\n          );\n        var distanceFromCenterToEdge =\n          Math.abs(\n            (edge[1].y - edge[0].y) * rectangleCenter.x -\n              (edge[1].x - edge[0].x) * rectangleCenter.y +\n              edge[1].x * edge[0].y -\n              edge[1].y * edge[0].x\n          ) /\n          Math.sqrt(\n            Math.pow(edge[1].y - edge[0].y, 2) +\n              Math.pow(edge[1].x - edge[0].x, 2)\n          );\n\n        // Adjust the zoom ratio\n        adjustmentRatio =\n          (distanceFromVertexToEdge + distanceFromCenterToEdge) /\n          distanceFromCenterToEdge;\n      }\n\n      return adjustmentRatio;\n    },\n\n    /**\n     * Save the image.\n     *\n     * @param {Object} ev\n     */\n    saveImage: function (ev) {\n      var $button = $(ev.currentTarget);\n      if (this.saving) {\n        return false;\n      }\n\n      this.saving = true;\n      $button.addClass('loading');\n      const replace = $button.hasClass('replace');\n\n      var postData = {\n        assetId: this.assetId,\n        viewportRotation: this.viewportRotation,\n        imageRotation: this.imageStraightenAngle,\n        replace: replace ? 1 : 0,\n      };\n\n      if (this.cropperState) {\n        var cropData = {};\n\n        cropData.height = this.cropperState.height;\n        cropData.width = this.cropperState.width;\n        cropData.offsetX = this.cropperState.offsetX;\n        cropData.offsetY = this.cropperState.offsetY;\n\n        postData.imageDimensions = this.cropperState.imageDimensions;\n\n        postData.cropData = cropData;\n      } else {\n        postData.imageDimensions = this.getScaledImageDimensions();\n      }\n\n      if (this.focalPoint) {\n        postData.focalPoint = this.focalPointState;\n      }\n\n      postData.flipData = this.flipData;\n      postData.zoom = this.zoomRatio;\n\n      Craft.sendActionRequest('POST', 'assets/save-image', {data: postData})\n        .then(({data}) => {\n          this.onSave(data);\n          if (replace && Craft.broadcaster) {\n            Craft.broadcaster.postMessage({\n              event: 'saveElement',\n              id: this.assetId,\n            });\n          }\n          this.hide();\n          Craft.cp.runQueue();\n\n          // Refresh Live Preview\n          Craft.Preview.refresh();\n        })\n        .catch(({response}) => {\n          alert(response.data.message);\n        })\n        .finally(() => {\n          this.$buttons.find('.btn').removeClass('loading');\n          this.saving = false;\n        });\n    },\n\n    /**\n     * Return image zoom ratio depending on the straighten angle to cover a viewport by given dimensions.\n     *\n     * @param {Object} dimensions\n     */\n    getZoomToCoverRatio: function (dimensions) {\n      // Convert the angle to radians\n      var angleInRadians =\n        Math.abs(this.imageStraightenAngle) * (Math.PI / 180);\n\n      // Calculate the dimensions of the scaled image using the magic of math\n      var scaledWidth =\n        Math.sin(angleInRadians) * dimensions.height +\n        Math.cos(angleInRadians) * dimensions.width;\n      var scaledHeight =\n        Math.sin(angleInRadians) * dimensions.width +\n        Math.cos(angleInRadians) * dimensions.height;\n\n      // Calculate the ratio\n      return Math.max(\n        scaledWidth / dimensions.width,\n        scaledHeight / dimensions.height\n      );\n    },\n\n    /**\n     * Return image zoom ratio depending on the straighten angle to fit inside a viewport by given dimensions.\n     *\n     * @param {Object} dimensions\n     */\n    getZoomToFitRatio: function (dimensions) {\n      // Get the bounding box for a rotated image\n      var boundingBox = this._getImageBoundingBox(dimensions);\n\n      // Scale the bounding box to fit\n      var scale = 1;\n      if (\n        boundingBox.height > this.editorHeight ||\n        boundingBox.width > this.editorWidth\n      ) {\n        var vertScale = this.editorHeight / boundingBox.height;\n        var horiScale = this.editorWidth / boundingBox.width;\n        scale = Math.min(horiScale, vertScale);\n      }\n\n      return scale;\n    },\n\n    /**\n     * Return the combined zoom ratio to fit a rectangle inside image that's been zoomed to fit.\n     */\n    getCombinedZoomRatio: function (dimensions) {\n      return (\n        this.getZoomToCoverRatio(dimensions) /\n        this.getZoomToFitRatio(dimensions)\n      );\n    },\n\n    /**\n     * Draw the grid.\n     *\n     * @private\n     */\n    _showGrid: function () {\n      if (!this.grid) {\n        var strokeOptions = {\n          strokeWidth: 1,\n          stroke: 'rgba(255,255,255,0.5)',\n        };\n\n        var lineCount = 8;\n        var gridWidth = this.viewport.width;\n        var gridHeight = this.viewport.height;\n        var xStep = gridWidth / (lineCount + 1);\n        var yStep = gridHeight / (lineCount + 1);\n\n        var grid = [\n          new fabric.Rect({\n            strokeWidth: 2,\n            stroke: 'rgba(255,255,255,1)',\n            originX: 'center',\n            originY: 'center',\n            width: gridWidth,\n            height: gridHeight,\n            left: gridWidth / 2,\n            top: gridHeight / 2,\n            fill: 'rgba(255,255,255,0)',\n          }),\n        ];\n\n        var i;\n        for (i = 1; i <= lineCount; i++) {\n          grid.push(\n            new fabric.Line(\n              [i * xStep, 0, i * xStep, gridHeight],\n              strokeOptions\n            )\n          );\n        }\n        for (i = 1; i <= lineCount; i++) {\n          grid.push(\n            new fabric.Line([0, i * yStep, gridWidth, i * yStep], strokeOptions)\n          );\n        }\n\n        this.grid = new fabric.Group(grid, {\n          left: this.editorWidth / 2,\n          top: this.editorHeight / 2,\n          originX: 'center',\n          originY: 'center',\n          angle: this.viewport.angle,\n        });\n\n        this.canvas.add(this.grid);\n        this.renderImage();\n      }\n    },\n\n    /**\n     * Hide the grid\n     */\n    _hideGrid: function () {\n      this.canvas.remove(this.grid);\n      this.grid = null;\n      this.renderImage();\n    },\n\n    /**\n     * Remove all the events when hiding the editor.\n     */\n    onFadeOut: function () {\n      this.destroy();\n    },\n\n    /**\n     * Make sure underlying content is not scrolled by accident.\n     */\n    show: function () {\n      this.base();\n      Garnish.$bod.addClass('no-scroll');\n    },\n\n    /**\n     * Allow the content to scroll.\n     */\n    hide: function () {\n      this.removeAllListeners();\n      this.straighteningInput.removeAllListeners();\n      Garnish.$bod.removeClass('no-scroll');\n      this.base();\n    },\n\n    /**\n     * onSave callback.\n     */\n    onSave: function (data) {\n      this.settings.onSave(data);\n      this.trigger('save');\n    },\n\n    /**\n     * Enable the rotation slider.\n     */\n    enableSlider: function () {\n      this.$imageTools.removeClass('hidden');\n    },\n\n    /**\n     * Disable the rotation slider.\n     */\n    disableSlider: function () {\n      this.$imageTools.addClass('hidden');\n    },\n\n    /**\n     * Switch to crop mode.\n     */\n    enableCropMode: function () {\n      var imageDimensions = this.getScaledImageDimensions();\n      this.zoomRatio = this.getZoomToFitRatio(imageDimensions);\n\n      var viewportProperties = {\n        width: this.editorWidth,\n        height: this.editorHeight,\n      };\n\n      var imageProperties = {\n        width: imageDimensions.width * this.zoomRatio,\n        height: imageDimensions.height * this.zoomRatio,\n        left: this.editorWidth / 2,\n        top: this.editorHeight / 2,\n      };\n\n      var callback = () => {\n        this._setFittedImageVerticeCoordinates();\n\n        // Restore cropper\n        var state = this.cropperState;\n        var scaledImageDimensions = this.getScaledImageDimensions();\n        var sizeFactor =\n          scaledImageDimensions.width / state.imageDimensions.width;\n\n        // Restore based on the stored information\n        var cropperData = {\n          left: this.image.left + state.offsetX * sizeFactor * this.zoomRatio,\n          top: this.image.top + state.offsetY * sizeFactor * this.zoomRatio,\n          width: state.width * sizeFactor * this.zoomRatio,\n          height: state.height * sizeFactor * this.zoomRatio,\n        };\n\n        this._showCropper(cropperData);\n\n        if (this.focalPoint) {\n          sizeFactor =\n            scaledImageDimensions.width /\n            this.focalPointState.imageDimensions.width;\n          this.focalPoint.left =\n            this.image.left +\n            this.focalPointState.offsetX * sizeFactor * this.zoomRatio;\n          this.focalPoint.top =\n            this.image.top +\n            this.focalPointState.offsetY * sizeFactor * this.zoomRatio;\n          this.canvas.add(this.focalPoint);\n        }\n      };\n\n      this._editorModeTransition(callback, imageProperties, viewportProperties);\n    },\n\n    /**\n     * Switch out of crop mode.\n     */\n    disableCropMode: function () {\n      var viewportProperties = {};\n\n      this._hideCropper();\n      var imageDimensions = this.getScaledImageDimensions();\n      var targetZoom =\n        this.getZoomToCoverRatio(imageDimensions) * this.scaleFactor;\n      var inverseZoomFactor = targetZoom / this.zoomRatio;\n      this.zoomRatio = targetZoom;\n\n      var imageProperties = {\n        width: imageDimensions.width * this.zoomRatio,\n        height: imageDimensions.height * this.zoomRatio,\n        left: this.editorWidth / 2,\n        top: this.editorHeight / 2,\n      };\n\n      var offsetX = this.clipper.left - this.image.left;\n      var offsetY = this.clipper.top - this.image.top;\n\n      var imageOffsetX = offsetX * inverseZoomFactor;\n      var imageOffsetY = offsetY * inverseZoomFactor;\n      imageProperties.left = this.editorWidth / 2 - imageOffsetX;\n      imageProperties.top = this.editorHeight / 2 - imageOffsetY;\n\n      // Calculate the cropper dimensions after all the zooming\n      viewportProperties.height = this.clipper.height * inverseZoomFactor;\n      viewportProperties.width = this.clipper.width * inverseZoomFactor;\n\n      if (\n        !this.focalPoint ||\n        (this.focalPoint &&\n          !this._isCenterInside(this.focalPoint, this.clipper))\n      ) {\n        if (this.focalPoint) {\n          this.toggleFocalPoint();\n        }\n\n        this._resetFocalPointPosition();\n      }\n\n      var callback = () => {\n        // Reposition focal point correctly\n        if (this.focalPoint) {\n          var sizeFactor =\n            this.getScaledImageDimensions().width /\n            this.focalPointState.imageDimensions.width;\n          this.focalPoint.left =\n            this.image.left +\n            this.focalPointState.offsetX * sizeFactor * this.zoomRatio;\n          this.focalPoint.top =\n            this.image.top +\n            this.focalPointState.offsetY * sizeFactor * this.zoomRatio;\n          this.canvas.add(this.focalPoint);\n        }\n      };\n\n      this._editorModeTransition(callback, imageProperties, viewportProperties);\n    },\n\n    /**\n     * @callback editorModeTransitionCallback\n     */\n    /**\n     * Transition between cropping end editor modes\n     *\n     * @param {editorModeTransitionCallback}\n     * @param {Object} imageProperties\n     * @param {Object} viewportProperties\n     * @private\n     */\n    _editorModeTransition: function (\n      callback,\n      imageProperties,\n      viewportProperties\n    ) {\n      this._queue.pause();\n\n      if (!this.animationInProgress) {\n        this.animationInProgress = true;\n\n        // Without this it looks semi-broken during animation\n        if (this.focalPoint) {\n          this.canvas.remove(this.focalPoint);\n          this.renderImage();\n        }\n\n        this.image.animate(imageProperties, {\n          onChange: this.canvas.renderAll.bind(this.canvas),\n          duration: this.settings.animationDuration,\n          onComplete: () => {\n            callback();\n            this.animationInProgress = false;\n            this.renderImage();\n            this._queue.resume();\n          },\n        });\n\n        this.viewport.animate(viewportProperties, {\n          duration: this.settings.animationDuration,\n        });\n      }\n    },\n\n    _showSpinner: function () {\n      if (!this.$spinner) {\n        this.$spinner = $('<div class=\"spinner big spinner-absolute\"/>');\n      }\n      this.$spinner.appendTo(this.$container.find('.image'));\n    },\n\n    _hideSpinner: function () {\n      this.$spinner.remove();\n    },\n\n    /**\n     * Show the cropper.\n     *\n     * @param {Object} clipperData\n     */\n    _showCropper: function (clipperData) {\n      this._setupCropperLayer(clipperData);\n      this._redrawCropperElements();\n      this.renderCropper();\n    },\n\n    /**\n     * Hide the cropper.\n     */\n    _hideCropper: function () {\n      if (this.clipper) {\n        this.croppingCanvas.remove(this.clipper);\n        this.croppingCanvas.remove(this.croppingShade);\n        this.croppingCanvas.remove(this.cropperHandles);\n        this.croppingCanvas.remove(this.cropperGrid);\n        this.croppingCanvas.remove(this.croppingRectangle);\n\n        this.croppingCanvas = null;\n        this.renderCropper = null;\n      }\n    },\n\n    /**\n     * Draw the cropper.\n     *\n     * @param {Object} clipperData\n     */\n    _setupCropperLayer: function (clipperData) {\n      // Set up the canvas for cropper\n      this.croppingCanvas = new fabric.StaticCanvas('cropping-canvas', {\n        backgroundColor: 'rgba(0,0,0,0)',\n        hoverCursor: 'default',\n        selection: false,\n      });\n\n      this.croppingCanvas.setDimensions({\n        width: this.editorWidth,\n        height: this.editorHeight,\n      });\n\n      this.renderCropper = () =>\n        Garnish.requestAnimationFrame(\n          this.croppingCanvas.renderAll.bind(this.croppingCanvas)\n        );\n\n      $('#cropping-canvas', this.$editorContainer).css({\n        position: 'absolute',\n        top: 0,\n        left: 0,\n      });\n\n      this.croppingShade = new fabric.Rect({\n        left: this.editorWidth / 2,\n        top: this.editorHeight / 2,\n        originX: 'center',\n        originY: 'center',\n        width: this.editorWidth,\n        height: this.editorHeight,\n        fill: 'rgba(0,0,0,0.7)',\n      });\n\n      // Calculate the cropping rectangle size\n      var imageDimensions = this.getScaledImageDimensions();\n      var rectangleRatio =\n        this.imageStraightenAngle === 0\n          ? 1\n          : this.getCombinedZoomRatio(imageDimensions) * 1.2;\n      var rectWidth = imageDimensions.width / rectangleRatio;\n      var rectHeight = imageDimensions.height / rectangleRatio;\n\n      if (this.hasOrientationChanged()) {\n        var temp = rectHeight;\n        rectHeight = rectWidth;\n        rectWidth = temp;\n      }\n\n      // Set up the cropping viewport rectangle\n      this.clipper = new fabric.Rect({\n        left: this.editorWidth / 2,\n        top: this.editorHeight / 2,\n        originX: 'center',\n        originY: 'center',\n        width: rectWidth,\n        height: rectHeight,\n        stroke: 'black',\n        fill: 'rgba(128,0,0,1)',\n        strokeWidth: 0,\n      });\n\n      // Set from clipper data\n      if (clipperData) {\n        this.clipper.set(clipperData);\n      }\n\n      this.clipper.globalCompositeOperation = 'destination-out';\n      this.croppingCanvas.add(this.croppingShade);\n      this.croppingCanvas.add(this.clipper);\n    },\n\n    /**\n     * Redraw the cropper boundaries\n     */\n    _redrawCropperElements: function () {\n      if (typeof this._redrawCropperElements._ === 'undefined') {\n        this._redrawCropperElements._ = {};\n      }\n\n      if (this.cropperHandles) {\n        this.croppingCanvas.remove(this.cropperHandles);\n        this.croppingCanvas.remove(this.cropperGrid);\n        this.croppingCanvas.remove(this.croppingRectangle);\n      }\n      this._redrawCropperElements._.lineOptions = {\n        strokeWidth: 4,\n        stroke: 'rgb(255,255,255)',\n        fill: false,\n      };\n\n      this._redrawCropperElements._.gridOptions = {\n        strokeWidth: 2,\n        stroke: 'rgba(255,255,255,0.5)',\n      };\n\n      // Draw the handles\n      this._redrawCropperElements._.pathGroup = [\n        new fabric.Path(\n          'M 0,10 L 0,0 L 10,0',\n          this._redrawCropperElements._.lineOptions\n        ),\n        new fabric.Path(\n          'M ' +\n            (this.clipper.width - 8) +\n            ',0 L ' +\n            (this.clipper.width + 4) +\n            ',0 L ' +\n            (this.clipper.width + 4) +\n            ',10',\n          this._redrawCropperElements._.lineOptions\n        ),\n        new fabric.Path(\n          'M ' +\n            (this.clipper.width + 4) +\n            ',' +\n            (this.clipper.height - 8) +\n            ' L' +\n            (this.clipper.width + 4) +\n            ',' +\n            (this.clipper.height + 4) +\n            ' L ' +\n            (this.clipper.width - 8) +\n            ',' +\n            (this.clipper.height + 4),\n          this._redrawCropperElements._.lineOptions\n        ),\n        new fabric.Path(\n          'M 10,' +\n            (this.clipper.height + 4) +\n            ' L 0,' +\n            (this.clipper.height + 4) +\n            ' L 0,' +\n            (this.clipper.height - 8),\n          this._redrawCropperElements._.lineOptions\n        ),\n      ];\n\n      this.cropperHandles = new fabric.Group(\n        this._redrawCropperElements._.pathGroup,\n        {\n          left: this.clipper.left,\n          top: this.clipper.top,\n          originX: 'center',\n          originY: 'center',\n        }\n      );\n\n      // Don't forget the rectangle\n      this.croppingRectangle = new fabric.Rect({\n        left: this.clipper.left,\n        top: this.clipper.top,\n        width: this.clipper.width,\n        height: this.clipper.height,\n        fill: 'rgba(0,0,0,0)',\n        stroke: 'rgba(255,255,255,0.8)',\n        strokeWidth: 2,\n        originX: 'center',\n        originY: 'center',\n      });\n\n      this.cropperGrid = new fabric.Group(\n        [\n          new fabric.Line(\n            [\n              this.clipper.width * 0.33,\n              0,\n              this.clipper.width * 0.33,\n              this.clipper.height,\n            ],\n            this._redrawCropperElements._.gridOptions\n          ),\n          new fabric.Line(\n            [\n              this.clipper.width * 0.66,\n              0,\n              this.clipper.width * 0.66,\n              this.clipper.height,\n            ],\n            this._redrawCropperElements._.gridOptions\n          ),\n          new fabric.Line(\n            [\n              0,\n              this.clipper.height * 0.33,\n              this.clipper.width,\n              this.clipper.height * 0.33,\n            ],\n            this._redrawCropperElements._.gridOptions\n          ),\n          new fabric.Line(\n            [\n              0,\n              this.clipper.height * 0.66,\n              this.clipper.width,\n              this.clipper.height * 0.66,\n            ],\n            this._redrawCropperElements._.gridOptions\n          ),\n        ],\n        {\n          left: this.clipper.left,\n          top: this.clipper.top,\n          originX: 'center',\n          originY: 'center',\n        }\n      );\n\n      this._redrawCropperElements._.cropTextTop =\n        this.croppingRectangle.top + this.clipper.height / 2 + 12;\n      this._redrawCropperElements._.cropTextBackgroundColor = 'rgba(0,0,0,0)';\n\n      if (\n        this._redrawCropperElements._.cropTextTop + 12 >\n        this.editorHeight - 2\n      ) {\n        this._redrawCropperElements._.cropTextTop -= 24;\n        this._redrawCropperElements._.cropTextBackgroundColor =\n          'rgba(0,0,0,0.5)';\n      }\n\n      this.croppingCanvas.add(this.cropperHandles);\n      this.croppingCanvas.add(this.cropperGrid);\n      this.croppingCanvas.add(this.croppingRectangle);\n    },\n\n    /**\n     * Reposition the cropper when the image editor dimensions change.\n     *\n     * @param {Object} previousImageArea\n     */\n    _repositionCropper: function (previousImageArea) {\n      if (!this.croppingCanvas) {\n        return;\n      }\n\n      // Get the current clipper offset relative to center\n      var currentOffset = {\n        x: this.clipper.left - this.croppingCanvas.width / 2,\n        y: this.clipper.top - this.croppingCanvas.height / 2,\n      };\n\n      // Resize the cropping canvas\n      this.croppingCanvas.setDimensions({\n        width: this.editorWidth,\n        height: this.editorHeight,\n      });\n\n      // Check by what factor will the new final bounding box be different\n      var currentArea = this._getBoundingRectangle(this.imageVerticeCoords);\n      var areaFactor = currentArea.width / previousImageArea.width;\n\n      // Adjust the cropper size to scale along with the bounding box\n      this.clipper.width = Math.round(this.clipper.width * areaFactor);\n      this.clipper.height = Math.round(this.clipper.height * areaFactor);\n\n      // Adjust the coordinates: re-position clipper in relation to the new center to adjust\n      // for editor size changes and then multiply by the size factor to adjust for image size changes\n      this.clipper.left = this.editorWidth / 2 + currentOffset.x * areaFactor;\n      this.clipper.top = this.editorHeight / 2 + currentOffset.y * areaFactor;\n\n      // Resize the cropping shade\n      this.croppingShade.set({\n        width: this.editorWidth,\n        height: this.editorHeight,\n        left: this.editorWidth / 2,\n        top: this.editorHeight / 2,\n      });\n\n      this._redrawCropperElements();\n      this.renderCropper();\n    },\n\n    /**\n     * Get the dimensions of a bounding rectangle by a set of four coordinates.\n     *\n     * @param {Object} coordinateSet\n     */\n    _getBoundingRectangle: function (coordinateSet) {\n      return {\n        width:\n          Math.max(\n            coordinateSet.a.x,\n            coordinateSet.b.x,\n            coordinateSet.c.x,\n            coordinateSet.d.x\n          ) -\n          Math.min(\n            coordinateSet.a.x,\n            coordinateSet.b.x,\n            coordinateSet.c.x,\n            coordinateSet.d.x\n          ),\n        height:\n          Math.max(\n            coordinateSet.a.y,\n            coordinateSet.b.y,\n            coordinateSet.c.y,\n            coordinateSet.d.y\n          ) -\n          Math.min(\n            coordinateSet.a.y,\n            coordinateSet.b.y,\n            coordinateSet.c.y,\n            coordinateSet.d.y\n          ),\n      };\n    },\n\n    /**\n     * Handle the mouse being clicked.\n     *\n     * @param {Object} ev\n     */\n    _handleMouseDown: function (ev) {\n      // Focal before resize before dragging\n      var focal = this.focalPoint && this._isMouseOver(ev, this.focalPoint);\n      var move = this.croppingCanvas && this._isMouseOver(ev, this.clipper);\n      var handle = this.croppingCanvas && this._cropperHandleHitTest(ev);\n\n      if (handle || move || focal) {\n        this.previousMouseX = ev.pageX;\n        this.previousMouseY = ev.pageY;\n\n        if (focal) {\n          this.draggingFocal = true;\n        } else if (handle) {\n          this.scalingCropper = handle;\n        } else if (move) {\n          this.draggingCropper = true;\n        }\n      }\n    },\n\n    /**\n     * Handle the mouse being moved.\n     *\n     * @param {Object} ev\n     */\n    _handleMouseMove: function (ev) {\n      if (this.mouseMoveEvent !== null) {\n        Garnish.requestAnimationFrame(this._handleMouseMoveInternal.bind(this));\n      }\n      this.mouseMoveEvent = ev;\n    },\n\n    _handleMouseMoveInternal: function () {\n      if (this.mouseMoveEvent === null) {\n        return;\n      }\n\n      if (this.focalPoint && this.draggingFocal) {\n        this._handleFocalDrag(this.mouseMoveEvent);\n        this.storeFocalPointState();\n        this.renderImage();\n      } else if (this.draggingCropper || this.scalingCropper) {\n        if (this.draggingCropper) {\n          this._handleCropperDrag(this.mouseMoveEvent);\n        } else {\n          this._handleCropperResize(this.mouseMoveEvent);\n        }\n\n        this._redrawCropperElements();\n\n        this.storeCropperState();\n        this.renderCropper();\n      } else {\n        this._setMouseCursor(this.mouseMoveEvent);\n      }\n\n      this.previousMouseX = this.mouseMoveEvent.pageX;\n      this.previousMouseY = this.mouseMoveEvent.pageY;\n\n      this.mouseMoveEvent = null;\n    },\n\n    /**\n     * Handle mouse being released.\n     */\n    _handleMouseUp: function () {\n      this.draggingCropper = false;\n      this.scalingCropper = false;\n      this.draggingFocal = false;\n    },\n\n    /**\n     * Handle mouse out\n     *\n     * @param {Object} ev\n     */\n    _handleMouseOut: function (ev) {\n      this._handleMouseUp(ev);\n      this.mouseMoveEvent = ev;\n      this._handleMouseMoveInternal();\n    },\n\n    /**\n     * Handle cropper being dragged.\n     *\n     * @param {Object} ev\n     */\n    _handleCropperDrag: function (ev) {\n      if (typeof this._handleCropperDrag._ === 'undefined') {\n        this._handleCropperDrag._ = {};\n      }\n\n      this._handleCropperDrag._.deltaX = ev.pageX - this.previousMouseX;\n      this._handleCropperDrag._.deltaY = ev.pageY - this.previousMouseY;\n\n      if (\n        this._handleCropperDrag._.deltaX === 0 &&\n        this._handleCropperDrag._.deltaY === 0\n      ) {\n        return false;\n      }\n\n      this._handleCropperDrag._.rectangle = {\n        left: this.clipper.left - this.clipper.width / 2,\n        top: this.clipper.top - this.clipper.height / 2,\n        width: this.clipper.width,\n        height: this.clipper.height,\n      };\n\n      this._handleCropperDrag._.vertices = this._getRectangleVertices(\n        this._handleCropperDrag._.rectangle,\n        this._handleCropperDrag._.deltaX,\n        this._handleCropperDrag._.deltaY\n      );\n\n      // If this would drag it outside of the image\n      if (\n        !this.arePointsInsideRectangle(\n          this._handleCropperDrag._.vertices,\n          this.imageVerticeCoords\n        )\n      ) {\n        // Try to find the furthest point in the same general direction where we can drag it\n\n        // Delta iterator setup\n        this._handleCropperDrag._.dxi = 0;\n        this._handleCropperDrag._.dyi = 0;\n        this._handleCropperDrag._.xStep =\n          this._handleCropperDrag._.deltaX > 0 ? -1 : 1;\n        this._handleCropperDrag._.yStep =\n          this._handleCropperDrag._.deltaY > 0 ? -1 : 1;\n\n        // The furthest we can move\n        this._handleCropperDrag._.furthest = 0;\n        this._handleCropperDrag._.furthestDeltas = {};\n\n        // Loop through every combination of dragging it not so far\n        for (\n          this._handleCropperDrag._.dxi = Math.min(\n            Math.abs(this._handleCropperDrag._.deltaX),\n            10\n          );\n          this._handleCropperDrag._.dxi >= 0;\n          this._handleCropperDrag._.dxi--\n        ) {\n          for (\n            this._handleCropperDrag._.dyi = Math.min(\n              Math.abs(this._handleCropperDrag._.deltaY),\n              10\n            );\n            this._handleCropperDrag._.dyi >= 0;\n            this._handleCropperDrag._.dyi--\n          ) {\n            this._handleCropperDrag._.vertices = this._getRectangleVertices(\n              this._handleCropperDrag._.rectangle,\n              this._handleCropperDrag._.dxi *\n                (this._handleCropperDrag._.deltaX > 0 ? 1 : -1),\n              this._handleCropperDrag._.dyi *\n                (this._handleCropperDrag._.deltaY > 0 ? 1 : -1)\n            );\n\n            if (\n              this.arePointsInsideRectangle(\n                this._handleCropperDrag._.vertices,\n                this.imageVerticeCoords\n              )\n            ) {\n              if (\n                this._handleCropperDrag._.dxi + this._handleCropperDrag._.dyi >\n                this._handleCropperDrag._.furthest\n              ) {\n                this._handleCropperDrag._.furthest =\n                  this._handleCropperDrag._.dxi + this._handleCropperDrag._.dyi;\n                this._handleCropperDrag._.furthestDeltas = {\n                  x:\n                    this._handleCropperDrag._.dxi *\n                    (this._handleCropperDrag._.deltaX > 0 ? 1 : -1),\n                  y:\n                    this._handleCropperDrag._.dyi *\n                    (this._handleCropperDrag._.deltaY > 0 ? 1 : -1),\n                };\n              }\n            }\n          }\n        }\n\n        // REALLY can't drag along the cursor movement\n        if (this._handleCropperDrag._.furthest == 0) {\n          return;\n        } else {\n          this._handleCropperDrag._.deltaX =\n            this._handleCropperDrag._.furthestDeltas.x;\n          this._handleCropperDrag._.deltaY =\n            this._handleCropperDrag._.furthestDeltas.y;\n        }\n      }\n\n      this.clipper.set({\n        left: this.clipper.left + this._handleCropperDrag._.deltaX,\n        top: this.clipper.top + this._handleCropperDrag._.deltaY,\n      });\n    },\n\n    /**\n     * Handle focal point being dragged.\n     *\n     * @param {Object} ev\n     */\n    _handleFocalDrag: function (ev) {\n      if (typeof this._handleFocalDrag._ === 'undefined') {\n        this._handleFocalDrag._ = {};\n      }\n\n      if (this.focalPoint) {\n        this._handleFocalDrag._.deltaX = ev.pageX - this.previousMouseX;\n        this._handleFocalDrag._.deltaY = ev.pageY - this.previousMouseY;\n\n        if (\n          this._handleFocalDrag._.deltaX === 0 &&\n          this._handleFocalDrag._.deltaY === 0\n        ) {\n          return;\n        }\n\n        this._handleFocalDrag._.newX =\n          this.focalPoint.left + this._handleFocalDrag._.deltaX;\n        this._handleFocalDrag._.newY =\n          this.focalPoint.top + this._handleFocalDrag._.deltaY;\n\n        // Just make sure that the focal point stays inside the image\n        if (this.currentView === 'crop') {\n          if (\n            !this.arePointsInsideRectangle(\n              [\n                {\n                  x: this._handleFocalDrag._.newX,\n                  y: this._handleFocalDrag._.newY,\n                },\n              ],\n              this.imageVerticeCoords\n            )\n          ) {\n            return;\n          }\n        } else {\n          if (\n            !(\n              this.viewport.left -\n                this.viewport.width / 2 -\n                this._handleFocalDrag._.newX <\n                0 &&\n              this.viewport.left +\n                this.viewport.width / 2 -\n                this._handleFocalDrag._.newX >\n                0 &&\n              this.viewport.top -\n                this.viewport.height / 2 -\n                this._handleFocalDrag._.newY <\n                0 &&\n              this.viewport.top +\n                this.viewport.height / 2 -\n                this._handleFocalDrag._.newY >\n                0\n            )\n          ) {\n            return;\n          }\n        }\n\n        this.focalPoint.set({\n          left: this.focalPoint.left + this._handleFocalDrag._.deltaX,\n          top: this.focalPoint.top + this._handleFocalDrag._.deltaY,\n        });\n      }\n    },\n\n    /**\n     * Set the cropping constraint\n     * @param {string} constraint\n     */\n    setCroppingConstraint: function (constraint) {\n      // In case this caused the sidebar width to change.\n      this.updateSizeAndPosition();\n\n      switch (constraint) {\n        case 'none':\n          this.croppingConstraint = false;\n          break;\n\n        case 'original':\n          this.croppingConstraint = this.originalWidth / this.originalHeight;\n          break;\n\n        case 'current':\n          this.croppingConstraint = this.clipper.width / this.clipper.height;\n          break;\n\n        case 'custom':\n          break;\n        default:\n          this.croppingConstraint = parseFloat(constraint);\n\n          break;\n      }\n    },\n\n    /**\n     * Enforce the cropping constraint\n     */\n    enforceCroppingConstraint: function () {\n      if (typeof this.enforceCroppingConstraint._ === 'undefined') {\n        this.enforceCroppingConstraint._ = {};\n      }\n\n      if (this.animationInProgress || !this.croppingConstraint) {\n        return;\n      }\n\n      this.animationInProgress = true;\n\n      // Mock the clipping rectangle for collision tests\n      this.enforceCroppingConstraint._.rectangle = {\n        left: this.clipper.left - this.clipper.width / 2,\n        top: this.clipper.top - this.clipper.height / 2,\n        width: this.clipper.width,\n        height: this.clipper.height,\n      };\n\n      // If wider than it should be\n      if (this.clipper.width > this.clipper.height * this.croppingConstraint) {\n        this.enforceCroppingConstraint._.previousHeight =\n          this.enforceCroppingConstraint._.rectangle.height;\n\n        // Make it taller!\n        this.enforceCroppingConstraint._.rectangle.height =\n          this.clipper.width / this.croppingConstraint;\n\n        // Getting really awkward having to convert between 0;0 being center or top-left corner.\n        this.enforceCroppingConstraint._.rectangle.top -=\n          (this.enforceCroppingConstraint._.rectangle.height -\n            this.enforceCroppingConstraint._.previousHeight) /\n          2;\n\n        // If the clipper would end up out of bounds, make it narrower instead.\n        if (\n          !this.arePointsInsideRectangle(\n            this._getRectangleVertices(\n              this.enforceCroppingConstraint._.rectangle\n            ),\n            this.imageVerticeCoords\n          )\n        ) {\n          this.enforceCroppingConstraint._.rectangle.width =\n            this.clipper.height * this.croppingConstraint;\n          this.enforceCroppingConstraint._.rectangle.height =\n            this.enforceCroppingConstraint._.rectangle.width /\n            this.croppingConstraint;\n        }\n      } else {\n        // Follow the same pattern, if taller than it should be.\n        this.enforceCroppingConstraint._.previousWidth =\n          this.enforceCroppingConstraint._.rectangle.width;\n        this.enforceCroppingConstraint._.rectangle.width =\n          this.clipper.height * this.croppingConstraint;\n        this.enforceCroppingConstraint._.rectangle.left -=\n          (this.enforceCroppingConstraint._.rectangle.width -\n            this.enforceCroppingConstraint._.previousWidth) /\n          2;\n\n        if (\n          !this.arePointsInsideRectangle(\n            this._getRectangleVertices(\n              this.enforceCroppingConstraint._.rectangle\n            ),\n            this.imageVerticeCoords\n          )\n        ) {\n          this.enforceCroppingConstraint._.rectangle.height =\n            this.clipper.width / this.croppingConstraint;\n          this.enforceCroppingConstraint._.rectangle.width =\n            this.enforceCroppingConstraint._.rectangle.height *\n            this.croppingConstraint;\n        }\n      }\n\n      this.enforceCroppingConstraint._.properties = {\n        height: this.enforceCroppingConstraint._.rectangle.height,\n        width: this.enforceCroppingConstraint._.rectangle.width,\n      };\n\n      // Make sure to redraw cropper handles and gridlines when resizing\n      this.clipper.animate(this.enforceCroppingConstraint._.properties, {\n        onChange: () => {\n          this._redrawCropperElements();\n          this.croppingCanvas.renderAll();\n        },\n        duration: this.settings.animationDuration,\n        onComplete: () => {\n          this._redrawCropperElements();\n          this.animationInProgress = false;\n          this.renderCropper();\n          this.storeCropperState();\n        },\n      });\n    },\n\n    /**\n     * Handle cropper being resized.\n     *\n     * @param {Object} ev\n     */\n    _handleCropperResize: function (ev) {\n      if (typeof this._handleCropperResize._ === 'undefined') {\n        this._handleCropperResize._ = {};\n      }\n\n      // Size deltas\n      this._handleCropperResize._.deltaX = ev.pageX - this.previousMouseX;\n      this._handleCropperResize._.deltaY = ev.pageY - this.previousMouseY;\n\n      if (this.scalingCropper === 'b' || this.scalingCropper === 't') {\n        this._handleCropperResize._.deltaX = 0;\n      }\n\n      if (this.scalingCropper === 'l' || this.scalingCropper === 'r') {\n        this._handleCropperResize._.deltaY = 0;\n      }\n\n      if (\n        this._handleCropperResize._.deltaX === 0 &&\n        this._handleCropperResize._.deltaY === 0\n      ) {\n        return;\n      }\n\n      // Translate from center-center origin to absolute coords\n      this._handleCropperResize._.startingRectangle = {\n        left: this.clipper.left - this.clipper.width / 2,\n        top: this.clipper.top - this.clipper.height / 2,\n        width: this.clipper.width,\n        height: this.clipper.height,\n      };\n\n      this._handleCropperResize._.rectangle =\n        this._calculateNewCropperSizeByDeltas(\n          this._handleCropperResize._.startingRectangle,\n          this._handleCropperResize._.deltaX,\n          this._handleCropperResize._.deltaY,\n          this.scalingCropper\n        );\n\n      if (\n        this._handleCropperResize._.rectangle.height < 30 ||\n        this._handleCropperResize._.rectangle.width < 30\n      ) {\n        return;\n      }\n\n      if (\n        !this.arePointsInsideRectangle(\n          this._getRectangleVertices(this._handleCropperResize._.rectangle),\n          this.imageVerticeCoords\n        )\n      ) {\n        return;\n      }\n\n      // Translate back to center-center origin.\n      this.clipper.set({\n        top:\n          this._handleCropperResize._.rectangle.top +\n          this._handleCropperResize._.rectangle.height / 2,\n        left:\n          this._handleCropperResize._.rectangle.left +\n          this._handleCropperResize._.rectangle.width / 2,\n        width: this._handleCropperResize._.rectangle.width,\n        height: this._handleCropperResize._.rectangle.height,\n      });\n\n      this._redrawCropperElements();\n    },\n\n    _calculateNewCropperSizeByDeltas: function (\n      startingRectangle,\n      deltaX,\n      deltaY,\n      cropperDirection\n    ) {\n      if (typeof this._calculateNewCropperSizeByDeltas._ === 'undefined') {\n        this._calculateNewCropperSizeByDeltas._ = {};\n      }\n\n      // Center deltas\n      this._calculateNewCropperSizeByDeltas._.topDelta = 0;\n      this._calculateNewCropperSizeByDeltas._.leftDelta = 0;\n\n      this._calculateNewCropperSizeByDeltas._.rectangle = startingRectangle;\n      this._calculateNewCropperSizeByDeltas._.deltaX = deltaX;\n      this._calculateNewCropperSizeByDeltas._.deltaY = deltaY;\n\n      // Lock the aspect ratio if needed\n      if (this.croppingConstraint) {\n        this._calculateNewCropperSizeByDeltas._.change = 0;\n\n        // Take into account the mouse direction and figure out the \"real\" change in cropper size\n        switch (cropperDirection) {\n          case 't':\n            this._calculateNewCropperSizeByDeltas._.change =\n              -this._calculateNewCropperSizeByDeltas._.deltaY;\n            break;\n          case 'b':\n            this._calculateNewCropperSizeByDeltas._.change =\n              this._calculateNewCropperSizeByDeltas._.deltaY;\n            break;\n          case 'r':\n            this._calculateNewCropperSizeByDeltas._.change =\n              this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'l':\n            this._calculateNewCropperSizeByDeltas._.change =\n              -this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'tr':\n            this._calculateNewCropperSizeByDeltas._.change =\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n                ? -this._calculateNewCropperSizeByDeltas._.deltaY\n                : this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'tl':\n            this._calculateNewCropperSizeByDeltas._.change =\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n                ? -this._calculateNewCropperSizeByDeltas._.deltaY\n                : -this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'br':\n            this._calculateNewCropperSizeByDeltas._.change =\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n                ? this._calculateNewCropperSizeByDeltas._.deltaY\n                : this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'bl':\n            this._calculateNewCropperSizeByDeltas._.change =\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n              Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n                ? this._calculateNewCropperSizeByDeltas._.deltaY\n                : -this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n        }\n\n        if (this.croppingConstraint > 1) {\n          this._calculateNewCropperSizeByDeltas._.deltaX =\n            this._calculateNewCropperSizeByDeltas._.change;\n          this._calculateNewCropperSizeByDeltas._.deltaY =\n            this._calculateNewCropperSizeByDeltas._.deltaX /\n            this.croppingConstraint;\n        } else {\n          this._calculateNewCropperSizeByDeltas._.deltaY =\n            this._calculateNewCropperSizeByDeltas._.change;\n          this._calculateNewCropperSizeByDeltas._.deltaX =\n            this._calculateNewCropperSizeByDeltas._.deltaY *\n            this.croppingConstraint;\n        }\n\n        this._calculateNewCropperSizeByDeltas._.rectangle.height +=\n          this._calculateNewCropperSizeByDeltas._.deltaY;\n        this._calculateNewCropperSizeByDeltas._.rectangle.width +=\n          this._calculateNewCropperSizeByDeltas._.deltaX;\n\n        // Make the cropper compress/expand relative to the correct edge to make it feel \"right\"\n        switch (cropperDirection) {\n          case 't':\n            this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n              this._calculateNewCropperSizeByDeltas._.deltaY;\n            this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n              this._calculateNewCropperSizeByDeltas._.deltaX / 2;\n            break;\n          case 'b':\n            this._calculateNewCropperSizeByDeltas._.rectangle.left +=\n              -this._calculateNewCropperSizeByDeltas._.deltaX / 2;\n            break;\n          case 'r':\n            this._calculateNewCropperSizeByDeltas._.rectangle.top +=\n              -this._calculateNewCropperSizeByDeltas._.deltaY / 2;\n            break;\n          case 'l':\n            this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n              this._calculateNewCropperSizeByDeltas._.deltaY / 2;\n            this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n              this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'tr':\n            this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n              this._calculateNewCropperSizeByDeltas._.deltaY;\n            break;\n          case 'tl':\n            this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n              this._calculateNewCropperSizeByDeltas._.deltaY;\n            this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n              this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n          case 'bl':\n            this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n              this._calculateNewCropperSizeByDeltas._.deltaX;\n            break;\n        }\n      } else {\n        // Lock the aspect ratio\n        if (\n          this.shiftKeyHeld &&\n          (cropperDirection === 'tl' ||\n            cropperDirection === 'tr' ||\n            cropperDirection === 'bl' ||\n            cropperDirection === 'br')\n        ) {\n          this._calculateNewCropperSizeByDeltas._.ratio;\n          if (Math.abs(deltaX) > Math.abs(deltaY)) {\n            this._calculateNewCropperSizeByDeltas._.ratio =\n              startingRectangle.width / startingRectangle.height;\n            this._calculateNewCropperSizeByDeltas._.deltaY =\n              this._calculateNewCropperSizeByDeltas._.deltaX /\n              this._calculateNewCropperSizeByDeltas._.ratio;\n            this._calculateNewCropperSizeByDeltas._.deltaY *=\n              cropperDirection === 'tr' || cropperDirection === 'bl' ? -1 : 1;\n          } else {\n            this._calculateNewCropperSizeByDeltas._.ratio =\n              startingRectangle.width / startingRectangle.height;\n            this._calculateNewCropperSizeByDeltas._.deltaX =\n              this._calculateNewCropperSizeByDeltas._.deltaY *\n              this._calculateNewCropperSizeByDeltas._.ratio;\n            this._calculateNewCropperSizeByDeltas._.deltaX *=\n              cropperDirection === 'tr' || cropperDirection === 'bl' ? -1 : 1;\n          }\n        }\n\n        if (cropperDirection.match(/t/)) {\n          this._calculateNewCropperSizeByDeltas._.rectangle.top +=\n            this._calculateNewCropperSizeByDeltas._.deltaY;\n          this._calculateNewCropperSizeByDeltas._.rectangle.height -=\n            this._calculateNewCropperSizeByDeltas._.deltaY;\n        }\n        if (cropperDirection.match(/b/)) {\n          this._calculateNewCropperSizeByDeltas._.rectangle.height +=\n            this._calculateNewCropperSizeByDeltas._.deltaY;\n        }\n        if (cropperDirection.match(/r/)) {\n          this._calculateNewCropperSizeByDeltas._.rectangle.width +=\n            this._calculateNewCropperSizeByDeltas._.deltaX;\n        }\n        if (cropperDirection.match(/l/)) {\n          this._calculateNewCropperSizeByDeltas._.rectangle.left +=\n            this._calculateNewCropperSizeByDeltas._.deltaX;\n          this._calculateNewCropperSizeByDeltas._.rectangle.width -=\n            this._calculateNewCropperSizeByDeltas._.deltaX;\n        }\n      }\n\n      this._calculateNewCropperSizeByDeltas._.rectangle.top =\n        this._calculateNewCropperSizeByDeltas._.rectangle.top;\n      this._calculateNewCropperSizeByDeltas._.rectangle.left =\n        this._calculateNewCropperSizeByDeltas._.rectangle.left;\n      this._calculateNewCropperSizeByDeltas._.rectangle.width =\n        this._calculateNewCropperSizeByDeltas._.rectangle.width;\n      this._calculateNewCropperSizeByDeltas._.rectangle.height =\n        this._calculateNewCropperSizeByDeltas._.rectangle.height;\n\n      return this._calculateNewCropperSizeByDeltas._.rectangle;\n    },\n\n    /**\n     * Set mouse cursor by it's position over cropper.\n     *\n     * @param {Object} ev\n     */\n    _setMouseCursor: function (ev) {\n      if (typeof this._setMouseCursor._ === 'undefined') {\n        this._setMouseCursor._ = {};\n      }\n\n      if (Garnish.isMobileBrowser(true)) {\n        return;\n      }\n      this._setMouseCursor._.cursor = 'default';\n      this._setMouseCursor._.handle =\n        this.croppingCanvas && this._cropperHandleHitTest(ev);\n      if (this.focalPoint && this._isMouseOver(ev, this.focalPoint)) {\n        this._setMouseCursor._.cursor = 'pointer';\n      } else if (this._setMouseCursor._.handle) {\n        if (\n          this._setMouseCursor._.handle === 't' ||\n          this._setMouseCursor._.handle === 'b'\n        ) {\n          this._setMouseCursor._.cursor = 'ns-resize';\n        } else if (\n          this._setMouseCursor._.handle === 'l' ||\n          this._setMouseCursor._.handle === 'r'\n        ) {\n          this._setMouseCursor._.cursor = 'ew-resize';\n        } else if (\n          this._setMouseCursor._.handle === 'tl' ||\n          this._setMouseCursor._.handle === 'br'\n        ) {\n          this._setMouseCursor._.cursor = 'nwse-resize';\n        } else if (\n          this._setMouseCursor._.handle === 'bl' ||\n          this._setMouseCursor._.handle === 'tr'\n        ) {\n          this._setMouseCursor._.cursor = 'nesw-resize';\n        }\n      } else if (this.croppingCanvas && this._isMouseOver(ev, this.clipper)) {\n        this._setMouseCursor._.cursor = 'move';\n      }\n\n      $('.body').css('cursor', this._setMouseCursor._.cursor);\n    },\n\n    /**\n     * Test whether the mouse cursor is on any cropper handles.\n     *\n     * @param {Object} ev\n     */\n    _cropperHandleHitTest: function (ev) {\n      if (typeof this._cropperHandleHitTest._ === 'undefined') {\n        this._cropperHandleHitTest._ = {};\n      }\n\n      this._cropperHandleHitTest._.parentOffset = this.$croppingCanvas.offset();\n      this._cropperHandleHitTest._.mouseX =\n        ev.pageX - this._cropperHandleHitTest._.parentOffset.left;\n      this._cropperHandleHitTest._.mouseY =\n        ev.pageY - this._cropperHandleHitTest._.parentOffset.top;\n\n      // Compensate for center origin coordinate-wise\n      this._cropperHandleHitTest._.lb =\n        this.clipper.left - this.clipper.width / 2;\n      this._cropperHandleHitTest._.rb =\n        this._cropperHandleHitTest._.lb + this.clipper.width;\n      this._cropperHandleHitTest._.tb =\n        this.clipper.top - this.clipper.height / 2;\n      this._cropperHandleHitTest._.bb =\n        this._cropperHandleHitTest._.tb + this.clipper.height;\n\n      // Left side top/bottom\n      if (\n        this._cropperHandleHitTest._.mouseX <\n          this._cropperHandleHitTest._.lb + 10 &&\n        this._cropperHandleHitTest._.mouseX >\n          this._cropperHandleHitTest._.lb - 3\n      ) {\n        if (\n          this._cropperHandleHitTest._.mouseY <\n            this._cropperHandleHitTest._.tb + 10 &&\n          this._cropperHandleHitTest._.mouseY >\n            this._cropperHandleHitTest._.tb - 3\n        ) {\n          return 'tl';\n        } else if (\n          this._cropperHandleHitTest._.mouseY <\n            this._cropperHandleHitTest._.bb + 3 &&\n          this._cropperHandleHitTest._.mouseY >\n            this._cropperHandleHitTest._.bb - 10\n        ) {\n          return 'bl';\n        }\n      }\n      // Right side top/bottom\n      if (\n        this._cropperHandleHitTest._.mouseX >\n          this._cropperHandleHitTest._.rb - 13 &&\n        this._cropperHandleHitTest._.mouseX <\n          this._cropperHandleHitTest._.rb + 3\n      ) {\n        if (\n          this._cropperHandleHitTest._.mouseY <\n            this._cropperHandleHitTest._.tb + 10 &&\n          this._cropperHandleHitTest._.mouseY >\n            this._cropperHandleHitTest._.tb - 3\n        ) {\n          return 'tr';\n        } else if (\n          this._cropperHandleHitTest._.mouseY <\n            this._cropperHandleHitTest._.bb + 2 &&\n          this._cropperHandleHitTest._.mouseY >\n            this._cropperHandleHitTest._.bb - 10\n        ) {\n          return 'br';\n        }\n      }\n\n      // Left or right\n      if (\n        this._cropperHandleHitTest._.mouseX <\n          this._cropperHandleHitTest._.lb + 3 &&\n        this._cropperHandleHitTest._.mouseX >\n          this._cropperHandleHitTest._.lb - 3 &&\n        this._cropperHandleHitTest._.mouseY <\n          this._cropperHandleHitTest._.bb - 10 &&\n        this._cropperHandleHitTest._.mouseY >\n          this._cropperHandleHitTest._.tb + 10\n      ) {\n        return 'l';\n      }\n      if (\n        this._cropperHandleHitTest._.mouseX <\n          this._cropperHandleHitTest._.rb + 1 &&\n        this._cropperHandleHitTest._.mouseX >\n          this._cropperHandleHitTest._.rb - 5 &&\n        this._cropperHandleHitTest._.mouseY <\n          this._cropperHandleHitTest._.bb - 10 &&\n        this._cropperHandleHitTest._.mouseY >\n          this._cropperHandleHitTest._.tb + 10\n      ) {\n        return 'r';\n      }\n\n      // Top or bottom\n      if (\n        this._cropperHandleHitTest._.mouseY <\n          this._cropperHandleHitTest._.tb + 4 &&\n        this._cropperHandleHitTest._.mouseY >\n          this._cropperHandleHitTest._.tb - 2 &&\n        this._cropperHandleHitTest._.mouseX >\n          this._cropperHandleHitTest._.lb + 10 &&\n        this._cropperHandleHitTest._.mouseX <\n          this._cropperHandleHitTest._.rb - 10\n      ) {\n        return 't';\n      }\n      if (\n        this._cropperHandleHitTest._.mouseY <\n          this._cropperHandleHitTest._.bb + 2 &&\n        this._cropperHandleHitTest._.mouseY >\n          this._cropperHandleHitTest._.bb - 4 &&\n        this._cropperHandleHitTest._.mouseX >\n          this._cropperHandleHitTest._.lb + 10 &&\n        this._cropperHandleHitTest._.mouseX <\n          this._cropperHandleHitTest._.rb - 10\n      ) {\n        return 'b';\n      }\n\n      return false;\n    },\n\n    /**\n     * Test whether the mouse cursor is on a fabricJS object.\n     *\n     * @param {Object} event\n     * @param {Object} object\n     * @returns {boolean}\n     */\n    _isMouseOver: function (event, object) {\n      if (typeof this._isMouseOver._ === 'undefined') {\n        this._isMouseOver._ = {};\n      }\n\n      this._isMouseOver._.parentOffset = this.$croppingCanvas.offset();\n      this._isMouseOver._.mouseX =\n        event.pageX - this._isMouseOver._.parentOffset.left;\n      this._isMouseOver._.mouseY =\n        event.pageY - this._isMouseOver._.parentOffset.top;\n\n      // Compensate for center origin coordinate-wise\n      this._isMouseOver._.lb = object.left - object.width / 2;\n      this._isMouseOver._.rb = this._isMouseOver._.lb + object.width;\n      this._isMouseOver._.tb = object.top - object.height / 2;\n      this._isMouseOver._.bb = this._isMouseOver._.tb + object.height;\n\n      return (\n        this._isMouseOver._.mouseX >= this._isMouseOver._.lb &&\n        this._isMouseOver._.mouseX <= this._isMouseOver._.rb &&\n        this._isMouseOver._.mouseY >= this._isMouseOver._.tb &&\n        this._isMouseOver._.mouseY <= this._isMouseOver._.bb\n      );\n    },\n\n    /**\n     * Get vertices of a rectangle defined by left,top,height and width properties.\n     * Optionally it's possible to provide offsetX and offsetY values.\n     * Left and top properties of rectangle reference the top-left corner.\n     *\n     * @param {Object} rectangle\n     * @param {number} [offsetX]\n     * @param {number} [offsetY]\n     */\n    _getRectangleVertices: function (rectangle, offsetX, offsetY) {\n      if (typeof this._getRectangleVertices._ === 'undefined') {\n        this._getRectangleVertices._ = {};\n      }\n\n      if (typeof offsetX === 'undefined') {\n        offsetX = 0;\n      }\n      if (typeof offsetY === 'undefined') {\n        offsetY = 0;\n      }\n\n      this._getRectangleVertices._.topLeft = {\n        x: rectangle.left + offsetX,\n        y: rectangle.top + offsetY,\n      };\n\n      this._getRectangleVertices._.topRight = {\n        x: this._getRectangleVertices._.topLeft.x + rectangle.width,\n        y: this._getRectangleVertices._.topLeft.y,\n      };\n      this._getRectangleVertices._.bottomRight = {\n        x: this._getRectangleVertices._.topRight.x,\n        y: this._getRectangleVertices._.topRight.y + rectangle.height,\n      };\n      this._getRectangleVertices._.bottomLeft = {\n        x: this._getRectangleVertices._.topLeft.x,\n        y: this._getRectangleVertices._.bottomRight.y,\n      };\n\n      return [\n        this._getRectangleVertices._.topLeft,\n        this._getRectangleVertices._.topRight,\n        this._getRectangleVertices._.bottomRight,\n        this._getRectangleVertices._.bottomLeft,\n      ];\n    },\n\n    /**\n     * Set image vertice coordinates for an image that's been zoomed to fit.\n     */\n    _setFittedImageVerticeCoordinates: function () {\n      this.imageVerticeCoords = this.getImageVerticeCoords('fit');\n    },\n\n    /**\n     * Get image vertice coords by a zoom mode and taking into account the straightening angle.\n     * The zoomMode can be either \"cover\", \"fit\" or a discrete float value.\n     *\n     * @param {string} zoomMode\n     */\n    getImageVerticeCoords: function (zoomMode) {\n      var angleInRadians =\n        -1 *\n        ((this.hasOrientationChanged() ? 90 : 0) + this.imageStraightenAngle) *\n        (Math.PI / 180);\n\n      var imageDimensions = this.getScaledImageDimensions();\n\n      var ratio;\n\n      if (typeof zoomMode === 'number') {\n        ratio = zoomMode;\n      } else if (zoomMode === 'cover') {\n        ratio = this.getZoomToCoverRatio(imageDimensions);\n      } else {\n        ratio = this.getZoomToFitRatio(imageDimensions);\n      }\n\n      // Get the dimensions of the scaled image\n      var scaledHeight = imageDimensions.height * ratio;\n      var scaledWidth = imageDimensions.width * ratio;\n\n      // Calculate the segments of the containing box for the image.\n      // When referring to top/bottom or right/left segments, these are on the\n      // right-side and bottom projection of the containing box for the zoomed out image.\n      var topVerticalSegment = Math.cos(angleInRadians) * scaledHeight;\n      var bottomVerticalSegment = Math.sin(angleInRadians) * scaledWidth;\n      var rightHorizontalSegment = Math.cos(angleInRadians) * scaledWidth;\n      var leftHorizontalSegment = Math.sin(angleInRadians) * scaledHeight;\n\n      // Calculate the offsets from editor box for the image-containing box\n      var verticalOffset =\n        (this.editorHeight - (topVerticalSegment + bottomVerticalSegment)) / 2;\n      var horizontalOffset =\n        (this.editorWidth - (leftHorizontalSegment + rightHorizontalSegment)) /\n        2;\n\n      // Finally, calculate the image vertice coordinates\n      return {\n        a: {\n          x: horizontalOffset + rightHorizontalSegment,\n          y: verticalOffset,\n        },\n        b: {\n          x: this.editorWidth - horizontalOffset,\n          y: verticalOffset + topVerticalSegment,\n        },\n        c: {\n          x: horizontalOffset + leftHorizontalSegment,\n          y: this.editorHeight - verticalOffset,\n        },\n        d: {\n          x: horizontalOffset,\n          y: verticalOffset + bottomVerticalSegment,\n        },\n      };\n    },\n\n    /**\n     * Debug stuff by continuously rendering a fabric object on canvas.\n     *\n     * @param {Object} fabricObj\n     */\n    _debug: function (fabricObj) {\n      this.canvas.remove(this.debugger);\n      this.debugger = fabricObj;\n      this.canvas.add(this.debugger);\n    },\n\n    /**\n     * Given an array of points in the form of {x: int, y:int} and a rectangle in the form of\n     * {a:{x:int, y:int}, b:{x:int, y:int}, c:{x:int, y:int}} (the fourth vertice is unnecessary)\n     * return true if the point is in the rectangle.\n     *\n     * Adapted from: http://stackoverflow.com/a/2763387/2040791\n     *\n     * @param {Object} points\n     * @param {Object} rectangle\n     */\n    arePointsInsideRectangle: function (points, rectangle) {\n      if (typeof this.arePointsInsideRectangle._ === 'undefined') {\n        this.arePointsInsideRectangle._ = {};\n      }\n\n      // Pre-calculate the vectors and scalar products for two rectangle edges\n      this.arePointsInsideRectangle._.ab = this._getVector(\n        rectangle.a,\n        rectangle.b\n      );\n      this.arePointsInsideRectangle._.bc = this._getVector(\n        rectangle.b,\n        rectangle.c\n      );\n      this.arePointsInsideRectangle._.scalarAbAb = this._getScalarProduct(\n        this.arePointsInsideRectangle._.ab,\n        this.arePointsInsideRectangle._.ab\n      );\n      this.arePointsInsideRectangle._.scalarBcBc = this._getScalarProduct(\n        this.arePointsInsideRectangle._.bc,\n        this.arePointsInsideRectangle._.bc\n      );\n\n      for (\n        this.arePointsInsideRectangle._.i = 0;\n        this.arePointsInsideRectangle._.i < points.length;\n        this.arePointsInsideRectangle._.i++\n      ) {\n        this.arePointsInsideRectangle._.point =\n          points[this.arePointsInsideRectangle._.i];\n\n        // Calculate the vectors for two rectangle sides and for\n        // the vector from vertices a and b to the point P\n        this.arePointsInsideRectangle._.ap = this._getVector(\n          rectangle.a,\n          this.arePointsInsideRectangle._.point\n        );\n        this.arePointsInsideRectangle._.bp = this._getVector(\n          rectangle.b,\n          this.arePointsInsideRectangle._.point\n        );\n\n        // Calculate scalar or dot products for some vector combinations\n        this.arePointsInsideRectangle._.scalarAbAp = this._getScalarProduct(\n          this.arePointsInsideRectangle._.ab,\n          this.arePointsInsideRectangle._.ap\n        );\n        this.arePointsInsideRectangle._.scalarBcBp = this._getScalarProduct(\n          this.arePointsInsideRectangle._.bc,\n          this.arePointsInsideRectangle._.bp\n        );\n\n        this.arePointsInsideRectangle._.projectsOnAB =\n          0 <= this.arePointsInsideRectangle._.scalarAbAp &&\n          this.arePointsInsideRectangle._.scalarAbAp <=\n            this.arePointsInsideRectangle._.scalarAbAb;\n        this.arePointsInsideRectangle._.projectsOnBC =\n          0 <= this.arePointsInsideRectangle._.scalarBcBp &&\n          this.arePointsInsideRectangle._.scalarBcBp <=\n            this.arePointsInsideRectangle._.scalarBcBc;\n\n        if (\n          !(\n            this.arePointsInsideRectangle._.projectsOnAB &&\n            this.arePointsInsideRectangle._.projectsOnBC\n          )\n        ) {\n          return false;\n        }\n      }\n\n      return true;\n    },\n\n    /**\n     * Returns an object representing the vector between points a and b.\n     *\n     * @param {Object} a\n     * @param {Object} b\n     */\n    _getVector: function (a, b) {\n      return {x: b.x - a.x, y: b.y - a.y};\n    },\n\n    /**\n     * Returns the scalar product of two vectors\n     *\n     * @param {Object} a\n     * @param {Object} b\n     */\n    _getScalarProduct: function (a, b) {\n      return a.x * b.x + a.y * b.y;\n    },\n\n    /**\n     * Returns the magnitude of a vector_redrawCropperElements\n     * .\n     *\n     * @param {Object} vector\n     */\n    _getVectorMagnitude: function (vector) {\n      return Math.sqrt(vector.x * vector.x + vector.y * vector.y);\n    },\n\n    /**\n     * Returns the angle between two vectors in degrees with two decimal points\n     *\n     * @param {Object} a\n     * @param {Object} b\n     */\n    _getAngleBetweenVectors: function (a, b) {\n      return (\n        Math.round(\n          ((Math.acos(\n            Math.min(\n              1,\n              this._getScalarProduct(a, b) /\n                (this._getVectorMagnitude(a) * this._getVectorMagnitude(b))\n            )\n          ) *\n            180) /\n            Math.PI) *\n            100\n        ) / 100\n      );\n    },\n\n    /**\n     * Return the rectangle edge crossed by an imaginary line drawn from editor center to a vertex\n     *\n     * @param {Object} rectangle\n     * @param {Object} vertex\n     *\n     * @returns {*}\n     */\n    _getEdgeCrossed: function (rectangle, vertex) {\n      // Determine over which edge the vertex is\n      var edgePoints = [\n        [rectangle.a, rectangle.b],\n        [rectangle.b, rectangle.c],\n        [rectangle.c, rectangle.d],\n        [rectangle.d, rectangle.a],\n      ];\n\n      var centerPoint = {x: this.editorWidth / 2, y: this.editorHeight / 2};\n      var smallestDiff = 180;\n      var edgeCrossed = null;\n\n      // Test each edge\n      for (var edgeIndex = 0; edgeIndex < edgePoints.length; edgeIndex++) {\n        var edge = edgePoints[edgeIndex];\n        var toCenter = this._getVector(edge[0], centerPoint);\n        var edgeVector = this._getVector(edge[0], edge[1]);\n        var toVertex = this._getVector(edge[0], vertex);\n\n        // If the angle between toCenter/toVertex is the sum of\n        // angles between edgeVector/toCenter and edgeVector/toVertex, it means that\n        // the edgeVector is between the other two meaning that this is the offending vertex.\n        // To avoid the rounding errors, we'll take the closest match\n        var diff = Math.abs(\n          this._getAngleBetweenVectors(toCenter, toVertex) -\n            (this._getAngleBetweenVectors(toCenter, edgeVector) +\n              this._getAngleBetweenVectors(edgeVector, toVertex))\n        );\n\n        if (diff < smallestDiff) {\n          smallestDiff = diff;\n          edgeCrossed = edge;\n        }\n      }\n\n      return edgeCrossed;\n    },\n\n    /**\n     * Get the image bounding box by image scaled dimensions, taking ingo account the straightening angle.\n     *\n     * @param {Object} dimensions\n     */\n    _getImageBoundingBox: function (dimensions) {\n      var box = {};\n\n      var angleInRadians =\n        Math.abs(this.imageStraightenAngle) * (Math.PI / 180);\n\n      var proportion = dimensions.height / dimensions.width;\n      box.height =\n        dimensions.width *\n        (Math.sin(angleInRadians) + Math.cos(angleInRadians) * proportion);\n      box.width =\n        dimensions.width *\n        (Math.cos(angleInRadians) + Math.sin(angleInRadians) * proportion);\n\n      if (this.hasOrientationChanged()) {\n        var temp = box.width;\n        box.width = box.height;\n        box.height = temp;\n      }\n\n      return box;\n    },\n  },\n  {\n    defaults: {\n      animationDuration: 100,\n      allowSavingAsNew: true,\n      onSave: $.noop,\n      allowDegreeFractions: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Asset index class\n */\nCraft.AssetIndex = Craft.BaseElementIndex.extend({\n  $includeSubfoldersContainer: null,\n  $includeSubfoldersCheckbox: null,\n  showingIncludeSubfoldersCheckbox: false,\n\n  $uploadButton: null,\n  $uploadInput: null,\n  $progressBar: null,\n  $folders: null,\n\n  uploader: null,\n  promptHandler: null,\n  progressBar: null,\n\n  _uploadTotalFiles: 0,\n  _uploadFileProgress: {},\n  _currentUploaderSettings: {},\n\n  _assetDrag: null,\n  _folderDrag: null,\n  _expandDropTargetFolderTimeout: null,\n  _tempExpandedFolders: [],\n\n  _fileConflictTemplate: {\n    choices: [\n      {value: 'keepBoth', title: Craft.t('app', 'Keep both')},\n      {value: 'replace', title: Craft.t('app', 'Replace it')},\n    ],\n  },\n  _folderConflictTemplate: {\n    choices: [\n      {\n        value: 'replace',\n        title: Craft.t(\n          'app',\n          'Replace the folder (all existing files will be deleted)'\n        ),\n      },\n      {\n        value: 'merge',\n        title: Craft.t(\n          'app',\n          'Merge the folder (any conflicting files will be replaced)'\n        ),\n      },\n    ],\n  },\n\n  init: function (elementType, $container, settings) {\n    this.base(elementType, $container, settings);\n\n    if (this.settings.context === 'index') {\n      if (!this._folderDrag) {\n        this._initIndexPageMode();\n      }\n\n      this.addListener(Garnish.$win, 'resize,scroll', '_positionProgressBar');\n    } else {\n      this.addListener(this.$main, 'scroll', '_positionProgressBar');\n\n      if (this.settings.modal) {\n        this.settings.modal.on(\n          'updateSizeAndPosition',\n          this._positionProgressBar.bind(this)\n        );\n      }\n    }\n  },\n\n  initSources: function () {\n    if (this.settings.context === 'index' && !this._folderDrag) {\n      this._initIndexPageMode();\n    }\n\n    return this.base();\n  },\n\n  initSource: function ($source) {\n    this.base($source);\n\n    this._createFolderContextMenu($source);\n\n    if (this.settings.context === 'index') {\n      if (this._folderDrag && this.getSourceLevel($source) > 1) {\n        if ($source.data('folder-id')) {\n          this._folderDrag.addItems($source.parent());\n        }\n      }\n\n      if (this._assetDrag) {\n        this._assetDrag.updateDropTargets();\n      }\n    }\n  },\n\n  deinitSource: function ($source) {\n    this.base($source);\n\n    // Does this source have a context menu?\n    var contextMenu = $source.data('contextmenu');\n\n    if (contextMenu) {\n      contextMenu.destroy();\n    }\n\n    if (this.settings.context === 'index') {\n      if (this._folderDrag && this.getSourceLevel($source) > 1) {\n        this._folderDrag.removeItems($source.parent());\n      }\n\n      if (this._assetDrag) {\n        this._assetDrag.updateDropTargets();\n      }\n    }\n  },\n\n  /**\n   * Initialize the index page-specific features\n   */\n  _initIndexPageMode: function () {\n    if (this._folderDrag) {\n      return;\n    }\n\n    // Make the elements selectable\n    this.settings.selectable = true;\n    this.settings.multiSelect = true;\n\n    // Asset dragging\n    // ---------------------------------------------------------------------\n\n    this._assetDrag = new Garnish.DragDrop({\n      activeDropTargetClass: 'sel',\n      helperOpacity: 0.75,\n      filter: () =>\n        this.view.getSelectedElements().has('div.element[data-movable]'),\n      helper: ($file) => this._getFileDragHelper($file),\n      dropTargets: () => {\n        // Which data attribute should we be checking?\n        var attr;\n        if (\n          this._assetDrag.$draggee &&\n          this._assetDrag.$draggee.has('.element[data-peer-file]').length\n        ) {\n          attr = 'data-can-move-peer-files-to';\n        } else {\n          attr = 'data-can-move-to';\n        }\n\n        var targets = [];\n\n        for (var i = 0; i < this.$sources.length; i++) {\n          // Make sure it's a volume folder\n          var $source = this.$sources.eq(i);\n          if (Garnish.hasAttr($source, attr)) {\n            targets.push($source);\n          }\n        }\n\n        return targets;\n      },\n\n      onDragStart: this._onDragStart.bind(this),\n      onDropTargetChange: this._onDropTargetChange.bind(this),\n      onDragStop: this._onFileDragStop.bind(this),\n      helperBaseZindex: 800,\n    });\n\n    // Folder dragging\n    // ---------------------------------------------------------------------\n\n    this._folderDrag = new Garnish.DragDrop({\n      activeDropTargetClass: 'sel',\n      helperOpacity: 0.75,\n\n      helper: ($draggeeHelper) => {\n        var $helperSidebar = $('<div class=\"sidebar drag-helper\"/>'),\n          $helperNav = $('<nav/>').appendTo($helperSidebar),\n          $helperUl = $('<ul/>').appendTo($helperNav);\n\n        $draggeeHelper.appendTo($helperUl).removeClass('expanded');\n        $draggeeHelper.children('a').addClass('sel');\n\n        // Match the style\n        $draggeeHelper.css({\n          'padding-top': this._folderDrag.$draggee.css('padding-top'),\n          'padding-right': this._folderDrag.$draggee.css('padding-right'),\n          'padding-bottom': this._folderDrag.$draggee.css('padding-bottom'),\n          'padding-left': this._folderDrag.$draggee.css('padding-left'),\n        });\n\n        return $helperSidebar;\n      },\n\n      dropTargets: () => {\n        var targets = [];\n\n        // Tag the dragged folder and it's subfolders\n        var draggedSourceIds = [];\n        this._folderDrag.$draggee.find('a[data-key]').each(function () {\n          draggedSourceIds.push($(this).data('key'));\n        });\n\n        for (var i = 0; i < this.$sources.length; i++) {\n          // Make sure it's a volume folder and not one of the dragged folders\n          var $source = this.$sources.eq(i),\n            key = $source.data('key');\n\n          if (!this._getVolumeOrFolderUidFromSourceKey(key)) {\n            continue;\n          }\n\n          if (!Craft.inArray(key, draggedSourceIds)) {\n            targets.push($source);\n          }\n        }\n\n        return targets;\n      },\n\n      onDragStart: this._onDragStart.bind(this),\n      onDropTargetChange: this._onDropTargetChange.bind(this),\n      onDragStop: this._onFolderDragStop.bind(this),\n    });\n  },\n\n  /**\n   * On file drag stop\n   */\n  _onFileDragStop: function () {\n    if (\n      this._assetDrag.$activeDropTarget &&\n      this._assetDrag.$activeDropTarget[0] !== this.$source[0]\n    ) {\n      // Keep it selected\n      var originatingSource = this.$source;\n\n      var targetFolderId = this._assetDrag.$activeDropTarget.data('folder-id'),\n        originalAssetIds = [];\n\n      // For each file, prepare array data.\n      for (var i = 0; i < this._assetDrag.$draggee.length; i++) {\n        var originalAssetId = Craft.getElementInfo(\n          this._assetDrag.$draggee[i]\n        ).id;\n\n        originalAssetIds.push(originalAssetId);\n      }\n\n      // Are any files actually getting moved?\n      if (originalAssetIds.length) {\n        this.setIndexBusy();\n\n        this._positionProgressBar();\n        this.progressBar.resetProgressBar();\n        this.progressBar.setItemCount(originalAssetIds.length);\n        this.progressBar.showProgressBar();\n\n        // For each file to move a separate request\n        var parameterArray = [];\n        for (i = 0; i < originalAssetIds.length; i++) {\n          parameterArray.push({\n            action: 'assets/move-asset',\n            params: {\n              assetId: originalAssetIds[i],\n              folderId: targetFolderId,\n            },\n          });\n        }\n\n        // Define the callback for when all file moves are complete\n        var onMoveFinish = (responseArray) => {\n          this.promptHandler.resetPrompts();\n\n          // Loop trough all the responses\n          for (var i = 0; i < responseArray.length; i++) {\n            var response = responseArray[i];\n\n            // Push prompt into prompt array\n            if (response.conflict) {\n              this.promptHandler.addPrompt({\n                assetId: response.assetId,\n                suggestedFilename: response.suggestedFilename,\n                prompt: {\n                  message: response.conflict,\n                  choices: this._fileConflictTemplate.choices,\n                },\n              });\n            }\n\n            if (response.error) {\n              alert(response.error);\n            }\n          }\n\n          this.setIndexAvailable();\n          this.progressBar.hideProgressBar();\n          var reloadIndex = false;\n\n          var performAfterMoveActions = function () {\n            // Select original source\n            this.sourceSelect.selectItem(originatingSource);\n\n            // Make sure we use the correct offset when fetching the next page\n            this._totalVisible -= this._assetDrag.$draggee.length;\n\n            // And remove the elements that have been moved away\n            for (var i = 0; i < originalAssetIds.length; i++) {\n              $('[data-id=' + originalAssetIds[i] + ']').remove();\n            }\n\n            this.view.deselectAllElements();\n            this._collapseExtraExpandedFolders(targetFolderId);\n\n            if (reloadIndex) {\n              this.updateElements();\n            }\n          };\n\n          if (this.promptHandler.getPromptCount()) {\n            // Define callback for completing all prompts\n            var promptCallback = (returnData) => {\n              var newParameterArray = [];\n\n              // Loop trough all returned data and prepare a new request array\n              for (var i = 0; i < returnData.length; i++) {\n                if (returnData[i].choice === 'cancel') {\n                  reloadIndex = true;\n                  continue;\n                }\n\n                if (returnData[i].choice === 'keepBoth') {\n                  newParameterArray.push({\n                    action: 'assets/move-asset',\n                    params: {\n                      folderId: targetFolderId,\n                      assetId: returnData[i].assetId,\n                      filename: returnData[i].suggestedFilename,\n                    },\n                  });\n                }\n\n                if (returnData[i].choice === 'replace') {\n                  newParameterArray.push({\n                    action: 'assets/move-asset',\n                    params: {\n                      folderId: targetFolderId,\n                      assetId: returnData[i].assetId,\n                      force: true,\n                    },\n                  });\n                }\n              }\n\n              // Nothing to do, carry on\n              if (newParameterArray.length === 0) {\n                performAfterMoveActions.apply(this);\n              } else {\n                // Start working\n                this.setIndexBusy();\n                this.progressBar.resetProgressBar();\n                this.progressBar.setItemCount(\n                  this.promptHandler.getPromptCount()\n                );\n                this.progressBar.showProgressBar();\n\n                // Move conflicting files again with resolutions now\n                this._performBatchRequests(newParameterArray, onMoveFinish);\n              }\n            };\n\n            this._assetDrag.fadeOutHelpers();\n            this.promptHandler.showBatchPrompts(promptCallback);\n          } else {\n            performAfterMoveActions.apply(this);\n            this._assetDrag.fadeOutHelpers();\n          }\n        };\n\n        // Initiate the file move with the built array, index of 0 and callback to use when done\n        this._performBatchRequests(parameterArray, onMoveFinish);\n\n        // Skip returning dragees\n        return;\n      }\n    } else {\n      // Add the .sel class back on the selected source\n      this.$source.addClass('sel');\n\n      this._collapseExtraExpandedFolders();\n    }\n\n    this._assetDrag.returnHelpersToDraggees();\n  },\n\n  /**\n   * On folder drag stop\n   */\n  _onFolderDragStop: function () {\n    // Only move if we have a valid target and we're not trying to move into our direct parent\n    if (\n      this._folderDrag.$activeDropTarget &&\n      this._folderDrag.$activeDropTarget\n        .siblings('ul')\n        .children('li')\n        .filter(this._folderDrag.$draggee).length === 0\n    ) {\n      var targetFolderId = this._folderDrag.$activeDropTarget.data('folder-id');\n\n      this._collapseExtraExpandedFolders(targetFolderId);\n\n      // Get the old folder IDs, and sort them so that we're moving the most-nested folders first\n      var folderIds = [];\n\n      for (var i = 0; i < this._folderDrag.$draggee.length; i++) {\n        var $a = this._folderDrag.$draggee.eq(i).children('a'),\n          folderId = $a.data('folder-id');\n\n        // Make sure it’s not already in the target folder and use this single folder Id.\n        if (folderId != targetFolderId) {\n          folderIds.push(folderId);\n          break;\n        }\n      }\n\n      if (folderIds.length) {\n        folderIds.sort();\n        folderIds.reverse();\n\n        this.setIndexBusy();\n        this._positionProgressBar();\n        this.progressBar.resetProgressBar();\n        this.progressBar.setItemCount(folderIds.length);\n        this.progressBar.showProgressBar();\n\n        var parameterArray = [];\n\n        for (i = 0; i < folderIds.length; i++) {\n          parameterArray.push({\n            action: 'assets/move-folder',\n            params: {\n              folderId: folderIds[i],\n              parentId: targetFolderId,\n            },\n          });\n        }\n\n        // Increment, so to avoid displaying folder files that are being moved\n        this.requestId++;\n\n        /*\n                 Here's the rundown:\n                 1) Send all the folders being moved\n                 2) Get results:\n                 a) For all conflicting, receive prompts and resolve them to get:\n                 b) For all valid move operations: by now server has created the needed folders\n                 in target destination. Server returns an array of file move operations\n                 c) server also returns a list of all the folder id changes\n                 d) and the data-id of node to be removed, in case of conflict\n                 e) and a list of folders to delete after the move\n                 3) From data in 2) build a large file move operation array\n                 4) Create a request loop based on this, so we can display progress bar\n                 5) when done, delete all the folders and perform other maintenance\n                 6) Champagne\n                 */\n\n        // This will hold the final list of files to move\n        var fileMoveList = [];\n\n        var newSourceKey = '';\n\n        var onMoveFinish = (responseArray) => {\n          this.promptHandler.resetPrompts();\n\n          // Loop trough all the responses\n          for (var i = 0; i < responseArray.length; i++) {\n            var data = responseArray[i];\n\n            // If successful and have data, then update\n            if (data.success) {\n              if (data.transferList) {\n                fileMoveList = data.transferList;\n              }\n\n              if (data.newFolderId) {\n                newSourceKey =\n                  this._folderDrag.$activeDropTarget.data('key') +\n                  '/folder:' +\n                  data.newFolderUid;\n              }\n            }\n\n            // Push prompt into prompt array\n            if (data.conflict) {\n              data.prompt = {\n                message: data.conflict,\n                choices: this._folderConflictTemplate.choices,\n              };\n\n              this.promptHandler.addPrompt(data);\n            }\n\n            if (data.error) {\n              alert(data.error);\n            }\n          }\n\n          if (this.promptHandler.getPromptCount()) {\n            // Define callback for completing all prompts\n            var promptCallback = (returnData) => {\n              this.promptHandler.resetPrompts();\n\n              var newParameterArray = [];\n\n              var params = {};\n              // Loop trough all returned data and prepare a new request array\n              for (var i = 0; i < returnData.length; i++) {\n                if (returnData[i].choice === 'cancel') {\n                  continue;\n                }\n\n                if (returnData[i].choice === 'replace') {\n                  params.force = true;\n                }\n\n                if (returnData[i].choice === 'merge') {\n                  params.merge = true;\n                }\n\n                params.folderId = data.folderId;\n                params.parentId = data.parentId;\n\n                newParameterArray.push({\n                  action: 'assets/move-folder',\n                  params: params,\n                });\n              }\n\n              // Start working on them lists, baby\n              if (newParameterArray.length === 0) {\n                this._performActualFolderMove(\n                  fileMoveList,\n                  folderIds,\n                  newSourceKey\n                );\n              } else {\n                // Start working\n                this.setIndexBusy();\n                this.progressBar.resetProgressBar();\n                this.progressBar.setItemCount(\n                  this.promptHandler.getPromptCount()\n                );\n                this.progressBar.showProgressBar();\n\n                this._performBatchRequests(newParameterArray, onMoveFinish);\n              }\n            };\n\n            this.promptHandler.showBatchPrompts(promptCallback);\n\n            this.setIndexAvailable();\n            this.progressBar.hideProgressBar();\n          } else {\n            this._performActualFolderMove(\n              fileMoveList,\n              folderIds,\n              newSourceKey\n            );\n          }\n        };\n\n        // Initiate the folder move with the built array, index of 0 and callback to use when done\n        this._performBatchRequests(parameterArray, onMoveFinish);\n\n        // Skip returning dragees until we get the Ajax response\n        return;\n      }\n    } else {\n      // Add the .sel class back on the selected source\n      this.$source.addClass('sel');\n\n      this._collapseExtraExpandedFolders();\n    }\n\n    this._folderDrag.returnHelpersToDraggees();\n  },\n\n  /**\n   * Really move the folder. Like really. For real.\n   */\n  _performActualFolderMove: function (\n    fileMoveList,\n    folderDeleteList,\n    newSourceKey\n  ) {\n    this.setIndexBusy();\n    this.progressBar.resetProgressBar();\n    this.progressBar.setItemCount(1);\n    this.progressBar.showProgressBar();\n\n    var moveCallback = (folderDeleteList) => {\n      // Delete the old folders\n      var counter = 0;\n      var limit = folderDeleteList.length;\n      for (var i = 0; i < folderDeleteList.length; i++) {\n        let data = {folderId: folderDeleteList[i]};\n\n        // When all folders are deleted, reload the sources.\n        Craft.sendActionRequest('POST', 'assets/delete-folder', {data}).then(\n          (response) => {\n            if (++counter === limit) {\n              this.setIndexAvailable();\n              this.progressBar.hideProgressBar();\n              this._folderDrag.returnHelpersToDraggees();\n              this.setInstanceState('selectedSource', newSourceKey);\n              this.refreshSources();\n            }\n          }\n        );\n      }\n    };\n\n    if (fileMoveList.length > 0) {\n      var parameterArray = [];\n\n      for (var i = 0; i < fileMoveList.length; i++) {\n        parameterArray.push({\n          action: 'assets/move-asset',\n          params: fileMoveList[i],\n        });\n      }\n      this._performBatchRequests(parameterArray, function () {\n        moveCallback(folderDeleteList);\n      });\n    } else {\n      moveCallback(folderDeleteList);\n    }\n  },\n\n  _selectSourceByFolderId: function (targetFolderId) {\n    var $targetSource = this._getSourceByKey(targetFolderId);\n\n    // Make sure that all the parent sources are expanded and this source is visible.\n    var $parentSources = $targetSource.parent().parents('li');\n\n    for (var i = 0; i < $parentSources.length; i++) {\n      var $parentSource = $($parentSources[i]);\n\n      if (!$parentSource.hasClass('expanded')) {\n        $parentSource.children('.toggle').trigger('click');\n      }\n    }\n\n    this.selectSource($targetSource);\n    this.updateElements();\n  },\n\n  /**\n   * Initialize the uploader.\n   *\n   * @private\n   */\n  afterInit: function () {\n    if (!this.$uploadButton) {\n      this.$uploadButton = $('<button/>', {\n        type: 'button',\n        class: 'btn submit',\n        'data-icon': 'upload',\n        style: 'position: relative; overflow: hidden;',\n        text: Craft.t('app', 'Upload files'),\n      });\n      this.addButton(this.$uploadButton);\n\n      this.$uploadInput = $(\n        '<input type=\"file\" multiple=\"multiple\" name=\"assets-upload\" />'\n      )\n        .hide()\n        .insertBefore(this.$uploadButton);\n    }\n\n    this.promptHandler = new Craft.PromptHandler();\n    this.progressBar = new Craft.ProgressBar(this.$main, true);\n\n    var options = {\n      url: Craft.getActionUrl('assets/upload'),\n      fileInput: this.$uploadInput,\n      dropZone: this.$container,\n    };\n\n    options.events = {\n      fileuploadstart: this._onUploadStart.bind(this),\n      fileuploadprogressall: this._onUploadProgress.bind(this),\n      fileuploaddone: this._onUploadSuccess.bind(this),\n      fileuploadalways: this._onUploadAlways.bind(this),\n      fileuploadfail: this._onUploadFailure.bind(this),\n    };\n\n    if (\n      this.settings.criteria &&\n      typeof this.settings.criteria.kind !== 'undefined'\n    ) {\n      options.allowedKinds = this.settings.criteria.kind;\n    }\n\n    this._currentUploaderSettings = options;\n\n    this.uploader = new Craft.Uploader(this.$uploadButton, options);\n\n    this.$uploadButton.on('click', () => {\n      if (this.$uploadButton.hasClass('disabled')) {\n        return;\n      }\n      if (!this.isIndexBusy) {\n        this.$uploadButton\n          .parent()\n          .find('input[name=assets-upload]')\n          .trigger('click');\n      }\n    });\n\n    this.base();\n  },\n\n  getDefaultSourceKey: function () {\n    // Did they request a specific volume in the URL?\n    if (\n      this.settings.context === 'index' &&\n      typeof window.defaultSource !== 'undefined'\n    ) {\n      let defaultSourceParts = window.defaultSource.split('/');\n      let volumeSource = this.$sources.toArray().find((s) => {\n        return $(s).data('volume-handle') === defaultSourceParts[0];\n      });\n      if (volumeSource) {\n        let $source = $(volumeSource);\n\n        for (let i = 1; i < defaultSourceParts.length; i++) {\n          // does $source have a subfolder with this path name?\n          let subfolderSource = this._getChildSources($source)\n            .toArray()\n            .find((s) => {\n              return $('> .label', s).text() === defaultSourceParts[i];\n            });\n          if (!subfolderSource) {\n            break;\n          }\n          this._expandSource($source);\n          $source = $(subfolderSource);\n        }\n\n        return $source.data('key');\n      }\n    }\n\n    return this.base();\n  },\n\n  onSelectSource: function () {\n    var $source = this._getSourceByKey(this.sourceKey);\n    var folderId = $source.data('folder-id');\n\n    if (folderId && Garnish.hasAttr(this.$source, 'data-can-upload')) {\n      this.uploader.setParams({\n        folderId: this.$source.attr('data-folder-id'),\n      });\n      this.$uploadButton.removeClass('disabled');\n    } else {\n      this.$uploadButton.addClass('disabled');\n    }\n\n    // Update the URL if we're on the Assets index\n    if ($source.length && this.settings.context === 'index') {\n      this._updateUrl($source);\n    }\n\n    this.base();\n  },\n\n  _updateUrl: function ($source) {\n    // Find all the subfolder sources. At the end, $thisSource will be the root volume source\n    let nestedSources = [];\n    let $thisSource = $source;\n    let $parent;\n    while (($parent = this.getParentSource($thisSource)) && $parent.length) {\n      nestedSources.unshift($thisSource);\n      $thisSource = $parent;\n    }\n\n    let uri = 'assets';\n    if ($thisSource.data('volume-handle')) {\n      uri += '/' + $thisSource.data('volume-handle');\n      nestedSources.forEach(($s) => {\n        uri += '/' + $s.children('.label').text();\n      });\n    }\n\n    Craft.setPath(uri);\n  },\n\n  _getVolumeOrFolderUidFromSourceKey: function (sourceKey) {\n    var m = sourceKey.match(/\\b(?:folder|volume):([0-9a-f\\-]+)$/);\n\n    return m ? m[1] : null;\n  },\n\n  startSearching: function () {\n    // Does this source have subfolders?\n    if (!this.settings.hideSidebar && this.$source.siblings('ul').length) {\n      if (this.$includeSubfoldersContainer === null) {\n        var id = 'includeSubfolders-' + Math.floor(Math.random() * 1000000000);\n\n        this.$includeSubfoldersContainer = $(\n          '<div style=\"margin-bottom: -25px; opacity: 0;\"/>'\n        ).insertAfter(this.$search);\n        var $subContainer = $('<div style=\"padding-top: 5px;\"/>').appendTo(\n          this.$includeSubfoldersContainer\n        );\n        this.$includeSubfoldersCheckbox = $(\n          '<input type=\"checkbox\" id=\"' + id + '\" class=\"checkbox\"/>'\n        ).appendTo($subContainer);\n        $('<label class=\"light smalltext\" for=\"' + id + '\"/>')\n          .text(' ' + Craft.t('app', 'Search in subfolders'))\n          .appendTo($subContainer);\n\n        this.addListener(\n          this.$includeSubfoldersCheckbox,\n          'change',\n          function () {\n            this.setSelecetedSourceState(\n              'includeSubfolders',\n              this.$includeSubfoldersCheckbox.prop('checked')\n            );\n            this.updateElements();\n          }\n        );\n      } else {\n        this.$includeSubfoldersContainer.velocity('stop').removeClass('hidden');\n      }\n\n      var checked = this.getSelectedSourceState('includeSubfolders', false);\n      this.$includeSubfoldersCheckbox.prop('checked', checked);\n\n      this.$includeSubfoldersContainer.velocity(\n        {\n          marginBottom: 0,\n          opacity: 1,\n        },\n        'fast'\n      );\n\n      this.showingIncludeSubfoldersCheckbox = true;\n    }\n\n    this.base();\n  },\n\n  stopSearching: function () {\n    if (this.showingIncludeSubfoldersCheckbox) {\n      this.$includeSubfoldersContainer.velocity('stop');\n\n      this.$includeSubfoldersContainer.velocity(\n        {\n          marginBottom: -25,\n          opacity: 0,\n        },\n        {\n          duration: 'fast',\n          complete: () => {\n            this.$includeSubfoldersContainer.addClass('hidden');\n          },\n        }\n      );\n\n      this.showingIncludeSubfoldersCheckbox = false;\n    }\n\n    this.base();\n  },\n\n  getViewParams: function () {\n    var data = this.base();\n\n    if (\n      this.showingIncludeSubfoldersCheckbox &&\n      this.$includeSubfoldersCheckbox.prop('checked')\n    ) {\n      data.criteria.includeSubfolders = true;\n    }\n\n    return data;\n  },\n\n  /**\n   * React on upload submit.\n   *\n   * @private\n   */\n  _onUploadStart: function () {\n    this.setIndexBusy();\n\n    // Initial values\n    this._positionProgressBar();\n    this.progressBar.resetProgressBar();\n    this.progressBar.showProgressBar();\n\n    this.promptHandler.resetPrompts();\n  },\n\n  /**\n   * Update uploaded byte count.\n   */\n  _onUploadProgress: function (event, data) {\n    var progress = parseInt((data.loaded / data.total) * 100, 10);\n    this.progressBar.setProgressPercentage(progress);\n  },\n\n  /**\n   * On upload success.\n   *\n   * @param {Object} event\n   * @param {Object} data\n   * @private\n   */\n  _onUploadSuccess: function (event, data) {\n    const {result} = data;\n\n    // Add the uploaded file to the selected ones, if appropriate\n    this.selectElementAfterUpdate(result.assetId);\n\n    // If there is a prompt, add it to the queue\n    if (result.conflict) {\n      result.prompt = {\n        message: Craft.t('app', result.conflict, {file: result.filename}),\n        choices: this._fileConflictTemplate.choices,\n      };\n\n      this.promptHandler.addPrompt(result);\n    }\n\n    Craft.cp.runQueue();\n  },\n\n  /**\n   * On upload complete no matter what (success, fail, or abort).\n   */\n  _onUploadAlways: function () {\n    if (this.uploader.isLastUpload()) {\n      this.progressBar.hideProgressBar();\n      this.setIndexAvailable();\n\n      if (this.promptHandler.getPromptCount()) {\n        this.promptHandler.showBatchPrompts(this._uploadFollowup.bind(this));\n      } else {\n        this._updateAfterUpload();\n      }\n    }\n  },\n\n  /**\n   * On Upload Failure.\n   */\n  _onUploadFailure: function (event, data) {\n    const response = data.response();\n    let {message, filename} = response?.jqXHR?.responseJSON || {};\n\n    if (!message) {\n      message = filename\n        ? Craft.t('app', 'Upload failed for “{filename}”.', {filename})\n        : Craft.t('app', 'Upload failed.');\n    }\n\n    alert(message);\n  },\n\n  /**\n   * Update the elements after an upload, setting sort to dateModified descending, if not using index.\n   *\n   * @private\n   */\n  _updateAfterUpload: function () {\n    if (this.settings.context !== 'index') {\n      this.clearSearch();\n      this.setSelectedSortAttribute('dateCreated', 'desc');\n    }\n    this.updateElements();\n  },\n\n  /**\n   * Follow up to an upload that triggered at least one conflict resolution prompt.\n   *\n   * @param {Object} returnData\n   * @private\n   */\n  _uploadFollowup: function (returnData) {\n    this.setIndexBusy();\n    this.progressBar.resetProgressBar();\n\n    this.promptHandler.resetPrompts();\n\n    var finalCallback = () => {\n      this.progressBar.hideProgressBar();\n      this.setIndexAvailable();\n      this._updateAfterUpload();\n    };\n\n    this.progressBar.setItemCount(returnData.length);\n\n    var doFollowup = (parameterArray, parameterIndex, callback) => {\n      var data = {};\n      var action = null;\n\n      const followupAlways = () => {\n        parameterIndex++;\n        this.progressBar.incrementProcessedItemCount(1);\n        this.progressBar.updateProgressBar();\n\n        if (parameterIndex === parameterArray.length) {\n          callback();\n        } else {\n          doFollowup(parameterArray, parameterIndex, callback);\n        }\n      };\n      const followupSuccess = (data) => {\n        if (data.assetId) {\n          this.selectElementAfterUpdate(data.assetId);\n        }\n\n        followupAlways();\n      };\n      const followupFailure = (data) => {\n        alert(data.message);\n        followupAlways();\n      };\n\n      if (parameterArray[parameterIndex].choice === 'replace') {\n        action = 'assets/replace-file';\n        data.sourceAssetId = parameterArray[parameterIndex].assetId;\n\n        if (parameterArray[parameterIndex].conflictingAssetId) {\n          data.assetId = parameterArray[parameterIndex].conflictingAssetId;\n        } else {\n          data.targetFilename = parameterArray[parameterIndex].filename;\n        }\n      } else if (parameterArray[parameterIndex].choice === 'cancel') {\n        action = 'assets/delete-asset';\n        data.assetId = parameterArray[parameterIndex].assetId;\n      }\n\n      if (!action) {\n        // We don't really need to do another request, so let's pretend that already happened\n        followupSuccess({\n          assetId: parameterArray[parameterIndex].assetId,\n        });\n      } else {\n        Craft.sendActionRequest('POST', action, {data})\n          .then((response) => followupSuccess(response.data))\n          .catch(({response}) => followupFailure(response.data));\n      }\n    };\n\n    this.progressBar.showProgressBar();\n    doFollowup(returnData, 0, finalCallback);\n  },\n\n  /**\n   * Perform actions after updating elements\n   * @private\n   */\n  onUpdateElements: function () {\n    this._onUpdateElements(false, this.view.getAllElements());\n    this.view.on('appendElements', (ev) => {\n      this._onUpdateElements(true, ev.newElements);\n    });\n\n    this.base();\n  },\n\n  /**\n   * Do the after-update initializations\n   * @private\n   */\n  _onUpdateElements: function (append, $newElements) {\n    if (this.settings.context === 'index') {\n      if (!append) {\n        this._assetDrag.removeAllItems();\n      }\n\n      this._assetDrag.addItems($newElements.has('div.element[data-movable]'));\n    }\n\n    this.base(append, $newElements);\n\n    this.removeListener(this.$elements, 'keydown');\n    this.addListener(this.$elements, 'keydown', this._onKeyDown.bind(this));\n    this.view.elementSelect.on('focusItem', this._onElementFocus.bind(this));\n  },\n\n  /**\n   * Handle a keypress\n   * @private\n   */\n  _onKeyDown: function (ev) {\n    if (ev.keyCode === Garnish.SPACE_KEY && ev.shiftKey) {\n      if (Craft.PreviewFileModal.openInstance) {\n        Craft.PreviewFileModal.openInstance.selfDestruct();\n      } else {\n        var $element = this.view.elementSelect.$focusedItem.find('.element');\n\n        if ($element.length) {\n          this._loadPreview($element);\n        }\n      }\n\n      ev.stopPropagation();\n      return false;\n    }\n  },\n\n  /**\n   * Handle element being focused\n   * @private\n   */\n  _onElementFocus: function (ev) {\n    var $element = $(ev.item).find('.element');\n\n    if (Craft.PreviewFileModal.openInstance && $element.length) {\n      this._loadPreview($element);\n    }\n  },\n\n  /**\n   * Load the preview for an Asset element\n   * @private\n   */\n  _loadPreview: function ($element) {\n    var settings = {};\n\n    if ($element.data('image-width')) {\n      settings.startingWidth = $element.data('image-width');\n      settings.startingHeight = $element.data('image-height');\n    }\n\n    new Craft.PreviewFileModal(\n      $element.data('id'),\n      this.view.elementSelect,\n      settings\n    );\n  },\n\n  /**\n   * On Drag Start\n   */\n  _onDragStart: function () {\n    this._tempExpandedFolders = [];\n  },\n\n  /**\n   * Get File Drag Helper\n   */\n  _getFileDragHelper: function ($element) {\n    var currentView = this.getSelectedSourceState('mode');\n    var $outerContainer;\n    var $innerContainer;\n\n    switch (currentView) {\n      case 'table': {\n        $outerContainer = $(\n          '<div class=\"elements datatablesorthelper\"/>'\n        ).appendTo(Garnish.$bod);\n        $innerContainer = $('<div class=\"tableview\"/>').appendTo(\n          $outerContainer\n        );\n        var $table = $('<table class=\"data\"/>').appendTo($innerContainer);\n        var $tbody = $('<tbody/>').appendTo($table);\n\n        $element.appendTo($tbody);\n\n        // Copy the column widths\n        this._$firstRowCells = this.view.$table\n          .children('tbody')\n          .children('tr:first')\n          .children();\n        var $helperCells = $element.children();\n\n        for (var i = 0; i < $helperCells.length; i++) {\n          // Hard-set the cell widths\n          var $helperCell = $($helperCells[i]);\n\n          // Skip the checkbox cell\n          if ($helperCell.hasClass('checkbox-cell')) {\n            $helperCell.remove();\n            $outerContainer.css('margin-' + Craft.left, 19); // 26 - 7\n            continue;\n          }\n\n          var $firstRowCell = $(this._$firstRowCells[i]),\n            width = $firstRowCell.width();\n\n          $firstRowCell.width(width);\n          $helperCell.width(width);\n        }\n\n        return $outerContainer;\n      }\n      case 'thumbs': {\n        $outerContainer = $('<div class=\"elements thumbviewhelper\"/>').appendTo(\n          Garnish.$bod\n        );\n        $innerContainer = $('<ul class=\"thumbsview\"/>').appendTo(\n          $outerContainer\n        );\n\n        $element.appendTo($innerContainer);\n\n        return $outerContainer;\n      }\n    }\n\n    return $();\n  },\n\n  /**\n   * On Drop Target Change\n   */\n  _onDropTargetChange: function ($dropTarget) {\n    clearTimeout(this._expandDropTargetFolderTimeout);\n\n    if ($dropTarget) {\n      var folderId = $dropTarget.data('folder-id');\n\n      if (folderId) {\n        this.dropTargetFolder = this._getSourceByKey(folderId);\n\n        if (\n          this._hasSubfolders(this.dropTargetFolder) &&\n          !this._isExpanded(this.dropTargetFolder)\n        ) {\n          this._expandDropTargetFolderTimeout = setTimeout(\n            this._expandFolder.bind(this),\n            500\n          );\n        }\n      } else {\n        this.dropTargetFolder = null;\n      }\n    }\n\n    if ($dropTarget && $dropTarget[0] !== this.$source[0]) {\n      // Temporarily remove the .sel class on the active source\n      this.$source.removeClass('sel');\n    } else {\n      this.$source.addClass('sel');\n    }\n  },\n\n  /**\n   * Collapse Extra Expanded Folders\n   */\n  _collapseExtraExpandedFolders: function (dropTargetFolderId) {\n    clearTimeout(this._expandDropTargetFolderTimeout);\n\n    // If a source ID is passed in, exclude its parents\n    var $excludedSources;\n\n    if (dropTargetFolderId) {\n      $excludedSources = this._getSourceByKey(dropTargetFolderId)\n        .parents('li')\n        .children('a');\n    }\n\n    for (var i = this._tempExpandedFolders.length - 1; i >= 0; i--) {\n      var $source = this._tempExpandedFolders[i];\n\n      // Check the parent list, if a source id is passed in\n      if (\n        typeof $excludedSources === 'undefined' ||\n        $excludedSources.filter('[data-key=\"' + $source.data('key') + '\"]')\n          .length === 0\n      ) {\n        this._collapseFolder($source);\n        this._tempExpandedFolders.splice(i, 1);\n      }\n    }\n  },\n\n  _getSourceByKey: function (key) {\n    return this.$sources.filter('[data-key$=\"' + key + '\"]');\n  },\n\n  _hasSubfolders: function ($source) {\n    return $source.siblings('ul').find('li').length;\n  },\n\n  _isExpanded: function ($source) {\n    return $source.parent('li').hasClass('expanded');\n  },\n\n  _expandFolder: function () {\n    // Collapse any temp-expanded drop targets that aren't parents of this one\n    this._collapseExtraExpandedFolders(this.dropTargetFolder.data('folder-id'));\n\n    this.dropTargetFolder.siblings('.toggle').trigger('click');\n\n    // Keep a record of that\n    this._tempExpandedFolders.push(this.dropTargetFolder);\n  },\n\n  _collapseFolder: function ($source) {\n    if ($source.parent().hasClass('expanded')) {\n      $source.siblings('.toggle').trigger('click');\n    }\n  },\n\n  getSourceActions: function () {\n    const actions = this.base();\n\n    // Make sure it's a volume folder\n    if (this._getVolumeOrFolderUidFromSourceKey(this.sourceKey)) {\n      actions.push({\n        label: Craft.t('app', 'New subfolder'),\n        onSelect: () => {\n          this._createSubfolder(this.$source);\n        },\n      });\n\n      // For all folders that are not top folders\n      if (this.getSourceLevel(this.$source) > 1) {\n        actions.push({\n          label: Craft.t('app', 'Rename folder'),\n          onSelect: () => {\n            this._renameFolder(this.$source);\n          },\n        });\n        actions.push({\n          label: Craft.t('app', 'Delete folder'),\n          destructive: true,\n          onSelect: () => {\n            this._deleteFolder(this.$source);\n          },\n        });\n      }\n    }\n\n    return actions;\n  },\n\n  _createFolderContextMenu: function ($source) {\n    // Make sure it's a volume folder\n    if (!this._getVolumeOrFolderUidFromSourceKey($source.data('key'))) {\n      return;\n    }\n\n    var menuOptions = [\n      {\n        label: Craft.t('app', 'New subfolder'),\n        onClick: () => {\n          this._createSubfolder($source);\n        },\n      },\n    ];\n\n    // For all folders that are not top folders\n    if (this.settings.context === 'index' && this.getSourceLevel($source) > 1) {\n      menuOptions.push({\n        label: Craft.t('app', 'Rename folder'),\n        onClick: () => {\n          this._renameFolder($source);\n        },\n      });\n      menuOptions.push({\n        label: Craft.t('app', 'Delete folder'),\n        onClick: () => {\n          this._deleteFolder($source);\n        },\n      });\n    }\n\n    new Garnish.ContextMenu($source, menuOptions, {menuClass: 'menu'});\n  },\n\n  _createSubfolder: function ($parentFolder) {\n    var subfolderName = prompt(Craft.t('app', 'Enter the name of the folder'));\n\n    if (subfolderName) {\n      var data = {\n        parentId: $parentFolder.data('folder-id'),\n        folderName: subfolderName,\n      };\n\n      this.setIndexBusy();\n\n      Craft.sendActionRequest('POST', 'assets/create-folder', {data})\n        .then((response) => {\n          const data = response.data;\n          this.setIndexAvailable();\n          this._prepareParentForChildren($parentFolder);\n          var $subfolder = $(\n            '<li>' +\n              `<a data-key=\"${$parentFolder.data('key')}/folder:${\n                data.folderUid\n              }\" data-default-sort=\"${$parentFolder.data('default-sort')}\"` +\n              (Garnish.hasAttr($parentFolder, 'data-has-thumbs')\n                ? ' data-has-thumbs'\n                : '') +\n              ` data-folder-id=\"${data.folderId}\"` +\n              (Garnish.hasAttr($parentFolder, 'data-can-upload')\n                ? ' data-can-upload'\n                : '') +\n              (Garnish.hasAttr($parentFolder, 'data-can-move-to')\n                ? ' data-can-move-to'\n                : '') +\n              (Garnish.hasAttr($parentFolder, 'data-can-move-peer-files-to')\n                ? ' data-can-move-peer-files-to'\n                : '') +\n              '>' +\n              `<span class=\"label\">${data.folderName}</span>` +\n              '</a>' +\n              '</li>'\n          );\n\n          var $a = $subfolder.children('a:first');\n          this._appendSubfolder($parentFolder, $subfolder);\n          this.initSource($a);\n\n          Craft.cp.displayNotice(Craft.t('app', 'Folder created.'));\n        })\n        .catch(({response}) => {\n          this.setIndexAvailable();\n          alert(response.data.message);\n        });\n    }\n  },\n\n  _deleteFolder: function ($targetFolder) {\n    if (\n      confirm(\n        Craft.t('app', 'Really delete folder “{folder}”?', {\n          folder: $.trim($targetFolder.text()),\n        })\n      )\n    ) {\n      var data = {\n        folderId: $targetFolder.data('folder-id'),\n      };\n\n      this.setIndexBusy();\n\n      Craft.sendActionRequest('POST', 'assets/delete-folder', {data})\n        .then((response) => {\n          this.setIndexAvailable();\n          var $parentFolder = this.getParentSource($targetFolder);\n\n          // Remove folder and any trace from its parent, if needed\n          this.deinitSource($targetFolder);\n\n          $targetFolder.parent().remove();\n          this._cleanUpTree($parentFolder);\n\n          Craft.cp.displayNotice(Craft.t('app', 'Folder deleted.'));\n        })\n        .catch(({response}) => {\n          this.setIndexAvailable();\n          alert(response.data.message);\n        });\n    }\n  },\n\n  /**\n   * Rename\n   */\n  _renameFolder: function ($source) {\n    const $label = $source.children('.label');\n    const oldName = Craft.trim($label.text());\n    const newName = prompt(Craft.t('app', 'Rename folder'), oldName);\n\n    if (!newName || newName === oldName) {\n      return;\n    }\n\n    this.setIndexBusy();\n\n    Craft.sendActionRequest('POST', 'assets/rename-folder', {\n      data: {\n        folderId: $source.data('folder-id'),\n        newName: newName,\n      },\n    })\n      .then((response) => {\n        $label.text(response.data.newName);\n\n        // Is this the selected source?\n        if ($source.data('key') === this.$source.data('key')) {\n          this.updateElements();\n\n          Craft.cp.displayNotice(Craft.t('app', 'Folder renamed.'));\n\n          // Update the URL if we're on the Assets index\n          if (this.settings.context === 'index') {\n            this._updateUrl($source);\n          }\n        }\n      })\n      .catch(({response}) => {\n        this.setIndexAvailable();\n        alert(response.data.message);\n      });\n  },\n\n  /**\n   * Prepare a source folder for children folder.\n   *\n   * @param {jQuery} $parentFolder\n   * @private\n   */\n  _prepareParentForChildren: function ($parentFolder) {\n    if (!this._hasSubfolders($parentFolder)) {\n      $parentFolder\n        .parent()\n        .addClass('expanded')\n        .append('<div class=\"toggle\"></div><ul class=\"nested\"></ul>');\n      this.initSourceToggle($parentFolder);\n    }\n  },\n\n  /**\n   * Appends a subfolder to the parent folder at the correct spot.\n   *\n   * @param {jQuery} $parentFolder\n   * @param {jQuery} $subfolder\n   * @private\n   */\n  _appendSubfolder: function ($parentFolder, $subfolder) {\n    var $subfolderList = $parentFolder.siblings('ul'),\n      $existingChildren = $subfolderList.children('li'),\n      subfolderLabel = $.trim($subfolder.children('a:first').text()),\n      folderInserted = false;\n\n    for (var i = 0; i < $existingChildren.length; i++) {\n      var $existingChild = $($existingChildren[i]);\n\n      if ($.trim($existingChild.children('a:first').text()) > subfolderLabel) {\n        $existingChild.before($subfolder);\n        folderInserted = true;\n        break;\n      }\n    }\n\n    if (!folderInserted) {\n      $parentFolder.siblings('ul').append($subfolder);\n    }\n  },\n\n  _cleanUpTree: function ($parentFolder) {\n    if (\n      $parentFolder !== null &&\n      $parentFolder.siblings('ul').children('li').length === 0\n    ) {\n      this.deinitSourceToggle($parentFolder);\n      $parentFolder.siblings('ul').remove();\n      $parentFolder.siblings('.toggle').remove();\n      $parentFolder.parent().removeClass('expanded');\n    }\n  },\n\n  _positionProgressBar: function () {\n    if (!this.progressBar) {\n      this.progressBar = new Craft.ProgressBar(this.$main, true);\n    }\n\n    var $container = $(),\n      scrollTop = 0,\n      offset = 0;\n\n    if (this.settings.context === 'index') {\n      $container = this.progressBar.$progressBar.closest('#content');\n      scrollTop = Garnish.$win.scrollTop();\n    } else {\n      $container = this.progressBar.$progressBar.closest('.main');\n      scrollTop = this.$main.scrollTop();\n    }\n\n    var containerTop = $container.offset().top;\n    var diff = scrollTop - containerTop;\n    var windowHeight = Garnish.$win.height();\n\n    if ($container.height() > windowHeight) {\n      offset = windowHeight / 2 - 6 + diff;\n    } else {\n      offset = $container.height() / 2 - 6;\n    }\n\n    if (this.settings.context !== 'index') {\n      offset = scrollTop + ($container.height() / 2 - 6);\n    }\n\n    this.progressBar.$progressBar.css({\n      top: offset,\n    });\n  },\n\n  _performBatchRequests: function (parameterArray, finalCallback) {\n    const responseArray = [];\n    let activeRequests = parameterArray.length;\n\n    while (parameterArray.length) {\n      const parameters = parameterArray.shift();\n      Craft.sendActionRequest('POST', parameters.action, {\n        data: parameters.params,\n      })\n        .then((response) => {\n          responseArray.push(response.data);\n        })\n        .finally(() => {\n          this.progressBar.incrementProcessedItemCount(1);\n          this.progressBar.updateProgressBar();\n\n          // Was that the last one?\n          if (--activeRequests === 0) {\n            // If assets were just merged we should get the reference tags updated right away\n            Craft.cp.runQueue();\n            finalCallback(responseArray);\n          }\n        });\n    }\n  },\n});\n\n// Register it!\nCraft.registerElementIndexClass('craft\\\\elements\\\\Asset', Craft.AssetIndex);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Asset Select input\n */\nCraft.AssetSelectInput = Craft.BaseElementSelectInput.extend({\n  requestId: 0,\n  hud: null,\n  $uploadBtn: null,\n  uploader: null,\n  progressBar: null,\n  openPreviewTimeout: null,\n\n  init: function () {\n    this.base.apply(this, arguments);\n\n    if (this.settings.canUpload) {\n      this._attachUploader();\n    }\n\n    this.updateAddElementsBtn();\n\n    this.addListener(\n      this.$elementsContainer,\n      'keydown',\n      this._onKeyDown.bind(this)\n    );\n    this.elementSelect.on('focusItem', this._onElementFocus.bind(this));\n  },\n\n  /**\n   * Handle a keypress\n   * @private\n   */\n  _onKeyDown: function (ev) {\n    if (ev.keyCode === Garnish.SPACE_KEY && ev.shiftKey) {\n      this.openPreview();\n      ev.stopPropagation();\n      return false;\n    }\n  },\n\n  onAddElements: function () {\n    this.$elements\n      .find('.elementthumb')\n      .addClass('open-preview')\n      .on('click', (ev) => {\n        this.clearOpenPreviewTimeout();\n        this.openPreviewTimeout = setTimeout(() => {\n          this.openPreview();\n          this.openPreviewTimeout = null;\n        }, 500);\n      })\n      .on('dblclick', (ev) => {\n        this.clearOpenPreviewTimeout();\n      });\n    this.base();\n  },\n\n  clearOpenPreviewTimeout: function () {\n    if (this.openPreviewTimeout) {\n      clearTimeout(this.openPreviewTimeout);\n      this.openPreviewTimeout = null;\n    }\n  },\n\n  openPreview: function () {\n    if (Craft.PreviewFileModal.openInstance) {\n      Craft.PreviewFileModal.openInstance.selfDestruct();\n    } else {\n      var $element = this.elementSelect.$focusedItem;\n\n      if ($element.length) {\n        this._loadPreview($element);\n      }\n    }\n  },\n\n  /**\n   * Handle element being focused\n   * @private\n   */\n  _onElementFocus: function (ev) {\n    var $element = $(ev.item);\n\n    if (Craft.PreviewFileModal.openInstance && $element.length) {\n      this._loadPreview($element);\n    }\n  },\n\n  /**\n   * Load the preview for an Asset element\n   * @private\n   */\n  _loadPreview: function ($element) {\n    var settings = {\n      minGutter: 50,\n    };\n\n    if ($element.data('image-width')) {\n      settings.startingWidth = $element.data('image-width');\n      settings.startingHeight = $element.data('image-height');\n    }\n\n    new Craft.PreviewFileModal(\n      $element.data('id'),\n      this.elementSelect,\n      settings\n    );\n  },\n\n  /**\n   * Attach the uploader with drag event handler\n   */\n  _attachUploader: function () {\n    this.progressBar = new Craft.ProgressBar(\n      $('<div class=\"progress-shade\"></div>').appendTo(this.$container)\n    );\n\n    var options = {\n      url: Craft.getActionUrl('assets/upload'),\n      dropZone: this.$container,\n      formData: {\n        fieldId: this.settings.fieldId,\n      },\n    };\n\n    if (this.settings.sourceElementId) {\n      options.formData.elementId = this.settings.sourceElementId;\n    }\n\n    if (this.settings.criteria.siteId) {\n      options.formData.siteId = this.settings.criteria.siteId;\n    }\n\n    if (this.$addElementBtn) {\n      this.$uploadBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn dashed',\n        'data-icon': 'upload',\n        'aria-label':\n          this.settings.limit == 1\n            ? Craft.t('app', 'Upload a file')\n            : Craft.t('app', 'Upload files'),\n        'aria-describedby': this.settings.describedBy,\n        text:\n          this.settings.limit == 1\n            ? Craft.t('app', 'Upload a file')\n            : Craft.t('app', 'Upload files'),\n      }).insertAfter(this.$addElementBtn);\n      options.fileInput = $('<input/>', {\n        type: 'file',\n        class: 'hidden',\n        multiple: this.settings.limit != 1,\n      }).insertAfter(this.$uploadBtn);\n\n      // Trigger a window resize in case the field is inside an element editor HUD\n      Garnish.$win.trigger('resize');\n    }\n\n    // If CSRF protection isn't enabled, these won't be defined.\n    if (\n      typeof Craft.csrfTokenName !== 'undefined' &&\n      typeof Craft.csrfTokenValue !== 'undefined'\n    ) {\n      // Add the CSRF token\n      options.formData[Craft.csrfTokenName] = Craft.csrfTokenValue;\n    }\n\n    if (typeof this.settings.criteria.kind !== 'undefined') {\n      options.allowedKinds = this.settings.criteria.kind;\n    }\n\n    options.canAddMoreFiles = this.canAddMoreFiles.bind(this);\n\n    options.events = {};\n    options.events.fileuploadstart = this._onUploadStart.bind(this);\n    options.events.fileuploadprogressall = this._onUploadProgress.bind(this);\n    options.events.fileuploaddone = this._onUploadComplete.bind(this);\n    options.events.fileuploadfail = this._onUploadFailure.bind(this);\n\n    this.uploader = new Craft.Uploader(this.$container, options);\n\n    if (this.$uploadBtn) {\n      this.$uploadBtn.on('click', (ev) => {\n        // We can't store a reference to the file input, because it gets replaced with a new input\n        // each time a new file is uploaded - see https://stackoverflow.com/a/25034721/1688568\n        this.$uploadBtn.next('input[type=file]').trigger('click');\n      });\n    }\n  },\n\n  enableAddElementsBtn: function () {\n    if (this.$uploadBtn) {\n      this.$uploadBtn.removeClass('hidden');\n    }\n\n    this.base();\n  },\n\n  disableAddElementsBtn: function () {\n    if (this.$uploadBtn) {\n      this.$uploadBtn.addClass('hidden');\n    }\n\n    this.base();\n  },\n\n  /**\n   * Add the freshly uploaded file to the input field.\n   */\n  selectUploadedFile: function (element) {\n    // Check if we're able to add new elements\n    if (!this.canAddMoreElements()) {\n      return;\n    }\n\n    var $newElement = element.$element;\n\n    // Make a couple tweaks\n    $newElement.addClass('removable');\n    $newElement.prepend(\n      '<input type=\"hidden\" name=\"' +\n        this.settings.name +\n        '[]\" value=\"' +\n        element.id +\n        '\">' +\n        '<a class=\"delete icon\" title=\"' +\n        Craft.t('app', 'Remove') +\n        '\"></a>'\n    );\n\n    $newElement.appendTo(this.$elementsContainer);\n\n    var margin = -($newElement.outerWidth() + 10);\n\n    this.$addElementBtn.css('margin-' + Craft.left, margin + 'px');\n\n    var animateCss = {};\n    animateCss['margin-' + Craft.left] = 0;\n    this.$addElementBtn.velocity(animateCss, 'fast');\n\n    this.addElements($newElement);\n\n    delete this.modal;\n  },\n\n  /**\n   * On upload start.\n   */\n  _onUploadStart: function () {\n    this.progressBar.$progressBar.css({\n      top: Math.round(this.$container.outerHeight() / 2) - 6,\n    });\n\n    this.$container.addClass('uploading');\n    this.progressBar.resetProgressBar();\n    this.progressBar.showProgressBar();\n  },\n\n  /**\n   * On upload progress.\n   */\n  _onUploadProgress: function (event, data) {\n    var progress = parseInt((data.loaded / data.total) * 100, 10);\n    this.progressBar.setProgressPercentage(progress);\n  },\n\n  /**\n   * On a file being uploaded.\n   */\n  _onUploadComplete: function (event, data) {\n    if (data.result.error) {\n      alert(data.result.error);\n      this.progressBar.hideProgressBar();\n      this.$container.removeClass('uploading');\n    } else {\n      var parameters = {\n        elementId: data.result.assetId,\n        siteId: this.settings.criteria.siteId,\n        thumbSize: this.settings.viewMode,\n      };\n\n      Craft.sendActionRequest('POST', 'elements/get-element-html', {\n        data: parameters,\n      })\n        .then((response) => {\n          var html = $(response.data.html);\n          Craft.appendHeadHtml(response.data.headHtml);\n          this.selectUploadedFile(Craft.getElementInfo(html));\n\n          // Last file\n          if (this.uploader.isLastUpload()) {\n            this.progressBar.hideProgressBar();\n            this.$container.removeClass('uploading');\n            this.$container.trigger('change');\n          }\n        })\n        .catch(({response}) => {\n          alert(response.data.message);\n        });\n\n      Craft.cp.runQueue();\n    }\n  },\n\n  /**\n   * On Upload Failure.\n   */\n  _onUploadFailure: function (event, data) {\n    const response = data.response();\n    let {message, filename} = response?.jqXHR?.responseJSON || {};\n\n    if (!message) {\n      message = filename\n        ? Craft.t('app', 'Upload failed for “{filename}”.', {filename})\n        : Craft.t('app', 'Upload failed.');\n    }\n\n    alert(message);\n    this.progressBar.hideProgressBar();\n    this.$container.removeClass('uploading');\n  },\n\n  /**\n   * We have to take into account files about to be added as well\n   */\n  canAddMoreFiles: function (slotsTaken) {\n    return (\n      !this.settings.limit ||\n      this.$elements.length + slotsTaken < this.settings.limit\n    );\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Asset selector modal class\n */\nCraft.AssetSelectorModal = Craft.BaseElementSelectorModal.extend(\n  {\n    $selectTransformBtn: null,\n    _selectedTransform: null,\n\n    init: function (elementType, settings) {\n      settings = $.extend({}, Craft.AssetSelectorModal.defaults, settings);\n\n      this.base(elementType, settings);\n\n      if (settings.transforms.length) {\n        this.createSelectTransformButton(settings.transforms);\n      }\n    },\n\n    createSelectTransformButton: function (transforms) {\n      if (!transforms || !transforms.length) {\n        return;\n      }\n\n      var $btnGroup = $('<div class=\"btngroup\"/>').appendTo(\n        this.$primaryButtons\n      );\n      this.$selectBtn.appendTo($btnGroup);\n\n      this.$selectTransformBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn menubtn disabled',\n        text: Craft.t('app', 'Select transform'),\n      }).appendTo($btnGroup);\n\n      var $menu = $('<div class=\"menu\" data-align=\"right\"></div>').insertAfter(\n          this.$selectTransformBtn\n        ),\n        $menuList = $('<ul></ul>').appendTo($menu);\n\n      for (var i = 0; i < transforms.length; i++) {\n        $(\n          '<li><a data-transform=\"' +\n            transforms[i].handle +\n            '\">' +\n            transforms[i].name +\n            '</a></li>'\n        ).appendTo($menuList);\n      }\n\n      var MenuButton = new Garnish.MenuBtn(this.$selectTransformBtn, {\n        onOptionSelect: this.onSelectTransform.bind(this),\n      });\n      MenuButton.disable();\n\n      this.$selectTransformBtn.data('menuButton', MenuButton);\n    },\n\n    onSelectionChange: function (ev) {\n      var $selectedElements = this.elementIndex.getSelectedElements(),\n        allowTransforms = false;\n\n      if ($selectedElements.length && this.settings.transforms.length) {\n        allowTransforms = true;\n\n        for (var i = 0; i < $selectedElements.length; i++) {\n          if (!$('.element.hasthumb:first', $selectedElements[i]).length) {\n            break;\n          }\n        }\n      }\n\n      var MenuBtn = null;\n\n      if (this.$selectTransformBtn) {\n        MenuBtn = this.$selectTransformBtn.data('menuButton');\n      }\n\n      if (allowTransforms) {\n        if (MenuBtn) {\n          MenuBtn.enable();\n        }\n\n        this.$selectTransformBtn.removeClass('disabled');\n      } else if (this.$selectTransformBtn) {\n        if (MenuBtn) {\n          MenuBtn.disable();\n        }\n\n        this.$selectTransformBtn.addClass('disabled');\n      }\n\n      this.base();\n    },\n\n    onSelectTransform: function (option) {\n      var transform = $(option).data('transform');\n      this.selectImagesWithTransform(transform);\n    },\n\n    selectImagesWithTransform: function (transform) {\n      // First we must get any missing transform URLs\n      if (\n        typeof Craft.AssetSelectorModal.transformUrls[transform] === 'undefined'\n      ) {\n        Craft.AssetSelectorModal.transformUrls[transform] = {};\n      }\n\n      var $selectedElements = this.elementIndex.getSelectedElements(),\n        imageIdsWithMissingUrls = [];\n\n      for (var i = 0; i < $selectedElements.length; i++) {\n        var $item = $($selectedElements[i]),\n          elementId = Craft.getElementInfo($item).id;\n\n        if (\n          typeof Craft.AssetSelectorModal.transformUrls[transform][\n            elementId\n          ] === 'undefined'\n        ) {\n          imageIdsWithMissingUrls.push(elementId);\n        }\n      }\n\n      if (imageIdsWithMissingUrls.length) {\n        this.showFooterSpinner();\n\n        this.fetchMissingTransformUrls(\n          imageIdsWithMissingUrls,\n          transform,\n          () => {\n            this.hideFooterSpinner();\n            this.selectImagesWithTransform(transform);\n          }\n        );\n      } else {\n        this._selectedTransform = transform;\n        this.selectElements();\n        this._selectedTransform = null;\n      }\n    },\n\n    fetchMissingTransformUrls: function (\n      imageIdsWithMissingUrls,\n      transform,\n      callback\n    ) {\n      var elementId = imageIdsWithMissingUrls.pop();\n\n      var data = {\n        assetId: elementId,\n        handle: transform,\n      };\n\n      Craft.sendActionRequest('POST', 'assets/generate-transform', {data})\n        .then((response) => {\n          Craft.AssetSelectorModal.transformUrls[transform][elementId] = false;\n          if (response.data.url) {\n            Craft.AssetSelectorModal.transformUrls[transform][elementId] =\n              response.data.url;\n          }\n        })\n        .catch(({response}) => {\n          Craft.AssetSelectorModal.transformUrls[transform][elementId] = false;\n\n          // More to load?\n          if (imageIdsWithMissingUrls.length) {\n            this.fetchMissingTransformUrls(\n              imageIdsWithMissingUrls,\n              transform,\n              callback\n            );\n          } else {\n            callback();\n          }\n        });\n    },\n\n    getElementInfo: function ($selectedElements) {\n      var info = this.base($selectedElements);\n\n      if (this._selectedTransform) {\n        for (var i = 0; i < info.length; i++) {\n          var elementId = info[i].id;\n\n          if (\n            typeof Craft.AssetSelectorModal.transformUrls[\n              this._selectedTransform\n            ][elementId] !== 'undefined' &&\n            Craft.AssetSelectorModal.transformUrls[this._selectedTransform][\n              elementId\n            ] !== false\n          ) {\n            info[i].url =\n              Craft.AssetSelectorModal.transformUrls[this._selectedTransform][\n                elementId\n              ];\n          }\n        }\n      }\n\n      return info;\n    },\n\n    onSelect: function (elementInfo) {\n      this.settings.onSelect(elementInfo, this._selectedTransform);\n    },\n  },\n  {\n    defaults: {\n      canSelectImageTransforms: false,\n      transforms: [],\n    },\n\n    transformUrls: {},\n  }\n);\n\n// Register it!\nCraft.registerElementSelectorModalClass(\n  'craft\\\\elements\\\\Asset',\n  Craft.AssetSelectorModal\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * AuthManager class\n */\nCraft.AuthManager = Garnish.Base.extend(\n  {\n    remainingSessionTime: null,\n    checkRemainingSessionTimer: null,\n    showLoginModalTimer: null,\n    decrementLogoutWarningInterval: null,\n\n    showingLogoutWarningModal: false,\n    showingLoginModal: false,\n\n    logoutWarningModal: null,\n    loginModal: null,\n\n    $logoutWarningPara: null,\n    $passwordInput: null,\n    $loginBtn: null,\n    $loginErrorPara: null,\n\n    submitLoginIfLoggedOut: false,\n\n    /**\n     * Init\n     */\n    init: function () {\n      if (Craft.username) {\n        this.updateRemainingSessionTime(Craft.remainingSessionTime);\n      }\n    },\n\n    /**\n     * Sets a timer for the next time to check the auth timeout.\n     */\n    setCheckRemainingSessionTimer: function (seconds) {\n      if (this.checkRemainingSessionTimer) {\n        clearTimeout(this.checkRemainingSessionTimer);\n      }\n\n      this.checkRemainingSessionTimer = setTimeout(\n        this.checkRemainingSessionTime.bind(this),\n        seconds * 1000\n      );\n    },\n\n    /**\n     * Pings the server to see how many seconds are left on the current user session, and handles the response.\n     */\n    checkRemainingSessionTime: function (extendSession) {\n      $.ajax({\n        url: Craft.getActionUrl(\n          'users/session-info',\n          extendSession ? null : 'dontExtendSession=1'\n        ),\n        type: 'GET',\n        dataType: 'json',\n        complete: (jqXHR, textStatus) => {\n          if (textStatus === 'success') {\n            if (\n              typeof jqXHR.responseJSON.csrfTokenValue !== 'undefined' &&\n              typeof Craft.csrfTokenValue !== 'undefined'\n            ) {\n              Craft.csrfTokenValue = jqXHR.responseJSON.csrfTokenValue;\n            }\n\n            this.updateRemainingSessionTime(jqXHR.responseJSON.timeout);\n            this.submitLoginIfLoggedOut = false;\n          } else {\n            this.updateRemainingSessionTime(-1);\n          }\n        },\n      });\n    },\n\n    /**\n     * Updates our record of the auth timeout, and handles it.\n     */\n    updateRemainingSessionTime: function (remainingSessionTime) {\n      this.remainingSessionTime = parseInt(remainingSessionTime);\n\n      // Are we within the warning window?\n      if (\n        this.remainingSessionTime !== -1 &&\n        this.remainingSessionTime < Craft.AuthManager.minSafeSessionTime\n      ) {\n        // Is there still time to renew the session?\n        if (this.remainingSessionTime) {\n          if (!this.showingLogoutWarningModal) {\n            // Show the warning modal\n            this.showLogoutWarningModal();\n          }\n\n          // Will the session expire before the next checkup?\n          if (this.remainingSessionTime < Craft.AuthManager.checkInterval) {\n            if (this.showLoginModalTimer) {\n              clearTimeout(this.showLoginModalTimer);\n            }\n\n            this.showLoginModalTimer = setTimeout(\n              this.showLoginModal.bind(this),\n              this.remainingSessionTime * 1000\n            );\n          }\n        } else {\n          if (this.showingLoginModal) {\n            if (this.submitLoginIfLoggedOut) {\n              this.submitLogin();\n            }\n          } else {\n            // Show the login modal\n            this.showLoginModal();\n          }\n        }\n\n        this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval);\n      } else {\n        // Everything's good!\n        this.hideLogoutWarningModal();\n        this.hideLoginModal();\n\n        // Will be be within the minSafeSessionTime before the next update?\n        if (\n          this.remainingSessionTime !== -1 &&\n          this.remainingSessionTime <\n            Craft.AuthManager.minSafeSessionTime +\n              Craft.AuthManager.checkInterval\n        ) {\n          this.setCheckRemainingSessionTimer(\n            this.remainingSessionTime - Craft.AuthManager.minSafeSessionTime + 1\n          );\n        } else {\n          this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval);\n        }\n      }\n    },\n\n    /**\n     * Shows the logout warning modal.\n     */\n    showLogoutWarningModal: function () {\n      var quickShow;\n\n      if (this.showingLoginModal) {\n        this.hideLoginModal(true);\n        quickShow = true;\n      } else {\n        quickShow = false;\n      }\n\n      this.showingLogoutWarningModal = true;\n\n      if (!this.logoutWarningModal) {\n        let $form = $(\n          '<form id=\"logoutwarningmodal\" class=\"modal alert fitted\"/>'\n        );\n        let $body = $('<div class=\"body\"/>').appendTo($form);\n        let $buttons = $('<div class=\"buttons right\"/>').appendTo($body);\n        let $logoutBtn = $('<button/>', {\n          type: 'button',\n          class: 'btn',\n          text: Craft.t('app', 'Sign out now'),\n        }).appendTo($buttons);\n        let $renewSessionBtn = $('<button/>', {\n          type: 'submit',\n          class: 'btn submit',\n          text: Craft.t('app', 'Keep me signed in'),\n        }).appendTo($buttons);\n\n        this.$logoutWarningPara = $('<p/>').prependTo($body);\n\n        this.logoutWarningModal = new Garnish.Modal($form, {\n          autoShow: false,\n          closeOtherModals: false,\n          hideOnEsc: false,\n          hideOnShadeClick: false,\n          shadeClass: 'modal-shade dark logoutwarningmodalshade',\n          onFadeIn: function () {\n            if (!Garnish.isMobileBrowser(true)) {\n              // Auto-focus the renew button\n              setTimeout(function () {\n                $renewSessionBtn.trigger('focus');\n              }, 100);\n            }\n          },\n        });\n\n        this.addListener($logoutBtn, 'activate', 'logout');\n        this.addListener($form, 'submit', 'renewSession');\n      }\n\n      if (quickShow) {\n        this.logoutWarningModal.quickShow();\n      } else {\n        this.logoutWarningModal.show();\n      }\n\n      this.updateLogoutWarningMessage();\n\n      this.decrementLogoutWarningInterval = setInterval(\n        this.decrementLogoutWarning.bind(this),\n        1000\n      );\n    },\n\n    /**\n     * Updates the logout warning message indicating that the session is about to expire.\n     */\n    updateLogoutWarningMessage: function () {\n      this.$logoutWarningPara.text(\n        Craft.t('app', 'Your session will expire in {time}.', {\n          time: Craft.secondsToHumanTimeDuration(this.remainingSessionTime),\n        })\n      );\n\n      this.logoutWarningModal.updateSizeAndPosition();\n    },\n\n    decrementLogoutWarning: function () {\n      if (this.remainingSessionTime > 0) {\n        this.remainingSessionTime--;\n        this.updateLogoutWarningMessage();\n      }\n\n      if (this.remainingSessionTime === 0) {\n        clearInterval(this.decrementLogoutWarningInterval);\n      }\n    },\n\n    /**\n     * Hides the logout warning modal.\n     */\n    hideLogoutWarningModal: function (quick) {\n      this.showingLogoutWarningModal = false;\n\n      if (this.logoutWarningModal) {\n        if (quick) {\n          this.logoutWarningModal.quickHide();\n        } else {\n          this.logoutWarningModal.hide();\n        }\n\n        if (this.decrementLogoutWarningInterval) {\n          clearInterval(this.decrementLogoutWarningInterval);\n        }\n      }\n    },\n\n    /**\n     * Shows the login modal.\n     */\n    showLoginModal: function () {\n      var quickShow;\n\n      if (this.showingLogoutWarningModal) {\n        this.hideLogoutWarningModal(true);\n        quickShow = true;\n      } else {\n        quickShow = false;\n      }\n\n      this.showingLoginModal = true;\n\n      if (!this.loginModal) {\n        var $form = $('<form id=\"loginmodal\" class=\"modal alert fitted\"/>'),\n          $body = $(\n            '<div class=\"body\"><h2>' +\n              Craft.t('app', 'Your session has ended.') +\n              '</h2><p>' +\n              Craft.t('app', 'Enter your password to log back in.') +\n              '</p></div>'\n          ).appendTo($form),\n          $inputContainer = $('<div class=\"inputcontainer\">').appendTo($body),\n          $inputsFlexContainer = $('<div class=\"flex\"/>').appendTo(\n            $inputContainer\n          ),\n          $passwordContainer = $('<div class=\"flex-grow\"/>').appendTo(\n            $inputsFlexContainer\n          ),\n          $buttonContainer = $('<div/>').appendTo($inputsFlexContainer),\n          $passwordWrapper = $('<div class=\"passwordwrapper\"/>').appendTo(\n            $passwordContainer\n          );\n\n        this.$passwordInput = $(\n          '<input type=\"password\" class=\"text password fullwidth\" autocomplete=\"current-password\" placeholder=\"' +\n            Craft.t('app', 'Password') +\n            '\"/>'\n        ).appendTo($passwordWrapper);\n        this.$loginBtn = Craft.ui\n          .createSubmitButton({\n            class: 'disabled',\n            label: Craft.t('app', 'Sign in'),\n            spinner: true,\n          })\n          .attr('aria-disabled', 'true')\n          .appendTo($buttonContainer);\n        this.$loginErrorPara = $('<p class=\"error\"/>').appendTo($body);\n\n        this.loginModal = new Garnish.Modal($form, {\n          autoShow: false,\n          closeOtherModals: false,\n          hideOnEsc: false,\n          hideOnShadeClick: false,\n          shadeClass: 'modal-shade dark loginmodalshade',\n          onFadeIn: () => {\n            if (!Garnish.isMobileBrowser(true)) {\n              // Auto-focus the password input\n              setTimeout(() => {\n                this.$passwordInput.trigger('focus');\n              }, 100);\n            }\n          },\n          onFadeOut: () => {\n            this.$passwordInput.val('');\n          },\n        });\n\n        new Craft.PasswordInput(this.$passwordInput, {\n          onToggleInput: ($newPasswordInput) => {\n            this.$passwordInput = $newPasswordInput;\n          },\n        });\n\n        this.addListener(this.$passwordInput, 'input', 'validatePassword');\n        this.addListener($form, 'submit', 'login');\n      }\n\n      if (quickShow) {\n        this.loginModal.quickShow();\n      } else {\n        this.loginModal.show();\n      }\n    },\n\n    /**\n     * Hides the login modal.\n     */\n    hideLoginModal: function (quick) {\n      this.showingLoginModal = false;\n\n      if (this.loginModal) {\n        if (quick) {\n          this.loginModal.quickHide();\n        } else {\n          this.loginModal.hide();\n        }\n      }\n    },\n\n    logout: function () {\n      $.get({\n        url: Craft.getActionUrl('users/logout'),\n        dataType: 'json',\n        success: () => {\n          Craft.redirectTo('');\n        },\n      });\n    },\n\n    renewSession: function (ev) {\n      if (ev) {\n        ev.preventDefault();\n      }\n\n      this.hideLogoutWarningModal();\n      this.checkRemainingSessionTime(true);\n    },\n\n    validatePassword: function () {\n      if (this.$passwordInput.val().length >= 6) {\n        this.$loginBtn.removeClass('disabled');\n        this.$loginBtn.removeAttr('aria-disabled');\n        return true;\n      } else {\n        this.$loginBtn.addClass('disabled');\n        this.$loginBtn.attr('aria-disabled', 'true');\n        return false;\n      }\n    },\n\n    login: function (ev) {\n      if (ev) {\n        ev.preventDefault();\n      }\n\n      if (this.validatePassword()) {\n        this.$loginBtn.addClass('loading');\n        this.clearLoginError();\n\n        if (typeof Craft.csrfTokenValue !== 'undefined') {\n          // Check the auth status one last time before sending this off,\n          // in case the user has already logged back in from another window/tab\n          this.submitLoginIfLoggedOut = true;\n          this.checkRemainingSessionTime();\n        } else {\n          this.submitLogin();\n        }\n      }\n    },\n\n    submitLogin: function () {\n      var data = {\n        loginName: Craft.username,\n        password: this.$passwordInput.val(),\n      };\n\n      Craft.sendActionRequest('POST', 'users/login', {data})\n        .then((response) => {\n          this.$loginBtn.removeClass('loading');\n          this.hideLoginModal();\n          this.checkRemainingSessionTime();\n        })\n        .catch(({response}) => {\n          this.$loginBtn.removeClass('loading');\n          this.showLoginError(response.data.message || null);\n          Garnish.shake(this.loginModal.$container);\n\n          if (!Garnish.isMobileBrowser(true)) {\n            this.$passwordInput.trigger('focus');\n          }\n        });\n    },\n\n    showLoginError: function (error) {\n      if (error === null || typeof error === 'undefined') {\n        error = Craft.t('app', 'A server error occurred.');\n      }\n\n      this.$loginErrorPara.text(error);\n      this.loginModal.updateSizeAndPosition();\n    },\n\n    clearLoginError: function () {\n      this.showLoginError('');\n    },\n  },\n  {\n    checkInterval: 60,\n    minSafeSessionTime: 120,\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Element index class\n */\nCraft.BaseElementIndex = Garnish.Base.extend(\n  {\n    initialized: false,\n    elementType: null,\n    idPrefix: null,\n\n    instanceState: null,\n    sourceStates: null,\n    sourceStatesStorageKey: null,\n\n    searchTimeout: null,\n    sourceSelect: null,\n\n    $container: null,\n    $main: null,\n    isIndexBusy: false,\n\n    $sidebar: null,\n    showingSidebar: null,\n    sourceKey: null,\n    rootSourceKey: null,\n    sourceViewModes: null,\n    $source: null,\n    $rootSource: null,\n    sourcesByKey: null,\n    $visibleSources: null,\n\n    $sourceActionsContainer: null,\n    $sourceActionsBtn: null,\n\n    $toolbar: null,\n    toolbarOffset: null,\n\n    $searchContainer: null,\n    $search: null,\n    $filterBtn: null,\n    searching: false,\n    searchText: null,\n    sortByScore: null,\n    trashed: false,\n    drafts: false,\n    $clearSearchBtn: null,\n\n    $statusMenuBtn: null,\n    $statusMenuContainer: null,\n    statusMenu: null,\n    status: null,\n\n    $siteMenuBtn: null,\n    siteMenu: null,\n    siteId: null,\n\n    $elements: null,\n    $updateSpinner: null,\n    $viewModeBtnContainer: null,\n    viewModeBtns: null,\n    viewMode: null,\n    view: null,\n    _autoSelectElements: null,\n    $countSpinner: null,\n    $countContainer: null,\n    $actionsContainer: null,\n    page: 1,\n    resultSet: null,\n    totalResults: null,\n    $exportBtn: null,\n\n    actions: null,\n    actionsHeadHtml: null,\n    actionsBodyHtml: null,\n    $selectAllContainer: null,\n    $selectAllCheckbox: null,\n    showingActionTriggers: false,\n    exporters: null,\n    exportersByType: null,\n    _$triggers: null,\n\n    _ignoreFailedRequest: false,\n    _cancelToken: null,\n\n    viewMenus: null,\n    activeViewMenu: null,\n    filterHuds: null,\n\n    /**\n     * Constructor\n     */\n    init: function (elementType, $container, settings) {\n      this.elementType = elementType;\n      this.$container = $container;\n      this.setSettings(settings, Craft.BaseElementIndex.defaults);\n\n      // Define an ID prefix that can be used for dynamically created elements\n      // ---------------------------------------------------------------------\n\n      this.idPrefix = Craft.randomString(10);\n\n      // Set the state objects\n      // ---------------------------------------------------------------------\n\n      this.instanceState = this.getDefaultInstanceState();\n\n      this.sourceStates = {};\n\n      // Instance states (selected source) are stored by a custom storage key defined in the settings\n      if (this.settings.storageKey) {\n        $.extend(\n          this.instanceState,\n          Craft.getLocalStorage(this.settings.storageKey),\n          {}\n        );\n      }\n\n      // Source states (view mode, etc.) are stored by the element type and context\n      this.sourceStatesStorageKey =\n        'BaseElementIndex.' + this.elementType + '.' + this.settings.context;\n      $.extend(\n        this.sourceStates,\n        Craft.getLocalStorage(this.sourceStatesStorageKey, {})\n      );\n\n      // Find the DOM elements\n      // ---------------------------------------------------------------------\n\n      this.$main = this.$container.find('.main');\n      this.$toolbar = this.$container.find(this.settings.toolbarSelector);\n      this.$statusMenuBtn = this.$toolbar.find('.statusmenubtn:first');\n      this.$statusMenuContainer = this.$statusMenuBtn.parent();\n      this.$siteMenuBtn = this.$container.find('.sitemenubtn:first');\n\n      this.$searchContainer = this.$toolbar.find('.search:first');\n      this.$search = this.$searchContainer.children('input:first');\n      this.$filterBtn = this.$searchContainer.children('.filter-btn:first');\n      this.$clearSearchBtn = this.$searchContainer.children('.clear-btn:first');\n\n      this.$sidebar = this.$container.find('.sidebar:first');\n      this.$sourceActionsContainer = this.$sidebar.find('#source-actions');\n\n      this.$elements = this.$container.find('.elements:first');\n      this.$updateSpinner = this.$elements.find('.spinner');\n\n      if (!this.$updateSpinner.length) {\n        this.$updateSpinner = $('<div/>', {\n          class: 'update-spinner spinner spinner-absolute',\n        }).appendTo(this.$elements);\n      }\n\n      this.$countSpinner = this.$container.find('#count-spinner');\n      this.$countContainer = this.$container.find('#count-container');\n      this.$actionsContainer = this.$container.find('#actions-container');\n      this.$exportBtn = this.$container.find('#export-btn');\n\n      // Hide sidebar if needed\n      if (this.settings.hideSidebar) {\n        this.$sidebar.hide();\n        $('.body, .content', this.$container).removeClass('has-sidebar');\n      }\n\n      // Initialize the sources\n      // ---------------------------------------------------------------------\n\n      if (!this.initSources()) {\n        return;\n      }\n\n      // Initialize the status menu\n      // ---------------------------------------------------------------------\n\n      if (this.$statusMenuBtn.length) {\n        this.statusMenu = this.$statusMenuBtn.menubtn().data('menubtn').menu;\n        this.statusMenu.on('optionselect', this._handleStatusChange.bind(this));\n      }\n\n      // Initialize the site menu\n      // ---------------------------------------------------------------------\n\n      // Is there a site menu?\n      if (this.$siteMenuBtn.length) {\n        this.siteMenu = this.$siteMenuBtn.menubtn().data('menubtn').menu;\n\n        // Figure out the initial site\n        var $option = this.siteMenu.$options.filter('.sel:first');\n\n        if (!$option.length) {\n          $option = this.siteMenu.$options.first();\n        }\n\n        if ($option.length) {\n          this._setSite($option.data('site-id'));\n        } else {\n          // No site options -- they must not have any site permissions\n          this.settings.criteria = {id: '0'};\n        }\n\n        this.siteMenu.on('optionselect', this._handleSiteChange.bind(this));\n\n        if (this.siteId) {\n          // Should we be using a different default site?\n          var defaultSiteId =\n            this.settings.defaultSiteId || Craft.cp.getSiteId();\n\n          if (defaultSiteId && defaultSiteId != this.siteId) {\n            // Is that one available here?\n            var $storedSiteOption = this.siteMenu.$options.filter(\n              '[data-site-id=\"' + defaultSiteId + '\"]:first'\n            );\n\n            if ($storedSiteOption.length) {\n              // Todo: switch this to siteMenu.selectOption($storedSiteOption) once Menu is updated to support that\n              $storedSiteOption.trigger('click');\n            }\n          }\n        }\n      } else if (\n        this.settings.criteria &&\n        this.settings.criteria.siteId &&\n        this.settings.criteria.siteId !== '*'\n      ) {\n        this._setSite(this.settings.criteria.siteId);\n      } else {\n        this._setSite(Craft.siteId);\n      }\n\n      // Don't let the criteria override the selected site\n      if (this.settings.criteria && this.settings.criteria.siteId) {\n        delete this.settings.criteria.siteId;\n      }\n\n      // Initialize the search input\n      // ---------------------------------------------------------------------\n\n      // Automatically update the elements after new search text has been sitting for a 1/2 second\n      this.addListener(this.$search, 'input', () => {\n        if (!this.searching && this.$search.val()) {\n          this.startSearching();\n        } else if (this.searching && !this.$search.val()) {\n          this.stopSearching();\n        }\n\n        if (this.searchTimeout) {\n          clearTimeout(this.searchTimeout);\n        }\n\n        this.searchTimeout = setTimeout(\n          this.updateElementsIfSearchTextChanged.bind(this),\n          500\n        );\n      });\n\n      // Update the elements when the Return key is pressed\n      this.addListener(this.$search, 'keypress', (ev) => {\n        if (ev.keyCode === Garnish.RETURN_KEY) {\n          ev.preventDefault();\n\n          if (this.searchTimeout) {\n            clearTimeout(this.searchTimeout);\n          }\n\n          this.updateElementsIfSearchTextChanged();\n        }\n      });\n\n      // Clear the search when the X button is clicked\n      this.addListener(this.$clearSearchBtn, 'click', () => {\n        this.clearSearch(true);\n\n        if (!Garnish.isMobileBrowser(true)) {\n          this.$search.trigger('focus');\n        }\n      });\n\n      // Auto-focus the Search box\n      if (!Garnish.isMobileBrowser(true)) {\n        this.$search.trigger('focus');\n      }\n\n      // View menus\n      this.viewMenus = {};\n\n      // Filter HUDs\n      this.filterHuds = {};\n      this.addListener(this.$filterBtn, 'click', 'showFilterHud');\n\n      // Set the default status\n      // ---------------------------------------------------------------------\n\n      const queryParams = Craft.getQueryParams();\n\n      if (queryParams.status) {\n        let selector;\n        switch (queryParams.status) {\n          case 'trashed':\n            selector = '[data-trashed]';\n            break;\n          case 'drafts':\n            selector = '[data-drafts]';\n            break;\n          default:\n            selector = `[data-status=\"${queryParams.status}\"]`;\n        }\n\n        const $option = this.statusMenu.$options.filter(selector);\n        if ($option.length) {\n          this.statusMenu.selectOption($option[0]);\n        } else {\n          this.setQueryParam('status', null);\n        }\n      }\n\n      // Initialize the Export button\n      // ---------------------------------------------------------------------\n\n      this.addListener(this.$exportBtn, 'click', '_showExportHud');\n\n      // Let everyone know that the UI is initialized\n      // ---------------------------------------------------------------------\n\n      this.initialized = true;\n      this.afterInit();\n\n      // Select the initial source\n      // ---------------------------------------------------------------------\n\n      this.selectDefaultSource();\n\n      // Select the default sort attribute/direction\n      // ---------------------------------------------------------------------\n\n      if (queryParams.sort) {\n        const lastDashPos = queryParams.sort.lastIndexOf('-');\n        if (lastDashPos !== -1) {\n          const attr = queryParams.sort.substring(0, lastDashPos);\n          const dir = queryParams.sort.substring(lastDashPos + 1);\n          this.setSelectedSortAttribute(attr, dir);\n        }\n      }\n\n      // Load the first batch of elements!\n      // ---------------------------------------------------------------------\n\n      // Default to whatever page is in the URL\n      this.setPage(Craft.pageNum);\n\n      this.updateElements(true);\n    },\n\n    afterInit: function () {\n      this.onAfterInit();\n    },\n\n    _createCancelToken: function () {\n      this._cancelToken = axios.CancelToken.source();\n      return this._cancelToken.token;\n    },\n\n    _cancelRequests: function () {\n      if (this._cancelToken) {\n        this._ignoreFailedRequest = true;\n        this._cancelToken.cancel();\n        Garnish.requestAnimationFrame(() => {\n          this._ignoreFailedRequest = false;\n        });\n      }\n    },\n\n    getSourceContainer: function () {\n      return this.$sidebar.find('nav > ul');\n    },\n\n    get $sources() {\n      if (!this.sourceSelect) {\n        return undefined;\n      }\n\n      return this.sourceSelect.$items;\n    },\n\n    getSite: function () {\n      if (!this.siteId) {\n        return undefined;\n      }\n      return Craft.sites.find((s) => s.id == this.siteId);\n    },\n\n    initSources: function () {\n      var $sources = this._getSourcesInList(this.getSourceContainer(), true);\n\n      // No source, no party.\n      if ($sources.length === 0) {\n        return false;\n      }\n\n      // The source selector\n      if (!this.sourceSelect) {\n        this.sourceSelect = new Garnish.Select(this.$sidebar.find('nav'), {\n          multi: false,\n          allowEmpty: false,\n          vertical: true,\n          onSelectionChange: this._handleSourceSelectionChange.bind(this),\n        });\n      }\n\n      this.sourcesByKey = {};\n\n      for (let i = 0; i < $sources.length; i++) {\n        this.initSource($($sources[i]));\n      }\n\n      return true;\n    },\n\n    selectDefaultSource: function () {\n      // The `source` query param should always take precedence\n      let sourceKey;\n      if (this.settings.context === 'index') {\n        sourceKey = Craft.getQueryParam('source');\n      }\n\n      if (!sourceKey) {\n        sourceKey = this.getDefaultSourceKey();\n      }\n\n      let $source;\n\n      if (sourceKey) {\n        $source = this.getSourceByKey(sourceKey);\n\n        // Make sure it's visible\n        if (this.$visibleSources.index($source) === -1) {\n          $source = null;\n        }\n      }\n\n      if (!sourceKey || !$source) {\n        // Select the first source by default\n        $source = this.$visibleSources.first();\n      }\n\n      return this.selectSource($source);\n    },\n\n    refreshSources: function () {\n      this.sourceSelect.removeAllItems();\n\n      this.setIndexBusy();\n\n      Craft.sendActionRequest('POST', this.settings.refreshSourcesAction, {\n        data: {\n          context: this.settings.context,\n          elementType: this.elementType,\n        },\n      })\n        .then((response) => {\n          this.setIndexAvailable();\n          this.getSourceContainer().replaceWith(response.data.html);\n          this.initSources();\n          this.selectDefaultSource();\n        })\n        .catch(() => {\n          this.setIndexAvailable();\n          if (!this._ignoreFailedRequest) {\n            Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n          }\n        });\n    },\n\n    initSource: function ($source) {\n      this.sourceSelect.addItems($source);\n      this.initSourceToggle($source);\n      this.sourcesByKey[$source.data('key')] = $source;\n\n      if (\n        $source.data('hasNestedSources') &&\n        this.instanceState.expandedSources.indexOf($source.data('key')) !== -1\n      ) {\n        this._expandSource($source);\n      }\n    },\n\n    initSourceToggle: function ($source) {\n      // Remove handlers for the same thing. Just in case.\n      this.deinitSourceToggle($source);\n\n      var $toggle = this._getSourceToggle($source);\n\n      if ($toggle.length) {\n        this.addListener($source, 'dblclick', '_handleSourceDblClick');\n        this.addListener($toggle, 'click', '_handleSourceToggleClick');\n        $source.data('hasNestedSources', true);\n      } else {\n        $source.data('hasNestedSources', false);\n      }\n    },\n\n    deinitSource: function ($source) {\n      this.sourceSelect.removeItems($source);\n      this.deinitSourceToggle($source);\n      delete this.sourcesByKey[$source.data('key')];\n    },\n\n    deinitSourceToggle: function ($source) {\n      if ($source.data('hasNestedSources')) {\n        this.removeListener($source, 'dblclick');\n        this.removeListener(this._getSourceToggle($source), 'click');\n      }\n\n      $source.removeData('hasNestedSources');\n    },\n\n    getDefaultInstanceState: function () {\n      return {\n        selectedSource: null,\n        expandedSources: [],\n      };\n    },\n\n    getDefaultSourceKey: function () {\n      if (this.settings.defaultSource) {\n        const paths = this.settings.defaultSource.split('/');\n        let path = '';\n\n        // Expand the tree\n        for (let i = 0; i < paths.length; i++) {\n          path += paths[i];\n          const $source = this.getSourceByKey(path);\n\n          // If the folder can't be found, then just go to the stored instance source.\n          if (!$source) {\n            return this.instanceState.selectedSource;\n          }\n\n          this._expandSource($source);\n          path += '/';\n        }\n\n        // Just make sure that the modal is aware of the newly expanded sources, too.\n        this._setSite(this.siteId);\n\n        return this.settings.defaultSource;\n      }\n\n      return this.instanceState.selectedSource;\n    },\n\n    getDefaultExpandedSources: function () {\n      return this.instanceState.expandedSources;\n    },\n\n    startSearching: function () {\n      // Show the clear button\n      this.$clearSearchBtn.removeClass('hidden');\n      this.searching = true;\n      this.sortByScore = true;\n\n      if (this.activeViewMenu) {\n        this.activeViewMenu.updateSortField();\n      }\n    },\n\n    clearSearch: function (updateElements) {\n      if (!this.searching) {\n        return;\n      }\n\n      this.$search.val('');\n\n      if (this.searchTimeout) {\n        clearTimeout(this.searchTimeout);\n      }\n\n      this.stopSearching();\n\n      if (updateElements) {\n        this.updateElementsIfSearchTextChanged();\n      } else {\n        this.searchText = null;\n      }\n    },\n\n    stopSearching: function () {\n      // Hide the clear button\n      this.$clearSearchBtn.addClass('hidden');\n      this.searching = false;\n      this.sortByScore = false;\n\n      if (this.activeViewMenu) {\n        this.activeViewMenu.updateSortField();\n      }\n    },\n\n    setInstanceState: function (key, value) {\n      if (typeof key === 'object') {\n        $.extend(this.instanceState, key);\n      } else {\n        this.instanceState[key] = value;\n      }\n\n      this.storeInstanceState();\n    },\n\n    storeInstanceState: function () {\n      if (this.settings.storageKey) {\n        Craft.setLocalStorage(this.settings.storageKey, this.instanceState);\n      }\n    },\n\n    getSourceState: function (sourceKey, key, defaultValue) {\n      sourceKey = sourceKey.replace(/\\/.*/, '');\n\n      if (typeof this.sourceStates[sourceKey] === 'undefined') {\n        // Set it now so any modifications to it by whoever's calling this will be stored.\n        this.sourceStates[sourceKey] = {};\n      }\n\n      if (typeof key === 'undefined') {\n        return this.sourceStates[sourceKey];\n      } else if (typeof this.sourceStates[sourceKey][key] !== 'undefined') {\n        return this.sourceStates[sourceKey][key];\n      } else {\n        return typeof defaultValue !== 'undefined' ? defaultValue : null;\n      }\n    },\n\n    getSelectedSourceState: function (key, defaultValue) {\n      return this.getSourceState(\n        this.instanceState.selectedSource,\n        key,\n        defaultValue\n      );\n    },\n\n    setSelecetedSourceState: function (key, value) {\n      var viewState = this.getSelectedSourceState();\n\n      if (typeof key === 'object') {\n        for (let k in key) {\n          if (key.hasOwnProperty(k)) {\n            if (key[k] !== null) {\n              viewState[k] = key[k];\n            } else {\n              delete viewState[k];\n            }\n          }\n        }\n      } else if (value !== null) {\n        viewState[key] = value;\n      } else {\n        delete viewState[key];\n      }\n\n      const sourceKey = this.instanceState.selectedSource.replace(/\\/.*/, '');\n\n      this.sourceStates[sourceKey] = viewState;\n\n      // Clean up sourceStates while we're at it\n      for (let i in this.sourceStates) {\n        if (this.sourceStates.hasOwnProperty(i) && i.includes('/')) {\n          delete this.sourceStates[i];\n        }\n      }\n\n      // Store it in localStorage too\n      Craft.setLocalStorage(this.sourceStatesStorageKey, this.sourceStates);\n    },\n\n    /**\n     * @deprecated in 4.3.0.\n     */\n    storeSortAttributeAndDirection: function () {},\n\n    /**\n     * Sets the page number.\n     */\n    setPage: function (page) {\n      if (this.settings.context !== 'index') {\n        return;\n      }\n\n      page = Math.max(page, 1);\n      this.page = page;\n\n      const url = Craft.getPageUrl(this.page);\n      history.replaceState({}, '', url);\n    },\n\n    _resetCount: function () {\n      this.resultSet = null;\n      this.totalResults = null;\n    },\n\n    updateSourceMenu: function () {\n      if (!this.$sourceActionsContainer.length) {\n        return;\n      }\n\n      if (this.$sourceActionsBtn) {\n        this.$sourceActionsBtn.data('trigger').destroy();\n        this.$sourceActionsContainer.empty();\n        $('#source-actions-menu').remove();\n        this.$sourceActionsBtn = null;\n      }\n\n      const actions = this.getSourceActions();\n      if (!actions.length) {\n        return;\n      }\n\n      const groupedActions = [\n        actions.filter((a) => !a.destructive && !a.administrative),\n        actions.filter((a) => a.destructive && !a.administrative),\n        actions.filter((a) => a.administrative),\n      ].filter((group) => group.length);\n\n      this.$sourceActionsBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn settings icon menubtn',\n        title: Craft.t('app', 'Source settings'),\n        'aria-label': Craft.t('app', 'Source settings'),\n        'aria-controls': 'source-actions-menu',\n      }).appendTo(this.$sourceActionsContainer);\n\n      const $menu = $('<div/>', {\n        id: 'source-actions-menu',\n        class: 'menu menu--disclosure',\n      }).appendTo(this.$sourceActionsContainer);\n\n      groupedActions.forEach((group, index) => {\n        if (index !== 0) {\n          $('<hr/>').appendTo($menu);\n        }\n\n        this._buildActionList(group).appendTo($menu);\n      });\n\n      this.$sourceActionsBtn.disclosureMenu();\n    },\n\n    _buildActionList: function (actions) {\n      const $ul = $('<ul/>');\n\n      actions.forEach((action) => {\n        const $button = $('<button/>', {\n          type: 'button',\n          class: 'menu-option',\n          text: action.label,\n        }).on('click', () => {\n          this.$sourceActionsBtn.data('trigger').hide();\n          if (action.onSelect) {\n            action.onSelect();\n          }\n        });\n\n        if (action.destructive) {\n          $button.addClass('error');\n        }\n\n        $('<li/>').append($button).appendTo($ul);\n      });\n\n      return $ul;\n    },\n\n    getSourceActions: function () {\n      let actions = [];\n\n      if (Craft.userIsAdmin && Craft.allowAdminChanges) {\n        actions.push({\n          label: Craft.t('app', 'Customize sources'),\n          administrative: true,\n          onSelect: () => {\n            this.createCustomizeSourcesModal();\n          },\n        });\n      }\n\n      return actions;\n    },\n\n    updateViewMenu: function () {\n      if (\n        !this.activeViewMenu ||\n        this.activeViewMenu !== this.viewMenus[this.rootSourceKey]\n      ) {\n        if (this.activeViewMenu) {\n          this.activeViewMenu.hideTrigger();\n        }\n        if (!this.viewMenus[this.rootSourceKey]) {\n          this.viewMenus[this.rootSourceKey] = new ViewMenu(\n            this,\n            this.$rootSource\n          );\n        }\n        this.activeViewMenu = this.viewMenus[this.rootSourceKey];\n        this.activeViewMenu.showTrigger();\n      }\n    },\n\n    /**\n     * Returns the data that should be passed to the elementIndex/getElements controller action\n     * when loading elements.\n     */\n    getViewParams: function () {\n      var criteria = {\n        siteId: this.siteId,\n        search: this.searchText,\n        offset: this.settings.batchSize * (this.page - 1),\n        limit: this.settings.batchSize,\n      };\n\n      // Only set drafts/draftOf/trashed params when needed, so we don't potentially override a source's criteria\n      if (\n        this.settings.canHaveDrafts &&\n        (this.drafts || (this.settings.context === 'index' && !this.status))\n      ) {\n        criteria.drafts = this.drafts || null;\n        criteria.savedDraftsOnly = true;\n        if (!this.drafts) {\n          criteria.draftOf = false;\n        }\n      }\n      if (this.trashed) {\n        criteria.trashed = true;\n      }\n\n      if (!Garnish.hasAttr(this.$source, 'data-override-status')) {\n        criteria.status = this.status;\n      }\n\n      $.extend(criteria, this.settings.criteria);\n\n      var params = {\n        context: this.settings.context,\n        elementType: this.elementType,\n        source: this.instanceState.selectedSource,\n        condition: this.settings.condition,\n        criteria: criteria,\n        disabledElementIds: this.settings.disabledElementIds,\n        viewState: $.extend({}, this.getSelectedSourceState()),\n        paginated: this._isViewPaginated() ? 1 : 0,\n      };\n\n      // Possible that the order/sort isn't entirely accurate if we're sorting by Score\n      const [sortAttribute, sortDirection] =\n        this.getSortAttributeAndDirection();\n      params.viewState.order = sortAttribute;\n      params.viewState.sort = sortDirection;\n\n      if (sortAttribute === 'structure') {\n        if (typeof this.instanceState.collapsedElementIds === 'undefined') {\n          this.instanceState.collapsedElementIds = [];\n        }\n        params.collapsedElementIds = this.instanceState.collapsedElementIds;\n      }\n\n      if (\n        this.filterHuds[this.siteId] &&\n        this.filterHuds[this.siteId][this.sourceKey] &&\n        this.filterHuds[this.siteId][this.sourceKey].serialized\n      ) {\n        params.filters =\n          this.filterHuds[this.siteId][this.sourceKey].serialized;\n      }\n\n      // Give plugins a chance to hook in here\n      this.trigger('registerViewParams', {\n        params: params,\n      });\n\n      return params;\n    },\n\n    updateElements: function (preservePagination, pageChanged) {\n      // Ignore if we're not fully initialized yet\n      if (!this.initialized) {\n        return;\n      }\n\n      // Cancel any ongoing requests\n      this._cancelRequests();\n\n      this.setIndexBusy();\n\n      // Kill the old view class\n      if (this.view) {\n        this.view.destroy();\n        delete this.view;\n      }\n\n      if (preservePagination !== true) {\n        this.setPage(1);\n        this._resetCount();\n      }\n\n      var params = this.getViewParams();\n\n      Craft.sendActionRequest('POST', this.settings.updateElementsAction, {\n        data: params,\n        cancelToken: this._createCancelToken(),\n      })\n        .then((response) => {\n          this.setIndexAvailable();\n          (this.settings.context === 'index'\n            ? Garnish.$scrollContainer\n            : this.$main\n          ).scrollTop(0);\n          this._updateView(params, response.data);\n\n          if (pageChanged) {\n            const $elementContainer = this.view.getElementContainer();\n            Garnish.firstFocusableElement($elementContainer).trigger('focus');\n          }\n        })\n        .catch((e) => {\n          this.setIndexAvailable();\n          if (!this._ignoreFailedRequest) {\n            Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n          }\n        });\n    },\n\n    updateElementsIfSearchTextChanged: function () {\n      if (\n        this.searchText !==\n        (this.searchText = this.searching ? this.$search.val() : null)\n      ) {\n        this.updateElements();\n      }\n    },\n\n    showActionTriggers: function () {\n      // Ignore if they're already shown\n      if (this.showingActionTriggers) {\n        return;\n      }\n\n      if (!this._$triggers) {\n        this._createTriggers();\n      } else {\n        this._$triggers.appendTo(this.$actionsContainer);\n      }\n\n      this.showingActionTriggers = true;\n    },\n\n    submitAction: function (action, actionParams) {\n      // Make sure something's selected\n      var selectedElementIds = this.view.getSelectedElementIds(),\n        totalSelected = selectedElementIds.length;\n\n      if (totalSelected === 0) {\n        return;\n      }\n\n      if (typeof action === 'string') {\n        action = this._findAction(action);\n      }\n\n      if (action.confirm && !confirm(action.confirm)) {\n        return;\n      }\n\n      // Cancel any ongoing requests\n      this._cancelRequests();\n\n      // Get ready to submit\n      var viewParams = this.getViewParams();\n\n      actionParams = actionParams ? Craft.expandPostArray(actionParams) : {};\n      var params = $.extend(viewParams, action.settings || {}, actionParams, {\n        elementAction: action.type,\n        elementIds: selectedElementIds,\n      });\n\n      // Do it\n      this.setIndexBusy();\n      this._autoSelectElements = selectedElementIds;\n\n      if (action.download) {\n        if (Craft.csrfTokenName) {\n          params[Craft.csrfTokenName] = Craft.csrfTokenValue;\n        }\n        Craft.downloadFromUrl(\n          'POST',\n          Craft.getActionUrl(this.settings.submitActionsAction),\n          params\n        )\n          .then((response) => {\n            this.setIndexAvailable();\n          })\n          .catch((e) => {\n            this.setIndexAvailable();\n          });\n      } else {\n        Craft.sendActionRequest('POST', this.settings.submitActionsAction, {\n          data: params,\n          cancelToken: this._createCancelToken(),\n        })\n          .then((response) => {\n            // Update the count text too\n            this._resetCount();\n            this._updateView(viewParams, response.data);\n\n            if (typeof response.data.badgeCounts !== 'undefined') {\n              this._updateBadgeCounts(response.data.badgeCounts);\n            }\n\n            if (response.data.message) {\n              Craft.cp.displaySuccess(response.data.message);\n            }\n\n            this.afterAction(action, params);\n          })\n          .catch(({response}) => {\n            Craft.cp.displayError(response.data.message);\n          })\n          .finally(() => {\n            this.setIndexAvailable();\n          });\n      }\n    },\n\n    _findAction: function (actionClass) {\n      for (var i = 0; i < this.actions.length; i++) {\n        if (this.actions[i].type === actionClass) {\n          return this.actions[i];\n        }\n      }\n      throw `Invalid element action: ${actionClass}`;\n    },\n\n    afterAction: function (action, params) {\n      // There may be a new background job that needs to be run\n      Craft.cp.runQueue();\n\n      this.onAfterAction(action, params);\n    },\n\n    hideActionTriggers: function () {\n      // Ignore if there aren't any\n      if (!this.showingActionTriggers) {\n        return;\n      }\n\n      this._$triggers.detach();\n\n      this.showingActionTriggers = false;\n    },\n\n    updateActionTriggers: function () {\n      // Do we have an action UI to update?\n      if (this.actions) {\n        var totalSelected = this.view.getSelectedElements().length;\n\n        if (totalSelected !== 0) {\n          if (totalSelected === this.view.getEnabledElements().length) {\n            this.$selectAllCheckbox.removeClass('indeterminate');\n            this.$selectAllCheckbox.addClass('checked');\n            this.$selectAllCheckbox.attr('aria-checked', 'true');\n          } else {\n            this.$selectAllCheckbox.addClass('indeterminate');\n            this.$selectAllCheckbox.removeClass('checked');\n            this.$selectAllCheckbox.attr('aria-checked', 'mixed');\n          }\n\n          this.showActionTriggers();\n        } else {\n          this.$selectAllCheckbox.removeClass('indeterminate checked');\n          this.$selectAllCheckbox.attr('aria-checked', 'false');\n          this.hideActionTriggers();\n        }\n      }\n    },\n\n    getSelectedElements: function () {\n      return this.view ? this.view.getSelectedElements() : $();\n    },\n\n    getSelectedElementIds: function () {\n      return this.view ? this.view.getSelectedElementIds() : [];\n    },\n\n    setStatus: function (status) {\n      // Find the option (and make sure it actually exists)\n      var $option = this.statusMenu.$options.filter(\n        'a[data-status=\"' + status + '\"]:first'\n      );\n\n      if ($option.length) {\n        this.statusMenu.selectOption($option[0]);\n      }\n    },\n\n    /**\n     * Returns the selected sort attribute for a source\n     * @param {jQuery} [$source]\n     * @returns {string}\n     */\n    getSelectedSortAttribute: function ($source) {\n      $source = $source || this.$source;\n      if ($source) {\n        const attribute = this.getSourceState($source.data('key'), 'order');\n\n        // Make sure it's valid\n        if (this.getSortOption(attribute, $source)) {\n          return attribute;\n        }\n      }\n\n      return this.getDefaultSort()[0];\n    },\n\n    /**\n     * Returns the selected sort direction for a source\n     * @param {jQuery} [$source]\n     * @returns {string}\n     */\n    getSelectedSortDirection: function ($source) {\n      $source = $source || this.$source;\n      if ($source) {\n        const direction = this.getSourceState($source.data('key'), 'sort');\n\n        // Make sure it's valid\n        if (['asc', 'desc'].includes(direction)) {\n          return direction;\n        }\n      }\n\n      return this.getDefaultSort()[1];\n    },\n\n    /**\n     * @deprecated in 4.3.0. Use setSelectedSortAttribute() instead.\n     */\n    setSortAttribute: function (attr) {\n      this.setSelectedSortAttribute(attr);\n    },\n\n    /**\n     * Sets the selected sort attribute and direction.\n     *\n     * If direction isn’t provided, the attribute’s default direction will be used.\n     *\n     * @param {string} attr\n     * @param {string} [dir]\n     */\n    setSelectedSortAttribute: function (attr, dir) {\n      // If score, keep track of that separately\n      if (attr === 'score') {\n        this.sortByScore = true;\n        if (this.activeViewMenu) {\n          this.activeViewMenu.updateSortField();\n        }\n        return;\n      }\n\n      this.sortByScore = false;\n\n      // Make sure it's valid\n      const sortOption = this.getSortOption(attr);\n      if (!sortOption) {\n        console.warn(`Invalid sort option: ${attr}`);\n        return;\n      }\n\n      if (attr === 'structure') {\n        dir = 'asc';\n      } else {\n        dir = dir || sortOption.defaultDir;\n      }\n\n      const history = [];\n\n      // Remember the previous choices\n      const attributes = [attr];\n\n      // Only include the last attribute if it changed\n      const lastAttr = this.getSelectedSourceState('order');\n      if (lastAttr && lastAttr !== attr) {\n        history.push([lastAttr, this.getSelectedSourceState('sort')]);\n        attributes.push(lastAttr);\n      }\n\n      const oldHistory = this.getSelectedSourceState('orderHistory', []);\n      for (let i = 0; i < oldHistory.length; i++) {\n        const [a] = oldHistory[i];\n        if (a && !attributes.includes(a)) {\n          history.push(oldHistory[i]);\n          attributes.push(a);\n        } else {\n          break;\n        }\n      }\n\n      this.setSelecetedSourceState({\n        order: attr,\n        sort: dir,\n        orderHistory: history,\n      });\n\n      // Update the view menu\n      if (this.activeViewMenu) {\n        this.activeViewMenu.updateSortField();\n      }\n\n      // Update the query string\n      Craft.setQueryParam('sort', `${attr}-${dir}`);\n    },\n\n    /**\n     * @deprecated in 4.3.0. Use setSelectedSortAttribute() or setSelectedSortDirection() instead.\n     */\n    setSortDirection: function (dir) {\n      this.setSelectedSortDirection(dir);\n    },\n\n    /**\n     * Sets the selected sort direction, maintaining the current sort attribute.\n     * @param {string} dir\n     */\n    setSelectedSortDirection: function (dir) {\n      this.setSelectedSortAttribute(this.getSelectedSortAttribute(), dir);\n    },\n\n    /**\n     * Returns whether sorting by a structure is permitted for the current state.\n     * @returns {boolean}\n     */\n    canSortByStructure: function () {\n      return (\n        !this.trashed && !this.drafts && !this.searching && !this.sortByScore\n      );\n    },\n\n    /**\n     * Returns the actual sort attribute, which may be different from what's selected.\n     * @returns {string[]}\n     */\n    getSortAttributeAndDirection: function () {\n      if (this.searching && this.sortByScore) {\n        return ['score', 'desc'];\n      }\n\n      let attribute = this.getSelectedSortAttribute();\n      let direction = this.getSelectedSortDirection();\n\n      if (attribute === 'structure') {\n        if (!this.canSortByStructure()) {\n          const alt = this.getSortOptions().find((a) => a.attr !== 'structure');\n          attribute = alt.attr;\n          direction = alt.defaultDir;\n        } else {\n          direction = 'asc';\n        }\n      }\n\n      return [attribute, direction];\n    },\n\n    getSortLabel: function (attr) {\n      const sortOption = this.getSortOption(attr);\n      return sortOption ? sortOption.label : null;\n    },\n\n    getSelectedViewMode: function () {\n      return this.getSelectedSourceState('mode') || 'table';\n    },\n\n    /**\n     * Returns the nesting level for a given source, where 1 = the root level\n     * @param {jQuery} $source\n     * @returns {number}\n     */\n    getSourceLevel: function ($source) {\n      return $source.parentsUntil('nav', 'ul.nested').length + 1;\n    },\n\n    /**\n     * Returns a source’s parent, or null if it’s the root source\n     * @param {jQuery} $source\n     * @returns {?jQuery}\n     */\n    getParentSource: function ($source) {\n      const $parent = $source.parent().parent().siblings('a');\n      return $parent.length ? $parent : null;\n    },\n\n    /**\n     * Returns the root level source for a given source.\n     * @param {jQuery} $source\n     * @returns {jQuery}\n     */\n    getRootSource: function ($source) {\n      let $parent;\n      while (($parent = this.getParentSource($source))) {\n        $source = $parent;\n      }\n      return $source;\n    },\n\n    getSourceByKey: function (key) {\n      return this.sourcesByKey[key] || null;\n    },\n\n    selectSource: function (source) {\n      const $source = $(source);\n\n      // return false if there truly are no sources;\n      // don't attempt to check only default/visible sources\n      if (!this.sourcesByKey || !Object.keys(this.sourcesByKey).length) {\n        return false;\n      }\n\n      if (\n        this.$source &&\n        this.$source[0] &&\n        this.$source[0] === $source[0] &&\n        $source.data('key') === this.sourceKey\n      ) {\n        return false;\n      }\n\n      // Hide action triggers if they're currently being shown\n      this.hideActionTriggers();\n\n      this.$source = $source;\n      this.$rootSource = this.getRootSource($source);\n      this.sourceKey = $source.data('key');\n      this.rootSourceKey = this.$rootSource.data('key');\n      this.setInstanceState('selectedSource', this.sourceKey);\n      this.sourceSelect.selectItem($source);\n\n      Craft.cp.updateContentHeading();\n\n      if (this.searching) {\n        // Clear the search value without causing it to update elements\n        this.searchText = null;\n        this.$search.val('');\n        this.stopSearching();\n      }\n\n      // Status menu\n      // ----------------------------------------------------------------------\n\n      if (this.$statusMenuBtn.length) {\n        if (Garnish.hasAttr(this.$source, 'data-override-status')) {\n          this.$statusMenuContainer.addClass('hidden');\n        } else {\n          this.$statusMenuContainer.removeClass('hidden');\n        }\n\n        if (this.trashed) {\n          // Swap to the initial status\n          var $firstOption = this.statusMenu.$options.first();\n          this.setStatus($firstOption.data('status'));\n        }\n      }\n\n      // View mode buttons\n      // ----------------------------------------------------------------------\n\n      // Clear out any previous view mode data\n      if (this.$viewModeBtnContainer) {\n        this.$viewModeBtnContainer.remove();\n      }\n\n      this.viewModeBtns = {};\n      this.viewMode = null;\n\n      // Get the new list of view modes\n      this.sourceViewModes = this.getViewModesForSource();\n\n      // Create the buttons if there's more than one mode available to this source\n      if (this.sourceViewModes.length > 1) {\n        this.$viewModeBtnContainer = $(\n          '<section class=\"btngroup btngroup--exclusive\"/>'\n        ).attr('aria-label', Craft.t('app', 'View'));\n\n        if (this.activeViewMenu) {\n          this.$viewModeBtnContainer.insertBefore(this.activeViewMenu.$trigger);\n        } else {\n          this.$viewModeBtnContainer.appendTo(this.$toolbar);\n        }\n\n        for (var i = 0; i < this.sourceViewModes.length; i++) {\n          let sourceViewMode = this.sourceViewModes[i];\n\n          let $viewModeBtn = $('<button/>', {\n            type: 'button',\n            class:\n              'btn' +\n              (typeof sourceViewMode.className !== 'undefined'\n                ? ` ${sourceViewMode.className}`\n                : ''),\n            'data-view': sourceViewMode.mode,\n            'data-icon': sourceViewMode.icon,\n            'aria-label': sourceViewMode.title,\n            'aria-pressed': 'false',\n            title: sourceViewMode.title,\n          }).appendTo(this.$viewModeBtnContainer);\n\n          this.viewModeBtns[sourceViewMode.mode] = $viewModeBtn;\n\n          this.addListener(\n            $viewModeBtn,\n            'click',\n            {mode: sourceViewMode.mode},\n            function (ev) {\n              this.selectViewMode(ev.data.mode);\n              this.updateElements();\n            }\n          );\n        }\n      }\n\n      // Figure out which mode we should start with\n      var viewMode = this.getSelectedViewMode();\n\n      if (!viewMode || !this.doesSourceHaveViewMode(viewMode)) {\n        // Try to keep using the current view mode\n        if (this.viewMode && this.doesSourceHaveViewMode(this.viewMode)) {\n          viewMode = this.viewMode;\n        }\n        // Just use the first one\n        else {\n          viewMode = this.sourceViewModes[0].mode;\n        }\n      }\n\n      this.selectViewMode(viewMode);\n\n      this.updateSourceMenu();\n      this.updateViewMenu();\n      this.updateFilterBtn();\n\n      this.onSelectSource();\n\n      if (this.settings.context === 'index') {\n        const urlParams = Craft.getQueryParams();\n        urlParams.source = this.sourceKey;\n        Craft.setUrl(Craft.getUrl(Craft.path, urlParams));\n      }\n\n      return true;\n    },\n\n    selectSourceByKey: function (key) {\n      var $source = this.getSourceByKey(key);\n\n      if ($source) {\n        return this.selectSource($source);\n      } else {\n        return false;\n      }\n    },\n\n    /**\n     * Returns the available sort attributes for a source (or the selected root source)\n     * @param {jQuery} [$source]\n     * @returns {Object[]}\n     */\n    getSortOptions: function ($source) {\n      $source = $source || this.$rootSource;\n      const sortOptions = ($source ? $source.data('sort-opts') : null) || [];\n\n      // Make sure there's at least one non-structure attribute\n      if (!sortOptions.find((a) => a.attr !== 'structure')) {\n        sortOptions.push({\n          label: Craft.t('app', 'Title'),\n          attr: 'title',\n          defaultDir: 'asc',\n        });\n      }\n\n      return sortOptions;\n    },\n\n    /**\n     * Returns info about a sort attribute.\n     * @param {string} attribute\n     * @param {jQuery} [$source]\n     * @returns {?Object}\n     */\n    getSortOption: function (attribute, $source) {\n      return (\n        this.getSortOptions($source).find((o) => o.attr === attribute) || null\n      );\n    },\n\n    /**\n     * Returns the default sort attribute and direction for a source.\n     * @param {jQuery} [$source]\n     * @returns {string[]}\n     */\n    getDefaultSort: function ($source) {\n      $source = $source || this.$rootSource;\n      if ($source) {\n        let defaultSort = $source.data('default-sort');\n        if (defaultSort) {\n          if (typeof defaultSort === 'string') {\n            defaultSort = [defaultSort];\n          }\n\n          // Make sure it's valid\n          const sortOption = this.getSortOption(defaultSort[0], $source);\n          if (sortOption) {\n            // Fill in the default direction if it's not specified\n            if (!defaultSort[1]) {\n              defaultSort[1] = sortOption.defaultDir;\n            }\n\n            return defaultSort;\n          }\n        }\n      }\n\n      // Default to the first sort option\n      const sortOptions = this.getSortOptions($source);\n      return [sortOptions[0].attr, sortOptions[0].defaultDir];\n    },\n\n    /**\n     * Returns the available table columns for a source (or the selected root source)\n     * @param {jQuery} [$source]\n     * @returns {Object[]}\n     */\n    getTableColumnOptions: function ($source) {\n      $source = $source || this.$rootSource;\n      return ($source ? $source.data('table-col-opts') : null) || [];\n    },\n\n    /**\n     * Returns info about a table column.\n     * @param {string} attribute\n     * @param {jQuery} [$source]\n     * @returns {?Object}\n     */\n    getTableColumnOption: function (attribute, $source) {\n      return (\n        this.getTableColumnOptions($source).find((o) => o.attr === attribute) ||\n        null\n      );\n    },\n\n    /**\n     * Returns the default table columns for a source (or the selected root source)\n     * @param {jQuery} [$source]\n     * @returns {string[]}\n     */\n    getDefaultTableColumns: function ($source) {\n      $source = $source || this.$rootSource;\n      return ($source ? $source.data('default-table-cols') : null) || [];\n    },\n\n    /**\n     * Returns the selected sort attribute for a source\n     * @param {jQuery} [$source]\n     * @returns {string[]}\n     */\n    getSelectedTableColumns: function ($source) {\n      $source = $source || this.$rootSource;\n      if ($source) {\n        const attributes = this.getSourceState(\n          $source.data('key'),\n          'tableColumns'\n        );\n\n        if (attributes) {\n          // Only return the valid ones\n          return attributes.filter(\n            (a) => !!this.getTableColumnOption(a, $source)\n          );\n        }\n      }\n\n      return this.getDefaultTableColumns($source);\n    },\n\n    setSelectedTableColumns: function (attributes) {\n      this.setSelecetedSourceState({\n        tableColumns: attributes,\n      });\n\n      // Update the view menu\n      if (this.activeViewMenu) {\n        this.activeViewMenu.updateTableColumnField();\n      }\n    },\n\n    getViewModesForSource: function () {\n      var viewModes = [\n        {\n          mode: 'table',\n          title: Craft.t('app', 'Display in a table'),\n          icon: 'list',\n        },\n      ];\n\n      if (this.$source && Garnish.hasAttr(this.$source, 'data-has-thumbs')) {\n        viewModes.push({\n          mode: 'thumbs',\n          title: Craft.t('app', 'Display as thumbnails'),\n          icon: 'grid',\n        });\n      }\n\n      return viewModes;\n    },\n\n    doesSourceHaveViewMode: function (viewMode) {\n      for (var i = 0; i < this.sourceViewModes.length; i++) {\n        if (this.sourceViewModes[i].mode === viewMode) {\n          return true;\n        }\n      }\n\n      return false;\n    },\n\n    selectViewMode: function (viewMode, force) {\n      // Make sure that the current source supports it\n      if (!force && !this.doesSourceHaveViewMode(viewMode)) {\n        viewMode = this.sourceViewModes[0].mode;\n      }\n\n      // Has anything changed?\n      if (viewMode === this.viewMode) {\n        return;\n      }\n\n      // Deselect the previous view mode\n      if (\n        this.viewMode &&\n        typeof this.viewModeBtns[this.viewMode] !== 'undefined'\n      ) {\n        this.viewModeBtns[this.viewMode]\n          .removeClass('active')\n          .attr('aria-pressed', 'false');\n      }\n\n      this.viewMode = viewMode;\n      this.setSelecetedSourceState('mode', this.viewMode);\n\n      if (typeof this.viewModeBtns[this.viewMode] !== 'undefined') {\n        this.viewModeBtns[this.viewMode]\n          .addClass('active')\n          .attr('aria-pressed', 'true');\n      }\n    },\n\n    createView: function (mode, settings) {\n      var viewClass = this.getViewClass(mode);\n      return new viewClass(this, this.$elements, settings);\n    },\n\n    getViewClass: function (mode) {\n      switch (mode) {\n        case 'table':\n          return Craft.TableElementIndexView;\n        case 'thumbs':\n          return Craft.ThumbsElementIndexView;\n        default:\n          throw `View mode \"${mode}\" not supported.`;\n      }\n    },\n\n    rememberDisabledElementId: function (id) {\n      var index = $.inArray(id, this.settings.disabledElementIds);\n\n      if (index === -1) {\n        this.settings.disabledElementIds.push(id);\n      }\n    },\n\n    forgetDisabledElementId: function (id) {\n      var index = $.inArray(id, this.settings.disabledElementIds);\n\n      if (index !== -1) {\n        this.settings.disabledElementIds.splice(index, 1);\n      }\n    },\n\n    enableElements: function ($elements) {\n      $elements\n        .removeClass('disabled')\n        .parents('.disabled')\n        .removeClass('disabled');\n\n      for (var i = 0; i < $elements.length; i++) {\n        var id = $($elements[i]).data('id');\n        this.forgetDisabledElementId(id);\n      }\n\n      this.onEnableElements($elements);\n    },\n\n    disableElements: function ($elements) {\n      $elements.removeClass('sel').addClass('disabled');\n\n      for (var i = 0; i < $elements.length; i++) {\n        var id = $($elements[i]).data('id');\n        this.rememberDisabledElementId(id);\n      }\n\n      this.onDisableElements($elements);\n    },\n\n    getElementById: function (id) {\n      return this.view.getElementById(id);\n    },\n\n    enableElementsById: function (ids) {\n      ids = $.makeArray(ids);\n\n      for (var i = 0; i < ids.length; i++) {\n        var id = ids[i],\n          $element = this.getElementById(id);\n\n        if ($element && $element.length) {\n          this.enableElements($element);\n        } else {\n          this.forgetDisabledElementId(id);\n        }\n      }\n    },\n\n    disableElementsById: function (ids) {\n      ids = $.makeArray(ids);\n\n      for (var i = 0; i < ids.length; i++) {\n        var id = ids[i],\n          $element = this.getElementById(id);\n\n        if ($element && $element.length) {\n          this.disableElements($element);\n        } else {\n          this.rememberDisabledElementId(id);\n        }\n      }\n    },\n\n    selectElementAfterUpdate: function (id) {\n      if (this._autoSelectElements === null) {\n        this._autoSelectElements = [];\n      }\n\n      this._autoSelectElements.push(id);\n    },\n\n    addButton: function ($button) {\n      this.getButtonContainer().append($button);\n    },\n\n    isShowingSidebar: function () {\n      if (this.showingSidebar === null) {\n        this.showingSidebar =\n          this.$sidebar.length && !this.$sidebar.hasClass('hidden');\n      }\n\n      return this.showingSidebar;\n    },\n\n    getButtonContainer: function () {\n      // Is there a predesignated place where buttons should go?\n      if (this.settings.buttonContainer) {\n        return $(this.settings.buttonContainer);\n      } else {\n        var $container = $('#action-buttons');\n\n        if (!$container.length) {\n          $container = $('<div id=\"action-buttons\"/>').appendTo($('#header'));\n        }\n\n        return $container;\n      }\n    },\n\n    setIndexBusy: function () {\n      this.$elements.addClass('busy');\n      this.$updateSpinner.appendTo(this.$elements);\n      this.isIndexBusy = true;\n    },\n\n    setIndexAvailable: function () {\n      this.$elements.removeClass('busy');\n      this.$updateSpinner.remove();\n      this.isIndexBusy = false;\n    },\n\n    createCustomizeSourcesModal: function () {\n      // Recreate it each time\n      var modal = new Craft.CustomizeSourcesModal(this, {\n        onHide: function () {\n          modal.destroy();\n        },\n      });\n\n      return modal;\n    },\n\n    disable: function () {\n      if (this.sourceSelect) {\n        this.sourceSelect.disable();\n      }\n\n      if (this.view) {\n        this.view.disable();\n      }\n\n      this.base();\n    },\n\n    enable: function () {\n      if (this.sourceSelect) {\n        this.sourceSelect.enable();\n      }\n\n      if (this.view) {\n        this.view.enable();\n      }\n\n      this.base();\n    },\n\n    onAfterInit: function () {\n      this.settings.onAfterInit();\n      this.trigger('afterInit');\n    },\n\n    onSelectSource: function () {\n      this.settings.onSelectSource(this.sourceKey);\n      this.trigger('selectSource', {sourceKey: this.sourceKey});\n    },\n\n    onSelectSite: function () {\n      this.settings.onSelectSite(this.siteId);\n      this.trigger('selectSite', {siteId: this.siteId});\n    },\n\n    onUpdateElements: function () {\n      this.settings.onUpdateElements();\n      this.trigger('updateElements');\n    },\n\n    onSelectionChange: function () {\n      this.settings.onSelectionChange();\n      this.trigger('selectionChange');\n    },\n\n    onEnableElements: function ($elements) {\n      this.settings.onEnableElements($elements);\n      this.trigger('enableElements', {elements: $elements});\n    },\n\n    onDisableElements: function ($elements) {\n      this.settings.onDisableElements($elements);\n      this.trigger('disableElements', {elements: $elements});\n    },\n\n    onAfterAction: function (action, params) {\n      this.settings.onAfterAction(action, params);\n      this.trigger('afterAction', {action: action, params: params});\n    },\n\n    // UI state handlers\n    // -------------------------------------------------------------------------\n\n    _handleSourceSelectionChange: function () {\n      // If the selected source was just removed (maybe because its parent was collapsed),\n      // there won't be a selected source\n      if (!this.sourceSelect.totalSelected) {\n        this.sourceSelect.selectItem(this.$visibleSources.first());\n        return;\n      }\n\n      if (this.selectSource(this.sourceSelect.$selectedItems)) {\n        this.updateElements();\n      }\n    },\n\n    _handleActionTriggerSubmit: function (ev) {\n      ev.preventDefault();\n\n      var $form = $(ev.currentTarget);\n\n      // Make sure Craft.ElementActionTrigger isn't overriding this\n      if ($form.hasClass('disabled') || $form.data('custom-handler')) {\n        return;\n      }\n\n      this.submitAction($form.data('action'), Garnish.getPostData($form));\n    },\n\n    _handleMenuActionTriggerSubmit: function (ev) {\n      var $option = $(ev.option);\n\n      // Make sure Craft.ElementActionTrigger isn't overriding this\n      if ($option.hasClass('disabled') || $option.data('custom-handler')) {\n        return;\n      }\n\n      this.submitAction($option.data('action'));\n    },\n\n    _handleStatusChange: function (ev) {\n      this.statusMenu.$options.removeClass('sel');\n      var $option = $(ev.selectedOption).addClass('sel');\n      this.$statusMenuBtn.html($option.html());\n\n      this.trashed = false;\n      this.drafts = false;\n      this.status = null;\n      let queryParam = null;\n\n      if (Garnish.hasAttr($option, 'data-trashed')) {\n        this.trashed = true;\n        queryParam = 'trashed';\n      } else if (Garnish.hasAttr($option, 'data-drafts')) {\n        this.drafts = true;\n        queryParam = 'drafts';\n      } else {\n        this.status = queryParam = $option.data('status') || null;\n      }\n\n      if (this.activeViewMenu) {\n        this.activeViewMenu.updateSortField();\n      }\n\n      Craft.setQueryParam('status', queryParam);\n      this.updateElements();\n    },\n\n    _handleSiteChange: function (ev) {\n      this.siteMenu.$options.removeClass('sel');\n      var $option = $(ev.selectedOption).addClass('sel');\n      this.$siteMenuBtn.html($option.html());\n      this._setSite($option.data('site-id'));\n      this.onSelectSite();\n    },\n\n    _setSite: function (siteId) {\n      let firstSite = this.siteId === null;\n      this.siteId = siteId;\n\n      this.updateSourceVisibility();\n\n      if (\n        this.initialized &&\n        !firstSite &&\n        (!this.$source || !this.$source.length) &&\n        this.$visibleSources.length\n      ) {\n        this.selectSource(this.$visibleSources[0]);\n      }\n\n      // Hide any empty-nester headings\n      var $headings = this.getSourceContainer().children('.heading');\n      var $heading;\n\n      for (let i = 0; i < $headings.length; i++) {\n        $heading = $headings.eq(i);\n        if ($heading.has('> ul > li:not(.hidden)').length !== 0) {\n          $heading.removeClass('hidden');\n        } else {\n          $heading.addClass('hidden');\n        }\n      }\n\n      if (this.initialized) {\n        if (this.settings.context === 'index') {\n          // Remember this site for later\n          Craft.cp.setSiteId(siteId);\n        }\n\n        // Update the elements\n        this.updateElements();\n        this.updateFilterBtn();\n      }\n    },\n\n    updateSourceVisibility: function () {\n      this.$visibleSources = $();\n\n      for (let i = 0; i < this.$sources.length; i++) {\n        const $source = this.$sources.eq(i);\n\n        if (\n          !Garnish.hasAttr($source, 'data-disabled') &&\n          (typeof $source.data('sites') === 'undefined' ||\n            $source\n              .data('sites')\n              .toString()\n              .split(',')\n              .indexOf(this.siteId.toString()) !== -1)\n        ) {\n          $source.parent().removeClass('hidden');\n          this.$visibleSources = this.$visibleSources.add($source);\n        } else {\n          $source.parent().addClass('hidden');\n\n          // Is this the currently selected source?\n          if (this.$source && this.$source.get(0) === $source.get(0)) {\n            this.$source = null;\n            this.$rootSource = null;\n            this.sourceKey = null;\n            this.rootSourceKey = null;\n          }\n        }\n      }\n    },\n\n    _handleSelectionChange: function () {\n      this.updateActionTriggers();\n      this.onSelectionChange();\n    },\n\n    _handleSourceDblClick: function (ev) {\n      this._toggleSource($(ev.currentTarget));\n      ev.stopPropagation();\n    },\n\n    _handleSourceToggleClick: function (ev) {\n      this._toggleSource($(ev.currentTarget).prev('a'));\n      ev.stopPropagation();\n    },\n\n    // Source managemnet\n    // -------------------------------------------------------------------------\n\n    _getSourcesInList: function ($list, topLevel) {\n      let $sources = $list.find('> li:not(.heading) > a');\n      if (topLevel) {\n        $sources = $sources.add($list.find('> li.heading > ul > li > a'));\n      }\n      return $sources;\n    },\n\n    _getChildSources: function ($source) {\n      var $list = $source.siblings('ul');\n      return this._getSourcesInList($list);\n    },\n\n    _getSourceToggle: function ($source) {\n      return $source.siblings('.toggle');\n    },\n\n    _toggleSource: function ($source) {\n      if ($source.parent('li').hasClass('expanded')) {\n        this._collapseSource($source);\n      } else {\n        this._expandSource($source);\n      }\n    },\n\n    _expandSource: function ($source) {\n      $source.next('.toggle').attr({\n        'aria-expanded': 'true',\n        'aria-label': Craft.t('app', 'Hide nested sources'),\n      });\n      $source.parent('li').addClass('expanded');\n\n      var $childSources = this._getChildSources($source);\n      for (let i = 0; i < $childSources.length; i++) {\n        this.initSource($($childSources[i]));\n        if (this.$visibleSources) {\n          this.$visibleSources = this.$visibleSources.add($childSources[i]);\n        }\n      }\n\n      var key = $source.data('key');\n      if (this.instanceState.expandedSources.indexOf(key) === -1) {\n        this.instanceState.expandedSources.push(key);\n        this.storeInstanceState();\n      }\n    },\n\n    _collapseSource: function ($source) {\n      $source.next('.toggle').attr({\n        'aria-expanded': 'false',\n        'aria-label': Craft.t('app', 'Show nested sources'),\n      });\n      $source.parent('li').removeClass('expanded');\n\n      var $childSources = this._getChildSources($source);\n      for (let i = 0; i < $childSources.length; i++) {\n        this.deinitSource($($childSources[i]));\n        this.$visibleSources = this.$visibleSources.not($childSources[i]);\n      }\n\n      var i = this.instanceState.expandedSources.indexOf($source.data('key'));\n      if (i !== -1) {\n        this.instanceState.expandedSources.splice(i, 1);\n        this.storeInstanceState();\n      }\n    },\n\n    // View\n    // -------------------------------------------------------------------------\n\n    _isViewPaginated: function () {\n      return (\n        this.settings.context === 'index' &&\n        this.getSortAttributeAndDirection()[0] !== 'structure'\n      );\n    },\n\n    _updateView: function (params, response) {\n      // Cleanup\n      // -------------------------------------------------------------\n\n      // Get rid of the old action triggers regardless of whether the new batch has actions or not\n      if (this.actions) {\n        this.hideActionTriggers();\n        this.actions =\n          this.actionsHeadHtml =\n          this.actionsBodyHtml =\n          this._$triggers =\n            null;\n      }\n\n      // Capture the focused element, in case it's about to get removed from the DOM\n      const activeElement = document.activeElement;\n\n      // Update the count text\n      // -------------------------------------------------------------\n\n      if (this.$countContainer.length) {\n        this.$countSpinner.removeClass('hidden');\n        this.$countContainer.html('');\n\n        this._countResults()\n          .then((total) => {\n            this.$countSpinner.addClass('hidden');\n\n            let itemLabel = Craft.elementTypeNames[this.elementType]\n              ? Craft.elementTypeNames[this.elementType][2]\n              : this.settings.elementTypeName.toLowerCase();\n            let itemsLabel = Craft.elementTypeNames[this.elementType]\n              ? Craft.elementTypeNames[this.elementType][3]\n              : this.settings.elementTypePluralName.toLowerCase();\n\n            if (!this._isViewPaginated()) {\n              let countLabel = Craft.t(\n                'app',\n                '{total, number} {total, plural, =1{{item}} other{{items}}}',\n                {\n                  total: total,\n                  item: itemLabel,\n                  items: itemsLabel,\n                }\n              );\n              this.$countContainer.text(countLabel);\n            } else {\n              let first = Math.min(\n                this.settings.batchSize * (this.page - 1) + 1,\n                total\n              );\n              let last = Math.min(first + (this.settings.batchSize - 1), total);\n              let countLabel = Craft.t(\n                'app',\n                '{first, number}-{last, number} of {total, number} {total, plural, =1{{item}} other{{items}}}',\n                {\n                  first: first,\n                  last: last,\n                  total: total,\n                  item: itemLabel,\n                  items: itemsLabel,\n                }\n              );\n\n              let $paginationContainer = $(\n                '<div class=\"flex pagination\"/>'\n              ).appendTo(this.$countContainer);\n              let totalPages = Math.max(\n                Math.ceil(total / this.settings.batchSize),\n                1\n              );\n\n              const $paginationNav = $('<nav/>', {\n                class: 'flex',\n                'aria-label': Craft.t('app', '{element} pagination', {\n                  element: itemLabel,\n                }),\n              }).appendTo($paginationContainer);\n\n              let $prevBtn = $('<button/>', {\n                role: 'button',\n                class:\n                  'page-link prev-page' + (this.page > 1 ? '' : ' disabled'),\n                disabled: this.page === 1,\n                title: Craft.t('app', 'Previous Page'),\n              }).appendTo($paginationNav);\n              let $nextBtn = $('<button/>', {\n                role: 'button',\n                class:\n                  'page-link next-page' +\n                  (this.page < totalPages ? '' : ' disabled'),\n                disabled: this.page === totalPages,\n                title: Craft.t('app', 'Next Page'),\n              }).appendTo($paginationNav);\n\n              $('<div/>', {\n                class: 'page-info',\n                text: countLabel,\n              }).appendTo($paginationContainer);\n\n              if (this.page > 1) {\n                this.addListener($prevBtn, 'click', function () {\n                  this.removeListener($prevBtn, 'click');\n                  this.removeListener($nextBtn, 'click');\n                  this.setPage(this.page - 1);\n                  this.updateElements(true, true);\n                });\n              }\n\n              if (this.page < totalPages) {\n                this.addListener($nextBtn, 'click', function () {\n                  this.removeListener($prevBtn, 'click');\n                  this.removeListener($nextBtn, 'click');\n                  this.setPage(this.page + 1);\n                  this.updateElements(true, true);\n                });\n              }\n            }\n          })\n          .catch(() => {\n            this.$countSpinner.addClass('hidden');\n          });\n      }\n\n      // Update the view with the new container + elements HTML\n      // -------------------------------------------------------------\n\n      this.$elements.html(response.html);\n      Craft.appendHeadHtml(response.headHtml);\n      Craft.appendBodyHtml(response.bodyHtml);\n\n      // Batch actions setup\n      // -------------------------------------------------------------\n\n      this.$selectAllContainer = this.$elements.find(\n        '.selectallcontainer:first'\n      );\n\n      if (response.actions && response.actions.length) {\n        if (this.$selectAllContainer.length) {\n          this.actions = response.actions;\n          this.actionsHeadHtml = response.actionsHeadHtml;\n          this.actionsBodyHtml = response.actionsBodyHtml;\n\n          // Create the select all checkbox\n          this.$selectAllCheckbox = $('<div class=\"checkbox\"/>')\n            .prependTo(this.$selectAllContainer)\n            .attr({\n              role: 'checkbox',\n              tabindex: '0',\n              'aria-checked': 'false',\n              'aria-label': Craft.t('app', 'Select all'),\n            });\n\n          this.addListener(this.$selectAllCheckbox, 'click', function () {\n            if (this.view.getSelectedElements().length === 0) {\n              this.view.selectAllElements();\n            } else {\n              this.view.deselectAllElements();\n            }\n          });\n\n          this.addListener(this.$selectAllCheckbox, 'keydown', function (ev) {\n            if (ev.keyCode === Garnish.SPACE_KEY) {\n              ev.preventDefault();\n\n              $(ev.currentTarget).trigger('click');\n            }\n          });\n        }\n      } else {\n        if (!this.$selectAllContainer.siblings().length) {\n          this.$selectAllContainer.parent('.header').remove();\n        }\n        this.$selectAllContainer.remove();\n      }\n\n      // Exporters setup\n      // -------------------------------------------------------------\n\n      this.exporters = response.exporters;\n      this.exportersByType = Craft.index(this.exporters || [], (e) => e.type);\n\n      if (this.exporters && this.exporters.length) {\n        this.$exportBtn.removeClass('hidden');\n      } else {\n        this.$exportBtn.addClass('hidden');\n      }\n\n      // Create the view\n      // -------------------------------------------------------------\n\n      // Should we make the view selectable?\n      var selectable = this.actions || this.settings.selectable;\n\n      this.view = this.createView(this.getSelectedViewMode(), {\n        context: this.settings.context,\n        batchSize:\n          this.settings.context !== 'index' ||\n          this.getSortAttributeAndDirection()[0] === 'structure'\n            ? this.settings.batchSize\n            : null,\n        params: params,\n        selectable: selectable,\n        multiSelect: this.actions || this.settings.multiSelect,\n        checkboxMode: !!this.actions,\n        onSelectionChange: this._handleSelectionChange.bind(this),\n      });\n\n      // Refocus the previously-focused element\n      // -------------------------------------------------------------\n\n      if (\n        activeElement &&\n        activeElement.id &&\n        !document.body.contains(activeElement)\n      ) {\n        $(`#${activeElement.id}`).focus();\n      }\n\n      // Auto-select elements\n      // -------------------------------------------------------------\n\n      if (this._autoSelectElements) {\n        if (selectable) {\n          for (var i = 0; i < this._autoSelectElements.length; i++) {\n            this.view.selectElementById(this._autoSelectElements[i]);\n          }\n        }\n\n        this._autoSelectElements = null;\n      }\n\n      // Trigger the event\n      // -------------------------------------------------------------\n\n      this.onUpdateElements();\n    },\n\n    _updateBadgeCounts: function (badgeCounts) {\n      for (let sourceKey in badgeCounts) {\n        if (badgeCounts.hasOwnProperty(sourceKey)) {\n          const $source = this.getSourceByKey(sourceKey);\n          if ($source) {\n            let $badge = $source.children('.badge');\n            if (badgeCounts[sourceKey] !== null) {\n              if (!$badge.length) {\n                $badge = $('<span class=\"badge\"/>').appendTo($source);\n              }\n              $badge.text(badgeCounts[sourceKey]);\n            } else if ($badge) {\n              $badge.remove();\n            }\n          }\n        }\n      }\n    },\n\n    _countResults: function () {\n      return new Promise((resolve, reject) => {\n        if (this.totalResults !== null) {\n          resolve(this.totalResults);\n        } else {\n          var params = this.getViewParams();\n          delete params.criteria.offset;\n          delete params.criteria.limit;\n\n          // Make sure we've got an active result set ID\n          if (this.resultSet === null) {\n            this.resultSet = Math.floor(Math.random() * 100000000);\n          }\n          params.resultSet = this.resultSet;\n\n          Craft.sendActionRequest('POST', this.settings.countElementsAction, {\n            data: params,\n            cancelToken: this._createCancelToken(),\n          })\n            .then((response) => {\n              if (response.data.resultSet == this.resultSet) {\n                this.totalResults = response.data.count;\n                resolve(response.data.count);\n              } else {\n                reject();\n              }\n            })\n            .catch(reject);\n        }\n      });\n    },\n\n    _createTriggers: function () {\n      var triggers = [],\n        safeMenuActions = [],\n        destructiveMenuActions = [];\n\n      var i;\n\n      for (i = 0; i < this.actions.length; i++) {\n        var action = this.actions[i];\n\n        if (action.trigger) {\n          var $form = $(\n            '<form id=\"' +\n              Craft.formatInputId(action.type) +\n              '-actiontrigger\"/>'\n          )\n            .data('action', action)\n            .append(action.trigger);\n\n          this.addListener($form, 'submit', '_handleActionTriggerSubmit');\n          triggers.push($form);\n        } else {\n          if (!action.destructive) {\n            safeMenuActions.push(action);\n          } else {\n            destructiveMenuActions.push(action);\n          }\n        }\n      }\n\n      var $btn;\n\n      if (safeMenuActions.length || destructiveMenuActions.length) {\n        var $menuTrigger = $('<form/>');\n\n        $btn = $('<button/>', {\n          type: 'button',\n          class: 'btn menubtn',\n          'data-icon': 'settings',\n          title: Craft.t('app', 'Actions'),\n        }).appendTo($menuTrigger);\n\n        var $menu = $('<ul class=\"menu\"/>').appendTo($menuTrigger),\n          $safeList = this._createMenuTriggerList(safeMenuActions, false),\n          $destructiveList = this._createMenuTriggerList(\n            destructiveMenuActions,\n            true\n          );\n\n        if ($safeList) {\n          $safeList.appendTo($menu);\n        }\n\n        if ($safeList && $destructiveList) {\n          $('<hr/>').appendTo($menu);\n        }\n\n        if ($destructiveList) {\n          $destructiveList.appendTo($menu);\n        }\n\n        triggers.push($menuTrigger);\n      }\n\n      this._$triggers = $();\n\n      for (i = 0; i < triggers.length; i++) {\n        var $div = $('<div/>').append(triggers[i]);\n        this._$triggers = this._$triggers.add($div);\n      }\n\n      this._$triggers.appendTo(this.$actionsContainer);\n      Craft.appendHeadHtml(this.actionsHeadHtml);\n      Craft.appendBodyHtml(this.actionsBodyHtml);\n\n      Craft.initUiElements(this._$triggers);\n\n      if ($btn) {\n        $btn\n          .data('menubtn')\n          .on('optionSelect', this._handleMenuActionTriggerSubmit.bind(this));\n      }\n    },\n\n    _showExportHud: function () {\n      this.$exportBtn.addClass('active');\n      this.$exportBtn.attr('aria-expanded', 'true');\n\n      var $form = $('<form/>', {\n        class: 'export-form',\n      });\n\n      var typeOptions = [];\n      for (var i = 0; i < this.exporters.length; i++) {\n        typeOptions.push({\n          label: this.exporters[i].name,\n          value: this.exporters[i].type,\n        });\n      }\n      var $typeField = Craft.ui\n        .createSelectField({\n          label: Craft.t('app', 'Export Type'),\n          options: typeOptions,\n          class: 'fullwidth',\n        })\n        .appendTo($form);\n\n      var $formatField = Craft.ui\n        .createSelectField({\n          label: Craft.t('app', 'Format'),\n          options: [\n            {label: 'CSV', value: 'csv'},\n            {label: 'JSON', value: 'json'},\n            {label: 'XML', value: 'xml'},\n          ],\n          class: 'fullwidth',\n        })\n        .appendTo($form);\n\n      let $typeSelect = $typeField.find('select');\n      this.addListener($typeSelect, 'change', () => {\n        let type = $typeSelect.val();\n        if (this.exportersByType[type].formattable) {\n          $formatField.removeClass('hidden');\n        } else {\n          $formatField.addClass('hidden');\n        }\n      });\n      $typeSelect.trigger('change');\n\n      // Only show the Limit field if there aren't any selected elements\n      var selectedElementIds = this.view.getSelectedElementIds();\n\n      if (!selectedElementIds.length) {\n        var $limitField = Craft.ui\n          .createTextField({\n            label: Craft.t('app', 'Limit'),\n            placeholder: Craft.t('app', 'No limit'),\n            type: 'number',\n            min: 1,\n          })\n          .appendTo($form);\n      }\n\n      const $submitBtn = Craft.ui\n        .createSubmitButton({\n          class: 'fullwidth',\n          label: Craft.t('app', 'Export'),\n          spinner: true,\n        })\n        .appendTo($form);\n\n      var hud = new Garnish.HUD(this.$exportBtn, $form);\n\n      hud.on('hide', () => {\n        this.$exportBtn.removeClass('active');\n        this.$exportBtn.attr('aria-expanded', 'false');\n      });\n\n      var submitting = false;\n\n      this.addListener($form, 'submit', function (ev) {\n        ev.preventDefault();\n        if (submitting) {\n          return;\n        }\n\n        submitting = true;\n        $submitBtn.addClass('loading');\n\n        var params = this.getViewParams();\n        delete params.criteria.offset;\n        delete params.criteria.limit;\n        delete params.collapsedElementIds;\n\n        params.type = $typeField.find('select').val();\n        params.format = $formatField.find('select').val();\n\n        if (selectedElementIds.length) {\n          params.criteria.id = selectedElementIds;\n        } else {\n          var limit = parseInt($limitField.find('input').val());\n          if (limit && !isNaN(limit)) {\n            params.criteria.limit = limit;\n          }\n        }\n\n        if (Craft.csrfTokenValue) {\n          params[Craft.csrfTokenName] = Craft.csrfTokenValue;\n        }\n\n        Craft.downloadFromUrl(\n          'POST',\n          Craft.getActionUrl('element-indexes/export'),\n          params\n        )\n          .catch(() => {\n            if (!this._ignoreFailedRequest) {\n              Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n            }\n          })\n          .finally(() => {\n            submitting = false;\n            $submitBtn.removeClass('loading');\n          });\n      });\n    },\n\n    _createMenuTriggerList: function (actions, destructive) {\n      if (actions && actions.length) {\n        var $ul = $('<ul/>');\n\n        for (var i = 0; i < actions.length; i++) {\n          $('<li/>')\n            .append(\n              $('<a/>', {\n                id: Craft.formatInputId(actions[i].type) + '-actiontrigger',\n                class: destructive ? 'error' : null,\n                data: {\n                  action: actions[i],\n                },\n                text: actions[i].name,\n              })\n            )\n            .appendTo($ul);\n        }\n\n        return $ul;\n      }\n    },\n\n    showFilterHud: function () {\n      if (!this.filterHuds[this.siteId]) {\n        this.filterHuds[this.siteId] = {};\n      }\n      if (!this.filterHuds[this.siteId][this.sourceKey]) {\n        this.filterHuds[this.siteId][this.sourceKey] = new FilterHud(\n          this,\n          this.sourceKey,\n          this.siteId\n        );\n        this.updateFilterBtn();\n      } else {\n        this.filterHuds[this.siteId][this.sourceKey].show();\n      }\n    },\n\n    updateFilterBtn: function () {\n      this.$filterBtn.removeClass('active');\n\n      if (\n        this.filterHuds[this.siteId] &&\n        this.filterHuds[this.siteId][this.sourceKey]\n      ) {\n        this.$filterBtn\n          .attr(\n            'aria-controls',\n            this.filterHuds[this.siteId][this.sourceKey].id\n          )\n          .attr(\n            'aria-expanded',\n            this.filterHuds[this.siteId][this.sourceKey].showing\n              ? 'true'\n              : 'false'\n          );\n\n        if (\n          this.filterHuds[this.siteId][this.sourceKey].showing ||\n          this.filterHuds[this.siteId][this.sourceKey].hasRules()\n        ) {\n          this.$filterBtn.addClass('active');\n        }\n      } else {\n        this.$filterBtn.attr('aria-controls', null);\n      }\n    },\n  },\n  {\n    defaults: {\n      context: 'index',\n      modal: null,\n      storageKey: null,\n      condition: null,\n      criteria: null,\n      batchSize: 100,\n      disabledElementIds: [],\n      selectable: false,\n      multiSelect: false,\n      buttonContainer: null,\n      hideSidebar: false,\n      toolbarSelector: '.toolbar:first',\n      refreshSourcesAction: 'element-indexes/get-source-tree-html',\n      updateElementsAction: 'element-indexes/get-elements',\n      countElementsAction: 'element-indexes/count-elements',\n      submitActionsAction: 'element-indexes/perform-action',\n      defaultSiteId: null,\n      defaultSource: null,\n      canHaveDrafts: false,\n\n      elementTypeName: Craft.t('app', 'Element'),\n      elementTypePluralName: Craft.t('app', 'Elements'),\n\n      onAfterInit: $.noop,\n      onSelectSource: $.noop,\n      onSelectSite: $.noop,\n      onUpdateElements: $.noop,\n      onSelectionChange: $.noop,\n      onEnableElements: $.noop,\n      onDisableElements: $.noop,\n      onAfterAction: $.noop,\n    },\n  }\n);\n\nconst ViewMenu = Garnish.Base.extend({\n  elementIndex: null,\n  $source: null,\n  sourceKey: null,\n  menu: null,\n  id: null,\n\n  $trigger: null,\n  $container: null,\n  $sortAttributeSelect: null,\n  $sortDirectionPicker: null,\n  sortDirectionListbox: null,\n  $tableColumnsContainer: null,\n  $revertContainer: null,\n  $revertBtn: null,\n  $closeBtn: null,\n\n  init: function (elementIndex, $source) {\n    this.elementIndex = elementIndex;\n    this.$source = $source;\n    this.sourceKey = $source.data('key');\n    this.id = `view-menu-${Math.floor(Math.random() * 1000000000)}`;\n\n    this.$trigger = $('<button/>', {\n      type: 'button',\n      class: 'btn menubtn hidden',\n      text: Craft.t('app', 'View'),\n      'aria-label': Craft.t('app', 'View settings'),\n      'aria-controls': this.id,\n      'data-icon': 'sliders',\n    }).appendTo(this.elementIndex.$toolbar);\n\n    this.$container = $('<div/>', {\n      id: this.id,\n      class: 'menu menu--disclosure element-index-view-menu',\n      'data-align': 'right',\n    }).appendTo(Garnish.$bod);\n\n    this._buildMenu();\n\n    this.addListener(this.$container, 'mousedown', (ev) => {\n      ev.stopPropagation();\n    });\n\n    this.menu = new Garnish.DisclosureMenu(this.$trigger);\n\n    this.menu.on('show', () => {\n      this.$trigger.addClass('active');\n    });\n\n    this.menu.on('hide', () => {\n      this.$trigger.removeClass('active');\n\n      // Move all checked table column checkboxes to the top once it's fully faded out\n      setTimeout(() => {\n        this.tidyTableColumnField();\n      }, Garnish.FX_DURATION);\n    });\n  },\n\n  showTrigger: function () {\n    this.$trigger.removeClass('hidden');\n  },\n\n  hideTrigger: function () {\n    this.$trigger.data('trigger').hide();\n    this.$trigger.addClass('hidden');\n    this.menu.hide();\n  },\n\n  updateSortField: function () {\n    let [attribute, direction] =\n      this.elementIndex.getSortAttributeAndDirection();\n\n    // Add/remove a score option\n    const $scoreOption = this.$sortAttributeSelect.children(\n      'option[value=\"score\"]'\n    );\n\n    // If searching by score, just keep showing the actual selection\n    if (this.elementIndex.searching) {\n      if (!$scoreOption.length) {\n        this.$sortAttributeSelect.prepend(\n          $('<option/>', {\n            value: 'score',\n            text: Craft.t('app', 'Score'),\n          })\n        );\n      }\n    } else if ($scoreOption.length) {\n      $scoreOption.remove();\n    }\n\n    this.$sortAttributeSelect.val(attribute);\n    this.sortDirectionListbox.select(direction === 'asc' ? 0 : 1);\n\n    if (['structure', 'score'].includes(attribute)) {\n      this.sortDirectionListbox.disable();\n      this.$sortDirectionPicker.addClass('disabled');\n    } else {\n      this.sortDirectionListbox.enable();\n      this.$sortDirectionPicker.removeClass('disabled');\n    }\n\n    if (!this.elementIndex.canSortByStructure()) {\n      this.$sortAttributeSelect\n        .children('option[value=\"structure\"]')\n        .attr('disabled', 'disabled');\n    } else {\n      this.$sortAttributeSelect\n        .children('option[value=\"structure\"]')\n        .removeAttr('disabled');\n    }\n  },\n\n  updateTableColumnField: function () {\n    const attributes = this.elementIndex.getSelectedTableColumns();\n    let $lastContainer, lastIndex;\n\n    attributes.forEach((attribute) => {\n      const $checkbox = this.$tableColumnsContainer.find(\n        `input[value=\"${attribute}\"]`\n      );\n      if (!$checkbox.prop('checked')) {\n        $checkbox.prop('checked', true);\n      }\n      const $container = $checkbox.parent();\n\n      // Do we need to move it up?\n      if ($lastContainer && $container.index() < lastIndex) {\n        $container.insertAfter($lastContainer);\n      }\n\n      $lastContainer = $container;\n      lastIndex = $container.index();\n    });\n\n    // See if we need to uncheck any checkboxes\n    const $checkboxes = this._getTableColumnCheckboxes();\n    for (let i = 0; i < $checkboxes.length; i++) {\n      const $checkbox = $checkboxes.eq(i);\n      if ($checkbox.prop('checked') && !attributes.includes($checkbox.val())) {\n        $checkbox.prop('checked', false);\n      }\n    }\n  },\n\n  tidyTableColumnField: function () {\n    const defaultOrder = this.elementIndex\n      .getTableColumnOptions(this.$source)\n      .map((column) => column.attr)\n      .reduce((obj, attr, index) => {\n        return {...obj, [attr]: index};\n      }, {});\n\n    this.$tableColumnsContainer\n      .children()\n      .sort((a, b) => {\n        const checkboxA = $(a).children('input[type=\"checkbox\"]')[0];\n        const checkboxB = $(b).children('input[type=\"checkbox\"]')[0];\n        if (checkboxA.checked && checkboxB.checked) {\n          return 0;\n        }\n        if (checkboxA.checked || checkboxB.checked) {\n          return checkboxA.checked ? -1 : 1;\n        }\n        return defaultOrder[checkboxA.value] < defaultOrder[checkboxB.value]\n          ? -1\n          : 1;\n      })\n      .appendTo(this.$tableColumnsContainer);\n  },\n\n  revert: function () {\n    this.elementIndex.setSelecetedSourceState({\n      order: null,\n      sort: null,\n      tableColumns: null,\n    });\n\n    this.updateSortField();\n    this.updateTableColumnField();\n    this.tidyTableColumnField();\n\n    this.$revertBtn.remove();\n    this.$revertBtn = null;\n\n    this.$closeBtn.focus();\n    this.elementIndex.updateElements();\n  },\n\n  _buildMenu: function () {\n    const $metaContainer = $('<div class=\"meta\"/>').appendTo(this.$container);\n    this._createSortField().appendTo($metaContainer);\n    this._createTableColumnsField().appendTo($metaContainer);\n\n    this.$sortAttributeSelect.focus();\n\n    const $footerContainer = $('<div/>', {\n      class: 'flex menu-footer',\n    }).appendTo(this.$container);\n\n    this.$revertContainer = $('<div/>', {\n      class: 'flex-grow',\n    }).appendTo($footerContainer);\n\n    // Only create the revert button if there's a custom view state\n    if (\n      this.elementIndex.getSelectedSourceState('order') ||\n      this.elementIndex.getSelectedSourceState('sort') ||\n      this.elementIndex.getSelectedSourceState('tableColumns')\n    ) {\n      this._createRevertBtn();\n    }\n\n    this.$closeBtn = $('<button/>', {\n      type: 'button',\n      class: 'btn',\n      text: Craft.t('app', 'Close'),\n    })\n      .appendTo($footerContainer)\n      .on('click', () => {\n        this.menu.hide();\n      });\n  },\n\n  _createSortField: function () {\n    const $container = $('<div class=\"flex\"/>');\n\n    const $sortAttributeSelectContainer = Craft.ui\n      .createSelect({\n        options: this.elementIndex.getSortOptions(this.$source).map((o) => {\n          return {\n            label: o.label,\n            value: o.attr,\n          };\n        }),\n      })\n      .addClass('fullwidth')\n      .appendTo($('<div class=\"flex-grow\"/>').appendTo($container));\n\n    this.$sortAttributeSelect = $sortAttributeSelectContainer\n      .children('select')\n      .attr({\n        'aria-label': Craft.t('app', 'Sort attribute'),\n      });\n\n    this.$sortDirectionPicker = $('<section/>', {\n      class: 'btngroup btngroup--exclusive',\n      'aria-label': Craft.t('app', 'Sort direction'),\n    })\n      .append(\n        $('<button/>', {\n          type: 'button',\n          class: 'btn',\n          title: Craft.t('app', 'Sort ascending'),\n          'aria-label': Craft.t('app', 'Sort ascending'),\n          'aria-pressed': 'false',\n          'data-icon': 'asc',\n          'data-dir': 'asc',\n        })\n      )\n      .append(\n        $('<button/>', {\n          type: 'button',\n          class: 'btn',\n          title: Craft.t('app', 'Sort descending'),\n          'aria-label': Craft.t('app', 'Sort descending'),\n          'aria-pressed': 'false',\n          'data-icon': 'desc',\n          'data-dir': 'desc',\n        })\n      )\n      .appendTo($container);\n\n    this.sortDirectionListbox = new Craft.Listbox(this.$sortDirectionPicker, {\n      onChange: ($selectedOption) => {\n        const direction = $selectedOption.data('dir');\n        if (direction !== this.elementIndex.getSelectedSortDirection()) {\n          this.elementIndex.setSelectedSortAttribute(\n            this.$sortAttributeSelect.val(),\n            $selectedOption.data('dir')\n          );\n          this.elementIndex.updateElements();\n          this._createRevertBtn();\n        }\n      },\n    });\n\n    this.$sortAttributeSelect.on('change', () => {\n      this.elementIndex.setSelectedSortAttribute(\n        this.$sortAttributeSelect.val(),\n        null,\n        false\n      );\n      this.elementIndex.updateElements();\n      this._createRevertBtn();\n    });\n\n    this.updateSortField();\n\n    const $field = Craft.ui.createField($container, {\n      label: Craft.t('app', 'Sort by'),\n      fieldset: true,\n    });\n    $field.addClass('sort-field');\n    return $field;\n  },\n\n  _getTableColumnCheckboxes: function () {\n    return this.$tableColumnsContainer.find('input[type=\"checkbox\"]');\n  },\n\n  _createTableColumnsField: function () {\n    const columns = this.elementIndex.getTableColumnOptions(this.$source);\n\n    if (!columns.length) {\n      return $();\n    }\n\n    this.$tableColumnsContainer = $('<div/>');\n\n    columns.forEach((column) => {\n      $('<div class=\"element-index-view-menu-table-column\"/>')\n        .append('<div class=\"icon move\"/>')\n        .append(\n          Craft.ui.createCheckbox({\n            label: Craft.escapeHtml(column.label),\n            value: column.attr,\n          })\n        )\n        .appendTo(this.$tableColumnsContainer);\n    });\n\n    this.updateTableColumnField();\n    this.tidyTableColumnField();\n\n    new Garnish.DragSort(this.$tableColumnsContainer.children(), {\n      handle: '.move',\n      axis: 'y',\n      onSortChange: () => {\n        this._onTableColumnChange();\n      },\n    });\n\n    this._getTableColumnCheckboxes().on('change', (ev) => {\n      this._onTableColumnChange();\n    });\n\n    const $field = Craft.ui.createField(this.$tableColumnsContainer, {\n      label: Craft.t('app', 'Table Columns'),\n      fieldset: true,\n    });\n    $field.addClass('table-columns-field');\n    return $field;\n  },\n\n  _onTableColumnChange: function () {\n    const columns = [];\n    const $selectedCheckboxes =\n      this._getTableColumnCheckboxes().filter(':checked');\n    for (let i = 0; i < $selectedCheckboxes.length; i++) {\n      columns.push($selectedCheckboxes.eq(i).val());\n    }\n\n    // Only commit the change if it's different from the current column selections\n    // (maybe an unchecked column was dragged, etc.)\n    if (\n      Craft.compare(\n        columns,\n        this.elementIndex.getSelectedTableColumns(this.$source)\n      )\n    ) {\n      return;\n    }\n\n    this.elementIndex.setSelectedTableColumns(columns, false);\n    this.elementIndex.updateElements();\n    this._createRevertBtn();\n  },\n\n  _createRevertBtn: function () {\n    if (this.$revertBtn) {\n      return;\n    }\n\n    this.$revertBtn = $('<button/>', {\n      type: 'button',\n      class: 'light',\n      text: Craft.t('app', 'Use defaults'),\n    })\n      .appendTo(this.$revertContainer)\n      .on('click', () => {\n        this.revert();\n      });\n  },\n\n  destroy: function () {\n    this.menu.destroy();\n    delete this.menu;\n    this.base();\n  },\n});\n\nconst FilterHud = Garnish.HUD.extend({\n  elementIndex: null,\n  sourceKey: null,\n  siteId: null,\n  id: null,\n  loading: true,\n  serialized: null,\n  $clearBtn: null,\n  cleared: false,\n\n  init: function (elementIndex, sourceKey, siteId) {\n    this.elementIndex = elementIndex;\n    this.sourceKey = sourceKey;\n    this.siteId = siteId;\n    this.id = `filter-${Math.floor(Math.random() * 1000000000)}`;\n\n    const $loadingContent = $('<div/>')\n      .append(\n        $('<div/>', {\n          class: 'spinner',\n        })\n      )\n      .append(\n        $('<div/>', {\n          text: Craft.t('app', 'Loading'),\n          class: 'visually-hidden',\n          'aria-role': 'alert',\n        })\n      );\n\n    this.base(this.elementIndex.$filterBtn, $loadingContent, {\n      hudClass: 'hud element-filter-hud loading',\n    });\n\n    this.$hud.attr({\n      id: this.id,\n      'aria-live': 'polite',\n      'aria-busy': 'false',\n    });\n    this.$tip.remove();\n    this.$tip = null;\n\n    this.$body.on('submit', (ev) => {\n      ev.preventDefault();\n      this.hide();\n    });\n\n    Craft.sendActionRequest('POST', 'element-indexes/filter-hud', {\n      data: {\n        elementType: this.elementIndex.elementType,\n        source: this.sourceKey,\n        condition: this.elementIndex.settings.condition,\n        id: `${this.id}-filters`,\n      },\n    })\n      .then((response) => {\n        this.loading = false;\n        this.$hud.removeClass('loading');\n        $loadingContent.remove();\n\n        this.$main.append(response.data.hudHtml);\n        Craft.appendHeadHtml(response.data.headHtml);\n        Craft.appendBodyHtml(response.data.bodyHtml);\n\n        const $btnContainer = $('<div/>', {\n          class: 'flex flex-nowrap',\n        }).appendTo(this.$main);\n        $('<div/>', {\n          class: 'flex-grow',\n        }).appendTo($btnContainer);\n        this.$clearBtn = $('<button/>', {\n          type: 'button',\n          class: 'btn',\n          text: Craft.t('app', 'Cancel'),\n        }).appendTo($btnContainer);\n        $('<button/>', {\n          type: 'submit',\n          class: 'btn secondary',\n          text: Craft.t('app', 'Apply'),\n        }).appendTo($btnContainer);\n        this.$clearBtn.on('click', () => {\n          this.clear();\n        });\n\n        this.$hud.find('.condition-container').on('htmx:beforeRequest', () => {\n          this.setBusy();\n        });\n\n        this.$hud.find('.condition-container').on('htmx:load', () => {\n          this.setReady();\n        });\n        this.setFocus();\n      })\n      .catch(() => {\n        Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n      });\n\n    this.$hud.css('position', 'fixed');\n\n    this.addListener(Garnish.$win, 'scroll,resize', () => {\n      this.updateSizeAndPosition(true);\n    });\n  },\n\n  addListener: function (elem, events, data, func) {\n    if (elem === this.$main && events === 'resize') {\n      return;\n    }\n    this.base(elem, events, data, func);\n  },\n\n  setBusy: function () {\n    this.$hud.attr('aria-busy', 'true');\n\n    $('<div/>', {\n      class: 'visually-hidden',\n      text: Craft.t('app', 'Loading'),\n    }).insertAfter(this.$main.find('.htmx-indicator'));\n  },\n\n  setReady: function () {\n    this.$hud.attr('aria-busy', 'false');\n  },\n\n  setFocus: function () {\n    Garnish.setFocusWithin(this.$main);\n  },\n\n  clear: function () {\n    this.cleared = true;\n    this.hide();\n  },\n\n  updateSizeAndPositionInternal: function () {\n    // const searchOffset = this.elementIndex.$searchContainer.offset();\n    const searchOffset =\n      this.elementIndex.$searchContainer[0].getBoundingClientRect();\n\n    this.$hud.css({\n      width: this.elementIndex.$searchContainer.outerWidth() - 2,\n      top: searchOffset.top + this.elementIndex.$searchContainer.outerHeight(),\n      left: searchOffset.left + 1,\n    });\n  },\n\n  onShow: function () {\n    this.base();\n\n    // Cancel => Clear\n    if (this.$clearBtn) {\n      this.$clearBtn.text(Craft.t('app', 'Clear'));\n    }\n\n    this.elementIndex.updateFilterBtn();\n    this.setFocus();\n  },\n\n  onHide: function () {\n    this.base();\n\n    // If something changed, update the elements\n    if (this.serialized !== (this.serialized = this.serialize())) {\n      this.elementIndex.updateElements();\n    }\n\n    if (this.cleared) {\n      this.destroy();\n    } else {\n      this.$hud.detach();\n      this.$shade.detach();\n    }\n\n    this.elementIndex.updateFilterBtn();\n    this.elementIndex.$filterBtn.focus();\n  },\n\n  hasRules: function () {\n    return this.$main.has('.condition-rule').length !== 0;\n  },\n\n  serialize: function () {\n    return !this.cleared && this.hasRules() ? this.$body.serialize() : null;\n  },\n\n  destroy: function () {\n    this.base();\n    delete this.elementIndex.filterHuds[this.siteId][this.sourceKey];\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Base Element Index View\n */\nCraft.BaseElementIndexView = Garnish.Base.extend(\n  {\n    $container: null,\n    $loadingMoreSpinner: null,\n    $elementContainer: null,\n    $scroller: null,\n\n    elementIndex: null,\n    thumbLoader: null,\n    elementSelect: null,\n\n    loadingMore: false,\n\n    _totalVisible: null,\n    _morePending: null,\n    _handleEnableElements: null,\n    _handleDisableElements: null,\n\n    init: function (elementIndex, container, settings) {\n      this.elementIndex = elementIndex;\n      this.$container = $(container);\n      this.setSettings(settings, Craft.BaseElementIndexView.defaults);\n\n      // Create a \"loading-more\" spinner\n      this.$loadingMoreSpinner = $(\n        '<div class=\"centeralign hidden\">' +\n          '<div class=\"spinner loadingmore\"></div>' +\n          '</div>'\n      ).insertAfter(this.$container);\n\n      // Get the actual elements container and its child elements\n      this.$elementContainer = this.getElementContainer();\n      var $elements = this.$elementContainer.children();\n\n      this.setTotalVisible($elements.length);\n      this.setMorePending(\n        this.settings.batchSize && $elements.length == this.settings.batchSize\n      );\n\n      // Instantiate the thumb loader\n      this.thumbLoader = new Craft.ElementThumbLoader();\n      this.thumbLoader.load($elements);\n\n      if (this.settings.selectable) {\n        this.elementSelect = new Garnish.Select(\n          this.$elementContainer,\n          $elements.filter(':not(.disabled)'),\n          {\n            multi: this.settings.multiSelect,\n            vertical: this.isVerticalList(),\n            handle:\n              this.settings.context === 'index'\n                ? '.checkbox, .element:first'\n                : null,\n            filter: ':not(a):not(.toggle)',\n            checkboxMode: this.settings.checkboxMode,\n            onSelectionChange: this.onSelectionChange.bind(this),\n          }\n        );\n\n        this._handleEnableElements = (ev) => {\n          this.elementSelect.addItems(ev.elements);\n        };\n\n        this._handleDisableElements = (ev) => {\n          this.elementSelect.removeItems(ev.elements);\n        };\n\n        this.elementIndex.on('enableElements', this._handleEnableElements);\n        this.elementIndex.on('disableElements', this._handleDisableElements);\n      }\n\n      // Enable inline element editing if this is an index page\n      if (this.settings.context === 'index') {\n        this._handleElementEditing = (ev) => {\n          var $target = $(ev.target);\n\n          if ($target.prop('nodeName') === 'A') {\n            // Let the link do its thing\n            return;\n          }\n\n          var $element;\n\n          if ($target.hasClass('element')) {\n            $element = $target;\n          } else {\n            $element = $target.closest('.element');\n\n            if (!$element.length) {\n              return;\n            }\n          }\n\n          if (Garnish.hasAttr($element, 'data-editable')) {\n            Craft.createElementEditor($element.data('type'), $element);\n          }\n        };\n\n        if (!this.elementIndex.trashed) {\n          this.addListener(\n            this.$elementContainer,\n            'dblclick',\n            this._handleElementEditing\n          );\n          if ($.isTouchCapable()) {\n            this.addListener(\n              this.$elementContainer,\n              'taphold',\n              this._handleElementEditing\n            );\n          }\n        }\n      }\n\n      // Give sub-classes a chance to do post-initialization stuff here\n      this.afterInit();\n\n      // Set up lazy-loading\n      if (this.settings.batchSize) {\n        if (this.settings.context === 'index') {\n          this.$scroller = Garnish.$scrollContainer;\n        } else {\n          this.$scroller = this.elementIndex.$main;\n        }\n\n        this.$scroller.scrollTop(0);\n        this.addListener(this.$scroller, 'scroll', 'maybeLoadMore');\n        this.maybeLoadMore();\n      }\n    },\n\n    getElementContainer: function () {\n      throw 'Classes that extend Craft.BaseElementIndexView must supply a getElementContainer() method.';\n    },\n\n    afterInit: function () {},\n\n    getAllElements: function () {\n      return this.$elementContainer.children();\n    },\n\n    getEnabledElements: function () {\n      return this.$elementContainer.children(':not(.disabled)');\n    },\n\n    getElementById: function (id) {\n      var $element = this.$elementContainer.children(\n        '[data-id=\"' + id + '\"]:first'\n      );\n\n      if ($element.length) {\n        return $element;\n      } else {\n        return null;\n      }\n    },\n\n    getSelectedElements: function () {\n      if (!this.elementSelect) {\n        throw 'This view is not selectable.';\n      }\n\n      return this.elementSelect.$selectedItems;\n    },\n\n    getSelectedElementIds: function () {\n      let $selectedElements;\n      try {\n        $selectedElements = this.getSelectedElements();\n      } catch (e) {}\n\n      let ids = [];\n      if ($selectedElements) {\n        for (var i = 0; i < $selectedElements.length; i++) {\n          ids.push($selectedElements.eq(i).data('id'));\n        }\n      }\n      return ids;\n    },\n\n    selectElement: function ($element) {\n      if (!this.elementSelect) {\n        throw 'This view is not selectable.';\n      }\n\n      this.elementSelect.selectItem($element, true);\n      return true;\n    },\n\n    selectElementById: function (id) {\n      if (!this.elementSelect) {\n        throw 'This view is not selectable.';\n      }\n\n      var $element = this.getElementById(id);\n\n      if ($element) {\n        this.elementSelect.selectItem($element, true);\n        return true;\n      } else {\n        return false;\n      }\n    },\n\n    selectAllElements: function () {\n      this.elementSelect.selectAll();\n    },\n\n    deselectAllElements: function () {\n      this.elementSelect.deselectAll();\n    },\n\n    isVerticalList: function () {\n      return false;\n    },\n\n    getTotalVisible: function () {\n      return this._totalVisible;\n    },\n\n    setTotalVisible: function (totalVisible) {\n      this._totalVisible = totalVisible;\n    },\n\n    getMorePending: function () {\n      return this._morePending;\n    },\n\n    setMorePending: function (morePending) {\n      this._morePending = morePending;\n    },\n\n    /**\n     * Checks if the user has reached the bottom of the scroll area, and if so, loads the next batch of elemets.\n     */\n    maybeLoadMore: function () {\n      if (this.canLoadMore()) {\n        this.loadMore();\n      }\n    },\n\n    /**\n     * Returns whether the user has reached the bottom of the scroll area.\n     */\n    canLoadMore: function () {\n      if (!this.getMorePending() || !this.settings.batchSize) {\n        return false;\n      }\n\n      // Check if the user has reached the bottom of the scroll area\n      var containerHeight;\n\n      if (this.$scroller[0] === Garnish.$win[0]) {\n        var winHeight = Garnish.$win.innerHeight(),\n          winScrollTop = Garnish.$win.scrollTop(),\n          containerOffset = this.$container.offset().top;\n        containerHeight = this.$container.height();\n\n        return winHeight + winScrollTop >= containerOffset + containerHeight;\n      } else {\n        var containerScrollHeight = this.$scroller.prop('scrollHeight'),\n          containerScrollTop = this.$scroller.scrollTop();\n        containerHeight = this.$scroller.outerHeight();\n\n        return (\n          containerScrollHeight - containerScrollTop <= containerHeight + 15\n        );\n      }\n    },\n\n    /**\n     * Loads the next batch of elements.\n     */\n    loadMore: function () {\n      if (\n        !this.getMorePending() ||\n        this.loadingMore ||\n        !this.settings.batchSize\n      ) {\n        return;\n      }\n\n      this.loadingMore = true;\n      this.$loadingMoreSpinner.removeClass('hidden');\n      this.removeListener(this.$scroller, 'scroll');\n\n      Craft.sendActionRequest('POST', this.settings.loadMoreElementsAction, {\n        data: this.getLoadMoreParams(),\n      })\n        .then((response) => {\n          this.loadingMore = false;\n          this.$loadingMoreSpinner.addClass('hidden');\n\n          let $newElements = $(response.data.html);\n\n          this.appendElements($newElements);\n          Craft.appendHeadHtml(response.data.headHtml);\n          Craft.appendBodyHtml(response.data.bodyHtml);\n\n          if (this.elementSelect) {\n            this.elementSelect.addItems($newElements.filter(':not(.disabled)'));\n            this.elementIndex.updateActionTriggers();\n          }\n\n          this.setTotalVisible(this.getTotalVisible() + $newElements.length);\n          this.setMorePending($newElements.length == this.settings.batchSize);\n\n          // Is there room to load more right now?\n          this.addListener(this.$scroller, 'scroll', 'maybeLoadMore');\n          this.maybeLoadMore();\n        })\n        .catch((e) => {\n          this.loadingMore = false;\n          this.$loadingMoreSpinner.addClass('hidden');\n        });\n    },\n\n    getLoadMoreParams: function () {\n      // Use the same params that were passed when initializing this view\n      var params = $.extend(true, {}, this.settings.params);\n      params.criteria.offset = this.getTotalVisible();\n      return params;\n    },\n\n    appendElements: function ($newElements) {\n      $newElements.appendTo(this.$elementContainer);\n      this.thumbLoader.load($newElements);\n      this.onAppendElements($newElements);\n    },\n\n    onAppendElements: function ($newElements) {\n      this.settings.onAppendElements($newElements);\n      this.trigger('appendElements', {\n        newElements: $newElements,\n      });\n    },\n\n    onSelectionChange: function () {\n      this.settings.onSelectionChange();\n      this.trigger('selectionChange');\n    },\n\n    disable: function () {\n      if (this.elementSelect) {\n        this.elementSelect.disable();\n      }\n    },\n\n    enable: function () {\n      if (this.elementSelect) {\n        this.elementSelect.enable();\n      }\n    },\n\n    destroy: function () {\n      // Remove the \"loading-more\" spinner, since we added that outside of the view container\n      this.$loadingMoreSpinner.remove();\n\n      // Kill the thumb loader\n      this.thumbLoader.destroy();\n      delete this.thumbLoader;\n\n      // Delete the element select\n      if (this.elementSelect) {\n        this.elementIndex.off('enableElements', this._handleEnableElements);\n        this.elementIndex.off('disableElements', this._handleDisableElements);\n\n        this.elementSelect.destroy();\n        delete this.elementSelect;\n      }\n\n      this.base();\n    },\n  },\n  {\n    defaults: {\n      context: 'index',\n      batchSize: null,\n      params: null,\n      selectable: false,\n      multiSelect: false,\n      checkboxMode: false,\n      loadMoreElementsAction: 'element-indexes/get-more-elements',\n      onAppendElements: $.noop,\n      onSelectionChange: $.noop,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element Select input\n */\nCraft.BaseElementSelectInput = Garnish.Base.extend(\n  {\n    thumbLoader: null,\n    elementSelect: null,\n    elementSort: null,\n    modal: null,\n    elementEditor: null,\n\n    fieldLabel: null,\n\n    $container: null,\n    $form: null,\n    $elementsContainer: null,\n    $elements: null,\n    $addElementBtn: null,\n    $spinner: null,\n\n    _initialized: false,\n\n    init: function (settings) {\n      // Normalize the settings and set them\n      // ---------------------------------------------------------------------\n\n      // Are they still passing in a bunch of arguments?\n      if (!$.isPlainObject(settings)) {\n        // Loop through all of the old arguments and apply them to the settings\n        var normalizedSettings = {},\n          args = [\n            'id',\n            'name',\n            'elementType',\n            'sources',\n            'criteria',\n            'sourceElementId',\n            'limit',\n            'modalStorageKey',\n            'fieldId',\n          ];\n\n        for (var i = 0; i < args.length; i++) {\n          if (typeof arguments[i] !== 'undefined') {\n            normalizedSettings[args[i]] = arguments[i];\n          } else {\n            break;\n          }\n        }\n\n        settings = normalizedSettings;\n      }\n\n      this.setSettings(settings, Craft.BaseElementSelectInput.defaults);\n\n      // Apply the storage key prefix\n      if (this.settings.modalStorageKey) {\n        this.modalStorageKey =\n          'BaseElementSelectInput.' + this.settings.modalStorageKey;\n      }\n\n      // No reason for this to be sortable if we're only allowing 1 selection\n      if (this.settings.limit == 1 || this.settings.maintainHierarchy) {\n        this.settings.sortable = false;\n      }\n\n      this.$container = this.getContainer();\n      this.$form = this.$container.closest('form');\n      this.fieldLabel = this.getFieldLabel();\n\n      // Store a reference to this class\n      this.$container.data('elementSelect', this);\n\n      this.$elementsContainer = this.getElementsContainer();\n      this.$addElementBtn = this.getAddElementsBtn();\n      this.$spinner = this.getSpinner();\n\n      this.thumbLoader = new Craft.ElementThumbLoader();\n\n      this.initElementSelect();\n      this.initElementSort();\n      this.resetElements();\n\n      if (this.$addElementBtn) {\n        this.addListener(this.$addElementBtn, 'activate', 'showModal');\n      }\n\n      Garnish.requestAnimationFrame(() => {\n        this._initialized = true;\n      });\n    },\n\n    get totalSelected() {\n      return this.$elements.length;\n    },\n\n    getContainer: function () {\n      return $('#' + this.settings.id);\n    },\n\n    getFieldLabel: function () {\n      if (!this.$container) return;\n\n      const $fieldset = this.$container.closest('fieldset');\n      return $fieldset.find('legend').first().data('label');\n    },\n\n    getElementsContainer: function () {\n      return this.$container.children('.elements');\n    },\n\n    getElements: function () {\n      return this.$elementsContainer.find('.element');\n    },\n\n    getAddElementsBtn: function () {\n      return this.$container.find('.btn.add:first');\n    },\n\n    getSpinner: function () {\n      return this.$container.find('.spinner');\n    },\n\n    initElementSelect: function () {\n      if (this.settings.selectable) {\n        this.elementSelect = new Garnish.Select({\n          multi: this.settings.sortable,\n          filter: ':not(.delete)',\n        });\n      }\n    },\n\n    initElementSort: function () {\n      if (this.settings.sortable) {\n        this.elementSort = new Garnish.DragSort({\n          container: this.$elementsContainer,\n          filter: this.settings.selectable\n            ? () => {\n                // Only return all the selected items if the target item is selected\n                if (this.elementSort.$targetItem.hasClass('sel')) {\n                  return this.elementSelect.getSelectedItems();\n                } else {\n                  return this.elementSort.$targetItem;\n                }\n              }\n            : null,\n          ignoreHandleSelector: '.delete',\n          axis: this.getElementSortAxis(),\n          collapseDraggees: true,\n          magnetStrength: 4,\n          helperLagBase: 1.5,\n          onSortChange: this.settings.selectable\n            ? () => {\n                this.elementSelect.resetItemOrder();\n              }\n            : null,\n        });\n      }\n    },\n\n    getElementSortAxis: function () {\n      return this.settings.viewMode === 'list' ? 'y' : null;\n    },\n\n    canAddMoreElements: function () {\n      return (\n        !this.settings.limit || this.$elements.length < this.settings.limit\n      );\n    },\n\n    updateAddElementsBtn: function () {\n      if (this.canAddMoreElements()) {\n        this.enableAddElementsBtn();\n      } else {\n        this.disableAddElementsBtn();\n      }\n    },\n\n    enableAddElementsBtn: function () {\n      if (this.$addElementBtn) {\n        this.$addElementBtn.removeClass('hidden');\n      }\n\n      this.updateButtonContainer();\n    },\n\n    disableAddElementsBtn: function () {\n      if (this.$addElementBtn) {\n        this.$addElementBtn.addClass('hidden');\n      }\n\n      this.updateButtonContainer();\n    },\n\n    showSpinner: function () {\n      if (this.$spinner) {\n        this.$spinner.removeClass('hidden');\n      }\n\n      this.updateButtonContainer();\n    },\n\n    hideSpinner: function () {\n      if (this.$spinner) {\n        this.$spinner.addClass('hidden');\n      }\n\n      this.updateButtonContainer();\n    },\n\n    updateButtonContainer: function () {\n      const $container =\n        this.$addElementBtn && this.$addElementBtn.parent('.flex');\n      if ($container && $container.length) {\n        if ($container.children(':not(.hidden)').length) {\n          $container.removeClass('hidden');\n        } else {\n          $container.addClass('hidden');\n        }\n      }\n    },\n\n    focusNextLogicalElement: function () {\n      if (this.canAddMoreElements()) {\n        // If can add more elements, focus ADD button\n        let $btn = this.$addElementBtn;\n\n        if ($btn) {\n          $btn.get(0).focus();\n        }\n      } else {\n        // If can't add more elements, focus on the final remove\n        this.focusLastRemoveBtn();\n      }\n    },\n\n    focusLastRemoveBtn: function () {\n      const $removeBtns = this.$container.find('.delete');\n\n      if (!$removeBtns.length) return;\n\n      $removeBtns.last()[0].focus();\n    },\n\n    resetElements: function () {\n      if (this.$elements !== null) {\n        this.removeElements(this.$elements);\n      } else {\n        this.$elements = $();\n      }\n\n      this.addElements(this.getElements());\n    },\n\n    addElements: function ($elements) {\n      this.thumbLoader.load($elements);\n\n      if (this.settings.selectable) {\n        this.elementSelect.addItems($elements);\n      }\n\n      if (this.settings.sortable) {\n        this.elementSort.addItems($elements);\n      }\n\n      if (this.settings.editable) {\n        this._handleShowElementEditor = (ev) => {\n          var $element = $(ev.currentTarget);\n          if (\n            Garnish.hasAttr($element, 'data-editable') &&\n            !$element.hasClass('disabled') &&\n            !$element.hasClass('loading')\n          ) {\n            this.elementEditor = this.createElementEditor($element);\n          }\n        };\n\n        this.addListener($elements, 'dblclick', this._handleShowElementEditor);\n\n        if ($.isTouchCapable()) {\n          this.addListener($elements, 'taphold', this._handleShowElementEditor);\n        }\n      }\n\n      $elements.find('.delete').on('click dblclick', (ev) => {\n        this.removeElement($(ev.currentTarget).closest('.element'));\n        // Prevent this from acting as one of a double-click\n        ev.stopPropagation();\n      });\n\n      $elements.on('keydown', (ev) => {\n        if ([Garnish.BACKSPACE_KEY, Garnish.DELETE_KEY].includes(ev.keyCode)) {\n          ev.stopPropagation();\n          ev.preventDefault();\n          const $elements = this.elementSelect.getSelectedItems();\n          for (let i = 0; i < $elements.length; i++) {\n            this.removeElement($elements.eq(i));\n          }\n        }\n      });\n\n      this.$elements = this.$elements.add($elements);\n\n      this.updateAddElementsBtn();\n\n      this.onAddElements();\n    },\n\n    createElementEditor: function ($element, settings) {\n      settings = Object.assign(\n        {\n          elementSelectInput: this,\n          prevalidate: this.settings.prevalidate,\n        },\n        settings\n      );\n\n      return Craft.createElementEditor(\n        this.settings.elementType,\n        $element,\n        settings\n      );\n    },\n\n    replaceElement: function (elementId, replacementId) {\n      return new Promise((resolve, reject) => {\n        const $existing = this.$elements.filter(`[data-id=\"${elementId}\"]`);\n\n        if (!$existing.length) {\n          reject(`No element selected with an ID of ${elementId}.`);\n          return;\n        }\n\n        this.showSpinner();\n\n        const data = {\n          elementId: replacementId,\n          siteId: this.settings.criteria.siteId,\n          thumbSize: this.settings.viewMode,\n        };\n\n        Craft.sendActionRequest('POST', 'elements/get-element-html', {data})\n          .then((response) => {\n            this.removeElement($existing);\n            const elementInfo = Craft.getElementInfo(response.data.html);\n            this.selectElements([elementInfo]);\n            resolve();\n          })\n          .catch(({response}) => {\n            if (response && response.data && response.data.message) {\n              alert(response.data.message);\n            } else {\n              Craft.cp.displayError();\n            }\n\n            reject(response.data.message);\n          })\n          .finally(() => {\n            this.hideSpinner();\n          });\n      });\n    },\n\n    removeElements: function ($elements) {\n      if (this.settings.selectable) {\n        this.elementSelect.removeItems($elements);\n      }\n\n      if (this.modal) {\n        var ids = [];\n\n        for (var i = 0; i < $elements.length; i++) {\n          var id = $elements.eq(i).data('id');\n\n          if (id) {\n            ids.push(id);\n          }\n        }\n\n        if (ids.length) {\n          this.modal.elementIndex.enableElementsById(ids);\n        }\n      }\n\n      // Disable the hidden input in case the form is submitted before this element gets removed from the DOM\n      $elements.children('input').prop('disabled', true);\n\n      // Move the focus to the next element in the list, if there is one\n      let $nextDeleteBtn;\n      if (this.settings.selectable) {\n        const lastElementIndex = this.$elements.index($elements.last());\n        $nextDeleteBtn = this.$elements\n          .eq(lastElementIndex + 1)\n          .find('.delete');\n      }\n      if ($nextDeleteBtn.length) {\n        $nextDeleteBtn.focus();\n      } else {\n        this.focusNextLogicalElement();\n      }\n\n      this.$elements = this.$elements.not($elements);\n      this.updateAddElementsBtn();\n\n      this.onRemoveElements();\n    },\n\n    removeElement: function ($element) {\n      if (this.settings.maintainHierarchy) {\n        // Find any descendants this element might have\n        const $allElements = $element.add(\n          $element.parent().siblings('ul').find('.element')\n        );\n\n        // Remove any inputs from the form data\n        $('[name]', $allElements).removeAttr('name');\n\n        // Remove our record of them all at once\n        this.removeElements($allElements);\n\n        // Animate them away one at a time\n        for (let i = 0; i < $allElements.length; i++) {\n          this._animateStructureElementAway($allElements, i);\n        }\n      } else {\n        // Remove any inputs from the form data\n        $('[name]', $element).removeAttr('name');\n        this.removeElements($element);\n        this.animateElementAway($element, () => {\n          $element.remove();\n        });\n      }\n    },\n\n    animateElementAway: function ($element, callback) {\n      $element.css('z-index', 0);\n\n      var animateCss = {\n        opacity: -1,\n      };\n      animateCss['margin-' + Craft.left] = -(\n        $element.outerWidth() + parseInt($element.css('margin-' + Craft.right))\n      );\n\n      if (this.settings.viewMode === 'list' || this.$elements.length === 0) {\n        animateCss['margin-bottom'] = -(\n          $element.outerHeight() + parseInt($element.css('margin-bottom'))\n        );\n      }\n\n      $element.velocity(\n        animateCss,\n        Craft.BaseElementSelectInput.REMOVE_FX_DURATION,\n        () => {\n          if (callback) {\n            callback();\n          }\n        }\n      );\n    },\n\n    showModal: function () {\n      // Make sure we haven't reached the limit\n      if (!this.canAddMoreElements()) {\n        return;\n      }\n\n      if (!this.modal) {\n        this.modal = this.createModal();\n      } else {\n        this.modal.show();\n      }\n    },\n\n    createModal: function () {\n      return Craft.createElementSelectorModal(\n        this.settings.elementType,\n        this.getModalSettings()\n      );\n    },\n\n    getModalSettings: function () {\n      return $.extend(\n        {\n          closeOtherModals: false,\n          storageKey: this.modalStorageKey,\n          sources: this.settings.sources,\n          condition: this.settings.condition,\n          criteria: this.settings.criteria,\n          multiSelect: this.settings.limit != 1,\n          hideOnSelect: !this.settings.maintainHierarchy,\n          showSiteMenu: this.settings.showSiteMenu,\n          disabledElementIds: this.getDisabledElementIds(),\n          onSelect: this.onModalSelect.bind(this),\n          onHide: this.onModalHide.bind(this),\n          triggerElement: this.$addElementBtn,\n          modalTitle: Craft.t('app', 'Select {element}', {\n            element: this.fieldLabel,\n          }),\n        },\n        this.settings.modalSettings\n      );\n    },\n\n    getSelectedElementIds: function () {\n      var ids = [];\n\n      for (var i = 0; i < this.$elements.length; i++) {\n        ids.push(this.$elements.eq(i).data('id'));\n      }\n\n      return ids;\n    },\n\n    getDisabledElementIds: function () {\n      var ids = this.getSelectedElementIds();\n\n      if (!this.settings.allowSelfRelations && this.settings.sourceElementId) {\n        ids.push(this.settings.sourceElementId);\n      }\n\n      if (this.settings.disabledElementIds) {\n        ids.push(...this.settings.disabledElementIds);\n      }\n\n      return ids;\n    },\n\n    onModalSelect: function (elements) {\n      if (this.settings.maintainHierarchy) {\n        this.selectStructuredElements(elements);\n      } else {\n        if (this.settings.limit) {\n          // Cut off any excess elements\n          var slotsLeft = this.settings.limit - this.$elements.length;\n\n          if (elements.length > slotsLeft) {\n            elements = elements.slice(0, slotsLeft);\n          }\n        }\n\n        this.selectElements(elements);\n        this.updateDisabledElementsInModal();\n      }\n    },\n\n    onModalHide: function () {\n      // If can add more elements, do default behavior of focus on \"Add\" button\n      if (this.canAddMoreElements()) return;\n\n      setTimeout(() => {\n        this.focusNextLogicalElement();\n      }, 200);\n    },\n\n    selectElements: function (elements) {\n      for (let i = 0; i < elements.length; i++) {\n        let elementInfo = elements[i],\n          $element = this.createNewElement(elementInfo);\n\n        this.appendElement($element);\n        this.addElements($element);\n        this.animateElementIntoPlace(elementInfo.$element, $element);\n\n        // Override the element reference with the new one\n        elementInfo.$element = $element;\n      }\n\n      this.onSelectElements(elements);\n    },\n\n    selectStructuredElements: function (elements) {\n      // Disable the modal\n      this.modal.disable();\n      this.modal.disableCancelBtn();\n      this.modal.disableSelectBtn();\n      this.modal.showFooterSpinner();\n\n      // Get the new element HTML\n      var selectedElementIds = this.getSelectedElementIds();\n\n      for (var i = 0; i < elements.length; i++) {\n        selectedElementIds.push(elements[i].id);\n      }\n\n      var data = {\n        elementIds: selectedElementIds,\n        siteId: elements[0].siteId,\n        containerId: this.settings.id,\n        name: this.settings.name,\n        branchLimit: this.settings.branchLimit,\n        selectionLabel: this.settings.selectionLabel,\n        elementType: this.settings.elementType,\n      };\n\n      const onResponse = () => {\n        this.modal.enable();\n        this.modal.enableCancelBtn();\n        this.modal.enableSelectBtn();\n        this.modal.hideFooterSpinner();\n      };\n      Craft.sendActionRequest(\n        'POST',\n        'relational-fields/structured-input-html',\n        {data}\n      )\n        .then((response) => {\n          onResponse();\n          var $newInput = $(response.data.html),\n            $newElementsContainer = $newInput.children('.elements');\n\n          this.$elementsContainer.replaceWith($newElementsContainer);\n          this.$elementsContainer = $newElementsContainer;\n          this.resetElements();\n\n          var filteredElements = [];\n\n          for (var i = 0; i < elements.length; i++) {\n            var element = elements[i],\n              $element = this.getElementById(element.id);\n\n            if ($element) {\n              this.animateElementIntoPlace(element.$element, $element);\n              filteredElements.push(element);\n            }\n          }\n\n          this.updateDisabledElementsInModal();\n          this.modal.hide();\n          this.onSelectElements(filteredElements);\n        })\n        .catch(({response}) => {\n          onResponse();\n        });\n    },\n\n    createNewElement: function (elementInfo) {\n      var $element = elementInfo.$element.clone();\n      var removeText = Craft.t('app', 'Remove {label}', {\n        label: Craft.escapeHtml(elementInfo.label),\n      });\n      // Make a couple tweaks\n      Craft.setElementSize(\n        $element,\n        this.settings.viewMode === 'large' ? 'large' : 'small'\n      );\n      $element\n        .addClass('removable')\n        .prepend(\n          $('<input/>', {\n            type: 'hidden',\n            name: this.settings.name + (this.settings.single ? '' : '[]'),\n            value: elementInfo.id,\n          })\n        )\n        .prepend(\n          $('<button/>', {\n            type: 'button',\n            class: 'delete icon',\n            title: Craft.t('app', 'Remove'),\n            'aria-label': removeText,\n          })\n        );\n\n      return $element;\n    },\n\n    appendElement: function ($element) {\n      $element.appendTo(this.$elementsContainer);\n    },\n\n    animateElementIntoPlace: function ($modalElement, $inputElement) {\n      var origOffset = $modalElement.offset(),\n        destOffset = $inputElement.offset(),\n        $helper = $inputElement.clone().appendTo(Garnish.$bod);\n\n      $inputElement.css('visibility', 'hidden');\n\n      $helper.css({\n        position: 'absolute',\n        zIndex: 10000,\n        top: origOffset.top,\n        left: origOffset.left,\n      });\n\n      var animateCss = {\n        top: destOffset.top,\n        left: destOffset.left,\n      };\n\n      $helper.velocity(\n        animateCss,\n        Craft.BaseElementSelectInput.ADD_FX_DURATION,\n        function () {\n          $helper.remove();\n          $inputElement.css('visibility', 'visible');\n        }\n      );\n    },\n\n    updateDisabledElementsInModal: function () {\n      if (this.modal.elementIndex) {\n        this.modal.elementIndex.disableElementsById(\n          this.getDisabledElementIds()\n        );\n      }\n    },\n\n    getElementById: function (id) {\n      for (var i = 0; i < this.$elements.length; i++) {\n        var $element = this.$elements.eq(i);\n\n        if ($element.data('id') == id) {\n          return $element;\n        }\n      }\n    },\n\n    onSelectElements: function (elements) {\n      this.trigger('selectElements', {elements});\n      this.settings.onSelectElements(elements);\n      this.$container.trigger('change');\n    },\n\n    onAddElements: function () {\n      this.trigger('addElements');\n      this.settings.onAddElements();\n      this.$container.trigger('change');\n    },\n\n    onRemoveElements: function () {\n      this.trigger('removeElements');\n      this.settings.onRemoveElements();\n      this.$container.trigger('change');\n    },\n\n    _animateStructureElementAway: function ($allElements, i) {\n      let callback;\n\n      // Is this the last one?\n      if (i === $allElements.length - 1) {\n        callback = () => {\n          const $li = $allElements.first().parent().parent();\n          const $ul = $li.parent();\n\n          if ($ul[0] === this.$elementsContainer[0] || $li.siblings().length) {\n            $li.remove();\n          } else {\n            $ul.remove();\n          }\n        };\n      }\n\n      const func = () => {\n        this.animateElementAway($allElements.eq(i), callback);\n      };\n\n      if (i === 0) {\n        func();\n      } else {\n        setTimeout(func, 100 * i);\n      }\n    },\n  },\n  {\n    ADD_FX_DURATION: 200,\n    REMOVE_FX_DURATION: 200,\n\n    defaults: {\n      id: null,\n      name: null,\n      fieldId: null,\n      elementType: null,\n      sources: null,\n      condition: null,\n      criteria: {},\n      allowSelfRelations: false,\n      sourceElementId: null,\n      disabledElementIds: null,\n      viewMode: 'list',\n      single: false,\n      maintainHierarchy: false,\n      branchLimit: null,\n      limit: null,\n      showSiteMenu: false,\n      modalStorageKey: null,\n      modalSettings: {},\n      onAddElements: $.noop,\n      onSelectElements: $.noop,\n      onRemoveElements: $.noop,\n      sortable: true,\n      selectable: true,\n      editable: true,\n      prevalidate: false,\n      editorSettings: {},\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element selector modal class\n */\nCraft.BaseElementSelectorModal = Garnish.Modal.extend(\n  {\n    elementType: null,\n    elementIndex: null,\n\n    supportSidebarToggleView: false,\n\n    $body: null,\n    $content: null,\n    $footer: null,\n    $selectBtn: null,\n    $sidebar: null,\n    $sources: null,\n    $sourceToggles: null,\n    $sidebarToggleBtn: null,\n    $sidebarCloseBtn: null,\n    $mainHeading: null,\n    $main: null,\n    $search: null,\n    $elements: null,\n    $tbody: null,\n    $primaryButtons: null,\n    $secondaryButtons: null,\n    $cancelBtn: null,\n\n    init: function (elementType, settings) {\n      this.elementType = elementType;\n      this.setSettings(settings, Craft.BaseElementSelectorModal.defaults);\n      var $headingId = 'elementSelectorModalHeading-' + Date.now();\n\n      // Build the modal\n      var $container = $(\n          '<div class=\"modal elementselectormodal\" aria-labelledby=\"' +\n            $headingId +\n            '\"></div>'\n        ).appendTo(Garnish.$bod),\n        $heading = $(\n          '<h1 id=\"' +\n            $headingId +\n            '\" class=\"visually-hidden\">' +\n            this.settings.modalTitle +\n            '</h1>'\n        ).appendTo($container),\n        $body = $(\n          '<div class=\"body\"><div class=\"spinner big\"></div></div>'\n        ).appendTo($container);\n\n      this.$footer = $('<div class=\"footer\"/>').appendTo($container);\n\n      if (this.settings.fullscreen) {\n        $container.addClass('fullscreen');\n        this.settings.minGutter = 0;\n      }\n\n      this.base($container, this.settings);\n\n      this.$secondaryButtons = $(\n        '<div class=\"buttons left secondary-buttons\"/>'\n      ).appendTo(this.$footer);\n      this.$primaryButtons = $('<div class=\"buttons right\"/>').appendTo(\n        this.$footer\n      );\n      this.$cancelBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn',\n        text: Craft.t('app', 'Cancel'),\n      }).appendTo(this.$primaryButtons);\n      this.$selectBtn = Craft.ui\n        .createSubmitButton({\n          class: 'disabled',\n          label: Craft.t('app', 'Select'),\n          spinner: true,\n        })\n        .attr('aria-disabled', 'true')\n        .appendTo(this.$primaryButtons);\n\n      this.$body = $body;\n\n      this.addListener(this.$cancelBtn, 'activate', 'cancel');\n      this.addListener(this.$selectBtn, 'activate', 'selectElements');\n    },\n\n    updateModalBottomPadding: function () {\n      const footerHeight = this.$footer.outerHeight();\n      const bottomPadding = parseInt(this.$container.css('padding-bottom'));\n\n      if (footerHeight !== bottomPadding) {\n        this.$container.css('padding-bottom', footerHeight);\n      }\n    },\n\n    updateSidebarView: function () {\n      if (!this.supportSidebarToggleView) return;\n\n      if (this.sidebarShouldBeHidden()) {\n        if (!this.$sidebarToggleBtn) this.buildSidebarToggleView();\n      } else {\n        if (this.$sidebarToggleBtn) this.resetView();\n      }\n    },\n\n    sidebarShouldBeHidden: function () {\n      const contentWidth = this.$container.outerWidth();\n      return contentWidth < 550;\n    },\n\n    resetView: function () {\n      if (this.$mainHeader) {\n        this.$mainHeader.remove();\n      }\n\n      if (this.$sidebarHeader) {\n        this.$sidebarHeader.remove();\n      }\n\n      this.$sidebarToggleBtn = null;\n      this.$body.addClass('has-sidebar');\n      this.$content.addClass('has-sidebar');\n      this.$sidebar.removeClass('hidden');\n    },\n\n    buildSidebarToggleView: function () {\n      if (this.$sidebarToggleBtn || !this.sidebarShouldBeHidden()) return;\n\n      this.$sidebarHeader = $('<div class=\"sidebar-header\"/>').prependTo(\n        this.$sidebar\n      );\n\n      this.$sidebarCloseBtn = Craft.ui\n        .createButton({\n          class: 'nav-close close-btn',\n        })\n        .attr('aria-label', Craft.t('app', 'Close'))\n        .removeClass('btn')\n        .appendTo(this.$sidebarHeader);\n\n      this.$mainHeader = $('<div class=\"main-header\"/>').prependTo(this.$main);\n      this.$mainHeading = $(\n        `<h2 class=\"main-heading\">${this.getActiveSourceName()}</h2>`\n      ).appendTo(this.$mainHeader);\n\n      const buttonConfig = {\n        toggle: true,\n        controls: 'modal-sidebar',\n        class: 'nav-toggle',\n      };\n      this.$sidebarToggleBtn = Craft.ui\n        .createButton(buttonConfig)\n        .removeClass('btn')\n        .attr('aria-label', Craft.t('app', 'Show sidebar'))\n        .appendTo(this.$mainHeader);\n\n      this.$sidebar.attr('id', 'modal-sidebar');\n\n      this.closeSidebar();\n\n      this.addListener(this.$sidebarToggleBtn, 'click', () => {\n        this.toggleSidebar();\n      });\n\n      this.addListener(this.$sidebarCloseBtn, 'click', () => {\n        this.toggleSidebar();\n      });\n    },\n\n    sidebarIsOpen: function () {\n      return this.$sidebarToggleBtn.attr('aria-expanded') === 'true';\n    },\n\n    toggleSidebar: function () {\n      if (this.sidebarIsOpen()) {\n        this.closeSidebar();\n      } else {\n        this.openSidebar();\n      }\n    },\n\n    openSidebar: function () {\n      this.$body.addClass('has-sidebar');\n      this.$content.addClass('has-sidebar');\n      this.$sidebar.removeClass('hidden');\n      this.$sidebarToggleBtn.attr('aria-expanded', 'true');\n      this.$sidebar.find(':focusable').first().focus();\n\n      Garnish.uiLayerManager.addLayer(this.$sidebar);\n      Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n        this.closeSidebar();\n\n        // If the focus is currently inside the sidebar, refocus the toggle\n        const $focusedEl = Garnish.getFocusedElement();\n        if ($.contains(this.$sidebar.get(0), $focusedEl.get(0)))\n          this.$sidebarToggleBtn.focus();\n      });\n    },\n\n    closeSidebar: function () {\n      if (!this.$sidebarToggleBtn) return;\n\n      if (this.sidebarIsOpen()) {\n        Garnish.uiLayerManager.removeLayer();\n        this.$sidebar.addClass('hidden');\n        this.$sidebarToggleBtn.attr('aria-expanded', 'false');\n      }\n\n      this.$body.removeClass('has-sidebar');\n      this.$content.removeClass('has-sidebar');\n    },\n\n    getActiveSourceName: function () {\n      return this.$sidebar.find('.sel').text();\n    },\n\n    onFadeIn: function () {\n      if (!this.elementIndex) {\n        this._createElementIndex();\n      } else {\n        // Auto-focus the Search box\n        if (!Garnish.isMobileBrowser(true)) {\n          this.elementIndex.$search.trigger('focus');\n        }\n      }\n\n      this.base();\n    },\n\n    onSelectionChange: function () {\n      this.updateSelectBtnState();\n    },\n\n    onSelectSource: function () {\n      this.updateHeading();\n      this.updateModalBottomPadding();\n    },\n\n    updateHeading: function () {\n      if (!this.$mainHeading) return;\n\n      this.$mainHeading.text(this.getActiveSourceName());\n    },\n\n    updateSelectBtnState: function () {\n      if (this.$selectBtn) {\n        if (this.elementIndex.getSelectedElements().length) {\n          this.enableSelectBtn();\n        } else {\n          this.disableSelectBtn();\n        }\n      }\n    },\n\n    enableSelectBtn: function () {\n      this.$selectBtn.removeClass('disabled').attr('aria-disabled', 'false');\n    },\n\n    disableSelectBtn: function () {\n      this.$selectBtn.addClass('disabled').attr('aria-disabled', 'true');\n    },\n\n    enableCancelBtn: function () {\n      this.$cancelBtn.removeClass('disabled');\n    },\n\n    disableCancelBtn: function () {\n      this.$cancelBtn.addClass('disabled');\n    },\n\n    showFooterSpinner: function () {\n      this.$selectBtn.addClass('loading');\n    },\n\n    hideFooterSpinner: function () {\n      this.$selectBtn.removeClass('loading');\n    },\n\n    cancel: function () {\n      if (!this.$cancelBtn.hasClass('disabled')) {\n        this.hide();\n      }\n    },\n\n    selectElements: function () {\n      if (this.elementIndex && this.elementIndex.getSelectedElements().length) {\n        // TODO: This code shouldn't know about views' elementSelect objects\n        this.elementIndex.view.elementSelect.clearMouseUpTimeout();\n\n        var $selectedElements = this.elementIndex.getSelectedElements(),\n          elementInfo = this.getElementInfo($selectedElements);\n\n        this.onSelect(elementInfo);\n\n        if (this.settings.disableElementsOnSelect) {\n          this.elementIndex.disableElements(\n            this.elementIndex.getSelectedElements()\n          );\n        }\n\n        if (this.settings.hideOnSelect) {\n          this.hide();\n        }\n      }\n    },\n\n    getElementInfo: function ($selectedElements) {\n      var info = [];\n\n      for (var i = 0; i < $selectedElements.length; i++) {\n        var $element = $($selectedElements[i]);\n        var elementInfo = Craft.getElementInfo($element);\n\n        info.push(elementInfo);\n      }\n\n      return info;\n    },\n\n    onShow: function () {\n      this.updateSelectBtnState();\n\n      // Add listeners again since they get removed during modal close\n      this.addListener(Garnish.$win, 'resize', this.updateSidebarView);\n      this.addListener(Garnish.$win, 'resize', this.updateModalBottomPadding);\n\n      this.updateModalBottomPadding();\n      this.updateSidebarView();\n      this.base();\n    },\n\n    onHide: function () {\n      this.closeSidebar();\n      this.base();\n    },\n\n    onSelect: function (elementInfo) {\n      this.settings.onSelect(elementInfo);\n    },\n\n    disable: function () {\n      if (this.elementIndex) {\n        this.elementIndex.disable();\n      }\n\n      this.base();\n    },\n\n    enable: function () {\n      if (this.elementIndex) {\n        this.elementIndex.enable();\n      }\n\n      this.base();\n    },\n\n    _createElementIndex: function () {\n      // Get the modal body HTML based on the settings\n      var data = {\n        context: 'modal',\n        elementType: this.elementType,\n        sources: this.settings.sources,\n      };\n\n      if (\n        this.settings.showSiteMenu !== null &&\n        this.settings.showSiteMenu !== 'auto'\n      ) {\n        data.showSiteMenu = this.settings.showSiteMenu ? '1' : '0';\n      }\n\n      Craft.sendActionRequest('POST', this.settings.bodyAction, {data}).then(\n        (response) => {\n          this.$body.html(response.data.html);\n\n          if (this.$body.has('.sidebar:not(.hidden)').length) {\n            this.$body.addClass('has-sidebar');\n            this.supportSidebarToggleView = true;\n          }\n\n          // Initialize the element index\n          this.elementIndex = Craft.createElementIndex(\n            this.elementType,\n            this.$body,\n            Object.assign(\n              {\n                context: 'modal',\n                modal: this,\n                storageKey: this.settings.storageKey,\n                condition: this.settings.condition,\n                criteria: this.settings.criteria,\n                disabledElementIds: this.settings.disabledElementIds,\n                selectable: true,\n                multiSelect: this.settings.multiSelect,\n                buttonContainer: this.$secondaryButtons,\n                onSelectionChange: this.onSelectionChange.bind(this),\n                onSelectSource: this.onSelectSource.bind(this),\n                hideSidebar: this.settings.hideSidebar,\n                defaultSiteId: this.settings.defaultSiteId,\n                defaultSource: this.settings.defaultSource,\n              },\n              this.settings.indexSettings\n            )\n          );\n\n          this.$main = this.elementIndex.$main;\n          this.$sidebar = this.elementIndex.$sidebar;\n          this.$content = this.$body.find('.content');\n\n          this.updateSidebarView();\n          this.updateModalBottomPadding();\n\n          // Double-clicking or double-tapping should select the elements\n          this.addListener(\n            this.elementIndex.$elements,\n            'doubletap',\n            function (ev, touchData) {\n              // Make sure the touch targets are the same\n              // (they may be different if Command/Ctrl/Shift-clicking on multiple elements quickly)\n              if (touchData.firstTap.target === touchData.secondTap.target) {\n                this.selectElements();\n              }\n            }\n          );\n        }\n      );\n    },\n  },\n  {\n    defaults: {\n      fullscreen: false,\n      resizable: true,\n      storageKey: null,\n      sources: null,\n      condition: null,\n      criteria: null,\n      multiSelect: false,\n      showSiteMenu: null,\n      disabledElementIds: [],\n      disableElementsOnSelect: false,\n      hideOnSelect: true,\n      modalTitle: Craft.t('app', 'Select element'),\n      onCancel: $.noop,\n      onSelect: $.noop,\n      hideSidebar: false,\n      defaultSiteId: null,\n      defaultSource: null,\n      bodyAction: 'element-selector-modals/body',\n      indexSettings: {},\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Input Generator\n */\nCraft.BaseInputGenerator = Garnish.Base.extend({\n  $source: null,\n  $target: null,\n  $form: null,\n  settings: null,\n\n  listening: null,\n  timeout: null,\n\n  init: function (source, target, settings) {\n    this.$source = $(source);\n    this.$target = $(target);\n    this.$form = this.$source.closest('form');\n\n    this.setSettings(settings);\n\n    this.startListening();\n  },\n\n  setNewSource: function (source) {\n    var listening = this.listening;\n    this.stopListening();\n\n    this.$source = $(source);\n\n    if (listening) {\n      this.startListening();\n    }\n  },\n\n  startListening: function () {\n    if (this.listening) {\n      return;\n    }\n\n    this.listening = true;\n\n    this.addListener(this.$source, 'input', 'onSourceTextChange');\n    this.addListener(this.$target, 'input', 'onTargetTextChange');\n    this.addListener(this.$form, 'submit', 'onFormSubmit');\n  },\n\n  stopListening: function () {\n    if (!this.listening) {\n      return;\n    }\n\n    this.listening = false;\n\n    if (this.timeout) {\n      clearTimeout(this.timeout);\n    }\n\n    this.removeAllListeners(this.$source);\n    this.removeAllListeners(this.$target);\n    this.removeAllListeners(this.$form);\n  },\n\n  onSourceTextChange: function () {\n    if (this.timeout) {\n      clearTimeout(this.timeout);\n    }\n\n    this.timeout = setTimeout(this.updateTarget.bind(this), 250);\n  },\n\n  onTargetTextChange: function () {\n    if (this.$target.get(0) === document.activeElement) {\n      this.stopListening();\n    }\n  },\n\n  onFormSubmit: function () {\n    if (this.timeout) {\n      clearTimeout(this.timeout);\n    }\n\n    this.updateTarget();\n  },\n\n  updateTarget: function () {\n    if (!this.$target.is(':visible')) {\n      return;\n    }\n\n    var sourceVal = this.$source.val();\n\n    if (typeof sourceVal === 'undefined') {\n      // The source input may not exist anymore\n      return;\n    }\n\n    var targetVal = this.generateTargetValue(sourceVal);\n\n    this.$target.val(targetVal);\n\n    for (let i = 0; i < this.$target.length; i++) {\n      this.$target[i].dispatchEvent(\n        new InputEvent('input', {\n          inputType: 'insertText',\n        })\n      );\n      this.$target[i].dispatchEvent(new Event('input'));\n    }\n\n    // If the target already has focus, select its whole value to mimic\n    // the behavior if the value had already been generated and they just tabbed in\n    if (this.$target.is(':focus')) {\n      Craft.selectFullValue(this.$target);\n    }\n  },\n\n  generateTargetValue: function (sourceVal) {\n    return sourceVal;\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Category index class\n */\nCraft.CategoryIndex = Craft.BaseElementIndex.extend({\n  editableGroups: null,\n  $newCategoryBtnGroup: null,\n  $newCategoryBtn: null,\n\n  init: function (elementType, $container, settings) {\n    this.editableGroups = [];\n    this.on('selectSource', this.updateButton.bind(this));\n    this.on('selectSite', this.updateButton.bind(this));\n    this.base(elementType, $container, settings);\n  },\n\n  afterInit: function () {\n    // Find which of the visible groups the user has permission to create new categories in\n    this.editableGroups = Craft.editableCategoryGroups.filter(\n      (g) => !!this.getSourceByKey(`group:${g.uid}`)\n    );\n\n    this.base();\n  },\n\n  getDefaultSourceKey: function () {\n    // Did they request a specific category group in the URL?\n    if (\n      this.settings.context === 'index' &&\n      typeof defaultGroupHandle !== 'undefined'\n    ) {\n      for (let i = 0; i < this.$sources.length; i++) {\n        const $source = $(this.$sources[i]);\n        if ($source.data('handle') === defaultGroupHandle) {\n          return $source.data('key');\n        }\n      }\n    }\n\n    return this.base();\n  },\n\n  updateButton: function () {\n    if (!this.$source) {\n      return;\n    }\n\n    // Get the handle of the selected source\n    const selectedSourceHandle = this.$source.data('handle');\n\n    // Update the New Category button\n    // ---------------------------------------------------------------------\n\n    if (this.editableGroups.length) {\n      // Remove the old button, if there is one\n      if (this.$newCategoryBtnGroup) {\n        this.$newCategoryBtnGroup.remove();\n      }\n\n      // Determine if they are viewing a group that they have permission to create categories in\n      const selectedGroup = this.editableGroups.find(\n        (g) => g.handle === selectedSourceHandle\n      );\n\n      this.$newCategoryBtnGroup = $(\n        '<div class=\"btngroup submit\" data-wrapper/>'\n      );\n      let $menuBtn;\n      const menuId = 'new-category-menu-' + Craft.randomString(10);\n\n      // If they are, show a primary \"New category\" button, and a dropdown of the other groups (if any).\n      // Otherwise only show a menu button\n      if (selectedGroup) {\n        const visibleLabel =\n          this.settings.context === 'index'\n            ? Craft.t('app', 'New category')\n            : Craft.t('app', 'New {group} category', {\n                group: selectedGroup.name,\n              });\n        const ariaLabel =\n          this.settings.context === 'index'\n            ? Craft.t('app', 'New category in the {group} category group', {\n                group: selectedGroup.name,\n              })\n            : visibleLabel;\n\n        const role = this.settings.context === 'index' ? 'link' : null;\n\n        this.$newCategoryBtn = Craft.ui\n          .createButton({\n            label: visibleLabel,\n            ariaLabel: ariaLabel,\n            spinner: true,\n            role: role,\n          })\n          .addClass('submit add icon')\n          .appendTo(this.$newCategoryBtnGroup);\n\n        this.addListener(this.$newCategoryBtn, 'click mousedown', (ev) => {\n          // If this is the element index, check for Ctrl+clicks and middle button clicks\n          if (\n            this.settings.context === 'index' &&\n            ((ev.type === 'click' && Garnish.isCtrlKeyPressed(ev)) ||\n              (ev.type === 'mousedown' && ev.originalEvent.button === 1))\n          ) {\n            window.open(Craft.getUrl(`categories/${selectedGroup.handle}/new`));\n          } else if (ev.type === 'click') {\n            this._createCategory(selectedGroup.id);\n          }\n        });\n\n        if (this.editableGroups.length > 1) {\n          $menuBtn = $('<button/>', {\n            type: 'button',\n            class: 'btn submit menubtn btngroup-btn-last',\n            'aria-controls': menuId,\n            'data-disclosure-trigger': '',\n            'aria-label': Craft.t(\n              'app',\n              'New category, choose a category group'\n            ),\n          }).appendTo(this.$newCategoryBtnGroup);\n        }\n      } else {\n        this.$newCategoryBtn = $menuBtn = Craft.ui\n          .createButton({\n            label: Craft.t('app', 'New category'),\n            ariaLabel: Craft.t('app', 'New category, choose a category group'),\n            spinner: true,\n          })\n          .addClass('submit add icon menubtn btngroup-btn-last')\n          .attr('aria-controls', menuId)\n          .attr('data-disclosure-trigger', '')\n          .appendTo(this.$newCategoryBtnGroup);\n      }\n\n      this.addButton(this.$newCategoryBtnGroup);\n\n      if ($menuBtn) {\n        const $menuContainer = $('<div/>', {\n          id: menuId,\n          class: 'menu menu--disclosure',\n        }).appendTo(this.$newCategoryBtnGroup);\n        const $ul = $('<ul/>').appendTo($menuContainer);\n\n        for (const group of this.editableGroups) {\n          const anchorRole =\n            this.settings.context === 'index' ? 'link' : 'button';\n          if (this.settings.context === 'index' || group !== selectedGroup) {\n            const $li = $('<li/>').appendTo($ul);\n            const $a = $('<a/>', {\n              role: anchorRole === 'button' ? 'button' : null,\n              href: '#', // Allows for click listener and tab order\n              type: anchorRole === 'button' ? 'button' : null,\n              text: Craft.t('app', 'New {group} category', {\n                group: group.name,\n              }),\n            }).appendTo($li);\n            this.addListener($a, 'click', () => {\n              $menuBtn.data('trigger').hide();\n              this._createCategory(group.id);\n            });\n\n            if (anchorRole === 'button') {\n              this.addListener($a, 'keydown', (event) => {\n                if (event.keyCode === Garnish.SPACE_KEY) {\n                  event.preventDefault();\n                  $menuBtn.data('trigger').hide();\n                  this._createCategory(group.id);\n                }\n              });\n            }\n          }\n        }\n\n        new Garnish.DisclosureMenu($menuBtn);\n      }\n    }\n\n    // Update the URL if we're on the Categories index\n    // ---------------------------------------------------------------------\n\n    if (this.settings.context === 'index') {\n      let uri = 'categories';\n\n      if (selectedSourceHandle) {\n        uri += '/' + selectedSourceHandle;\n      }\n\n      Craft.setPath(uri);\n    }\n  },\n\n  _createCategory: function (groupId) {\n    if (this.$newCategoryBtn.hasClass('loading')) {\n      console.warn('New category creation already in progress.');\n      return;\n    }\n\n    // Find the group\n    const group = this.editableGroups.find((s) => s.id === groupId);\n\n    if (!group) {\n      throw `Invalid category group ID: ${groupId}`;\n    }\n\n    this.$newCategoryBtn.addClass('loading');\n\n    Craft.sendActionRequest('POST', 'elements/create', {\n      data: {\n        elementType: this.elementType,\n        siteId: this.siteId,\n        groupId: groupId,\n      },\n    })\n      .then((ev) => {\n        if (this.settings.context === 'index') {\n          document.location.href = Craft.getUrl(ev.data.cpEditUrl, {fresh: 1});\n        } else {\n          const slideout = Craft.createElementEditor(this.elementType, {\n            siteId: this.siteId,\n            elementId: ev.data.element.id,\n            draftId: ev.data.element.draftId,\n            params: {\n              fresh: 1,\n            },\n          });\n          slideout.on('submit', () => {\n            // Make sure the right group is selected\n            const groupSourceKey = `group:${group.uid}`;\n\n            if (this.sourceKey !== groupSourceKey) {\n              this.selectSourceByKey(groupSourceKey);\n            }\n\n            this.clearSearch();\n            this.selectElementAfterUpdate(ev.data.element.id);\n            this.updateElements();\n          });\n        }\n      })\n      .finally(() => {\n        this.$newCategoryBtn.removeClass('loading');\n      });\n  },\n});\n\n// Register it!\nCraft.registerElementIndexClass(\n  'craft\\\\elements\\\\Category',\n  Craft.CategoryIndex\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Category Select input\n * @deprecated in 4.3.0. Use Craft.BaseElementSelectInput instead.\n */\nCraft.CategorySelectInput = Craft.BaseElementSelectInput.extend({\n  setSettings: function () {\n    this.base.apply(this, arguments);\n    this.settings.sortable = false;\n  },\n\n  getModalSettings: function () {\n    var settings = this.base();\n    settings.hideOnSelect = false;\n    return settings;\n  },\n\n  getElements: function () {\n    return this.$elementsContainer.find('.element');\n  },\n\n  onModalSelect: function (elements) {\n    // Disable the modal\n    this.modal.disable();\n    this.modal.disableCancelBtn();\n    this.modal.disableSelectBtn();\n    this.modal.showFooterSpinner();\n\n    // Get the new category HTML\n    var selectedCategoryIds = this.getSelectedElementIds();\n\n    for (var i = 0; i < elements.length; i++) {\n      selectedCategoryIds.push(elements[i].id);\n    }\n\n    var data = {\n      categoryIds: selectedCategoryIds,\n      siteId: elements[0].siteId,\n      id: this.settings.id,\n      name: this.settings.name,\n      branchLimit: this.settings.branchLimit,\n      selectionLabel: this.settings.selectionLabel,\n    };\n\n    const onResponse = () => {\n      this.modal.enable();\n      this.modal.enableCancelBtn();\n      this.modal.enableSelectBtn();\n      this.modal.hideFooterSpinner();\n    };\n    Craft.sendActionRequest('POST', 'categories/input-html', {data})\n      .then((response) => {\n        onResponse();\n        var $newInput = $(response.data.html),\n          $newElementsContainer = $newInput.children('.elements');\n\n        this.$elementsContainer.replaceWith($newElementsContainer);\n        this.$elementsContainer = $newElementsContainer;\n        this.resetElements();\n\n        var filteredElements = [];\n\n        for (var i = 0; i < elements.length; i++) {\n          var element = elements[i],\n            $element = this.getElementById(element.id);\n\n          if ($element) {\n            this.animateElementIntoPlace(element.$element, $element);\n            filteredElements.push(element);\n          }\n        }\n\n        this.updateDisabledElementsInModal();\n        this.modal.hide();\n        this.onSelectElements(filteredElements);\n      })\n      .catch(({response}) => {\n        onResponse();\n      });\n  },\n\n  removeElement: function ($element) {\n    // Find any descendants this category might have\n    const $allCategories = $element.add(\n      $element.parent().siblings('ul').find('.element')\n    );\n\n    // Remove our record of them all at once\n    this.removeElements($allCategories);\n\n    // Animate them away one at a time\n    for (let i = 0; i < $allCategories.length; i++) {\n      this._animateCategoryAway($allCategories, i);\n    }\n  },\n\n  _animateCategoryAway: function ($allCategories, i) {\n    let callback;\n\n    // Is this the last one?\n    if (i === $allCategories.length - 1) {\n      callback = () => {\n        const $li = $allCategories.first().parent().parent();\n        const $ul = $li.parent();\n\n        if ($ul[0] === this.$elementsContainer[0] || $li.siblings().length) {\n          $li.remove();\n        } else {\n          $ul.remove();\n        }\n      };\n    }\n\n    const func = () => {\n      this.animateElementAway($allCategories.eq(i), callback);\n    };\n\n    if (i === 0) {\n      func();\n    } else {\n      setTimeout(func, 100 * i);\n    }\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Craft Charts\n */\n\nCraft.charts = {};\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.DataTable\n */\nCraft.charts.DataTable = Garnish.Base.extend({\n  columns: null,\n  rows: null,\n\n  init: function (data) {\n    let columns = data.columns;\n    let rows = data.rows;\n\n    rows.forEach((d) => {\n      $.each(d, function (cellIndex) {\n        var column = columns[cellIndex];\n\n        var parseTime;\n\n        switch (column.type) {\n          case 'date':\n            parseTime = d3.timeParse('%Y-%m-%d');\n            d[cellIndex] = parseTime(d[cellIndex]);\n            break;\n\n          case 'datetime':\n            parseTime = d3.timeParse('%Y-%m-%d %H:00:00');\n            d[cellIndex] = parseTime(d[cellIndex]);\n            break;\n\n          case 'percent':\n            d[cellIndex] = d[cellIndex] / 100;\n            break;\n\n          case 'number':\n            d[cellIndex] = +d[cellIndex];\n            break;\n\n          default:\n          // do nothing\n        }\n      });\n    });\n\n    this.columns = columns;\n    this.rows = rows;\n  },\n});\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.Tip\n */\n\nCraft.charts.Tip = Garnish.Base.extend({\n  $container: null,\n  $tip: null,\n\n  init: function ($container) {\n    this.$container = $container;\n\n    this.$tip = $('<div class=\"tooltip\"></div>').appendTo(this.$container);\n\n    this.hide();\n  },\n\n  setContent: function (html) {\n    this.$tip.html(html);\n  },\n\n  setPosition: function (position) {\n    this.$tip.css('left', `${position.left}px`);\n    this.$tip.css('top', `${position.top}px`);\n  },\n\n  show: function () {\n    this.$tip.css('display', 'block');\n  },\n\n  hide: function () {\n    this.$tip.css('display', 'none');\n  },\n});\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.BaseChart\n */\nCraft.charts.BaseChart = Garnish.Base.extend(\n  {\n    $container: null,\n    $chart: null,\n\n    chartBaseClass: 'cp-chart',\n    dataTable: null,\n\n    formatLocale: null,\n    timeFormatLocale: null,\n    orientation: null,\n\n    svg: null,\n    width: null,\n    height: null,\n\n    init: function (container, settings) {\n      this.$container = container;\n\n      this.setSettings(Craft.charts.BaseChart.defaults);\n      this.setSettings(settings);\n\n      var globalSettings = {\n        formats: window.d3Formats,\n        formatLocaleDefinition: window.d3FormatLocaleDefinition,\n        timeFormatLocaleDefinition: window.d3TimeFormatLocaleDefinition,\n      };\n\n      this.setSettings(globalSettings);\n\n      d3.select(window).on('resize', () => {\n        this.resize();\n      });\n    },\n\n    setSettings: function (settings, defaults) {\n      var baseSettings =\n        typeof this.settings === 'undefined' ? {} : this.settings;\n      this.settings = $.extend(true, {}, baseSettings, defaults, settings);\n    },\n\n    draw: function (dataTable, settings) {\n      // Settings and chart attributes\n\n      this.setSettings(settings);\n\n      this.dataTable = dataTable;\n      this.formatLocale = d3.formatLocale(this.settings.formatLocaleDefinition);\n      this.timeFormatLocale = d3.timeFormatLocale(\n        this.settings.timeFormatLocaleDefinition\n      );\n      this.orientation = this.settings.orientation;\n\n      // Set (or reset) the chart element\n\n      if (this.$chart) {\n        this.$chart.remove();\n      }\n\n      var className = this.chartBaseClass;\n\n      if (this.settings.chartClass) {\n        className += ' ' + this.settings.chartClass;\n      }\n\n      this.$chart = $(`<div class=\"${className}\" />`).appendTo(this.$container);\n    },\n\n    resize: function () {\n      this.draw(this.dataTable, this.settings);\n    },\n\n    onAfterDrawTicks: function () {\n      // White border for ticks' text\n      $('.tick', this.$chart).each(function (tickKey, tick) {\n        var $tickText = $('text', tick);\n\n        var $clone = $tickText.clone();\n        $clone.appendTo(tick);\n\n        $tickText.attr('stroke', '#ffffff');\n        $tickText.attr('stroke-width', 3);\n      });\n    },\n  },\n  {\n    defaults: {\n      formatLocaleDefinition: null,\n      timeFormatLocaleDefinition: null,\n      formats: {\n        numberFormat: ',.2f',\n        percentFormat: ',.2%',\n        currencyFormat: '$,.2f',\n        shortDateFormats: {\n          day: '%-m/%-d',\n          month: '%-m/%y',\n          year: '%Y',\n        },\n      },\n      margin: {top: 0, right: 0, bottom: 0, left: 0},\n      chartClass: null,\n      colors: ['#0594D1', '#DE3800', '#FF9A00', '#009802', '#9B009B'],\n    },\n  }\n);\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.Area\n */\nCraft.charts.Area = Craft.charts.BaseChart.extend(\n  {\n    tip: null,\n    drawingArea: null,\n\n    init: function (container, settings) {\n      this.base(container, Craft.charts.Area.defaults);\n\n      this.setSettings(settings);\n    },\n\n    draw: function (dataTable, settings) {\n      this.base(dataTable, settings);\n\n      if (this.tip) {\n        this.tip = null;\n      }\n\n      var margin = this.getChartMargin();\n\n      this.width = this.$chart.width() - margin.left - margin.right;\n      this.height = this.$chart.height() - margin.top - margin.bottom;\n\n      // Append SVG to chart element\n\n      var svg = {\n        width: this.width + (margin.left + margin.right),\n        height: this.height + (margin.top + margin.bottom),\n        translateX: this.orientation !== 'rtl' ? margin.left : margin.right,\n        translateY: margin.top,\n      };\n\n      this.svg = d3\n        .select(this.$chart.get(0))\n        .append('svg')\n        .attr('width', svg.width)\n        .attr('height', svg.height);\n\n      this.drawingArea = this.svg\n        .append('g')\n        .attr('transform', `translate(${svg.translateX},${svg.translateY})`);\n\n      // Draw elements\n\n      this.drawTicks();\n      this.drawAxes();\n      this.drawChart();\n      this.drawTipTriggers();\n    },\n\n    drawTicks: function () {\n      // Draw X ticks\n\n      var x = this.getX(true);\n      var xTicks = 3;\n      var xAxis = d3\n        .axisBottom(x)\n        .tickFormat(this.getXFormatter())\n        .ticks(xTicks);\n\n      this.drawingArea\n        .append('g')\n        .attr('class', 'x ticks-axis')\n        .attr('transform', `translate(0, ${this.height})`)\n        .call(xAxis);\n\n      // Draw Y ticks\n\n      var y = this.getY();\n      var yTicks = 2;\n      var yAxis;\n\n      if (this.orientation !== 'rtl') {\n        yAxis = d3\n          .axisLeft(y)\n          .tickFormat(this.getYFormatter())\n          .tickValues(this.getYTickValues())\n          .ticks(yTicks);\n\n        this.drawingArea.append('g').attr('class', 'y ticks-axis').call(yAxis);\n      } else {\n        yAxis = d3\n          .axisRight(y)\n          .tickFormat(this.getYFormatter())\n          .tickValues(this.getYTickValues())\n          .ticks(yTicks);\n\n        this.drawingArea\n          .append('g')\n          .attr('class', 'y ticks-axis')\n          .attr('transform', `translate(${this.width},0)`)\n          .call(yAxis);\n      }\n\n      // On after draw ticks\n\n      this.onAfterDrawTicks();\n    },\n\n    drawAxes: function () {\n      if (this.settings.xAxis.showAxis) {\n        var x = this.getX();\n        var xAxis = d3.axisBottom(x).ticks(0).tickSizeOuter(0);\n        this.drawingArea\n          .append('g')\n          .attr('class', 'x axis')\n          .attr('transform', `translate(0, ${this.height})`)\n          .call(xAxis);\n      }\n\n      if (this.settings.yAxis.showAxis) {\n        var y = this.getY();\n        var chartPadding = 0;\n        var yAxis;\n\n        if (this.orientation === 'rtl') {\n          yAxis = d3.axisLeft(y).ticks(0);\n          this.drawingArea\n            .append('g')\n            .attr('class', 'y axis')\n            .attr('transform', `translate(${this.width - chartPadding}, 0)`)\n            .call(yAxis);\n        } else {\n          yAxis = d3.axisRight(y).ticks(0);\n          this.drawingArea\n            .append('g')\n            .attr('class', 'y axis')\n            .attr('transform', `translate(${chartPadding}, 0)`)\n            .call(yAxis);\n        }\n      }\n    },\n\n    drawChart: function () {\n      var x = this.getX(true);\n      var y = this.getY();\n\n      // X & Y grid lines\n\n      if (this.settings.xAxis.gridlines) {\n        var xLineAxis = d3.axisBottom(x);\n\n        this.drawingArea\n          .append('g')\n          .attr('class', 'x grid-line')\n          .attr('transform', `translate(0,${this.height})`)\n          .call(xLineAxis.tickSize(-this.height, 0, 0).tickFormat(''));\n      }\n\n      var yTicks = 2;\n\n      if (this.settings.yAxis.gridlines) {\n        var yLineAxis = d3.axisLeft(y);\n\n        this.drawingArea\n          .append('g')\n          .attr('class', 'y grid-line')\n          .attr('transform', 'translate(0 , 0)')\n          .call(\n            yLineAxis\n              .tickSize(-this.width, 0)\n              .tickFormat('')\n              .tickValues(this.getYTickValues())\n              .ticks(yTicks)\n          );\n      }\n\n      // Line\n\n      var line = d3\n        .line()\n        .x(function (d) {\n          return x(d[0]);\n        })\n        .y(function (d) {\n          return y(d[1]);\n        });\n\n      this.drawingArea\n        .append('g')\n        .attr('class', 'chart-line')\n        .append('path')\n        .datum(this.dataTable.rows)\n        .style('fill', 'none')\n        .style('stroke', this.settings.colors[0])\n        .style('stroke-width', '3px')\n        .attr('d', line);\n\n      // Area\n\n      var area = d3\n        .area()\n        .x(function (d) {\n          return x(d[0]);\n        })\n        .y0(this.height)\n        .y1(function (d) {\n          return y(d[1]);\n        });\n\n      this.drawingArea\n        .append('g')\n        .attr('class', 'chart-area')\n        .append('path')\n        .datum(this.dataTable.rows)\n        .style('fill', this.settings.colors[0])\n        .style('fill-opacity', '0.3')\n        .attr('d', area);\n\n      // Plots\n\n      if (this.settings.plots) {\n        this.drawingArea\n          .append('g')\n          .attr('class', 'plots')\n          .selectAll('circle')\n          .data(this.dataTable.rows)\n          .enter()\n          .append('circle')\n          .style('fill', this.settings.colors[0])\n          .attr('class', (d, index) => `plot plot-${index}`)\n          .attr('r', 4)\n          .attr('cx', (d) => x(d[0]))\n          .attr('cy', (d) => y(d[1]));\n      }\n    },\n\n    drawTipTriggers: function () {\n      if (this.settings.tips) {\n        if (!this.tip) {\n          this.tip = new Craft.charts.Tip(this.$chart);\n        }\n\n        // Define xAxisTickInterval\n\n        var chartMargin = this.getChartMargin();\n        var tickSizeOuter = 6;\n        var length =\n          this.drawingArea.select('.x path.domain').node().getTotalLength() -\n          chartMargin.left -\n          chartMargin.right -\n          tickSizeOuter * 2;\n        var xAxisTickInterval = length / (this.dataTable.rows.length - 1);\n\n        // Tip trigger width\n\n        var tipTriggerWidth = Math.max(0, xAxisTickInterval);\n\n        // Draw triggers\n\n        var x = this.getX(true);\n        var y = this.getY();\n\n        this.drawingArea\n          .append('g')\n          .attr('class', 'tip-triggers')\n          .selectAll('rect')\n          .data(this.dataTable.rows)\n          .enter()\n          .append('rect')\n          .attr('class', 'tip-trigger')\n          .style('fill', 'transparent')\n          .style('fill-opacity', '1')\n          .attr('width', tipTriggerWidth)\n          .attr('height', this.height)\n          .attr('x', (d) => x(d[0]) - tipTriggerWidth / 2)\n          .on('mouseover', (d, index) => {\n            // Expand plot\n\n            this.drawingArea.select('.plot-' + index).attr('r', 5);\n\n            // Set tip content\n\n            var $content = $('<div />');\n            var $xValue = $('<div class=\"x-value\" />').appendTo($content);\n            var $yValue = $('<div class=\"y-value\" />').appendTo($content);\n\n            $xValue.html(this.getXFormatter()(d[0]));\n            $yValue.html(this.getYFormatter()(d[1]));\n\n            var content = $content.get(0);\n\n            this.tip.setContent(content);\n\n            // Set tip position\n\n            var margin = this.getChartMargin();\n\n            var offset = 24;\n            var top = y(d[1]) + offset;\n            var left;\n\n            if (this.orientation !== 'rtl') {\n              left = x(d[0]) + margin.left + offset;\n\n              var calcLeft =\n                this.$chart.offset().left + left + this.tip.$tip.width();\n              var maxLeft =\n                this.$chart.offset().left + this.$chart.width() - offset;\n\n              if (calcLeft > maxLeft) {\n                left = x(d[0]) - (this.tip.$tip.width() + offset);\n              }\n            } else {\n              left = x(d[0]) - (this.tip.$tip.width() + margin.left + offset);\n            }\n\n            if (left < 0) {\n              left = x(d[0]) + margin.left + offset;\n            }\n\n            var position = {\n              top: top,\n              left: left,\n            };\n\n            this.tip.setPosition(position);\n\n            // Show tip\n\n            this.tip.show();\n          })\n          .on('mouseout', (d, index) => {\n            // Unexpand Plot\n            this.drawingArea.select('.plot-' + index).attr('r', 4);\n\n            // Hide tip\n            this.tip.hide();\n          });\n      }\n    },\n\n    getChartMargin: function () {\n      var margin = this.settings.margin;\n\n      // Estimate the max width of y ticks and set it as the left margin\n\n      var values = this.getYTickValues();\n      var yTicksMaxWidth = 0;\n\n      $.each(values, (key, value) => {\n        var characterWidth = 8;\n\n        var formatter = this.getYFormatter();\n\n        var formattedValue = formatter(value);\n        var computedTickWidth = formattedValue.length * characterWidth;\n\n        if (computedTickWidth > yTicksMaxWidth) {\n          yTicksMaxWidth = computedTickWidth;\n        }\n      });\n\n      yTicksMaxWidth += 10;\n\n      margin.left = yTicksMaxWidth;\n\n      return margin;\n    },\n\n    getX: function (padded) {\n      var xDomainMin = d3.min(this.dataTable.rows, function (d) {\n        return d[0];\n      });\n\n      var xDomainMax = d3.max(this.dataTable.rows, function (d) {\n        return d[0];\n      });\n\n      var xDomain = [xDomainMin, xDomainMax];\n\n      if (this.orientation === 'rtl') {\n        xDomain = [xDomainMax, xDomainMin];\n      }\n\n      var left = 0;\n      var right = 0;\n\n      if (padded) {\n        left = 0;\n        right = 0;\n      }\n\n      var x = d3.scaleTime().range([left, this.width - right]);\n\n      x.domain(xDomain);\n\n      return x;\n    },\n\n    getY: function () {\n      var yDomain = [0, this.getYMaxValue()];\n\n      var y = d3.scaleLinear().range([this.height, 0]);\n\n      y.domain(yDomain);\n\n      return y;\n    },\n\n    getXFormatter: function () {\n      var formatter;\n\n      if (this.settings.xAxis.formatter !== $.noop) {\n        formatter = this.settings.xAxis.formatter(this);\n      } else {\n        formatter = Craft.charts.utils.getTimeFormatter(\n          this.timeFormatLocale,\n          this.settings\n        );\n      }\n\n      return formatter;\n    },\n\n    getYFormatter: function () {\n      var formatter;\n\n      if (this.settings.yAxis.formatter !== $.noop) {\n        formatter = this.settings.yAxis.formatter(this);\n      } else {\n        formatter = Craft.charts.utils.getNumberFormatter(\n          this.formatLocale,\n          this.dataTable.columns[1].type,\n          this.settings\n        );\n      }\n\n      return formatter;\n    },\n\n    getYMaxValue: function () {\n      return d3.max(this.dataTable.rows, function (d) {\n        return d[1];\n      });\n    },\n\n    getYTickValues: function () {\n      var maxValue = this.getYMaxValue();\n\n      if (maxValue > 1) {\n        return [maxValue / 2, maxValue];\n      } else {\n        return [0, maxValue];\n      }\n    },\n  },\n  {\n    defaults: {\n      chartClass: 'area',\n      margin: {top: 25, right: 5, bottom: 25, left: 0},\n      plots: true,\n      tips: true,\n      xAxis: {\n        gridlines: false,\n        showAxis: true,\n        formatter: $.noop,\n      },\n      yAxis: {\n        gridlines: true,\n        showAxis: false,\n        formatter: $.noop,\n      },\n    },\n  }\n);\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.Utils\n */\nCraft.charts.utils = {\n  getDuration: function (seconds) {\n    var secondsNum = parseInt(seconds, 10);\n\n    var duration = {\n      hours: Math.floor(secondsNum / 3600),\n      minutes: Math.floor((secondsNum - duration.hours * 3600) / 60),\n      seconds: secondsNum - duration.hours * 3600 - duration.minutes * 60,\n    };\n\n    if (duration.hours < 10) {\n      duration.hours = `0${duration.hours}`;\n    }\n\n    if (duration.minutes < 10) {\n      duration.minutes = `0${duration.minutes}`;\n    }\n\n    if (duration.seconds < 10) {\n      duration.seconds = `0${duration.seconds}`;\n    }\n\n    return `${duration.hours}:${duration.minutes}:${duration.seconds}`;\n  },\n\n  getTimeFormatter: function (timeFormatLocale, chartSettings) {\n    switch (chartSettings.dataScale) {\n      case 'year':\n        return timeFormatLocale.format('%Y');\n\n      case 'month':\n        return timeFormatLocale.format(\n          chartSettings.formats.shortDateFormats.month\n        );\n\n      case 'hour':\n        return timeFormatLocale.format(\n          `${chartSettings.formats.shortDateFormats.day} %H:00:00`\n        );\n\n      default:\n        return timeFormatLocale.format(\n          chartSettings.formats.shortDateFormats.day\n        );\n    }\n  },\n\n  getNumberFormatter: function (formatLocale, type, chartSettings) {\n    switch (type) {\n      case 'currency':\n        return formatLocale.format(chartSettings.formats.currencyFormat);\n\n      case 'percent':\n        return formatLocale.format(chartSettings.formats.percentFormat);\n\n      case 'time':\n        return Craft.charts.utils.getDuration;\n\n      case 'number':\n        return formatLocale.format(chartSettings.formats.numberFormat);\n    }\n  },\n};\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Color input\n */\nCraft.ColorInput = Garnish.Base.extend(\n  {\n    $container: null,\n    $input: null,\n    $colorContainer: null,\n    $colorPreview: null,\n    $colorInput: null,\n\n    init: function (container) {\n      this.$container = $(container);\n      this.$input = this.$container.find('.color-input');\n      this.$colorContainer = this.$container.children('.color');\n      this.$colorPreview = this.$colorContainer.children('.color-preview');\n\n      this.createColorInput();\n      this.handleTextChange();\n\n      this.addListener(this.$input, 'input', 'handleTextChange');\n    },\n\n    createColorInput: function () {\n      var input = document.createElement('input');\n      input.setAttribute('type', 'color');\n\n      if (input.type !== 'color') {\n        // The browser doesn't support input[type=color]\n        return;\n      }\n\n      this.$colorContainer.removeClass('static');\n      this.$colorInput = $(input)\n        .addClass('color-preview-input')\n        .attr({\n          'aria-controls': this.$input.attr('id'),\n          'aria-label': Craft.t('app', 'Color picker'),\n        })\n        .appendTo(this.$colorPreview);\n\n      this.addListener(this.$colorInput, 'click', function (ev) {\n        ev.stopPropagation();\n      });\n\n      this.addListener(this.$colorContainer, 'click', function () {\n        this.$colorInput.trigger('click');\n      });\n\n      this.addListener(this.$colorInput, 'input', 'updateColor');\n    },\n\n    updateColor: function () {\n      this.$input.val(this.$colorInput.val());\n      this.handleTextChange();\n    },\n\n    handleTextChange: function () {\n      let val = this.$input.val();\n\n      if (val !== (val = Craft.trim(val))) {\n        this.$input.val(val);\n      }\n\n      // Chop off the #\n      if (val.length && val[0] === '#') {\n        val = val.substring(1);\n        this.$input.val(val);\n      }\n\n      // If empty, set the preview to transparent\n      if (!val.length) {\n        this.$colorPreview.css('background-color', '');\n        return;\n      }\n\n      // Now normalize it for the UI stuff\n      if (val.length === 3) {\n        val = val[0].repeat(2) + val[1].repeat(2) + val[2].repeat(2);\n      }\n\n      if (val.match(/^[0-9a-f]{6}$/i)) {\n        this.$colorPreview.css('background-color', `#${val}`);\n        if (this.$colorInput) {\n          this.$colorInput.val(`#${val}`);\n        }\n      } else {\n        this.$colorPreview.css('background-color', '');\n      }\n    },\n  },\n  {\n    _browserSupportsColorInputs: null,\n\n    doesBrowserSupportColorInputs: function () {\n      if (Craft.ColorInput._browserSupportsColorInputs === null) {\n      }\n\n      return Craft.ColorInput._browserSupportsColorInputs;\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * CP Screen Slideout\n */\nCraft.CpScreenSlideout = Craft.Slideout.extend(\n  {\n    action: null,\n\n    namespace: null,\n\n    showingLoadSpinner: false,\n    hasTabs: false,\n    hasCpLink: false,\n    hasSidebar: false,\n\n    $header: null,\n    $toolbar: null,\n    $tabContainer: null,\n    $loadSpinner: null,\n    $editLink: null,\n    $sidebarBtn: null,\n\n    $body: null,\n    $content: null,\n\n    $sidebar: null,\n\n    $footer: null,\n    $noticeContainer: null,\n    $cancelBtn: null,\n    $saveBtn: null,\n\n    tabManager: null,\n    showingSidebar: false,\n\n    cancelToken: null,\n    ignoreFailedRequest: false,\n    fieldsWithErrors: null,\n\n    init: function (action, settings) {\n      this.action = action;\n      this.setSettings(settings, Craft.CpScreenSlideout.defaults);\n\n      this.fieldsWithErrors = [];\n\n      // Header\n      this.$header = $('<header/>', {class: 'pane-header'});\n      this.$toolbar = $('<div/>', {class: 'so-toolbar'}).appendTo(this.$header);\n      this.$tabContainer = $('<div/>', {class: 'pane-tabs'}).appendTo(\n        this.$toolbar\n      );\n      this.$loadSpinner = $('<div/>', {\n        class: 'spinner',\n        title: Craft.t('app', 'Loading'),\n        'aria-label': Craft.t('app', 'Loading'),\n      }).appendTo(this.$toolbar);\n      this.$editLink = $('<a/>', {\n        target: '_blank',\n        class: 'btn header-btn hidden',\n        title: Craft.t('app', 'Open the full edit page in a new tab'),\n        'aria-label': Craft.t('app', 'Open the full edit page in a new tab'),\n        'data-icon': 'external',\n      }).appendTo(this.$toolbar);\n      this.$sidebarBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn header-btn hidden sidebar-btn',\n        title: Craft.t('app', 'Show sidebar'),\n        'aria-label': Craft.t('app', 'Show sidebar'),\n        'data-icon': `sidebar-${Garnish.ltr ? 'right' : 'left'}`,\n        'aria-expanded': 'false',\n      }).appendTo(this.$toolbar);\n\n      this.addListener(this.$sidebarBtn, 'click', (ev) => {\n        ev.preventDefault();\n        if (!this.showingSidebar) {\n          this.showSidebar();\n        } else {\n          this.hideSidebar();\n        }\n      });\n\n      // Body\n      this.$body = $('<div/>', {class: 'so-body'});\n\n      // Content\n      this.$content = $('<div/>', {class: 'so-content'}).appendTo(this.$body);\n\n      // Sidebar\n      this.$sidebar = $('<div/>', {\n        class: 'so-sidebar details hidden',\n      }).appendTo(this.$body);\n\n      // Footer\n      this.$footer = $('<div/>', {class: 'so-footer hidden'});\n      this.$noticeContainer = $('<div/>', {class: 'so-notice'}).appendTo(\n        this.$footer\n      );\n      $('<div/>', {class: 'flex-grow'}).appendTo(this.$footer);\n      const $btnContainer = $('<div/>', {class: 'flex flex-nowrap'}).appendTo(\n        this.$footer\n      );\n      this.$cancelBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn',\n        text: Craft.t('app', 'Cancel'),\n      }).appendTo($btnContainer);\n      this.$saveBtn = Craft.ui\n        .createSubmitButton({\n          label: Craft.t('app', 'Save'),\n          spinner: true,\n        })\n        .appendTo($btnContainer);\n\n      let $contents = this.$header.add(this.$body).add(this.$footer);\n\n      this.base($contents, {\n        containerElement: 'form',\n        containerAttributes: {\n          id: `cp-screen-${Math.floor(Math.random() * 100000000)}`,\n          action: '',\n          method: 'post',\n          novalidate: '',\n          class: 'cp-screen',\n        },\n        closeOnEsc: false,\n        closeOnShadeClick: false,\n      });\n\n      this.$container.data('cpScreen', this);\n      this.on('beforeClose', () => {\n        this.hideSidebar();\n      });\n\n      // Register shortcuts & events\n      Garnish.uiLayerManager.registerShortcut(\n        {\n          keyCode: Garnish.S_KEY,\n          ctrl: true,\n        },\n        (ev) => {\n          this.handleSubmit(ev);\n        }\n      );\n      Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n        this.closeMeMaybe();\n      });\n      this.addListener(this.$cancelBtn, 'click', () => {\n        this.closeMeMaybe();\n      });\n      this.addListener(this.$shade, 'click', () => {\n        this.closeMeMaybe();\n      });\n      this.addListener(this.$container, 'click', (ev) => {\n        const $target = $(event.target);\n\n        if (\n          this.showingSidebar &&\n          !$target.closest(this.$sidebarBtn).length &&\n          !$target.closest(this.$sidebar).length\n        ) {\n          this.hideSidebar();\n        }\n      });\n      this.addListener(this.$container, 'submit', 'handleSubmit');\n\n      this.load();\n    },\n\n    /**\n     * @param {Object} [data={}]\n     * @param {boolean} [refreshInitialData=true]\n     * @returns {Promise}\n     */\n    load: function (data, refreshInitialData) {\n      return new Promise((resolve, reject) => {\n        this.trigger('beforeLoad');\n        this.showLoadSpinner();\n\n        if (this.cancelToken) {\n          this.ignoreFailedRequest = true;\n          this.cancelToken.cancel();\n        }\n\n        this.cancelToken = axios.CancelToken.source();\n\n        Craft.sendActionRequest(\n          'GET',\n          this.action,\n          $.extend(\n            {\n              params: Object.assign({}, this.getParams(), this.settings.params),\n              cancelToken: this.cancelToken.token,\n              headers: {\n                'X-Craft-Container-Id': this.$container.attr('id'),\n              },\n            },\n            this.settings.requestOptions\n          )\n        )\n          .then((response) => {\n            this.update(response.data)\n              .then(() => {\n                if (refreshInitialData !== false) {\n                  this.$container.data('delta-names', response.data.deltaNames);\n                  this.$container.data(\n                    'initial-delta-values',\n                    response.data.initialDeltaValues\n                  );\n                  this.$container.data(\n                    'initialSerializedValue',\n                    this.$container.serialize()\n                  );\n                }\n                resolve();\n              })\n              .catch((e) => {\n                reject(e);\n              });\n          })\n          .catch((e) => {\n            if (!this.ignoreFailedRequest) {\n              Craft.cp.displayError();\n              reject(e);\n            }\n            this.ignoreFailedRequest = false;\n          })\n          .finally(() => {\n            this.hideLoadSpinner();\n            this.cancelToken = null;\n          });\n      });\n    },\n\n    getParams: function () {\n      return {};\n    },\n\n    updateHeaderVisibility: function () {\n      // Should the header be shown regardless of viewport size?\n      const forceShow =\n        this.settings.showHeader ||\n        this.hasTabs ||\n        this.hasCpLink ||\n        this.showingLoadSpinner;\n\n      if (forceShow || this.hasSidebar) {\n        this.$header.removeClass('hidden');\n      } else {\n        this.$header.addClass('hidden');\n      }\n\n      if (forceShow) {\n        this.$header.addClass('so-visible');\n      } else {\n        this.$header.removeClass('so-visible');\n      }\n    },\n\n    showLoadSpinner: function () {\n      this.$loadSpinner.removeClass('hidden');\n      this.showingLoadSpinner = true;\n      this.updateHeaderVisibility();\n    },\n\n    hideLoadSpinner: function () {\n      this.$loadSpinner.addClass('hidden');\n      this.showingLoadSpinner = false;\n      this.updateHeaderVisibility();\n    },\n\n    /**\n     * @param {Object} data\n     * @returns {Promise}\n     */\n    update: function (data) {\n      return new Promise((resolve) => {\n        this.namespace = data.namespace;\n        this.$content.html(data.content);\n\n        if (data.submitButtonLabel) {\n          this.$saveBtn.text(data.submitButtonLabel);\n        }\n\n        this.updateTabs(data.tabs);\n\n        if (data.formAttributes) {\n          Craft.setElementAttributes(this.$container, data.formAttributes);\n        }\n\n        if (data.editUrl) {\n          this.$editLink.removeClass('hidden').attr('href', data.editUrl);\n          this.hasCpLink = true;\n        } else {\n          this.$editLink.addClass('hidden');\n          this.hasCpLink = false;\n        }\n\n        if (data.sidebar) {\n          this.$container.addClass('has-sidebar');\n          this.$sidebarBtn.removeClass('hidden');\n          this.$sidebar.html(data.sidebar);\n\n          // Open outbound links in new windows\n          this.$sidebar.find('a').each(function () {\n            if (\n              this.hostname.length &&\n              typeof $(this).attr('target') === 'undefined'\n            ) {\n              $(this).attr('target', '_blank');\n            }\n          });\n\n          this.hasSidebar = true;\n        } else {\n          this.$container.removeClass('has-sidebar');\n          this.$sidebarBtn.addClass('hidden');\n          this.$sidebar.addClass('hidden').html('');\n          this.hasSidebar = false;\n        }\n\n        if (data.notice) {\n          this.$noticeContainer.html(data.notice);\n        } else {\n          this.$noticeContainer.empty();\n        }\n\n        this.updateHeaderVisibility();\n        this.$footer.removeClass('hidden');\n\n        Garnish.requestAnimationFrame(() => {\n          Craft.appendHeadHtml(data.headHtml);\n          Craft.appendBodyHtml(data.bodyHtml);\n\n          Craft.initUiElements(this.$content);\n          new Craft.ElementThumbLoader().load($(this.$content));\n\n          if (data.sidebar) {\n            Craft.initUiElements(this.$sidebar);\n            new Craft.ElementThumbLoader().load(this.$sidebar);\n          }\n\n          if (!Garnish.isMobileBrowser()) {\n            Craft.setFocusWithin(this.$content);\n          }\n\n          resolve();\n          this.trigger('load');\n        });\n      });\n    },\n\n    updateTabs: function (tabs) {\n      if (this.tabManager) {\n        this.tabManager.destroy();\n        this.tabManager = null;\n        this.$tabContainer.html('');\n      }\n\n      this.hasTabs = !!tabs;\n\n      if (this.hasTabs) {\n        const $tabContainer = $(tabs);\n        this.$tabContainer.replaceWith($tabContainer);\n        this.$tabContainer = $tabContainer;\n        this.tabManager = new Craft.Tabs(this.$tabContainer);\n        this.tabManager.on('deselectTab', (ev) => {\n          $(ev.$tab.attr('href')).addClass('hidden');\n        });\n        this.tabManager.on('selectTab', (ev) => {\n          $(ev.$tab.attr('href')).removeClass('hidden');\n          Garnish.$win.trigger('resize');\n          this.$body.trigger('scroll');\n        });\n      }\n    },\n\n    showSidebar: function () {\n      if (this.showingSidebar) {\n        return;\n      }\n\n      this.$body.scrollTop(0).addClass('no-scroll');\n\n      this.$sidebar\n        .off('transitionend.so')\n        .css(this._closedSidebarStyles())\n        .removeClass('hidden');\n\n      // Hack to force CSS animations\n      this.$sidebar[0].offsetWidth;\n\n      this.$sidebar.css(this._openedSidebarStyles());\n\n      if (!Garnish.isMobileBrowser()) {\n        this.$sidebar.one('transitionend.so', () => {\n          Craft.setFocusWithin(this.$sidebar);\n        });\n      }\n\n      Craft.trapFocusWithin(this.$sidebar);\n\n      this.$sidebarBtn.addClass('active').attr({\n        'aria-expanded': 'true',\n      });\n\n      Garnish.$win.trigger('resize');\n      this.$sidebar.trigger('scroll');\n\n      Garnish.uiLayerManager.addLayer();\n      Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n        this.hideSidebar();\n      });\n\n      this.showingSidebar = true;\n    },\n\n    hideSidebar: function () {\n      if (!this.showingSidebar) {\n        return;\n      }\n\n      this.$body.removeClass('no-scroll');\n\n      this.$sidebar\n        .off('transitionend.so')\n        .css(this._closedSidebarStyles())\n        .one('transitionend.so', () => {\n          this.$sidebar.addClass('hidden');\n          this.$sidebarBtn.focus();\n        });\n\n      this.$sidebarBtn.removeClass('active').attr({\n        'aria-expanded': 'false',\n      });\n\n      Garnish.uiLayerManager.removeLayer();\n\n      this.showingSidebar = false;\n    },\n\n    _openedSidebarStyles: function () {\n      return {\n        [Garnish.ltr ? 'right' : 'left']: '0',\n      };\n    },\n\n    _closedSidebarStyles: function () {\n      return {\n        [Garnish.ltr ? 'right' : 'left']: '-350px',\n      };\n    },\n\n    showSubmitSpinner: function () {\n      this.$saveBtn.addClass('loading');\n    },\n\n    hideSubmitSpinner: function () {\n      this.$saveBtn.removeClass('loading');\n    },\n\n    handleSubmit: function (ev) {\n      ev.preventDefault();\n      this.submit();\n    },\n\n    submit: function () {\n      this.showSubmitSpinner();\n\n      const data = Craft.findDeltaData(\n        this.$container.data('initialSerializedValue'),\n        this.$container.serialize(),\n        this.$container.data('delta-names'),\n        null,\n        this.$container.data('initial-delta-values')\n      );\n\n      Craft.sendActionRequest('POST', null, {\n        data,\n        headers: {\n          'X-Craft-Namespace': this.namespace,\n        },\n      })\n        .then((response) => {\n          this.handleSubmitResponse(response);\n        })\n        .catch((error) => {\n          this.handleSubmitError(error);\n        })\n        .finally(() => {\n          this.hideSubmitSpinner();\n        });\n    },\n\n    handleSubmitResponse: function (response) {\n      this.clearErrors();\n      const data = response.data || {};\n      if (data.message) {\n        Craft.cp.displaySuccess(data.message, data.notificationSettings);\n      }\n      this.trigger('submit', {\n        response: response,\n        data: (data.modelName && data[data.modelName]) || {},\n      });\n      if (this.settings.closeOnSubmit) {\n        this.close();\n      }\n    },\n\n    handleSubmitError: function (error) {\n      if (\n        !error.isAxiosError ||\n        !error.response ||\n        !error.response.status === 400\n      ) {\n        Craft.cp.displayError();\n        throw error;\n      }\n\n      const data = error.response.data || {};\n      Craft.cp.displayError(data.message);\n      if (data.errors) {\n        this.showErrors(data.errors);\n      }\n    },\n\n    /**\n     * @param {string[]} errors\n     */\n    showErrors: function (errors) {\n      this.clearErrors();\n\n      Object.entries(errors).forEach(([name, fieldErrors]) => {\n        const $field = this.$container.find(`[data-attribute=\"${name}\"]`);\n        if ($field) {\n          Craft.ui.addErrorsToField($field, fieldErrors);\n          this.fieldsWithErrors.push($field);\n        }\n      });\n    },\n\n    clearErrors: function () {\n      this.fieldsWithErrors.forEach(($field) => {\n        Craft.ui.clearErrorsFromField($field);\n      });\n    },\n\n    isDirty: function () {\n      return (\n        typeof this.$container.data('initialSerializedValue') !== 'undefined' &&\n        this.$container.serialize() !==\n          this.$container.data('initialSerializedValue')\n      );\n    },\n\n    closeMeMaybe: function () {\n      if (!this.isOpen) {\n        return;\n      }\n\n      if (\n        !this.isDirty() ||\n        confirm(\n          Craft.t(\n            'app',\n            'Are you sure you want to close this screen? Any changes will be lost.'\n          )\n        )\n      ) {\n        this.close();\n      }\n    },\n\n    close: function () {\n      this.base();\n\n      if (this.cancelToken) {\n        this.ignoreFailedRequest = true;\n        this.cancelToken.cancel();\n      }\n    },\n  },\n  {\n    defaults: {\n      params: {},\n      requestOptions: {},\n      showHeader: null,\n      closeOnSubmit: true,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n// Use old jQuery prefilter behavior\n// see https://jquery.com/upgrade-guide/3.5/\nvar rxhtmlTag =\n  /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi;\njQuery.htmlPrefilter = function (html) {\n  return html.replace(rxhtmlTag, '<$1></$2>');\n};\n\n// Set all the standard Craft.* stuff\n$.extend(Craft, {\n  navHeight: 48,\n\n  /**\n   * @callback indexKeyCallback\n   * @param {Object} currentValue\n   * @param {number} [index]\n   * @returns {string}\n   */\n  /**\n   * Indexes an array of objects by a specified key\n   *\n   * @param {Object[]} arr\n   * @param {(string|indexKeyCallback)} key\n   */\n  index: function (arr, key) {\n    if (!$.isArray(arr)) {\n      throw 'The first argument passed to Craft.index() must be an array.';\n    }\n\n    return arr.reduce((index, obj, i) => {\n      index[typeof key === 'string' ? obj[key] : key(obj, i)] = obj;\n      return index;\n    }, {});\n  },\n\n  /**\n   * Groups an array of objects by a specified key\n   *\n   * @param {Object[]} arr\n   * @param {(string|indexKeyCallback)} key\n   */\n  group: function (arr, key) {\n    if (!$.isArray(arr)) {\n      throw 'The first argument passed to Craft.group() must be an array.';\n    }\n\n    let index = {};\n\n    return arr.reduce((grouped, obj, i) => {\n      const thisKey = typeof key === 'string' ? obj[key] : key(obj, i);\n      if (!index.hasOwnProperty(thisKey)) {\n        index[thisKey] = [[], thisKey];\n        grouped.push(index[thisKey]);\n      }\n      index[thisKey][0].push(obj);\n      return grouped;\n    }, []);\n  },\n\n  /**\n   * Get a translated message.\n   *\n   * @param {string} category\n   * @param {string} message\n   * @param {Object} params\n   * @returns {string}\n   */\n  t: function (category, message, params) {\n    if (\n      typeof Craft.translations[category] !== 'undefined' &&\n      typeof Craft.translations[category][message] !== 'undefined'\n    ) {\n      message = Craft.translations[category][message];\n    }\n\n    if (params) {\n      return this.formatMessage(message, params);\n    }\n\n    return message;\n  },\n\n  formatMessage: function (pattern, args) {\n    let tokens;\n    if ((tokens = this._tokenizePattern(pattern)) === false) {\n      throw 'Message pattern is invalid.';\n    }\n    for (let i = 0; i < tokens.length; i++) {\n      let token = tokens[i];\n      if (typeof token === 'object') {\n        if ((tokens[i] = this._parseToken(token, args)) === false) {\n          throw 'Message pattern is invalid.';\n        }\n      }\n    }\n    return tokens.join('');\n  },\n\n  _tokenizePattern: function (pattern) {\n    let depth = 1,\n      start,\n      pos;\n    // Get an array of the string characters (factoring in 3+ byte chars)\n    const chars = [...pattern];\n    if ((start = pos = chars.indexOf('{')) === -1) {\n      return [pattern];\n    }\n    let tokens = [chars.slice(0, pos).join('')];\n    while (true) {\n      let open = chars.indexOf('{', pos + 1);\n      let close = chars.indexOf('}', pos + 1);\n      if (open === -1) {\n        open = false;\n      }\n      if (close === -1) {\n        close = false;\n      }\n      if (open === false && close === false) {\n        break;\n      }\n      if (open === false) {\n        open = chars.length;\n      }\n      if (close > open) {\n        depth++;\n        pos = open;\n      } else {\n        depth--;\n        pos = close;\n      }\n      if (depth === 0) {\n        tokens.push(\n          chars\n            .slice(start + 1, pos)\n            .join('')\n            .split(',', 3)\n        );\n        start = pos + 1;\n        tokens.push(chars.slice(start, open).join(''));\n        start = open;\n      }\n\n      if (depth !== 0 && (open === false || close === false)) {\n        break;\n      }\n    }\n    if (depth !== 0) {\n      return false;\n    }\n\n    return tokens;\n  },\n\n  _parseToken: function (token, args) {\n    // parsing pattern based on ICU grammar:\n    // http://icu-project.org/apiref/icu4c/classMessageFormat.html#details\n    const param = Craft.trim(token[0]);\n    if (typeof args[param] === 'undefined') {\n      return `{${token.join(',')}}`;\n    }\n    const arg = args[param];\n    const type =\n      typeof token[1] !== 'undefined' ? Craft.trim(token[1]) : 'none';\n    switch (type) {\n      case 'number':\n        return (() => {\n          let format =\n            typeof token[2] !== 'undefined' ? Craft.trim(token[2]) : null;\n          if (format !== null && format !== 'integer') {\n            throw `Message format 'number' is only supported for integer values.`;\n          }\n          let number = Craft.formatNumber(arg);\n          let pos;\n          if (format === null && (pos = `${arg}`.indexOf('.')) !== -1) {\n            number += `.${arg.substring(pos + 1)}`;\n          }\n          return number;\n        })();\n      case 'none':\n        return arg;\n      case 'select':\n        return (() => {\n          /* http://icu-project.org/apiref/icu4c/classicu_1_1SelectFormat.html\n                        selectStyle = (selector '{' message '}')+\n                        */\n          if (typeof token[2] === 'undefined') {\n            return false;\n          }\n          let select = this._tokenizePattern(token[2]);\n          let c = select.length;\n          let message = false;\n          for (let i = 0; i + 1 < c; i++) {\n            if (Garnish.isArray(select[i]) || !Garnish.isArray(select[i + 1])) {\n              return false;\n            }\n            let selector = Craft.trim(select[i++]);\n            if (\n              (message === false && selector === 'other') ||\n              selector == arg\n            ) {\n              message = select[i].join(',');\n            }\n          }\n          if (message === false) {\n            return false;\n          }\n          return this.formatMessage(message, args);\n        })();\n      case 'plural':\n        return (() => {\n          /* http://icu-project.org/apiref/icu4c/classicu_1_1PluralFormat.html\n                        pluralStyle = [offsetValue] (selector '{' message '}')+\n                        offsetValue = \"offset:\" number\n                        selector = explicitValue | keyword\n                        explicitValue = '=' number  // adjacent, no white space in between\n                        keyword = [^[[:Pattern_Syntax:][:Pattern_White_Space:]]]+\n                        message: see MessageFormat\n                        */\n          if (typeof token[2] === 'undefined') {\n            return false;\n          }\n          let plural = this._tokenizePattern(token[2]);\n          const c = plural.length;\n          let message = false;\n          let offset = 0;\n          for (let i = 0; i + 1 < c; i++) {\n            if (\n              typeof plural[i] === 'object' ||\n              typeof plural[i + 1] !== 'object'\n            ) {\n              return false;\n            }\n            let selector = Craft.trim(plural[i++]);\n            let selectorChars = [...selector];\n\n            if (i === 1 && selector.substring(0, 7) === 'offset:') {\n              let pos = [...selector.replace(/[\\n\\r\\t]/g, ' ')].indexOf(' ', 7);\n              if (pos === -1) {\n                throw 'Message pattern is invalid.';\n              }\n              offset = parseInt(\n                Craft.trim(selectorChars.slice(7, pos).join(''))\n              );\n              selector = Craft.trim(\n                selectorChars\n                  .slice(pos + 1, pos + 1 + selectorChars.length)\n                  .join('')\n              );\n            }\n            if (\n              (message === false && selector === 'other') ||\n              (selector[0] === '=' &&\n                parseInt(\n                  selectorChars.slice(1, 1 + selectorChars.length).join('')\n                ) === arg) ||\n              (selector === 'one' && arg - offset === 1)\n            ) {\n              message = (\n                typeof plural[i] === 'string' ? [plural[i]] : plural[i]\n              )\n                .map((p) => {\n                  return p.replace('#', arg - offset);\n                })\n                .join(',');\n            }\n          }\n          if (message === false) {\n            return false;\n          }\n          return this.formatMessage(message, args);\n        })();\n      default:\n        throw `Message format '${type}' is not supported.`;\n    }\n  },\n\n  formatDate: function (date) {\n    if (typeof date !== 'object') {\n      date = new Date(date);\n    }\n\n    return $.datepicker.formatDate(Craft.datepickerOptions.dateFormat, date);\n  },\n\n  /**\n   * Formats a number.\n   *\n   * @param {string} number\n   * @param {string} [format] D3 format\n   * @returns {string}\n   */\n  formatNumber: function (number, format) {\n    if (typeof format == 'undefined') {\n      format = ',.0f';\n    }\n\n    var formatter = d3.formatLocale(d3FormatLocaleDefinition).format(format);\n\n    return formatter(number);\n  },\n\n  /**\n   * @param {string} key\n   * @param {boolean} shift\n   * @param {boolean} alt\n   */\n  shortcutText: function (key, shift, alt) {\n    if (Craft.clientOs === 'Mac') {\n      return (alt ? '⌥' : '') + (shift ? '⇧' : '') + '⌘' + key;\n    }\n    return 'Ctrl+' + (alt ? 'Alt+' : '') + (shift ? 'Shift+' : '') + key;\n  },\n\n  /**\n   * Escapes some HTML.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  escapeHtml: function (str) {\n    return $('<div/>').text(str).html();\n  },\n\n  /**\n   * Escapes special regular expression characters.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  escapeRegex: function (str) {\n    // h/t https://stackoverflow.com/a/9310752\n    return str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n  },\n\n  /**\n   * Returns the text in a string that might contain HTML tags.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  getText: function (str) {\n    return $('<div/>').html(str).text();\n  },\n\n  /**\n   * Encodes a URI copmonent. Mirrors PHP's rawurlencode().\n   *\n   * @param {string} str\n   * @returns {string}\n   * @see http://stackoverflow.com/questions/1734250/what-is-the-equivalent-of-javascripts-encodeuricomponent-in-php\n   */\n  encodeUriComponent: function (str) {\n    str = encodeURIComponent(str);\n\n    var differences = {\n      '!': '%21',\n      '*': '%2A',\n      \"'\": '%27',\n      '(': '%28',\n      ')': '%29',\n    };\n\n    for (var chr in differences) {\n      var re = new RegExp('\\\\' + chr, 'g');\n      str = str.replace(re, differences[chr]);\n    }\n\n    return str;\n  },\n\n  /**\n   * Selects the full value of a given text input.\n   *\n   * @param {(jQuery|HTMLElement|string)} input\n   */\n  selectFullValue: function (input) {\n    var $input = $(input);\n    var val = $input.val();\n\n    // Does the browser support setSelectionRange()?\n    if (typeof $input[0].setSelectionRange !== 'undefined') {\n      // Select the whole value\n      var length = val.length * 2;\n      $input[0].setSelectionRange(0, length);\n    } else {\n      // Refresh the value to get the cursor positioned at the end\n      $input.val(val);\n    }\n  },\n\n  /**\n   * Formats an ID out of an input name.\n   *\n   * @param {string} inputName\n   * @returns {string}\n   */\n  formatInputId: function (inputName) {\n    return this.rtrim(inputName.replace(/[^\\w\\-]+/g, '-'), '-');\n  },\n\n  /**\n   * @param {string} [path]\n   * @param {(Object|string)} [params]\n   * @param {string} [baseUrl]\n   * @returns {string}\n   */\n  getUrl: function (path, params, baseUrl) {\n    if (typeof path !== 'string') {\n      path = '';\n    }\n\n    // Normalize the params\n    let anchor = null;\n    if ($.isPlainObject(params)) {\n      if (typeof params['#'] !== 'undefined') {\n        anchor = params['#'];\n        delete params['#'];\n      }\n    } else if (typeof params === 'string') {\n      let anchorPos = params.indexOf('#');\n      if (anchorPos !== -1) {\n        anchor = params.substring(anchorPos + 1);\n        params = params.substring(0, anchorPos);\n      }\n      params = Object.fromEntries(new URLSearchParams(params).entries());\n    } else {\n      params = {};\n    }\n\n    // Was there already an anchor on the path?\n    let anchorPos = path.indexOf('#');\n    if (anchorPos !== -1) {\n      // Only keep it if the params didn't specify a new anchor\n      if (!anchor) {\n        anchor = path.substring(anchorPos + 1);\n      }\n      path = path.substring(0, anchorPos);\n    }\n\n    // Were there already any query string params in the path?\n    let qsPos = path.indexOf('?');\n    if (qsPos !== -1) {\n      params = $.extend(\n        Object.fromEntries(\n          new URLSearchParams(path.substring(qsPos + 1)).entries()\n        ),\n        params\n      );\n      path = path.substring(0, qsPos);\n    }\n\n    // Return path if it appears to be an absolute URL.\n    if (path.search('://') !== -1 || path[0] === '/') {\n      return (\n        path +\n        (!$.isEmptyObject(params) ? `?${$.param(params)}` : '') +\n        (anchor ? `#${anchor}` : '')\n      );\n    }\n\n    path = Craft.trim(path, '/');\n\n    // Put it all together\n    let url;\n\n    if (baseUrl) {\n      url = baseUrl;\n\n      if (path && Craft.pathParam) {\n        // Does baseUrl already contain a path?\n        var pathMatch = url.match(\n          new RegExp('[&?]' + Craft.escapeRegex(Craft.pathParam) + '=[^&]+')\n        );\n        if (pathMatch) {\n          url = url.replace(\n            pathMatch[0],\n            Craft.rtrim(pathMatch[0], '/') + '/' + path\n          );\n          path = '';\n        }\n      }\n    } else {\n      url = Craft.baseUrl;\n    }\n\n    // Does the base URL already have a query string?\n    qsPos = url.indexOf('?');\n    if (qsPos !== -1) {\n      params = $.extend(\n        Object.fromEntries(\n          new URLSearchParams(url.substring(qsPos + 1)).entries()\n        ),\n        params\n      );\n      url = url.substring(0, qsPos);\n    }\n\n    if (!Craft.omitScriptNameInUrls && path) {\n      if (Craft.usePathInfo || !Craft.pathParam) {\n        // Make sure that the script name is in the URL\n        if (url.search(Craft.scriptName) === -1) {\n          url = Craft.rtrim(url, '/') + '/' + Craft.scriptName;\n        }\n      } else {\n        // Move the path into the query string params\n\n        // Is the path param already set?\n        if (typeof params[Craft.pathParam] !== 'undefined') {\n          let basePath = Craft.rtrim(params[Craft.pathParam]);\n          path = basePath + (path ? '/' + path : '');\n        }\n\n        params[Craft.pathParam] = path;\n        path = null;\n      }\n    }\n\n    if (path) {\n      url = Craft.rtrim(url, '/') + '/' + path;\n    }\n\n    if (!$.isEmptyObject(params)) {\n      url += `?${$.param(params)}`;\n    }\n\n    if (anchor) {\n      url += `#${anchor}`;\n    }\n\n    return url;\n  },\n\n  /**\n   * @param {string} [path]\n   * @param {(Object|string)} [params]\n   * @returns {string}\n   */\n  getCpUrl: function (path, params) {\n    return this.getUrl(path, params, Craft.baseCpUrl);\n  },\n\n  /**\n   * @param {string} [path]\n   * @param {(Object|string)} [params]\n   * @returns {string}\n   */\n  getSiteUrl: function (path, params) {\n    return this.getUrl(path, params, Craft.baseSiteUrl);\n  },\n\n  /**\n   * Returns an action URL.\n   *\n   * @param {string} action\n   * @param {(Object|string)} [params]\n   * @returns {string}\n   */\n  getActionUrl: function (action, params) {\n    return Craft.getUrl(action, params, Craft.actionUrl);\n  },\n\n  /**\n   * Redirects the window to a given URL.\n   *\n   * @param {string} url\n   */\n  redirectTo: function (url) {\n    document.location.href = this.getUrl(url);\n  },\n\n  /**\n   * Replaces the page’s current URL.\n   *\n   * The location hash will be left intact, unless the given URL specifies one.\n   *\n   * @param {string} url\n   */\n  setUrl: function (url) {\n    if (typeof history === 'undefined') {\n      return;\n    }\n\n    if (!url.match(/#/)) {\n      url += document.location.hash;\n    }\n\n    history.replaceState({}, '', url);\n  },\n\n  /**\n   * Replaces the page’s current URL based on the given path, leaving the current query string and hash intact.\n   *\n   * @param {string} path\n   */\n  setPath: function (path) {\n    this.path = path;\n    this.setUrl(Craft.getUrl(path, document.location.search));\n  },\n\n  /**\n   * Replaces the page’s current URL based on the given query param name and value, leaving the current URI, other query params, and hash intact.\n   *\n   * @param {string} name\n   * @param {*} value\n   */\n  setQueryParam(name, value) {\n    const baseUrl = document.location.origin + document.location.pathname;\n    const params = this.getQueryParams();\n\n    if (typeof value !== 'undefined' && value !== null && value !== false) {\n      params[name] = value;\n    } else {\n      delete params[name];\n    }\n\n    this.setUrl(Craft.getUrl(baseUrl, params));\n  },\n\n  /**\n   * Returns the current URL with a certain page added to it.\n   *\n   * @param {int} page\n   * @returns {string}\n   */\n  getPageUrl: function (page) {\n    let url = document.location.origin + document.location.pathname;\n    url = Craft.rtrim(url, '/');\n\n    let qs = document.location.search\n      ? document.location.search.substring(1)\n      : '';\n\n    // query string-based pagination?\n    if (Craft.pageTrigger[0] === '?') {\n      const pageParam = Craft.pageTrigger.substring(1);\n      // remove the existing page param\n      if (document.location.search) {\n        const params = Object.fromEntries(new URLSearchParams(qs).entries());\n        delete params[pageParam];\n        qs = $.param(params);\n      }\n      if (page !== 1) {\n        qs += (qs !== '' ? '&' : '') + `${pageParam}=${page}`;\n      }\n    } else {\n      // Remove the existing page segment(s)\n      url = url.replace(\n        new RegExp('/' + Craft.escapeRegex(Craft.pageTrigger) + '\\\\d+$'),\n        ''\n      );\n\n      if (page !== 1) {\n        url += `/${Craft.pageTrigger}${page}`;\n      }\n    }\n\n    return url + (qs ? `?${qs}` : '') + document.location.hash;\n  },\n\n  /**\n   * Returns a hidden CSRF token input, if CSRF protection is enabled.\n   *\n   * @returns {string}\n   */\n  getCsrfInput: function () {\n    if (Craft.csrfTokenName) {\n      return (\n        '<input type=\"hidden\" name=\"' +\n        Craft.csrfTokenName +\n        '\" value=\"' +\n        Craft.csrfTokenValue +\n        '\"/>'\n      );\n    } else {\n      return '';\n    }\n  },\n\n  /**\n   * @callback postActionRequestCallback\n   * @param {?Object} response\n   * @param {string} textStatus\n   * @param {Object} jqXHR\n   */\n  /**\n   * Posts an action request to the server.\n   *\n   * @param {string} action\n   * @param {Object} [data]\n   * @param {postActionRequestCallback} [callback]\n   * @param {Object} [options]\n   * @returns {Object}\n   * @deprecated in 3.4.6. sendActionRequest() should be used instead\n   */\n  postActionRequest: function (action, data, callback, options) {\n    // Make 'data' optional\n    if (typeof data === 'function') {\n      options = callback;\n      callback = data;\n      data = {};\n    }\n\n    options = options || {};\n\n    if (options.contentType && options.contentType.match(/\\bjson\\b/)) {\n      if (typeof data === 'object') {\n        data = JSON.stringify(data);\n      }\n      options.contentType = 'application/json; charset=utf-8';\n    }\n\n    var jqXHR = $.ajax(\n      $.extend(\n        {\n          url: Craft.getActionUrl(action),\n          type: 'POST',\n          dataType: 'json',\n          headers: this._actionHeaders(),\n          data: data,\n          success: callback,\n          error: function (jqXHR, textStatus, errorThrown) {\n            // Ignore incomplete requests, likely due to navigating away from the page\n            // h/t https://stackoverflow.com/a/22107079/1688568\n            if (jqXHR.readyState !== 4) {\n              return;\n            }\n\n            if (jqXHR.status !== 400) {\n              if (typeof Craft.cp !== 'undefined') {\n                Craft.cp.displayError();\n              } else {\n                alert(Craft.t('app', 'A server error occurred.'));\n              }\n            }\n\n            if (callback) {\n              callback(\n                jqXHR.status === 400 ? jqXHR.responseJSON : null,\n                textStatus,\n                jqXHR\n              );\n            }\n          },\n        },\n        options\n      )\n    );\n\n    // Call the 'send' callback\n    if (typeof options.send === 'function') {\n      options.send(jqXHR);\n    }\n\n    return jqXHR;\n  },\n\n  _actionHeaders: function () {\n    let headers = {\n      'X-Registered-Asset-Bundles': Object.keys(\n        Craft.registeredAssetBundles\n      ).join(','),\n      'X-Registered-Js-Files': Object.keys(Craft.registeredJsFiles).join(','),\n    };\n\n    if (Craft.csrfTokenValue) {\n      headers['X-CSRF-Token'] = Craft.csrfTokenValue;\n    }\n\n    return headers;\n  },\n\n  /**\n   * Sends a request to a Craft/plugin action\n   * @param {string} method The request action to use ('GET' or 'POST')\n   * @param {?string} [action] The action to request\n   * @param {Object} [options] Axios request options\n   * @returns {Promise}\n   * @since 3.4.6\n   */\n  sendActionRequest: function (method, action, options = {}) {\n    if ($.isPlainObject(action)) {\n      options = action;\n      action = null;\n    }\n\n    if (method.toUpperCase() === 'POST' && action && options.data) {\n      // Avoid conflicting `action` params\n      if (typeof options.data === 'string') {\n        const namespace =\n          options && options.headers && options.headers['X-Craft-Namespace'];\n        const actionName = this.namespaceInputName('action', namespace);\n        options.data += `&${actionName}=${action}`;\n      } else {\n        delete options.data.action;\n      }\n    }\n\n    return new Promise((resolve, reject) => {\n      options = options ? $.extend({}, options) : {};\n      options.method = method;\n      options.url = action ? Craft.getActionUrl(action) : Craft.getCpUrl();\n      options.headers = $.extend(\n        {\n          'X-Requested-With': 'XMLHttpRequest',\n        },\n        options.headers || {},\n        this._actionHeaders()\n      );\n      options.params = $.extend({}, options.params || {}, {\n        // Force Safari to not load from cache\n        v: new Date().getTime(),\n      });\n      axios.request(options).then(resolve).catch(reject);\n    });\n  },\n\n  /**\n   * Sends a request to the Craftnet API.\n   * @param {string} method The request action to use ('GET' or 'POST')\n   * @param {string} uri The API endpoint URI\n   * @param {Object} options Axios request options\n   * @returns {Promise}\n   * @since 3.3.16\n   */\n  sendApiRequest: function (method, uri, options) {\n    return new Promise((resolve, reject) => {\n      options = options ? $.extend({}, options) : {};\n      let cancelToken = options.cancelToken || null;\n\n      // Get the latest headers\n      this._getApiHeaders(cancelToken)\n        .then((apiHeaders) => {\n          // Send the API request\n          options.method = method;\n          options.baseURL = Craft.baseApiUrl;\n          options.url = uri;\n          options.headers = $.extend(apiHeaders, options.headers || {});\n          options.params = $.extend(\n            Craft.apiParams || {},\n            options.params || {},\n            {\n              // Force Safari to not load from cache\n              v: new Date().getTime(),\n            }\n          );\n\n          // Force the API to process the Craft headers if this is the first API request\n          if (!this._apiHeaders) {\n            options.params.processCraftHeaders = 1;\n          }\n\n          if (Craft.httpProxy) {\n            options.proxy = Craft.httpProxy;\n          }\n\n          axios\n            .request(options)\n            .then((apiResponse) => {\n              // Process the response headers\n              this._processApiHeaders(apiResponse.headers, cancelToken)\n                .then(() => {\n                  // Finally return the API response data\n                  resolve(apiResponse.data);\n                })\n                .catch(reject);\n            })\n            .catch(reject);\n        })\n        .catch(reject);\n    });\n  },\n\n  _loadingApiHeaders: false,\n  _apiHeaders: null,\n  _apiHeaderWaitlist: [],\n\n  /**\n   * Returns the headers that should be sent with API requests.\n   *\n   * @param {Object} [cancelToken]\n   * @returns {Promise}\n   */\n  _getApiHeaders: function (cancelToken) {\n    return new Promise((resolve, reject) => {\n      // Are we already loading them?\n      if (this._loadingApiHeaders) {\n        this._apiHeaderWaitlist.push([resolve, reject]);\n        return;\n      }\n\n      // Are the headers already cached?\n      if (this._apiHeaders) {\n        resolve(this._apiHeaders);\n        return;\n      }\n\n      this._loadingApiHeaders = true;\n      this.sendActionRequest('POST', 'app/api-headers', {\n        cancelToken: cancelToken,\n      })\n        .then((response) => {\n          // Make sure we even are waiting for these anymore\n          if (!this._loadingApiHeaders) {\n            reject(e);\n            return;\n          }\n\n          resolve(response.data);\n        })\n        .catch((e) => {\n          this._rejectApiRequests(reject, e);\n        });\n    });\n  },\n\n  _processApiHeaders: function (headers, cancelToken) {\n    return new Promise((resolve, reject) => {\n      // Have we already processed them?\n      if (this._apiHeaders) {\n        resolve();\n        return;\n      }\n\n      this.sendActionRequest('POST', 'app/process-api-response-headers', {\n        data: {\n          headers: headers,\n        },\n        cancelToken: cancelToken,\n      })\n        .then((response) => {\n          // Make sure we even are waiting for these anymore\n          if (!this._loadingApiHeaders) {\n            reject(e);\n            return;\n          }\n\n          this._apiHeaders = response.data;\n          this._loadingApiHeaders = false;\n\n          resolve();\n\n          // Was anything else waiting for them?\n          while (this._apiHeaderWaitlist.length) {\n            this._apiHeaderWaitlist.shift()[0](this._apiHeaders);\n          }\n        })\n        .catch((e) => {\n          this._rejectApiRequests(reject, e);\n        });\n    });\n  },\n\n  _rejectApiRequests: function (reject, e) {\n    this._loadingApiHeaders = false;\n    reject(e);\n    while (this._apiHeaderWaitlist.length) {\n      this._apiHeaderWaitlist.shift()[1](e);\n    }\n  },\n\n  /**\n   * Clears the cached API headers.\n   */\n  clearCachedApiHeaders: function () {\n    this._apiHeaders = null;\n    this._loadingApiHeaders = false;\n\n    // Reject anything in the header waitlist\n    while (this._apiHeaderWaitlist.length) {\n      this._apiHeaderWaitlist.shift()[1]();\n    }\n  },\n\n  /**\n   * Requests a URL and downloads the response.\n   *\n   * @param {string} method the request method to use\n   * @param {string} url the URL\n   * @param {(string|Object)} [body] the request body, if method = POST\n   * @returns {Promise}\n   */\n  downloadFromUrl: function (method, url, body) {\n    return new Promise((resolve, reject) => {\n      // h/t https://nehalist.io/downloading-files-from-post-requests/\n      let request = new XMLHttpRequest();\n      request.open(method, url, true);\n      if (typeof body === 'object') {\n        request.setRequestHeader(\n          'Content-Type',\n          'application/json; charset=UTF-8'\n        );\n        body = JSON.stringify(body);\n      } else {\n        request.setRequestHeader(\n          'Content-Type',\n          'application/x-www-form-urlencoded; charset=UTF-8'\n        );\n      }\n      request.responseType = 'blob';\n\n      request.onload = () => {\n        // Only handle status code 200\n        if (request.status === 200) {\n          // Try to find out the filename from the content disposition `filename` value\n          let disposition = request.getResponseHeader('content-disposition');\n          let matches = /\"([^\"]*)\"/.exec(disposition);\n          let filename =\n            matches != null && matches[1] ? matches[1] : 'Download';\n\n          // Encode the download into an anchor href\n          let contentType = request.getResponseHeader('content-type');\n          let blob = new Blob([request.response], {type: contentType});\n          let link = document.createElement('a');\n          link.href = window.URL.createObjectURL(blob);\n          link.download = filename;\n          document.body.appendChild(link);\n          link.click();\n          document.body.removeChild(link);\n\n          resolve();\n        } else {\n          reject();\n        }\n      };\n\n      request.send(body);\n    });\n  },\n\n  /**\n   * Converts a comma-delimited string into an array.\n   *\n   * @param {string} str\n   * @returns array\n   */\n  stringToArray: function (str) {\n    if (typeof str !== 'string') {\n      return str;\n    }\n\n    var arr = str.split(',');\n    for (var i = 0; i < arr.length; i++) {\n      arr[i] = $.trim(arr[i]);\n    }\n    return arr;\n  },\n\n  /**\n   * @callback findDeltaDataCallback\n   * @param {string} deltaName\n   * @param {Array} params\n   */\n  /**\n   * Compares old and new post data, and removes any values that haven't\n   * changed within the given list of delta namespaces.\n   *\n   * @param {string} oldData\n   * @param {string} newData\n   * @param {Object} deltaNames\n   * @param {findDeltaDataCallback} [callback] Callback function that should be called whenever a new group of modified params has been found\n   * @param {Object} [initialDeltaValues] Initial delta values. If undefined, `Craft.initialDeltaValues` will be used.\n   * @param {Object} [modifiedDeltaNames} List of delta names that should be considered modified regardles of their param values\n   * @returns {string}\n   */\n  findDeltaData: function (\n    oldData,\n    newData,\n    deltaNames,\n    callback,\n    initialDeltaValues,\n    modifiedDeltaNames\n  ) {\n    // Make sure oldData and newData are always strings. This is important because further below String.split is called.\n    oldData = typeof oldData === 'string' ? oldData : '';\n    newData = typeof newData === 'string' ? newData : '';\n    deltaNames = $.isArray(deltaNames) ? deltaNames : [];\n    initialDeltaValues = $.isPlainObject(initialDeltaValues)\n      ? initialDeltaValues\n      : {};\n    modifiedDeltaNames = $.isArray(modifiedDeltaNames)\n      ? modifiedDeltaNames\n      : [];\n\n    // Sort the delta namespaces from least -> most specific\n    deltaNames.sort(function (a, b) {\n      if (a.length === b.length) {\n        return 0;\n      }\n      return a.length > b.length ? 1 : -1;\n    });\n\n    // Group all of the old & new params by namespace\n    var groupedOldParams = this._groupParamsByDeltaNames(\n      oldData.split('&'),\n      deltaNames,\n      false,\n      initialDeltaValues\n    );\n    var groupedNewParams = this._groupParamsByDeltaNames(\n      newData.split('&'),\n      deltaNames,\n      true,\n      false\n    );\n\n    // Figure out which of the new params should actually be posted\n    var params = groupedNewParams.__root__;\n    for (var n = 0; n < deltaNames.length; n++) {\n      if (\n        Craft.inArray(deltaNames[n], modifiedDeltaNames) ||\n        (typeof groupedNewParams[deltaNames[n]] === 'object' &&\n          (typeof groupedOldParams[deltaNames[n]] !== 'object' ||\n            JSON.stringify(groupedOldParams[deltaNames[n]]) !==\n              JSON.stringify(groupedNewParams[deltaNames[n]])))\n      ) {\n        params = params.concat(groupedNewParams[deltaNames[n]]);\n        params.push('modifiedDeltaNames[]=' + deltaNames[n]);\n        if (callback) {\n          callback(deltaNames[n], groupedNewParams[deltaNames[n]]);\n        }\n      }\n    }\n\n    return params.join('&');\n  },\n\n  /**\n   * @param {Object} params\n   * @param {Object} deltaNames\n   * @param {boolean} withRoot\n   * @param {(boolean|Object)} initialValues\n   * @returns {Object}\n   * @private\n   */\n  _groupParamsByDeltaNames: function (\n    params,\n    deltaNames,\n    withRoot,\n    initialValues\n  ) {\n    const grouped = {};\n\n    if (withRoot) {\n      grouped.__root__ = [];\n    }\n\n    const encodeURIComponentExceptEqualChar = (o) =>\n      encodeURIComponent(o).replace('%3D', '=');\n\n    params = params.map((p) => decodeURIComponent(p));\n\n    paramLoop: for (let p = 0; p < params.length; p++) {\n      // loop through the delta names from most -> least specific\n      for (let n = deltaNames.length - 1; n >= 0; n--) {\n        const paramName = params[p].substring(0, deltaNames[n].length + 1);\n        if (\n          paramName === deltaNames[n] + '=' ||\n          paramName === deltaNames[n] + '['\n        ) {\n          if (typeof grouped[deltaNames[n]] === 'undefined') {\n            grouped[deltaNames[n]] = [];\n          }\n          grouped[deltaNames[n]].push(\n            encodeURIComponentExceptEqualChar(params[p])\n          );\n          continue paramLoop;\n        }\n      }\n\n      if (withRoot) {\n        grouped.__root__.push(encodeURIComponentExceptEqualChar(params[p]));\n      }\n    }\n\n    if (initialValues) {\n      const serializeParam = (name, value) => {\n        if ($.isArray(value) || $.isPlainObject(value)) {\n          value = $.param(value);\n        } else if (typeof value === 'string') {\n          value = encodeURIComponent(value);\n        } else if (value === null) {\n          value = '';\n        }\n        return `${encodeURIComponent(name)}=${value}`;\n      };\n\n      for (let name in initialValues) {\n        if (initialValues.hasOwnProperty(name)) {\n          if ($.isPlainObject(initialValues[name])) {\n            grouped[name] = [];\n            for (let subName in initialValues[name]) {\n              if (initialValues[name].hasOwnProperty(subName)) {\n                grouped[name].push(\n                  serializeParam(\n                    `${name}[${subName}]`,\n                    initialValues[name][subName]\n                  )\n                );\n              }\n            }\n          } else {\n            grouped[name] = [serializeParam(name, initialValues[name])];\n          }\n        }\n      }\n    }\n\n    return grouped;\n  },\n\n  /**\n   * Expands an object of POST array-style strings into an actual array.\n   *\n   * @param {Object} arr\n   * @returns {Array}\n   */\n  expandPostArray: function (arr) {\n    var expanded = {};\n    var i;\n\n    for (var key in arr) {\n      if (!arr.hasOwnProperty(key)) {\n        continue;\n      }\n\n      var value = arr[key],\n        m = key.match(/^(\\w+)(\\[.*)?/),\n        keys;\n\n      if (m[2]) {\n        // Get all of the nested keys\n        keys = m[2].match(/\\[[^\\[\\]]*\\]/g);\n\n        // Chop off the brackets\n        for (i = 0; i < keys.length; i++) {\n          keys[i] = keys[i].substring(1, keys[i].length - 1);\n        }\n      } else {\n        keys = [];\n      }\n\n      keys.unshift(m[1]);\n\n      var parentElem = expanded;\n\n      for (i = 0; i < keys.length; i++) {\n        if (i < keys.length - 1) {\n          if (typeof parentElem[keys[i]] !== 'object') {\n            // Figure out what this will be by looking at the next key\n            if (!keys[i + 1] || parseInt(keys[i + 1]) == keys[i + 1]) {\n              parentElem[keys[i]] = [];\n            } else {\n              parentElem[keys[i]] = {};\n            }\n          }\n\n          parentElem = parentElem[keys[i]];\n        } else {\n          // Last one. Set the value\n          if (!keys[i]) {\n            keys[i] = parentElem.length;\n          }\n\n          parentElem[keys[i]] = value;\n        }\n      }\n    }\n\n    return expanded;\n  },\n\n  /**\n   * Creates a form element populated with hidden inputs based on a string of serialized form data.\n   *\n   * @param {string} data\n   * @returns {(jQuery|HTMLElement)}\n   */\n  createForm: function (data) {\n    var $form = $('<form/>', {\n      attr: {\n        method: 'post',\n        action: '',\n        'accept-charset': 'UTF-8',\n      },\n    });\n\n    if (typeof data === 'string') {\n      var values = data.split('&');\n      var chunks;\n      for (var i = 0; i < values.length; i++) {\n        chunks = values[i].split('=', 2);\n        $('<input/>', {\n          type: 'hidden',\n          name: decodeURIComponent(chunks[0]),\n          value: decodeURIComponent(chunks[1] || ''),\n        }).appendTo($form);\n      }\n    }\n\n    return $form;\n  },\n\n  /**\n   * Compares two variables and returns whether they are equal in value.\n   * Recursively compares array and object values.\n   *\n   * @param {*} obj1\n   * @param {*} obj2\n   * @param {boolean} [sortObjectKeys] Whether object keys should be sorted before being compared. Default is true.\n   * @returns boolean\n   */\n  compare: function (obj1, obj2, sortObjectKeys) {\n    // Compare the types\n    if (typeof obj1 !== typeof obj2) {\n      return false;\n    }\n\n    if (typeof obj1 === 'object') {\n      // Compare the lengths\n      if (obj1.length !== obj2.length) {\n        return false;\n      }\n\n      // Is one of them an array but the other is not?\n      if (obj1 instanceof Array !== obj2 instanceof Array) {\n        return false;\n      }\n\n      // If they're actual objects (not arrays), compare the keys\n      if (!(obj1 instanceof Array)) {\n        if (typeof sortObjectKeys === 'undefined' || sortObjectKeys === true) {\n          if (\n            !Craft.compare(\n              Craft.getObjectKeys(obj1).sort(),\n              Craft.getObjectKeys(obj2).sort()\n            )\n          ) {\n            return false;\n          }\n        } else {\n          if (\n            !Craft.compare(Craft.getObjectKeys(obj1), Craft.getObjectKeys(obj2))\n          ) {\n            return false;\n          }\n        }\n      }\n\n      // Compare each value\n      for (var i in obj1) {\n        if (!obj1.hasOwnProperty(i)) {\n          continue;\n        }\n\n        if (!Craft.compare(obj1[i], obj2[i])) {\n          return false;\n        }\n      }\n\n      // All clear\n      return true;\n    } else {\n      return obj1 === obj2;\n    }\n  },\n\n  /**\n   * Returns an array of an object's keys.\n   *\n   * @param {Object} obj\n   * @returns {string[]}\n   */\n  getObjectKeys: function (obj) {\n    var keys = [];\n\n    for (var key in obj) {\n      if (!obj.hasOwnProperty(key)) {\n        continue;\n      }\n\n      keys.push(key);\n    }\n\n    return keys;\n  },\n\n  /**\n   * Takes an array or string of chars, and places a backslash before each one, returning the combined string.\n   *\n   * Userd by ltrim() and rtrim()\n   *\n   * @param {(string|Object)} chars\n   * @returns {string}\n   */\n  escapeChars: function (chars) {\n    if (!Garnish.isArray(chars)) {\n      chars = chars.split();\n    }\n\n    var escaped = '';\n\n    for (var i = 0; i < chars.length; i++) {\n      escaped += '\\\\' + chars[i];\n    }\n\n    return escaped;\n  },\n\n  /**\n   * Trim characters off of the beginning of a string.\n   *\n   * @param {string} str\n   * @param {(string|Object)} [chars] The characters to trim off. Defaults to a space if left blank.\n   * @returns {string}\n   */\n  ltrim: function (str, chars) {\n    if (!str) {\n      return str;\n    }\n    if (typeof chars === 'undefined') {\n      chars = ' \\t\\n\\r\\0\\x0B';\n    }\n    var re = new RegExp('^[' + Craft.escapeChars(chars) + ']+');\n    return str.replace(re, '');\n  },\n\n  /**\n   * Trim characters off of the end of a string.\n   *\n   * @param {string} str\n   * @param {(string|Object)} [chars] The characters to trim off. Defaults to a space if left blank.\n   * @returns {string}\n   */\n  rtrim: function (str, chars) {\n    if (!str) {\n      return str;\n    }\n    if (typeof chars === 'undefined') {\n      chars = ' \\t\\n\\r\\0\\x0B';\n    }\n    var re = new RegExp('[' + Craft.escapeChars(chars) + ']+$');\n    return str.replace(re, '');\n  },\n\n  /**\n   * Trim characters off of the beginning and end of a string.\n   *\n   * @param {string} str\n   * @param {(string|Object)} [chars] The characters to trim off. Defaults to a space if left blank.\n   * @returns {string}\n   */\n  trim: function (str, chars) {\n    str = Craft.ltrim(str, chars);\n    str = Craft.rtrim(str, chars);\n    return str;\n  },\n\n  /**\n   * Returns whether a string starts with another string.\n   *\n   * @param {string} str\n   * @param {string} substr\n   * @returns {boolean}\n   */\n  startsWith: function (str, substr) {\n    return str.substring(0, substr.length) === substr;\n  },\n\n  /**\n   * @callback filterArrayCallback\n   * @param {*} value\n   * @param {number} index\n   * @return {boolean}\n   */\n  /**\n   * Filters an array.\n   *\n   * @param {Object} arr\n   * @param {filterArrayCallback} [callback] A user-defined callback function. If null, we'll just remove any elements that equate to false.\n   * @returns {Array}\n   */\n  filterArray: function (arr, callback) {\n    var filtered = [];\n\n    for (var i = 0; i < arr.length; i++) {\n      var include;\n\n      if (typeof callback === 'function') {\n        include = callback(arr[i], i);\n      } else {\n        include = arr[i];\n      }\n\n      if (include) {\n        filtered.push(arr[i]);\n      }\n    }\n\n    return filtered;\n  },\n\n  /**\n   * Returns whether an element is in an array (unlike jQuery.inArray(), which returns the element’s index, or -1).\n   *\n   * @param {*} elem\n   * @param {(Object|Array)} arr\n   * @returns {boolean}\n   */\n  inArray: function (elem, arr) {\n    if ($.isPlainObject(arr)) {\n      arr = Object.values(arr);\n    }\n    return arr.includes(elem);\n  },\n\n  /**\n   * Removes an element from an array.\n   *\n   * @param {*} elem\n   * @param {Array} arr\n   * @returns {boolean} Whether the element could be found or not.\n   */\n  removeFromArray: function (elem, arr) {\n    var index = $.inArray(elem, arr);\n    if (index !== -1) {\n      arr.splice(index, 1);\n      return true;\n    } else {\n      return false;\n    }\n  },\n\n  /**\n   * Returns the last element in an array.\n   *\n   * @param {Array} arr\n   * @returns {*}\n   */\n  getLast: function (arr) {\n    if (!arr.length) {\n      return null;\n    } else {\n      return arr[arr.length - 1];\n    }\n  },\n\n  /**\n   * Makes the first character of a string uppercase.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  uppercaseFirst: function (str) {\n    return str.charAt(0).toUpperCase() + str.slice(1);\n  },\n\n  /**\n   * Makes the first character of a string lowercase.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  lowercaseFirst: function (str) {\n    return str.charAt(0).toLowerCase() + str.slice(1);\n  },\n\n  parseUrl: function (url) {\n    var m = url.match(\n      /^(?:(https?):\\/\\/|\\/\\/)([^\\/\\:]*)(?:\\:(\\d+))?(\\/[^\\?]*)?(?:\\?([^#]*))?(#.*)?/\n    );\n    if (!m) {\n      return {};\n    }\n    return {\n      scheme: m[1],\n      host: m[2] + (m[3] ? ':' + m[3] : ''),\n      hostname: m[2],\n      port: m[3] || null,\n      path: m[4] || '/',\n      query: m[5] || null,\n      hash: m[6] || null,\n    };\n  },\n\n  getQueryParams: function () {\n    return Object.fromEntries(\n      new URLSearchParams(window.location.search).entries()\n    );\n  },\n\n  getQueryParam: function (name) {\n    // h/t https://stackoverflow.com/a/901144/1688568\n    const params = new Proxy(new URLSearchParams(window.location.search), {\n      get: (searchParams, prop) => searchParams.get(prop),\n    });\n    return params[name];\n  },\n\n  isSameHost: function (url) {\n    var requestUrlInfo = this.parseUrl(document.location.href);\n    if (!requestUrlInfo) {\n      return false;\n    }\n    var urlInfo = this.parseUrl(url);\n    if (!urlInfo) {\n      return false;\n    }\n    return requestUrlInfo.host === urlInfo.host;\n  },\n\n  /**\n   * Converts a number of seconds into a human-facing time duration.\n   */\n  secondsToHumanTimeDuration: function (seconds, showSeconds) {\n    if (typeof showSeconds === 'undefined') {\n      showSeconds = true;\n    }\n\n    var secondsInWeek = 604800,\n      secondsInDay = 86400,\n      secondsInHour = 3600,\n      secondsInMinute = 60;\n\n    var weeks = Math.floor(seconds / secondsInWeek);\n    seconds = seconds % secondsInWeek;\n\n    var days = Math.floor(seconds / secondsInDay);\n    seconds = seconds % secondsInDay;\n\n    var hours = Math.floor(seconds / secondsInHour);\n    seconds = seconds % secondsInHour;\n\n    var minutes;\n\n    if (showSeconds) {\n      minutes = Math.floor(seconds / secondsInMinute);\n      seconds = seconds % secondsInMinute;\n    } else {\n      minutes = Math.round(seconds / secondsInMinute);\n      seconds = 0;\n    }\n\n    var timeComponents = [];\n\n    if (weeks) {\n      timeComponents.push(\n        weeks +\n          ' ' +\n          (weeks === 1 ? Craft.t('app', 'week') : Craft.t('app', 'weeks'))\n      );\n    }\n\n    if (days) {\n      timeComponents.push(\n        days +\n          ' ' +\n          (days === 1 ? Craft.t('app', 'day') : Craft.t('app', 'days'))\n      );\n    }\n\n    if (hours) {\n      timeComponents.push(\n        hours +\n          ' ' +\n          (hours === 1 ? Craft.t('app', 'hour') : Craft.t('app', 'hours'))\n      );\n    }\n\n    if (minutes || (!showSeconds && !weeks && !days && !hours)) {\n      timeComponents.push(\n        minutes +\n          ' ' +\n          (minutes === 1 ? Craft.t('app', 'minute') : Craft.t('app', 'minutes'))\n      );\n    }\n\n    if (seconds || (showSeconds && !weeks && !days && !hours && !minutes)) {\n      timeComponents.push(\n        seconds +\n          ' ' +\n          (seconds === 1 ? Craft.t('app', 'second') : Craft.t('app', 'seconds'))\n      );\n    }\n\n    return timeComponents.join(', ');\n  },\n\n  /**\n   * Converts extended ASCII characters to ASCII.\n   *\n   * @param {string} str\n   * @param {Object} [charMap]\n   * @returns {string}\n   */\n  asciiString: function (str, charMap) {\n    // Normalize NFD chars to NFC\n    str = str.normalize('NFC');\n\n    var asciiStr = '';\n    var char;\n\n    for (var i = 0; i < str.length; i++) {\n      char = str.charAt(i);\n      asciiStr +=\n        typeof (charMap || Craft.asciiCharMap)[char] === 'string'\n          ? (charMap || Craft.asciiCharMap)[char]\n          : char;\n    }\n\n    return asciiStr;\n  },\n\n  uuid: function () {\n    if (typeof crypto.randomUUID === 'function') {\n      return crypto.randomUUID();\n    }\n\n    // h/t https://stackoverflow.com/a/2117523/1688568\n    return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>\n      (\n        c ^\n        (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))\n      ).toString(16)\n    );\n  },\n\n  /**\n   * @param {string} name\n   * @param {string} [namespace]\n   * @returns {string}\n   */\n  namespaceInputName: function (name, namespace) {\n    if (!namespace) {\n      return name;\n    }\n\n    return name.replace(/([^'\"\\[\\]]+)([^'\"]*)/, `${namespace}[$1]$2`);\n  },\n\n  /**\n   * @param {string} id\n   * @param {string} [namespace]\n   * @returns {string}\n   */\n  namespaceId: function (id, namespace) {\n    return Craft.formatInputId(namespace ? `${namespace}-${id}` : id);\n  },\n\n  randomString: function (length) {\n    // h/t https://stackoverflow.com/a/1349426/1688568\n    var result = '';\n    var characters =\n      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n    for (var i = 0; i < length; i++) {\n      result += characters.charAt(Math.floor(Math.random() * 62));\n    }\n    return result;\n  },\n\n  /**\n   * Creates a validation error list.\n   *\n   * @param {Object} errors\n   * @returns {jQuery}\n   */\n  createErrorList: function (errors) {\n    var $ul = $(document.createElement('ul')).addClass('errors');\n\n    for (var i = 0; i < errors.length; i++) {\n      var $li = $(document.createElement('li'));\n      $li.appendTo($ul);\n      $li.html(errors[i]);\n    }\n\n    return $ul;\n  },\n\n  /**\n   * Appends HTML to the page `<head>`.\n   *\n   * @param {string} html\n   */\n  appendHeadHtml: function (html) {\n    if (!html) {\n      return;\n    }\n\n    // Prune out any link tags that are already included\n    var $existingCss = $('link[href]');\n\n    if ($existingCss.length) {\n      var existingCss = [];\n      var href;\n\n      for (var i = 0; i < $existingCss.length; i++) {\n        href = $existingCss.eq(i).attr('href').replace(/&/g, '&amp;');\n        existingCss.push(Craft.escapeRegex(href));\n      }\n\n      const regexp = new RegExp(\n        '<link\\\\s[^>]*href=\"(?:' + existingCss.join('|') + ')\".*?></link>',\n        'g'\n      );\n\n      html = html.replace(regexp, '');\n    }\n\n    $('head').append(html);\n  },\n\n  /**\n   * Appends HTML to the page `<body>`.\n   *\n   * @param {string} html\n   */\n  appendBodyHtml: function (html) {\n    if (!html) {\n      return;\n    }\n\n    // Prune out any script tags that are already included\n    var $existingJs = $('script[src]');\n\n    if ($existingJs.length) {\n      var existingJs = [];\n      var src;\n\n      for (var i = 0; i < $existingJs.length; i++) {\n        src = $existingJs.eq(i).attr('src').replace(/&/g, '&amp;');\n        existingJs.push(Craft.escapeRegex(src));\n      }\n\n      var regexp = new RegExp(\n        '<script\\\\s[^>]*src=\"(?:' + existingJs.join('|') + ')\".*?></script>',\n        'g'\n      );\n\n      html = html.replace(regexp, '');\n    }\n\n    Garnish.$bod.append(html);\n  },\n\n  /**\n   * Appends HTML to the page `<body>`.\n   *\n   * @deprecated in 4.0.0. `appendBodyHtml()` should be used instead\n   */\n  appendFootHtml: function (html) {\n    console.warn(\n      'Craft.appendFootHtml() is deprecated. Craft.appendBodyHtml() should be used instead.'\n    );\n    this.appendBodyHtml(html);\n  },\n\n  /**\n   * Initializes any common UI elements in a given container.\n   *\n   * @param {Object} $container\n   */\n  initUiElements: function ($container) {\n    $('.grid', $container).grid();\n    $('.info', $container).infoicon();\n    $('.checkbox-select', $container).checkboxselect();\n    $('.fieldtoggle', $container).fieldtoggle();\n    $('.lightswitch', $container).lightswitch();\n    $('.nicetext', $container).nicetext();\n    $('.formsubmit', $container).formsubmit();\n    $('.menubtn:not([data-disclosure-trigger])', $container).menubtn();\n    $('[data-disclosure-trigger]', $container).disclosureMenu();\n    $('.datetimewrapper', $container).datetime();\n    $(\n      '.datewrapper > input[type=\"date\"], .timewrapper > input[type=\"time\"]',\n      $container\n    ).datetimeinput();\n\n    // Open outbound links in new windows\n    // hat tip: https://stackoverflow.com/a/2911045/1688568\n    $('a', $container).each(function () {\n      if (\n        this.hostname.length &&\n        this.hostname !== location.hostname &&\n        typeof $(this).attr('target') === 'undefined'\n      ) {\n        $(this).attr('rel', 'noopener').attr('target', '_blank');\n      }\n    });\n  },\n\n  _elementIndexClasses: {},\n  _elementSelectorModalClasses: {},\n  _elementEditorClasses: {},\n\n  /**\n   * Registers an element index class for a given element type.\n   *\n   * @param {string} elementType\n   * @param {function} func\n   */\n  registerElementIndexClass: function (elementType, func) {\n    if (typeof this._elementIndexClasses[elementType] !== 'undefined') {\n      throw (\n        'An element index class has already been registered for the element type “' +\n        elementType +\n        '”.'\n      );\n    }\n\n    this._elementIndexClasses[elementType] = func;\n  },\n\n  /**\n   * Registers an element selector modal class for a given element type.\n   *\n   * @param {string} elementType\n   * @param {function} func\n   */\n  registerElementSelectorModalClass: function (elementType, func) {\n    if (typeof this._elementSelectorModalClasses[elementType] !== 'undefined') {\n      throw (\n        'An element selector modal class has already been registered for the element type “' +\n        elementType +\n        '”.'\n      );\n    }\n\n    this._elementSelectorModalClasses[elementType] = func;\n  },\n\n  /**\n   * Registers an element editor class for a given element type.\n   *\n   * @param {string} elementType\n   * @param {function} func\n   */\n  registerElementEditorClass: function (elementType, func) {\n    if (typeof this._elementEditorClasses[elementType] !== 'undefined') {\n      throw (\n        'An element editor class has already been registered for the element type “' +\n        elementType +\n        '”.'\n      );\n    }\n\n    this._elementEditorClasses[elementType] = func;\n  },\n\n  /**\n   * Creates a new element index for a given element type.\n   *\n   * @param {string} elementType\n   * @param {jQuery} $container\n   * @param {Object} settings\n   * @returns {BaseElementIndex}\n   */\n  createElementIndex: function (elementType, $container, settings) {\n    var func;\n\n    if (typeof this._elementIndexClasses[elementType] !== 'undefined') {\n      func = this._elementIndexClasses[elementType];\n    } else {\n      func = Craft.BaseElementIndex;\n    }\n\n    return new func(elementType, $container, settings);\n  },\n\n  /**\n   * Creates a new element selector modal for a given element type.\n   *\n   * @param {string} elementType\n   * @param {Object} settings\n   */\n  createElementSelectorModal: function (elementType, settings) {\n    var func;\n\n    if (typeof this._elementSelectorModalClasses[elementType] !== 'undefined') {\n      func = this._elementSelectorModalClasses[elementType];\n    } else {\n      func = Craft.BaseElementSelectorModal;\n    }\n\n    return new func(elementType, settings);\n  },\n\n  /**\n   * Creates a new element editor slideout for a given element type.\n   *\n   * @param {string} elementType\n   * @param {(jQuery|HTMLElement|string)} element\n   * @param {Object} settings\n   */\n  createElementEditor: function (elementType, element, settings) {\n    // Param mapping\n    if (typeof settings === 'undefined' && $.isPlainObject(element)) {\n      // (settings)\n      settings = element;\n      element = null;\n    } else if (typeof settings !== 'object') {\n      settings = {};\n    }\n\n    if (!settings.elementType) {\n      settings.elementType = elementType;\n    }\n\n    return new Craft.ElementEditorSlideout(element, settings);\n  },\n\n  /**\n   * Retrieves a value from localStorage if it exists.\n   *\n   * @param {string} key\n   * @param {*} defaultValue\n   */\n  getLocalStorage: function (key, defaultValue) {\n    key = 'Craft-' + Craft.systemUid + '.' + key;\n\n    if (\n      typeof localStorage !== 'undefined' &&\n      typeof localStorage[key] !== 'undefined'\n    ) {\n      return JSON.parse(localStorage[key]);\n    } else {\n      return defaultValue;\n    }\n  },\n\n  /**\n   * Saves a value to localStorage.\n   *\n   * @param {string} key\n   * @param {*} value\n   */\n  setLocalStorage: function (key, value) {\n    if (typeof localStorage !== 'undefined') {\n      key = 'Craft-' + Craft.systemUid + '.' + key;\n\n      // localStorage might be filled all the way up.\n      // Especially likely if this is a private window in Safari 8+, where localStorage technically exists,\n      // but has a max size of 0 bytes.\n      try {\n        localStorage[key] = JSON.stringify(value);\n      } catch (e) {}\n    }\n  },\n\n  /**\n   * Removes a value from localStorage.\n   * @param {string} key\n   */\n  removeLocalStorage: function (key) {\n    if (typeof localStorage !== 'undefined') {\n      localStorage.removeItem(`Craft-${Craft.systemUid}.${key}`);\n    }\n  },\n\n  /**\n   * Returns a cookie value, if it exists, otherwise returns `false`\n   * @returns {(string|boolean)}\n   */\n  getCookie: function (name) {\n    // Adapted from https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie\n    return document.cookie.replace(\n      new RegExp(\n        `(?:(?:^|.*;\\\\s*)Craft-${Craft.systemUid}:${name}\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$`\n      ),\n      '$1'\n    );\n  },\n\n  /**\n   * Sets a cookie value.\n   * @param {string} name\n   * @param {string} value\n   * @param {Object} [options]\n   * @param {string} [options.path] The cookie path.\n   * @param {string} [options.domain] The cookie domain. Defaults to the `defaultCookieDomain` config setting.\n   * @param {number} [options.maxAge] The max age of the cookie (in seconds)\n   * @param {Date} [options.expires] The expiry date of the cookie. Defaults to none (session-based cookie).\n   * @param {boolean} [options.secure] Whether this is a secure cookie. Defaults to the `useSecureCookies`\n   * config setting.\n   * @param {string} [options.sameSite] The SameSite value (`lax` or `strict`). Defaults to the\n   * `sameSiteCookieValue` config setting.\n   */\n  setCookie: function (name, value, options) {\n    options = $.extend({}, this.defaultCookieOptions, options);\n    let cookie = `Craft-${Craft.systemUid}:${name}=${encodeURIComponent(\n      value\n    )}`;\n    if (options.path) {\n      cookie += `;path=${options.path}`;\n    }\n    if (options.domain) {\n      cookie += `;domain=${options.domain}`;\n    }\n    if (options.maxAge) {\n      cookie += `;max-age-in-seconds=${options.maxAge}`;\n    } else if (options.expires) {\n      cookie += `;expires=${options.expires.toUTCString()}`;\n    }\n    if (options.secure) {\n      cookie += ';secure';\n    }\n    document.cookie = cookie;\n  },\n\n  /**\n   * Removes a cookie\n   * @param {string} name\n   */\n  removeCookie: function (name) {\n    this.setCookie(name, '', new Date('1970-01-01T00:00:00'));\n  },\n\n  /**\n   * Returns element information from its DOM element.\n   *\n   * @param {(jQuery|HTMLElement|string)} element\n   * @returns {Object}\n   */\n  getElementInfo: function (element) {\n    var $element = $(element);\n\n    if (!$element.hasClass('element')) {\n      $element = $element.find('.element:first');\n    }\n\n    return {\n      id: $element.data('id'),\n      siteId: $element.data('site-id'),\n      label: $element.data('label'),\n      status: $element.data('status'),\n      url: $element.data('url'),\n      hasThumb: $element.hasClass('hasthumb'),\n      $element: $element,\n    };\n  },\n\n  /**\n   * Changes an element to the requested size.\n   *\n   * @param {(jQuery|HTMLElement|string))} element\n   * @param {string} size\n   */\n  setElementSize: function (element, size) {\n    var $element = $(element);\n\n    if (size !== 'small' && size !== 'large') {\n      size = 'small';\n    }\n\n    if ($element.hasClass(size)) {\n      return;\n    }\n\n    var otherSize = size === 'small' ? 'large' : 'small';\n\n    $element.addClass(size).removeClass(otherSize);\n\n    if ($element.hasClass('hasthumb')) {\n      var $oldImg = $element.find('> .elementthumb > img'),\n        imgSize = size === 'small' ? '30' : '100',\n        $newImg = $('<img/>', {\n          sizes: imgSize + 'px',\n          srcset: $oldImg.attr('srcset') || $oldImg.attr('data-pfsrcset'),\n        });\n\n      $oldImg.replaceWith($newImg);\n\n      picturefill({\n        elements: [$newImg[0]],\n      });\n    }\n  },\n\n  /**\n   * Submits a form.\n   * @param {Object} $form\n   * @param {Object} [options]\n   * @param {string} [options.action] The `action` param value override\n   * @param {string} [options.redirect] The `redirect` param value override\n   * @param {string} [options.confirm] A confirmation message that should be shown to the user before submit\n   * @param {Object} [options.params] Additional params that should be added to the form, defined as name/value pairs\n   * @param {Object} [options.data] Additional data to be passed to the submit event\n   * @param {boolean} [options.retainScroll] Whether the scroll position should be stored and reapplied on the next page load\n   */\n  submitForm: function ($form, options) {\n    if (typeof options === 'undefined') {\n      options = {};\n    }\n\n    if (options.confirm && !confirm(options.confirm)) {\n      return;\n    }\n\n    if (options.action) {\n      $('<input/>', {\n        type: 'hidden',\n        name: 'action',\n        val: options.action,\n      }).appendTo($form);\n    }\n\n    if (options.redirect) {\n      $('<input/>', {\n        type: 'hidden',\n        name: 'redirect',\n        val: options.redirect,\n      }).appendTo($form);\n    }\n\n    if (options.params) {\n      for (let name in options.params) {\n        let value = options.params[name];\n        $('<input/>', {\n          type: 'hidden',\n          name: name,\n          val: value,\n        }).appendTo($form);\n      }\n    }\n\n    if (options.retainScroll) {\n      this.setLocalStorage('scrollY', window.scrollY);\n    }\n\n    $form.trigger($.extend({type: 'submit'}, options.data));\n  },\n\n  /**\n   * Traps focus within a container, so when focus is tabbed out of it, it’s cycled back into it.\n   * @param {Object} container\n   */\n  trapFocusWithin: function (container) {\n    Garnish.trapFocusWithin(container);\n  },\n\n  /**\n   * Sets focus to the first focusable element within a container.\n   * @param {Object} container\n   */\n  setFocusWithin: function (container) {\n    Garnish.setFocusWithin(container);\n  },\n\n  /**\n   * Reduces an input’s value to characters that match the given regex pattern.\n   * @param {jQuery|HTMLElement} input\n   * @param {RegExp} regex\n   */\n  filterInputVal: function (input, regex) {\n    const $input = $(input);\n    const val = $input.val();\n    let selectionStart = $input[0].selectionStart;\n    let newVal = '';\n    for (let i = 0; i < val.length; i++) {\n      if (val[i].match(regex)) {\n        newVal += val[i];\n      } else if (i < selectionStart) {\n        selectionStart--;\n      }\n    }\n    if (newVal !== val) {\n      $input.val(newVal);\n      $input[0].setSelectionRange(selectionStart, selectionStart);\n    }\n  },\n\n  /**\n   * Reduces an input’s value to numeric characters.\n   * @param {jQuery|HTMLElement} input\n   * @param {RegExp} regex\n   */\n  filterNumberInputVal: function (input) {\n    this.filterInputVal(input, /[0-9.,\\-]/);\n  },\n\n  /**\n   * Sets/removes attributes on an element.\n   *\n   * Attributes set to `null` or `false` will be removed.\n   *\n   * @param {(jQuery|HTMLElement|string)} element\n   * @param {Object} attributes\n   */\n  setElementAttributes: function (element, attributes) {\n    const $element = $(element);\n\n    for (let name in attributes) {\n      if (!attributes.hasOwnProperty(name)) {\n        continue;\n      }\n\n      let value = attributes[name];\n\n      if (value === null || value === false) {\n        $element.removeAttr(name);\n      } else if (value === true) {\n        $element.attr(name, '');\n      } else if ($.isArray(value) || $.isPlainObject(value)) {\n        if (Craft.dataAttributes.includes(name)) {\n          // Make sure it's an object\n          value = Object.assign({}, value);\n          for (let n in value) {\n            if (!value.hasOwnProperty(n)) {\n              continue;\n            }\n            let subValue = value[n];\n            if (subValue === null || subValue === false) {\n              continue;\n            }\n            if ($.isPlainObject(subValue) || $.isArray(subValue)) {\n              subValue = JSON.stringify(subValue);\n            } else if (subValue === true) {\n              subValue = '';\n            } else {\n              subValue = this.escapeHtml(subValue);\n            }\n            $element.attr(`${name}-${n}`, subValue);\n          }\n        } else if (name === 'class') {\n          // Make sure it's an array\n          if ($.isPlainObject(value)) {\n            value = Object.values(value);\n          }\n          for (let c of value) {\n            $element.addClass(c);\n          }\n        } else if (name === 'style') {\n          $element.css(value);\n        } else {\n          $element.attr(name, JSON.stringify(value));\n        }\n      } else {\n        $element.attr(name, this.escapeHtml(value));\n      }\n    }\n  },\n\n  isVisible: function () {\n    return (\n      typeof document.visibilityState === 'undefined' ||\n      document.visibilityState === 'visible'\n    );\n  },\n\n  useMobileStyles: function () {\n    return Garnish.isMobileBrowser() || document.body.clientWidth < 600;\n  },\n});\n\n// -------------------------------------------\n//  Broadcast channel\n// -------------------------------------------\n\nCraft.pageId = Craft.uuid();\n\nif (typeof BroadcastChannel !== 'undefined') {\n  const channelName = `CraftCMS:${Craft.appId}`;\n  Craft.broadcaster = new BroadcastChannel(channelName);\n  Craft.messageReceiver = new BroadcastChannel(channelName);\n\n  Craft.messageReceiver.addEventListener('message', (ev) => {\n    if (ev.data.event === 'saveElement') {\n      // Are there any instances of the same element on the page?\n      const $elements = $(\n        `div.element[data-id=\"${ev.data.id}\"][data-settings]`\n      );\n      if (!$elements.length) {\n        return;\n      }\n      const data = {\n        type: $elements.data('type'),\n        id: ev.data.id,\n        instances: [],\n      };\n      for (let i = 0; i < $elements.length; i++) {\n        const $element = $elements.eq(i);\n        data.instances.push(\n          Object.assign(\n            {\n              siteId: $element.data('site-id'),\n            },\n            $element.data('settings')\n          )\n        );\n      }\n      Craft.sendActionRequest('POST', 'app/render-element', {data}).then(\n        ({data}) => {\n          for (let i = 0; i < $elements.length; i++) {\n            const $element = $elements.eq(i);\n            if (data.elementHtml[i]) {\n              const $replacement = $(data.elementHtml[i]);\n              for (let attribute of $replacement[0].attributes) {\n                if (attribute.name === 'class') {\n                  $element.addClass(attribute.value);\n                } else {\n                  $element.attr(attribute.name, attribute.value);\n                }\n              }\n              const $inputs = $element.find('input,button').detach();\n              $element.html($replacement.html());\n              if ($inputs.length) {\n                $inputs.prependTo($element);\n              }\n            }\n          }\n          new Craft.ElementThumbLoader().load($elements);\n        }\n      );\n    }\n  });\n}\n\n// -------------------------------------------\n//  Custom jQuery plugins\n// -------------------------------------------\n\n$.extend($.fn, {\n  animateLeft: function (pos, duration, easing, complete) {\n    if (Craft.orientation === 'ltr') {\n      return this.velocity({left: pos}, duration, easing, complete);\n    } else {\n      return this.velocity({right: pos}, duration, easing, complete);\n    }\n  },\n\n  animateRight: function (pos, duration, easing, complete) {\n    if (Craft.orientation === 'ltr') {\n      return this.velocity({right: pos}, duration, easing, complete);\n    } else {\n      return this.velocity({left: pos}, duration, easing, complete);\n    }\n  },\n\n  /**\n   * Disables elements by adding a .disabled class and preventing them from receiving focus.\n   */\n  disable: function () {\n    return this.each(function () {\n      var $elem = $(this);\n      $elem.addClass('disabled');\n\n      if ($elem.data('activatable')) {\n        $elem.removeAttr('tabindex');\n      }\n    });\n  },\n\n  /**\n   * Enables elements by removing their .disabled class and allowing them to receive focus.\n   */\n  enable: function () {\n    return this.each(function () {\n      var $elem = $(this);\n      $elem.removeClass('disabled');\n\n      if ($elem.data('activatable')) {\n        $elem.attr('tabindex', '0');\n      }\n    });\n  },\n\n  /**\n   * Sets the element as the container of a grid.\n   */\n  grid: function () {\n    return this.each(function () {\n      var $container = $(this),\n        settings = {};\n\n      if ($container.data('item-selector')) {\n        settings.itemSelector = $container.data('item-selector');\n      }\n      if ($container.data('cols')) {\n        settings.cols = parseInt($container.data('cols'));\n      }\n      if ($container.data('max-cols')) {\n        settings.maxCols = parseInt($container.data('max-cols'));\n      }\n      if ($container.data('min-col-width')) {\n        settings.minColWidth = parseInt($container.data('min-col-width'));\n      }\n      if ($container.data('mode')) {\n        settings.mode = $container.data('mode');\n      }\n      if ($container.data('fill-mode')) {\n        settings.fillMode = $container.data('fill-mode');\n      }\n      if ($container.data('col-class')) {\n        settings.colClass = $container.data('col-class');\n      }\n      if ($container.data('snap-to-grid')) {\n        settings.snapToGrid = !!$container.data('snap-to-grid');\n      }\n\n      new Craft.Grid(this, settings);\n    });\n  },\n\n  infoicon: function () {\n    return this.each(function () {\n      new Craft.InfoIcon(this);\n    });\n  },\n\n  /**\n   * Sets the element as a container for a checkbox select.\n   */\n  checkboxselect: function () {\n    return this.each(function () {\n      if (!$.data(this, 'checkboxselect')) {\n        new Garnish.CheckboxSelect(this);\n      }\n    });\n  },\n\n  /**\n   * Sets the element as a field toggle trigger.\n   */\n  fieldtoggle: function () {\n    return this.each(function () {\n      if (!$.data(this, 'fieldtoggle')) {\n        new Craft.FieldToggle(this);\n      }\n    });\n  },\n\n  lightswitch: function (settings, settingName, settingValue) {\n    // param mapping\n    if (settings === 'settings') {\n      if (typeof settingName === 'string') {\n        settings = {};\n        settings[settingName] = settingValue;\n      } else {\n        settings = settingName;\n      }\n\n      return this.each(function () {\n        var obj = $.data(this, 'lightswitch');\n        if (obj) {\n          obj.setSettings(settings);\n        }\n      });\n    } else {\n      if (!$.isPlainObject(settings)) {\n        settings = {};\n      }\n\n      return this.each(function () {\n        var thisSettings = $.extend({}, settings);\n\n        if (Garnish.hasAttr(this, 'data-value')) {\n          thisSettings.value = $(this).attr('data-value');\n        }\n\n        if (Garnish.hasAttr(this, 'data-indeterminate-value')) {\n          thisSettings.indeterminateValue = $(this).attr(\n            'data-indeterminate-value'\n          );\n        }\n\n        if (!$.data(this, 'lightswitch')) {\n          new Craft.LightSwitch(this, thisSettings);\n        }\n      });\n    }\n  },\n\n  nicetext: function () {\n    return this.each(function () {\n      if (!$.data(this, 'nicetext')) {\n        new Garnish.NiceText(this);\n      }\n    });\n  },\n\n  formsubmit: function () {\n    // Secondary form submit buttons\n    return this.on('click', function (ev) {\n      let $btn = $(ev.currentTarget);\n      let params = $btn.data('params') || {};\n      if ($btn.data('param')) {\n        params[$btn.data('param')] = $btn.data('value');\n      }\n\n      let $anchor = $btn.data('menu') ? $btn.data('menu').$anchor : $btn;\n      let $form = $anchor.attr('data-form')\n        ? $('#' + $anchor.attr('data-form'))\n        : $anchor.closest('form');\n\n      Craft.submitForm($form, {\n        confirm: $btn.data('confirm'),\n        action: $btn.data('action'),\n        redirect: $btn.data('redirect'),\n        params: params,\n        data: $.extend(\n          {\n            customTrigger: $btn,\n          },\n          $btn.data('event-data')\n        ),\n      });\n    });\n  },\n\n  menubtn: function () {\n    return this.each(function () {\n      var $btn = $(this);\n\n      if (!$btn.data('menubtn') && $btn.next().hasClass('menu')) {\n        var settings = {};\n\n        if ($btn.data('menu-anchor')) {\n          settings.menuAnchor = $btn.data('menu-anchor');\n        }\n\n        new Garnish.MenuBtn($btn, settings);\n      }\n    });\n  },\n\n  disclosureMenu: function () {\n    return this.each(function () {\n      const $trigger = $(this);\n      // Only instantiate if it's not already a disclosure trigger, and it references a disclosure content\n      if (!$trigger.data('trigger') && $trigger.attr('aria-controls')) {\n        new Garnish.DisclosureMenu($trigger);\n      }\n    });\n  },\n\n  datetime: function () {\n    return this.each(function () {\n      let $wrapper = $(this);\n      let $inputs = $wrapper.find('input:not([name$=\"[timezone]\"])');\n      let checkValue = () => {\n        let hasValue = false;\n        for (let i = 0; i < $inputs.length; i++) {\n          if ($inputs.eq(i).val()) {\n            hasValue = true;\n            break;\n          }\n        }\n        if (hasValue) {\n          if (!$wrapper.children('.clear-btn').length) {\n            let $btn = $('<button/>', {\n              type: 'button',\n              class: 'clear-btn',\n              title: Craft.t('app', 'Clear'),\n              'aria-label': Craft.t('app', 'Clear'),\n            })\n              .appendTo($wrapper)\n              .on('click', () => {\n                for (let i = 0; i < $inputs.length; i++) {\n                  $inputs.eq(i).val('').trigger('input').trigger('change');\n                }\n                $btn.remove();\n                $inputs.first().filter('[type=\"text\"]').focus();\n              });\n          }\n        } else {\n          $wrapper.children('.clear-btn').remove();\n        }\n      };\n      $inputs.on('change', checkValue);\n      checkValue();\n    });\n  },\n\n  datetimeinput: function () {\n    return this.each(function () {\n      const $input = $(this);\n      const checkValue = () => {\n        if ($input.val() === '') {\n          $input.addClass('empty-value');\n        } else {\n          $input.removeClass('empty-value');\n        }\n      };\n      $input.on('input', checkValue);\n      checkValue();\n    });\n  },\n});\n\n// Override Garnish.NiceText.charsLeftHtml() to be more accessible\nGarnish.NiceText.charsLeftHtml = (charsLeft) => {\n  return Craft.t(\n    'app',\n    '<span class=\"visually-hidden\">Characters left:</span> {chars, number}',\n    {\n      chars: charsLeft,\n    }\n  );\n};\n\nGarnish.$doc.ready(function () {\n  Craft.initUiElements();\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Customize Sources modal\n */\nCraft.CustomizeSourcesModal = Garnish.Modal.extend({\n  elementIndex: null,\n  $elementIndexSourcesContainer: null,\n\n  $sidebar: null,\n  $sidebarToggleBtn: null,\n  $sourcesContainer: null,\n  $sourcesHeader: null,\n  $sourcesHeading: null,\n  $sourceSettingsContainer: null,\n  $sourceSettingsHeader: null,\n  $addSourceMenu: null,\n  addSourceMenu: null,\n  $footer: null,\n  $footerBtnContainer: null,\n  $saveBtn: null,\n  $cancelBtn: null,\n  $loadingSpinner: null,\n\n  sourceSort: null,\n  sources: null,\n  selectedSource: null,\n\n  elementTypeName: null,\n  baseSortOptions: null,\n  availableTableAttributes: null,\n  customFieldAttributes: null,\n\n  conditionBuilderHtml: null,\n  conditionBuilderJs: null,\n  userGroups: null,\n\n  init: function (elementIndex, settings) {\n    this.base();\n\n    this.setSettings(settings, {\n      resizable: true,\n    });\n\n    this.elementIndex = elementIndex;\n    this.$elementIndexSourcesContainer = this.elementIndex.$sidebar\n      .children('nav')\n      .children('ul');\n\n    const $container = $(\n      '<form class=\"modal customize-sources-modal\"/>'\n    ).appendTo(Garnish.$bod);\n\n    this.$sidebar = $('<div class=\"cs-sidebar block-types\"/>')\n      .appendTo($container)\n      .attr({\n        role: 'navigation',\n        'aria-label': Craft.t('app', 'Source'),\n      });\n    this.$sourcesContainer = $('<div class=\"sources\">').appendTo(this.$sidebar);\n    this.$sourceSettingsContainer = $('<div class=\"source-settings\">').appendTo(\n      $container\n    );\n\n    this.$footer = $('<div class=\"footer\"/>').appendTo($container);\n    this.$footerBtnContainer = $('<div class=\"buttons right\"/>').appendTo(\n      this.$footer\n    );\n    this.$cancelBtn = $('<button/>', {\n      type: 'button',\n      class: 'btn',\n      text: Craft.t('app', 'Cancel'),\n    }).appendTo(this.$footerBtnContainer);\n    this.$saveBtn = Craft.ui\n      .createSubmitButton({\n        class: 'disabled',\n        label: Craft.t('app', 'Save'),\n        spinner: true,\n      })\n      .appendTo(this.$footerBtnContainer);\n\n    this.$loadingSpinner = $('<div class=\"spinner\"/>').appendTo(\n      this.$sourceSettingsContainer\n    );\n\n    this.setContainer($container);\n    this.show();\n\n    Craft.sendActionRequest(\n      'POST',\n      'element-index-settings/get-customize-sources-modal-data',\n      {\n        data: {\n          elementType: this.elementIndex.elementType,\n        },\n      }\n    )\n      .then((response) => {\n        this.$saveBtn.removeClass('disabled');\n        this.buildModal(response.data);\n      })\n      .finally(() => {\n        this.$loadingSpinner.remove();\n        Garnish.setFocusWithin(this.$sidebar);\n      });\n\n    this.addListener(this.$cancelBtn, 'click', 'hide');\n    this.addListener(this.$saveBtn, 'click', 'save');\n    this.addListener(this.$container, 'submit', 'save');\n  },\n\n  buildModal: function (response) {\n    this.baseSortOptions = response.baseSortOptions;\n    this.defaultSortOptions = response.defaultSortOptions;\n    this.availableTableAttributes = response.availableTableAttributes;\n    this.customFieldAttributes = response.customFieldAttributes;\n    this.elementTypeName = response.elementTypeName;\n    this.conditionBuilderHtml = response.conditionBuilderHtml;\n    this.conditionBuilderJs = response.conditionBuilderJs;\n    this.userGroups = response.userGroups;\n\n    if (response.headHtml) {\n      Craft.appendHeadHtml(response.headHtml);\n    }\n    if (response.bodyHtml) {\n      Craft.appendBodyHtml(response.bodyHtml);\n    }\n\n    // Create the source item sorter\n    this.sourceSort = new Garnish.DragSort({\n      handle: '.move',\n      axis: 'y',\n    });\n\n    // Create the sources\n    this.sources = [];\n\n    for (let i = 0; i < response.sources.length; i++) {\n      this.sources.push(this.addSource(response.sources[i]));\n    }\n\n    if (!this.selectedSource && typeof this.sources[0] !== 'undefined') {\n      this.sources[0].select();\n    }\n\n    const $menuBtnContainer = $(\n      '<div class=\"buttons left\" data-wrapper/>'\n    ).appendTo(this.$footer);\n    const $menuBtn = $('<button/>', {\n      type: 'button',\n      class: 'btn menubtn add icon',\n      'aria-label': Craft.t('app', 'Add…'),\n      'aria-controls': 'add-source-menu',\n      title: Craft.t('app', 'Add…'),\n      'data-disclosure-trigger': '',\n    }).appendTo($menuBtnContainer);\n\n    this.$addSourceMenu = $('<div/>', {\n      id: 'add-source-menu',\n      class: 'menu menu--disclosure',\n    }).appendTo($menuBtnContainer);\n\n    const addSource = (sourceData) => {\n      const source = this.addSource(sourceData, true);\n      Garnish.scrollContainerToElement(this.$sidebar, source.$item);\n      source.select();\n      this.addSourceMenu.hide();\n    };\n\n    const $newHeadingBtn = $('<button/>', {\n      type: 'button',\n      class: 'menu-option',\n      text: Craft.t('app', 'New heading'),\n    }).on('click', () => {\n      addSource({\n        type: 'heading',\n      });\n      this.focusLabelInput();\n    });\n\n    const $newCustomSourceBtn = $('<button/>', {\n      type: 'button',\n      class: 'menu-option',\n      text: Craft.t('app', 'New custom source'),\n      'data-type': 'custom',\n    }).on('click', () => {\n      const sortOptions = this.baseSortOptions.slice(0);\n      sortOptions.push(this.defaultSortOptions);\n\n      addSource({\n        type: 'custom',\n        key: `custom:${Craft.uuid()}`,\n        sortOptions: sortOptions,\n        defaultSort: [sortOptions[0].attr, sortOptions[1].defaultDir],\n        tableAttributes: [],\n        availableTableAttributes: [],\n      });\n      this.focusLabelInput();\n    });\n\n    const $ul = $('<ul/>')\n      .append($('<li/>').append($newHeadingBtn))\n      .appendTo(this.$addSourceMenu);\n\n    if (response.conditionBuilderHtml) {\n      $('<li/>').append($newCustomSourceBtn).appendTo($ul);\n    }\n\n    if (Craft.useMobileStyles()) {\n      this.buildSidebarToggleView();\n    }\n\n    // Add resize listener to enable/disable sidebar toggle view\n    this.addListener(Garnish.$win, 'resize', this.updateSidebarView);\n\n    this.addSourceMenu = new Garnish.DisclosureMenu($menuBtn);\n  },\n\n  focusLabelInput: function () {\n    this.selectedSource.$labelInput.trigger('focus');\n  },\n\n  getSourceName: function () {\n    return this.selectedSource\n      ? this.selectedSource.sourceData.label\n      : this.sources[0].sourceData.label;\n  },\n\n  updateSidebarView: function () {\n    if (Craft.useMobileStyles()) {\n      if (!this.$sidebarToggleBtn) this.buildSidebarToggleView();\n    } else {\n      if (this.$sidebarToggleBtn) this.resetView();\n    }\n  },\n\n  resetView: function () {\n    if (this.$sourceSettingsHeader) {\n      this.$sourceSettingsHeader.remove();\n    }\n\n    if (this.$sourcesHeader) {\n      this.$sourcesHeader.remove();\n    }\n\n    this.$sidebarToggleBtn = null;\n    this.$container.removeClass('sidebar-hidden');\n  },\n\n  updateHeading: function () {\n    if (!this.$sourcesHeading) return;\n\n    this.$sourcesHeading.text(this.getSourceName());\n  },\n\n  buildSidebarToggleView: function () {\n    this.$sourcesHeader = $('<div class=\"sources-header\"/>')\n      .addClass('sidebar-header')\n      .prependTo(this.$sourcesContainer);\n\n    this.$sidebarCloseBtn = Craft.ui\n      .createButton({\n        class: 'nav-close close-btn',\n      })\n      .attr('aria-label', Craft.t('app', 'Close'))\n      .removeClass('btn')\n      .appendTo(this.$sourcesHeader);\n\n    this.$sourcesHeading = $('<h1 class=\"main-heading\"/>').text(\n      this.getSourceName()\n    );\n\n    this.$sourceSettingsHeader = $('<div class=\"source-settings-header\"/>')\n      .addClass('main-header')\n      .append(this.$sourcesHeading)\n      .prependTo(this.$sourceSettingsContainer);\n\n    // Toggle sidebar button\n    const buttonConfig = {\n      toggle: true,\n      controls: 'modal-sidebar',\n      class: 'nav-toggle',\n    };\n\n    this.$sidebarToggleBtn = Craft.ui\n      .createButton(buttonConfig)\n      .removeClass('btn')\n      .attr('aria-label', Craft.t('app', 'Show sidebar'))\n      .appendTo(this.$sourceSettingsHeader);\n\n    this.closeSidebar();\n\n    // Add listeners\n    this.addListener(this.$sidebarToggleBtn, 'click', () => {\n      this.toggleSidebar();\n    });\n\n    this.addListener(this.$sidebarCloseBtn, 'click', () => {\n      this.toggleSidebar();\n      this.$sidebarToggleBtn.trigger('focus');\n    });\n  },\n\n  toggleSidebar: function () {\n    if (this.sidebarIsOpen()) {\n      this.closeSidebar();\n    } else {\n      this.openSidebar();\n    }\n  },\n\n  openSidebar: function () {\n    this.$container.removeClass('sidebar-hidden');\n    this.$sidebarToggleBtn.attr('aria-expanded', 'true');\n    this.$sidebar.find(':focusable').first().focus();\n\n    Garnish.uiLayerManager.addLayer(this.$sidebar);\n\n    Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n      this.closeSidebar();\n\n      if (Garnish.focusIsInside(this.$sidebar)) {\n        this.$sidebarToggleBtn.focus();\n      }\n    });\n  },\n\n  closeSidebar: function () {\n    this.$container.addClass('sidebar-hidden');\n\n    if (this.$sidebarToggleBtn) {\n      this.$sidebarToggleBtn.attr('aria-expanded', 'false');\n    }\n\n    // if sidebar is topmost layer, remove layer\n    if (Garnish.uiLayerManager.currentLayer.$container.hasClass('cs-sidebar')) {\n      Garnish.uiLayerManager.removeLayer();\n    }\n  },\n\n  sidebarIsOpen: function () {\n    return this.$sidebarToggleBtn.attr('aria-expanded') === 'true';\n  },\n\n  addSource: function (sourceData, isNew) {\n    const $item = $('<div class=\"customize-sources-item\"/>').appendTo(\n      this.$sourcesContainer\n    );\n    const $itemLabel = $('<div class=\"label customize-sources-item__btn\"/>')\n      .attr({\n        tabindex: '0',\n        role: 'button',\n      })\n      .appendTo($item);\n    const $itemInput = $('<input type=\"hidden\"/>').appendTo($item);\n    $(\n      `<a class=\"move icon customize-sources-item__move\" title=\"${Craft.t(\n        'app',\n        'Reorder'\n      )}\" role=\"button\"></a>`\n    ).appendTo($item);\n\n    let source;\n\n    if (sourceData.type === 'heading') {\n      $item.addClass('heading');\n      $itemInput.attr('name', 'sourceOrder[][heading]');\n      source = new Craft.CustomizeSourcesModal.Heading(\n        this,\n        $item,\n        $itemLabel,\n        $itemInput,\n        sourceData,\n        isNew\n      );\n      source.updateItemLabel(sourceData.heading);\n    } else {\n      $itemInput.attr('name', 'sourceOrder[][key]').val(sourceData.key);\n      if (sourceData.type === 'native') {\n        source = new Craft.CustomizeSourcesModal.Source(\n          this,\n          $item,\n          $itemLabel,\n          $itemInput,\n          sourceData,\n          isNew\n        );\n      } else {\n        source = new Craft.CustomizeSourcesModal.CustomSource(\n          this,\n          $item,\n          $itemLabel,\n          $itemInput,\n          sourceData,\n          isNew\n        );\n      }\n      source.updateItemLabel(sourceData.label);\n\n      // Select this by default?\n      if (sourceData.key === this.elementIndex.rootSourceKey) {\n        source.select();\n      }\n    }\n\n    this.sourceSort.addItems($item);\n    return source;\n  },\n\n  save: function (ev) {\n    if (ev) {\n      ev.preventDefault();\n    }\n\n    if (\n      this.$saveBtn.hasClass('disabled') ||\n      this.$saveBtn.hasClass('loading')\n    ) {\n      return;\n    }\n\n    this.$saveBtn.addClass('loading');\n\n    Craft.sendActionRequest(\n      'POST',\n      'element-index-settings/save-customize-sources-modal-settings',\n      {\n        data:\n          this.$container.serialize() +\n          `&elementType=${this.elementIndex.elementType}`,\n      }\n    )\n      .then(({data}) => {\n        // Figure out which source to select\n        let sourceKey = null;\n        if (\n          this.selectedSource &&\n          this.selectedSource.sourceData.key &&\n          !data.disabledSourceKeys.includes(this.selectedSource.sourceData.key)\n        ) {\n          sourceKey = this.selectedSource.sourceData.key;\n        } else if (!this.elementIndex.sourceKey) {\n          sourceKey = this.elementIndex.$visibleSources.first().data('key');\n        }\n\n        if (sourceKey) {\n          this.elementIndex.selectSourceByKey(sourceKey);\n        }\n\n        window.location.reload();\n      })\n      .catch(() => {\n        Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n      })\n      .finally(() => {\n        this.$saveBtn.removeClass('loading');\n      });\n  },\n\n  appendIndexSourceItem: function ($sourceItem, $lastSourceItem) {\n    if (!$lastSourceItem) {\n      $sourceItem.prependTo(this.$elementIndexSourcesContainer);\n    } else {\n      const isHeading = $sourceItem.hasClass('heading');\n      if ($lastSourceItem.hasClass('heading') && !isHeading) {\n        // First source to be placed below a new heading\n        $sourceItem.appendTo($lastSourceItem.children('ul'));\n      } else {\n        if (isHeading) {\n          // New heading. Swap $lastSourceItem with the top level <li> if it's nested\n          const $lastTopLevelSource = $lastSourceItem\n            .parentsUntil(this.$elementIndexSourcesContainer, 'li')\n            .last();\n          if ($lastTopLevelSource.length) {\n            $lastSourceItem = $lastTopLevelSource;\n          }\n        }\n        $sourceItem.insertAfter($lastSourceItem);\n      }\n    }\n  },\n\n  destroy: function () {\n    for (let i = 0; i < this.sources.length; i++) {\n      this.sources[i].destroy();\n    }\n\n    if (this.addSourceMenu) {\n      this.addSourceMenu.destroy();\n      this.$addSourceMenu.remove();\n    }\n\n    delete this.sources;\n    this.base();\n  },\n});\n\nCraft.CustomizeSourcesModal.BaseSource = Garnish.Base.extend({\n  modal: null,\n\n  $item: null,\n  $itemLabel: null,\n  $itemInput: null,\n  $settingsContainer: null,\n\n  sourceData: null,\n  isNew: null,\n\n  init: function (modal, $item, $itemLabel, $itemInput, sourceData, isNew) {\n    this.modal = modal;\n    this.$item = $item;\n    this.$itemLabel = $itemLabel;\n    this.$itemInput = $itemInput;\n    this.sourceData = sourceData;\n    this.isNew = isNew;\n\n    this.$item.data('source', this);\n\n    this.addListener(this.$itemLabel, 'click', 'select');\n    this.addListener(this.$itemLabel, 'keypress', (e) =>\n      Garnish.handleActivatingKeypress(e, this.select.bind(this))\n    );\n  },\n\n  isHeading: function () {\n    return false;\n  },\n\n  isNative: function () {\n    return false;\n  },\n\n  isSelected: function () {\n    return this.modal.selectedSource === this;\n  },\n\n  select: function () {\n    if (this.isSelected()) {\n      return;\n    }\n\n    if (this.modal.selectedSource) {\n      this.modal.selectedSource.deselect();\n    }\n\n    this.$item.addClass('sel');\n    this.$itemLabel.attr({\n      'aria-current': 'true',\n    });\n    this.modal.selectedSource = this;\n    this.modal.updateHeading();\n\n    if (!this.$settingsContainer) {\n      this.$settingsContainer = $('<div/>').appendTo(\n        this.modal.$sourceSettingsContainer\n      );\n      this.createSettings(this.$settingsContainer);\n    } else {\n      this.$settingsContainer.removeClass('hidden');\n    }\n\n    this.modal.$sourceSettingsContainer.scrollTop(0);\n  },\n\n  createSettings: function () {},\n\n  getIndexSourceItem: function () {},\n\n  deselect: function () {\n    this.$item.removeClass('sel');\n    this.$itemLabel.attr({\n      'aria-current': 'false',\n    });\n    this.modal.selectedSource = null;\n    this.$settingsContainer.addClass('hidden');\n  },\n\n  updateItemLabel: function (val) {\n    if (val) {\n      this.$itemLabel.text(val);\n    } else {\n      this.$itemLabel.html('&nbsp;');\n    }\n  },\n\n  destroy: function () {\n    this.modal.sourceSort.removeItems(this.$item);\n    this.modal.sources.splice($.inArray(this, this.modal.sources), 1);\n\n    if (this.isSelected()) {\n      this.deselect();\n\n      if (this.modal.sources.length) {\n        this.modal.sources[0].select();\n      }\n\n      Garnish.setFocusWithin(this.modal.$sourceSettingsContainer);\n    }\n\n    this.$item.data('source', null);\n    this.$item.remove();\n\n    if (this.$settingsContainer) {\n      this.$settingsContainer.remove();\n    }\n\n    this.base();\n  },\n});\n\nCraft.CustomizeSourcesModal.Source =\n  Craft.CustomizeSourcesModal.BaseSource.extend({\n    $sortAttributeSelect: null,\n    $sortDirectionPicker: null,\n    $sortDirectionInput: null,\n    sortDirectionListbox: null,\n\n    isNative: function () {\n      return true;\n    },\n\n    createSettings: function ($container) {\n      Craft.ui\n        .createLightswitchField({\n          label: Craft.t('app', 'Enabled'),\n          name: `sources[${this.sourceData.key}][enabled]`,\n          on: !this.sourceData.disabled,\n        })\n        .appendTo($container);\n      this.createSortField($container);\n      this.createTableAttributesField($container);\n    },\n\n    createSortField: function ($container) {\n      const $inputContainer = $('<div class=\"flex\"/>');\n\n      const $sortAttributeSelectContainer = Craft.ui\n        .createSelect({\n          name: `sources[${this.sourceData.key}][defaultSort][0]`,\n          options: this.sourceData.sortOptions.map((o) => {\n            return {\n              label: o.label,\n              value: o.attr,\n            };\n          }),\n          value: this.sourceData.defaultSort[0],\n        })\n        .addClass('fullwidth')\n        .appendTo($('<div/>').appendTo($inputContainer));\n\n      this.$sortAttributeSelect = $sortAttributeSelectContainer\n        .children('select')\n        .attr('aria-label', Craft.t('app', 'Sort attribute'));\n\n      this.$sortDirectionPicker = $('<section/>', {\n        class: 'btngroup btngroup--exclusive',\n        'aria-label': Craft.t('app', 'Sort direction'),\n      })\n        .append(\n          $('<button/>', {\n            type: 'button',\n            class: 'btn',\n            title: Craft.t('app', 'Sort ascending'),\n            'aria-label': Craft.t('app', 'Sort ascending'),\n            'aria-pressed': 'false',\n            'data-icon': 'asc',\n            'data-dir': 'asc',\n          })\n        )\n        .append(\n          $('<button/>', {\n            type: 'button',\n            class: 'btn',\n            title: Craft.t('app', 'Sort descending'),\n            'aria-label': Craft.t('app', 'Sort descending'),\n            'aria-pressed': 'false',\n            'data-icon': 'desc',\n            'data-dir': 'desc',\n          })\n        )\n        .appendTo($inputContainer);\n\n      this.$sortDirectionInput = $('<input/>', {\n        type: 'hidden',\n        name: `sources[${this.sourceData.key}][defaultSort][1]`,\n      }).appendTo($inputContainer);\n\n      this.sortDirectionListbox = new Craft.Listbox(this.$sortDirectionPicker, {\n        onChange: ($selectedOption) => {\n          this.$sortDirectionInput.val($selectedOption.data('dir'));\n        },\n      });\n\n      this.$sortAttributeSelect.on('change', () => {\n        this.handleSortAttributeChange();\n      });\n\n      this.handleSortAttributeChange(true);\n\n      Craft.ui\n        .createField($inputContainer, {\n          label: Craft.t('app', 'Default Sort'),\n          fieldset: true,\n        })\n        .appendTo($container)\n        .addClass('sort-field');\n    },\n\n    handleSortAttributeChange: function (useDefaultDir) {\n      const attr = this.$sortAttributeSelect.val();\n\n      if (attr === 'structure') {\n        this.sortDirectionListbox.select(0);\n        this.sortDirectionListbox.disable();\n        this.$sortDirectionPicker.addClass('disabled');\n      } else {\n        this.sortDirectionListbox.enable();\n        this.$sortDirectionPicker.removeClass('disabled');\n\n        const dir = useDefaultDir\n          ? this.sourceData.defaultSort[1]\n          : this.sourceData.sortOptions.find((o) => o.attr === attr).defaultDir;\n        this.sortDirectionListbox.select(dir === 'asc' ? 0 : 1);\n      }\n    },\n\n    createTableAttributesField: function ($container) {\n      const availableTableAttributes = this.availableTableAttributes();\n\n      if (\n        !this.sourceData.tableAttributes.length &&\n        !availableTableAttributes.length\n      ) {\n        return;\n      }\n\n      const $columnCheckboxes = $('<div/>');\n      const selectedAttributes = [];\n\n      $(\n        `<input type=\"hidden\" name=\"sources[${this.sourceData.key}][tableAttributes][]\" value=\"\"/>`\n      ).appendTo($columnCheckboxes);\n\n      // Add the selected columns, in the selected order\n      for (let i = 0; i < this.sourceData.tableAttributes.length; i++) {\n        let [key, label] = this.sourceData.tableAttributes[i];\n        $columnCheckboxes.append(\n          this.createTableColumnOption(key, label, true)\n        );\n        selectedAttributes.push(key);\n      }\n\n      // Add the rest\n      for (let i = 0; i < availableTableAttributes.length; i++) {\n        const [key, label] = availableTableAttributes[i];\n        if (!Craft.inArray(key, selectedAttributes)) {\n          $columnCheckboxes.append(\n            this.createTableColumnOption(key, label, false)\n          );\n        }\n      }\n\n      new Garnish.DragSort($columnCheckboxes.children(), {\n        handle: '.move',\n        axis: 'y',\n      });\n\n      Craft.ui\n        .createField($columnCheckboxes, {\n          label: Craft.t('app', 'Default Table Columns'),\n          instructions: Craft.t(\n            'app',\n            'Choose which table columns should be visible for this source by default.'\n          ),\n        })\n        .appendTo($container);\n    },\n\n    availableTableAttributes: function () {\n      const attributes = this.modal.availableTableAttributes.slice(0);\n      attributes.push(...this.sourceData.availableTableAttributes);\n      return attributes;\n    },\n\n    createTableColumnOption: function (key, label, checked) {\n      return $('<div class=\"customize-sources-table-column\"/>')\n        .append('<div class=\"icon move\"/>')\n        .append(\n          Craft.ui.createCheckbox({\n            label: Craft.escapeHtml(label),\n            name: `sources[${this.sourceData.key}][tableAttributes][]`,\n            value: key,\n            checked: checked,\n          })\n        );\n    },\n\n    getIndexSourceItem: function () {\n      const $source = this.modal.elementIndex.getSourceByKey(\n        this.sourceData.key\n      );\n\n      if ($source) {\n        return $source.closest('li');\n      }\n    },\n  });\n\nCraft.CustomizeSourcesModal.CustomSource =\n  Craft.CustomizeSourcesModal.Source.extend({\n    $labelInput: null,\n\n    createSettings: function ($container) {\n      const $labelField = Craft.ui\n        .createTextField({\n          label: Craft.t('app', 'Label'),\n          name: `sources[${this.sourceData.key}][label]`,\n          value: this.sourceData.label,\n        })\n        .appendTo($container);\n      this.$labelInput = $labelField.find('.text');\n      const defaultId = `condition${Math.floor(Math.random() * 1000000)}`;\n\n      const swapPlaceholders = (str) =>\n        str\n          .replace(/__ID__/g, defaultId)\n          .replace(\n            /__SOURCE_KEY__(?=-)/g,\n            Craft.formatInputId(this.sourceData.key)\n          )\n          .replace(/__SOURCE_KEY__/g, this.sourceData.key);\n\n      const conditionBuilderHtml =\n        this.sourceData.conditionBuilderHtml ||\n        swapPlaceholders(this.modal.conditionBuilderHtml);\n      const conditionBuilderJs =\n        this.sourceData.conditionBuilderJs ||\n        swapPlaceholders(this.modal.conditionBuilderJs);\n\n      Craft.ui\n        .createField($('<div/>').append(conditionBuilderHtml), {\n          id: 'criteria',\n          label: Craft.t('app', '{type} Criteria', {\n            type: this.modal.elementTypeName,\n          }),\n        })\n        .appendTo($container);\n      Craft.appendBodyHtml(conditionBuilderJs);\n\n      this.createSortField($container);\n      this.createTableAttributesField($container);\n\n      if (this.modal.userGroups.length) {\n        Craft.ui\n          .createCheckboxSelectField({\n            label: Craft.t('app', 'User Groups'),\n            instructions: Craft.t(\n              'app',\n              'Choose which user groups should have access to this source.'\n            ),\n            name: `sources[${this.sourceData.key}][userGroups]`,\n            options: this.modal.userGroups,\n            values: this.sourceData.userGroups || '*',\n            showAllOption: true,\n          })\n          .appendTo($container);\n      }\n\n      $container.append('<hr/>');\n\n      this.$deleteBtn = $('<a class=\"error delete\"/>')\n        .attr({\n          role: 'button',\n          tabindex: '0',\n        })\n        .text(Craft.t('app', 'Delete custom source'))\n        .appendTo($container);\n\n      this.addListener(this.$labelInput, 'input', 'handleLabelInputChange');\n      this.addListener(this.$deleteBtn, 'click', 'destroy');\n      this.addListener(this.$deleteBtn, 'keypress', (e) => {\n        Garnish.handleActivatingKeypress(e, this.destroy.bind(this));\n      });\n    },\n\n    availableTableAttributes: function () {\n      const attributes = this.base();\n      if (this.isNew) {\n        attributes.push(...this.modal.customFieldAttributes);\n      }\n      return attributes;\n    },\n\n    handleLabelInputChange: function () {\n      this.updateItemLabel(this.$labelInput.val());\n    },\n\n    getIndexSourceItem: function () {\n      let $source = this.base();\n      let $label;\n\n      if ($source) {\n        $label = $source.find('.label');\n      } else {\n        $label = $('<span/>', {class: 'label'});\n        $source = $('<li/>').append(\n          $('<a/>', {\n            'data-key': this.sourceData.key,\n          }).append($label)\n        );\n      }\n\n      if (this.$labelInput) {\n        let label = Craft.trim(this.$labelInput.val());\n        if (label === '') {\n          label = Craft.t('app', '(blank)');\n        }\n        $label.text(label);\n      }\n\n      return $source;\n    },\n  });\n\nCraft.CustomizeSourcesModal.Heading =\n  Craft.CustomizeSourcesModal.BaseSource.extend({\n    $labelInput: null,\n    $deleteBtn: null,\n\n    isHeading: function () {\n      return true;\n    },\n\n    createSettings: function ($container) {\n      const $labelField = Craft.ui\n        .createTextField({\n          label: Craft.t('app', 'Heading'),\n          instructions: Craft.t(\n            'app',\n            'This can be left blank if you just want an unlabeled separator.'\n          ),\n          value: this.sourceData.heading || '',\n        })\n        .appendTo($container);\n      this.$labelInput = $labelField.find('.text');\n\n      $container.append('<hr/>');\n\n      this.$deleteBtn = $('<a class=\"error delete\"/>')\n        .text(Craft.t('app', 'Delete heading'))\n        .attr({\n          role: 'button',\n          tabindex: '0',\n        })\n        .appendTo($container);\n\n      this.addListener(this.$labelInput, 'input', 'handleLabelInputChange');\n      this.addListener(this.$deleteBtn, 'click', 'destroy');\n      this.addListener(this.$deleteBtn, 'keypress', (e) => {\n        Garnish.handleActivatingKeypress(e, this.destroy.bind(this));\n      });\n    },\n\n    handleLabelInputChange: function () {\n      this.updateItemLabel(this.$labelInput.val());\n    },\n\n    updateItemLabel: function (val) {\n      this.$itemLabel.html(\n        (val\n          ? Craft.escapeHtml(val)\n          : `<em>${Craft.t('app', '(blank)')}</em>`) + '&nbsp;'\n      );\n      this.$itemInput.val(val);\n    },\n\n    getIndexSourceItem: function () {\n      const label =\n        (this.$labelInput ? this.$labelInput.val() : null) ||\n        this.sourceData.heading ||\n        '';\n      return $('<li class=\"heading\"/>')\n        .append($('<span/>').text(label))\n        .append('<ul/>');\n    },\n  });\n","/** global: Craft */\n/** global: Garnish */\n/**\n * DataTableSorter\n */\nCraft.DataTableSorter = Garnish.DragSort.extend(\n  {\n    $table: null,\n\n    init: function (table, settings) {\n      this.$table = $(table);\n      var $rows = this.$table.children('tbody').children(':not(.filler)');\n\n      settings = $.extend({}, Craft.DataTableSorter.defaults, settings);\n\n      settings.container = this.$table.children('tbody');\n      settings.helper = this.getHelper.bind(this);\n      settings.caboose = '<tr/>';\n      settings.axis = Garnish.Y_AXIS;\n      settings.magnetStrength = 4;\n      settings.helperLagBase = 1.5;\n\n      this.base($rows, settings);\n    },\n\n    getHelper: function ($helperRow) {\n      var $helper = $(\n          '<div class=\"' + this.settings.helperClass + '\"/>'\n        ).appendTo(Garnish.$bod),\n        $table = $('<table/>').appendTo($helper),\n        $tbody = $('<tbody/>').appendTo($table);\n\n      $helperRow.appendTo($tbody);\n\n      // Copy the table width and classes\n      $table.width(this.$table.width());\n      $table.prop('className', this.$table.prop('className'));\n\n      // Copy the column widths\n      var $firstRow = this.$table.find('tr:first'),\n        $cells = $firstRow.children(),\n        $helperCells = $helperRow.children();\n\n      for (var i = 0; i < $helperCells.length; i++) {\n        $($helperCells[i]).width($($cells[i]).width());\n      }\n\n      return $helper;\n    },\n  },\n  {\n    defaults: {\n      handle: '.move',\n      helperClass: 'datatablesorthelper',\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Delete User Modal\n */\nCraft.DeleteUserModal = Garnish.Modal.extend(\n  {\n    id: null,\n    userId: null,\n\n    $deleteActionRadios: null,\n    $deleteSubmitBtn: null,\n\n    userSelect: null,\n    _deleting: false,\n\n    init: function (userId, settings) {\n      this.id = Math.floor(Math.random() * 1000000000);\n      this.userId = userId;\n      settings = $.extend(Craft.DeleteUserModal.defaults, settings);\n\n      let $form = $(\n        '<form class=\"modal fitted deleteusermodal\" method=\"post\" accept-charset=\"UTF-8\">' +\n          Craft.getCsrfInput() +\n          '<input type=\"hidden\" name=\"action\" value=\"users/delete-user\"/>' +\n          (!Garnish.isArray(this.userId)\n            ? '<input type=\"hidden\" name=\"userId\" value=\"' + this.userId + '\"/>'\n            : '') +\n          (settings.redirect\n            ? '<input type=\"hidden\" name=\"redirect\" value=\"' +\n              settings.redirect +\n              '\"/>'\n            : '') +\n          '</form>'\n      ).appendTo(Garnish.$bod);\n      let $body = $(\n        '<div class=\"body\">' +\n          '<div class=\"content-summary\">' +\n          '<p>' +\n          Craft.t('app', 'What do you want to do with their content?') +\n          '</p>' +\n          '<ul class=\"bullets\"></ul>' +\n          '</div>' +\n          '<div class=\"options\">' +\n          '<label><input type=\"radio\" name=\"contentAction\" value=\"transfer\"/> ' +\n          Craft.t('app', 'Transfer it to:') +\n          '</label>' +\n          '<div id=\"transferselect' +\n          this.id +\n          '\" class=\"elementselect\">' +\n          '<div class=\"elements\"></div>' +\n          '<button type=\"button\" class=\"btn add icon dashed\">' +\n          Craft.t('app', 'Choose a user') +\n          '</button>' +\n          '</div>' +\n          '</div>' +\n          '<div>' +\n          '<label class=\"error\"><input type=\"radio\" name=\"contentAction\" value=\"delete\"/> ' +\n          Craft.t('app', 'Delete their content') +\n          '</label>' +\n          '</div>' +\n          '</div>'\n      ).appendTo($form);\n      let $buttons = $('<div class=\"buttons right\"/>').appendTo($body);\n      let $cancelBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn',\n        text: Craft.t('app', 'Cancel'),\n      }).appendTo($buttons);\n\n      if (settings.contentSummary.length) {\n        for (let i = 0; i < settings.contentSummary.length; i++) {\n          $body\n            .find('ul')\n            .append($('<li/>', {text: settings.contentSummary[i]}));\n        }\n      } else {\n        $body.find('ul').remove();\n      }\n\n      this.$deleteActionRadios = $body.find('input[type=radio]');\n      this.$deleteSubmitBtn = Craft.ui\n        .createSubmitButton({\n          class: 'disabled',\n          label: this._submitBtnLabel(false),\n          spinner: true,\n        })\n        .appendTo($buttons);\n\n      var idParam;\n\n      if (Garnish.isArray(this.userId)) {\n        idParam = ['and'];\n\n        for (let i = 0; i < this.userId.length; i++) {\n          idParam.push('not ' + this.userId[i]);\n        }\n      } else {\n        idParam = 'not ' + this.userId;\n      }\n\n      this.userSelect = new Craft.BaseElementSelectInput({\n        id: 'transferselect' + this.id,\n        name: 'transferContentTo',\n        elementType: 'craft\\\\elements\\\\User',\n        criteria: {\n          id: idParam,\n        },\n        limit: 1,\n        modalSettings: {\n          closeOtherModals: false,\n        },\n        onSelectElements: () => {\n          this.updateSizeAndPosition();\n\n          if (!this.$deleteActionRadios.first().prop('checked')) {\n            this.$deleteActionRadios.first().trigger('click');\n          } else {\n            this.validateDeleteInputs();\n          }\n        },\n        onRemoveElements: this.validateDeleteInputs.bind(this),\n        selectable: false,\n        editable: false,\n      });\n\n      this.addListener($cancelBtn, 'click', 'hide');\n\n      this.addListener(\n        this.$deleteActionRadios,\n        'change',\n        'validateDeleteInputs'\n      );\n      this.addListener($form, 'submit', 'handleSubmit');\n\n      this.base($form, settings);\n    },\n\n    _submitBtnLabel: function (withContent) {\n      let message = withContent\n        ? 'Delete {num, plural, =1{user} other{users}} and content'\n        : 'Delete {num, plural, =1{user} other{users}}';\n\n      return Craft.t('app', message, {\n        num: Garnish.isArray(this.userId) ? this.userId.length : 1,\n      });\n    },\n\n    validateDeleteInputs: function () {\n      var validates = false;\n\n      if (this.$deleteActionRadios.eq(1).prop('checked')) {\n        validates = true;\n        this.$deleteSubmitBtn.find('.label').text(this._submitBtnLabel(true));\n      } else {\n        this.$deleteSubmitBtn.find('.label').text(this._submitBtnLabel(false));\n        if (this.$deleteActionRadios.eq(0).prop('checked')) {\n          validates = !!this.userSelect.totalSelected;\n        }\n      }\n\n      this.updateSizeAndPosition();\n\n      if (validates) {\n        this.$deleteSubmitBtn.removeClass('disabled');\n      } else {\n        this.$deleteSubmitBtn.addClass('disabled');\n      }\n\n      return validates;\n    },\n\n    handleSubmit: function (ev) {\n      if (this._deleting || !this.validateDeleteInputs()) {\n        ev.preventDefault();\n        return;\n      }\n\n      this.$deleteSubmitBtn.addClass('loading');\n      this.disable();\n      this.userSelect.disable();\n      this._deleting = true;\n\n      // Let the onSubmit callback prevent the form from getting submitted\n      try {\n        if (this.settings.onSubmit() === false) {\n          ev.preventDefault();\n        }\n      } catch (e) {\n        ev.preventDefault();\n        this.$deleteSubmitBtn.removeClass('loading');\n        throw e;\n      }\n    },\n\n    onFadeIn: function () {\n      // Auto-focus the first radio\n      if (!Garnish.isMobileBrowser(true)) {\n        this.$deleteActionRadios.first().trigger('focus');\n      }\n\n      this.base();\n    },\n  },\n  {\n    defaults: {\n      contentSummary: [],\n      onSubmit: $.noop,\n      redirect: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Handle Generator\n */\nCraft.DynamicGenerator = Craft.BaseInputGenerator.extend({\n  callback: $.noop,\n\n  init: function (source, target, callback) {\n    this.callback = callback;\n    this.base(source, target);\n  },\n\n  generateTargetValue: function (sourceVal) {\n    return this.callback(sourceVal);\n  },\n});\n","/* jshint -W083 */\n/**\n * Editable table class\n */\nCraft.EditableTable = Garnish.Base.extend(\n  {\n    initialized: false,\n\n    id: null,\n    baseName: null,\n    columns: null,\n    sorter: null,\n    biggestId: -1,\n\n    $table: null,\n    $tbody: null,\n    $addRowBtn: null,\n    $tableParent: null,\n    $statusMessage: null,\n\n    rowCount: 0,\n    hasMaxRows: false,\n    hasMinRows: false,\n\n    radioCheckboxes: null,\n\n    init: function (id, baseName, columns, settings) {\n      this.id = id;\n      this.baseName = baseName;\n      this.columns = columns;\n      this.setSettings(settings, Craft.EditableTable.defaults);\n      this.radioCheckboxes = {};\n\n      this.$table = $('#' + id);\n      this.$tbody = this.$table.children('tbody');\n      this.$tableParent = this.$table.parent();\n      this.$statusMessage = this.$tableParent.find('[data-status-message]');\n      this.rowCount = this.$tbody.find('tr').length;\n\n      // Is this already an editable table?\n      if (this.$table.data('editable-table')) {\n        console.warn('Double-instantiating an editable table on an element');\n        this.$table.data('editable-table').destroy();\n      }\n\n      this.$table.data('editable-table', this);\n\n      this.sorter = new Craft.DataTableSorter(this.$table, {\n        helperClass: 'editabletablesorthelper',\n        copyDraggeeInputValuesToHelper: true,\n        onSortChange: () => {\n          this.updateAllRows();\n        },\n      });\n\n      if (this.isVisible()) {\n        this.initialize();\n      } else {\n        // Give everything a chance to initialize\n        window.setTimeout(this.initializeIfVisible.bind(this), 500);\n      }\n\n      if (this.settings.minRows && this.rowCount < this.settings.minRows) {\n        for (var i = this.rowCount; i < this.settings.minRows; i++) {\n          this.addRow();\n        }\n      }\n    },\n\n    isVisible: function () {\n      return this.$table.parent().height() > 0;\n    },\n\n    initialize: function () {\n      if (this.initialized) {\n        return false;\n      }\n\n      this.initialized = true;\n      this.removeListener(Garnish.$win, 'resize');\n\n      var $rows = this.$tbody.children();\n\n      for (var i = 0; i < $rows.length; i++) {\n        this.createRowObj($rows[i]);\n      }\n\n      const $container = this.$table.parent('.input');\n      if ($container.length && this.$table.width() > $container.width()) {\n        $container.css('overflow-x', 'auto');\n      }\n\n      this.$addRowBtn = this.$table.next('.add');\n      this.updateAddRowButton();\n      this.addListener(this.$addRowBtn, 'activate', 'addRow');\n      return true;\n    },\n    initializeIfVisible: function () {\n      this.removeListener(Garnish.$win, 'resize');\n\n      if (this.isVisible()) {\n        this.initialize();\n      } else {\n        this.addListener(Garnish.$win, 'resize', 'initializeIfVisible');\n      }\n    },\n    updateAddRowButton: function () {\n      if (!this.canAddRow()) {\n        this.$addRowBtn.css('opacity', '0.2');\n        this.$addRowBtn.css('pointer-events', 'none');\n        this.$addRowBtn.attr('aria-disabled', 'true');\n      } else {\n        this.$addRowBtn.css('opacity', '1');\n        this.$addRowBtn.css('pointer-events', 'auto');\n        this.$addRowBtn.attr('aria-disabled', 'false');\n      }\n    },\n    updateAllRows: function () {\n      if (this.settings.staticRows) {\n        return;\n      }\n      const $rows = this.$table.find('> tbody > tr');\n      for (let i = 0; i < $rows.length; i++) {\n        this.updateRow($rows.eq(i));\n      }\n    },\n    updateRow: function ($row) {\n      if (this.settings.staticRows) {\n        return;\n      }\n\n      const $deleteBtn = $row.find('button.delete');\n\n      if ($deleteBtn.length) {\n        $deleteBtn.attr(\n          'aria-label',\n          Craft.t('app', 'Delete row {index}', {\n            index: $row.index() + 1,\n          })\n        );\n        if (this.canDeleteRow()) {\n          $deleteBtn.removeAttr('disabled').removeClass('disabled');\n        } else {\n          $deleteBtn.attr('disabled', 'disabled').addClass('disabled');\n        }\n      }\n    },\n    /**\n     * @deprecated\n     */\n    updateDeleteRowButton: function (rowId) {\n      this.updateRow(this.$table.find(`tr[data-id=\"${rowId}\"]`));\n    },\n    updateStatusMessage: function () {\n      this.$statusMessage.empty();\n      let message;\n\n      if (!this.canAddRow()) {\n        message = Craft.t(\n          'app',\n          'Row could not be added. Maximum number of rows reached.'\n        );\n      } else {\n        message = Craft.t(\n          'app',\n          'Row could not be deleted. Minimum number of rows reached.'\n        );\n      }\n\n      setTimeout(() => {\n        this.$statusMessage.text(message);\n      }, 250);\n    },\n    canDeleteRow: function () {\n      if (!this.settings.allowDelete) {\n        return false;\n      }\n\n      return this.rowCount > this.settings.minRows;\n    },\n    deleteRow: function (row) {\n      if (!this.canDeleteRow()) {\n        this.updateStatusMessage();\n        return;\n      }\n\n      this.sorter.removeItems(row.$tr);\n      row.$tr.remove();\n\n      this.rowCount--;\n\n      this.updateAllRows();\n      this.updateAddRowButton();\n\n      if (this.rowCount === 0) {\n        this.$table.addClass('hidden');\n        this.$addRowBtn.trigger('focus');\n      } else {\n        // Focus element in previous row\n        this.$tbody.find(':focusable').last().trigger('focus');\n      }\n\n      // onDeleteRow callback\n      this.settings.onDeleteRow(row.$tr);\n\n      row.destroy();\n    },\n    canAddRow: function () {\n      if (!this.settings.allowAdd) {\n        return false;\n      }\n\n      if (this.settings.maxRows) {\n        return this.rowCount < this.settings.maxRows;\n      }\n\n      return true;\n    },\n    addRow: function (focus, prepend) {\n      if (!this.canAddRow()) {\n        this.updateStatusMessage();\n        return;\n      }\n\n      var rowId = this.settings.rowIdPrefix + (this.biggestId + 1),\n        $tr = this.createRow(\n          rowId,\n          this.columns,\n          this.baseName,\n          $.extend({}, this.settings.defaultValues)\n        );\n\n      if (prepend) {\n        $tr.prependTo(this.$tbody);\n      } else {\n        $tr.appendTo(this.$tbody);\n      }\n\n      var row = this.createRowObj($tr);\n      this.sorter.addItems($tr);\n\n      // Focus the first input in the row\n      if (focus !== false) {\n        $tr\n          .find('input:visible,textarea:visible,select:visible')\n          .first()\n          .trigger('focus');\n      }\n\n      this.rowCount++;\n      this.updateAllRows();\n      this.updateAddRowButton();\n      this.$table.removeClass('hidden');\n\n      // onAddRow callback\n      this.settings.onAddRow($tr);\n\n      return row;\n    },\n\n    createRow: function (rowId, columns, baseName, values) {\n      return Craft.EditableTable.createRow(\n        rowId,\n        columns,\n        baseName,\n        values,\n        this.settings.allowReorder,\n        this.settings.allowDelete\n      );\n    },\n\n    createRowObj: function ($tr) {\n      return new Craft.EditableTable.Row(this, $tr);\n    },\n\n    focusOnPrevRow: function ($tr, tdIndex, blurTd) {\n      var $prevTr = $tr.prev('tr');\n      var prevRow;\n\n      if ($prevTr.length) {\n        prevRow = $prevTr.data('editable-table-row');\n      } else {\n        prevRow = this.addRow(false, true);\n      }\n\n      // Focus on the same cell in the previous row\n      if (!prevRow) {\n        return;\n      }\n\n      if (!prevRow.$tds[tdIndex]) {\n        return;\n      }\n\n      if ($(prevRow.$tds[tdIndex]).hasClass('disabled')) {\n        if ($prevTr) {\n          this.focusOnPrevRow($prevTr, tdIndex, blurTd);\n        }\n        return;\n      }\n\n      var $input = $('textarea,input.text', prevRow.$tds[tdIndex]);\n      if ($input.length) {\n        $(blurTd).trigger('blur');\n        $input.trigger('focus');\n      }\n    },\n\n    focusOnNextRow: function ($tr, tdIndex, blurTd) {\n      var $nextTr = $tr.next('tr');\n      var nextRow;\n\n      if ($nextTr.length) {\n        nextRow = $nextTr.data('editable-table-row');\n      } else {\n        nextRow = this.addRow(false);\n      }\n\n      // Focus on the same cell in the next row\n      if (!nextRow) {\n        return;\n      }\n\n      if (!nextRow.$tds[tdIndex]) {\n        return;\n      }\n\n      if ($(nextRow.$tds[tdIndex]).hasClass('disabled')) {\n        if ($nextTr) {\n          this.focusOnNextRow($nextTr, tdIndex, blurTd);\n        }\n        return;\n      }\n\n      var $input = $('textarea,input.text', nextRow.$tds[tdIndex]);\n      if ($input.length) {\n        $(blurTd).trigger('blur');\n        $input.trigger('focus');\n      }\n    },\n\n    importData: function (data, row, tdIndex) {\n      let lines = data.split(/\\r?\\n|\\r/);\n      for (let i = 0; i < lines.length; i++) {\n        let values = lines[i].split('\\t');\n        for (let j = 0; j < values.length; j++) {\n          let value = values[j];\n          row.$tds\n            .eq(tdIndex + j)\n            .find('textarea,input[type!=hidden]')\n            .val(value)\n            .trigger('input');\n        }\n\n        // move onto the next row\n        let $nextTr = row.$tr.next('tr');\n        if ($nextTr.length) {\n          row = $nextTr.data('editable-table-row');\n        } else {\n          row = this.addRow(false);\n        }\n      }\n    },\n\n    destroy: function () {\n      this.$table.removeData('editable-table');\n      this.base();\n    },\n  },\n  {\n    textualColTypes: [\n      'autosuggest',\n      'color',\n      'date',\n      'email',\n      'multiline',\n      'number',\n      'singleline',\n      'template',\n      'time',\n      'url',\n    ],\n    defaults: {\n      rowIdPrefix: '',\n      defaultValues: {},\n      allowAdd: false,\n      allowReorder: false,\n      allowDelete: false,\n      minRows: null,\n      maxRows: null,\n      onAddRow: $.noop,\n      onDeleteRow: $.noop,\n    },\n\n    createRow: function (\n      rowId,\n      columns,\n      baseName,\n      values,\n      allowReorder,\n      allowDelete\n    ) {\n      var $tr = $('<tr/>', {\n        'data-id': rowId,\n      });\n\n      for (var colId in columns) {\n        if (!columns.hasOwnProperty(colId)) {\n          continue;\n        }\n\n        var col = columns[colId],\n          value = typeof values[colId] !== 'undefined' ? values[colId] : '',\n          $cell;\n\n        if (col.type === 'heading') {\n          $cell = $('<th/>', {\n            scope: 'row',\n            class: col['class'],\n            html: value,\n          });\n        } else {\n          var name = baseName + '[' + rowId + '][' + colId + ']';\n\n          $cell = $('<td/>', {\n            class: `${col.class} ${col.type}-cell`,\n            width: col.width,\n          });\n\n          if (Craft.inArray(col.type, Craft.EditableTable.textualColTypes)) {\n            $cell.addClass('textual');\n          }\n\n          if (col.code) {\n            $cell.addClass('code');\n          }\n\n          switch (col.type) {\n            case 'checkbox':\n              $('<div class=\"checkbox-wrapper\"/>')\n                .append(\n                  Craft.ui.createCheckbox({\n                    name: name,\n                    value: col.value || '1',\n                    checked: !!value,\n                  })\n                )\n                .appendTo($cell);\n              break;\n\n            case 'color':\n              Craft.ui\n                .createColorInput({\n                  name: name,\n                  value: value,\n                  small: true,\n                })\n                .appendTo($cell);\n              break;\n\n            case 'date':\n              Craft.ui\n                .createDateInput({\n                  name: name,\n                  value: value,\n                })\n                .appendTo($cell);\n              break;\n\n            case 'lightswitch':\n              Craft.ui\n                .createLightswitch({\n                  name: name,\n                  value: col.value || '1',\n                  on: !!value,\n                  small: true,\n                })\n                .appendTo($cell);\n              break;\n\n            case 'select':\n              Craft.ui\n                .createSelect({\n                  name: name,\n                  options: col.options,\n                  value:\n                    value ||\n                    (function () {\n                      for (var key in col.options) {\n                        if (\n                          col.options.hasOwnProperty(key) &&\n                          col.options[key].default\n                        ) {\n                          return typeof col.options[key].value !== 'undefined'\n                            ? col.options[key].value\n                            : key;\n                        }\n                      }\n                      return null;\n                    })(),\n                  class: 'small',\n                })\n                .appendTo($cell);\n              break;\n\n            case 'time':\n              Craft.ui\n                .createTimeInput({\n                  name: name,\n                  value: value,\n                })\n                .appendTo($cell);\n              break;\n\n            case 'email':\n            case 'url':\n              Craft.ui\n                .createTextInput({\n                  name: name,\n                  value: value,\n                  type: col.type,\n                  placeholder: col.placeholder || null,\n                })\n                .appendTo($cell);\n              break;\n\n            default:\n              $('<textarea/>', {\n                name: name,\n                rows: col.rows || 1,\n                val: value,\n                placeholder: col.placeholder,\n              }).appendTo($cell);\n          }\n        }\n\n        $cell.appendTo($tr);\n      }\n\n      if (allowReorder) {\n        $('<td/>', {\n          class: 'thin action',\n        })\n          .append(\n            $('<a/>', {\n              class: 'move icon',\n              title: Craft.t('app', 'Reorder'),\n              role: 'button',\n              type: 'button',\n            })\n          )\n          .appendTo($tr);\n      }\n\n      if (allowDelete) {\n        $('<td/>', {\n          class: 'thin action',\n        })\n          .append(\n            $('<button/>', {\n              class: 'delete icon',\n              title: Craft.t('app', 'Delete'),\n              type: 'button',\n            })\n          )\n          .appendTo($tr);\n      }\n\n      return $tr;\n    },\n  }\n);\n\n/**\n * Editable table row class\n */\nCraft.EditableTable.Row = Garnish.Base.extend(\n  {\n    table: null,\n    id: null,\n    niceTexts: null,\n\n    $tr: null,\n    $tds: null,\n    tds: null,\n    $textareas: null,\n    $deleteBtn: null,\n\n    init: function (table, tr) {\n      this.table = table;\n      this.$tr = $(tr);\n      this.$tds = this.$tr.children();\n      this.tds = [];\n      this.id = this.$tr.attr('data-id');\n\n      this.$tr.data('editable-table-row', this);\n\n      // Get the row ID, sans prefix\n      var id = parseInt(\n        this.id.substring(this.table.settings.rowIdPrefix.length)\n      );\n\n      if (id > this.table.biggestId) {\n        this.table.biggestId = id;\n      }\n\n      this.$textareas = $();\n      this.niceTexts = [];\n      var textareasByColId = {};\n\n      var i = 0;\n      var colId, col, td, $textarea, $checkbox;\n\n      for (colId in this.table.columns) {\n        if (!this.table.columns.hasOwnProperty(colId)) {\n          continue;\n        }\n\n        col = this.table.columns[colId];\n        td = this.tds[colId] = this.$tds[i];\n\n        if (Craft.inArray(col.type, Craft.EditableTable.textualColTypes)) {\n          $textarea = $('textarea', td);\n          this.$textareas = this.$textareas.add($textarea);\n\n          this.addListener($textarea, 'focus', 'onTextareaFocus');\n          this.addListener($textarea, 'mousedown', 'ignoreNextTextareaFocus');\n\n          this.niceTexts.push(\n            new Garnish.NiceText($textarea, {\n              onHeightChange: this.onTextareaHeightChange.bind(this),\n            })\n          );\n\n          this.addListener(\n            $textarea,\n            'keypress',\n            {tdIndex: i, type: col.type},\n            'handleKeypress'\n          );\n          this.addListener(\n            $textarea,\n            'input',\n            {type: col.type},\n            'validateValue'\n          );\n          $textarea.trigger('input');\n\n          if (col.type !== 'multiline') {\n            this.addListener(\n              $textarea,\n              'paste',\n              {tdIndex: i, type: col.type},\n              'handlePaste'\n            );\n          }\n\n          textareasByColId[colId] = $textarea;\n        } else if (col.type === 'checkbox') {\n          $checkbox = $('input[type=\"checkbox\"]', td);\n\n          if (col.radioMode) {\n            if (typeof this.table.radioCheckboxes[colId] === 'undefined') {\n              this.table.radioCheckboxes[colId] = [];\n            }\n            this.table.radioCheckboxes[colId].push($checkbox[0]);\n            this.addListener(\n              $checkbox,\n              'change',\n              {colId},\n              'onRadioCheckboxChange'\n            );\n          }\n\n          if (col.toggle) {\n            this.addListener($checkbox, 'change', {colId}, function (ev) {\n              this.applyToggleCheckbox(ev.data.colId);\n            });\n          }\n        }\n\n        if (!$(td).hasClass('disabled')) {\n          this.addListener(td, 'click', {td}, function (ev) {\n            if (ev.target === ev.data.td) {\n              $(ev.data.td).find('textarea,input,select,.lightswitch').focus();\n            }\n          });\n        }\n\n        i++;\n      }\n\n      // Now that all of the text cells have been nice-ified, let's normalize the heights\n      this.onTextareaHeightChange();\n\n      // See if we need to apply any checkbox toggles now that we've indexed all the TDs\n      for (colId in this.table.columns) {\n        if (!this.table.columns.hasOwnProperty(colId)) {\n          continue;\n        }\n        col = this.table.columns[colId];\n        if (col.type === 'checkbox' && col.toggle) {\n          this.applyToggleCheckbox(colId);\n        }\n      }\n\n      // Now look for any autopopulate columns\n      for (colId in this.table.columns) {\n        if (!this.table.columns.hasOwnProperty(colId)) {\n          continue;\n        }\n\n        col = this.table.columns[colId];\n\n        if (\n          col.autopopulate &&\n          typeof textareasByColId[col.autopopulate] !== 'undefined' &&\n          !textareasByColId[colId].val()\n        ) {\n          new Craft.HandleGenerator(\n            textareasByColId[colId],\n            textareasByColId[col.autopopulate],\n            {\n              allowNonAlphaStart: true,\n            }\n          );\n        }\n      }\n\n      var $deleteBtn = this.$tr.children().last().find('.delete');\n      this.addListener($deleteBtn, 'click', 'deleteRow');\n\n      var $inputs = this.$tr.find('input,textarea,select,.lightswitch');\n      this.addListener($inputs, 'focus', function (ev) {\n        $(ev.currentTarget).closest('td:not(.disabled)').addClass('focus');\n      });\n      this.addListener($inputs, 'blur', function (ev) {\n        $(ev.currentTarget).closest('td').removeClass('focus');\n      });\n    },\n\n    onTextareaFocus: function (ev) {\n      this.onTextareaHeightChange();\n\n      var $textarea = $(ev.currentTarget);\n\n      if ($textarea.data('ignoreNextFocus')) {\n        $textarea.data('ignoreNextFocus', false);\n        return;\n      }\n\n      window.setTimeout(function () {\n        Craft.selectFullValue($textarea);\n      }, 0);\n    },\n\n    onRadioCheckboxChange: function (ev) {\n      if (ev.currentTarget.checked) {\n        for (\n          var i = 0;\n          i < this.table.radioCheckboxes[ev.data.colId].length;\n          i++\n        ) {\n          var checkbox = this.table.radioCheckboxes[ev.data.colId][i];\n          checkbox.checked = checkbox === ev.currentTarget;\n        }\n      }\n    },\n\n    applyToggleCheckbox: function (checkboxColId) {\n      var checkboxCol = this.table.columns[checkboxColId];\n      var checked = $('input[type=\"checkbox\"]', this.tds[checkboxColId]).prop(\n        'checked'\n      );\n      var colId, colIndex, neg;\n      for (var i = 0; i < checkboxCol.toggle.length; i++) {\n        colId = checkboxCol.toggle[i];\n        colIndex = this.table.colum;\n        neg = colId[0] === '!';\n        if (neg) {\n          colId = colId.substring(1);\n        }\n        if ((checked && !neg) || (!checked && neg)) {\n          $(this.tds[colId])\n            .removeClass('disabled')\n            .find('textarea, input')\n            .prop('disabled', false);\n        } else {\n          $(this.tds[colId])\n            .addClass('disabled')\n            .find('textarea, input')\n            .prop('disabled', true);\n        }\n      }\n    },\n\n    ignoreNextTextareaFocus: function (ev) {\n      $.data(ev.currentTarget, 'ignoreNextFocus', true);\n    },\n\n    handleKeypress: function (ev) {\n      var keyCode = ev.keyCode ? ev.keyCode : ev.charCode;\n      var ctrl = Garnish.isCtrlKeyPressed(ev);\n\n      // Going to the next/previous row?\n      if (\n        keyCode === Garnish.RETURN_KEY &&\n        (ev.data.type !== 'multiline' || ctrl)\n      ) {\n        ev.preventDefault();\n        if (ev.shiftKey) {\n          this.table.focusOnPrevRow(\n            this.$tr,\n            ev.data.tdIndex,\n            ev.currentTarget\n          );\n        } else {\n          this.table.focusOnNextRow(\n            this.$tr,\n            ev.data.tdIndex,\n            ev.currentTarget\n          );\n        }\n        return;\n      }\n    },\n\n    handlePaste: function (ev) {\n      let data = Craft.trim(\n        ev.originalEvent.clipboardData.getData('Text'),\n        ' \\n\\r'\n      );\n      if (!data.match(/[\\t\\r\\n]/)) {\n        return;\n      }\n      ev.preventDefault();\n      this.table.importData(data, this, ev.data.tdIndex);\n    },\n\n    validateValue: function (ev) {\n      if (ev.data.type === 'multiline') {\n        return;\n      }\n\n      if (ev.data.type === 'number') {\n        Craft.filterNumberInputVal(ev.currentTarget);\n        return;\n      }\n\n      // Strip any newlines\n      const safeValue = ev.currentTarget.value.replace(/[\\r\\n]/g, '');\n      if (safeValue !== ev.currentTarget.value) {\n        ev.currentTarget.value = safeValue;\n      }\n    },\n\n    onTextareaHeightChange: function () {\n      // Keep all the textareas' heights in sync\n      var tallestTextareaHeight = -1;\n\n      for (var i = 0; i < this.niceTexts.length; i++) {\n        if (this.niceTexts[i].height > tallestTextareaHeight) {\n          tallestTextareaHeight = this.niceTexts[i].height;\n        }\n      }\n\n      this.$textareas.css('min-height', tallestTextareaHeight);\n\n      // If the <td> is still taller, go with that instead\n      var tdHeight = this.$textareas\n        .filter(':visible')\n        .first()\n        .parent()\n        .height();\n\n      if (tdHeight > tallestTextareaHeight) {\n        this.$textareas.css('min-height', tdHeight);\n      }\n    },\n\n    deleteRow: function () {\n      this.table.deleteRow(this);\n    },\n  },\n  {\n    /** @deprecated */\n    numericKeyCodes: [\n      9 /* (tab) */, 8 /* (delete) */, 37, 38, 39, 40 /* (arrows) */, 45,\n      91 /* (minus) */, 46, 190 /* period */, 48, 49, 50, 51, 52, 53, 54, 55,\n      56, 57 /* (0-9) */,\n    ],\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element Action Trigger\n */\nCraft.ElementActionTrigger = Garnish.Base.extend(\n  {\n    maxLevels: null,\n    newChildUrl: null,\n    $trigger: null,\n    $selectedItems: null,\n    triggerEnabled: true,\n\n    init: function (settings) {\n      if (!$.isPlainObject(settings)) {\n        settings = {};\n      }\n\n      // batch => bulk\n      if (typeof settings.batch !== 'undefined') {\n        settings.bulk = settings.batch;\n        delete settings.batch;\n      }\n      Object.defineProperty(settings, 'batch', {\n        get() {\n          return this.bulk;\n        },\n        set(v) {\n          this.bulk = v;\n        },\n      });\n\n      this.setSettings(settings, Craft.ElementActionTrigger.defaults);\n\n      this.$trigger = $(\n        '#' + settings.type.replace(/[\\[\\]\\\\]+/g, '-') + '-actiontrigger'\n      );\n\n      // Do we have a custom handler?\n      if (this.settings.activate) {\n        // Prevent the element index's click handler\n        this.$trigger.data('custom-handler', true);\n\n        // Is this a custom trigger?\n        if (this.$trigger.prop('nodeName') === 'FORM') {\n          this.addListener(this.$trigger, 'submit', 'handleTriggerActivation');\n        } else {\n          this.addListener(this.$trigger, 'click', 'handleTriggerActivation');\n        }\n      }\n\n      this.updateTrigger();\n      Craft.elementIndex.on('selectionChange', this.updateTrigger.bind(this));\n    },\n\n    updateTrigger: function () {\n      // Ignore if the last element was just unselected\n      if (Craft.elementIndex.getSelectedElements().length === 0) {\n        return;\n      }\n\n      if (this.validateSelection()) {\n        this.enableTrigger();\n      } else {\n        this.disableTrigger();\n      }\n    },\n\n    /**\n     * Determines if this action can be performed on the currently selected elements.\n     *\n     * @returns {boolean}\n     */\n    validateSelection: function () {\n      var valid = true;\n      this.$selectedItems = Craft.elementIndex.getSelectedElements();\n\n      if (!this.settings.bulk && this.$selectedItems.length > 1) {\n        valid = false;\n      } else if (typeof this.settings.validateSelection === 'function') {\n        valid = this.settings.validateSelection(this.$selectedItems);\n      }\n\n      return valid;\n    },\n\n    enableTrigger: function () {\n      if (this.triggerEnabled) {\n        return;\n      }\n\n      this.$trigger.removeClass('disabled');\n      this.triggerEnabled = true;\n    },\n\n    disableTrigger: function () {\n      if (!this.triggerEnabled) {\n        return;\n      }\n\n      this.$trigger.addClass('disabled');\n      this.triggerEnabled = false;\n    },\n\n    handleTriggerActivation: function (ev) {\n      ev.preventDefault();\n      ev.stopPropagation();\n\n      if (this.triggerEnabled) {\n        this.settings.activate(this.$selectedItems);\n      }\n    },\n  },\n  {\n    defaults: {\n      type: null,\n      bulk: true,\n      validateSelection: null,\n      activate: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Element Editor\n */\nCraft.ElementEditor = Garnish.Base.extend(\n  {\n    isFullPage: null,\n    $container: null,\n    $tabContainer: null,\n    $contentContainer: null,\n    $revisionBtn: null,\n    $revisionLabel: null,\n    $spinner: null,\n    $expandSiteStatusesBtn: null,\n    $statusIcon: null,\n    $previewBtn: null,\n\n    $editMetaBtn: null,\n    metaHud: null,\n    $nameTextInput: null,\n    $saveMetaBtn: null,\n\n    $siteStatusPane: null,\n    $globalLightswitch: null,\n    $siteLightswitches: null,\n    $additionalSiteField: null,\n\n    siteIds: null,\n    newSiteIds: null,\n\n    enableAutosave: null,\n    lastSerializedValue: null,\n    listeningForChanges: false,\n    pauseLevel: 0,\n    timeout: null,\n    cancelToken: null,\n    ignoreFailedRequest: false,\n    queue: null,\n    submittingForm: false,\n\n    duplicatedElements: null,\n    failed: false,\n    httpStatus: null,\n    httpError: null,\n\n    openingPreview: false,\n    preview: null,\n    activatedPreviewToken: false,\n    previewTokenQueue: null,\n    previewLinks: null,\n    scrollY: null,\n\n    hiddenTipsStorageKey: 'Craft-' + Craft.systemUid + '.TipField.hiddenTips',\n\n    get tipDismissBtn() {\n      return this.$container.find('.tip-dismiss-btn');\n    },\n\n    get slideout() {\n      return this.$container.data('slideout');\n    },\n\n    init: function (container, settings) {\n      this.$container = $(container);\n\n      if (this.$container.prop('tagName') !== 'FORM') {\n        throw 'Element editors may only be used with forms.';\n      }\n\n      if (this.$container.data('elementEditor')) {\n        console.warn('Double-instantiating an element editor on an element.');\n        this.$container.data('elementEditor').destroy();\n      }\n\n      this.$container.data('elementEditor', this);\n      this.$container.attr('data-element-editor', '');\n\n      this.setSettings(settings, Craft.ElementEditor.defaults);\n\n      this.isFullPage = this.$container[0] === Craft.cp.$primaryForm[0];\n\n      if (this.isFullPage) {\n        this.$tabContainer = $('#tabs');\n        this.$contentContainer = $('#content');\n      } else {\n        this.$tabContainer = this.slideout.$tabContainer;\n        this.$contentContainer = this.slideout.$content;\n      }\n\n      this.queue = this._createQueue();\n      this.previewTokenQueue = this._createQueue();\n\n      this.duplicatedElements = {};\n      this.enableAutosave = Craft.autosaveDrafts;\n      this.previewLinks = [];\n\n      this.siteIds = Object.keys(this.settings.siteStatuses).map((siteId) => {\n        return parseInt(siteId);\n      });\n\n      this.$revisionBtn = this.$container.find('.context-btn');\n      this.$revisionLabel = this.$container.find('.revision-label');\n      this.$previewBtn = this.$container.find('.preview-btn');\n\n      const $spinnerContainer = this.isFullPage\n        ? $('#page-title')\n        : this.slideout.$toolbar;\n      this.$spinner = $('<div/>', {\n        class: 'revision-spinner spinner hidden',\n        title: Craft.t('app', 'Saving'),\n      }).appendTo($spinnerContainer);\n      this.$statusIcon = $('<div/>', {\n        class: `revision-status ${this.isFullPage ? 'invisible' : 'hidden'}`,\n      }).appendTo($spinnerContainer);\n      this.$statusMessage = $('<div/>', {\n        class: 'revision-status-message visually-hidden',\n        'aria-live': 'polite',\n      }).appendTo($spinnerContainer);\n\n      this.$expandSiteStatusesBtn = $('.expand-status-btn');\n\n      if (this.settings.canEditMultipleSites) {\n        this.addListener(\n          this.$expandSiteStatusesBtn,\n          'click',\n          'expandSiteStatuses'\n        );\n      }\n\n      if (this.settings.previewTargets.length && this.isFullPage) {\n        if (this.settings.enablePreview) {\n          this.addListener(this.$previewBtn, 'click', 'openPreview');\n        }\n\n        const $previewBtnContainer = this.$container.find(\n          '.preview-btn-container'\n        );\n\n        if (this.settings.previewTargets.length === 1) {\n          const [target] = this.settings.previewTargets;\n          this.createPreviewLink(target)\n            .addClass('view-btn btn')\n            .attr('aria-label', Craft.t('app', 'View'))\n            .appendTo($previewBtnContainer);\n        } else {\n          this.createShareMenu($previewBtnContainer);\n        }\n      }\n\n      // If this is a revision, we're done here\n      if (this.settings.revisionId) {\n        return;\n      }\n\n      // Override the serializer to use our own\n      this.$container.data('serializer', () => this.serializeForm(true));\n      this.$container.data('initialSerializedValue', this.serializeForm(true));\n\n      if (this.isFullPage) {\n        this.addListener(this.$container, 'submit', 'handleSubmit');\n      }\n\n      if (this.settings.isProvisionalDraft) {\n        this.initForProvisionalDraft();\n      } else if (this.settings.draftId && !this.settings.isUnpublishedDraft) {\n        this.initForDraft();\n      } else if (!this.settings.canSaveCanonical) {\n        // Override the save shortcut to create a draft too\n        this.addListener(this.$container, 'submit.saveShortcut', (ev) => {\n          if (ev.saveShortcut) {\n            ev.preventDefault();\n            this.createDraft();\n            this.removeListener(this.$container, 'submit.saveShortcut');\n          }\n        });\n      }\n\n      this.listenForChanges();\n\n      this.addListener(this.$statusIcon, 'click', () => {\n        this.showStatusHud(this.$statusIcon);\n      });\n\n      // handle closing tips\n      this.handleDismissibleTips();\n\n      if (this.isFullPage && Craft.messageReceiver) {\n        // Listen on Craft.broadcaster to ignore any messages sent by this very page\n        Craft.broadcaster.addEventListener('message', (ev) => {\n          if (\n            (ev.data.event === 'saveDraft' &&\n              ev.data.canonicalId === this.settings.canonicalId &&\n              (ev.data.draftId === this.settings.draftId ||\n                (ev.data.isProvisionalDraft && !this.settings.draftId))) ||\n            (ev.data.event === 'saveElement' &&\n              ev.data.id === this.settings.canonicalId &&\n              !this.settings.draftId)\n          ) {\n            Craft.setLocalStorage('scrollY', window.scrollY);\n            window.location.reload();\n          } else if (\n            ev.data.event === 'deleteDraft' &&\n            ev.data.canonicalId === this.settings.canonicalId &&\n            ev.data.draftId === this.settings.draftId\n          ) {\n            const url = new URL(window.location.href);\n            url.searchParams.delete('draftId');\n            if (url.href !== document.location.href) {\n              window.location.href = url;\n            } else {\n              Craft.setLocalStorage('scrollY', window.scrollY);\n              window.location.reload();\n            }\n          }\n        });\n      }\n    },\n\n    _createQueue: function () {\n      const queue = new Craft.Queue();\n      queue.on('beforeRun', () => {\n        this.showSpinner();\n      });\n      queue.on('afterRun', () => {\n        this.hideSpinner();\n      });\n      return queue;\n    },\n\n    get namespace() {\n      if (this.isFullPage) {\n        return null;\n      }\n\n      return this.slideout.namespace;\n    },\n\n    namespaceInputName(name) {\n      return Craft.namespaceInputName(name, this.namespace);\n    },\n\n    namespaceId(id) {\n      return Craft.namespaceId(id, this.namespace);\n    },\n\n    listenForChanges: function () {\n      if (\n        this.listeningForChanges ||\n        this.pauseLevel > 0 ||\n        !this.enableAutosave ||\n        !this.settings.canCreateDrafts\n      ) {\n        return;\n      }\n\n      this.listeningForChanges = true;\n\n      // Listen for events on the body when editing a full page form, so we don’t miss events from Live Preview\n      const $target = this.isFullPage ? Garnish.$bod : this.$container;\n\n      this.addListener(\n        $target,\n        'keypress,keyup,change,focus,blur,click,mousedown,mouseup',\n        (ev) => {\n          if ($(ev.target).is(this.statusIcons())) {\n            return;\n          }\n          clearTimeout(this.timeout);\n          // If they are typing, wait half a second before checking the form\n          if (['keypress', 'keyup', 'change'].includes(ev.type)) {\n            this.timeout = setTimeout(this.checkForm.bind(this), 500);\n          } else {\n            this.checkForm();\n          }\n        }\n      );\n    },\n\n    stopListeningForChanges: function () {\n      if (!this.listeningForChanges) {\n        return;\n      }\n\n      this.removeListener(\n        Garnish.$bod,\n        'keypress,keyup,change,focus,blur,click,mousedown,mouseup'\n      );\n      clearTimeout(this.timeout);\n      this.listeningForChanges = false;\n    },\n\n    pause: function () {\n      this.pauseLevel++;\n      this.stopListeningForChanges();\n    },\n\n    resume: function () {\n      if (this.pauseLevel === 0) {\n        throw 'Craft.ElementEditor::resume() should only be called after pause().';\n      }\n\n      // Only actually resume operation if this has been called the same\n      // number of times that pause() was called\n      this.pauseLevel--;\n      if (this.pauseLevel === 0) {\n        if (this.enableAutosave) {\n          this.checkForm();\n          this.listenForChanges();\n        }\n      }\n    },\n\n    initForProvisionalDraft: function () {\n      let $discardButton = this.$container.find('.discard-changes-btn');\n\n      if (!$discardButton.length) {\n        let initialHeight, scrollTop;\n\n        let $noticeContainer;\n        if (this.isFullPage) {\n          initialHeight = $('#content').height();\n          scrollTop = Garnish.$win.scrollTop();\n          $noticeContainer = Craft.cp.$noticeContainer;\n        } else {\n          $noticeContainer = this.$container.find('.so-notice');\n        }\n\n        const $notice = $('<div/>', {\n          class: 'draft-notice',\n        })\n          .append(\n            $('<div/>', {\n              class: 'draft-icon',\n              'aria-hidden': 'true',\n              'data-icon': 'edit',\n            })\n          )\n          .append(\n            $('<p/>', {\n              text: Craft.t('app', 'Showing your unsaved changes.'),\n            })\n          )\n          .appendTo($noticeContainer);\n\n        $discardButton = $('<button/>', {\n          type: 'button',\n          class: 'discard-changes-btn btn',\n          text: Craft.t('app', 'Discard'),\n        }).appendTo($notice);\n\n        if (this.isFullPage) {\n          const heightDiff = $('#content').height() - initialHeight;\n          Garnish.$win.scrollTop(scrollTop + heightDiff);\n\n          // If there isn’t enough content to simulate the same scroll position, slide it down instead\n          if (Garnish.$win.scrollTop() === scrollTop) {\n            // Disable pointer events until half a second after the animation is complete\n            Craft.cp.$contentContainer.css('pointer-events', 'none');\n\n            $('#content-header').css('min-height', 'auto');\n            const height = $noticeContainer.height();\n            $noticeContainer\n              .css({height: height - heightDiff, overflow: 'hidden'})\n              .velocity({height: height}, 'fast', () => {\n                $('#content-header').css('min-height', '');\n                $noticeContainer.css({height: '', overflow: ''});\n\n                setTimeout(() => {\n                  Craft.cp.$contentContainer.css('pointer-events', '');\n                }, 300);\n              });\n          }\n        }\n      }\n\n      this.addListener(\n        $discardButton,\n        'keypress,keyup,change,focus,blur,click,mousedown,mouseup',\n        (ev) => {\n          ev.stopPropagation();\n        }\n      );\n\n      this.addListener($discardButton, 'click', () => {\n        if (\n          confirm(\n            Craft.t('app', 'Are you sure you want to discard your changes?')\n          )\n        ) {\n          this.queue.unshift(\n            () =>\n              new Promise((resolve, reject) => {\n                if (this.isFullPage) {\n                  Craft.submitForm(this.$container, {\n                    action: 'elements/delete-draft',\n                    redirect: this.settings.hashedCpEditUrl,\n                    params: {\n                      draftId: this.settings.draftId,\n                      provisional: 1,\n                    },\n                  });\n                } else {\n                  Craft.sendActionRequest('POST', 'elements/delete-draft', {\n                    data: {\n                      elementId: this.settings.canonicalId,\n                      draftId: this.settings.draftId,\n                      provisional: 1,\n                    },\n                  })\n                    .then((response) => {\n                      Craft.cp.displaySuccess(response.data.message);\n                      this.slideout.close();\n                    })\n                    .catch(reject);\n                }\n              })\n          );\n        }\n      });\n    },\n\n    initForDraft: function () {\n      // Create the edit draft button\n      this.createEditMetaBtn();\n\n      if (this.settings.canSaveCanonical) {\n        Garnish.uiLayerManager.registerShortcut(\n          {\n            keyCode: Garnish.S_KEY,\n            ctrl: true,\n            alt: true,\n          },\n          () => {\n            Craft.submitForm(this.$container, {\n              action: 'elements/apply-draft',\n              redirect: this.settings.hashedCpEditUrl,\n            });\n          },\n          0\n        );\n      }\n    },\n\n    expandSiteStatuses: function () {\n      this.removeListener(this.$expandSiteStatusesBtn, 'click');\n      this.$expandSiteStatusesBtn.velocity({opacity: 0}, 'fast', () => {\n        this.$expandSiteStatusesBtn.remove();\n      });\n\n      const $enabledForSiteField = this.$container.find(\n        `.enabled-for-site-${this.settings.siteId}-field`\n      );\n      this.$siteStatusPane = $enabledForSiteField.parent();\n\n      // If this is a revision, just show the site statuses statically and be done\n      if (this.settings.revisionId) {\n        this._getOtherSupportedSites().forEach((s) =>\n          this._createSiteStatusField(s)\n        );\n        return;\n      }\n\n      $enabledForSiteField.addClass('nested');\n      const $globalField = Craft.ui\n        .createLightswitchField({\n          label: Craft.t('app', 'Enabled for all sites'),\n          name: this.namespaceInputName('enabled'),\n        })\n        .insertBefore($enabledForSiteField);\n      $globalField.find('label').css('font-weight', 'bold');\n      this.$globalLightswitch = $globalField.find('.lightswitch');\n\n      if (!this.settings.revisionId) {\n        this._showField($globalField);\n      }\n\n      // Figure out what the \"Enabled everywhere\" lightswitch would have been set to when the page first loaded\n      const siteStatusValues = Object.values(this.settings.siteStatuses);\n      const hasEnabled = siteStatusValues.includes(true);\n      const hasDisabled = siteStatusValues.includes(false);\n      const originalEnabledValue =\n        hasEnabled && hasDisabled ? '-' : hasEnabled ? '1' : '';\n      const originalSerializedStatus =\n        encodeURIComponent(\n          this.namespaceInputName(`enabledForSite[${this.settings.siteId}]`)\n        ) +\n        '=' +\n        (this.settings.enabledForSite ? '1' : '');\n\n      this.$siteLightswitches = $enabledForSiteField\n        .find('.lightswitch')\n        .on('change', this._updateGlobalStatus.bind(this));\n\n      this._getOtherSupportedSites().forEach((s) =>\n        this._createSiteStatusField(s)\n      );\n\n      let serializedStatuses =\n        encodeURIComponent(this.namespaceInputName('enabled')) +\n        `=${originalEnabledValue}`;\n      for (let i = 0; i < this.$siteLightswitches.length; i++) {\n        const $input = this.$siteLightswitches.eq(i).data('lightswitch').$input;\n        serializedStatuses +=\n          '&' + encodeURIComponent($input.attr('name')) + '=' + $input.val();\n      }\n\n      this.$container.data(\n        'initialSerializedValue',\n        this.$container\n          .data('initialSerializedValue')\n          .replace(originalSerializedStatus, serializedStatuses)\n      );\n\n      if (this.lastSerializedValue) {\n        this.lastSerializedValue = this.lastSerializedValue.replace(\n          originalSerializedStatus,\n          serializedStatuses\n        );\n      }\n\n      // Are there additional sites that can be added?\n      if (\n        this.settings.additionalSites &&\n        this.settings.additionalSites.length &&\n        this.isFullPage\n      ) {\n        this._createAddlSiteField();\n      }\n\n      // Focus on first lightswitch\n      this.$globalLightswitch.focus();\n\n      this.$globalLightswitch.on('change', this._updateSiteStatuses.bind(this));\n      this._updateGlobalStatus();\n    },\n\n    /**\n     * @returns {Array}\n     */\n    _getOtherSupportedSites: function () {\n      return Craft.sites.filter(\n        (s) => s.id != this.settings.siteId && this.siteIds.includes(s.id)\n      );\n    },\n\n    _showField: function ($field) {\n      const height = $field.height();\n      $field\n        .css({\n          overflow: 'hidden',\n          'min-height': 'auto',\n        })\n        .height(0)\n        .velocity({height}, 'fast', () => {\n          $field.css({\n            overflow: '',\n            height: '',\n            'min-height': '',\n          });\n        });\n    },\n\n    _removeField: function ($field) {\n      $field\n        .css({\n          overflow: 'hidden',\n          'min-height': 'auto',\n        })\n        .velocity({height: 0}, 'fast', () => {\n          $field.remove();\n        });\n    },\n\n    _updateGlobalStatus: function () {\n      let allEnabled = true,\n        allDisabled = true;\n      this.$siteLightswitches.each(function () {\n        const enabled = $(this).data('lightswitch').on;\n        if (enabled) {\n          allDisabled = false;\n        } else {\n          allEnabled = false;\n        }\n        if (!allEnabled && !allDisabled) {\n          return false;\n        }\n      });\n      if (allEnabled) {\n        this.$globalLightswitch.data('lightswitch').turnOn(true);\n      } else if (allDisabled) {\n        this.$globalLightswitch.data('lightswitch').turnOff(true);\n      } else {\n        this.$globalLightswitch.data('lightswitch').turnIndeterminate(true);\n      }\n    },\n\n    _updateSiteStatuses: function () {\n      const enabled = this.$globalLightswitch.data('lightswitch').on;\n      this.$siteLightswitches.each(function () {\n        if (enabled) {\n          $(this).data('lightswitch').turnOn(true);\n        } else {\n          $(this).data('lightswitch').turnOff(true);\n        }\n      });\n    },\n\n    _createSiteStatusField: function (site, status) {\n      const $field = Craft.ui.createLightswitchField({\n        fieldClass: `enabled-for-site-${site.id}-field`,\n        label: site.name,\n        name: this.namespaceInputName(`enabledForSite[${site.id}]`),\n        on:\n          typeof status != 'undefined'\n            ? status\n            : this.settings.siteStatuses.hasOwnProperty(site.id)\n            ? this.settings.siteStatuses[site.id]\n            : true,\n        disabled: !!this.settings.revisionId,\n      });\n\n      if (this.$additionalSiteField) {\n        $field.insertBefore(this.$additionalSiteField);\n      } else {\n        $field.appendTo(this.$siteStatusPane);\n      }\n\n      if (!this.settings.revisionId) {\n        $field.addClass('nested');\n        const $lightswitch = $field\n          .find('.lightswitch')\n          .on('change', this._updateGlobalStatus.bind(this));\n        this.$siteLightswitches = this.$siteLightswitches.add($lightswitch);\n      }\n\n      this._showField($field);\n\n      return $field;\n    },\n\n    _createAddlSiteField: function () {\n      const additionalSites = Craft.sites.filter((site) => {\n        return (\n          !this.siteIds.includes(site.id) &&\n          this.settings.additionalSites.some((s) => s.siteId == site.id)\n        );\n      });\n\n      if (!additionalSites.length) {\n        return;\n      }\n\n      const selectLabelId = 'add-site-label';\n\n      const $addlSiteSelectLabel = $('<span/>', {\n        text: Craft.t('app', 'Add a site...'),\n        class: 'visually-hidden',\n        id: selectLabelId,\n      });\n\n      const $addlSiteSelectContainer = Craft.ui\n        .createSelect({\n          options: [\n            {label: Craft.t('app', 'Add a site…')},\n            ...additionalSites.map((s) => {\n              return {label: s.name, value: s.id};\n            }),\n          ],\n          labelledBy: selectLabelId,\n        })\n        .addClass('fullwidth');\n\n      this.$additionalSiteField = Craft.ui\n        .createField($addlSiteSelectContainer, {})\n        .addClass('nested add')\n        .appendTo(this.$siteStatusPane);\n\n      $addlSiteSelectLabel.prependTo(this.$additionalSiteField);\n\n      const $addlSiteSelect = $addlSiteSelectContainer.find('select');\n\n      $addlSiteSelect.on('change', () => {\n        const siteId = parseInt($addlSiteSelect.val());\n        const site = Craft.sites.find((s) => s.id === siteId);\n\n        if (!site) {\n          return;\n        }\n\n        const addlSiteInfo = this.settings.additionalSites.find(\n          (s) => s.siteId == site.id\n        );\n        this._createSiteStatusField(site, addlSiteInfo.enabledByDefault);\n        this._updateGlobalStatus();\n\n        $addlSiteSelect.val('').find(`option[value=\"${siteId}\"]`).remove();\n\n        if (this.newSiteIds === null) {\n          this.newSiteIds = [];\n        }\n\n        this.siteIds.push(siteId);\n        this.newSiteIds.push(siteId);\n\n        // Was that the last site?\n        if ($addlSiteSelect.find('option').length === 1) {\n          this._removeField(this.$additionalSiteField);\n        }\n      });\n\n      this._showField(this.$additionalSiteField);\n    },\n\n    showStatusHud: function (target) {\n      let bodyHtml;\n\n      if (!this.failed) {\n        bodyHtml = `<p>${this._saveSuccessMessage()}</p>`;\n      } else {\n        bodyHtml = `<p class=\"error\"><strong>${this._saveFailMessage()}</strong></p>`;\n\n        if (this.httpError) {\n          bodyHtml += `<p class=\"http-error code\">${Craft.escapeHtml(\n            this.httpError\n          )}</p>`;\n        }\n\n        if (this.httpStatus === 400) {\n          bodyHtml += `<button class=\"btn refresh-btn\">${Craft.t(\n            'app',\n            'Refresh'\n          )}</button>`;\n        }\n      }\n\n      const hud = new Garnish.HUD(target, bodyHtml, {\n        hudClass: 'hud revision-status-hud',\n        onHide: function () {\n          hud.destroy();\n        },\n      });\n\n      hud.$mainContainer.find('.refresh-btn').on('click', () => {\n        window.location.reload();\n      });\n    },\n\n    /**\n     * @returns {string}\n     */\n    _saveSuccessMessage: function () {\n      return this.settings.isProvisionalDraft ||\n        this.settings.isUnpublishedDraft\n        ? Craft.t('app', 'Your changes have been stored.')\n        : Craft.t('app', 'The draft has been saved.');\n    },\n\n    /**\n     * @returns {string}\n     */\n    _saveFailMessage: function () {\n      return this.settings.isProvisionalDraft ||\n        this.settings.isUnpublishedDraft\n        ? Craft.t('app', 'Your changes could not be stored.')\n        : Craft.t('app', 'The draft could not be saved.');\n    },\n\n    spinners: function () {\n      return this.preview\n        ? this.$spinner.add(this.preview.$spinner)\n        : this.$spinner;\n    },\n\n    showSpinner: function () {\n      this.spinners().removeClass('hidden');\n    },\n\n    hideSpinner: function () {\n      this.spinners().addClass('hidden');\n    },\n\n    statusIcons: function () {\n      return this.preview\n        ? this.$statusIcon.add(this.preview.$statusIcon)\n        : this.$statusIcon;\n    },\n\n    statusMessage: function () {\n      return this.preview\n        ? this.$statusMessage.add(this.preview.$statusMessage)\n        : this.$statusMessage;\n    },\n\n    createEditMetaBtn: function () {\n      const $btnGroup = this.$container.find('.context-btngroup');\n      this.$editMetaBtn = $('<button/>', {\n        type: 'button',\n        class: 'btn edit icon',\n        'aria-expanded': 'false',\n        'aria-label': Craft.t('app', 'Edit draft settings'),\n        title: Craft.t('app', 'Edit draft settings'),\n      }).appendTo($btnGroup);\n      $btnGroup.find('.btngroup-btn-last').removeClass('btngroup-btn-last');\n      this.addListener(this.$editMetaBtn, 'click', 'showMetaHud');\n    },\n\n    createPreviewLink: function (target, label) {\n      const $a = $('<a/>', {\n        href: this.getTokenizedPreviewUrl(target.url, null, false),\n        text: label || Craft.t('app', 'View'),\n        target: '_blank',\n        data: {\n          targetUrl: target.url,\n          targetLabel: target.label,\n        },\n      });\n\n      this.addListener($a, 'click', () => {\n        setTimeout(() => {\n          this.activatePreviewToken();\n        }, 1);\n      });\n\n      this.previewLinks.push($a);\n      return $a;\n    },\n\n    updatePreviewLinks: function () {\n      this.previewLinks.forEach(($a) => {\n        this.updatePreviewLinkHref($a);\n        if (this.activatedPreviewToken) {\n          this.removeListener($a, 'click');\n        }\n      });\n    },\n\n    updatePreviewLinkHref: function ($a) {\n      $a.attr(\n        'href',\n        this.getTokenizedPreviewUrl($a.data('targetUrl'), null, false)\n      );\n    },\n\n    activatePreviewToken: function () {\n      if (this.settings.isLive) {\n        // don't do anything yet, but leave the event in case we need it later\n        return;\n      }\n\n      this.activatedPreviewToken = true;\n      this.updatePreviewLinks();\n    },\n\n    createShareMenu: function ($container) {\n      const $btn = $('<button/>', {\n        type: 'button',\n        class: 'view-btn btn menubtn',\n        text: Craft.t('app', 'View'),\n      }).appendTo($container);\n\n      const $menu = $('<div/>', {class: 'menu'}).appendTo($container);\n      const $ul = $('<ul/>').appendTo($menu);\n\n      this.settings.previewTargets.forEach((target) => {\n        $('<li/>')\n          .append(this.createPreviewLink(target, target.label))\n          .appendTo($ul);\n      });\n\n      new Garnish.MenuBtn($btn);\n    },\n\n    getPreviewTokenParams: function () {\n      const params = {\n        elementType: this.settings.elementType,\n        canonicalId: this.settings.canonicalId,\n        siteId: this.settings.siteId,\n        revisionId: this.settings.revisionId,\n        previewToken: this.settings.previewToken,\n      };\n\n      if (this.settings.draftId && !this.settings.isProvisionalDraft) {\n        params.draftId = this.settings.draftId;\n      }\n\n      return params;\n    },\n\n    getPreviewToken: function () {\n      return this.previewTokenQueue.push(() => {\n        return new Promise((resolve, reject) => {\n          if (this.activatedPreviewToken) {\n            resolve(this.settings.previewToken);\n            return;\n          }\n\n          Craft.sendActionRequest('POST', 'preview/create-token', {\n            data: this.getPreviewTokenParams(),\n          })\n            .then(() => {\n              this.activatePreviewToken();\n              resolve(this.settings.previewToken);\n            })\n            .catch(reject);\n        });\n      });\n    },\n\n    /**\n     * @param {string} url\n     * @param {?string} [randoParam]\n     * @param {boolean} [asPromise=false]\n     * @returns {(Promise|string)}\n     */\n    getTokenizedPreviewUrl: function (url, randoParam, asPromise) {\n      if (typeof asPromise === 'undefined') {\n        asPromise = true;\n      }\n\n      const params = {};\n\n      if (randoParam || !this.settings.isLive) {\n        // Randomize the URL so CDNs don't return cached pages\n        params[randoParam || 'x-craft-preview'] = Craft.randomString(10);\n      }\n\n      if (this.settings.siteToken) {\n        params[Craft.siteToken] = this.settings.siteToken;\n      }\n\n      // No need for a token if we're looking at a live element\n      if (this.settings.isLive) {\n        const previewUrl = Craft.getUrl(url, params);\n\n        if (asPromise) {\n          return new Promise((resolve) => {\n            resolve(previewUrl);\n          });\n        }\n\n        return previewUrl;\n      }\n\n      if (!this.settings.previewToken) {\n        throw 'Missing preview token';\n      }\n\n      params[Craft.tokenParam] = this.settings.previewToken;\n      const previewUrl = Craft.getUrl(url, params);\n\n      if (this.activatedPreviewToken) {\n        if (asPromise) {\n          return new Promise((resolve) => {\n            resolve(previewUrl);\n          });\n        }\n\n        return previewUrl;\n      }\n\n      if (asPromise) {\n        return new Promise((resolve, reject) => {\n          this.getPreviewToken()\n            .then(() => {\n              resolve(previewUrl);\n            })\n            .catch(reject);\n        });\n      }\n\n      const createTokenParams = this.getPreviewTokenParams();\n      createTokenParams.redirect = previewUrl;\n      return Craft.getActionUrl('preview/create-token', createTokenParams);\n    },\n\n    getPreview: function () {\n      if (!this.preview) {\n        this.preview = new Craft.Preview(this);\n        if (!this.enableAutosave) {\n          this.preview.on('open', () => {\n            this.enableAutosave = true;\n            this.listenForChanges();\n          });\n          this.preview.on('close', () => {\n            this.enableAutosave = false;\n            this.stopListeningForChanges();\n\n            // Hide the status icon if the save was successful\n            const $statusIcons = this.statusIcons();\n            if ($statusIcons.hasClass('checkmark-icon')) {\n              $statusIcons.addClass('hidden');\n            }\n          });\n        }\n        this.preview.on('close', () => {\n          if (this.scrollY) {\n            window.scrollTo(0, this.scrollY);\n            this.scrollY = null;\n          }\n        });\n      }\n      return this.preview;\n    },\n\n    openPreview: function () {\n      if (Garnish.hasAttr(this.$previewBtn, 'aria-disabled')) {\n        return;\n      }\n\n      this.$previewBtn.attr('aria-disabled', true);\n      this.$previewBtn.addClass('loading');\n\n      this.queue.push(\n        () =>\n          new Promise((resolve, reject) => {\n            this.openingPreview = true;\n            this.ensureIsDraftOrRevision(true)\n              .then(() => {\n                this.scrollY = window.scrollY;\n                this.$previewBtn.removeAttr('aria-disabled');\n                this.$previewBtn.removeClass('loading');\n                this.getPreview().open();\n                this.openingPreview = false;\n                resolve();\n              })\n              .catch(reject);\n          })\n      );\n    },\n\n    ensureIsDraftOrRevision: function (onlyIfChanged) {\n      return new Promise((resolve, reject) => {\n        if (!this.settings.draftId && !this.settings.revisionId) {\n          if (\n            onlyIfChanged &&\n            this.serializeForm(true) ===\n              this.$container.data('initialSerializedValue')\n          ) {\n            resolve();\n            return;\n          }\n\n          this.createDraft().then(resolve).catch(reject);\n        } else {\n          resolve();\n        }\n      });\n    },\n\n    serializeForm: function (removeActionParams) {\n      let data = this.$container.serialize();\n\n      if (this.isPreviewActive()) {\n        // Replace the temp input with the preview form data\n        data = data.replace(\n          '__PREVIEW_FIELDS__=1',\n          this.preview.$editor.serialize()\n        );\n      }\n\n      if (removeActionParams && !this.settings.isUnpublishedDraft) {\n        // Remove action and redirect params\n        const actionName = this.namespaceInputName('action');\n        const redirectName = this.namespaceInputName('redirect');\n        data = data.replace(\n          new RegExp(`&${Craft.escapeRegex(actionName)}=[^&]*`),\n          ''\n        );\n        data = data.replace(\n          new RegExp(`&${Craft.escapeRegex(redirectName)}=[^&]*`),\n          ''\n        );\n      }\n\n      return data;\n    },\n\n    /**\n     * @param {boolean} [force=false]\n     * @returns {Promise}\n     */\n    checkForm: function (force) {\n      return this.queue.push(\n        () =>\n          new Promise((resolve, reject) => {\n            // If this isn't a draft and there's no active preview, then there's nothing to check\n            if (\n              this.settings.revisionId ||\n              this.pauseLevel > 0 ||\n              !this.enableAutosave ||\n              !this.settings.canCreateDrafts\n            ) {\n              resolve();\n              return;\n            }\n\n            clearTimeout(this.timeout);\n            this.timeout = null;\n\n            // If we haven't had a chance to fetch the initial data yet, try again in a bit\n            if (\n              typeof this.$container.data('initialSerializedValue') ===\n              'undefined'\n            ) {\n              this.timeout = setTimeout(this.checkForm.bind(this), 500);\n              return;\n            }\n\n            // Has anything changed?\n            const data = this.serializeForm(true);\n            if (\n              !force &&\n              data ===\n                (this.lastSerializedValue ||\n                  this.$container.data('initialSerializedValue'))\n            ) {\n              resolve();\n              return;\n            }\n\n            this.saveDraft(data)\n              .then(resolve)\n              .catch((e) => {\n                console.warn('Couldn’t save draft:', e);\n                reject(e);\n              });\n          })\n      );\n    },\n\n    isPreviewActive: function () {\n      return this.preview && this.preview.isActive;\n    },\n\n    createDraft: function () {\n      return this.queue.push(\n        () =>\n          new Promise((resolve, reject) => {\n            this.saveDraft(this.serializeForm(true))\n              .then(resolve)\n              .catch(reject);\n          })\n      );\n    },\n\n    /**\n     * @param {Object} data\n     * @returns {Promise}\n     */\n    saveDraft: function (data) {\n      return new Promise((resolve, reject) => {\n        // Ignore if we're already submitting the main form\n        if (this.submittingForm) {\n          reject('Form already being submitted.');\n          return;\n        }\n\n        this.lastSerializedValue = data;\n        this.failed = false;\n        this.httpStatus = null;\n        this.httpError = null;\n        this.cancelToken = axios.CancelToken.source();\n\n        this.statusIcons()\n          .velocity('stop')\n          .css('opacity', '')\n          .removeClass('hidden invisible checkmark-icon alert-icon fade-out')\n          .addClass('hidden');\n\n        // Clear previous status message\n        this.statusMessage().empty();\n\n        if (this.$saveMetaBtn) {\n          this.$saveMetaBtn.addClass('active');\n        }\n\n        // Prep the data to be saved, keeping track of the first input name for each delta group\n        let modifiedFieldNames = [];\n        let preparedData = this.prepareData(\n          data,\n          !this.settings.isUnpublishedDraft\n            ? (deltaName, params) => {\n                if (params.length) {\n                  modifiedFieldNames.push(\n                    decodeURIComponent(params[0].split('=')[0])\n                  );\n                }\n              }\n            : null\n        );\n\n        const extraData = {\n          [this.namespaceInputName('visibleLayoutElements')]:\n            this.settings.visibleLayoutElements,\n        };\n\n        // Are we saving a provisional draft?\n        if (this.settings.isProvisionalDraft || !this.settings.draftId) {\n          extraData[this.namespaceInputName('provisional')] = 1;\n        }\n\n        const selectedTabId = this.$contentContainer\n          .children('[data-layout-tab]:not(.hidden)')\n          .data('id');\n        if (selectedTabId) {\n          extraData[this.namespaceInputName('selectedTab')] = selectedTabId;\n        }\n\n        preparedData += `&${$.param(extraData)}`;\n\n        Craft.sendActionRequest('POST', 'elements/save-draft', {\n          cancelToken: this.cancelToken.token,\n          headers: this._saveHeaders,\n          data: preparedData,\n        })\n          .then((response) => {\n            this._afterSaveDraft();\n\n            const createdProvisionalDraft = !this.settings.draftId;\n\n            if (createdProvisionalDraft) {\n              this.settings.isProvisionalDraft = true;\n              this.$revisionLabel.append(\n                $('<span/>', {\n                  text: ` — ${Craft.t('app', 'Edited')}`,\n                })\n              );\n            }\n\n            if (this.isFullPage) {\n              if (response.data.title) {\n                this.$container.find('.screen-title').text(response.data.title);\n              }\n\n              if (response.data.docTitle) {\n                document.title = response.data.docTitle;\n              }\n            }\n\n            if (!this.settings.isProvisionalDraft) {\n              this.$revisionLabel.text(response.data.draftName);\n              this.settings.draftName = response.data.draftName;\n            }\n\n            let revisionMenu = this.$revisionBtn.data('menubtn')\n              ? this.$revisionBtn.data('menubtn').menu\n              : null;\n\n            // Did we just add a site?\n            if (this.newSiteIds) {\n              // Do we need to create the revision menu?\n              if (!revisionMenu) {\n                this.$revisionBtn.removeClass('disabled').addClass('menubtn');\n                new Garnish.MenuBtn(this.$revisionBtn);\n                revisionMenu = this.$revisionBtn.data('menubtn').menu;\n                revisionMenu.$container.removeClass('hidden');\n              }\n              this.newSiteIds.forEach((siteId) => {\n                const $option = revisionMenu.$options.filter(\n                  `[data-site-id=${siteId}]`\n                );\n                const siteSettings = this.settings.additionalSites.find(\n                  (s) => s.siteId == siteId\n                );\n                if (\n                  !siteSettings ||\n                  typeof siteSettings.enabledByDefault === 'undefined' ||\n                  siteSettings.enabledByDefault\n                ) {\n                  $option\n                    .find('.status')\n                    .removeClass('disabled')\n                    .addClass('enabled');\n                }\n                const $li = $option.parent().removeClass('hidden');\n                $li.closest('.site-group').removeClass('hidden');\n              });\n              revisionMenu.$container\n                .find('.revision-hr')\n                .removeClass('hidden');\n              this.newSiteIds = null;\n            }\n\n            if (this.settings.isProvisionalDraft) {\n              if (createdProvisionalDraft) {\n                // Replace the action\n                this.$container\n                  .find('input.action-input')\n                  .attr('value', 'elements/apply-draft');\n\n                // Update the editor settings\n                this.settings.draftId = response.data.draftId;\n                this.settings.isLive = false;\n                this.previewToken = null;\n\n                this.initForProvisionalDraft();\n              }\n            } else if (revisionMenu) {\n              revisionMenu.$options\n                .filter('.sel')\n                .find('.draft-name')\n                .text(response.data.draftName);\n              revisionMenu.$options\n                .filter('.sel')\n                .find('.draft-meta')\n                .text(\n                  response.data.creator\n                    ? Craft.t('app', 'Saved {timestamp} by {creator}', {\n                        timestamp: response.data.timestamp,\n                        creator: response.data.creator,\n                      })\n                    : Craft.t('app', 'Saved {timestamp}', {\n                        timestamp: response.data.timestamp,\n                      })\n                );\n            }\n\n            // Did the controller send us updated preview targets?\n            if (\n              response.data.previewTargets &&\n              JSON.stringify(response.data.previewTargets) !==\n                JSON.stringify(this.settings.previewTargets)\n            ) {\n              this.updatePreviewTargets(response.data.previewTargets);\n            }\n\n            if (createdProvisionalDraft) {\n              this.updatePreviewLinks();\n              this.trigger('createProvisionalDraft');\n            }\n\n            if (this.$nameTextInput) {\n              this.checkMetaValues();\n            }\n\n            for (const oldId in response.data.duplicatedElements) {\n              if (\n                oldId != this.settings.canonicalId &&\n                response.data.duplicatedElements.hasOwnProperty(oldId)\n              ) {\n                this.duplicatedElements[oldId] =\n                  response.data.duplicatedElements[oldId];\n              }\n            }\n\n            // Add missing field modified indicators\n            const selectors = response.data.modifiedAttributes\n              .map((attr) => {\n                attr = this.namespaceInputName(attr);\n                return `[name=\"${attr}\"],[name^=\"${attr}[\"]`;\n              })\n              .concat(modifiedFieldNames.map((name) => `[name=\"${name}\"]`));\n\n            const $fields = $(selectors.join(','))\n              .parents()\n              .filter('.field:not(:has(> .status-badge))');\n            for (let i = 0; i < $fields.length; i++) {\n              $fields.eq(i).prepend(\n                $('<div/>', {\n                  class: 'status-badge modified',\n                  title: Craft.t('app', 'This field has been modified.'),\n                }).append(\n                  $('<span/>', {\n                    class: 'visually-hidden',\n                    html: Craft.t('app', 'This field has been modified.'),\n                  })\n                )\n              );\n            }\n\n            // Keep track of whether anything changed while we were waiting.\n            // If not, we can safely update lastSerializedValue after swapping out the fields\n            const noChanges = this.serializeForm(true) === data;\n\n            // Update the visible elements\n            let $allTabContainers = $();\n            const visibleLayoutElements = {};\n            let changedElements = false;\n\n            for (let i = 0; i < response.data.missingElements.length; i++) {\n              const tabInfo = response.data.missingElements[i];\n              let $tabContainer = this.$contentContainer.children(\n                `[data-layout-tab=\"${tabInfo.uid}\"]`\n              );\n\n              if (!$tabContainer.length) {\n                $tabContainer = $('<div/>', {\n                  id: this.namespaceId(tabInfo.id),\n                  class: 'flex-fields',\n                  'data-id': tabInfo.id,\n                  'data-layout-tab': tabInfo.uid,\n                });\n                if (tabInfo.id !== selectedTabId) {\n                  $tabContainer.addClass('hidden');\n                }\n                $tabContainer.appendTo(this.$contentContainer);\n              }\n\n              $allTabContainers = $allTabContainers.add($tabContainer);\n\n              for (let j = 0; j < tabInfo.elements.length; j++) {\n                const elementInfo = tabInfo.elements[j];\n\n                if (elementInfo.html !== false) {\n                  if (!visibleLayoutElements[tabInfo.uid]) {\n                    visibleLayoutElements[tabInfo.uid] = [];\n                  }\n                  visibleLayoutElements[tabInfo.uid].push(elementInfo.uid);\n\n                  if (typeof elementInfo.html === 'string') {\n                    const $oldElement = $tabContainer.children(\n                      `[data-layout-element=\"${elementInfo.uid}\"]`\n                    );\n                    const $newElement = $(elementInfo.html);\n                    if ($oldElement.length) {\n                      $oldElement.replaceWith($newElement);\n                    } else {\n                      $newElement.appendTo($tabContainer);\n                    }\n                    Craft.initUiElements($newElement);\n                    changedElements = true;\n                  }\n                } else {\n                  const $oldElement = $tabContainer.children(\n                    `[data-layout-element=\"${elementInfo.uid}\"]`\n                  );\n                  if (\n                    !$oldElement.length ||\n                    !Garnish.hasAttr(\n                      $oldElement,\n                      'data-layout-element-placeholder'\n                    )\n                  ) {\n                    const $placeholder = $('<div/>', {\n                      class: 'hidden',\n                      'data-layout-element': elementInfo.uid,\n                      'data-layout-element-placeholder': '',\n                    });\n\n                    if ($oldElement.length) {\n                      $oldElement.replaceWith($placeholder);\n                    } else {\n                      $placeholder.appendTo($tabContainer);\n                    }\n\n                    changedElements = true;\n                  }\n                }\n              }\n            }\n\n            // Remove any unused tab content containers\n            // (`[data-layout-tab=\"\"]` == unconditional containers, so ignore those)\n            const $unusedTabContainers = this.$contentContainer\n              .children('[data-layout-tab]')\n              .not($allTabContainers)\n              .not('[data-layout-tab=\"\"]');\n            if ($unusedTabContainers.length) {\n              $unusedTabContainers.remove();\n              changedElements = true;\n            }\n\n            // Make the first tab visible if no others are\n            if (!$allTabContainers.filter(':not(.hidden)').length) {\n              $allTabContainers.first().removeClass('hidden');\n            }\n\n            this.settings.visibleLayoutElements = visibleLayoutElements;\n\n            // Update the tabs\n            if (this.isFullPage) {\n              Craft.cp.updateTabs(response.data.tabs);\n            } else {\n              this.slideout.updateTabs(response.data.tabs);\n            }\n\n            Craft.appendHeadHtml(response.data.headHtml);\n            Craft.appendBodyHtml(response.data.bodyHtml);\n\n            // Did any layout elements get added or removed?\n            if (changedElements) {\n              if (response.data.initialDeltaValues) {\n                Object.assign(\n                  this.$container.data('initial-delta-values'),\n                  response.data.initialDeltaValues\n                );\n              }\n\n              if (noChanges) {\n                // Update our record of the last serialized value to avoid a pointless resave\n                this.lastSerializedValue = this.serializeForm(true);\n              }\n            }\n\n            // re-grab dismissible tips, re-attach listener, hide on re-load\n            this.handleDismissibleTips();\n\n            this.afterUpdate(data);\n\n            if (Craft.broadcaster) {\n              Craft.broadcaster.postMessage({\n                pageId: Craft.pageId,\n                event: 'saveDraft',\n                canonicalId: this.settings.canonicalId,\n                draftId: this.settings.draftId,\n                isProvisionalDraft: this.settings.isProvisionalDraft,\n              });\n            }\n\n            resolve();\n          })\n          .catch((e) => {\n            this._afterSaveDraft();\n\n            if (!this.ignoreFailedRequest) {\n              this.failed = true;\n              if (e && e.response) {\n                this.httpStatus = e.response.status;\n                this.httpError = e.response.data\n                  ? e.response.data.message\n                  : null;\n              }\n              this._showFailStatus();\n              reject(e);\n            }\n\n            this.ignoreFailedRequest = false;\n          });\n      });\n    },\n\n    _afterSaveDraft: function () {\n      if (this.$saveMetaBtn) {\n        this.$saveMetaBtn.removeClass('active');\n      }\n    },\n\n    _showFailStatus: function () {\n      this.statusIcons()\n        .velocity('stop')\n        .css('opacity', '')\n        .removeClass('hidden checkmark-icon')\n        .addClass('alert-icon');\n\n      this.setStatusMessage(this._saveFailMessage());\n    },\n\n    /**\n     * @param {string} data\n     * @param {findDeltaDataCallback} [deltaCallback] Callback function that should be passed to `Craft.findDeltaData()`\n     * @returns {string}\n     */\n    prepareData: function (data, deltaCallback) {\n      // Filter out anything that hasn't changed since the last time the form was submitted\n      data = Craft.findDeltaData(\n        this.$container.data('initialSerializedValue'),\n        data,\n        this.$container.data('delta-names'),\n        deltaCallback,\n        this.$container.data('initial-delta-values'),\n        this.$container.data('modified-delta-names')\n      );\n\n      // Swap out element IDs with their duplicated ones\n      data = this.swapDuplicatedElementIds(data);\n\n      const extraData = {};\n\n      // Add the draft info\n      if (this.settings.draftId) {\n        extraData[this.namespaceInputName('draftId')] = this.settings.draftId;\n\n        if (this.settings.isProvisionalDraft) {\n          extraData[this.namespaceInputName('provisional')] = 1;\n        }\n      }\n\n      if (this.settings.draftName !== null) {\n        extraData[this.namespaceInputName('draftName')] =\n          this.settings.draftName;\n      }\n\n      if (!$.isEmptyObject(extraData)) {\n        data += `&${$.param(extraData)}`;\n      }\n\n      return data;\n    },\n\n    get _saveHeaders() {\n      const headers = {\n        'content-type': 'application/x-www-form-urlencoded',\n      };\n\n      if (this.namespace) {\n        headers['X-Craft-Namespace'] = this.namespace;\n      }\n\n      return headers;\n    },\n\n    /**\n     * @param {string} data\n     * @returns {string}\n     */\n    swapDuplicatedElementIds: function (data) {\n      const idsRE = Object.keys(this.duplicatedElements).join('|');\n      if (idsRE === '') {\n        return data;\n      }\n      const lb = encodeURIComponent('[');\n      const rb = encodeURIComponent(']');\n      let namespacedFields = this.namespaceInputName('fields');\n\n      if (this.isFullPage) {\n        namespacedFields = Craft.escapeRegex(namespacedFields);\n      } else {\n        // don't escape namespaced input names, but URI encode them (for cases like: cnuvbcxlgq[fields])\n        namespacedFields = encodeURIComponent(namespacedFields);\n      }\n\n      // Keep replacing field IDs until data stops changing\n      while (true) {\n        if (\n          data ===\n          (data = data\n            // &fields[...][X]\n            .replace(\n              new RegExp(\n                `(&${namespacedFields}${lb}[^=]+${rb}${lb})(${idsRE})(${rb})`,\n                'g'\n              ),\n              (m, pre, id, post) => {\n                if (!this._filterFieldInputName(pre)) {\n                  return m;\n                }\n                return pre + this.duplicatedElements[id] + post;\n              }\n            )\n            // &fields[...=X\n            .replace(\n              new RegExp(`&(${namespacedFields}${lb}[^=]+)=(${idsRE})\\\\b`, 'g'),\n              (m, name, id) => {\n                // Ignore param names that end in `[enabled]`, `[type]`, etc.\n                // (`[sortOrder]` should pass here, which could be set to a specific order index, but *not* `[sortOrder][]`!)\n                if (\n                  !this._filterFieldInputName(name) ||\n                  name.match(\n                    new RegExp(`${lb}(enabled|sortOrder|type|typeId)${rb}$`)\n                  )\n                ) {\n                  return m;\n                }\n                return `&${name}=${this.duplicatedElements[id]}`;\n              }\n            ))\n        ) {\n          break;\n        }\n      }\n      return data;\n    },\n\n    _filterFieldInputName: function (name) {\n      // Find the last referenced field handle\n      const lb = encodeURIComponent('[');\n      const rb = encodeURIComponent(']');\n      const nestedNames = name.match(\n        new RegExp(`(\\\\bfields|${lb}fields${rb})${lb}.+?${rb}`, 'g')\n      );\n      if (!nestedNames) {\n        throw `Unexpected input name: ${name}`;\n      }\n      const lastHandle = nestedNames[nestedNames.length - 1].match(\n        new RegExp(`(?:\\\\bfields|${lb}fields${rb})${lb}(.+?)${rb}`)\n      )[1];\n      return Craft.fieldsWithoutContent.includes(lastHandle);\n    },\n\n    updatePreviewTargets: function (previewTargets) {\n      previewTargets.forEach((newTarget) => {\n        const currentTarget = this.settings.previewTargets.find(\n          (t) => t.label === newTarget.label\n        );\n        if (currentTarget) {\n          currentTarget.url = newTarget.url;\n        }\n\n        const $previewLink = this.previewLinks.find(\n          ($a) => $a.data('targetLabel') === newTarget.label\n        );\n        if ($previewLink) {\n          $previewLink.data('targetUrl', newTarget.url);\n          this.updatePreviewLinkHref($previewLink);\n        }\n      });\n    },\n\n    afterUpdate: function (data) {\n      this.$container.data('initialSerializedValue', data);\n      this.$container.data('initial-delta-values', {});\n\n      const $statusIcons = this.statusIcons()\n        .velocity('stop')\n        .css('opacity', '')\n        .removeClass('hidden')\n        .addClass('checkmark-icon');\n\n      this.setStatusMessage(this._saveSuccessMessage());\n\n      if (!Craft.autosaveDrafts) {\n        // Fade the icon out after a couple seconds, since it won't be accurate as content continues to change\n        $statusIcons.velocity('stop').velocity(\n          {\n            opacity: 0,\n          },\n          {\n            delay: 2000,\n            complete: () => {\n              $statusIcons.addClass('hidden');\n            },\n          }\n        );\n      }\n\n      this.trigger('update');\n    },\n\n    setStatusMessage: function (message) {\n      this.statusIcons().attr('title', message);\n      this.statusMessage()\n        .empty()\n        .append(\n          $('<span/>', {\n            class: 'visually-hidden',\n            text: message,\n          })\n        );\n    },\n\n    showMetaHud: function () {\n      if (!this.metaHud) {\n        this.createMetaHud();\n        this.onMetaHudShow();\n      } else {\n        this.metaHud.show();\n      }\n\n      if (!Garnish.isMobileBrowser(true)) {\n        this.$nameTextInput.trigger('focus');\n      }\n    },\n\n    createMetaHud: function () {\n      const $hudBody = $('<div/>');\n\n      // Add the Name field\n      const $nameField = $(\n        '<div class=\"field\"><div class=\"heading\"><label for=\"draft-name\">' +\n          Craft.t('app', 'Draft Name') +\n          '</label></div></div>'\n      ).appendTo($hudBody);\n      const $nameInputContainer = $('<div class=\"input\"/>').appendTo(\n        $nameField\n      );\n      this.$nameTextInput = $(\n        '<input type=\"text\" class=\"text fullwidth\" id=\"draft-name\"/>'\n      )\n        .appendTo($nameInputContainer)\n        .val(this.settings.draftName);\n\n      // HUD footer\n      const $footer = $('<div class=\"hud-footer flex flex-center\"/>').appendTo(\n        $hudBody\n      );\n\n      $('<div class=\"flex-grow\"></div>').appendTo($footer);\n      this.$saveMetaBtn = $('<button/>', {\n        type: 'submit',\n        class: 'btn submit disabled',\n        'aria-disabled': 'true',\n        text: Craft.t('app', 'Save'),\n      }).appendTo($footer);\n\n      this.metaHud = new Garnish.HUD(this.$editMetaBtn, $hudBody, {\n        onSubmit: this.saveMeta.bind(this),\n      });\n\n      this.addListener(this.$nameTextInput, 'input', 'checkMetaValues');\n\n      this.metaHud.on('show', this.onMetaHudShow.bind(this));\n      this.metaHud.on('hide', this.onMetaHudHide.bind(this));\n      this.metaHud.on('escape', this.onMetaHudEscape.bind(this));\n    },\n\n    onMetaHudShow: function () {\n      this.$editMetaBtn.addClass('active');\n      this.$editMetaBtn.attr('aria-expanded', 'true');\n    },\n\n    onMetaHudHide: function () {\n      this.$editMetaBtn.removeClass('active');\n      this.$editMetaBtn.attr('aria-expanded', 'false');\n\n      if (Garnish.focusIsInside(this.metaHud.$body)) {\n        this.$editMetaBtn.trigger('focus');\n      }\n    },\n\n    onMetaHudEscape: function () {\n      this.$nameTextInput.val(this.settings.draftName);\n    },\n\n    checkMetaValues: function () {\n      if (\n        this.$nameTextInput.val() &&\n        this.$nameTextInput.val() !== this.settings.draftName\n      ) {\n        this.$saveMetaBtn.removeClass('disabled');\n        this.$saveMetaBtn.removeAttr('aria-disabled');\n        return true;\n      }\n\n      this.$saveMetaBtn.addClass('disabled');\n      this.$saveMetaBtn.attr('aria-disabled', 'true');\n      return false;\n    },\n\n    shakeMetaHud: function () {\n      Garnish.shake(this.metaHud.$hud);\n    },\n\n    saveMeta: function () {\n      return new Promise((resolve, reject) => {\n        if (!this.checkMetaValues()) {\n          this.shakeMetaHud();\n          reject();\n          return;\n        }\n\n        this.settings.draftName = this.$nameTextInput.val();\n        this.metaHud.hide();\n        this.checkForm(true).then(resolve).catch(reject);\n      });\n    },\n\n    handleSubmit: function (ev) {\n      ev.preventDefault();\n      ev.stopPropagation();\n\n      // Prevent double form submits\n      if (this.submittingForm) {\n        return;\n      }\n\n      // If this a draft and was this a normal save (either via submit button or save shortcut),\n      // then trigger an autosave\n      if (\n        this.settings.draftId &&\n        !this.settings.isUnpublishedDraft &&\n        !this.settings.isProvisionalDraft &&\n        (typeof ev.autosave === 'undefined' || ev.autosave) &&\n        (ev.saveShortcut ||\n          (ev.customTrigger &&\n            ev.customTrigger.data('action') === 'elements/save-draft')) &&\n        this.enableAutosave\n      ) {\n        this.checkForm(true);\n        return;\n      }\n\n      this.submittingForm = true;\n\n      // Prevent the normal unload confirmation dialog\n      Craft.cp.$confirmUnloadForms = Craft.cp.$confirmUnloadForms.not(\n        this.$container\n      );\n\n      // Abort the current save request if there is one\n      if (this.cancelToken) {\n        this.ignoreFailedRequest = true;\n        this.cancelToken.cancel();\n      }\n\n      this.trigger('beforeSubmit');\n\n      // Duplicate the form with normalized data\n      const data = this.prepareData(this.serializeForm(false));\n\n      if (this.isFullPage) {\n        this.stopListeningForChanges();\n        const $form = Craft.createForm(data);\n        $form.appendTo(Garnish.$bod);\n        $form.submit();\n      } else {\n        this.slideout.showSubmitSpinner();\n        Craft.sendActionRequest('POST', null, {\n          headers: this._saveHeaders,\n          data,\n        })\n          .then((response) => {\n            this.slideout.handleSubmitResponse(response);\n          })\n          .catch((error) => {\n            this.slideout.handleSubmitError(error);\n          })\n          .finally(() => {\n            this.submittingForm = false;\n            this.slideout.hideSubmitSpinner();\n          });\n      }\n    },\n\n    handleDismissibleTips: function () {\n      this.addListener(this.tipDismissBtn, 'click', (e) => {\n        this.hideTip(e);\n      });\n    },\n\n    getHiddenTipsUids: function () {\n      return Craft.getLocalStorage('dismissedTips', []);\n    },\n\n    setHiddenTipsUids: function (uids) {\n      Craft.setLocalStorage('dismissedTips', uids);\n    },\n\n    hideTip: function (ev) {\n      const targetElement = ev.target;\n      if (targetElement) {\n        const $targetParent = $(targetElement).closest('.readable');\n        if ($targetParent.length) {\n          const layoutElementUid = $targetParent.data('layout-element');\n          $targetParent.remove();\n          // add info to local storage\n          if (typeof Storage !== 'undefined') {\n            const hiddenTips = this.getHiddenTipsUids();\n            if (!hiddenTips.includes(layoutElementUid)) {\n              hiddenTips.push(layoutElementUid);\n              this.setHiddenTipsUids(hiddenTips);\n            }\n          }\n        }\n      }\n    },\n  },\n  {\n    defaults: {\n      additionalSites: [],\n      canCreateDrafts: false,\n      canEditMultipleSites: false,\n      canSaveCanonical: false,\n      canonicalId: null,\n      draftId: null,\n      draftName: null,\n      elementType: null,\n      enablePreview: false,\n      enabled: false,\n      enabledForSite: false,\n      hashedCpEditUrl: null,\n      isLive: false,\n      isProvisionalDraft: false,\n      isUnpublishedDraft: false,\n      previewTargets: [],\n      previewToken: null,\n      revisionId: null,\n      siteId: null,\n      siteStatuses: null,\n      siteToken: null,\n      visibleLayoutElements: {},\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element Editor Slideout\n */\nCraft.ElementEditorSlideout = Craft.CpScreenSlideout.extend(\n  {\n    $element: null,\n\n    init: function (element, settings) {\n      this.$element = $(element);\n\n      settings = Object.assign(\n        {},\n        Craft.ElementEditorSlideout.defaults,\n        settings,\n        {\n          showHeader: true,\n        }\n      );\n      this.base('elements/edit', settings);\n\n      this.on('load', () => {\n        const editor = this.$container.data('elementEditor');\n        if (editor) {\n          editor.on('beforeSubmit', () => {\n            Object.keys(this.settings.saveParams).forEach((name) => {\n              $('<input/>', {\n                class: 'hidden',\n                name: editor.namespaceInputName(name),\n                value: this.settings.saveParams[name],\n              }).appendTo(this.$container);\n            });\n          });\n        }\n      });\n\n      this.on('submit', (ev) => {\n        if (Craft.broadcaster) {\n          Craft.broadcaster.postMessage({\n            event: 'saveElement',\n            id: ev.response.data.element.id,\n          });\n        }\n\n        // Pass the response data off to onSaveElement() for backwards compatibility\n        if (this.settings.onSaveElement) {\n          const data = Object.assign(\n            {},\n            ev.response.data,\n            ev.response.data.element\n          );\n          delete data.element;\n          delete data.modelName;\n          delete data.message;\n          this.settings.onSaveElement(data);\n        }\n\n        // Refresh Live Preview\n        Craft.Preview.refresh();\n      });\n    },\n\n    getParams: function () {\n      const params = {};\n\n      if (this.settings.elementType) {\n        params.elementType = this.settings.elementType;\n      }\n\n      if (this.settings.elementId) {\n        params.elementId = this.settings.elementId;\n      } else if (this.$element && this.$element.data('id')) {\n        params.elementId = this.$element.data('id');\n      }\n\n      if (this.settings.draftId) {\n        params.draftId = this.settings.draftId;\n      } else if (this.$element && this.$element.data('draft-id')) {\n        params.draftId = this.$element.data('draft-id');\n      } else if (this.settings.revisionId) {\n        params.revisionId = this.settings.revisionId;\n      } else if (this.$element && this.$element.data('revision-id')) {\n        params.revisionId = this.$element.data('revision-id');\n      }\n\n      if (this.settings.siteId) {\n        params.siteId = this.settings.siteId;\n      } else if (this.$element && this.$element.data('site-id')) {\n        params.siteId = this.$element.data('site-id');\n      }\n\n      if (this.settings.prevalidate) {\n        params.prevalidate = 1;\n      }\n\n      return params;\n    },\n\n    handleSubmit: function (ev) {\n      this.$container.data('elementEditor').handleSubmit(ev);\n    },\n  },\n  {\n    defaults: {\n      elementId: null,\n      draftId: null,\n      revisionId: null,\n      elementType: null,\n      siteId: null,\n      prevalidate: false,\n      saveParams: {},\n      onSaveElement: null,\n      validators: [],\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\nCraft.ElementFieldSettings = Garnish.Base.extend({\n  allowMultipleSources: null,\n  $maintainHierarchyField: null,\n  $maintainHierarchyInput: null,\n  $sourcesField: null,\n  $sourceSelect: null,\n  $branchLimitField: null,\n  $maxRelationsField: null,\n  $minRelationsField: null,\n\n  init: function (\n    allowMultipleSources,\n    maintainHierarchyFieldId,\n    sourcesFieldId,\n    branchLimitFieldId,\n    minRelationsFieldId,\n    maxRelationsFieldId\n  ) {\n    debugger;\n    this.allowMultipleSources = allowMultipleSources;\n    this.$maintainHierarchyField = $(`#${maintainHierarchyFieldId}`);\n    this.$maintainHierarchyInput = this.$maintainHierarchyField.find(\n      'input[type=\"checkbox\"]'\n    );\n    this.$sourcesField = $(`#${sourcesFieldId}`);\n    if (!this.allowMultipleSources) {\n      this.$sourceSelect = this.$sourcesField.find('select');\n    }\n    this.$branchLimitField = $(`#${branchLimitFieldId}`);\n    this.$minRelationsField = $(`#${minRelationsFieldId}`);\n    this.$maxRelationsField = $(`#${maxRelationsFieldId}`);\n\n    this.updateLimitFields();\n    this.addListener(\n      this.$maintainHierarchyInput,\n      'change',\n      'updateLimitFields'\n    );\n\n    if (this.allowMultipleSources) {\n      this.$sourcesField.find('[type=checkbox]').each(\n        function (index, checkbox) {\n          this.addListener(\n            $(checkbox),\n            'change',\n            'updateMaintainHierarchyField'\n          );\n        }.bind(this)\n      );\n    } else {\n      this.addListener(\n        this.$sourceSelect,\n        'change',\n        'updateMaintainHierarchyField'\n      );\n    }\n    this.updateMaintainHierarchyField();\n  },\n\n  updateLimitFields: function () {\n    if (\n      !this.$maintainHierarchyField.hasClass('hidden') &&\n      this.$maintainHierarchyInput.is(':checked')\n    ) {\n      this.$minRelationsField.addClass('hidden');\n      this.$maxRelationsField.addClass('hidden');\n      this.$branchLimitField.removeClass('hidden');\n    } else {\n      this.$branchLimitField.addClass('hidden');\n      this.$minRelationsField.removeClass('hidden');\n      this.$maxRelationsField.removeClass('hidden');\n    }\n  },\n\n  updateMaintainHierarchyField: function () {\n    let showField;\n    if (this.allowMultipleSources) {\n      const $checkedInputs = this.$sourcesField.find(\n        '[type=\"checkbox\"]:checked'\n      );\n      showField =\n        $checkedInputs.length === 1 && $checkedInputs.data('structure-id');\n    } else {\n      showField = this.$sourceSelect\n        .children('option:selected')\n        .data('structure-id');\n    }\n\n    if (showField) {\n      this.$maintainHierarchyField.removeClass('hidden');\n    } else {\n      this.$maintainHierarchyField.addClass('hidden');\n    }\n\n    this.updateLimitFields();\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Base Element Index View\n */\nCraft.ElementThumbLoader = Garnish.Base.extend(\n  {\n    queue: null,\n    workers: [],\n\n    init: function () {\n      this.queue = [];\n\n      for (var i = 0; i < 3; i++) {\n        this.workers.push(new Craft.ElementThumbLoader.Worker(this));\n      }\n    },\n\n    load: function ($elements) {\n      // Only immediately load the visible images\n      let $thumbs = $elements.find('.elementthumb');\n      for (let i = 0; i < $thumbs.length; i++) {\n        let $thumb = $thumbs.eq(i);\n        let $scrollParent = $thumb.scrollParent();\n        if ($scrollParent.prop('nodeName') === 'FIELDSET') {\n          $scrollParent = $scrollParent.scrollParent();\n        }\n        if ($scrollParent[0] === document.body) {\n          $scrollParent = Garnish.$doc;\n        }\n        if (this.isVisible($thumb, $scrollParent)) {\n          this.addToQueue($thumb[0]);\n        } else {\n          let key = 'thumb' + Math.floor(Math.random() * 1000000);\n          Craft.ElementThumbLoader.invisibleThumbs[key] = [\n            this,\n            $thumb,\n            $scrollParent,\n          ];\n          $scrollParent.on(\n            `scroll.${key}`,\n            {\n              $thumb: $thumb,\n              $scrollParent: $scrollParent,\n              key: key,\n            },\n            (ev) => {\n              if (this.isVisible(ev.data.$thumb, ev.data.$scrollParent)) {\n                delete Craft.ElementThumbLoader.invisibleThumbs[ev.data.key];\n                $scrollParent.off(`scroll.${ev.data.key}`);\n                this.addToQueue(ev.data.$thumb[0]);\n              }\n            }\n          );\n        }\n      }\n    },\n\n    addToQueue: function (thumb) {\n      this.queue.push(thumb);\n\n      // See if there are any inactive workers\n      for (var i = 0; i < this.workers.length; i++) {\n        if (!this.workers[i].active) {\n          this.workers[i].loadNext();\n        }\n      }\n    },\n\n    isVisible: function ($thumb, $scrollParent) {\n      let thumbOffset = $thumb.offset().top;\n      let scrollParentOffset, scrollParentHeight;\n      if ($scrollParent[0] === document) {\n        scrollParentOffset = $scrollParent.scrollTop();\n        scrollParentHeight = Garnish.$win.height();\n      } else {\n        scrollParentOffset = $scrollParent.offset().top;\n        scrollParentHeight = $scrollParent.height();\n      }\n      return (\n        thumbOffset > scrollParentOffset &&\n        thumbOffset < scrollParentOffset + scrollParentHeight + 1000\n      );\n    },\n\n    destroy: function () {\n      for (var i = 0; i < this.workers.length; i++) {\n        this.workers[i].destroy();\n      }\n\n      this.base();\n    },\n  },\n  {\n    invisibleThumbs: {},\n    retryAll: function () {\n      for (let key in Craft.ElementThumbLoader.invisibleThumbs) {\n        let [queue, $thumb, $scrollParent] =\n          Craft.ElementThumbLoader.invisibleThumbs[key];\n        delete Craft.ElementThumbLoader.invisibleThumbs[key];\n        $scrollParent.off(`scroll.${key}`);\n        queue.load($thumb.parent());\n      }\n    },\n  }\n);\n\nCraft.ElementThumbLoader.Worker = Garnish.Base.extend({\n  loader: null,\n  active: false,\n\n  init: function (loader) {\n    this.loader = loader;\n  },\n\n  loadNext: function () {\n    var container = this.loader.queue.shift();\n    if (typeof container === 'undefined') {\n      this.active = false;\n      return;\n    }\n\n    this.active = true;\n    var $container = $(container);\n    if ($container.find('img').length) {\n      this.loadNext();\n      return;\n    }\n    var $img = $('<img/>', {\n      sizes: $container.attr('data-sizes'),\n      srcset: $container.attr('data-srcset'),\n      alt: $container.attr('data-alt') || '',\n    });\n    this.addListener($img, 'load,error', 'loadNext');\n    $img.appendTo($container);\n    picturefill({\n      elements: [$img[0]],\n    });\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Elevated Session Form\n */\nCraft.ElevatedSessionForm = Garnish.Base.extend({\n  $form: null,\n  inputs: null,\n\n  init: function (form, inputs) {\n    this.$form = $(form);\n\n    // Only check specific inputs?\n    if (typeof inputs !== 'undefined') {\n      this.inputs = [];\n      inputs = $.makeArray(inputs);\n\n      for (var i = 0; i < inputs.length; i++) {\n        var $inputs = $(inputs[i]);\n\n        for (var j = 0; j < $inputs.length; j++) {\n          var $input = $inputs.eq(j);\n\n          this.inputs.push({\n            input: $input,\n            val: Garnish.getInputPostVal($input),\n          });\n        }\n      }\n    }\n\n    this.addListener(this.$form, 'submit', 'handleFormSubmit');\n  },\n\n  handleFormSubmit: function (ev) {\n    // Ignore if we're in the middle of getting the elevated session timeout\n    if (Craft.elevatedSessionManager.fetchingTimeout) {\n      ev.preventDefault();\n      ev.stopImmediatePropagation();\n      return;\n    }\n\n    // Are we only interested in certain inputs?\n    if (this.inputs) {\n      var inputsChanged = false;\n      var $input;\n\n      for (var i = 0; i < this.inputs.length; i++) {\n        $input = this.inputs[i].input;\n        // Is this a password input?\n        if ($input.data('passwordInput')) {\n          $input = $input.data('passwordInput').$currentInput;\n        }\n\n        // Has this input's value changed?\n        if (Garnish.getInputPostVal($input) !== this.inputs[i].val) {\n          inputsChanged = true;\n          break;\n        }\n      }\n\n      if (!inputsChanged) {\n        // No need to interrupt the submit\n        return;\n      }\n    }\n\n    // Prevent the form from submitting until the user has an elevated session\n    ev.preventDefault();\n    ev.stopImmediatePropagation();\n    Craft.elevatedSessionManager.requireElevatedSession(\n      this.submitForm.bind(this)\n    );\n  },\n\n  submitForm: function () {\n    // Don't let handleFormSubmit() interrupt this time\n    this.disable();\n    this.$form.trigger('submit');\n    this.enable();\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Elevated Session Manager\n */\nCraft.ElevatedSessionManager = Garnish.Base.extend(\n  {\n    fetchingTimeout: false,\n\n    passwordModal: null,\n    $passwordInput: null,\n    $submitBtn: null,\n    $errorPara: null,\n\n    callback: null,\n\n    /**\n     * @callback requireElevatedSessionCallback\n     */\n    /**\n     * Requires that the user has an elevated session.\n     *\n     * @param {requireElevatedSessionCallback} callback The callback function that should be called once the user has an elevated session\n     */\n    requireElevatedSession: function (callback) {\n      this.callback = callback;\n\n      // Check the time remaining on the user’s elevated session (if any)\n      this.fetchingTimeout = true;\n\n      Craft.sendActionRequest('POST', 'users/get-elevated-session-timeout')\n        .then((response) => {\n          this.fetchingTimeout = false;\n          if (\n            response.data.timeout === false ||\n            response.data.timeout >=\n              Craft.ElevatedSessionManager.minSafeElevatedSessionTimeout\n          ) {\n            this.callback();\n          } else {\n            // Show the password modal\n            this.showPasswordModal();\n          }\n        })\n        .catch(() => {\n          this.fetchingTimeout = false;\n        });\n    },\n\n    showPasswordModal: function () {\n      if (!this.passwordModal) {\n        var $passwordModal = $(\n            '<form id=\"elevatedsessionmodal\" class=\"modal secure fitted\"/>'\n          ),\n          $body = $(\n            '<div class=\"body\"><p>' +\n              Craft.t('app', 'Enter your password to continue.') +\n              '</p></div>'\n          ).appendTo($passwordModal),\n          $inputContainer = $('<div class=\"inputcontainer\">').appendTo($body),\n          $inputsFlexContainer = $('<div class=\"flex\"/>').appendTo(\n            $inputContainer\n          ),\n          $passwordContainer = $('<div class=\"flex-grow\"/>').appendTo(\n            $inputsFlexContainer\n          ),\n          $buttonContainer = $('<td/>').appendTo($inputsFlexContainer),\n          $passwordWrapper = $('<div class=\"passwordwrapper\"/>').appendTo(\n            $passwordContainer\n          );\n\n        this.$passwordInput = $(\n          '<input type=\"password\" class=\"text password fullwidth\" placeholder=\"' +\n            Craft.t('app', 'Password') +\n            '\" autocomplete=\"current-password\"/>'\n        ).appendTo($passwordWrapper);\n        this.$submitBtn = Craft.ui\n          .createSubmitButton({\n            class: 'disabled',\n            label: Craft.t('app', 'Submit'),\n            spinner: true,\n          })\n          .appendTo($buttonContainer);\n        this.$errorPara = $('<p class=\"error\"/>').appendTo($body);\n\n        this.passwordModal = new Garnish.Modal($passwordModal, {\n          closeOtherModals: false,\n          onFadeIn: () => {\n            setTimeout(this.focusPasswordInput.bind(this), 100);\n          },\n          onFadeOut: () => {\n            this.$passwordInput.val('');\n          },\n        });\n\n        new Craft.PasswordInput(this.$passwordInput, {\n          onToggleInput: ($newPasswordInput) => {\n            this.$passwordInput = $newPasswordInput;\n          },\n        });\n\n        this.addListener(this.$passwordInput, 'input', 'validatePassword');\n        this.addListener($passwordModal, 'submit', 'submitPassword');\n      } else {\n        this.passwordModal.show();\n      }\n    },\n\n    focusPasswordInput: function () {\n      if (!Garnish.isMobileBrowser(true)) {\n        this.$passwordInput.trigger('focus');\n      }\n    },\n\n    validatePassword: function () {\n      if (this.$passwordInput.val().length >= 6) {\n        this.$submitBtn.removeClass('disabled');\n        return true;\n      } else {\n        this.$submitBtn.addClass('disabled');\n        return false;\n      }\n    },\n\n    submitPassword: function (ev) {\n      if (ev) {\n        ev.preventDefault();\n      }\n\n      if (!this.validatePassword()) {\n        return;\n      }\n\n      this.$submitBtn.addClass('loading');\n      this.clearLoginError();\n\n      var data = {\n        currentPassword: this.$passwordInput.val(),\n      };\n\n      Craft.sendActionRequest('POST', 'users/start-elevated-session', {data})\n        .then((response) => {\n          this.$submitBtn.removeClass('loading');\n          this.passwordModal.hide();\n          this.callback();\n        })\n        .catch(({response}) => {\n          this.$submitBtn.removeClass('loading');\n          this.showPasswordError(\n            response.data.message || Craft.t('app', 'Incorrect password.')\n          );\n          Garnish.shake(this.passwordModal.$container);\n          this.focusPasswordInput();\n        });\n    },\n\n    showPasswordError: function (error) {\n      if (error === null || typeof error === 'undefined') {\n        error = Craft.t('app', 'A server error occurred.');\n      }\n\n      this.$errorPara.text(error);\n      this.passwordModal.updateSizeAndPosition();\n    },\n\n    clearLoginError: function () {\n      this.showPasswordError('');\n    },\n  },\n  {\n    minSafeElevatedSessionTimeout: 5,\n  }\n);\n\n// Instantiate it\nCraft.elevatedSessionManager = new Craft.ElevatedSessionManager();\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Entry index class\n */\nCraft.EntryIndex = Craft.BaseElementIndex.extend({\n  publishableSections: null,\n  $newEntryBtnGroup: null,\n  $newEntryBtn: null,\n\n  init: function (elementType, $container, settings) {\n    this.publishableSections = [];\n    this.on('selectSource', this.updateButton.bind(this));\n    this.on('selectSite', this.updateButton.bind(this));\n    this.base(elementType, $container, settings);\n  },\n\n  afterInit: function () {\n    // Find which of the visible sections the user has permission to create new entries in\n    this.publishableSections = Craft.publishableSections.filter(\n      (s) => !!this.getSourceByKey(`section:${s.uid}`)\n    );\n\n    this.base();\n  },\n\n  getDefaultSourceKey: function () {\n    // Did they request a specific section in the URL?\n    if (\n      this.settings.context === 'index' &&\n      typeof defaultSectionHandle !== 'undefined'\n    ) {\n      if (defaultSectionHandle === 'singles') {\n        return 'singles';\n      }\n\n      for (let i = 0; i < this.$sources.length; i++) {\n        const $source = $(this.$sources[i]);\n        if ($source.data('handle') === defaultSectionHandle) {\n          return $source.data('key');\n        }\n      }\n    }\n\n    return this.base();\n  },\n\n  updateButton: function () {\n    if (!this.$source) {\n      return;\n    }\n\n    let handle;\n\n    // Get the handle of the selected source\n    if (this.$source.data('key') === 'singles') {\n      handle = 'singles';\n    } else {\n      handle = this.$source.data('handle');\n    }\n\n    // Update the New Entry button\n    // ---------------------------------------------------------------------\n\n    if (this.publishableSections.length) {\n      // Remove the old button, if there is one\n      if (this.$newEntryBtnGroup) {\n        this.$newEntryBtnGroup.remove();\n      }\n\n      // Determine if they are viewing a section that they have permission to create entries in\n      const selectedSection = this.publishableSections.find(\n        (s) => s.handle === handle\n      );\n\n      this.$newEntryBtnGroup = $('<div class=\"btngroup submit\" data-wrapper/>');\n      let $menuBtn;\n      const menuId = 'new-entry-menu-' + Craft.randomString(10);\n\n      // If they are, show a primary \"New entry\" button, and a dropdown of the other sections (if any).\n      // Otherwise only show a menu button\n      if (selectedSection) {\n        const visibleLabel =\n          this.settings.context === 'index'\n            ? Craft.t('app', 'New entry')\n            : Craft.t('app', 'New {section} entry', {\n                section: selectedSection.name,\n              });\n\n        const ariaLabel =\n          this.settings.context === 'index'\n            ? Craft.t('app', 'New entry in the {section} section', {\n                section: selectedSection.name,\n              })\n            : visibleLabel;\n\n        // In index contexts, the button functions as a link\n        // In non-index contexts, the button triggers a slideout editor\n        const role = this.settings.context === 'index' ? 'link' : null;\n\n        this.$newEntryBtn = Craft.ui\n          .createButton({\n            label: visibleLabel,\n            ariaLabel: ariaLabel,\n            spinner: true,\n            role: role,\n          })\n          .addClass('submit add icon')\n          .appendTo(this.$newEntryBtnGroup);\n\n        this.addListener(this.$newEntryBtn, 'click mousedown', (ev) => {\n          // If this is the element index, check for Ctrl+clicks and middle button clicks\n          if (\n            this.settings.context === 'index' &&\n            ((ev.type === 'click' && Garnish.isCtrlKeyPressed(ev)) ||\n              (ev.type === 'mousedown' && ev.originalEvent.button === 1))\n          ) {\n            window.open(Craft.getUrl(`entries/${selectedSection.handle}/new`));\n          } else if (ev.type === 'click') {\n            this._createEntry(selectedSection.id);\n          }\n        });\n\n        if (this.publishableSections.length > 1) {\n          $menuBtn = $('<button/>', {\n            type: 'button',\n            class: 'btn submit menubtn btngroup-btn-last',\n            'aria-controls': menuId,\n            'data-disclosure-trigger': '',\n            'aria-label': Craft.t('app', 'New entry, choose a section'),\n          }).appendTo(this.$newEntryBtnGroup);\n        }\n      } else {\n        this.$newEntryBtn = $menuBtn = Craft.ui\n          .createButton({\n            label: Craft.t('app', 'New entry'),\n            ariaLabel: Craft.t('app', 'New entry, choose a section'),\n            spinner: true,\n          })\n          .addClass('submit add icon menubtn btngroup-btn-last')\n          .attr('aria-controls', menuId)\n          .attr('data-disclosure-trigger', '')\n          .appendTo(this.$newEntryBtnGroup);\n      }\n\n      this.addButton(this.$newEntryBtnGroup);\n\n      if ($menuBtn) {\n        const $menuContainer = $('<div/>', {\n          id: menuId,\n          class: 'menu menu--disclosure',\n        }).appendTo(this.$newEntryBtnGroup);\n        const $ul = $('<ul/>').appendTo($menuContainer);\n\n        for (const section of this.publishableSections) {\n          const anchorRole =\n            this.settings.context === 'index' ? 'link' : 'button';\n          if (\n            (this.settings.context === 'index' &&\n              $.inArray(this.siteId, section.sites) !== -1) ||\n            (this.settings.context !== 'index' && section !== selectedSection)\n          ) {\n            const $li = $('<li/>').appendTo($ul);\n            const $a = $('<a/>', {\n              role: anchorRole === 'button' ? 'button' : null,\n              href: '#', // Allows for click listener and tab order\n              type: anchorRole === 'button' ? 'button' : null,\n              text: Craft.t('app', 'New {section} entry', {\n                section: section.name,\n              }),\n            }).appendTo($li);\n            this.addListener($a, 'click', () => {\n              $menuBtn.data('trigger').hide();\n              this._createEntry(section.id);\n            });\n\n            if (anchorRole === 'button') {\n              this.addListener($a, 'keydown', (event) => {\n                if (event.keyCode === Garnish.SPACE_KEY) {\n                  event.preventDefault();\n                  $menuBtn.data('trigger').hide();\n                  this._createEntry(section.id);\n                }\n              });\n            }\n          }\n        }\n\n        new Garnish.DisclosureMenu($menuBtn);\n      }\n    }\n\n    // Update the URL if we're on the Entries index\n    // ---------------------------------------------------------------------\n\n    if (this.settings.context === 'index') {\n      let uri = 'entries';\n\n      if (handle) {\n        uri += '/' + handle;\n      }\n\n      Craft.setPath(uri);\n    }\n  },\n\n  _createEntry: function (sectionId) {\n    if (this.$newEntryBtn.hasClass('loading')) {\n      console.warn('New entry creation already in progress.');\n      return;\n    }\n\n    // Find the section\n    const section = this.publishableSections.find((s) => s.id === sectionId);\n\n    if (!section) {\n      throw `Invalid section ID: ${sectionId}`;\n    }\n\n    this.$newEntryBtn.addClass('loading');\n\n    Craft.sendActionRequest('POST', 'entries/create', {\n      data: {\n        siteId: this.siteId,\n        section: section.handle,\n      },\n    })\n      .then(({data}) => {\n        if (this.settings.context === 'index') {\n          document.location.href = Craft.getUrl(data.cpEditUrl, {fresh: 1});\n        } else {\n          const slideout = Craft.createElementEditor(this.elementType, {\n            siteId: this.siteId,\n            elementId: data.entry.id,\n            draftId: data.entry.draftId,\n            params: {\n              fresh: 1,\n            },\n          });\n          slideout.on('submit', () => {\n            // Make sure the right section is selected\n            const sectionSourceKey = `section:${section.uid}`;\n\n            if (this.sourceKey !== sectionSourceKey) {\n              this.selectSourceByKey(sectionSourceKey);\n            }\n\n            this.clearSearch();\n            this.setSelectedSortAttribute('dateCreated', 'desc');\n            this.selectElementAfterUpdate(data.entry.id);\n            this.updateElements();\n          });\n        }\n      })\n      .finally(() => {\n        this.$newEntryBtn.removeClass('loading');\n      });\n  },\n});\n\n// Register it!\nCraft.registerElementIndexClass('craft\\\\elements\\\\Entry', Craft.EntryIndex);\n","/** global: Craft */\n/** global: Garnish */\nCraft.FieldLayoutDesigner = Garnish.Base.extend(\n  {\n    $container: null,\n    $configInput: null,\n    $tabContainer: null,\n    $newTabBtn: null,\n    $sidebar: null,\n    $libraryToggle: null,\n    $selectedLibrary: null,\n    $fieldLibrary: null,\n    $uiLibrary: null,\n    $uiLibraryElements: null,\n    $fieldSearch: null,\n    $clearFieldSearchBtn: null,\n    $fieldGroups: null,\n    $fields: null,\n\n    tabGrid: null,\n    elementDrag: null,\n\n    _config: null,\n\n    init: function (container, settings) {\n      this.$container = $(container);\n      this.setSettings(settings, Craft.FieldLayoutDesigner.defaults);\n\n      this.$configInput = this.$container.children('input[data-config-input]');\n      this._config = JSON.parse(this.$configInput.val());\n      if (!this._config.tabs) {\n        this._config.tabs = [];\n      }\n\n      let $workspace = this.$container.children('.fld-workspace');\n      this.$tabContainer = $workspace.children('.fld-tabs');\n      this.$newTabBtn = $workspace.children('.fld-new-tab-btn');\n      this.$sidebar = this.$container.children('.fld-sidebar');\n\n      this.$fieldLibrary = this.$selectedLibrary =\n        this.$sidebar.children('.fld-field-library');\n      let $fieldSearchContainer = this.$fieldLibrary.children('.search');\n      this.$fieldSearch = $fieldSearchContainer.children('input');\n      this.$clearFieldSearchBtn = $fieldSearchContainer.children('.clear');\n      this.$fieldGroups = this.$sidebar.find('.fld-field-group');\n      this.$fields = this.$fieldGroups.children('.fld-element');\n      this.$uiLibrary = this.$sidebar.children('.fld-ui-library');\n      this.$uiLibraryElements = this.$uiLibrary.children();\n\n      // Set up the layout grids\n      this.tabGrid = new Craft.Grid(this.$tabContainer, {\n        itemSelector: '.fld-tab',\n        minColWidth: 24 * 11,\n        fillMode: 'grid',\n        snapToGrid: 24,\n      });\n\n      let $tabs = this.$tabContainer.children();\n      for (let i = 0; i < $tabs.length; i++) {\n        this.initTab($($tabs[i]));\n      }\n\n      this.elementDrag = new Craft.FieldLayoutDesigner.ElementDrag(this);\n\n      if (this.settings.customizableTabs) {\n        this.tabDrag = new Craft.FieldLayoutDesigner.TabDrag(this);\n\n        this.addListener(this.$newTabBtn, 'activate', 'addTab');\n      }\n\n      // Set up the sidebar\n      if (this.settings.customizableUi) {\n        let $libraryPicker = this.$sidebar.children('.btngroup');\n        new Craft.Listbox($libraryPicker, {\n          onChange: ($selectedOption) => {\n            this.$selectedLibrary.addClass('hidden');\n            this.$selectedLibrary =\n              this[`$${$selectedOption.data('library')}Library`].removeClass(\n                'hidden'\n              );\n          },\n        });\n      }\n\n      this.addListener(this.$fieldSearch, 'input', () => {\n        let val = this.$fieldSearch.val().toLowerCase().replace(/['\"]/g, '');\n        if (!val) {\n          this.$fieldLibrary.find('.filtered').removeClass('filtered');\n          this.$clearFieldSearchBtn.addClass('hidden');\n          return;\n        }\n\n        this.$clearFieldSearchBtn.removeClass('hidden');\n        let $matches = this.$fields\n          .filter(`[data-keywords*=\"${val}\"]`)\n          .add(\n            this.$fieldGroups\n              .filter(`[data-name*=\"${val}\"]`)\n              .children('.fld-element')\n          )\n          .removeClass('filtered');\n        this.$fields.not($matches).addClass('filtered');\n\n        // hide any groups that don't have any results\n        for (let i = 0; i < this.$fieldGroups.length; i++) {\n          let $group = this.$fieldGroups.eq(i);\n          if ($group.find('.fld-element:not(.hidden):not(.filtered)').length) {\n            $group.removeClass('filtered');\n          } else {\n            $group.addClass('filtered');\n          }\n        }\n      });\n\n      this.addListener(this.$fieldSearch, 'keydown', (ev) => {\n        switch (ev.keyCode) {\n          case Garnish.ESC_KEY:\n            this.$fieldSearch.val('').trigger('input');\n            break;\n          case Garnish.RETURN_KEY:\n            // they most likely don't want to submit the form from here\n            ev.preventDefault();\n            break;\n        }\n      });\n\n      // Clear the search when the X button is clicked\n      this.addListener(this.$clearFieldSearchBtn, 'click', () => {\n        this.$fieldSearch.val('').trigger('input');\n      });\n    },\n\n    initTab: function ($tab) {\n      return new Craft.FieldLayoutDesigner.Tab(this, $tab);\n    },\n\n    removeFieldByHandle: function (attribute) {\n      this.$fields\n        .filter(`[data-attribute=\"${attribute}\"]:first`)\n        .removeClass('hidden')\n        .closest('.fld-field-group')\n        .removeClass('hidden');\n    },\n\n    addTab: function () {\n      if (!this.settings.customizableTabs) {\n        return;\n      }\n\n      const name = Craft.escapeHtml(\n        prompt(Craft.t('app', 'Give your tab a name.'))\n      );\n\n      if (!name) {\n        return;\n      }\n\n      const $tab = $(`\n<div class=\"fld-tab\">\n  <div class=\"tabs\">\n    <div class=\"tab sel draggable\">\n      <span>${name}</span>\n      <a class=\"settings icon\" title=\"${Craft.t('app', 'Settings')}\"></a>\n    </div>\n  </div>\n  <div class=\"fld-tabcontent\"></div>\n</div>\n`).appendTo(this.$tabContainer);\n\n      this.tabGrid.addItems($tab);\n      this.tabDrag.addItems($tab);\n\n      const tab = this.initTab($tab);\n      tab.updatePositionInConfig();\n    },\n\n    get config() {\n      return this._config;\n    },\n\n    set config(config) {\n      this._config = config;\n      this.$configInput.val(JSON.stringify(config));\n    },\n\n    updateConfig: function (callback) {\n      const config = callback(this.config);\n      if (config !== false) {\n        this.config = config;\n      }\n    },\n  },\n  {\n    defaults: {\n      customizableTabs: true,\n      customizableUi: true,\n    },\n\n    createSlideout: function (contents, js) {\n      const $body = $('<div/>', {class: 'fld-element-settings-body'});\n      $('<div/>', {class: 'fields', html: contents}).appendTo($body);\n      const $footer = $('<div/>', {class: 'fld-element-settings-footer'});\n      $('<div/>', {class: 'flex-grow'}).appendTo($footer);\n      const $cancelBtn = Craft.ui\n        .createButton({\n          label: Craft.t('app', 'Close'),\n          spinner: true,\n        })\n        .appendTo($footer);\n      Craft.ui\n        .createSubmitButton({\n          class: 'secondary',\n          label: Craft.t('app', 'Apply'),\n          spinner: true,\n        })\n        .appendTo($footer);\n      const $contents = $body.add($footer);\n\n      const slideout = new Craft.Slideout($contents, {\n        containerElement: 'form',\n        containerAttributes: {\n          action: '',\n          method: 'post',\n          novalidate: '',\n          class: 'fld-element-settings',\n        },\n      });\n      slideout.on('open', () => {\n        // Hold off a sec until it's positioned...\n        Garnish.requestAnimationFrame(() => {\n          // Focus on the first text input\n          slideout.$container.find('.text:first').trigger('focus');\n        });\n      });\n\n      $cancelBtn.on('click', () => {\n        slideout.close();\n      });\n\n      if (js) {\n        eval(js);\n      }\n\n      Craft.initUiElements(slideout.$container);\n\n      return slideout;\n    },\n  }\n);\n\nCraft.FieldLayoutDesigner.Tab = Garnish.Base.extend({\n  designer: null,\n  uid: null,\n  $container: null,\n  slideout: null,\n  destroyed: false,\n\n  init: function (designer, $container) {\n    this.designer = designer;\n    this.$container = $container;\n    this.$container.data('fld-tab', this);\n    this.uid = this.$container.data('uid');\n\n    // New tab?\n    if (!this.uid) {\n      this.uid = Craft.uuid();\n      this.config = {\n        uid: this.uid,\n        name: this.$container.find('.tabs .tab span').text(),\n        elements: [],\n      };\n      this.$container.data(\n        'settings-namespace',\n        this.designer.$container\n          .data('new-tab-settings-namespace')\n          .replace(/\\bTAB_UID\\b/g, this.uid)\n      );\n      this.$container.data(\n        'settings-html',\n        this.designer.$container\n          .data('new-tab-settings-html')\n          .replace(/\\bTAB_UID\\b/g, this.uid)\n          .replace(/\\bTAB_NAME\\b/g, this.config.name)\n      );\n      this.$container.data(\n        'settings-js',\n        this.designer.$container\n          .data('new-tab-settings-js')\n          .replace(/\\bTAB_UID\\b/g, this.uid)\n      );\n    }\n\n    if (this.designer.settings.customizableTabs) {\n      this.settingsNamespace = this.$container.data('settings-namespace');\n      this.createMenu();\n    }\n\n    // initialize the elements\n    const $elements = this.$container.children('.fld-tabcontent').children();\n\n    for (let i = 0; i < $elements.length; i++) {\n      this.initElement($($elements[i]));\n    }\n  },\n\n  createMenu: function () {\n    const $editBtn = this.$container.find('.tabs .settings');\n\n    $('<div class=\"menu\" data-align=\"center\"/>')\n      .insertAfter($editBtn)\n      .append(\n        $('<ul/>')\n          .append(\n            $('<li/>').append(\n              $('<a/>', {\n                'data-action': 'settings',\n                text: Craft.t('app', 'Settings'),\n              })\n            )\n          )\n          .append(\n            $('<li/>').append(\n              $('<a/>', {\n                'data-action': 'remove',\n                text: Craft.t('app', 'Remove'),\n              })\n            )\n          )\n      )\n      .append($('<hr/>'))\n      .append(\n        $('<ul/>')\n          .append(\n            $('<li/>').append(\n              $('<a/>', {\n                'data-action': 'moveLeft',\n                text: Craft.t('app', 'Move to the left'),\n              })\n            )\n          )\n          .append(\n            $('<li/>').append(\n              $('<a/>', {\n                'data-action': 'moveRight',\n                text: Craft.t('app', 'Move to the right'),\n              })\n            )\n          )\n      );\n\n    let menuBtn = new Garnish.MenuBtn($editBtn, {\n      onOptionSelect: this.onTabOptionSelect.bind(this),\n    });\n\n    menuBtn.menu.on('show', () => {\n      if (this.$container.prev('.fld-tab').length) {\n        menuBtn.menu.$container\n          .find('[data-action=moveLeft]')\n          .removeClass('disabled');\n      } else {\n        menuBtn.menu.$container\n          .find('[data-action=moveLeft]')\n          .addClass('disabled');\n      }\n\n      if (this.$container.next('.fld-tab').length) {\n        menuBtn.menu.$container\n          .find('[data-action=moveRight]')\n          .removeClass('disabled');\n      } else {\n        menuBtn.menu.$container\n          .find('[data-action=moveRight]')\n          .addClass('disabled');\n      }\n    });\n  },\n\n  onTabOptionSelect: function (option) {\n    if (!this.designer.settings.customizableTabs) {\n      return;\n    }\n\n    let $option = $(option);\n    let action = $option.data('action');\n\n    switch (action) {\n      case 'settings':\n        if (!this.slideout) {\n          this.createSettings();\n        } else {\n          this.slideout.open();\n        }\n        break;\n      case 'remove':\n        this.destroy();\n        break;\n      case 'moveLeft':\n        let $prev = this.$container.prev('.fld-tab');\n        if ($prev.length) {\n          this.$container.insertBefore($prev);\n          this.updatePositionInConfig();\n        }\n        break;\n      case 'moveRight':\n        let $next = this.$container.next('.fld-tab');\n        if ($next.length) {\n          this.$container.insertAfter($next);\n          this.updatePositionInConfig();\n        }\n        break;\n    }\n  },\n\n  createSettings: function () {\n    const settingsHtml = this.$container.data('settings-html');\n    const settingsJs = this.$container.data('settings-js');\n    this.slideout = Craft.FieldLayoutDesigner.createSlideout(\n      settingsHtml,\n      settingsJs\n    );\n\n    this.slideout.$container.on('submit', (ev) => {\n      ev.preventDefault();\n      this.applySettings();\n    });\n  },\n\n  applySettings: function () {\n    if (!this.slideout.$container.find('[name$=\"[name]\"]').val()) {\n      alert(Craft.t('app', 'You must specify a tab name.'));\n      return;\n    }\n\n    // update the UI\n    let $submitBtn = this.slideout.$container\n      .find('button[type=submit]')\n      .addClass('loading');\n\n    const config = $.extend({}, this.config);\n    delete config.elements;\n\n    Craft.sendActionRequest('POST', 'fields/apply-layout-tab-settings', {\n      data: {\n        config: config,\n        settingsNamespace: this.settingsNamespace,\n        settings: this.slideout.$container.serialize(),\n      },\n    })\n      .then((response) => {\n        this.updateConfig((config) =>\n          $.extend(response.data.config, {elements: config.elements})\n        );\n        debugger;\n        const $label = this.$container.find('.tabs .tab span');\n        const $indicator = $label.children('.fld-indicator');\n        if (response.data.hasConditions) {\n          if (!$indicator.length) {\n            $label.append(\n              $('<div/>', {\n                class: 'fld-indicator',\n                title: Craft.t('app', 'This tab is conditional'),\n                'aria-label': Craft.t('app', 'This tab is conditional'),\n                'data-icon': 'condition',\n              })\n            );\n          }\n        } else if ($indicator.length) {\n          $indicator.remove();\n        }\n        this.slideout.close();\n      })\n      .catch((e) => {\n        Craft.cp.displayError();\n        console.error(e);\n      })\n      .finally(() => {\n        $submitBtn.removeClass('loading');\n        this.slideout.close();\n      });\n  },\n\n  initElement: function ($element) {\n    return new Craft.FieldLayoutDesigner.Element(this, $element);\n  },\n\n  get index() {\n    return this.designer.config.tabs.findIndex((c) => c.uid === this.uid);\n  },\n\n  get config() {\n    if (!this.uid) {\n      throw 'Tab is missing its UID';\n    }\n    let config = this.designer.config.tabs.find((c) => c.uid === this.uid);\n    if (!config) {\n      config = {\n        uid: this.uid,\n        elements: [],\n      };\n      this.config = config;\n    }\n    return config;\n  },\n\n  set config(config) {\n    if (this.destroyed) {\n      return;\n    }\n\n    // Is the name changing?\n    if (config.name && config.name !== this.config.name) {\n      this.$container.find('.tabs .tab span').text(config.name);\n    }\n\n    const designerConfig = this.designer.config;\n    const index = this.index;\n    if (index !== -1) {\n      designerConfig.tabs[index] = config;\n    } else {\n      const newIndex = $.inArray(\n        this.$container[0],\n        this.$container.parent().children('.fld-tab')\n      );\n      designerConfig.tabs.splice(newIndex, 0, config);\n    }\n    this.designer.config = designerConfig;\n  },\n\n  updateConfig: function (callback) {\n    if (this.destroyed) {\n      return;\n    }\n\n    const config = callback(this.config);\n    if (config !== false) {\n      this.config = config;\n    }\n  },\n\n  updatePositionInConfig: function () {\n    if (this.destroyed) {\n      return;\n    }\n\n    this.designer.updateConfig((config) => {\n      const tabConfig = this.config;\n      const oldIndex = this.index;\n      const newIndex = $.inArray(\n        this.$container[0],\n        this.$container.parent().children('.fld-tab')\n      );\n      if (oldIndex !== -1) {\n        config.tabs.splice(oldIndex, 1);\n      }\n      config.tabs.splice(newIndex, 0, tabConfig);\n      return config;\n    });\n  },\n\n  destroy: function () {\n    if (this.destroyed) {\n      return;\n    }\n\n    this.destroyed = true;\n\n    this.designer.updateConfig((config) => {\n      const index = this.index;\n      if (index === -1) {\n        return false;\n      }\n      config.tabs.splice(index, 1);\n      return config;\n    });\n\n    // First destroy the tab's elements\n    let $elements = this.$container.find('.fld-element');\n    for (let i = 0; i < $elements.length; i++) {\n      $elements.eq(i).data('fld-element').destroy();\n    }\n\n    this.designer.tabGrid.removeItems(this.$container);\n    this.designer.tabDrag.removeItems(this.$container);\n    this.$container.remove();\n\n    this.base();\n  },\n});\n\nCraft.FieldLayoutDesigner.Element = Garnish.Base.extend({\n  tab: null,\n  $container: null,\n  $settingsContainer: null,\n  $editBtn: null,\n\n  uid: null,\n  isField: false,\n  attribute: null,\n  requirable: false,\n  hasCustomWidth: false,\n  hasSettings: false,\n  settingsNamespace: null,\n  slideout: null,\n\n  init: function (tab, $container) {\n    this.tab = tab;\n    this.$container = $container;\n    this.$container.data('fld-element', this);\n    this.uid = this.$container.data('uid');\n\n    // New element?\n    if (!this.uid) {\n      this.uid = Craft.uuid();\n      this.config = $.extend(this.$container.data('config'), {uid: this.uid});\n    }\n\n    this.isField = this.$container.hasClass('fld-field');\n    this.requirable =\n      this.isField && Garnish.hasAttr(this.$container, 'data-requirable');\n\n    if (this.isField) {\n      this.attribute = this.$container.data('attribute');\n    }\n\n    this.settingsNamespace = this.$container\n      .data('settings-namespace')\n      .replace(/\\bELEMENT_UID\\b/g, this.uid);\n    let settingsHtml = (this.$container.data('settings-html') || '').replace(\n      /\\bELEMENT_UID\\b/g,\n      this.uid\n    );\n    let isRequired =\n      this.requirable && this.$container.hasClass('fld-required');\n    this.hasCustomWidth =\n      this.tab.designer.settings.customizableUi &&\n      Garnish.hasAttr(this.$container, 'data-has-custom-width');\n    this.hasSettings = settingsHtml || this.requirable;\n\n    if (this.hasSettings) {\n      // create the setting container\n      this.$settingsContainer = $('<div/>', {\n        class: 'hidden',\n      });\n\n      // create the edit button\n      this.$editBtn = $('<a/>', {\n        role: 'button',\n        tabindex: 0,\n        class: 'settings icon',\n        title: Craft.t('app', 'Edit'),\n      });\n\n      const showSettings = () => {\n        if (!this.slideout) {\n          this.createSettings(settingsHtml, isRequired);\n        } else {\n          this.slideout.open();\n        }\n      };\n\n      this.$editBtn.on('click', showSettings);\n      this.$container.on('dblclick', showSettings);\n    }\n\n    this.initUi();\n\n    // cleanup\n    this.$container.attr('data-keywords', null);\n    this.$container.attr('data-settings-html', null);\n  },\n\n  initUi: function () {\n    if (this.hasCustomWidth) {\n      let widthSlider = new Craft.SlidePicker(this.config.width || 100, {\n        min: 25,\n        max: 100,\n        step: 25,\n        valueLabel: (width) => {\n          return Craft.t('app', '{pct} width', {pct: `${width}%`});\n        },\n        onChange: (width) => {\n          this.updateConfig((config) => {\n            config.width = width;\n            return config;\n          });\n        },\n      });\n      widthSlider.$container.appendTo(this.$container);\n    }\n\n    if (this.hasSettings) {\n      this.$editBtn.appendTo(this.$container);\n    }\n  },\n\n  createSettings: function (settingsHtml, isRequired) {\n    const settingsJs = (this.$container.data('settings-js') || '').replace(\n      /\\bELEMENT_UID\\b/g,\n      this.uid\n    );\n    this.slideout = Craft.FieldLayoutDesigner.createSlideout(\n      settingsHtml,\n      settingsJs\n    );\n\n    this.slideout.$container.on('submit', (ev) => {\n      ev.preventDefault();\n      this.applySettings();\n    });\n\n    if (this.requirable) {\n      const $fieldsContainer = this.slideout.$container.find('.fields:first');\n      Craft.ui\n        .createLightswitchField({\n          label: Craft.t('app', 'Required'),\n          name: `${this.settingsNamespace}[required]`,\n          on: isRequired,\n        })\n        .prependTo($fieldsContainer);\n    }\n\n    this.trigger('createSettings');\n  },\n\n  applySettings: function () {\n    // update the UI\n    let $submitBtn = this.slideout.$container\n      .find('button[type=submit]')\n      .addClass('loading');\n\n    Craft.sendActionRequest('POST', 'fields/apply-layout-element-settings', {\n      data: {\n        config: this.config,\n        settingsNamespace: this.settingsNamespace,\n        settings: this.slideout.$container.serialize(),\n      },\n    })\n      .then((response) => {\n        this.config = response.data.config;\n        this.$editBtn.detach();\n        this.$container.html($(response.data.selectorHtml).html());\n        this.initUi();\n      })\n      .catch((e) => {\n        Craft.cp.displayError();\n        console.error(e);\n      })\n      .finally(() => {\n        $submitBtn.removeClass('loading');\n        this.updateRequiredClass();\n        this.slideout.close();\n      });\n  },\n\n  updateRequiredClass: function () {\n    if (!this.requirable) {\n      return;\n    }\n\n    if (this.config.required) {\n      this.$container.addClass('fld-required');\n    } else {\n      this.$container.removeClass('fld-required');\n    }\n  },\n\n  get index() {\n    const tabConfig = this.tab.config;\n    if (typeof tabConfig === 'undefined') {\n      return -1;\n    }\n    return tabConfig.elements.findIndex((c) => c.uid === this.uid);\n  },\n\n  get config() {\n    if (!this.uid) {\n      throw 'Tab is missing its UID';\n    }\n    let config = this.tab.config.elements.find((c) => c.uid === this.uid);\n    if (!config) {\n      config = {\n        uid: this.uid,\n      };\n      this.config = config;\n    }\n    return config;\n  },\n\n  set config(config) {\n    const tabConfig = this.tab.config;\n    const index = this.index;\n    if (index !== -1) {\n      tabConfig.elements[index] = config;\n    } else {\n      const newIndex = $.inArray(\n        this.$container[0],\n        this.$container.parent().children('.fld-element')\n      );\n      tabConfig.elements.splice(newIndex, 0, config);\n    }\n    this.tab.config = tabConfig;\n  },\n\n  updateConfig: function (callback) {\n    const config = callback(this.config);\n    if (config !== false) {\n      this.config = config;\n    }\n  },\n\n  updatePositionInConfig: function () {\n    this.tab.updateConfig((config) => {\n      const elementConfig = this.config;\n      const oldIndex = this.index;\n      const newIndex = $.inArray(\n        this.$container[0],\n        this.$container.parent().children('.fld-element')\n      );\n      if (oldIndex !== -1) {\n        config.elements.splice(oldIndex, 1);\n      }\n      config.elements.splice(newIndex, 0, elementConfig);\n      return config;\n    });\n  },\n\n  destroy: function () {\n    this.tab.updateConfig((config) => {\n      const index = this.index;\n      if (index === -1) {\n        return false;\n      }\n      config.elements.splice(index, 1);\n      return config;\n    });\n\n    this.tab.designer.elementDrag.removeItems(this.$container);\n    this.$container.remove();\n\n    if (this.isField) {\n      this.tab.designer.removeFieldByHandle(this.attribute);\n    }\n\n    this.base();\n  },\n});\n\nCraft.FieldLayoutDesigner.BaseDrag = Garnish.Drag.extend({\n  designer: null,\n  $insertion: null,\n  showingInsertion: false,\n  $caboose: null,\n\n  /**\n   * Constructor\n   */\n  init: function (designer, settings) {\n    this.designer = designer;\n    this.base(this.findItems(), settings);\n  },\n\n  /**\n   * On Drag Start\n   */\n  onDragStart: function () {\n    this.base();\n\n    // Create the insertion\n    this.$insertion = this.createInsertion();\n\n    // Add the caboose\n    this.$caboose = this.createCaboose();\n    this.$items = $().add(this.$items.add(this.$caboose));\n\n    Garnish.$bod.addClass('dragging');\n  },\n\n  removeCaboose: function () {\n    this.$items = this.$items.not(this.$caboose);\n    this.$caboose.remove();\n  },\n\n  swapDraggeeWithInsertion: function () {\n    this.$insertion.insertBefore(this.$draggee);\n    this.$draggee.detach();\n    this.$items = $().add(this.$items.not(this.$draggee).add(this.$insertion));\n    this.showingInsertion = true;\n  },\n\n  swapInsertionWithDraggee: function () {\n    this.$insertion.replaceWith(this.$draggee);\n    this.$items = $().add(this.$items.not(this.$insertion).add(this.$draggee));\n    this.showingInsertion = false;\n  },\n\n  /**\n   * Sets the item midpoints up front so we don't have to keep checking on every mouse move\n   */\n  setMidpoints: function () {\n    for (let i = 0; i < this.$items.length; i++) {\n      let $item = $(this.$items[i]);\n      let offset = $item.offset();\n\n      // Skip library elements\n      if ($item.hasClass('unused')) {\n        continue;\n      }\n\n      $item.data('midpoint', {\n        left: offset.left + $item.outerWidth() / 2,\n        top: offset.top + $item.outerHeight() / 2,\n      });\n    }\n  },\n\n  /**\n   * Returns the closest item to the cursor.\n   */\n  getClosestItem: function () {\n    this.getClosestItem._closestItem = null;\n    this.getClosestItem._closestItemMouseDiff = null;\n\n    for (\n      this.getClosestItem._i = 0;\n      this.getClosestItem._i < this.$items.length;\n      this.getClosestItem._i++\n    ) {\n      this.getClosestItem._$item = $(this.$items[this.getClosestItem._i]);\n\n      this.getClosestItem._midpoint =\n        this.getClosestItem._$item.data('midpoint');\n      if (!this.getClosestItem._midpoint) {\n        continue;\n      }\n\n      this.getClosestItem._mouseDiff = Garnish.getDist(\n        this.getClosestItem._midpoint.left,\n        this.getClosestItem._midpoint.top,\n        this.mouseX,\n        this.mouseY\n      );\n\n      if (\n        this.getClosestItem._closestItem === null ||\n        this.getClosestItem._mouseDiff <\n          this.getClosestItem._closestItemMouseDiff\n      ) {\n        this.getClosestItem._closestItem = this.getClosestItem._$item[0];\n        this.getClosestItem._closestItemMouseDiff =\n          this.getClosestItem._mouseDiff;\n      }\n    }\n\n    return this.getClosestItem._closestItem;\n  },\n\n  checkForNewClosestItem: function () {\n    // Is there a new closest item?\n    this.checkForNewClosestItem._closestItem = this.getClosestItem();\n\n    if (this.checkForNewClosestItem._closestItem === this.$insertion[0]) {\n      return;\n    }\n\n    if (\n      this.showingInsertion &&\n      $.inArray(this.$insertion[0], this.$items) <\n        $.inArray(this.checkForNewClosestItem._closestItem, this.$items) &&\n      $.inArray(this.checkForNewClosestItem._closestItem, this.$caboose) === -1\n    ) {\n      this.$insertion.insertAfter(this.checkForNewClosestItem._closestItem);\n    } else {\n      this.$insertion.insertBefore(this.checkForNewClosestItem._closestItem);\n    }\n\n    this.$items = $().add(this.$items.add(this.$insertion));\n    this.showingInsertion = true;\n    this.designer.tabGrid.refreshCols(true);\n    this.setMidpoints();\n  },\n\n  /**\n   * On Drag Stop\n   */\n  onDragStop: function () {\n    if (this.showingInsertion) {\n      this.swapInsertionWithDraggee();\n    }\n\n    this.removeCaboose();\n\n    this.designer.tabGrid.refreshCols(true);\n\n    // return the helpers to the draggees\n    let offset = this.$draggee.offset();\n    if (!offset || (offset.top === 0 && offset.left === 0)) {\n      this.$draggee\n        .css({\n          display: this.draggeeDisplay,\n          visibility: 'visible',\n          opacity: 0,\n        })\n        .velocity({opacity: 1}, Garnish.FX_DURATION);\n      this.helpers[0].velocity({opacity: 0}, Garnish.FX_DURATION, () => {\n        this._showDraggee();\n      });\n    } else {\n      this.returnHelpersToDraggees();\n    }\n\n    this.base();\n\n    Garnish.$bod.removeClass('dragging');\n  },\n});\n\nCraft.FieldLayoutDesigner.TabDrag = Craft.FieldLayoutDesigner.BaseDrag.extend({\n  /**\n   * Constructor\n   */\n  init: function (designer) {\n    let settings = {\n      handle: '.tab',\n    };\n\n    this.base(designer, settings);\n  },\n\n  findItems: function () {\n    return this.designer.$tabContainer.find('> div.fld-tab');\n  },\n\n  /**\n   * On Drag Start\n   */\n  onDragStart: function () {\n    this.base();\n    this.swapDraggeeWithInsertion();\n    this.setMidpoints();\n  },\n\n  swapDraggeeWithInsertion: function () {\n    this.base();\n    this.designer.tabGrid.removeItems(this.$draggee);\n    this.designer.tabGrid.addItems(this.$insertion);\n  },\n\n  swapInsertionWithDraggee: function () {\n    this.base();\n    this.designer.tabGrid.removeItems(this.$insertion);\n    this.designer.tabGrid.addItems(this.$draggee);\n  },\n\n  /**\n   * On Drag\n   */\n  onDrag: function () {\n    this.checkForNewClosestItem();\n    this.base();\n  },\n\n  /**\n   * On Drag Stop\n   */\n  onDragStop: function () {\n    this.base();\n\n    // \"show\" the tab, but make it invisible\n    this.$draggee.css({\n      display: this.draggeeDisplay,\n      visibility: 'hidden',\n    });\n\n    this.$draggee.data('fld-tab').updatePositionInConfig();\n  },\n\n  /**\n   * Creates the caboose\n   */\n  createCaboose: function () {\n    let $caboose = $('<div class=\"fld-tab fld-tab-caboose\"/>').appendTo(\n      this.designer.$tabContainer\n    );\n    this.designer.tabGrid.addItems($caboose);\n    return $caboose;\n  },\n\n  /**\n   * Removes the caboose\n   */\n  removeCaboose: function () {\n    this.base();\n    this.designer.tabGrid.removeItems(this.$caboose);\n  },\n\n  /**\n   * Creates the insertion\n   */\n  createInsertion: function () {\n    let $tab = this.$draggee.find('.tab');\n\n    return $(`\n<div class=\"fld-tab fld-insertion\" style=\"height: ${this.$draggee.height()}px;\">\n  <div class=\"tabs\"><div class=\"tab sel draggable\" style=\"width: ${$tab.width()}px; height: ${$tab.height()}px;\"></div></div>\n  <div class=\"fld-tabcontent\" style=\"height: ${this.$draggee\n    .find('.fld-tabcontent')\n    .height()}px;\"></div>\n</div>\n`);\n  },\n});\n\nCraft.FieldLayoutDesigner.ElementDrag =\n  Craft.FieldLayoutDesigner.BaseDrag.extend({\n    draggingLibraryElement: false,\n    draggingField: false,\n    originalTab: null,\n\n    /**\n     * On Drag Start\n     */\n    onDragStart: function () {\n      this.base();\n\n      // Are we dragging an element from the library?\n      this.draggingLibraryElement = this.$draggee.hasClass('unused');\n\n      // Is it a field?\n      this.draggingField = this.$draggee.hasClass('fld-field');\n\n      // keep UI elements visible\n      if (this.draggingLibraryElement && !this.draggingField) {\n        this.$draggee.css({\n          display: this.draggeeDisplay,\n          visibility: 'visible',\n        });\n      }\n\n      // Swap the draggee with the insertion if dragging a selected item\n      if (!this.draggingLibraryElement) {\n        this.originalTab = this.$draggee.closest('.fld-tab').data('fld-tab');\n        this.swapDraggeeWithInsertion();\n      } else {\n        this.originalTab = null;\n      }\n\n      this.setMidpoints();\n    },\n\n    /**\n     * On Drag\n     */\n    onDrag: function () {\n      if (this.isDraggeeMandatory() || this.isHoveringOverTab()) {\n        this.checkForNewClosestItem();\n      } else if (this.showingInsertion) {\n        this.$insertion.remove();\n        this.$items = $().add(this.$items.not(this.$insertion));\n        this.showingInsertion = false;\n        this.designer.tabGrid.refreshCols(true);\n        this.setMidpoints();\n      }\n\n      this.base();\n    },\n\n    isDraggeeMandatory: function () {\n      return Garnish.hasAttr(this.$draggee, 'data-mandatory');\n    },\n\n    isHoveringOverTab: function () {\n      for (let i = 0; i < this.designer.tabGrid.$items.length; i++) {\n        if (\n          Garnish.hitTest(\n            this.mouseX,\n            this.mouseY,\n            this.designer.tabGrid.$items.eq(i)\n          )\n        ) {\n          return true;\n        }\n      }\n\n      return false;\n    },\n\n    findItems: function () {\n      // Return all of the used + unused fields\n      return this.designer.$tabContainer\n        .find('.fld-element')\n        .add(this.designer.$sidebar.find('.fld-element'));\n    },\n\n    /**\n     * Creates the caboose\n     */\n    createCaboose: function () {\n      let $caboose = $();\n      let $fieldContainers = this.designer.$tabContainer.find(\n        '> .fld-tab > .fld-tabcontent'\n      );\n\n      for (let i = 0; i < $fieldContainers.length; i++) {\n        $caboose = $caboose.add($('<div/>').appendTo($fieldContainers[i]));\n      }\n\n      return $caboose;\n    },\n\n    /**\n     * Creates the insertion\n     */\n    createInsertion: function () {\n      return $(\n        `<div class=\"fld-element fld-insertion\" style=\"height: ${this.$draggee.outerHeight()}px;\"/>`\n      );\n    },\n\n    /**\n     * On Drag Stop\n     */\n    onDragStop: function () {\n      let showingInsertion = this.showingInsertion;\n      if (showingInsertion) {\n        if (this.draggingLibraryElement) {\n          // Create a new element based on that one\n          const $element = this.$draggee.clone().removeClass('unused');\n\n          if (this.draggingField) {\n            // Hide the library field\n            this.$draggee\n              .css({visibility: 'inherit', display: 'field'})\n              .addClass('hidden');\n\n            // Hide the group too?\n            if (\n              this.$draggee.siblings('.fld-field:not(.hidden)').length === 0\n            ) {\n              this.$draggee.closest('.fld-field-group').addClass('hidden');\n            }\n          }\n\n          // Set this.$draggee to the clone, as if we were dragging that all along\n          this.$draggee = $element;\n\n          // Remember it for later\n          this.addItems($element);\n        }\n      } else if (!this.draggingLibraryElement) {\n        let $libraryElement = this.draggingField\n          ? this.designer.$fields.filter(\n              `[data-attribute=\"${this.$draggee.data('attribute')}\"]:first`\n            )\n          : this.designer.$uiLibraryElements.filter(\n              `[data-type=\"${this.$draggee.data('type')}\"]:first`\n            );\n\n        if (this.draggingField) {\n          // show the field in the library\n          $libraryElement.removeClass('hidden');\n          $libraryElement.closest('.fld-field-group').removeClass('hidden');\n        }\n\n        // Destroy the original element\n        this.$draggee.data('fld-element').destroy();\n\n        // Set this.$draggee to the library element, as if we were dragging that all along\n        this.$draggee = $libraryElement;\n      }\n\n      this.base();\n\n      this.$draggee.css({\n        display: this.draggeeDisplay,\n        visibility:\n          this.draggingField || showingInsertion ? 'hidden' : 'visible',\n      });\n\n      if (showingInsertion) {\n        const tab = this.$draggee.closest('.fld-tab').data('fld-tab');\n        let element;\n\n        if (this.draggingLibraryElement) {\n          element = tab.initElement(this.$draggee);\n        } else {\n          element = this.$draggee.data('fld-element');\n\n          // New tab?\n          if (tab !== this.originalTab) {\n            const config = element.config;\n\n            this.originalTab.updateConfig((config) => {\n              const index = element.index;\n              if (index === -1) {\n                return false;\n              }\n              config.elements.splice(index, 1);\n              return config;\n            });\n\n            this.$draggee.data('fld-element').tab = tab;\n            element.config = config;\n          }\n        }\n\n        element.updatePositionInConfig();\n      }\n    },\n  });\n","/** global: Craft */\n/** global: Garnish */\n/**\n * FieldToggle\n */\nCraft.FieldToggle = Garnish.Base.extend({\n  $toggle: null,\n  targetPrefix: null,\n  targetSelector: null,\n  reverseTargetSelector: null,\n\n  _$target: null,\n  _$reverseTarget: null,\n  type: null,\n\n  init: function (toggle) {\n    this.$toggle = $(toggle);\n\n    // Is this already a field toggle?\n    if (this.$toggle.data('fieldtoggle')) {\n      console.warn('Double-instantiating a field toggle on an element');\n      this.$toggle.data('fieldtoggle').destroy();\n    }\n\n    this.$toggle.data('fieldtoggle', this);\n\n    this.type = this.getType();\n\n    if (this.type === 'select' || this.type === 'fieldset') {\n      this.targetPrefix = this.$toggle.attr('data-target-prefix') || '';\n    } else {\n      this.targetSelector = this.normalizeTargetSelector(\n        this.$toggle.data('target')\n      );\n      this.reverseTargetSelector = this.normalizeTargetSelector(\n        this.$toggle.data('reverse-target')\n      );\n    }\n\n    this.findTargets();\n\n    switch (this.type) {\n      case 'link':\n        this.addListener(this.$toggle, 'click', 'onToggleChange');\n        break;\n      case 'fieldset':\n        this.addListener(\n          this.$toggle.find('input'),\n          'change',\n          'onToggleChange'\n        );\n        break;\n      default:\n        this.addListener(this.$toggle, 'change', 'onToggleChange');\n        this.onToggleChange();\n    }\n  },\n\n  normalizeTargetSelector: function (selector) {\n    if (selector && !selector.match(/^[#\\.]/)) {\n      selector = '#' + selector;\n    }\n\n    return selector;\n  },\n\n  getType: function () {\n    let nodeName = this.$toggle.prop('nodeName');\n    if (\n      (nodeName === 'INPUT' && this.$toggle.attr('type') === 'checkbox') ||\n      this.$toggle.attr('role') === 'checkbox' ||\n      this.$toggle.attr('role') === 'switch'\n    ) {\n      return 'checkbox';\n    }\n\n    switch (nodeName) {\n      case 'SELECT':\n        if (Garnish.hasAttr(this.$toggle, 'data-boolean-menu')) {\n          return 'booleanMenu';\n        }\n        return 'select';\n      case 'A':\n        return 'link';\n      default:\n        return 'fieldset';\n    }\n  },\n\n  findTargets: function () {\n    if (this.type === 'select' || this.type === 'fieldset') {\n      var toggleVal = this.getToggleVal();\n      this._$target = $(\n        this.normalizeTargetSelector(this.targetPrefix + this.getToggleVal())\n      );\n    } else {\n      if (this.targetSelector) {\n        this._$target = $(this.targetSelector);\n      }\n\n      if (this.reverseTargetSelector) {\n        this._$reverseTarget = $(this.reverseTargetSelector);\n      }\n    }\n  },\n\n  getToggleVal: function () {\n    switch (this.type) {\n      case 'checkbox':\n        if (typeof this.$toggle.prop('checked') !== 'undefined') {\n          return this.$toggle.prop('checked');\n        }\n        return this.$toggle.attr('aria-checked') === 'true';\n\n      case 'booleanMenu':\n        const boolean = this.$toggle.data('boolean');\n        if (typeof boolean !== 'undefined') {\n          return boolean;\n        }\n        const val = this.$toggle.val();\n        return val && val !== '0';\n\n      default:\n        let postVal;\n        if (this.type === 'fieldset') {\n          postVal = this.$toggle.find('input:checked:first').val();\n        } else {\n          postVal = Garnish.getInputPostVal(this.$toggle);\n        }\n\n        // Normalize the value\n        return typeof postVal === 'undefined' || postVal === null\n          ? null\n          : postVal.replace(/[^\\w]+/g, '-');\n    }\n  },\n\n  onToggleChange: function () {\n    if (this.type === 'select' || this.type === 'fieldset') {\n      this.hideTarget(this._$target);\n      this.findTargets();\n      this.showTarget(this._$target);\n    } else {\n      this.findTargets();\n\n      if (this.type === 'link') {\n        this.onToggleChange._show =\n          this.$toggle.hasClass('collapsed') ||\n          !this.$toggle.hasClass('expanded');\n      } else {\n        this.onToggleChange._show = !!this.getToggleVal();\n      }\n\n      if (this.onToggleChange._show) {\n        this.showTarget(this._$target);\n        this.hideTarget(this._$reverseTarget);\n      } else {\n        this.hideTarget(this._$target);\n        this.showTarget(this._$reverseTarget);\n      }\n\n      delete this.onToggleChange._show;\n    }\n  },\n\n  showTarget: function ($target) {\n    if ($target && $target.length) {\n      this.showTarget._currentHeight = $target.height();\n\n      $target.removeClass('hidden');\n\n      if (this.type !== 'select' && this.type !== 'fieldset') {\n        if (this.type === 'link') {\n          this.$toggle.removeClass('collapsed');\n          this.$toggle.addClass('expanded');\n        }\n\n        for (let i = 0; i < $target.length; i++) {\n          (($t) => {\n            if ($t.prop('nodeName') !== 'SPAN') {\n              $t.height('auto');\n              this.showTarget._targetHeight = $t.height();\n              $t.css({\n                height: this.showTarget._currentHeight,\n                overflow: 'hidden',\n              });\n\n              $t.velocity('stop');\n\n              $t.velocity(\n                {height: this.showTarget._targetHeight},\n                'fast',\n                function () {\n                  $t.css({\n                    height: '',\n                    overflow: '',\n                  });\n                }\n              );\n            }\n          })($target.eq(i));\n        }\n\n        delete this.showTarget._targetHeight;\n      }\n\n      delete this.showTarget._currentHeight;\n\n      // Trigger a resize event in case there are any grids in the target that need to initialize\n      Garnish.$win.trigger('resize');\n    }\n  },\n\n  hideTarget: function ($target) {\n    if ($target && $target.length) {\n      if (this.type === 'select' || this.type === 'fieldset') {\n        $target.addClass('hidden');\n      } else {\n        if (this.type === 'link') {\n          this.$toggle.removeClass('expanded');\n          this.$toggle.addClass('collapsed');\n        }\n\n        for (let i = 0; i < $target.length; i++) {\n          (($t) => {\n            if ($t.hasClass('hidden')) {\n              return;\n            }\n            if ($t.prop('nodeName') === 'SPAN') {\n              $t.addClass('hidden');\n            } else {\n              $t.css('overflow', 'hidden');\n              $t.velocity('stop');\n              $t.velocity({height: 0}, 'fast', function () {\n                $t.addClass('hidden');\n              });\n            }\n          })($target.eq(i));\n        }\n      }\n    }\n  },\n\n  destroy: function () {\n    this.$toggle.removeData('fieldtoggle');\n    this.base();\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\nCraft.Grid = Garnish.Base.extend(\n  {\n    $container: null,\n\n    $items: null,\n    items: null,\n    totalCols: null,\n    colGutterDrop: null,\n    colPctWidth: null,\n\n    possibleItemColspans: null,\n    possibleItemPositionsByColspan: null,\n\n    itemPositions: null,\n    itemColspansByPosition: null,\n\n    layouts: null,\n    layout: null,\n    itemHeights: null,\n    leftPadding: null,\n\n    _refreshingCols: false,\n    _refreshColsAfterRefresh: false,\n    _forceRefreshColsAfterRefresh: false,\n\n    init: function (container, settings) {\n      this.$container = $(container);\n\n      // Is this already a grid?\n      if (this.$container.data('grid')) {\n        console.warn('Double-instantiating a grid on an element');\n        this.$container.data('grid').destroy();\n      }\n\n      this.$container.data('grid', this);\n\n      this.setSettings(settings, Craft.Grid.defaults);\n\n      // Set the refreshCols() proxy that container resizes will trigger\n      this.handleContainerHeightProxy = () => {\n        this.refreshCols(false, true);\n      };\n\n      this.$items = this.$container.children(this.settings.itemSelector);\n      this.setItems();\n      this.refreshCols(true, false);\n\n      Garnish.$doc.ready(() => {\n        this.refreshCols(false, false);\n      });\n    },\n\n    addItems: function (items) {\n      this.$items = $().add(this.$items.add(items));\n      this.setItems();\n      this.refreshCols(true, true);\n    },\n\n    removeItems: function (items) {\n      this.$items = $().add(this.$items.not(items));\n      this.setItems();\n      this.refreshCols(true, true);\n    },\n\n    resetItemOrder: function () {\n      this.$items = $().add(this.$items);\n      this.setItems();\n      this.refreshCols(true, true);\n    },\n\n    setItems: function () {\n      this.setItems._ = {};\n\n      this.items = [];\n\n      for (\n        this.setItems._.i = 0;\n        this.setItems._.i < this.$items.length;\n        this.setItems._.i++\n      ) {\n        this.items.push($(this.$items[this.setItems._.i]));\n      }\n\n      delete this.setItems._;\n    },\n\n    refreshCols: function (force) {\n      if (this._refreshingCols) {\n        this._refreshColsAfterRefresh = true;\n        if (force) {\n          this._forceRefreshColsAfterRefresh = true;\n        }\n        return;\n      }\n\n      this._refreshingCols = true;\n\n      if (!this.items.length) {\n        this.completeRefreshCols();\n        return;\n      }\n\n      this.refreshCols._ = {};\n\n      // Check to see if the grid is actually visible\n      this.refreshCols._.oldHeight = this.$container[0].style.height;\n      this.$container[0].style.height = 1;\n      this.refreshCols._.scrollHeight = this.$container[0].scrollHeight;\n      this.$container[0].style.height = this.refreshCols._.oldHeight;\n\n      if (this.refreshCols._.scrollHeight === 0) {\n        this.completeRefreshCols();\n        return;\n      }\n\n      if (this.settings.cols) {\n        this.refreshCols._.totalCols = this.settings.cols;\n      } else {\n        this.refreshCols._.totalCols = Math.floor(\n          this.$container.width() / this.settings.minColWidth\n        );\n\n        // If we're adding a new column, require an extra 20 pixels in case a scrollbar shows up\n        if (\n          this.totalCols !== null &&\n          this.refreshCols._.totalCols > this.totalCols\n        ) {\n          this.refreshCols._.totalCols = Math.floor(\n            (this.$container.width() - 20) / this.settings.minColWidth\n          );\n        }\n\n        if (\n          this.settings.maxCols &&\n          this.refreshCols._.totalCols > this.settings.maxCols\n        ) {\n          this.refreshCols._.totalCols = this.settings.maxCols;\n        }\n      }\n\n      if (this.refreshCols._.totalCols === 0) {\n        this.refreshCols._.totalCols = 1;\n      }\n\n      // Same number of columns as before?\n      if (force !== true && this.totalCols === this.refreshCols._.totalCols) {\n        this.completeRefreshCols();\n        return;\n      }\n\n      this.totalCols = this.refreshCols._.totalCols;\n      this.colGutterDrop =\n        (this.settings.gutter * (this.totalCols - 1)) / this.totalCols;\n\n      // Temporarily stop listening to container resizes\n      this.removeListener(this.$container, 'resize');\n\n      if (this.settings.fillMode === 'grid') {\n        this.refreshCols._.itemIndex = 0;\n\n        while (this.refreshCols._.itemIndex < this.items.length) {\n          // Append the next X items and figure out which one is the tallest\n          this.refreshCols._.tallestItemHeight = -1;\n          this.refreshCols._.colIndex = 0;\n\n          for (\n            this.refreshCols._.i = this.refreshCols._.itemIndex;\n            this.refreshCols._.i <\n              this.refreshCols._.itemIndex + this.totalCols &&\n            this.refreshCols._.i < this.items.length;\n            this.refreshCols._.i++\n          ) {\n            this.refreshCols._.itemHeight = this.items[this.refreshCols._.i]\n              .height('auto')\n              .height();\n\n            if (\n              this.refreshCols._.itemHeight >\n              this.refreshCols._.tallestItemHeight\n            ) {\n              this.refreshCols._.tallestItemHeight =\n                this.refreshCols._.itemHeight;\n            }\n\n            this.refreshCols._.colIndex++;\n          }\n\n          if (this.settings.snapToGrid) {\n            this.refreshCols._.remainder =\n              this.refreshCols._.tallestItemHeight % this.settings.snapToGrid;\n\n            if (this.refreshCols._.remainder) {\n              this.refreshCols._.tallestItemHeight +=\n                this.settings.snapToGrid - this.refreshCols._.remainder;\n            }\n          }\n\n          // Now set their heights to the tallest one\n          for (\n            this.refreshCols._.i = this.refreshCols._.itemIndex;\n            this.refreshCols._.i <\n              this.refreshCols._.itemIndex + this.totalCols &&\n            this.refreshCols._.i < this.items.length;\n            this.refreshCols._.i++\n          ) {\n            this.items[this.refreshCols._.i].height(\n              this.refreshCols._.tallestItemHeight\n            );\n          }\n\n          // set the this.refreshCols._.itemIndex pointer to the next one up\n          this.refreshCols._.itemIndex += this.totalCols;\n        }\n      } else {\n        this.removeListener(this.$items, 'resize');\n\n        // If there's only one column, sneak out early\n        if (this.totalCols === 1) {\n          this.$container.height('auto');\n          this.$items\n            .show()\n            .css({\n              position: 'relative',\n              width: 'auto',\n              top: 0,\n            })\n            .css(Craft.left, 0);\n        } else {\n          this.$items.css('position', 'absolute');\n          this.colPctWidth = 100 / this.totalCols;\n\n          // The setup\n\n          this.layouts = [];\n\n          this.itemPositions = [];\n          this.itemColspansByPosition = [];\n\n          // Figure out all of the possible colspans for each item,\n          // as well as all the possible positions for each item at each of its colspans\n\n          this.possibleItemColspans = [];\n          this.possibleItemPositionsByColspan = [];\n          this.itemHeightsByColspan = [];\n\n          for (\n            this.refreshCols._.item = 0;\n            this.refreshCols._.item < this.items.length;\n            this.refreshCols._.item++\n          ) {\n            this.possibleItemColspans[this.refreshCols._.item] = [];\n            this.possibleItemPositionsByColspan[this.refreshCols._.item] = {};\n            this.itemHeightsByColspan[this.refreshCols._.item] = {};\n\n            this.refreshCols._.$item =\n              this.items[this.refreshCols._.item].show();\n            this.refreshCols._.positionRight =\n              this.refreshCols._.$item.data('position') === 'right';\n            this.refreshCols._.positionLeft =\n              this.refreshCols._.$item.data('position') === 'left';\n            this.refreshCols._.minColspan = this.refreshCols._.$item.data(\n              'colspan'\n            )\n              ? this.refreshCols._.$item.data('colspan')\n              : this.refreshCols._.$item.data('min-colspan')\n              ? this.refreshCols._.$item.data('min-colspan')\n              : 1;\n            this.refreshCols._.maxColspan = this.refreshCols._.$item.data(\n              'colspan'\n            )\n              ? this.refreshCols._.$item.data('colspan')\n              : this.refreshCols._.$item.data('max-colspan')\n              ? this.refreshCols._.$item.data('max-colspan')\n              : this.totalCols;\n\n            if (this.refreshCols._.minColspan > this.totalCols) {\n              this.refreshCols._.minColspan = this.totalCols;\n            }\n            if (this.refreshCols._.maxColspan > this.totalCols) {\n              this.refreshCols._.maxColspan = this.totalCols;\n            }\n\n            for (\n              this.refreshCols._.colspan = this.refreshCols._.minColspan;\n              this.refreshCols._.colspan <= this.refreshCols._.maxColspan;\n              this.refreshCols._.colspan++\n            ) {\n              // Get the height for this colspan\n              this.refreshCols._.$item.css(\n                'width',\n                this.getItemWidthCss(this.refreshCols._.colspan)\n              );\n              this.itemHeightsByColspan[this.refreshCols._.item][\n                this.refreshCols._.colspan\n              ] = this.refreshCols._.$item.outerHeight();\n\n              this.possibleItemColspans[this.refreshCols._.item].push(\n                this.refreshCols._.colspan\n              );\n              this.possibleItemPositionsByColspan[this.refreshCols._.item][\n                this.refreshCols._.colspan\n              ] = [];\n\n              if (this.refreshCols._.positionLeft) {\n                this.refreshCols._.minPosition = 0;\n                this.refreshCols._.maxPosition = 0;\n              } else if (this.refreshCols._.positionRight) {\n                this.refreshCols._.minPosition =\n                  this.totalCols - this.refreshCols._.colspan;\n                this.refreshCols._.maxPosition = this.refreshCols._.minPosition;\n              } else {\n                this.refreshCols._.minPosition = 0;\n                this.refreshCols._.maxPosition =\n                  this.totalCols - this.refreshCols._.colspan;\n              }\n\n              for (\n                this.refreshCols._.position = this.refreshCols._.minPosition;\n                this.refreshCols._.position <= this.refreshCols._.maxPosition;\n                this.refreshCols._.position++\n              ) {\n                this.possibleItemPositionsByColspan[this.refreshCols._.item][\n                  this.refreshCols._.colspan\n                ].push(this.refreshCols._.position);\n              }\n            }\n          }\n\n          // Find all the possible layouts\n\n          this.refreshCols._.colHeights = [];\n\n          for (\n            this.refreshCols._.i = 0;\n            this.refreshCols._.i < this.totalCols;\n            this.refreshCols._.i++\n          ) {\n            this.refreshCols._.colHeights.push(0);\n          }\n\n          this.createLayouts(0, [], [], this.refreshCols._.colHeights, 0);\n\n          // Now find the layout that looks the best.\n\n          // First find the layouts with the highest number of used columns\n          this.refreshCols._.layoutTotalCols = [];\n\n          for (\n            this.refreshCols._.i = 0;\n            this.refreshCols._.i < this.layouts.length;\n            this.refreshCols._.i++\n          ) {\n            this.refreshCols._.layoutTotalCols[this.refreshCols._.i] = 0;\n\n            for (\n              this.refreshCols._.j = 0;\n              this.refreshCols._.j < this.totalCols;\n              this.refreshCols._.j++\n            ) {\n              if (\n                this.layouts[this.refreshCols._.i].colHeights[\n                  this.refreshCols._.j\n                ]\n              ) {\n                this.refreshCols._.layoutTotalCols[this.refreshCols._.i]++;\n              }\n            }\n          }\n\n          this.refreshCols._.highestTotalCols = Math.max.apply(\n            null,\n            this.refreshCols._.layoutTotalCols\n          );\n\n          // Filter out the ones that aren't using as many columns as they could be\n          for (\n            this.refreshCols._.i = this.layouts.length - 1;\n            this.refreshCols._.i >= 0;\n            this.refreshCols._.i--\n          ) {\n            if (\n              this.refreshCols._.layoutTotalCols[this.refreshCols._.i] !==\n              this.refreshCols._.highestTotalCols\n            ) {\n              this.layouts.splice(this.refreshCols._.i, 1);\n            }\n          }\n\n          // Find the layout(s) with the least overall height\n          this.refreshCols._.layoutHeights = [];\n\n          for (\n            this.refreshCols._.i = 0;\n            this.refreshCols._.i < this.layouts.length;\n            this.refreshCols._.i++\n          ) {\n            this.refreshCols._.layoutHeights.push(\n              Math.max.apply(\n                null,\n                this.layouts[this.refreshCols._.i].colHeights\n              )\n            );\n          }\n\n          this.refreshCols._.shortestHeight = Math.min.apply(\n            null,\n            this.refreshCols._.layoutHeights\n          );\n          this.refreshCols._.shortestLayouts = [];\n          this.refreshCols._.emptySpaces = [];\n\n          for (\n            this.refreshCols._.i = 0;\n            this.refreshCols._.i < this.refreshCols._.layoutHeights.length;\n            this.refreshCols._.i++\n          ) {\n            if (\n              this.refreshCols._.layoutHeights[this.refreshCols._.i] ===\n              this.refreshCols._.shortestHeight\n            ) {\n              this.refreshCols._.shortestLayouts.push(\n                this.layouts[this.refreshCols._.i]\n              );\n\n              // Now get its total empty space, including any trailing empty space\n              this.refreshCols._.emptySpace =\n                this.layouts[this.refreshCols._.i].emptySpace;\n\n              for (\n                this.refreshCols._.j = 0;\n                this.refreshCols._.j < this.totalCols;\n                this.refreshCols._.j++\n              ) {\n                this.refreshCols._.emptySpace +=\n                  this.refreshCols._.shortestHeight -\n                  this.layouts[this.refreshCols._.i].colHeights[\n                    this.refreshCols._.j\n                  ];\n              }\n\n              this.refreshCols._.emptySpaces.push(\n                this.refreshCols._.emptySpace\n              );\n            }\n          }\n\n          // And the layout with the least empty space is...\n          this.layout =\n            this.refreshCols._.shortestLayouts[\n              $.inArray(\n                Math.min.apply(null, this.refreshCols._.emptySpaces),\n                this.refreshCols._.emptySpaces\n              )\n            ];\n\n          // Set the item widths and left positions\n          for (\n            this.refreshCols._.i = 0;\n            this.refreshCols._.i < this.items.length;\n            this.refreshCols._.i++\n          ) {\n            this.refreshCols._.css = {\n              width: this.getItemWidthCss(\n                this.layout.colspans[this.refreshCols._.i]\n              ),\n            };\n            this.refreshCols._.css[Craft.left] = this.getItemLeftPosCss(\n              this.layout.positions[this.refreshCols._.i]\n            );\n            this.items[this.refreshCols._.i].css(this.refreshCols._.css);\n          }\n\n          // If every item is at position 0, then let them lay out au naturel\n          if (this.isSimpleLayout()) {\n            this.$container.height('auto');\n            this.$items.css({\n              position: 'relative',\n              top: 0,\n              'margin-bottom': this.settings.gutter + 'px',\n            });\n          } else {\n            this.$items.css('position', 'absolute');\n\n            // Now position the items\n            this.positionItems();\n\n            // Update the positions as the items' heigthts change\n            this.addListener(this.$items, 'resize', 'onItemResize');\n          }\n        }\n      }\n\n      this.completeRefreshCols();\n\n      // Resume container resize listening\n      this.addListener(\n        this.$container,\n        'resize',\n        this.handleContainerHeightProxy\n      );\n\n      this.onRefreshCols();\n    },\n\n    completeRefreshCols: function () {\n      // Delete the internal variable object\n      if (typeof this.refreshCols._ !== 'undefined') {\n        delete this.refreshCols._;\n      }\n\n      this._refreshingCols = false;\n\n      if (this._refreshColsAfterRefresh) {\n        var force = this._forceRefreshColsAfterRefresh;\n        this._refreshColsAfterRefresh = false;\n        this._forceRefreshColsAfterRefresh = false;\n\n        Garnish.requestAnimationFrame(() => {\n          this.refreshCols(force);\n        });\n      }\n    },\n\n    getItemWidth: function (colspan) {\n      return this.colPctWidth * colspan;\n    },\n\n    getItemWidthCss: function (colspan) {\n      return (\n        'calc(' +\n        this.getItemWidth(colspan) +\n        '% - ' +\n        this.colGutterDrop +\n        'px)'\n      );\n    },\n\n    getItemWidthInPx: function (colspan) {\n      return (\n        (this.getItemWidth(colspan) / 100) * this.$container.width() -\n        this.colGutterDrop\n      );\n    },\n\n    getItemLeftPosCss: function (position) {\n      return (\n        'calc(' +\n        '(' +\n        this.getItemWidth(1) +\n        '% + ' +\n        (this.settings.gutter - this.colGutterDrop) +\n        'px) * ' +\n        position +\n        ')'\n      );\n    },\n\n    getItemLeftPosInPx: function (position) {\n      return (\n        ((this.getItemWidth(1) / 100) * this.$container.width() +\n          (this.settings.gutter - this.colGutterDrop)) *\n        position\n      );\n    },\n\n    createLayouts: function (\n      item,\n      prevPositions,\n      prevColspans,\n      prevColHeights,\n      prevEmptySpace\n    ) {\n      new Craft.Grid.LayoutGenerator(this).createLayouts(\n        item,\n        prevPositions,\n        prevColspans,\n        prevColHeights,\n        prevEmptySpace\n      );\n    },\n\n    isSimpleLayout: function () {\n      this.isSimpleLayout._ = {};\n\n      for (\n        this.isSimpleLayout._.i = 0;\n        this.isSimpleLayout._.i < this.layout.positions.length;\n        this.isSimpleLayout._.i++\n      ) {\n        if (this.layout.positions[this.isSimpleLayout._.i] !== 0) {\n          delete this.isSimpleLayout._;\n          return false;\n        }\n      }\n\n      delete this.isSimpleLayout._;\n      return true;\n    },\n\n    positionItems: function () {\n      this.positionItems._ = {};\n\n      this.positionItems._.colHeights = [];\n\n      for (\n        this.positionItems._.i = 0;\n        this.positionItems._.i < this.totalCols;\n        this.positionItems._.i++\n      ) {\n        this.positionItems._.colHeights.push(0);\n      }\n\n      for (\n        this.positionItems._.i = 0;\n        this.positionItems._.i < this.items.length;\n        this.positionItems._.i++\n      ) {\n        this.positionItems._.endingCol =\n          this.layout.positions[this.positionItems._.i] +\n          this.layout.colspans[this.positionItems._.i] -\n          1;\n        this.positionItems._.affectedColHeights = [];\n\n        for (\n          this.positionItems._.col =\n            this.layout.positions[this.positionItems._.i];\n          this.positionItems._.col <= this.positionItems._.endingCol;\n          this.positionItems._.col++\n        ) {\n          this.positionItems._.affectedColHeights.push(\n            this.positionItems._.colHeights[this.positionItems._.col]\n          );\n        }\n\n        this.positionItems._.top = Math.max.apply(\n          null,\n          this.positionItems._.affectedColHeights\n        );\n        if (this.positionItems._.top > 0) {\n          this.positionItems._.top += this.settings.gutter;\n        }\n\n        this.items[this.positionItems._.i].css('top', this.positionItems._.top);\n\n        // Now add the new heights to those columns\n        for (\n          this.positionItems._.col =\n            this.layout.positions[this.positionItems._.i];\n          this.positionItems._.col <= this.positionItems._.endingCol;\n          this.positionItems._.col++\n        ) {\n          this.positionItems._.colHeights[this.positionItems._.col] =\n            this.positionItems._.top +\n            this.itemHeightsByColspan[this.positionItems._.i][\n              this.layout.colspans[this.positionItems._.i]\n            ];\n        }\n      }\n\n      // Set the container height\n      this.$container.height(\n        Math.max.apply(null, this.positionItems._.colHeights)\n      );\n\n      delete this.positionItems._;\n    },\n\n    onItemResize: function (ev) {\n      this.onItemResize._ = {};\n\n      // Prevent this from bubbling up to the container, which has its own resize listener\n      ev.stopPropagation();\n\n      this.onItemResize._.item = $.inArray(ev.currentTarget, this.$items);\n\n      if (this.onItemResize._.item !== -1) {\n        // Update the height and reposition the items\n        this.onItemResize._.newHeight =\n          this.items[this.onItemResize._.item].outerHeight();\n\n        if (\n          this.onItemResize._.newHeight !==\n          this.itemHeightsByColspan[this.onItemResize._.item][\n            this.layout.colspans[this.onItemResize._.item]\n          ]\n        ) {\n          this.itemHeightsByColspan[this.onItemResize._.item][\n            this.layout.colspans[this.onItemResize._.item]\n          ] = this.onItemResize._.newHeight;\n          this.positionItems(false);\n        }\n      }\n\n      delete this.onItemResize._;\n    },\n\n    onRefreshCols: function () {\n      this.trigger('refreshCols');\n      this.settings.onRefreshCols();\n    },\n\n    destroy: function () {\n      this.$container.removeData('grid');\n      this.base();\n    },\n  },\n  {\n    defaults: {\n      itemSelector: '.item',\n      cols: null,\n      maxCols: null,\n      minColWidth: 320,\n      gutter: 14,\n      fillMode: 'top',\n      colClass: 'col',\n      snapToGrid: null,\n\n      onRefreshCols: $.noop,\n    },\n  }\n);\n\nCraft.Grid.LayoutGenerator = Garnish.Base.extend({\n  grid: null,\n  _: null,\n\n  init: function (grid) {\n    this.grid = grid;\n  },\n\n  createLayouts: function (\n    item,\n    prevPositions,\n    prevColspans,\n    prevColHeights,\n    prevEmptySpace\n  ) {\n    this._ = {};\n\n    // Loop through all possible colspans\n    for (\n      this._.c = 0;\n      this._.c < this.grid.possibleItemColspans[item].length;\n      this._.c++\n    ) {\n      this._.colspan = this.grid.possibleItemColspans[item][this._.c];\n\n      // Loop through all the possible positions for this colspan,\n      // and find the one that is closest to the top\n\n      this._.tallestColHeightsByPosition = [];\n\n      for (\n        this._.p = 0;\n        this._.p <\n        this.grid.possibleItemPositionsByColspan[item][this._.colspan].length;\n        this._.p++\n      ) {\n        this._.position =\n          this.grid.possibleItemPositionsByColspan[item][this._.colspan][\n            this._.p\n          ];\n\n        this._.colHeightsForPosition = [];\n        this._.endingCol = this._.position + this._.colspan - 1;\n\n        for (\n          this._.col = this._.position;\n          this._.col <= this._.endingCol;\n          this._.col++\n        ) {\n          this._.colHeightsForPosition.push(prevColHeights[this._.col]);\n        }\n\n        this._.tallestColHeightsByPosition[this._.p] = Math.max.apply(\n          null,\n          this._.colHeightsForPosition\n        );\n      }\n\n      // And the shortest position for this colspan is...\n      this._.p = $.inArray(\n        Math.min.apply(null, this._.tallestColHeightsByPosition),\n        this._.tallestColHeightsByPosition\n      );\n      this._.position =\n        this.grid.possibleItemPositionsByColspan[item][this._.colspan][\n          this._.p\n        ];\n\n      // Now log the colspan/position placement\n      this._.positions = prevPositions.slice(0);\n      this._.colspans = prevColspans.slice(0);\n      this._.colHeights = prevColHeights.slice(0);\n      this._.emptySpace = prevEmptySpace;\n\n      this._.positions.push(this._.position);\n      this._.colspans.push(this._.colspan);\n\n      // Add the new heights to those columns\n      this._.tallestColHeight = this._.tallestColHeightsByPosition[this._.p];\n      this._.endingCol = this._.position + this._.colspan - 1;\n\n      for (\n        this._.col = this._.position;\n        this._.col <= this._.endingCol;\n        this._.col++\n      ) {\n        this._.emptySpace +=\n          this._.tallestColHeight - this._.colHeights[this._.col];\n        this._.colHeights[this._.col] =\n          this._.tallestColHeight +\n          this.grid.itemHeightsByColspan[item][this._.colspan];\n      }\n\n      // If this is the last item, create the layout\n      if (item === this.grid.items.length - 1) {\n        this.grid.layouts.push({\n          positions: this._.positions,\n          colspans: this._.colspans,\n          colHeights: this._.colHeights,\n          emptySpace: this._.emptySpace,\n        });\n      } else {\n        // Dive deeper\n        this.grid.createLayouts(\n          item + 1,\n          this._.positions,\n          this._.colspans,\n          this._.colHeights,\n          this._.emptySpace\n        );\n      }\n    }\n\n    delete this._;\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Handle Generator\n */\nCraft.HandleGenerator = Craft.BaseInputGenerator.extend({\n  generateTargetValue: function (sourceVal) {\n    // Remove HTML tags\n    var handle = sourceVal.replace('/<(.*?)>/g', '');\n\n    // Remove inner-word punctuation\n    handle = handle.replace(/['\"‘’“”\\[\\]\\(\\)\\{\\}:]/g, '');\n\n    // Make it lowercase\n    handle = handle.toLowerCase();\n\n    // Convert extended ASCII characters to basic ASCII\n    handle = Craft.asciiString(handle);\n\n    if (!this.settings.allowNonAlphaStart) {\n      // Handle must start with a letter\n      handle = handle.replace(/^[^a-z]+/, '');\n    }\n\n    // Get the \"words\"\n    var words = Craft.filterArray(handle.split(/[^a-z0-9]+/));\n    handle = '';\n\n    if (Craft.handleCasing === 'snake') {\n      return words.join('_');\n    }\n\n    // Make it camelCase\n    for (let i = 0; i < words.length; i++) {\n      if (Craft.handleCasing !== 'pascal' && i === 0) {\n        handle += words[i];\n      } else {\n        handle += words[i].charAt(0).toUpperCase() + words[i].substring(1);\n      }\n    }\n\n    return handle;\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Image upload class for user photos, site icon and logo.\n */\nCraft.ImageUpload = Garnish.Base.extend(\n  {\n    $container: null,\n    progressBar: null,\n    uploader: null,\n\n    init: function (settings) {\n      this.setSettings(settings, Craft.ImageUpload.defaults);\n      this.initImageUpload();\n    },\n\n    initImageUpload: function () {\n      this.$container = $(this.settings.containerSelector);\n      this.progressBar = new Craft.ProgressBar(\n        $('<div class=\"progress-shade\"></div>').appendTo(this.$container)\n      );\n\n      var options = {\n        url: Craft.getActionUrl(this.settings.uploadAction),\n        formData: this.settings.postParameters,\n        fileInput: this.$container.find(this.settings.fileInputSelector),\n        paramName: this.settings.uploadParamName,\n      };\n\n      // If CSRF protection isn't enabled, these won't be defined.\n      if (\n        typeof Craft.csrfTokenName !== 'undefined' &&\n        typeof Craft.csrfTokenValue !== 'undefined'\n      ) {\n        // Add the CSRF token\n        options.formData[Craft.csrfTokenName] = Craft.csrfTokenValue;\n      }\n\n      options.events = {};\n      options.events.fileuploadstart = this._onUploadStart.bind(this);\n      options.events.fileuploadprogressall = this._onUploadProgress.bind(this);\n      options.events.fileuploaddone = this._onUploadComplete.bind(this);\n      options.events.fileuploadfail = this._onUploadFailure.bind(this);\n\n      this.uploader = new Craft.Uploader(this.$container, options);\n\n      this.initButtons();\n    },\n\n    initButtons: function () {\n      this.$container\n        .find(this.settings.uploadButtonSelector)\n        .on('click', (ev) => {\n          this.$container\n            .find(this.settings.fileInputSelector)\n            .trigger('click');\n        });\n\n      this.$container\n        .find(this.settings.deleteButtonSelector)\n        .on('click', (ev) => {\n          if (\n            confirm(\n              Craft.t('app', 'Are you sure you want to delete this image?')\n            )\n          ) {\n            $(ev.currentTarget)\n              .parent()\n              .append('<div class=\"blocking-modal\"></div>');\n\n            Craft.sendActionRequest('POST', this.settings.deleteAction, {\n              data: this.settings.postParameters,\n            }).then(({data}) => {\n              this.refreshImage(data);\n            });\n          }\n        });\n    },\n\n    refreshImage: function (response) {\n      $(this.settings.containerSelector).replaceWith(response.html);\n      this.settings.onAfterRefreshImage(response);\n      this.initImageUpload();\n    },\n\n    /**\n     * On upload start.\n     */\n    _onUploadStart: function (event) {\n      this.progressBar.$progressBar.css({\n        top: Math.round(this.$container.outerHeight() / 2) - 6,\n      });\n\n      this.$container.addClass('uploading');\n      this.progressBar.resetProgressBar();\n      this.progressBar.showProgressBar();\n    },\n\n    /**\n     * On upload progress.\n     */\n    _onUploadProgress: function (event, data) {\n      var progress = parseInt((data.loaded / data.total) * 100, 10);\n      this.progressBar.setProgressPercentage(progress);\n    },\n\n    /**\n     * On a file being uploaded.\n     */\n    _onUploadComplete: function (event, data) {\n      if (data.result.error) {\n        alert(data.result.error);\n      } else {\n        var html = $(data.result.html);\n        this.refreshImage(data.result);\n      }\n\n      // Last file\n      if (this.uploader.isLastUpload()) {\n        this.progressBar.hideProgressBar();\n        this.$container.removeClass('uploading');\n      }\n    },\n\n    /**\n     * On Upload Failure.\n     */\n    _onUploadFailure: function (event, data) {\n      const response = data.response();\n      let {message, filename} = response?.jqXHR?.responseJSON || {};\n\n      if (!message) {\n        message = filename\n          ? Craft.t('app', 'Upload failed for “{filename}”.', {filename})\n          : Craft.t('app', 'Upload failed.');\n      }\n\n      alert(message);\n      this.progressBar.hideProgressBar();\n      this.$container.removeClass('uploading');\n    },\n  },\n  {\n    defaults: {\n      postParameters: {},\n      uploadAction: '',\n      deleteAction: '',\n      fileInputSelector: '',\n\n      onAfterRefreshImage: $.noop,\n      containerSelector: null,\n\n      uploadButtonSelector: null,\n      deleteButtonSelector: null,\n\n      uploadParamName: 'files',\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Info icon class\n */\nCraft.InfoIcon = Garnish.Base.extend({\n  $container: null,\n  $icon: null,\n  $liveRegion: null,\n  content: null,\n  hud: null,\n\n  init: function (icon) {\n    this.$icon = $(icon);\n    this.$liveRegion = $('<span/>', {\n      role: 'status',\n      class: 'visually-hidden',\n    });\n\n    if (this.$icon.data('infoicon')) {\n      console.warn('Double-instantiating an info icon on an element');\n      this.content = this.$icon.data('infoicon').content;\n      this.$icon.data('infoicon').destroy();\n    } else {\n      this.content = this.$icon.html();\n      this.$icon\n        .html('')\n        .attr({\n          tabindex: 0,\n          role: 'button',\n          type: 'button',\n          'aria-label': Craft.t('app', 'More info'),\n        })\n        .wrap(\n          $('<span/>', {\n            class: 'infoicon-container',\n          })\n        );\n\n      this.$container = this.$icon.parent();\n      this.$container.append(this.$liveRegion);\n    }\n\n    this.$icon.data('infoicon', this);\n\n    if (\n      this.$icon[0].previousSibling &&\n      this.$icon[0].previousSibling.nodeType === Node.TEXT_NODE\n    ) {\n      // Make sure it's in a .nowrap container\n      const $parent = this.$icon.parent();\n      if (!$parent.hasClass('nowrap')) {\n        // Find the last word in the text\n        const m = this.$icon[0].previousSibling.nodeValue.match(/[^\\s\\-]+\\s*$/);\n        if (m) {\n          this.$icon[0].previousSibling.nodeValue =\n            this.$icon[0].previousSibling.nodeValue.substring(0, m.index);\n          $('<span/>', {\n            class: 'nowrap',\n            html: m[0].replace(/\\s+$/, '') + ' ',\n          })\n            .insertAfter(this.$icon[0].previousSibling)\n            .append(this.$icon);\n        }\n      }\n    }\n\n    this.addListener(this.$icon, 'click', (ev) => {\n      ev.preventDefault();\n      ev.stopPropagation();\n      this.showHud();\n    });\n\n    this.addListener(this.$icon, 'keydown', (ev) => {\n      if (\n        !(this.hud && this.hud.showing) &&\n        [Garnish.SPACE_KEY, Garnish.RETURN_KEY].includes(ev.keyCode)\n      ) {\n        ev.preventDefault();\n        ev.stopPropagation();\n        this.showHud();\n      }\n    });\n  },\n\n  showHud: function (ev) {\n    if (!this.hud) {\n      this.hud = new Garnish.HUD(this.$icon, this.content, {\n        hudClass: 'hud info-hud',\n        closeOtherHUDs: false,\n        onShow: () => {\n          Garnish.uiLayerManager.registerShortcut(Garnish.SPACE_KEY, () => {\n            this.hud.hide();\n          });\n\n          this.$liveRegion.html('');\n\n          setTimeout(() => {\n            this.$liveRegion.html(this.content);\n          }, 200);\n        },\n        onHide: () => {\n          this.$liveRegion.html('');\n        },\n      });\n      Craft.initUiElements(this.hud.$body);\n    } else {\n      this.hud.show();\n    }\n  },\n\n  destroy: function () {\n    this.$icon.removeData('infoicon');\n    this.base();\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Light Switch\n */\nCraft.LightSwitch = Garnish.Base.extend(\n  {\n    settings: null,\n    $outerContainer: null,\n    $innerContainer: null,\n    $input: null,\n    small: false,\n    on: false,\n    indeterminate: false,\n    dragger: null,\n\n    dragStartMargin: null,\n\n    init: function (outerContainer, settings) {\n      this.$outerContainer = $(outerContainer);\n\n      // Is this already a lightswitch?\n      if (this.$outerContainer.data('lightswitch')) {\n        console.warn('Double-instantiating a lightswitch on an element');\n        this.$outerContainer.data('lightswitch').destroy();\n      }\n\n      this.$outerContainer.data('lightswitch', this);\n\n      this.small = this.$outerContainer.hasClass('small');\n\n      this.setSettings(settings, Craft.LightSwitch.defaults);\n\n      this.$innerContainer = this.$outerContainer.find(\n        '.lightswitch-container:first'\n      );\n      this.$input = this.$outerContainer.find('input:first');\n\n      // If the input is disabled, go no further\n      if (this.$input.prop('disabled')) {\n        return;\n      }\n\n      this.on = this.$outerContainer.hasClass('on');\n      this.indeterminate = this.$outerContainer.hasClass('indeterminate');\n\n      this.addListener(this.$outerContainer, 'mousedown', '_onMouseDown');\n      this.addListener(this.$outerContainer, 'keydown', '_onKeyDown');\n\n      this.dragger = new Garnish.BaseDrag(this.$outerContainer, {\n        axis: Garnish.X_AXIS,\n        ignoreHandleSelector: null,\n        onDragStart: this._onDragStart.bind(this),\n        onDrag: this._onDrag.bind(this),\n        onDragStop: this._onDragStop.bind(this),\n      });\n\n      // Does the input have on/off labels?\n      let $wrapper = this.$outerContainer.parent(\n        '.lightswitch-inner-container'\n      );\n      if ($wrapper.length) {\n        this.addListener(\n          $wrapper.children('span[data-toggle=\"off\"]'),\n          'click',\n          this.turnOff\n        );\n        this.addListener(\n          $wrapper.children('span[data-toggle=\"on\"]'),\n          'click',\n          this.turnOn\n        );\n      }\n    },\n\n    turnOn: function (muteEvent) {\n      var changed = !this.on;\n\n      this.on = true;\n      this.indeterminate = false;\n\n      this.$outerContainer.addClass('dragging');\n\n      if (Garnish.prefersReducedMotion()) {\n        this.$innerContainer.css('margin-' + Craft.left, 0);\n      } else {\n        var animateCss = {};\n        animateCss['margin-' + Craft.left] = 0;\n        this.$innerContainer\n          .velocity('stop')\n          .velocity(\n            animateCss,\n            Craft.LightSwitch.animationDuration,\n            this._onSettle.bind(this)\n          );\n      }\n\n      this.$input.val(this.settings.value);\n      this.$outerContainer.addClass('on');\n      this.$outerContainer.removeClass('indeterminate');\n      this.$outerContainer.attr('aria-checked', 'true');\n\n      if (changed && muteEvent !== true) {\n        this.onChange();\n      }\n    },\n\n    turnOff: function (muteEvent) {\n      var changed = this.on || this.indeterminate;\n\n      this.on = false;\n      this.indeterminate = false;\n\n      this.$outerContainer.addClass('dragging');\n\n      if (Garnish.prefersReducedMotion()) {\n        this.$innerContainer.css('margin-' + Craft.left, this._getOffMargin());\n      } else {\n        var animateCss = {};\n        animateCss['margin-' + Craft.left] = this._getOffMargin();\n        this.$innerContainer\n          .velocity('stop')\n          .velocity(\n            animateCss,\n            Craft.LightSwitch.animationDuration,\n            this._onSettle.bind(this)\n          );\n      }\n\n      this.$input.val('');\n      this.$outerContainer.removeClass('on');\n      this.$outerContainer.removeClass('indeterminate');\n      this.$outerContainer.attr('aria-checked', 'false');\n\n      if (changed && muteEvent !== true) {\n        this.onChange();\n      }\n    },\n\n    turnIndeterminate: function (muteEvent) {\n      var changed = !this.indeterminate;\n\n      this.on = false;\n      this.indeterminate = true;\n\n      this.$outerContainer.addClass('dragging');\n      var animateCss = {};\n      animateCss['margin-' + Craft.left] = this._getOffMargin() / 2;\n      this.$innerContainer\n        .velocity('stop')\n        .velocity(\n          animateCss,\n          Craft.LightSwitch.animationDuration,\n          this._onSettle.bind(this)\n        );\n\n      this.$input.val(this.settings.indeterminateValue);\n      this.$outerContainer.removeClass('on');\n      this.$outerContainer.addClass('indeterminate');\n      this.$outerContainer.attr('aria-checked', 'mixed');\n\n      if (changed && muteEvent !== true) {\n        this.onChange();\n      }\n    },\n\n    toggle: function () {\n      if (this.indeterminate || !this.on) {\n        this.turnOn();\n      } else {\n        this.turnOff();\n      }\n    },\n\n    onChange: function () {\n      this.trigger('change');\n      this.settings.onChange(this.on);\n      this.$outerContainer.trigger('change');\n    },\n\n    _onMouseDown: function () {\n      this.addListener(Garnish.$doc, 'mouseup', '_onMouseUp');\n    },\n\n    _onMouseUp: function () {\n      this.removeListener(Garnish.$doc, 'mouseup');\n\n      // Was this a click?\n      if (!this.dragger.dragging) {\n        this.toggle();\n      }\n    },\n\n    _onKeyDown: function (event) {\n      switch (event.keyCode) {\n        case Garnish.SPACE_KEY: {\n          this.toggle();\n          event.preventDefault();\n          break;\n        }\n        case Garnish.RIGHT_KEY: {\n          if (Craft.orientation === 'ltr') {\n            this.turnOn();\n          } else {\n            this.turnOff();\n          }\n\n          event.preventDefault();\n          break;\n        }\n        case Garnish.LEFT_KEY: {\n          if (Craft.orientation === 'ltr') {\n            this.turnOff();\n          } else {\n            this.turnOn();\n          }\n\n          event.preventDefault();\n          break;\n        }\n      }\n    },\n\n    _getMargin: function () {\n      return parseInt(this.$innerContainer.css('margin-' + Craft.left));\n    },\n\n    _onDragStart: function () {\n      this.$outerContainer.addClass('dragging');\n      this.dragStartMargin = this._getMargin();\n    },\n\n    _onDrag: function () {\n      var margin;\n\n      if (Craft.orientation === 'ltr') {\n        margin = this.dragStartMargin + this.dragger.mouseDistX;\n      } else {\n        margin = this.dragStartMargin - this.dragger.mouseDistX;\n      }\n\n      if (margin < this._getOffMargin()) {\n        margin = this._getOffMargin();\n      } else if (margin > 0) {\n        margin = 0;\n      }\n\n      this.$innerContainer.css('margin-' + Craft.left, margin);\n    },\n\n    _onDragStop: function () {\n      var margin = this._getMargin();\n\n      if (margin > this._getOffMargin() / 2) {\n        this.turnOn();\n      } else {\n        this.turnOff();\n      }\n    },\n\n    _onSettle: function () {\n      this.$outerContainer.removeClass('dragging');\n    },\n\n    destroy: function () {\n      this.$outerContainer.removeData('lightswitch');\n      this.base();\n      this.dragger.destroy();\n    },\n\n    _getOffMargin: function () {\n      return this.small ? -10 : -12;\n    },\n  },\n  {\n    animationDuration: 100,\n    defaults: {\n      value: '1',\n      indeterminateValue: '-',\n      onChange: $.noop,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Listbox\n */\nCraft.Listbox = Garnish.Base.extend(\n  {\n    $container: null,\n    $options: null,\n    $selectedOption: null,\n    selectedOptionIndex: null,\n\n    init: function (container, settings) {\n      this.$container = $(container);\n      this.setSettings(settings, Craft.Listbox.defaults);\n\n      // Is this already a listbox?\n      if (this.$container.data('listbox')) {\n        console.warn('Double-instantiating a listbox on an element');\n        this.$container.data('listbox').destroy();\n      }\n\n      this.$container.data('listbox', this);\n      // todo: drop [role=option] in Craft 5\n      this.$options = this.$container.find('button,[role=option]');\n\n      // is there already a selected option?\n      // todo: drop [aria-selected=true] & attr normalization in Craft 5\n      this.$selectedOption = this.$options\n        .filter('[aria-pressed=true],[aria-selected=true]')\n        .removeAttr('aria-selected')\n        .attr('aria-pressed', 'true');\n      if (this.$selectedOption.length) {\n        this.selectedOptionIndex = this.$options.index(this.$selectedOption);\n      } else {\n        this.$selectedOption = null;\n      }\n\n      this.addListener(this.$options, 'click', (ev) => {\n        this.select(this.$options.index($(ev.currentTarget)));\n        ev.preventDefault();\n      });\n    },\n\n    select: function (index) {\n      if (\n        index < 0 ||\n        index >= this.$options.length ||\n        index === this.selectedOptionIndex\n      ) {\n        return;\n      }\n\n      if (this.$selectedOption) {\n        this.$selectedOption\n          .removeClass(this.settings.selectedClass)\n          .attr('aria-pressed', 'false');\n      }\n\n      this.$selectedOption = this.$options\n        .eq(index)\n        .addClass(this.settings.selectedClass)\n        .attr('aria-pressed', 'true');\n\n      this.selectedOptionIndex = index;\n\n      this.settings.onChange(this.$selectedOption, index);\n      this.trigger('change', {\n        $selectedOption: this.$selectedOption,\n        selectedOptionIndex: index,\n      });\n    },\n\n    disable: function () {\n      this.base();\n      this.$container.attr('aria-disabled', 'true');\n    },\n\n    enable: function () {\n      this.base();\n      this.$container.removeAttr('aria-disabled');\n    },\n\n    destroy: function () {\n      this.$container.removeData('listbox');\n      this.base();\n    },\n  },\n  {\n    defaults: {\n      selectedClass: 'active',\n      focusClass: 'focus',\n      onChange: $.noop,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Live Preview\n */\nCraft.LivePreview = Garnish.Base.extend(\n  {\n    $extraFields: null,\n    $trigger: null,\n    $shade: null,\n    $editorContainer: null,\n    $editor: null,\n    $dragHandle: null,\n    $previewContainer: null,\n    $iframeContainer: null,\n    $iframe: null,\n    $fieldPlaceholder: null,\n\n    previewUrl: null,\n    token: null,\n    basePostData: null,\n    inPreviewMode: false,\n    fields: null,\n    lastPostData: null,\n    updateIframeInterval: null,\n    loading: false,\n    checkAgain: false,\n\n    dragger: null,\n    dragStartEditorWidth: null,\n\n    _slideInOnIframeLoad: false,\n\n    _scrollX: null,\n    _scrollY: null,\n\n    _editorWidth: null,\n    _editorWidthInPx: null,\n\n    init: function (settings) {\n      this.setSettings(settings, Craft.LivePreview.defaults);\n\n      // Should preview requests use a specific URL?\n      // This won't affect how the request gets routed (the action param will override it),\n      // but it will allow the templates to change behavior based on the request URI.\n      if (this.settings.previewUrl) {\n        this.previewUrl = this.settings.previewUrl;\n      } else {\n        this.previewUrl = Craft.baseSiteUrl.replace(/\\/+$/, '') + '/';\n      }\n\n      // Load the preview over SSL if the current request is\n      if (document.location.protocol === 'https:') {\n        this.previewUrl = this.previewUrl.replace(/^http:/, 'https:');\n      }\n\n      // Set the base post data\n      this.basePostData = $.extend({}, this.settings.previewParams);\n\n      // Find the DOM elements\n      this.$extraFields = $(this.settings.extraFields);\n      this.$trigger = $(this.settings.trigger);\n      this.$fieldPlaceholder = $('<div/>');\n\n      // Set the initial editor width\n      this.editorWidth = Craft.getLocalStorage(\n        'LivePreview.editorWidth',\n        Craft.LivePreview.defaultEditorWidth\n      );\n\n      // Event Listeners\n      this.addListener(this.$trigger, 'activate', 'toggle');\n\n      Craft.cp.on('beforeSaveShortcut', () => {\n        if (this.inPreviewMode) {\n          this.moveFieldsBack();\n        }\n      });\n\n      Craft.Preview.instances.push(this);\n    },\n\n    get editorWidth() {\n      return this._editorWidth;\n    },\n\n    get editorWidthInPx() {\n      return this._editorWidthInPx;\n    },\n\n    set editorWidth(width) {\n      var inPx;\n\n      // Is this getting set in pixels?\n      if (width >= 1) {\n        inPx = width;\n        width /= Garnish.$win.width();\n      } else {\n        inPx = Math.round(width * Garnish.$win.width());\n      }\n\n      // Make sure it's no less than the minimum\n      if (inPx < Craft.LivePreview.minEditorWidthInPx) {\n        inPx = Craft.LivePreview.minEditorWidthInPx;\n        width = inPx / Garnish.$win.width();\n      }\n\n      this._editorWidth = width;\n      this._editorWidthInPx = inPx;\n    },\n\n    toggle: function () {\n      if (this.inPreviewMode) {\n        this.exit();\n      } else {\n        this.enter();\n      }\n    },\n\n    enter: function () {\n      if (this.inPreviewMode) {\n        return;\n      }\n\n      if (!this.token) {\n        this.createToken();\n        return;\n      }\n\n      this.trigger('beforeEnter');\n\n      $(document.activeElement).trigger('blur');\n\n      if (!this.$editor) {\n        this.$shade = $('<div/>', {class: 'modal-shade dark'}).appendTo(\n          Garnish.$bod\n        );\n        this.$previewContainer = $('<div/>', {\n          class: 'lp-preview-container',\n        }).appendTo(Garnish.$bod);\n        this.$iframeContainer = $('<div/>', {\n          class: 'lp-iframe-container',\n        }).appendTo(this.$previewContainer);\n        this.$editorContainer = $('<div/>', {\n          class: 'lp-editor-container',\n        }).appendTo(Garnish.$bod);\n\n        var $editorHeader = $('<header/>', {class: 'flex'}).appendTo(\n          this.$editorContainer\n        );\n        this.$editor = $('<form/>', {class: 'lp-editor'}).appendTo(\n          this.$editorContainer\n        );\n        this.$dragHandle = $('<div/>', {class: 'lp-draghandle'}).appendTo(\n          this.$editorContainer\n        );\n        var $closeBtn = $('<button/>', {\n          type: 'button',\n          class: 'btn',\n          text: Craft.t('app', 'Close Preview'),\n        }).appendTo($editorHeader);\n        $('<div/>', {class: 'flex-grow'}).appendTo($editorHeader);\n        let $saveBtn = $('<button/>', {\n          type: 'button',\n          class: 'btn submit',\n          text: Craft.t('app', 'Save'),\n        }).appendTo($editorHeader);\n\n        this.dragger = new Garnish.BaseDrag(this.$dragHandle, {\n          axis: Garnish.X_AXIS,\n          onDragStart: this._onDragStart.bind(this),\n          onDrag: this._onDrag.bind(this),\n          onDragStop: this._onDragStop.bind(this),\n        });\n\n        this.addListener($closeBtn, 'click', 'exit');\n        this.addListener($saveBtn, 'click', 'save');\n      }\n\n      // Set the sizes\n      this.handleWindowResize();\n      this.addListener(Garnish.$win, 'resize', 'handleWindowResize');\n\n      this.$editorContainer.css(Craft.left, -this.editorWidthInPx + 'px');\n      this.$previewContainer.css(Craft.right, -this.getIframeWidth());\n\n      // Move all the fields into the editor rather than copying them\n      // so any JS that's referencing the elements won't break.\n      this.fields = [];\n      var $fields = $(this.settings.fields);\n\n      for (var i = 0; i < $fields.length; i++) {\n        var $field = $($fields[i]),\n          $clone = this._getClone($field);\n\n        // It's important that the actual field is added to the DOM *after* the clone,\n        // so any radio buttons in the field get deselected from the clone rather than the actual field.\n        this.$fieldPlaceholder.insertAfter($field);\n        $field.detach();\n        this.$fieldPlaceholder.replaceWith($clone);\n        $field.appendTo(this.$editor);\n\n        this.fields.push({\n          $field: $field,\n          $clone: $clone,\n        });\n      }\n\n      if (this.updateIframe()) {\n        this._slideInOnIframeLoad = true;\n      } else {\n        this.slideIn();\n      }\n\n      Craft.ElementThumbLoader.retryAll();\n\n      Garnish.uiLayerManager.addLayer(this.$sidebar);\n      Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n        this.exit();\n      });\n\n      this.inPreviewMode = true;\n      this.trigger('enter');\n    },\n\n    createToken: function () {\n      const data = {previewAction: this.settings.previewAction};\n      Craft.sendActionRequest('POST', 'live-preview/create-token', {data}).then(\n        (response) => {\n          this.token = response.data.token;\n          this.enter();\n        }\n      );\n    },\n\n    save: function () {\n      Craft.cp.submitPrimaryForm();\n    },\n\n    handleWindowResize: function () {\n      // Reset the width so the min width is enforced\n      this.editorWidth = this.editorWidth;\n\n      // Update the editor/iframe sizes\n      this.updateWidths();\n    },\n\n    slideIn: function () {\n      $('html').addClass('noscroll');\n      this.$shade.velocity('fadeIn');\n\n      this.$editorContainer\n        .show()\n        .velocity('stop')\n        .animateLeft(0, 'slow', () => {\n          this.trigger('slideIn');\n          Garnish.$win.trigger('resize');\n        });\n\n      this.$previewContainer\n        .show()\n        .velocity('stop')\n        .animateRight(0, 'slow', () => {\n          this.updateIframeInterval = setInterval(\n            this.updateIframe.bind(this),\n            1000\n          );\n        });\n    },\n\n    exit: function () {\n      if (!this.inPreviewMode) {\n        return;\n      }\n\n      this.trigger('beforeExit');\n\n      $('html').removeClass('noscroll');\n\n      this.removeListener(Garnish.$win, 'resize');\n      Garnish.uiLayerManager.removeLayer();\n\n      if (this.updateIframeInterval) {\n        clearInterval(this.updateIframeInterval);\n      }\n\n      this.moveFieldsBack();\n\n      this.$shade.delay(200).velocity('fadeOut');\n\n      this.$editorContainer\n        .velocity('stop')\n        .animateLeft(-this.editorWidthInPx, 'slow', () => {\n          for (var i = 0; i < this.fields.length; i++) {\n            this.fields[i].$newClone.remove();\n          }\n          this.$editorContainer.hide();\n          this.trigger('slideOut');\n        });\n\n      this.$previewContainer\n        .velocity('stop')\n        .animateRight(-this.getIframeWidth(), 'slow', () => {\n          this.$previewContainer.hide();\n        });\n\n      Craft.ElementThumbLoader.retryAll();\n\n      this.inPreviewMode = false;\n      this.trigger('exit');\n    },\n\n    moveFieldsBack: function () {\n      for (var i = 0; i < this.fields.length; i++) {\n        var field = this.fields[i];\n        field.$newClone = this._getClone(field.$field);\n\n        // It's important that the actual field is added to the DOM *after* the clone,\n        // so any radio buttons in the field get deselected from the clone rather than the actual field.\n        this.$fieldPlaceholder.insertAfter(field.$field);\n        field.$field.detach();\n        this.$fieldPlaceholder.replaceWith(field.$newClone);\n        field.$clone.replaceWith(field.$field);\n      }\n\n      Garnish.$win.trigger('resize');\n    },\n\n    getIframeWidth: function () {\n      return Garnish.$win.width() - this.editorWidthInPx;\n    },\n\n    updateWidths: function () {\n      this.$editorContainer.css('width', this.editorWidthInPx + 'px');\n      this.$previewContainer.width(this.getIframeWidth());\n    },\n\n    updateIframe: function (force) {\n      if (force) {\n        this.lastPostData = null;\n      }\n\n      if (!this.inPreviewMode) {\n        return false;\n      }\n\n      if (this.loading) {\n        this.checkAgain = true;\n        return false;\n      }\n\n      // Has the post data changed?\n      var postData = $.extend(\n        Garnish.getPostData(this.$editor),\n        Garnish.getPostData(this.$extraFields)\n      );\n\n      if (\n        !this.lastPostData ||\n        !Craft.compare(postData, this.lastPostData, false)\n      ) {\n        this.lastPostData = postData;\n        this.loading = true;\n\n        var $doc = this.$iframe\n          ? $(this.$iframe[0].contentWindow.document)\n          : null;\n\n        this._scrollX = $doc ? $doc.scrollLeft() : 0;\n        this._scrollY = $doc ? $doc.scrollTop() : 0;\n\n        $.ajax({\n          url:\n            this.previewUrl +\n            (this.previewUrl.indexOf('?') !== -1 ? '&' : '?') +\n            Craft.tokenParam +\n            '=' +\n            this.token,\n          method: 'POST',\n          data: $.extend({}, postData, this.basePostData),\n          headers: {\n            'X-Craft-Token': this.token,\n          },\n          xhrFields: {\n            withCredentials: true,\n          },\n          crossDomain: true,\n          success: this.handleSuccess.bind(this),\n          error: this.handleError.bind(this),\n        });\n\n        return true;\n      } else {\n        return false;\n      }\n    },\n\n    forceUpdateIframe: function () {\n      return this.updateIframe(true);\n    },\n\n    handleSuccess: function (data) {\n      var html =\n        data +\n        '<script type=\"text/javascript\">window.scrollTo(' +\n        this._scrollX +\n        ', ' +\n        this._scrollY +\n        ');</script>';\n\n      // Create a new iframe\n      var $iframe = $('<iframe class=\"lp-preview\" frameborder=\"0\"/>');\n      if (this.$iframe) {\n        $iframe.insertBefore(this.$iframe);\n      } else {\n        $iframe.appendTo(this.$iframeContainer);\n      }\n\n      this.addListener($iframe, 'load', function () {\n        if (this.$iframe) {\n          this.$iframe.remove();\n        }\n        this.$iframe = $iframe;\n\n        if (this._slideInOnIframeLoad) {\n          this.slideIn();\n          this._slideInOnIframeLoad = false;\n        }\n\n        this.removeListener($iframe, 'load');\n      });\n\n      Garnish.requestAnimationFrame(() => {\n        $iframe[0].contentWindow.document.open();\n        $iframe[0].contentWindow.document.write(html);\n        $iframe[0].contentWindow.document.close();\n        this.onResponse();\n      });\n    },\n\n    handleError: function () {\n      this.onResponse();\n    },\n\n    onResponse: function () {\n      this.loading = false;\n\n      if (this.checkAgain) {\n        this.checkAgain = false;\n        this.updateIframe();\n      }\n    },\n\n    _getClone: function ($field) {\n      var $clone = $field.clone();\n\n      // clone() won't account for input values that have changed since the original HTML set them\n      Garnish.copyInputValues($field, $clone);\n\n      // Remove any id= attributes\n      $clone.attr('id', '');\n      $clone.find('[id]').attr('id', '');\n\n      return $clone;\n    },\n\n    _onDragStart: function () {\n      this.dragStartEditorWidth = this.editorWidthInPx;\n      this.$previewContainer.addClass('dragging');\n    },\n\n    _onDrag: function () {\n      if (Craft.orientation === 'ltr') {\n        this.editorWidth = this.dragStartEditorWidth + this.dragger.mouseDistX;\n      } else {\n        this.editorWidth = this.dragStartEditorWidth - this.dragger.mouseDistX;\n      }\n\n      this.updateWidths();\n    },\n\n    _onDragStop: function () {\n      this.$previewContainer.removeClass('dragging');\n      Craft.setLocalStorage('LivePreview.editorWidth', this.editorWidth);\n    },\n\n    destroy: function () {\n      Craft.Preview.instances = Craft.Preview.instances.filter(\n        (o) => o !== this\n      );\n      this.base();\n    },\n  },\n  {\n    defaultEditorWidth: 0.33,\n    minEditorWidthInPx: 320,\n    instances: [],\n\n    defaults: {\n      trigger: '.livepreviewbtn',\n      fields: null,\n      extraFields: null,\n      previewUrl: null,\n      previewAction: null,\n      previewParams: {},\n    },\n  }\n);\n\nCraft.LivePreview.init = function (settings) {\n  Craft.livePreview = new Craft.LivePreview(settings);\n};\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Password Input\n */\nCraft.PasswordInput = Garnish.Base.extend(\n  {\n    $passwordWrapper: null,\n    $passwordInput: null,\n    $textInput: null,\n    $currentInput: null,\n\n    $showPasswordToggle: null,\n    showingPassword: null,\n\n    init: function (passwordInput, settings) {\n      this.$passwordInput = $(passwordInput);\n      this.$passwordWrapper = this.$passwordInput.parent('.passwordwrapper');\n      this.settings = $.extend({}, Craft.PasswordInput.defaults, settings);\n\n      // Is this already a password input?\n      if (this.$passwordInput.data('passwordInput')) {\n        console.warn('Double-instantiating a password input on an element');\n        this.$passwordInput.data('passwordInput').destroy();\n      }\n\n      this.$passwordInput.data('passwordInput', this);\n\n      this.$showPasswordToggle = $(\n        '<button type=\"button\" class=\"invisible\" />'\n      );\n      this.$showPasswordToggle.addClass('password-toggle');\n      this.$showPasswordToggle.insertAfter(this.$passwordInput);\n\n      this.initInputFocusEvents(this.$passwordInput);\n      this.addListener(this.$showPasswordToggle, 'click', 'onClick');\n      this.hidePassword();\n\n      this.addListener(\n        this.$passwordWrapper.closest('form'),\n        'submit',\n        'hidePassword'\n      );\n    },\n\n    setCurrentInput: function ($input) {\n      if (this.$currentInput) {\n        // Swap the inputs, while preventing the focus animation\n        $input.insertAfter(this.$currentInput);\n        this.$currentInput.detach();\n        $input.trigger('focus');\n\n        // Restore the input value\n        $input.val(this.$currentInput.val());\n      }\n\n      this.$currentInput = $input;\n\n      this.addListener(\n        this.$currentInput,\n        'keypress,keyup,change,blur',\n        'onInputChange'\n      );\n    },\n\n    updateToggleLabel: function (label) {\n      this.$showPasswordToggle.text(label);\n    },\n\n    initInputFocusEvents: function ($input) {\n      this.addListener($input, 'focus', function () {\n        this.$passwordWrapper.addClass('focus');\n      });\n      this.addListener($input, 'blur', function () {\n        this.$passwordWrapper.removeClass('focus');\n      });\n    },\n\n    showPassword: function () {\n      if (this.showingPassword) {\n        return;\n      }\n\n      if (!this.$textInput) {\n        this.$textInput = this.$passwordInput.clone(true);\n        this.$textInput.attr({\n          type: 'text',\n          autocapitalize: 'off',\n        });\n        this.initInputFocusEvents(this.$textInput);\n      }\n\n      this.setCurrentInput(this.$textInput);\n      this.updateToggleLabel(Craft.t('app', 'Hide'));\n      this.showingPassword = true;\n    },\n\n    hidePassword: function () {\n      // showingPassword could be null, which is acceptable\n      if (this.showingPassword === false) {\n        return;\n      }\n\n      this.setCurrentInput(this.$passwordInput);\n      this.updateToggleLabel(Craft.t('app', 'Show'));\n      this.showingPassword = false;\n    },\n\n    togglePassword: function () {\n      if (this.showingPassword) {\n        this.hidePassword();\n      } else {\n        this.showPassword();\n      }\n\n      this.settings.onToggleInput(this.$currentInput);\n    },\n\n    onInputChange: function () {\n      if (this.$currentInput.val()) {\n        this.$showPasswordToggle.removeClass('invisible');\n      } else {\n        this.$showPasswordToggle.addClass('invisible');\n      }\n    },\n\n    onClick: function (ev) {\n      if (this.$currentInput[0].setSelectionRange) {\n        var selectionStart = this.$currentInput[0].selectionStart,\n          selectionEnd = this.$currentInput[0].selectionEnd;\n\n        this.togglePassword();\n        this.$currentInput[0].setSelectionRange(selectionStart, selectionEnd);\n      } else {\n        this.togglePassword();\n      }\n    },\n\n    destroy: function () {\n      this.$passwordInput.removeData('passwordInput');\n      this.base();\n    },\n  },\n  {\n    defaults: {\n      onToggleInput: $.noop,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Preview\n */\nCraft.Preview = Garnish.Base.extend(\n  {\n    elementEditor: null,\n\n    $shade: null,\n    $editorContainer: null,\n    $editor: null,\n    $spinner: null,\n    $statusIcon: null,\n    $dragHandle: null,\n    $previewWrapper: null,\n    $previewContainer: null,\n    $previewSkipLink: null,\n    $bumperLink: null,\n    $notifier: null,\n    $iframeContainer: null,\n    $previewHeader: null,\n    $targetBtn: null,\n    $targetMenu: null,\n    $deviceTypeContainer: null,\n    $orientationBtn: null,\n    $refreshBtn: null,\n    $deviceMask: null,\n    $devicePreviewContainer: null,\n    $iframe: null,\n    iframeLoaded: false,\n    $tempInput: null,\n    $fieldPlaceholder: null,\n\n    isActive: false,\n    isVisible: false,\n    activeTarget: 0,\n\n    animationDuration: 'slow',\n\n    currentDeviceType: 'desktop',\n    deviceOrientation: null,\n    deviceWidth: '',\n    deviceHeight: '',\n    deviceMaskDimensions: {\n      phone: {\n        width: 375,\n        height: 753,\n      },\n      tablet: {\n        width: 768,\n        height: 1110,\n      },\n    },\n\n    draftId: null,\n    url: null,\n    fields: null,\n\n    iframeHeight: null,\n    scrollTop: null,\n\n    dragger: null,\n    dragStartEditorWidth: null,\n\n    _updateIframeProxy: null,\n\n    _editorWidth: null,\n    _editorWidthInPx: null,\n\n    init: function (elementEditor) {\n      this.elementEditor = elementEditor;\n\n      this._updateIframeProxy = this.updateIframe.bind(this);\n\n      this.$tempInput = $('<input/>', {\n        type: 'hidden',\n        name: '__PREVIEW_FIELDS__',\n        value: '1',\n      });\n      this.$fieldPlaceholder = $('<div/>');\n\n      // Set the initial editor width\n      this.editorWidth = Craft.getLocalStorage(\n        'LivePreview.editorWidth',\n        Craft.Preview.defaultEditorWidth\n      );\n\n      Craft.Preview.instances.push(this);\n    },\n\n    get editorWidth() {\n      return this._editorWidth;\n    },\n\n    get editorWidthInPx() {\n      return this._editorWidthInPx;\n    },\n\n    set editorWidth(width) {\n      var inPx;\n\n      // Is this getting set in pixels?\n      if (width >= 1) {\n        inPx = width;\n        width /= Garnish.$win.width();\n      } else {\n        inPx = Math.round(width * Garnish.$win.width());\n      }\n\n      // Make sure it's no less than the minimum\n      if (inPx < Craft.Preview.minEditorWidthInPx) {\n        inPx = Craft.Preview.minEditorWidthInPx;\n        width = inPx / Garnish.$win.width();\n      }\n\n      this._editorWidth = width;\n      this._editorWidthInPx = inPx;\n    },\n\n    open: function () {\n      if (this.isActive) {\n        return;\n      }\n\n      this.isActive = true;\n      this.trigger('beforeOpen');\n\n      $(document.activeElement).trigger('blur');\n\n      if (!this.$editor) {\n        const previewSkipLinkText = Craft.t('app', 'Skip to {title}', {\n          title: Craft.t('app', 'Top of preview'),\n        });\n\n        this.$shade = $('<div/>', {class: 'modal-shade dark'}).appendTo(\n          Garnish.$bod\n        );\n        this.$previewWrapper = $('<div/>', {\n          role: 'dialog',\n          'aria-modal': 'true',\n          'aria-labelledby': 'lp-preview-heading',\n        }).appendTo(Garnish.$bod);\n        this.$modalLabel = $('<h2/>', {\n          id: 'lp-preview-heading',\n          class: 'visually-hidden',\n          html: Craft.t('app', 'Preview'),\n        }).appendTo(this.$previewWrapper);\n        this.$editorContainer = $('<div/>', {\n          class: 'lp-editor-container',\n        }).appendTo(this.$previewWrapper);\n        this.$previewContainer = $('<div/>', {\n          class: 'lp-preview-container',\n          id: 'lp-preview-container',\n        }).appendTo(this.$previewWrapper);\n        this.$notifier = $('<span/>', {\n          class: 'visually-hidden',\n          'aria-live': 'assertive',\n        }).appendTo(this.$previewContainer);\n\n        var $editorHeader = $('<header/>', {class: 'flex'}).appendTo(\n          this.$editorContainer\n        );\n        this.$editor = $('<form/>', {class: 'lp-editor'}).appendTo(\n          this.$editorContainer\n        );\n        this.$dragHandle = $('<div/>', {class: 'lp-draghandle'}).appendTo(\n          this.$editorContainer\n        );\n        var $closeBtn = $('<button/>', {\n          type: 'button',\n          class: 'btn',\n          text: Craft.t('app', 'Close Preview'),\n        }).appendTo($editorHeader);\n        $('<div/>', {class: 'flex-grow'}).appendTo($editorHeader);\n        this.$spinner = $('<div/>', {\n          class: 'spinner hidden',\n          title: Craft.t('app', 'Saving'),\n        }).appendTo($editorHeader);\n        this.$statusIcon = $('<div/>', {class: 'invisible'}).appendTo(\n          $editorHeader\n        );\n        this.$statusMessage = $('<span/>', {\n          class: 'visually-hidden',\n          'aria-live': 'polite',\n        }).appendTo($editorHeader);\n        this.$previewSkipLink = $('<a/>', {\n          class: 'skip-link btn',\n          href: '#lp-preview-container',\n          html: previewSkipLinkText,\n        }).appendTo($editorHeader);\n\n        if (Craft.Pro) {\n          this.$previewHeader = $('<header/>', {\n            class: 'lp-preview-header',\n          }).appendTo(this.$previewContainer);\n\n          // Preview targets\n          if (this.elementEditor.settings.previewTargets.length > 1) {\n            this.$targetBtn = $('<button/>', {\n              type: 'button',\n              class: 'btn menubtn',\n              text: this.elementEditor.settings.previewTargets[0].label,\n            }).appendTo(this.$previewHeader);\n            this.$targetMenu = $('<div/>', {\n              class: 'menu lp-target-menu',\n            }).insertAfter(this.$targetBtn);\n            const $ul = $('<ul/>', {class: 'padded'}).appendTo(\n              this.$targetMenu\n            );\n            let $li, $a;\n            for (\n              let i = 0;\n              i < this.elementEditor.settings.previewTargets.length;\n              i++\n            ) {\n              $li = $('<li/>').appendTo($ul);\n              $a = $('<a/>', {\n                data: {target: i},\n                text: this.elementEditor.settings.previewTargets[i].label,\n                class: i === 0 ? 'sel' : null,\n              }).appendTo($li);\n            }\n            new Garnish.MenuBtn(this.$targetBtn, {\n              onOptionSelect: (option) => {\n                this.switchTarget($(option).data('target'));\n              },\n            });\n\n            $('<div class=\"flex-grow\"/>').appendTo(this.$previewHeader);\n          }\n\n          this._buildDeviceTypeFieldset();\n\n          $('<div class=\"flex-grow\"/>').appendTo(this.$previewHeader);\n          const $buttonContainer = $('<div class=\"buttons\"/>').appendTo(\n            this.$previewHeader\n          );\n\n          // Orientation toggle\n          this.$orientationBtn = $('<button/>', {\n            type: 'button',\n            class: 'btn disabled',\n            'data-icon': 'rotate',\n            'aria-disabled': 'true',\n            text: Craft.t('app', 'Rotate'),\n            'aria-label': Craft.t('app', 'Rotate'),\n          }).appendTo($buttonContainer);\n          this.addListener(this.$orientationBtn, 'click', 'switchOrientation');\n\n          // Refresh button\n          this.$refreshBtn = $('<button/>', {\n            type: 'button',\n            class: 'btn',\n            text: Craft.t('app', 'Refresh'),\n            'data-icon': 'refresh',\n          }).appendTo($buttonContainer);\n          this.addListener(this.$refreshBtn, 'click', () => {\n            this.updateIframe(false, true);\n          });\n\n          // Get the last stored orientation\n          this.deviceOrientation = Craft.getLocalStorage(\n            'LivePreview.orientation'\n          );\n        }\n\n        this.$iframeContainer = $('<div/>', {\n          class: 'lp-iframe-container',\n        }).appendTo(this.$previewContainer);\n        this.$devicePreviewContainer = $('<div/>', {\n          class: 'lp-device-preview-container',\n        }).appendTo(this.$iframeContainer);\n        this.$deviceMask = $('<div/>', {\n          class: 'lp-device-mask',\n        }).appendTo(this.$iframeContainer);\n\n        /* Prevents focus trap bug caused by iframe as last element */\n        this.$bumperLink = $('<a/>', {\n          class: 'skip-link btn lp-preview-container__bumper-link',\n          html: previewSkipLinkText,\n          href: '#lp-preview-container',\n        });\n        this.$bumperLink.appendTo(this.$previewContainer);\n\n        this.dragger = new Garnish.BaseDrag(this.$dragHandle, {\n          axis: Garnish.X_AXIS,\n          onDragStart: this._onDragStart.bind(this),\n          onDrag: this._onDrag.bind(this),\n          onDragStop: this._onDragStop.bind(this),\n        });\n\n        this.addListener($closeBtn, 'click', 'close');\n        this.addListener(this.$statusIcon, 'click', () => {\n          this.elementEditor.showStatusHud(this.$statusIcon);\n        });\n      }\n\n      // Set the sizes\n      this.handleWindowResize();\n      this.addListener(Garnish.$win, 'resize', 'handleWindowResize');\n\n      this.$editorContainer.css(Craft.left, -this.editorWidthInPx + 'px');\n      this.$previewContainer.css(Craft.right, -this.getIframeWidth());\n\n      // Find the fields, excluding nested fields\n      this.fields = [];\n      var $fields = $('#content .field').not($('#content .field .field'));\n\n      if ($fields.length) {\n        // Insert our temporary input before the first field so we know where to swap in the serialized form values\n        this.$tempInput.insertBefore($fields.get(0));\n\n        // Move all the fields into the editor rather than copying them\n        // so any JS that's referencing the elements won't break.\n        for (let i = 0; i < $fields.length; i++) {\n          let $field = $($fields[i]),\n            $clone = this._getClone($field);\n\n          // It's important that the actual field is added to the DOM *after* the clone,\n          // so any radio buttons in the field get deselected from the clone rather than the actual field.\n          this.$fieldPlaceholder.insertAfter($field);\n          $field.detach();\n          this.$fieldPlaceholder.replaceWith($clone);\n          $field.appendTo(this.$editor);\n\n          this.fields.push({\n            $field: $field,\n            $clone: $clone,\n          });\n        }\n      }\n\n      this.updateIframe();\n\n      this.elementEditor.on('update', this._updateIframeProxy);\n\n      Craft.ElementThumbLoader.retryAll();\n\n      this.trigger('open');\n    },\n\n    _getDeviceTypeTranslation: function (type) {\n      let translation;\n      switch (type) {\n        case 'phone':\n          translation = Craft.t('app', 'Mobile');\n          break;\n        case 'tablet':\n          translation = Craft.t('app', 'Tablet');\n          break;\n        default:\n          translation = Craft.t('app', 'Desktop');\n          break;\n      }\n      return translation;\n    },\n\n    _getDeviceOrientationTranslation: function (orientation) {\n      return orientation === 'portrait'\n        ? Craft.t('app', 'Portrait')\n        : Craft.t('app', 'Landscape');\n    },\n\n    _buildDeviceTypeFieldset: function () {\n      // Device type buttons\n      this.$deviceTypeContainer = $('<section/>', {\n        class: 'btngroup lp-device-type',\n        'aria-label': Craft.t('app', 'Device type'),\n      }).appendTo(this.$previewHeader);\n      $('<button/>', {\n        type: 'button',\n        class: 'btn lp-device-type-btn--desktop active',\n        title: Craft.t('app', 'Desktop'),\n        'aria-label': Craft.t('app', 'Desktop'),\n        'aria-pressed': 'true',\n        data: {\n          width: '',\n          height: '',\n          deviceType: 'desktop',\n        },\n      }).appendTo(this.$deviceTypeContainer);\n      $('<button/>', {\n        type: 'button',\n        class: 'btn lp-device-type-btn--tablet',\n        title: Craft.t('app', 'Tablet'),\n        'aria-label': Craft.t('app', 'Tablet'),\n        'aria-pressed': 'false',\n        data: {\n          width: 768,\n          height: 1024,\n          deviceType: 'tablet',\n        },\n      }).appendTo(this.$deviceTypeContainer);\n      $('<button/>', {\n        type: 'button',\n        class: 'btn lp-device-type-btn--phone',\n        title: Craft.t('app', 'Mobile'),\n        'aria-label': Craft.t('app', 'Mobile'),\n        'aria-pressed': 'false',\n        data: {\n          width: 375,\n          height: 667,\n          deviceType: 'phone',\n        },\n      }).appendTo(this.$deviceTypeContainer);\n\n      // Add functionality\n      this.deviceBtnGroup = new Craft.Listbox(this.$deviceTypeContainer, {\n        onChange: ($selectedOption) => {\n          this.switchDeviceType($selectedOption);\n        },\n      });\n    },\n\n    _activeTarget: function () {\n      return this.elementEditor.settings.previewTargets[this.activeTarget];\n    },\n\n    /**\n     * @returns {boolean}\n     * @private\n     */\n    _autoRefresh: function () {\n      const target = this._activeTarget();\n      return typeof typeof target.refresh === 'undefined' || !!target.refresh;\n    },\n\n    switchTarget: function (i) {\n      this.activeTarget = i;\n      this.$targetBtn.text(this.elementEditor.settings.previewTargets[i].label);\n      this.$targetMenu.find('a.sel').removeClass('sel');\n      this.$targetMenu.find('a').eq(i).addClass('sel');\n      this.updateIframe(true);\n      this.trigger('switchTarget', {\n        previewTarget: this.elementEditor.settings.previewTargets[i],\n      });\n    },\n\n    handleWindowResize: function () {\n      // Reset the width so the min width is enforced\n      this.editorWidth = this.editorWidth;\n\n      // Update the editor/iframe sizes\n      this.updateWidths();\n    },\n\n    slideIn: function () {\n      if (!this.isActive || this.isVisible) {\n        return;\n      }\n\n      $('html').addClass('noscroll');\n      this.$shade.velocity('fadeIn');\n\n      this.$editorContainer\n        .show()\n        .velocity('stop')\n        .animateLeft(\n          0,\n          Garnish.getUserPreferredAnimationDuration(this.animationDuration),\n          () => {\n            this.trigger('slideIn');\n            Garnish.$win.trigger('resize');\n          }\n        );\n\n      this.$previewContainer\n        .show()\n        .velocity('stop')\n        .animateRight(\n          0,\n          Garnish.getUserPreferredAnimationDuration(this.animationDuration)\n        );\n\n      this.isVisible = true;\n\n      Garnish.uiLayerManager.addLayer(this.$previewWrapper);\n      Garnish.hideModalBackgroundLayers();\n      Craft.setFocusWithin(this.$previewWrapper);\n      Craft.trapFocusWithin(this.$previewWrapper);\n      Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n        this.close();\n      });\n    },\n\n    close: function () {\n      if (!this.isActive || !this.isVisible) {\n        return;\n      }\n\n      this.trigger('beforeClose');\n\n      $('html').removeClass('noscroll');\n\n      this.removeListener(Garnish.$win, 'resize');\n      Garnish.uiLayerManager.removeLayer();\n      Garnish.resetModalBackgroundLayerVisibility();\n\n      // Remove our temporary input and move the preview fields back into place\n      this.$tempInput.detach();\n      this.moveFieldsBack();\n\n      // Delay shade fade-out when animation is present\n      if (Garnish.prefersReducedMotion()) {\n        this.$shade.velocity('fadeOut');\n      } else {\n        this.$shade.delay(200).velocity('fadeOut');\n      }\n\n      this.$editorContainer\n        .velocity('stop')\n        .animateLeft(\n          -this.editorWidthInPx,\n          Garnish.getUserPreferredAnimationDuration(this.animationDuration),\n          () => {\n            for (var i = 0; i < this.fields.length; i++) {\n              this.fields[i].$newClone.remove();\n            }\n            this.$editorContainer.hide();\n            this.trigger('slideOut');\n          }\n        );\n\n      this.$previewContainer\n        .velocity('stop')\n        .animateRight(\n          -this.getIframeWidth(),\n          Garnish.getUserPreferredAnimationDuration(this.animationDuration),\n          () => {\n            this.$iframeContainer.removeClass('lp-iframe-container--rotating');\n            this.$previewContainer.hide();\n          }\n        );\n\n      this.elementEditor.off('update', this._updateIframeProxy);\n\n      Craft.ElementThumbLoader.retryAll();\n\n      if (this.elementEditor.$previewBtn) {\n        this.elementEditor.$previewBtn.focus();\n      }\n\n      this.isActive = false;\n      this.isVisible = false;\n      this.trigger('close');\n    },\n\n    moveFieldsBack: function () {\n      for (var i = 0; i < this.fields.length; i++) {\n        var field = this.fields[i];\n        field.$newClone = this._getClone(field.$field);\n\n        // It's important that the actual field is added to the DOM *after* the clone,\n        // so any radio buttons in the field get deselected from the clone rather than the actual field.\n        this.$fieldPlaceholder.insertAfter(field.$field);\n        field.$field.detach();\n        this.$fieldPlaceholder.replaceWith(field.$newClone);\n        field.$clone.replaceWith(field.$field);\n      }\n\n      Garnish.$win.trigger('resize');\n      Garnish.$doc.trigger('scroll');\n    },\n\n    getIframeWidth: function () {\n      return Garnish.$win.width() - this.editorWidthInPx;\n    },\n\n    updateWidths: function () {\n      this.$editorContainer.css('width', this.editorWidthInPx + 'px');\n      this.$previewContainer.width(this.getIframeWidth());\n      if (this._devicePreviewIsActive()) {\n        this.updateDevicePreview();\n      }\n    },\n\n    _useIframeResizer: function () {\n      return Craft.previewIframeResizerOptions !== false;\n    },\n\n    /**\n     * @param {boolean} [resetScroll=false]\n     * @param {boolean} [refresh]\n     */\n    updateIframe: function (resetScroll, refresh) {\n      if (!this.isActive) {\n        return false;\n      }\n\n      // Ignore non-boolean resetScroll values\n      resetScroll = resetScroll === true;\n\n      // If the draft ID has changed or there's no iframe, we definitely need to refresh\n      if (\n        this.draftId !== (this.draftId = this.elementEditor.settings.draftId) ||\n        !this.$iframe\n      ) {\n        refresh = true;\n      }\n\n      const target = this._activeTarget();\n      if (typeof refresh === 'undefined') {\n        refresh = resetScroll || this._autoRefresh();\n      }\n\n      this.trigger('beforeUpdateIframe', {\n        previewTarget: target,\n        resetScroll: resetScroll,\n        refresh: refresh,\n      });\n\n      // If this is an existing preview target, make sure it wants to be refreshed automatically\n      if (!refresh) {\n        this.slideIn();\n        return;\n      }\n\n      this.elementEditor\n        .getTokenizedPreviewUrl(target.url, 'x-craft-live-preview')\n        .then((url) => {\n          // Maintain the current scroll position?\n          let sameHost;\n          if (resetScroll) {\n            this.scrollTop = null;\n          } else if (this.iframeLoaded && this.$iframe) {\n            if (this._useIframeResizer()) {\n              this.iframeHeight = this.$iframe.height();\n              this.scrollTop = this.$iframeContainer.scrollTop();\n            } else {\n              sameHost = Craft.isSameHost(url);\n              if (sameHost && this.$iframe[0].contentWindow) {\n                this.scrollTop = $(\n                  this.$iframe[0].contentWindow.document\n                ).scrollTop();\n              }\n            }\n          }\n\n          this.iframeLoaded = false;\n\n          var $iframe = $('<iframe/>', {\n            class: 'lp-preview',\n            frameborder: 0,\n            src: url,\n            title: Craft.t('app', 'Preview'),\n          });\n\n          if (this.$iframe) {\n            this.$iframe.replaceWith($iframe);\n          } else {\n            $iframe.appendTo(this.$devicePreviewContainer);\n          }\n\n          // Keep the iframe height consistent with its content\n          if (this._useIframeResizer()) {\n            if (!resetScroll && this.iframeHeight !== null) {\n              $iframe.height(this.iframeHeight);\n              this.$iframeContainer.scrollTop(this.scrollTop);\n            }\n\n            iFrameResize(\n              $.extend(\n                {\n                  checkOrigin: false,\n                  // Allow iframe scrolling until we've successfully initialized the resizer\n                  scrolling: true,\n                  onInit: (iframe) => {\n                    this.iframeLoaded = true;\n                    this.iframeHeight = null;\n                    this.scrollTop = null;\n                    iframe.scrolling = 'no';\n                  },\n                },\n                Craft.previewIframeResizerOptions || {}\n              ),\n              $iframe[0]\n            );\n          } else {\n            $iframe.on('load', () => {\n              this.iframeLoaded = true;\n              if (!resetScroll && sameHost && this.scrollTop !== null) {\n                $($iframe[0].contentWindow.document).scrollTop(this.scrollTop);\n              }\n            });\n          }\n\n          this.url = url;\n          this.$iframe = $iframe;\n\n          if (this._devicePreviewIsActive()) {\n            this.updateDevicePreview();\n          }\n\n          this.trigger('afterUpdateIframe', {\n            previewTarget:\n              this.elementEditor.settings.previewTargets[this.activeTarget],\n            $iframe: this.$iframe,\n          });\n\n          this.slideIn();\n        });\n    },\n\n    _devicePreviewIsActive: function () {\n      return this.currentDeviceType !== 'desktop';\n    },\n\n    _updateNotifier: function () {\n      this.$notifier.html = '';\n\n      const translation =\n        this.currentDeviceType === 'desktop'\n          ? 'Previewing {type} device'\n          : 'Previewing {type} device in {orientation}';\n      let params = {\n        type: this._getDeviceTypeTranslation(this.currentDeviceType),\n      };\n\n      if (this.currentDeviceType !== 'desktop') {\n        params = {\n          ...params,\n          ...{\n            orientation: this._getDeviceOrientationTranslation(\n              this.deviceOrientation\n            ),\n          },\n        };\n      }\n\n      const message = Craft.t('app', translation, params);\n\n      setTimeout(() => {\n        this.$notifier.text(message);\n      }, 200);\n    },\n\n    switchDeviceType: function ($option) {\n      this.$iframeContainer.removeClass('lp-iframe-container--rotating');\n\n      const newDeviceType = $option.data('deviceType');\n      // Bail if we’re just smashing the same button\n      if (newDeviceType === this.currentDeviceType) {\n        return false;\n      }\n\n      // Store new device type data\n      this.currentDeviceType = newDeviceType;\n      this.deviceWidth = $option.data('width');\n      this.deviceHeight = $option.data('height');\n\n      if (this.currentDeviceType === 'desktop') {\n        // Disable the orientation button\n        this.$orientationBtn.addClass('disabled').attr('aria-disabled', 'true');\n\n        this.$iframeContainer.removeClass(\n          'lp-iframe-container--has-device-preview'\n        );\n      } else {\n        // Enable the orientation button\n        this.$orientationBtn\n          .removeClass('disabled')\n          .removeAttr('aria-disabled');\n\n        this.$iframeContainer.addClass(\n          'lp-iframe-container--has-device-preview'\n        );\n      }\n\n      // Add the tablet class if needed\n      if (this.currentDeviceType === 'tablet') {\n        this.$iframeContainer.addClass('lp-iframe-container--tablet');\n      } else {\n        this.$iframeContainer.removeClass('lp-iframe-container--tablet');\n      }\n\n      this._updateNotifier();\n\n      if (this.currentDeviceType !== 'desktop') {\n        this.updateDevicePreview();\n      }\n    },\n\n    switchOrientation: function () {\n      if (!this._devicePreviewIsActive()) {\n        return false;\n      }\n\n      // Switch to whichever orientation is currently not stored\n      if (!this.deviceOrientation || this.deviceOrientation === 'portrait') {\n        this.deviceOrientation = 'landscape';\n      } else {\n        this.deviceOrientation = 'portrait';\n      }\n\n      // Store the new one\n      Craft.setLocalStorage('LivePreview.orientation', this.deviceOrientation);\n\n      // Allow the animation to take place\n      this.$iframeContainer.addClass('lp-iframe-container--rotating');\n\n      // Update the device preview\n      this.updateDevicePreview();\n      this._updateNotifier();\n\n      setTimeout(() => {\n        this.$iframeContainer.removeClass('lp-iframe-container--rotating');\n      }, 300);\n    },\n\n    updateDevicePreview: function () {\n      // Figure out the best zoom\n      let hZoom = 1;\n      let wZoom = 1;\n      let zoom = 1;\n      let previewHeight = this.$previewContainer.height() - 50 - 48; // 50px for the header bar and 24px clearance\n      let previewWidth = this.$previewContainer.width() - 48;\n      let maskHeight = this.deviceMaskDimensions[this.currentDeviceType].height;\n      let maskWidth = this.deviceMaskDimensions[this.currentDeviceType].width;\n\n      if (this.deviceOrientation === 'landscape') {\n        if (previewWidth < maskHeight) {\n          hZoom = previewWidth / maskHeight;\n        }\n        if (previewHeight < maskWidth) {\n          wZoom = previewHeight / maskWidth;\n        }\n      } else {\n        if (previewHeight < maskHeight) {\n          hZoom = previewHeight / maskHeight;\n        }\n        if (previewWidth < maskWidth) {\n          wZoom = previewWidth / maskWidth;\n        }\n      }\n\n      zoom = hZoom;\n      if (wZoom < hZoom) {\n        zoom = wZoom;\n      }\n\n      // Figure out the css values\n      const translate = -(100 / zoom / 2);\n      const rotationDeg =\n        this.deviceOrientation === 'landscape' ? '-90deg' : '0deg';\n\n      // Apply first to the device mask\n      this.$deviceMask.css({\n        width: this.deviceMaskDimensions[this.currentDeviceType].width + 'px',\n        height: this.deviceMaskDimensions[this.currentDeviceType].height + 'px',\n        transform:\n          'scale(' +\n          zoom +\n          ') translate(' +\n          translate +\n          '%, ' +\n          translate +\n          '%) rotate(' +\n          rotationDeg +\n          ')',\n      });\n\n      if (this.deviceOrientation === 'landscape') {\n        this.$devicePreviewContainer.css({\n          width: this.deviceHeight + 'px',\n          height: this.deviceWidth + 'px',\n          transform:\n            'scale(' +\n            zoom +\n            ') translate(' +\n            translate +\n            '%, ' +\n            translate +\n            '%)',\n          marginTop: 0,\n          marginLeft: '-' + 12 * zoom + 'px',\n        });\n      } else {\n        this.$devicePreviewContainer.css({\n          width: this.deviceWidth + 'px',\n          height: this.deviceHeight + 'px',\n          transform:\n            'scale(' +\n            zoom +\n            ') translate(' +\n            translate +\n            '%, ' +\n            translate +\n            '%)',\n          marginTop: '-' + 12 * zoom + 'px',\n          marginLeft: 0,\n        });\n      }\n    },\n\n    _getClone: function ($field) {\n      var $clone = $field.clone();\n\n      // clone() won't account for input values that have changed since the original HTML set them\n      Garnish.copyInputValues($field, $clone);\n\n      // Remove any id= attributes\n      $clone.attr('id', '');\n      $clone.find('[id]').attr('id', '');\n\n      // Disable anything with a name attribute\n      $clone.find('[name]').prop('disabled', true);\n\n      return $clone;\n    },\n\n    _onDragStart: function () {\n      this.dragStartEditorWidth = this.editorWidthInPx;\n      this.$previewContainer.addClass('dragging');\n    },\n\n    _onDrag: function () {\n      if (Craft.orientation === 'ltr') {\n        this.editorWidth = this.dragStartEditorWidth + this.dragger.mouseDistX;\n      } else {\n        this.editorWidth = this.dragStartEditorWidth - this.dragger.mouseDistX;\n      }\n\n      this.updateWidths();\n    },\n\n    _onDragStop: function () {\n      this.$previewContainer.removeClass('dragging');\n      Craft.setLocalStorage('LivePreview.editorWidth', this.editorWidth);\n    },\n\n    destroy: function () {\n      Craft.Preview.instances = Craft.Preview.instances.filter(\n        (o) => o !== this\n      );\n      this.base();\n    },\n  },\n  {\n    defaultEditorWidth: 0.33,\n    minEditorWidthInPx: 320,\n    instances: [],\n\n    refresh: function () {\n      for (preview of Craft.Preview.instances) {\n        preview.updateIframe();\n      }\n      for (preview of Craft.LivePreview.instances) {\n        preview.forceUpdateIframe();\n      }\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Preview File Modal\n */\nCraft.PreviewFileModal = Garnish.Modal.extend(\n  {\n    assetId: null,\n    $spinner: null,\n    $triggerElement: null,\n    $bumperButtonStart: null,\n    $bumperButtonEnd: null,\n    elementSelect: null,\n    type: null,\n    loaded: null,\n    requestId: 0,\n\n    /**\n     * Initialize the preview file modal.\n     * @returns {*|void}\n     */\n    init: function (assetId, elementSelect, settings) {\n      settings = $.extend(this.defaultSettings, settings);\n      this.$triggerElement = Garnish.getFocusedElement();\n\n      settings.onHide = this._onHide.bind(this);\n\n      if (Craft.PreviewFileModal.openInstance) {\n        var instance = Craft.PreviewFileModal.openInstance;\n\n        if (instance.assetId !== assetId) {\n          instance.loadAsset(\n            assetId,\n            settings.startingWidth,\n            settings.startingHeight\n          );\n          instance.elementSelect = elementSelect;\n        }\n\n        return this.destroy();\n      }\n\n      Craft.PreviewFileModal.openInstance = this;\n      this.elementSelect = elementSelect;\n\n      this.$container = $('<div class=\"modal previewmodal loading\"/>').appendTo(\n        Garnish.$bod\n      );\n\n      this.base(\n        this.$container,\n        $.extend(\n          {\n            resizable: true,\n          },\n          settings\n        )\n      );\n\n      // Cut the flicker, just show the nice person the preview.\n      if (this.$container) {\n        this.$container.velocity('stop');\n        this.$container.show().css('opacity', 1);\n\n        this.$shade.velocity('stop');\n        this.$shade.show().css('opacity', 1);\n\n        Garnish.setFocusWithin(this.$container);\n      }\n\n      // Add bumper elements to maintain focus trap\n      this.$bumperButtonStart = Craft.ui.createButton({\n        html: Craft.t('app', 'Close Preview'),\n        class: 'skip-link',\n      });\n\n      this.addListener(this.$bumperButtonStart, 'click', () => {\n        this.hide();\n      });\n      this.$bumperButtonEnd = this.$bumperButtonStart.clone(true);\n\n      this.loadAsset(assetId, settings.startingWidth, settings.startingHeight);\n    },\n\n    /**\n     * When hiding, remove all traces and focus last focused element.\n     * @private\n     */\n    _onHide: function () {\n      Craft.PreviewFileModal.openInstance = null;\n      if (this.elementSelect) {\n        this.elementSelect.focusItem(this.elementSelect.$focusedItem);\n      } else if (this.$triggerElement && this.$triggerElement.length) {\n        this.$triggerElement.trigger('focus');\n      }\n\n      this.$shade.remove();\n\n      return this.destroy();\n    },\n\n    _addBumperButtons: function () {\n      this.$container\n        .prepend(this.$bumperButtonStart)\n        .append(this.$bumperButtonEnd);\n    },\n\n    _addModalName: function () {\n      const headingId = 'preview-heading';\n\n      this.$container\n        .prepend(\n          $('h1')\n            .attr({\n              class: 'visually-hidden',\n              id: headingId,\n            })\n            .text(Craft.t('app', 'Preview file'))\n        )\n        .attr('aria-labelledby', headingId);\n    },\n\n    /**\n     * Disappear immediately forever.\n     * @returns {boolean}\n     */\n    selfDestruct: function () {\n      var instance = Craft.PreviewFileModal.openInstance;\n\n      instance.hide();\n      instance.$shade.remove();\n      instance.destroy();\n\n      Craft.PreviewFileModal.openInstance = null;\n      Craft.focalPoint.destruct();\n      Craft.focalPoint = null;\n\n      return true;\n    },\n\n    /**\n     * Load an asset, using starting width and height, if applicable\n     * @param {number} assetId\n     * @param {number} [startingWidth]\n     * @param {number} [startingHeight]\n     */\n    loadAsset: function (assetId, startingWidth, startingHeight) {\n      this.assetId = assetId;\n\n      this.$container.empty();\n      this.loaded = false;\n\n      this.desiredHeight = null;\n      this.desiredWidth = null;\n\n      var containerHeight = Garnish.$win.height() * 0.66;\n      var containerWidth = Math.min(\n        (containerHeight / 3) * 4,\n        Garnish.$win.width() - this.settings.minGutter * 2\n      );\n      containerHeight = (containerWidth / 4) * 3;\n\n      if (startingWidth && startingHeight) {\n        var ratio = startingWidth / startingHeight;\n        containerWidth = Math.min(\n          startingWidth,\n          Garnish.$win.width() - this.settings.minGutter * 2\n        );\n        containerHeight = Math.min(\n          containerWidth / ratio,\n          Garnish.$win.height() - this.settings.minGutter * 2\n        );\n        containerWidth = containerHeight * ratio;\n\n        // This might actually have put width over the viewport limits, so doublecheck\n        if (\n          containerWidth >\n          Math.min(\n            startingWidth,\n            Garnish.$win.width() - this.settings.minGutter * 2\n          )\n        ) {\n          containerWidth = Math.min(\n            startingWidth,\n            Garnish.$win.width() - this.settings.minGutter * 2\n          );\n          containerHeight = containerWidth / ratio;\n        }\n      }\n\n      this._resizeContainer(containerWidth, containerHeight);\n\n      this.$spinner = $('<div class=\"spinner centeralign\"></div>').appendTo(\n        this.$container\n      );\n      var top =\n          this.$container.height() / 2 - this.$spinner.height() / 2 + 'px',\n        left = this.$container.width() / 2 - this.$spinner.width() / 2 + 'px';\n\n      this.$spinner.css({left: left, top: top, position: 'absolute'});\n      this.requestId++;\n\n      let data = {assetId: assetId, requestId: this.requestId};\n      let onResponse = () => {\n        this.$container.removeClass('loading');\n        this.$spinner.remove();\n        this.loaded = true;\n      };\n      Craft.sendActionRequest('POST', 'assets/preview-file', {data})\n        .then((response) => {\n          onResponse();\n\n          if (response.data.requestId != this.requestId) {\n            return;\n          }\n\n          if (!response.data.previewHtml) {\n            this.$container.addClass('zilch');\n            this.$container.append(\n              $('<p/>', {text: Craft.t('app', 'No preview available.')})\n            );\n            this._addBumperButtons();\n            return;\n          }\n\n          this.$container.removeClass('zilch');\n          this.$container.attr('data-asset-id', this.assetId);\n          this.$container.append(response.data.previewHtml);\n          this._addBumperButtons();\n          this._addModalName();\n          Craft.appendHeadHtml(response.data.headHtml);\n          Craft.appendBodyHtml(response.data.bodyHtml);\n        })\n        .catch(({response}) => {\n          onResponse();\n          alert(response.data.message);\n          this.hide();\n        });\n    },\n\n    /**\n     * Resize the container to specified dimensions\n     * @param {number} containerWidth\n     * @param {number} containerHeight\n     * @private\n     */\n    _resizeContainer: function (containerWidth, containerHeight) {\n      this.$container.css({\n        width: containerWidth,\n        'min-width': containerWidth,\n        'max-width': containerWidth,\n        height: containerHeight,\n        'min-height': containerHeight,\n        'max-height': containerHeight,\n        top: (Garnish.$win.height() - containerHeight) / 2,\n        left: (Garnish.$win.width() - containerWidth) / 2,\n      });\n    },\n  },\n  {\n    defaultSettings: {\n      startingWidth: null,\n      startingHeight: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * File Manager.\n */\nCraft.ProgressBar = Garnish.Base.extend({\n  $progressBar: null,\n  $innerProgressBar: null,\n  $progressBarStatus: null,\n\n  _itemCount: 0,\n  _processedItemCount: 0,\n  _displaySteps: false,\n\n  init: function ($element, displaySteps) {\n    if (displaySteps) {\n      this._displaySteps = true;\n    }\n\n    this.$progressBar = $('<div class=\"progressbar pending hidden\"/>').appendTo(\n      $element\n    );\n    this.$innerProgressBar = $('<div class=\"progressbar-inner\"/>').appendTo(\n      this.$progressBar\n    );\n    this.$progressBarStatus = $(\n      '<div class=\"progressbar-status hidden\" />'\n    ).insertAfter(this.$progressBar);\n\n    this.resetProgressBar();\n  },\n\n  /**\n   * Reset the progress bar\n   */\n  resetProgressBar: function () {\n    // Since setting the progress percentage implies that there is progress to be shown\n    // It removes the pending class - we must add it back.\n    this.setProgressPercentage(100);\n    this.$progressBar.addClass('pending');\n\n    // Reset all the counters\n    this.setItemCount(1);\n    this.setProcessedItemCount(0);\n    this.$progressBarStatus.html('');\n\n    if (this._displaySteps) {\n      this.$progressBar.addClass('has-status');\n    }\n  },\n\n  /**\n   * Fade to invisible, hide it using a class and reset opacity to visible\n   */\n  hideProgressBar: function () {\n    this.$progressBar.fadeTo('fast', 0.01, () => {\n      this.$progressBar.addClass('hidden').fadeTo(1, 1, $.noop);\n    });\n    this.$progressBarStatus.fadeTo('fast', 0.01, () => {\n      this.$progressBarStatus.addClass('hidden').fadeTo(1, 1, $.noop);\n    });\n  },\n\n  showProgressBar: function () {\n    this.$progressBar.removeClass('hidden');\n    this.$progressBarStatus.removeClass('hidden');\n  },\n\n  setItemCount: function (count) {\n    this._itemCount = count;\n  },\n\n  incrementItemCount: function (count) {\n    this._itemCount += count;\n  },\n\n  setProcessedItemCount: function (count) {\n    this._processedItemCount = count;\n  },\n\n  incrementProcessedItemCount: function (count) {\n    this._processedItemCount += count;\n  },\n\n  updateProgressBar: function () {\n    // Only fools would allow accidental division by zero.\n    this._itemCount = Math.max(this._itemCount, 1);\n\n    var width = Math.min(\n      100,\n      Math.round((100 * this._processedItemCount) / this._itemCount)\n    );\n\n    this.setProgressPercentage(width);\n\n    if (this._displaySteps) {\n      this.$progressBarStatus.html(\n        this._processedItemCount + ' / ' + this._itemCount\n      );\n    }\n  },\n\n  setProgressPercentage: function (percentage, animate) {\n    if (percentage === 0) {\n      this.$progressBar.addClass('pending');\n    } else {\n      this.$progressBar.removeClass('pending');\n\n      if (animate) {\n        this.$innerProgressBar\n          .velocity('stop')\n          .velocity({width: percentage + '%'}, 'fast');\n      } else {\n        this.$innerProgressBar.velocity('stop').width(percentage + '%');\n      }\n    }\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * File Manager.\n */\nCraft.PromptHandler = Garnish.Base.extend({\n  modal: null,\n  $modalContainerDiv: null,\n  $prompt: null,\n  $promptApplyToRemainingContainer: null,\n  $promptApplyToRemainingCheckbox: null,\n  $promptApplyToRemainingLabel: null,\n  $pomptChoices: null,\n\n  _prompts: [],\n  _promptBatchCallback: $.noop,\n  _promptBatchReturnData: [],\n  _promptBatchNum: 0,\n\n  resetPrompts: function () {\n    this._prompts = [];\n    this._promptBatchCallback = $.noop;\n    this._promptBatchReturnData = [];\n    this._promptBatchNum = 0;\n  },\n\n  addPrompt: function (prompt) {\n    this._prompts.push(prompt);\n  },\n\n  getPromptCount: function () {\n    return this._prompts.length;\n  },\n\n  showBatchPrompts: function (callback) {\n    this._promptBatchCallback = callback;\n    this._promptBatchReturnData = [];\n    this._promptBatchNum = 0;\n\n    this._showNextPromptInBatch();\n  },\n\n  _showNextPromptInBatch: function () {\n    var prompt = this._prompts[this._promptBatchNum].prompt,\n      remainingInBatch = this._prompts.length - (this._promptBatchNum + 1);\n\n    this._showPrompt(\n      prompt.message,\n      prompt.choices,\n      this._handleBatchPromptSelection.bind(this),\n      remainingInBatch\n    );\n  },\n\n  /**\n   * Handles a prompt choice selection.\n   *\n   * @param {string} choice\n   * @param {boolean} applyToRemaining\n   * @private\n   */\n  _handleBatchPromptSelection: function (choice, applyToRemaining) {\n    var prompt = this._prompts[this._promptBatchNum],\n      remainingInBatch = this._prompts.length - (this._promptBatchNum + 1);\n\n    // Record this choice\n    var choiceData = $.extend(prompt, {choice});\n    this._promptBatchReturnData.push(choiceData);\n\n    // Are there any remaining items in the batch?\n    if (remainingInBatch) {\n      // Get ready to deal with the next prompt\n      this._promptBatchNum++;\n\n      // Apply the same choice to the remaining items?\n      if (applyToRemaining) {\n        this._handleBatchPromptSelection(choice, true);\n      } else {\n        // Show the next prompt\n        this._showNextPromptInBatch();\n      }\n    } else {\n      // All done! Call the callback\n      if (typeof this._promptBatchCallback === 'function') {\n        this._promptBatchCallback(this._promptBatchReturnData);\n      }\n    }\n  },\n\n  /**\n   * @callback showPromptCallback\n   * @param {string} choice\n   * @param {boolean} applyToRemaining\n   */\n  /**\n   * Show the user prompt with a given message and choices, plus an optional \"Apply to remaining\" checkbox.\n   *\n   * @param {string} message\n   * @param {Array} choices\n   * @param {showPromptCallback} callback\n   * @param {number} itemsToGo\n   */\n  _showPrompt: function (message, choices, callback, itemsToGo) {\n    this._promptCallback = callback;\n\n    if (this.modal === null) {\n      this.modal = new Garnish.Modal({closeOtherModals: false});\n    }\n\n    if (this.$modalContainerDiv === null) {\n      this.$modalContainerDiv = $(\n        '<div class=\"modal fitted prompt-modal\"></div>'\n      )\n        .addClass()\n        .appendTo(Garnish.$bod);\n    }\n\n    this.$prompt = $('<div class=\"body\"></div>').appendTo(\n      this.$modalContainerDiv.empty()\n    );\n\n    this.$promptMessage = $('<p class=\"prompt-msg\"/>').appendTo(this.$prompt);\n\n    this.$promptChoices = $('<div class=\"options\"></div>').appendTo(\n      this.$prompt\n    );\n\n    this.$promptApplyToRemainingContainer = $(\n      '<label class=\"assets-applytoremaining\"/>'\n    )\n      .appendTo(this.$prompt)\n      .hide();\n    this.$promptApplyToRemainingCheckbox = $(\n      '<input type=\"checkbox\"/>'\n    ).appendTo(this.$promptApplyToRemainingContainer);\n    this.$promptApplyToRemainingLabel = $('<span/>').appendTo(\n      this.$promptApplyToRemainingContainer\n    );\n\n    this.$promptButtons = $('<div class=\"buttons right\"/>').appendTo(\n      this.$prompt\n    );\n\n    this.modal.setContainer(this.$modalContainerDiv);\n\n    this.$promptMessage.html(message);\n\n    let $cancelBtn = $('<button/>', {\n      type: 'button',\n      class: 'btn',\n      text: Craft.t('app', 'Cancel'),\n    }).appendTo(this.$promptButtons);\n    let $submitBtn = $('<button/>', {\n      type: 'submit',\n      class: 'btn submit disabled',\n      text: Craft.t('app', 'OK'),\n    }).appendTo(this.$promptButtons);\n\n    for (var i = 0; i < choices.length; i++) {\n      var $radioButtonHtml = $(\n          '<div><label><input type=\"radio\" name=\"promptAction\" value=\"' +\n            choices[i].value +\n            '\"/> ' +\n            choices[i].title +\n            '</label></div>'\n        ).appendTo(this.$promptChoices),\n        $radioButton = $radioButtonHtml.find('input');\n\n      this.addListener($radioButton, 'click', function () {\n        $submitBtn.removeClass('disabled');\n      });\n    }\n\n    this.addListener($submitBtn, 'activate', function (ev) {\n      var choice = $(ev.currentTarget)\n          .parents('.modal')\n          .find('input[name=promptAction]:checked')\n          .val(),\n        applyToRemaining = this.$promptApplyToRemainingCheckbox.prop('checked');\n\n      this._selectPromptChoice(choice, applyToRemaining);\n    });\n\n    this.addListener($cancelBtn, 'activate', function () {\n      var choice = 'cancel',\n        applyToRemaining = this.$promptApplyToRemainingCheckbox.prop('checked');\n\n      this._selectPromptChoice(choice, applyToRemaining);\n    });\n\n    if (itemsToGo) {\n      this.$promptApplyToRemainingContainer.show();\n      this.$promptApplyToRemainingLabel.html(\n        ' ' +\n          Craft.t('app', 'Apply this to the {number} remaining conflicts?', {\n            number: itemsToGo,\n          })\n      );\n    }\n\n    this.modal.show();\n    this.modal.removeListener(Garnish.Modal.$shade, 'click');\n    this.addListener(Garnish.Modal.$shade, 'click', '_cancelPrompt');\n  },\n\n  /**\n   * Handles when a user selects one of the prompt choices.\n   *\n   * @param {string} choice\n   * @param {boolean} applyToRemaining\n   * @private\n   */\n  _selectPromptChoice: function (choice, applyToRemaining) {\n    this.$prompt.fadeOut('fast', () => {\n      this.modal.hide();\n      this._promptCallback(choice, applyToRemaining);\n    });\n  },\n\n  /**\n   * Cancels the prompt.\n   */\n  _cancelPrompt: function () {\n    this._selectPromptChoice('cancel', true);\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Queue\n */\nCraft.Queue = Garnish.Base.extend({\n  running: false,\n  paused: false,\n  pausedForVisibility: false,\n  jobs: null,\n\n  get length() {\n    return this.jobs.length;\n  },\n\n  get isPaused() {\n    return this.paused || this.pausedForVisibility;\n  },\n\n  init: function () {\n    this.jobs = [];\n\n    Garnish.$doc.on('visibilitychange', () => {\n      if (this.pausedForVisibility && Craft.isVisible()) {\n        this.pausedForVisibility = false;\n        this._resume();\n      }\n    });\n  },\n\n  /**\n   * Adds a job to the queue.\n   * @param {function} job\n   * @returns {Promise}\n   */\n  push: function (job) {\n    return this._add(job, 'push');\n  },\n\n  /**\n   * Adds a job to the beginning of the queue.\n   * @param {function} job\n   * @returns {Promise}\n   */\n  unshift: function (job) {\n    return this._add(job, 'unshift');\n  },\n\n  pause: function () {\n    if (!this.paused) {\n      this.paused = true;\n      if (!this.pausedForVisibility) {\n        this.trigger('pause');\n      }\n    }\n  },\n\n  resume: function () {\n    if (this.paused) {\n      this.paused = false;\n      this._resume();\n    }\n  },\n\n  /**\n   * Adds a job to the queue.\n   * @param {function} job\n   * @param {string} method\n   * @returns {Promise}\n   * @private\n   */\n  _add: function (job, method) {\n    return new Promise((resolve, reject) => {\n      this.jobs[method](() => {\n        return new Promise((qResolve, qReject) => {\n          job()\n            .then((value) => {\n              // ...arguments doesn't work here :(\n              resolve(value);\n              qResolve();\n            })\n            .catch((value) => {\n              // ...arguments doesn't work here :(\n              reject(value);\n              qReject();\n            });\n        });\n      });\n\n      if (!this.running) {\n        this.trigger('beforeRun');\n        this.running = true;\n        this._exec();\n      }\n    });\n  },\n\n  clear: function () {\n    this.jobs.length = 0;\n  },\n\n  /**\n   * Runs the next job in the queue.\n   * @private\n   */\n  _exec: function () {\n    if (!this.jobs.length) {\n      this.running = false;\n      this.trigger('afterRun');\n      return;\n    }\n\n    if (!this.pausedForVisibility && !Craft.isVisible()) {\n      this.pausedForVisibility = true;\n      if (!this.paused) {\n        this.trigger('pause');\n      }\n    }\n\n    if (this.paused || this.pausedForVisibility) {\n      return;\n    }\n\n    this.trigger('beforeExec');\n    const job = this.jobs.shift();\n    job().finally(() => {\n      this.trigger('afterExec');\n      this._exec();\n    });\n  },\n\n  _resume: function () {\n    if (!this.isPaused) {\n      this.trigger('resume');\n      this._exec();\n    }\n  },\n});\n\nCraft.queue = new Craft.Queue();\n","(function ($) {\n  /** global: Craft */\n  /** global: Garnish */\n  /**\n   * Slide Picker\n   */\n  Craft.SlidePicker = Garnish.Base.extend(\n    {\n      min: null,\n      max: null,\n      totalSteps: null,\n      value: null,\n      label: null,\n      describedBy: null,\n\n      $container: null,\n      $buttons: null,\n\n      init: function (value, settings) {\n        this.setSettings(settings, Craft.SlidePicker.defaults);\n\n        this.$container = $('<div/>', {\n          class: 'slide-picker',\n          role: 'slider',\n          tabindex: 0,\n        });\n\n        this.refresh();\n        this.setValue(value, false);\n\n        this.addListener(this.$container, 'keydown', (ev) => {\n          switch (ev.keyCode) {\n            case Garnish.UP_KEY:\n              this.setValue(this.value + this.settings.step);\n              ev.preventDefault();\n              break;\n            case Garnish.DOWN_KEY:\n              this.setValue(this.value - this.settings.step);\n              ev.preventDefault();\n              break;\n            case Garnish.RIGHT_KEY:\n              if (Craft.orientation === 'ltr') {\n                this.setValue(this.value + this.settings.step);\n              } else {\n                this.setValue(this.value - this.settings.step);\n              }\n              ev.preventDefault();\n              break;\n            case Garnish.LEFT_KEY:\n              if (Craft.orientation === 'ltr') {\n                this.setValue(this.value - this.settings.step);\n              } else {\n                this.setValue(this.value + this.settings.step);\n              }\n              ev.preventDefault();\n              break;\n            case Garnish.HOME_KEY:\n              this.setValue(this.min);\n              ev.preventDefault();\n              break;\n            case Garnish.END_KEY:\n              this.setValue(this.max);\n              ev.preventDefault();\n              break;\n          }\n        });\n      },\n\n      refresh: function () {\n        // Figure out what the min/max values are\n        this.min = this._min();\n        this.max = this._max();\n        this.totalSteps = (this.max - this.min) / this.settings.step;\n\n        // Set label\n        this.label = this.settings.label;\n        this.describedBy = this.settings.describedBy;\n\n        if (!Number.isInteger(this.totalSteps)) {\n          throw 'Invalid SlidePicker config';\n        }\n\n        if (this.$buttons) {\n          this.$buttons.remove();\n        }\n\n        this.$container.attr('aria-valuemin', this.min);\n        this.$container.attr('aria-valuemax', this.max);\n\n        if (this.label) {\n          this.$container.attr('aria-label', this.label);\n        }\n\n        if (this.describedBy) {\n          this.$container.attr('aria-describedby', this.describedBy);\n        }\n\n        this.$buttons = $();\n\n        // Create the buttons\n        for (\n          let value = this.min;\n          value <= this.max;\n          value += this.settings.step\n        ) {\n          this.$buttons = this.$buttons.add(\n            $('<a/>', {\n              title: this.settings.valueLabel(value),\n              data: {value},\n            })\n          );\n        }\n\n        this.$buttons.appendTo(this.$container);\n\n        if (this.value !== null) {\n          let value = this.value;\n          this.value = null;\n          this.setValue(value, false);\n        }\n\n        this.addListener(this.$buttons, 'mouseover', (ev) => {\n          this.$buttons.removeClass('active-hover last-active-hover');\n          $(ev.currentTarget)\n            .addClass('active-hover last-active-hover')\n            .prevAll()\n            .addClass('active-hover');\n        });\n\n        this.addListener(this.$buttons, 'mouseout', () => {\n          this.$buttons.removeClass('active-hover');\n        });\n\n        this.addListener(this.$buttons, 'click', (ev) => {\n          this.setValue($.data(ev.currentTarget, 'value'));\n          ev.stopPropagation();\n          this.$container.focus();\n        });\n      },\n\n      setValue: function (value, triggerEvent) {\n        value = Math.max(Math.min(value, this.max), this.min);\n\n        if (this.value === (this.value = value)) {\n          return;\n        }\n\n        this.$container.attr({\n          'aria-valuenow': this.value,\n          'aria-valuetext': this.settings.valueLabel(this.value),\n        });\n\n        this.$buttons.removeClass('last-active active');\n        let $activeButton = this.$buttons.eq(\n          (this.value - this.min) / this.settings.step\n        );\n        $activeButton.add($activeButton.prevAll()).addClass('active');\n        $activeButton.addClass('last-active');\n\n        if (triggerEvent !== false) {\n          this.settings.onChange(value);\n        }\n      },\n\n      _min: function () {\n        if (typeof this.settings.min === 'function') {\n          return this.settings.min();\n        }\n        return this.settings.min;\n      },\n\n      _max: function () {\n        if (typeof this.settings.max === 'function') {\n          return this.settings.max();\n        }\n        return this.settings.max;\n      },\n    },\n    {\n      defaults: {\n        min: 0,\n        max: 100,\n        step: 10,\n        valueLabel: null,\n        onChange: $.noop,\n      },\n    }\n  );\n})(jQuery);\n","/** global: Garnish */\n\nCraft.SlideRuleInput = Garnish.Base.extend({\n  $container: null,\n  $options: null,\n  $selectedOption: null,\n  $input: null,\n  value: null,\n\n  startPositionX: null,\n\n  init: function (id, settings) {\n    this.setSettings(settings, Craft.SlideRuleInput.defaultSettings);\n\n    this.value = 0;\n    this.graduationsMin = -70;\n    this.graduationsMax = 70;\n    this.slideMin = -45;\n    this.slideMax = 45;\n\n    this.$container = $('#' + id);\n    this.$overlay = $('<div class=\"overlay\"></div>').appendTo(this.$container);\n    this.$cursor = $('<div class=\"cursor\"></div>').appendTo(this.$container);\n    this.$graduations = $('<div class=\"graduations\"></div>').appendTo(\n      this.$container\n    );\n    this.$graduationsUl = $('<ul></ul>').appendTo(this.$graduations);\n\n    this.$container.attr({\n      role: 'slider',\n      tabindex: '0',\n      'aria-valuemin': this.slideMin,\n      'aria-valuemax': this.slideMax,\n      'aria-valuenow': '0',\n      'aria-valuetext': Craft.t(\n        'app',\n        '{num, number} {num, plural, =1{degree} other{degrees}}',\n        {\n          num: 0,\n        }\n      ),\n    });\n\n    for (var i = this.graduationsMin; i <= this.graduationsMax; i++) {\n      var $li = $(\n        '<li class=\"graduation\" data-graduation=\"' +\n          i +\n          '\"><div class=\"label\">' +\n          i +\n          '</div></li>'\n      ).appendTo(this.$graduationsUl);\n\n      if (i % 5 === 0) {\n        $li.addClass('main-graduation');\n      }\n\n      if (i === 0) {\n        $li.addClass('selected');\n      }\n    }\n\n    this.$options = this.$container.find('.graduation');\n\n    this.addListener(this.$container, 'resize', this._handleResize.bind(this));\n    this.addListener(\n      this.$container,\n      'tapstart',\n      this._handleTapStart.bind(this)\n    );\n    this.addListener(Garnish.$bod, 'tapmove', this._handleTapMove.bind(this));\n    this.addListener(Garnish.$bod, 'tapend', this._handleTapEnd.bind(this));\n    this.addListener(\n      this.$container,\n      'keydown',\n      this._handleKeypress.bind(this)\n    );\n\n    // Set to zero\n\n    // this.setValue(0);\n\n    setTimeout(() => {\n      // (n -1) options because the border is placed on the left of the 10px box\n      this.graduationsCalculatedWidth = (this.$options.length - 1) * 10;\n      this.$graduationsUl.css(\n        'left',\n        -this.graduationsCalculatedWidth / 2 + this.$container.width() / 2\n      );\n    }, 50);\n  },\n\n  _handleResize: function () {\n    var left = this.valueToPosition(this.value);\n    this.$graduationsUl.css('left', left);\n  },\n\n  _handleKeypress: function (event) {\n    const current = parseInt(this.$container.attr('aria-valuenow'), 10);\n\n    switch (event.keyCode) {\n      case Garnish.UP_KEY:\n      case Garnish.RIGHT_KEY:\n        this.setValue(current + 1);\n        break;\n      case Garnish.DOWN_KEY:\n      case Garnish.LEFT_KEY:\n        this.setValue(current - 1);\n        break;\n      case Garnish.PAGE_UP_KEY:\n        this.setValue(current + 10);\n        break;\n      case Garnish.PAGE_DOWN_KEY:\n        this.setValue(current - 10);\n        break;\n      case Garnish.HOME_KEY:\n        this.setValue(this.slideMin);\n        break;\n      case Garnish.END_KEY:\n        this.setValue(this.slideMax);\n        break;\n    }\n\n    this.onChange();\n  },\n\n  _handleTapStart: function (ev, touch) {\n    ev.preventDefault();\n\n    this.startPositionX = touch.position.x;\n    this.startLeft = this.$graduationsUl.position().left;\n\n    this.dragging = true;\n    this.onStart();\n  },\n\n  _handleTapMove: function (ev, touch) {\n    if (this.dragging) {\n      ev.preventDefault();\n\n      var curX = this.startPositionX - touch.position.x;\n      var left = this.startLeft - curX;\n      var value = this.positionToValue(left);\n\n      this.setValue(value);\n\n      this.onChange();\n    }\n  },\n\n  setValue: function (value) {\n    var left = this.valueToPosition(value);\n    if (value < this.slideMin) {\n      value = this.slideMin;\n      left = this.valueToPosition(value);\n    } else if (value > this.slideMax) {\n      value = this.slideMax;\n      left = this.valueToPosition(value);\n    }\n\n    this.$graduationsUl.css('left', left);\n\n    if (value >= this.slideMin && value <= this.slideMax) {\n      this.$options.removeClass('selected');\n\n      $.each(this.$options, function (key, option) {\n        if ($(option).data('graduation') > 0) {\n          if ($(option).data('graduation') <= value) {\n            $(option).addClass('selected');\n          }\n        }\n        if ($(option).data('graduation') < 0) {\n          if ($(option).data('graduation') >= value) {\n            $(option).addClass('selected');\n          }\n        }\n\n        if ($(option).data('graduation') == 0) {\n          $(option).addClass('selected');\n        }\n      });\n    }\n\n    this.$container.attr({\n      'aria-valuenow': value,\n      'aria-valuetext': Craft.t(\n        'app',\n        '{num, number} {num, plural, =1{degree} other{degrees}}',\n        {num: parseInt(value, 10)}\n      ),\n    });\n    this.value = value;\n  },\n\n  _handleTapEnd: function (ev) {\n    if (this.dragging) {\n      ev.preventDefault();\n      this.dragging = false;\n      this.onEnd();\n    }\n  },\n\n  positionToValue: function (position) {\n    var scaleMin = this.graduationsMin * -1;\n    var scaleMax = (this.graduationsMin - this.graduationsMax) * -1;\n\n    return (\n      ((this.$graduations.width() / 2 + position * -1) /\n        this.graduationsCalculatedWidth) *\n        scaleMax -\n      scaleMin\n    );\n  },\n\n  valueToPosition: function (value) {\n    var scaleMin = this.graduationsMin * -1;\n    var scaleMax = (this.graduationsMin - this.graduationsMax) * -1;\n\n    return -(\n      ((value + scaleMin) * this.graduationsCalculatedWidth) / scaleMax -\n      this.$graduations.width() / 2\n    );\n  },\n\n  onStart: function () {\n    if (typeof this.settings.onChange === 'function') {\n      this.settings.onStart(this);\n    }\n  },\n\n  onChange: function () {\n    if (typeof this.settings.onChange === 'function') {\n      this.settings.onChange(this);\n    }\n  },\n\n  onEnd: function () {\n    if (typeof this.settings.onChange === 'function') {\n      this.settings.onEnd(this);\n    }\n  },\n\n  defaultSettings: {\n    onStart: $.noop,\n    onChange: $.noop,\n    onEnd: $.noop,\n  },\n});\n","(function ($) {\n  /** global: Craft */\n  /** global: Garnish */\n  /**\n   * Slide Picker\n   */\n  Craft.Slideout = Garnish.Base.extend(\n    {\n      $outerContainer: null,\n      $container: null,\n      $shade: null,\n      isOpen: false,\n\n      init: function (contents, settings) {\n        this.setSettings(settings, Craft.Slideout.defaults);\n\n        if (!Craft.useMobileStyles()) {\n          this.$shade = $('<div class=\"slideout-shade\"/>').appendTo(\n            Garnish.$bod\n          );\n\n          if (this.settings.closeOnShadeClick) {\n            this.addListener(this.$shade, 'click', (ev) => {\n              ev.stopPropagation();\n              this.close();\n            });\n          }\n        }\n\n        this.$outerContainer = $('<div/>', {\n          class: 'slideout-container hidden',\n        });\n        this.$container = $(\n          `<${this.settings.containerElement}/>`,\n          this.settings.containerAttributes\n        )\n          .attr('data-slideout', '')\n          .addClass('slideout')\n          .append(contents)\n          .data('slideout', this)\n          .appendTo(this.$outerContainer);\n\n        Garnish.addModalAttributes(this.$outerContainer);\n\n        if (Craft.useMobileStyles()) {\n          this.$container.addClass('so-mobile');\n        }\n\n        Craft.trapFocusWithin(this.$container);\n\n        if (this.settings.autoOpen) {\n          this.open();\n        }\n      },\n\n      open: function () {\n        if (this.isOpen) {\n          return;\n        }\n\n        this.setTriggerElement(document.activeElement);\n\n        this._cancelTransitionListeners();\n\n        // Move the shade + container to the end of <body> so they get the highest sub-z-indexes\n        if (this.$shade) {\n          this.$shade.appendTo(Garnish.$bod).show();\n        }\n\n        this.$outerContainer.appendTo(Garnish.$bod).removeClass('hidden');\n\n        if (Craft.useMobileStyles()) {\n          this.$container.css('top', '100vh');\n        } else {\n          this.$container.css(Garnish.ltr ? 'left' : 'right', '100vw');\n        }\n\n        this.$container.one('transitionend.slideout', () => {\n          Craft.setFocusWithin(this.$container);\n        });\n\n        if (this.$shade) {\n          this.$shade[0].offsetWidth;\n          this.$shade.addClass('so-visible');\n        }\n\n        this.$container[0].offsetWidth;\n        Craft.Slideout.addPanel(this);\n\n        this.enable();\n        Garnish.uiLayerManager.addLayer(this.$outerContainer);\n        Garnish.hideModalBackgroundLayers();\n\n        if (this.settings.closeOnEsc) {\n          Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n            this.close();\n          });\n        }\n\n        this.isOpen = true;\n        this.trigger('open');\n      },\n\n      setTriggerElement: function (trigger) {\n        this.settings.triggerElement = trigger;\n      },\n\n      close: function () {\n        if (!this.isOpen) {\n          return;\n        }\n\n        this.trigger('beforeClose');\n        this.disable();\n        this.isOpen = false;\n\n        this._cancelTransitionListeners();\n\n        if (this.$shade) {\n          this.$shade\n            .removeClass('so-visible')\n            .one('transitionend.slideout', () => {\n              this.$shade.hide();\n            });\n        }\n\n        Craft.Slideout.removePanel(this);\n        Garnish.uiLayerManager.removeLayer();\n        Garnish.resetModalBackgroundLayerVisibility();\n        this.$container.one('transitionend.slideout', () => {\n          this.$outerContainer.addClass('hidden');\n          this.trigger('close');\n        });\n\n        if (this.settings.triggerElement) {\n          this.settings.triggerElement.focus();\n        }\n      },\n\n      _cancelTransitionListeners: function () {\n        if (this.$shade) {\n          this.$shade.off('transitionend.slideout');\n        }\n\n        this.$container.off('transitionend.slideout');\n      },\n\n      /**\n       * Destroy\n       */\n      destroy: function () {\n        if (this.$shade) {\n          this.$shade.remove();\n          this.$shade = null;\n        }\n\n        this.$outerContainer.remove();\n        this.$outerContainer = null;\n        this.$container = null;\n\n        this.base();\n      },\n    },\n    {\n      defaults: {\n        containerElement: 'div',\n        containerAttributes: {},\n        autoOpen: true,\n        closeOnEsc: true,\n        closeOnShadeClick: true,\n        triggerElement: null,\n      },\n      openPanels: [],\n      addPanel: function (panel) {\n        Craft.Slideout.openPanels.unshift(panel);\n        if (Craft.useMobileStyles()) {\n          panel.$container.css('top', 0);\n        } else {\n          Craft.Slideout.updateStyles();\n        }\n      },\n      removePanel: function (panel) {\n        Craft.Slideout.openPanels = Craft.Slideout.openPanels.filter(\n          (m) => m !== panel\n        );\n        if (Craft.useMobileStyles()) {\n          panel.$container.css('top', '100vh');\n        } else {\n          panel.$container.css(Garnish.ltr ? 'left' : 'right', '100vw');\n          Craft.Slideout.updateStyles();\n        }\n      },\n      updateStyles: function () {\n        const totalPanels = Craft.Slideout.openPanels.length;\n        Craft.Slideout.openPanels.forEach((panel, i) => {\n          panel.$container.css(\n            Garnish.ltr ? 'left' : 'right',\n            `${50 * ((totalPanels - i) / totalPanels)}vw`\n          );\n        });\n\n        if (totalPanels !== 0) {\n          Garnish.$bod.addClass('no-scroll');\n        } else {\n          Garnish.$bod.removeClass('no-scroll');\n        }\n      },\n    }\n  );\n})(jQuery);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Slug Generator\n */\nCraft.SlugGenerator = Craft.BaseInputGenerator.extend({\n  generateTargetValue: function (sourceVal) {\n    // Remove HTML tags\n    sourceVal = sourceVal.replace(/<(.*?)>/g, '');\n\n    // Remove inner-word punctuation\n    sourceVal = sourceVal.replace(/['\"‘’“”\\[\\]\\(\\)\\{\\}:]/g, '');\n\n    // Make it lowercase\n    if (!Craft.allowUppercaseInSlug) {\n      sourceVal = sourceVal.toLowerCase();\n    }\n\n    if (Craft.limitAutoSlugsToAscii) {\n      // Convert extended ASCII characters to basic ASCII\n      sourceVal = Craft.asciiString(sourceVal, this.settings.charMap);\n    }\n\n    // Get the \"words\". Split on anything that is not alphanumeric.\n    // Reference: http://www.regular-expressions.info/unicode.html\n    var words = Craft.filterArray(\n      XRegExp.matchChain(sourceVal, [XRegExp('[\\\\p{L}\\\\p{N}\\\\p{M}]+')])\n    );\n\n    if (words.length) {\n      return words.join(Craft.slugWordSeparator);\n    } else {\n      return '';\n    }\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Structure class\n */\nCraft.Structure = Garnish.Base.extend(\n  {\n    id: null,\n\n    $container: null,\n    state: null,\n    structureDrag: null,\n\n    /**\n     * Init\n     */\n    init: function (id, container, settings) {\n      this.id = id;\n      this.$container = $(container);\n      this.setSettings(settings, Craft.Structure.defaults);\n\n      // Is this already a structure?\n      if (this.$container.data('structure')) {\n        console.warn('Double-instantiating a structure on an element');\n        this.$container.data('structure').destroy();\n      }\n\n      this.$container.data('structure', this);\n\n      this.state = {};\n\n      if (this.settings.storageKey) {\n        $.extend(\n          this.state,\n          Craft.getLocalStorage(this.settings.storageKey, {})\n        );\n      }\n\n      if (typeof this.state.collapsedElementIds === 'undefined') {\n        this.state.collapsedElementIds = [];\n      }\n\n      var $parents = this.$container.find('ul').prev('.row');\n\n      for (var i = 0; i < $parents.length; i++) {\n        var $row = $($parents[i]),\n          $li = $row.parent(),\n          $toggle = $(\n            '<div class=\"toggle\" title=\"' +\n              Craft.t('app', 'Show/hide children') +\n              '\"/>'\n          ).prependTo($row);\n\n        if (\n          $.inArray(\n            $row.children('.element').data('id'),\n            this.state.collapsedElementIds\n          ) !== -1\n        ) {\n          $li.addClass('collapsed');\n        }\n\n        this.initToggle($toggle);\n      }\n\n      if (this.settings.sortable) {\n        this.structureDrag = new Craft.StructureDrag(\n          this,\n          this.settings.maxLevels\n        );\n      }\n\n      if (this.settings.newChildUrl) {\n        this.initNewChildMenus(this.$container.find('.add'));\n      }\n    },\n\n    initToggle: function ($toggle) {\n      $toggle.on('click', (ev) => {\n        var $li = $(ev.currentTarget).closest('li'),\n          elementId = $li.children('.row').find('.element:first').data('id'),\n          viewStateKey = $.inArray(elementId, this.state.collapsedElementIds);\n\n        if ($li.hasClass('collapsed')) {\n          $li.removeClass('collapsed');\n\n          if (viewStateKey !== -1) {\n            this.state.collapsedElementIds.splice(viewStateKey, 1);\n          }\n        } else {\n          $li.addClass('collapsed');\n\n          if (viewStateKey === -1) {\n            this.state.collapsedElementIds.push(elementId);\n          }\n        }\n\n        if (this.settings.storageKey) {\n          Craft.setLocalStorage(this.settings.storageKey, this.state);\n        }\n      });\n    },\n\n    initNewChildMenus: function ($addBtns) {\n      this.addListener($addBtns, 'click', 'onNewChildMenuClick');\n    },\n\n    onNewChildMenuClick: function (ev) {\n      var $btn = $(ev.currentTarget);\n\n      if (!$btn.data('menubtn')) {\n        var elementId = $btn.parent().children('.element').data('id'),\n          newChildUrl = Craft.getUrl(\n            this.settings.newChildUrl,\n            'parentId=' + elementId\n          );\n\n        $(\n          '<div class=\"menu\"><ul><li><a href=\"' +\n            newChildUrl +\n            '\">' +\n            Craft.t('app', 'New child') +\n            '</a></li></ul></div>'\n        ).insertAfter($btn);\n\n        var menuBtn = new Garnish.MenuBtn($btn);\n        menuBtn.showMenu();\n      }\n    },\n\n    getIndent: function (level) {\n      return (\n        Craft.Structure.baseIndent + (level - 1) * Craft.Structure.nestedIndent\n      );\n    },\n\n    addElement: function ($element) {\n      var $li = $('<li data-level=\"1\"/>').appendTo(this.$container),\n        $row = $(\n          '<div class=\"row\" style=\"margin-' +\n            Craft.left +\n            ': -' +\n            Craft.Structure.baseIndent +\n            'px; padding-' +\n            Craft.left +\n            ': ' +\n            Craft.Structure.baseIndent +\n            'px;\">'\n        ).appendTo($li);\n\n      $row.append($element);\n\n      if (this.settings.sortable) {\n        $row.append(\n          '<a class=\"move icon\" title=\"' + Craft.t('app', 'Move') + '\"></a>'\n        );\n        this.structureDrag.addItems($li);\n      }\n\n      if (this.settings.newChildUrl) {\n        var $addBtn = $(\n          '<a class=\"add icon\" title=\"' + Craft.t('app', 'New child') + '\"></a>'\n        ).appendTo($row);\n        this.initNewChildMenus($addBtn);\n      }\n\n      $row.css('margin-bottom', -30);\n      $row.velocity({'margin-bottom': 0}, 'fast');\n    },\n\n    removeElement: function ($element) {\n      var $li = $element.parent().parent();\n\n      if (this.settings.sortable) {\n        this.structureDrag.removeItems($li);\n      }\n\n      var $parentUl;\n\n      if (!$li.siblings().length) {\n        $parentUl = $li.parent();\n      }\n\n      $li\n        .css('visibility', 'hidden')\n        .velocity({marginBottom: -$li.height()}, 'fast', () => {\n          $li.remove();\n\n          if (typeof $parentUl !== 'undefined') {\n            this._removeUl($parentUl);\n          }\n        });\n    },\n\n    _removeUl: function ($ul) {\n      $ul.siblings('.row').children('.toggle').remove();\n      $ul.remove();\n    },\n\n    destroy: function () {\n      this.$container.removeData('structure');\n      this.base();\n    },\n  },\n  {\n    baseIndent: 8,\n    nestedIndent: 35,\n\n    defaults: {\n      storageKey: null,\n      sortable: false,\n      newChildUrl: null,\n      maxLevels: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Structure drag class\n */\nCraft.StructureDrag = Garnish.Drag.extend({\n  structure: null,\n  maxLevels: null,\n  draggeeLevel: null,\n\n  $helperLi: null,\n  $targets: null,\n  draggeeHeight: null,\n\n  init: function (structure, maxLevels) {\n    this.structure = structure;\n    this.maxLevels = maxLevels;\n\n    this.$insertion = $('<li class=\"draginsertion\"/>');\n\n    var $items = this.structure.$container.find('li');\n\n    this.base($items, {\n      handle: '.element:first, .move:first',\n      helper: this.getHelper.bind(this),\n    });\n  },\n\n  getHelper: function ($helper) {\n    this.$helperLi = $helper;\n    var $ul = $('<ul class=\"structure draghelper\"/>').append($helper);\n    $helper.css(\n      'padding-' + Craft.left,\n      this.$draggee.css('padding-' + Craft.left)\n    );\n    $helper.find('.move').removeAttr('title');\n    return $ul;\n  },\n\n  onDragStart: function () {\n    this.$targets = $();\n\n    // Recursively find each of the targets, in the order they appear to be in\n    this.findTargets(this.structure.$container);\n\n    // How deep does the rabbit hole go?\n    this.draggeeLevel = 0;\n    var $level = this.$draggee;\n    do {\n      this.draggeeLevel++;\n      $level = $level.find('> ul > li');\n    } while ($level.length);\n\n    // Collapse the draggee\n    this.draggeeHeight = this.$draggee.height();\n    this.$draggee.velocity(\n      {\n        height: 0,\n      },\n      'fast',\n      () => {\n        this.$draggee.addClass('hidden');\n      }\n    );\n    this.base();\n\n    this.addListener(Garnish.$doc, 'keydown', function (ev) {\n      if (ev.keyCode === Garnish.ESC_KEY) {\n        this.cancelDrag();\n      }\n    });\n  },\n\n  findTargets: function ($ul) {\n    var $lis = $ul.children().not(this.$draggee);\n\n    for (var i = 0; i < $lis.length; i++) {\n      var $li = $($lis[i]);\n      this.$targets = this.$targets.add($li.children('.row'));\n\n      if (!$li.hasClass('collapsed')) {\n        this.findTargets($li.children('ul'));\n      }\n    }\n  },\n\n  onDrag: function () {\n    if (this._.$closestTarget) {\n      this._.$closestTarget.removeClass('draghover');\n      this.$insertion.remove();\n    }\n\n    // First let's find the closest target\n    this._.$closestTarget = null;\n    this._.closestTargetPos = null;\n    this._.closestTargetYDiff = null;\n    this._.closestTargetOffset = null;\n    this._.closestTargetHeight = null;\n\n    for (this._.i = 0; this._.i < this.$targets.length; this._.i++) {\n      this._.$target = $(this.$targets[this._.i]);\n      this._.targetOffset = this._.$target.offset();\n      this._.targetHeight = this._.$target.outerHeight();\n      this._.targetYMidpoint =\n        this._.targetOffset.top + this._.targetHeight / 2;\n      this._.targetYDiff = Math.abs(this.mouseY - this._.targetYMidpoint);\n\n      if (\n        this._.i === 0 ||\n        (this.mouseY >= this._.targetOffset.top + 5 &&\n          this._.targetYDiff < this._.closestTargetYDiff)\n      ) {\n        this._.$closestTarget = this._.$target;\n        this._.closestTargetPos = this._.i;\n        this._.closestTargetYDiff = this._.targetYDiff;\n        this._.closestTargetOffset = this._.targetOffset;\n        this._.closestTargetHeight = this._.targetHeight;\n      } else {\n        // Getting colder\n        break;\n      }\n    }\n\n    if (!this._.$closestTarget) {\n      return;\n    }\n\n    // Are we hovering above the first row?\n    if (\n      this._.closestTargetPos === 0 &&\n      this.mouseY < this._.closestTargetOffset.top + 5\n    ) {\n      this.$insertion.prependTo(this.structure.$container);\n    } else {\n      this._.$closestTargetLi = this._.$closestTarget.parent();\n      this._.closestTargetLevel = this._.$closestTargetLi.data('level');\n\n      // Is there a next row?\n      if (this._.closestTargetPos < this.$targets.length - 1) {\n        this._.$nextTargetLi = $(\n          this.$targets[this._.closestTargetPos + 1]\n        ).parent();\n        this._.nextTargetLevel = this._.$nextTargetLi.data('level');\n      } else {\n        this._.$nextTargetLi = null;\n        this._.nextTargetLevel = null;\n      }\n\n      // Are we hovering between this row and the next one?\n      this._.hoveringBetweenRows =\n        this.mouseY >=\n        this._.closestTargetOffset.top + this._.closestTargetHeight - 5;\n\n      /**\n       * Scenario 1: Both rows have the same level.\n       *\n       *     * Row 1\n       *     ----------------------\n       *     * Row 2\n       */\n\n      if (\n        this._.$nextTargetLi &&\n        this._.nextTargetLevel == this._.closestTargetLevel\n      ) {\n        if (this._.hoveringBetweenRows) {\n          if (\n            !this.maxLevels ||\n            this.maxLevels >= this._.closestTargetLevel + this.draggeeLevel - 1\n          ) {\n            // Position the insertion after the closest target\n            this.$insertion.insertAfter(this._.$closestTargetLi);\n          }\n        } else {\n          if (\n            !this.maxLevels ||\n            this.maxLevels >= this._.closestTargetLevel + this.draggeeLevel\n          ) {\n            this._.$closestTarget.addClass('draghover');\n          }\n        }\n      } else if (\n        /**\n         * Scenario 2: Next row is a child of this one.\n         *\n         *     * Row 1\n         *     ----------------------\n         *         * Row 2\n         */\n        this._.$nextTargetLi &&\n        this._.nextTargetLevel > this._.closestTargetLevel\n      ) {\n        if (\n          !this.maxLevels ||\n          this.maxLevels >= this._.nextTargetLevel + this.draggeeLevel - 1\n        ) {\n          if (this._.hoveringBetweenRows) {\n            // Position the insertion as the first child of the closest target\n            this.$insertion.insertBefore(this._.$nextTargetLi);\n          } else {\n            this._.$closestTarget.addClass('draghover');\n            this.$insertion.appendTo(this._.$closestTargetLi.children('ul'));\n          }\n        }\n      } else {\n        /**\n         * Scenario 3: Next row is a child of a parent node, or there is no next row.\n         *\n         *         * Row 1\n         *     ----------------------\n         *     * Row 2\n         */\n        if (this._.hoveringBetweenRows) {\n          // Determine which <li> to position the insertion after\n          this._.draggeeX = this.mouseX - this.targetItemMouseDiffX;\n\n          if (Craft.orientation === 'rtl') {\n            this._.draggeeX += this.$helperLi.width();\n          }\n\n          this._.$parentLis = this._.$closestTarget.parentsUntil(\n            this.structure.$container,\n            'li'\n          );\n          this._.$closestParentLi = null;\n          this._.closestParentLiXDiff = null;\n          this._.closestParentLevel = null;\n\n          for (this._.i = 0; this._.i < this._.$parentLis.length; this._.i++) {\n            this._.$parentLi = $(this._.$parentLis[this._.i]);\n            this._.parentLiX = this._.$parentLi.offset().left;\n\n            if (Craft.orientation === 'rtl') {\n              this._.parentLiX += this._.$parentLi.width();\n            }\n\n            this._.parentLiXDiff = Math.abs(this._.parentLiX - this._.draggeeX);\n            this._.parentLevel = this._.$parentLi.data('level');\n\n            if (\n              (!this.maxLevels ||\n                this.maxLevels >= this._.parentLevel + this.draggeeLevel - 1) &&\n              (!this._.$closestParentLi ||\n                (this._.parentLiXDiff < this._.closestParentLiXDiff &&\n                  (!this._.$nextTargetLi ||\n                    this._.parentLevel >= this._.nextTargetLevel)))\n            ) {\n              this._.$closestParentLi = this._.$parentLi;\n              this._.closestParentLiXDiff = this._.parentLiXDiff;\n              this._.closestParentLevel = this._.parentLevel;\n            }\n          }\n\n          if (this._.$closestParentLi) {\n            this.$insertion.insertAfter(this._.$closestParentLi);\n          }\n        } else {\n          if (\n            !this.maxLevels ||\n            this.maxLevels >= this._.closestTargetLevel + this.draggeeLevel\n          ) {\n            this._.$closestTarget.addClass('draghover');\n          }\n        }\n      }\n    }\n  },\n\n  cancelDrag: function () {\n    this.$insertion.remove();\n\n    if (this._.$closestTarget) {\n      this._.$closestTarget.removeClass('draghover');\n    }\n\n    this.onMouseUp();\n  },\n\n  onDragStop: function () {\n    // Are we repositioning the draggee?\n    if (\n      this._.$closestTarget &&\n      (this.$insertion.parent().length ||\n        this._.$closestTarget.hasClass('draghover'))\n    ) {\n      var $draggeeParent, moved;\n\n      // Are we about to leave the draggee's original parent childless?\n      if (!this.$draggee.siblings().length) {\n        $draggeeParent = this.$draggee.parent();\n      }\n\n      if (this.$insertion.parent().length) {\n        // Make sure the insertion isn't right next to the draggee\n        var $closestSiblings = this.$insertion\n          .next()\n          .add(this.$insertion.prev());\n\n        if ($.inArray(this.$draggee[0], $closestSiblings) === -1) {\n          this.$insertion.replaceWith(this.$draggee);\n          moved = true;\n        } else {\n          this.$insertion.remove();\n          moved = false;\n        }\n      } else {\n        var $ul = this._.$closestTargetLi.children('ul');\n\n        // Make sure this is a different parent than the draggee's\n        if (!$draggeeParent || !$ul.length || $ul[0] !== $draggeeParent[0]) {\n          if (!$ul.length) {\n            var $toggle = $(\n              '<div class=\"toggle\" title=\"' +\n                Craft.t('app', 'Show/hide children') +\n                '\"/>'\n            ).prependTo(this._.$closestTarget);\n            this.structure.initToggle($toggle);\n\n            $ul = $('<ul>').appendTo(this._.$closestTargetLi);\n          } else if (this._.$closestTargetLi.hasClass('collapsed')) {\n            this._.$closestTarget.children('.toggle').trigger('click');\n          }\n\n          this.$draggee.appendTo($ul);\n          moved = true;\n        } else {\n          moved = false;\n        }\n      }\n\n      // Remove the class either way\n      this._.$closestTarget.removeClass('draghover');\n\n      if (moved) {\n        // Now deal with the now-childless parent\n        if ($draggeeParent) {\n          this.structure._removeUl($draggeeParent);\n        }\n\n        // Has the level changed?\n        var newLevel =\n          this.$draggee.parentsUntil(this.structure.$container, 'li').length +\n          1;\n\n        var animateCss;\n\n        if (newLevel != this.$draggee.data('level')) {\n          // Correct the helper's padding if moving to/from level 1\n          if (this.$draggee.data('level') == 1) {\n            animateCss = {};\n            animateCss['padding-' + Craft.left] = 38;\n            this.$helperLi.velocity(animateCss, 'fast');\n          } else if (newLevel == 1) {\n            animateCss = {};\n            animateCss['padding-' + Craft.left] = Craft.Structure.baseIndent;\n            this.$helperLi.velocity(animateCss, 'fast');\n          }\n\n          this.setLevel(this.$draggee, newLevel);\n        }\n\n        // Make it real\n        var $element = this.$draggee.children('.row').children('.element');\n\n        var data = {\n          structureId: this.structure.id,\n          elementId: $element.data('id'),\n          siteId: $element.data('site-id'),\n          prevId: this.$draggee\n            .prev()\n            .children('.row')\n            .children('.element')\n            .data('id'),\n          parentId: this.$draggee\n            .parent('ul')\n            .parent('li')\n            .children('.row')\n            .children('.element')\n            .data('id'),\n        };\n\n        Craft.sendActionRequest('POST', 'structures/move-element', {data}).then(\n          (response) => {\n            Craft.cp.displaySuccess(Craft.t('app', 'New order saved.'));\n          }\n        );\n      }\n    }\n\n    // Animate things back into place\n    this.$draggee\n      .velocity('stop')\n      .removeClass('hidden')\n      .velocity(\n        {\n          height: this.draggeeHeight,\n        },\n        'fast',\n        () => {\n          this.$draggee.css('height', 'auto');\n        }\n      );\n\n    this.returnHelpersToDraggees();\n\n    this.base();\n  },\n\n  setLevel: function ($li, level) {\n    $li.data('level', level);\n\n    var indent = this.structure.getIndent(level);\n\n    var css = {};\n    css['margin-' + Craft.left] = '-' + indent + 'px';\n    css['padding-' + Craft.left] = indent + 'px';\n    this.$draggee.children('.row').css(css);\n\n    var $childLis = $li.children('ul').children();\n\n    for (var i = 0; i < $childLis.length; i++) {\n      this.setLevel($($childLis[i]), level + 1);\n    }\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\nCraft.StructureTableSorter = Garnish.DragSort.extend(\n  {\n    tableView: null,\n    structureId: null,\n    maxLevels: null,\n\n    _basePadding: null,\n    _helperMargin: null,\n\n    _$firstRowCells: null,\n    _$titleHelperCell: null,\n\n    _titleHelperCellOuterWidth: null,\n\n    _ancestors: null,\n    _updateAncestorsFrame: null,\n\n    _draggeeLevel: null,\n    _draggeeLevelDelta: null,\n    draggingLastElements: null,\n    _loadingDraggeeLevelDelta: false,\n\n    _targetLevel: null,\n    _targetLevelBounds: null,\n\n    _positionChanged: null,\n\n    /**\n     * Constructor\n     */\n    init: function (tableView, $elements, settings) {\n      this.tableView = tableView;\n      this.structureId = this.tableView.$table.data('structure-id');\n      this.maxLevels = parseInt(this.tableView.$table.attr('data-max-levels'));\n\n      this._basePadding = 14 + (this.tableView.elementIndex.actions ? 34 : 24); // see _elements/tableview/elements.html\n      this._helperMargin = this.tableView.elementIndex.actions ? 54 : 0;\n\n      settings = $.extend({}, Craft.StructureTableSorter.defaults, settings, {\n        handle: '.move',\n        collapseDraggees: true,\n        singleHelper: true,\n        helperSpacingY: 2,\n        magnetStrength: 4,\n        helper: this.getHelper.bind(this),\n        helperLagBase: 1.5,\n        axis: Garnish.Y_AXIS,\n      });\n\n      this.base($elements, settings);\n    },\n\n    /**\n     * Returns the draggee rows (including any descendent rows).\n     */\n    findDraggee: function () {\n      this._draggeeLevel = this._targetLevel = this.$targetItem.data('level');\n      this._draggeeLevelDelta = 0;\n\n      var $draggee = $(this.$targetItem),\n        $nextRow = this.$targetItem.next();\n\n      while ($nextRow.length) {\n        // See if this row is a descendant of the draggee\n        var nextRowLevel = $nextRow.data('level');\n\n        if (nextRowLevel <= this._draggeeLevel) {\n          break;\n        }\n\n        // Is this the deepest descendant we've seen so far?\n        var nextRowLevelDelta = nextRowLevel - this._draggeeLevel;\n\n        if (nextRowLevelDelta > this._draggeeLevelDelta) {\n          this._draggeeLevelDelta = nextRowLevelDelta;\n        }\n\n        // Add it and prep the next row\n        $draggee = $draggee.add($nextRow);\n        $nextRow = $nextRow.next();\n      }\n\n      // Are we dragging the last elements on the page?\n      this.draggingLastElements = !$nextRow.length;\n\n      // Do we have a maxLevels to enforce,\n      // and does it look like this draggee has descendants we don't know about yet?\n      if (\n        this.maxLevels &&\n        this.draggingLastElements &&\n        this.tableView.getMorePending()\n      ) {\n        // Only way to know the true descendant level delta is to ask PHP\n        this._loadingDraggeeLevelDelta = true;\n\n        var data = this._getAjaxBaseData(this.$targetItem);\n\n        Craft.sendActionRequest('POST', 'structures/get-element-level-delta', {\n          data,\n        }).then((response) => {\n          this._loadingDraggeeLevelDelta = false;\n\n          if (this.dragging) {\n            this._draggeeLevelDelta = response.data.delta;\n            this.drag(false);\n          }\n        });\n      }\n\n      return $draggee;\n    },\n\n    /**\n     * Returns the drag helper.\n     */\n    getHelper: function ($helperRow) {\n      var $outerContainer = $(\n          '<div class=\"elements datatablesorthelper\"/>'\n        ).appendTo(Garnish.$bod),\n        $innerContainer = $('<div class=\"tableview\"/>').appendTo(\n          $outerContainer\n        ),\n        $table = $('<table class=\"data\"/>').appendTo($innerContainer),\n        $tbody = $('<tbody/>').appendTo($table);\n\n      $helperRow.appendTo($tbody);\n\n      // Copy the column widths\n      this._$firstRowCells = this.tableView.$elementContainer\n        .children('tr:first')\n        .children();\n      var $helperCells = $helperRow.children();\n\n      for (var i = 0; i < $helperCells.length; i++) {\n        var $helperCell = $($helperCells[i]);\n\n        // Skip the checkbox cell\n        if ($helperCell.hasClass('checkbox-cell')) {\n          $helperCell.remove();\n          continue;\n        }\n\n        // Hard-set the cell widths\n        var $firstRowCell = $(this._$firstRowCells[i]);\n        var width = $firstRowCell[0].getBoundingClientRect().width;\n\n        $firstRowCell.css('width', width + 'px');\n        $helperCell.css('width', width + 'px');\n\n        // Is this the title cell?\n        if (Garnish.hasAttr($firstRowCell, 'data-titlecell')) {\n          this._$titleHelperCell = $helperCell;\n          var padding = parseInt($firstRowCell.css('padding-' + Craft.left));\n          this._titleHelperCellOuterWidth = width;\n\n          $helperCell.css('padding-' + Craft.left, this._basePadding);\n        }\n      }\n\n      return $outerContainer;\n    },\n\n    /**\n     * Returns whether the draggee can be inserted before a given item.\n     */\n    canInsertBefore: function ($item) {\n      if (this._loadingDraggeeLevelDelta) {\n        return false;\n      }\n\n      return this._getLevelBounds($item.prev(), $item) !== false;\n    },\n\n    /**\n     * Returns whether the draggee can be inserted after a given item.\n     */\n    canInsertAfter: function ($item) {\n      if (this._loadingDraggeeLevelDelta) {\n        return false;\n      }\n\n      return this._getLevelBounds($item, $item.next()) !== false;\n    },\n\n    // Events\n    // -------------------------------------------------------------------------\n\n    /**\n     * On Drag Start\n     */\n    onDragStart: function () {\n      // Get the initial set of ancestors, before the item gets moved\n      this._ancestors = this._getAncestors(\n        this.$targetItem,\n        this.$targetItem.data('level')\n      );\n\n      // Set the initial target level bounds\n      this._setTargetLevelBounds();\n\n      // Check to see if we should load more elements now\n      this.tableView.maybeLoadMore();\n\n      this.base();\n    },\n\n    /**\n     * On Drag\n     */\n    onDrag: function () {\n      this.base();\n      this._updateIndent();\n    },\n\n    /**\n     * On Insertion Point Change\n     */\n    onInsertionPointChange: function () {\n      this._setTargetLevelBounds();\n      this._updateAncestorsBeforeRepaint();\n      this.base();\n    },\n\n    /**\n     * On Drag Stop\n     */\n    onDragStop: function () {\n      this._positionChanged = false;\n      this.base();\n\n      // Update the draggee's padding if the position just changed\n      // ---------------------------------------------------------------------\n\n      if (this._targetLevel != this._draggeeLevel) {\n        var levelDiff = this._targetLevel - this._draggeeLevel;\n\n        for (var i = 0; i < this.$draggee.length; i++) {\n          var $draggee = $(this.$draggee[i]),\n            oldLevel = $draggee.data('level'),\n            newLevel = oldLevel + levelDiff,\n            padding = this._basePadding + this._getLevelIndent(newLevel);\n\n          $draggee.data('level', newLevel);\n          $draggee.find('.element').data('level', newLevel);\n          $draggee\n            .children('[data-titlecell]:first')\n            .css('padding-' + Craft.left, padding);\n        }\n\n        this._positionChanged = true;\n      }\n\n      // Keep in mind this could have also been set by onSortChange()\n      if (this._positionChanged) {\n        // Tell the server about the new position\n        // -----------------------------------------------------------------\n\n        var data = this._getAjaxBaseData(this.$draggee);\n\n        // Find the previous sibling/parent, if there is one\n        var $prevRow = this.$draggee.first().prev();\n\n        while ($prevRow.length) {\n          var prevRowLevel = $prevRow.data('level');\n\n          if (prevRowLevel == this._targetLevel) {\n            data.prevId = $prevRow.data('id');\n            break;\n          }\n\n          if (prevRowLevel < this._targetLevel) {\n            data.parentId = $prevRow.data('id');\n\n            // Is this row collapsed?\n            var $toggle = $prevRow.find('> th > .toggle');\n\n            if (!$toggle.hasClass('expanded')) {\n              // Make it look expanded\n              $toggle.addClass('expanded');\n\n              // Add a temporary row\n              var $spinnerRow = this.tableView._createSpinnerRowAfter($prevRow);\n\n              // Remove the target item\n              if (this.tableView.elementSelect) {\n                this.tableView.elementSelect.removeItems(this.$targetItem);\n              }\n\n              this.removeItems(this.$targetItem);\n              this.$targetItem.remove();\n              this.tableView._totalVisible--;\n            }\n\n            break;\n          }\n\n          $prevRow = $prevRow.prev();\n        }\n\n        Craft.sendActionRequest('POST', 'structures/move-element', {data})\n          .then((response) => {\n            Craft.cp.displaySuccess(Craft.t('app', 'New position saved.'));\n            this.onPositionChange();\n\n            // Were we waiting on this to complete so we can expand the new parent?\n            if ($spinnerRow && $spinnerRow.parent().length) {\n              $spinnerRow.remove();\n              this.tableView._expandElement($toggle, true);\n            }\n\n            // See if we should run any pending tasks\n            Craft.cp.runQueue();\n          })\n          .catch(({response}) => {\n            Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n            this.tableView.elementIndex.updateElements();\n            return;\n          });\n      }\n    },\n\n    onSortChange: function () {\n      if (this.tableView.elementSelect) {\n        this.tableView.elementSelect.resetItemOrder();\n      }\n\n      this._positionChanged = true;\n      this.base();\n    },\n\n    onPositionChange: function () {\n      Garnish.requestAnimationFrame(() => {\n        this.trigger('positionChange');\n        this.settings.onPositionChange();\n      });\n    },\n\n    onReturnHelpersToDraggees: function () {\n      this._$firstRowCells.css('width', '');\n\n      // If we were dragging the last elements on the page and ended up loading any additional elements in,\n      // there could be a gap between the last draggee item and whatever now comes after it.\n      // So remove the post-draggee elements and possibly load up the next batch.\n      if (this.draggingLastElements && this.tableView.getMorePending()) {\n        // Update the element index's record of how many items are actually visible\n        this.tableView._totalVisible +=\n          this.newDraggeeIndexes[0] - this.oldDraggeeIndexes[0];\n\n        var $postDraggeeItems = this.$draggee.last().nextAll();\n\n        if ($postDraggeeItems.length) {\n          this.removeItems($postDraggeeItems);\n          $postDraggeeItems.remove();\n          this.tableView.maybeLoadMore();\n        }\n      }\n\n      this.base();\n    },\n\n    /**\n     * Returns the min and max levels that the draggee could occupy between\n     * two given rows, or false if it’s not going to work out.\n     */\n    _getLevelBounds: function ($prevRow, $nextRow) {\n      // Can't go any lower than the next row, if there is one\n      if ($nextRow && $nextRow.length) {\n        this._getLevelBounds._minLevel = $nextRow.data('level');\n      } else {\n        this._getLevelBounds._minLevel = 1;\n      }\n\n      // Can't go any higher than the previous row + 1\n      if ($prevRow && $prevRow.length) {\n        this._getLevelBounds._maxLevel = $prevRow.data('level') + 1;\n      } else {\n        this._getLevelBounds._maxLevel = 1;\n      }\n\n      // Does this structure have a max level?\n      if (this.maxLevels) {\n        // Make sure it's going to fit at all here\n        if (\n          this._getLevelBounds._minLevel != 1 &&\n          this._getLevelBounds._minLevel + this._draggeeLevelDelta >\n            this.maxLevels\n        ) {\n          return false;\n        }\n\n        // Limit the max level if we have to\n        if (\n          this._getLevelBounds._maxLevel + this._draggeeLevelDelta >\n          this.maxLevels\n        ) {\n          this._getLevelBounds._maxLevel =\n            this.maxLevels - this._draggeeLevelDelta;\n\n          if (this._getLevelBounds._maxLevel < this._getLevelBounds._minLevel) {\n            this._getLevelBounds._maxLevel = this._getLevelBounds._minLevel;\n          }\n        }\n      }\n\n      return {\n        min: this._getLevelBounds._minLevel,\n        max: this._getLevelBounds._maxLevel,\n      };\n    },\n\n    /**\n     * Determines the min and max possible levels at the current draggee's position.\n     */\n    _setTargetLevelBounds: function () {\n      this._targetLevelBounds = this._getLevelBounds(\n        this.$draggee.first().prev(),\n        this.$draggee.last().next()\n      );\n    },\n\n    /**\n     * Determines the target level based on the current mouse position.\n     */\n    _updateIndent: function (forcePositionChange) {\n      // Figure out the target level\n      // ---------------------------------------------------------------------\n\n      // How far has the cursor moved?\n      this._updateIndent._mouseDist = this.realMouseX - this.mousedownX;\n\n      // Flip that if this is RTL\n      if (Craft.orientation === 'rtl') {\n        this._updateIndent._mouseDist *= -1;\n      }\n\n      // What is that in indentation levels?\n      this._updateIndent._indentationDist = Math.round(\n        this._updateIndent._mouseDist / Craft.StructureTableSorter.LEVEL_INDENT\n      );\n\n      // Combine with the original level to get the new target level\n      this._updateIndent._targetLevel =\n        this._draggeeLevel + this._updateIndent._indentationDist;\n\n      // Contain it within our min/max levels\n      if (this._updateIndent._targetLevel < this._targetLevelBounds.min) {\n        this._updateIndent._indentationDist +=\n          this._targetLevelBounds.min - this._updateIndent._targetLevel;\n        this._updateIndent._targetLevel = this._targetLevelBounds.min;\n      } else if (\n        this._updateIndent._targetLevel > this._targetLevelBounds.max\n      ) {\n        this._updateIndent._indentationDist -=\n          this._updateIndent._targetLevel - this._targetLevelBounds.max;\n        this._updateIndent._targetLevel = this._targetLevelBounds.max;\n      }\n\n      // Has the target level changed?\n      if (\n        this._targetLevel !==\n        (this._targetLevel = this._updateIndent._targetLevel)\n      ) {\n        // Target level is changing, so update the ancestors\n        this._updateAncestorsBeforeRepaint();\n      }\n\n      // Update the UI\n      // ---------------------------------------------------------------------\n\n      // How far away is the cursor from the exact target level distance?\n      this._updateIndent._targetLevelMouseDiff =\n        this._updateIndent._mouseDist -\n        this._updateIndent._indentationDist *\n          Craft.StructureTableSorter.LEVEL_INDENT;\n\n      // What's the magnet impact of that?\n      this._updateIndent._magnetImpact = Math.round(\n        this._updateIndent._targetLevelMouseDiff / 15\n      );\n\n      // Put it on a leash\n      if (\n        Math.abs(this._updateIndent._magnetImpact) >\n        Craft.StructureTableSorter.MAX_GIVE\n      ) {\n        this._updateIndent._magnetImpact =\n          (this._updateIndent._magnetImpact > 0 ? 1 : -1) *\n          Craft.StructureTableSorter.MAX_GIVE;\n      }\n\n      // Apply the new margin/width\n      this._updateIndent._closestLevelMagnetIndent =\n        this._getLevelIndent(this._targetLevel) +\n        this._updateIndent._magnetImpact;\n      this.helpers[0].css(\n        'margin-' + Craft.left,\n        this._updateIndent._closestLevelMagnetIndent + this._helperMargin\n      );\n      this._$titleHelperCell.css(\n        'width',\n        this._titleHelperCellOuterWidth -\n          this._updateIndent._closestLevelMagnetIndent\n      );\n    },\n\n    /**\n     * Returns the indent size for a given level\n     */\n    _getLevelIndent: function (level) {\n      return (level - 1) * Craft.StructureTableSorter.LEVEL_INDENT;\n    },\n\n    /**\n     * Returns the base data that should be sent with StructureController Ajax requests.\n     */\n    _getAjaxBaseData: function ($row) {\n      return {\n        structureId: this.structureId,\n        elementId: $row.data('id'),\n        siteId: $row.find('.element:first').data('site-id'),\n      };\n    },\n\n    /**\n     * Returns a row's ancestor rows\n     */\n    _getAncestors: function ($row, targetLevel) {\n      this._getAncestors._ancestors = [];\n\n      if (targetLevel != 0) {\n        this._getAncestors._level = targetLevel;\n        this._getAncestors._$prevRow = $row.prev();\n\n        while (this._getAncestors._$prevRow.length) {\n          if (\n            this._getAncestors._$prevRow.data('level') <\n            this._getAncestors._level\n          ) {\n            this._getAncestors._ancestors.unshift(this._getAncestors._$prevRow);\n            this._getAncestors._level =\n              this._getAncestors._$prevRow.data('level');\n\n            // Did we just reach the top?\n            if (this._getAncestors._level == 0) {\n              break;\n            }\n          }\n\n          this._getAncestors._$prevRow = this._getAncestors._$prevRow.prev();\n        }\n      }\n\n      return this._getAncestors._ancestors;\n    },\n\n    /**\n     * Prepares to have the ancestors updated before the screen is repainted.\n     */\n    _updateAncestorsBeforeRepaint: function () {\n      if (this._updateAncestorsFrame) {\n        Garnish.cancelAnimationFrame(this._updateAncestorsFrame);\n      }\n\n      this._updateAncestorsFrame = Garnish.requestAnimationFrame(\n        this._updateAncestors.bind(this)\n      );\n    },\n\n    _updateAncestors: function () {\n      this._updateAncestorsFrame = null;\n\n      // Update the old ancestors\n      // -----------------------------------------------------------------\n\n      for (\n        this._updateAncestors._i = 0;\n        this._updateAncestors._i < this._ancestors.length;\n        this._updateAncestors._i++\n      ) {\n        this._updateAncestors._$ancestor =\n          this._ancestors[this._updateAncestors._i];\n\n        // One less descendant now\n        this._updateAncestors._$ancestor.data(\n          'descendants',\n          this._updateAncestors._$ancestor.data('descendants') - 1\n        );\n\n        // Is it now childless?\n        if (this._updateAncestors._$ancestor.data('descendants') == 0) {\n          // Remove its toggle\n          this._updateAncestors._$ancestor\n            .find('> th > .toggle:first')\n            .remove();\n        }\n      }\n\n      // Update the new ancestors\n      // -----------------------------------------------------------------\n\n      this._updateAncestors._newAncestors = this._getAncestors(\n        this.$targetItem,\n        this._targetLevel\n      );\n\n      for (\n        this._updateAncestors._i = 0;\n        this._updateAncestors._i < this._updateAncestors._newAncestors.length;\n        this._updateAncestors._i++\n      ) {\n        this._updateAncestors._$ancestor =\n          this._updateAncestors._newAncestors[this._updateAncestors._i];\n\n        // One more descendant now\n        this._updateAncestors._$ancestor.data(\n          'descendants',\n          this._updateAncestors._$ancestor.data('descendants') + 1\n        );\n\n        // Is this its first child?\n        if (this._updateAncestors._$ancestor.data('descendants') == 1) {\n          // Create its toggle\n          const ancestorTitle = this._updateAncestors._$ancestor.data('title');\n          $(\n            '<button class=\"toggle expanded\" type=\"button\" aria-expanded=\"true\" title=\"' +\n              Craft.t('app', 'Show/hide children') +\n              '\" aria-label=\"' +\n              Craft.t('app', 'Show {title} children', {title: ancestorTitle}) +\n              '\"></button>'\n          ).insertAfter(\n            this._updateAncestors._$ancestor.find('> th .move:first')\n          );\n        }\n      }\n\n      this._ancestors = this._updateAncestors._newAncestors;\n\n      delete this._updateAncestors._i;\n      delete this._updateAncestors._$ancestor;\n      delete this._updateAncestors._newAncestors;\n    },\n  },\n  {\n    HELPER_MARGIN: 0,\n    LEVEL_INDENT: 44,\n    MAX_GIVE: 22,\n\n    defaults: {\n      onPositionChange: $.noop,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Table Element Index View\n */\nCraft.TableElementIndexView = Craft.BaseElementIndexView.extend({\n  $table: null,\n  $tableCaption: null,\n  $selectedSortHeader: null,\n  $statusMessage: null,\n\n  structureTableSort: null,\n\n  _totalVisiblePostStructureTableDraggee: null,\n  _morePendingPostStructureTableDraggee: false,\n\n  _broadcastListener: null,\n\n  getElementContainer: function () {\n    // Save a reference to the table\n    this.$table = this.$container.find('table:first');\n    return this.$table.children('tbody:first');\n  },\n\n  afterInit: function () {\n    // Set table caption\n    this.$tableCaption = this.$table.find('caption');\n\n    this.$statusMessage = this.$table.parent().find('[data-status-message]');\n\n    // Set the sort header\n    this.initTableHeaders();\n\n    // Add callback for after elements are updated\n    this.elementIndex.on('updateElements', () => {\n      this._updateScreenReaderStatus();\n    });\n\n    // Create the Structure Table Sorter\n    if (\n      this.elementIndex.settings.context === 'index' &&\n      this.elementIndex.getSelectedSortAttribute() === 'structure' &&\n      Garnish.hasAttr(this.$table, 'data-structure-id')\n    ) {\n      this.structureTableSort = new Craft.StructureTableSorter(\n        this,\n        this.getAllElements()\n      );\n    } else {\n      this.structureTableSort = null;\n    }\n\n    // Handle expand/collapse toggles for Structures\n    if (this.elementIndex.getSelectedSortAttribute() === 'structure') {\n      this.addListener(this.$elementContainer, 'click', function (ev) {\n        var $target = $(ev.target);\n\n        if ($target.hasClass('toggle')) {\n          if (this._collapseElement($target) === false) {\n            this._expandElement($target);\n          }\n        }\n      });\n    }\n\n    // Set up the broadcast listener\n    if (Craft.messageReceiver) {\n      this._broadcastListener = (ev) => {\n        if (ev.data.event === 'saveElement') {\n          const $rows = this.$table.find(\n            `> tbody > tr[data-id=\"${ev.data.id}\"]`\n          );\n          if ($rows.length) {\n            const data = {\n              elementType: this.elementIndex.elementType,\n              source: this.elementIndex.sourceKey,\n              id: ev.data.id,\n              siteId: this.elementIndex.siteId,\n            };\n            Craft.sendActionRequest(\n              'POST',\n              'element-indexes/element-table-html',\n              {data}\n            ).then(({data}) => {\n              for (let i = 0; i < $rows.length; i++) {\n                const $row = $rows.eq(i);\n                $row\n                  .find('> th[data-titlecell] .element')\n                  .replaceWith(data.elementHtml);\n                for (let attribute in data.attributeHtml) {\n                  if (data.attributeHtml.hasOwnProperty(attribute)) {\n                    $row\n                      .find(`> td[data-attr=\"${attribute}\"]`)\n                      .html(data.attributeHtml[attribute]);\n                  }\n                }\n              }\n              new Craft.ElementThumbLoader().load($rows);\n            });\n          }\n        }\n      };\n\n      Craft.messageReceiver.addEventListener(\n        'message',\n        this._broadcastListener\n      );\n    }\n  },\n\n  initTableHeaders: function () {\n    const [selectedSortAttr] = this.elementIndex.getSortAttributeAndDirection();\n    const $tableHeaders = this.$table\n      .children('thead')\n      .children()\n      .children('[data-attribute]');\n\n    for (let i = 0; i < $tableHeaders.length; i++) {\n      const $header = $tableHeaders.eq(i);\n      const attr = $header.attr('data-attribute');\n      let sortValue = 'none';\n\n      // Is this the selected sort attribute?\n      if (attr === selectedSortAttr) {\n        this.$selectedSortHeader = $header;\n        const selectedSortDir = this.elementIndex.getSelectedSortDirection();\n        sortValue = selectedSortDir === 'asc' ? 'ascending' : 'descending';\n        $header.addClass('ordered ' + selectedSortDir);\n        this.makeColumnSortable($header, true);\n      } else {\n        // Is this attribute sortable?\n        if (this.elementIndex.getSortOption(attr)) {\n          this.makeColumnSortable($header);\n        }\n      }\n\n      $header.attr('aria-sort', sortValue);\n    }\n  },\n\n  makeColumnSortable: function ($header, sorted = false) {\n    $header.addClass('orderable');\n\n    const headerHtml = $header.html();\n    const $instructions = this.$tableCaption.find('[data-sort-instructions]');\n    const $headerButton = $('<button/>', {\n      id: `${this.elementIndex.idPrefix}-${$header.attr('data-attribute')}`,\n      type: 'button',\n      'aria-pressed': 'false',\n    }).html(headerHtml);\n\n    if ($instructions.length) {\n      $headerButton.attr('aria-describedby', $instructions.attr('id'));\n    }\n\n    if (sorted) {\n      $headerButton.attr('aria-pressed', 'true');\n      $headerButton.on('click', this._handleSelectedSortHeaderClick.bind(this));\n    } else {\n      $headerButton.on(\n        'click',\n        this._handleUnselectedSortHeaderClick.bind(this)\n      );\n    }\n\n    $header.empty().append($headerButton);\n  },\n\n  isVerticalList: function () {\n    return true;\n  },\n\n  getTotalVisible: function () {\n    if (this._isStructureTableDraggingLastElements()) {\n      return this._totalVisiblePostStructureTableDraggee;\n    } else {\n      return this._totalVisible;\n    }\n  },\n\n  setTotalVisible: function (totalVisible) {\n    if (this._isStructureTableDraggingLastElements()) {\n      this._totalVisiblePostStructureTableDraggee = totalVisible;\n    } else {\n      this._totalVisible = totalVisible;\n    }\n  },\n\n  getMorePending: function () {\n    if (this._isStructureTableDraggingLastElements()) {\n      return this._morePendingPostStructureTableDraggee;\n    } else {\n      return this._morePending;\n    }\n  },\n\n  setMorePending: function (morePending) {\n    if (this._isStructureTableDraggingLastElements()) {\n      this._morePendingPostStructureTableDraggee = morePending;\n    } else {\n      this._morePending = this._morePendingPostStructureTableDraggee =\n        morePending;\n    }\n  },\n\n  getLoadMoreParams: function () {\n    var params = this.base();\n\n    // If we are dragging the last elements on the page,\n    // tell the controller to only load elements positioned after the draggee.\n    if (this._isStructureTableDraggingLastElements()) {\n      params.criteria.positionedAfter =\n        this.structureTableSort.$targetItem.data('id');\n    }\n\n    return params;\n  },\n\n  appendElements: function ($newElements) {\n    this.base($newElements);\n\n    if (this.structureTableSort) {\n      this.structureTableSort.addItems($newElements);\n    }\n\n    Craft.cp.updateResponsiveTables();\n  },\n\n  _collapseElement: function ($toggle, force) {\n    if (!force && !$toggle.hasClass('expanded')) {\n      return false;\n    }\n\n    $toggle.removeClass('expanded');\n    $toggle.attr('aria-expanded', 'false');\n\n    // Find and remove the descendant rows\n    var $row = $toggle.parent().parent(),\n      id = $row.data('id'),\n      level = $row.data('level'),\n      $nextRow = $row.next();\n\n    while ($nextRow.length) {\n      if (!Garnish.hasAttr($nextRow, 'data-spinnerrow')) {\n        if ($nextRow.data('level') <= level) {\n          break;\n        }\n\n        if (this.elementSelect) {\n          this.elementSelect.removeItems($nextRow);\n        }\n\n        if (this.structureTableSort) {\n          this.structureTableSort.removeItems($nextRow);\n        }\n\n        this._totalVisible--;\n      }\n\n      var $nextNextRow = $nextRow.next();\n      $nextRow.remove();\n      $nextRow = $nextNextRow;\n    }\n\n    // Remember that this row should be collapsed\n    if (!this.elementIndex.instanceState.collapsedElementIds) {\n      this.elementIndex.instanceState.collapsedElementIds = [];\n    }\n\n    this.elementIndex.instanceState.collapsedElementIds.push(id);\n    this.elementIndex.setInstanceState(\n      'collapsedElementIds',\n      this.elementIndex.instanceState.collapsedElementIds\n    );\n\n    // Bottom of the index might be viewable now\n    this.maybeLoadMore();\n  },\n\n  _expandElement: function ($toggle, force) {\n    if (!force && $toggle.hasClass('expanded')) {\n      return false;\n    }\n\n    $toggle.addClass('expanded');\n    $toggle.attr('aria-expanded', 'true');\n\n    // Remove this element from our list of collapsed elements\n    if (this.elementIndex.instanceState.collapsedElementIds) {\n      var $row = $toggle.parent().parent(),\n        id = $row.data('id'),\n        index = $.inArray(\n          id,\n          this.elementIndex.instanceState.collapsedElementIds\n        );\n\n      if (index !== -1) {\n        this.elementIndex.instanceState.collapsedElementIds.splice(index, 1);\n        this.elementIndex.setInstanceState(\n          'collapsedElementIds',\n          this.elementIndex.instanceState.collapsedElementIds\n        );\n\n        // Add a temporary row\n        var $spinnerRow = this._createSpinnerRowAfter($row);\n\n        // Load the nested elements\n        let data = $.extend(true, {}, this.settings.params);\n        data.criteria.descendantOf = id;\n\n        Craft.sendActionRequest('POST', this.settings.loadMoreElementsAction, {\n          data,\n        })\n          .then((response) => {\n            // Do we even care about this anymore?\n            if (!$spinnerRow.parent().length) {\n              return;\n            }\n\n            let $newElements = $(response.data.html);\n\n            // Are there more descendants we didn't get in this batch?\n            let totalVisible = this._totalVisible + $newElements.length;\n            let morePending =\n              this.settings.batchSize &&\n              $newElements.length === this.settings.batchSize;\n\n            if (morePending) {\n              // Remove all the elements after it\n              let $nextRows = $spinnerRow.nextAll();\n\n              if (this.elementSelect) {\n                this.elementSelect.removeItems($nextRows);\n              }\n\n              if (this.structureTableSort) {\n                this.structureTableSort.removeItems($nextRows);\n              }\n\n              $nextRows.remove();\n              totalVisible -= $nextRows.length;\n            } else {\n              // Maintain the current 'more' status\n              morePending = this._morePending;\n            }\n\n            $spinnerRow.replaceWith($newElements);\n            this.thumbLoader.load($newElements);\n\n            if (this.elementIndex.actions || this.settings.selectable) {\n              this.elementSelect.addItems(\n                $newElements.filter(':not(.disabled)')\n              );\n              this.elementIndex.updateActionTriggers();\n            }\n\n            if (this.structureTableSort) {\n              this.structureTableSort.addItems($newElements);\n            }\n\n            Craft.appendHeadHtml(response.data.headHtml);\n            Craft.appendBodyHtml(response.data.bodyHtml);\n            Craft.cp.updateResponsiveTables();\n\n            this.setTotalVisible(totalVisible);\n            this.setMorePending(morePending);\n\n            // Is there room to load more right now?\n            this.maybeLoadMore();\n          })\n          .catch((e) => {\n            Craft.cp.displayError();\n            if (!$spinnerRow.parent().length) {\n              return;\n            }\n          });\n      }\n    }\n  },\n\n  _createSpinnerRowAfter: function ($row) {\n    return $(\n      '<tr data-spinnerrow>' +\n        '<td class=\"centeralign\" colspan=\"' +\n        $row.children().length +\n        '\">' +\n        '<div class=\"spinner\"/>' +\n        '</td>' +\n        '</tr>'\n    ).insertAfter($row);\n  },\n\n  _isStructureTableDraggingLastElements: function () {\n    return (\n      this.structureTableSort &&\n      this.structureTableSort.dragging &&\n      this.structureTableSort.draggingLastElements\n    );\n  },\n\n  _handleSelectedSortHeaderClick: function (ev) {\n    var $header = $(ev.currentTarget).closest('th');\n\n    if ($header.hasClass('loading')) {\n      return;\n    }\n\n    // Reverse the sort direction\n    var selectedSortDir = this.elementIndex.getSelectedSortDirection(),\n      newSortDir = selectedSortDir === 'asc' ? 'desc' : 'asc';\n\n    this.elementIndex.setSelectedSortDirection(newSortDir);\n    this._handleSortHeaderClick(ev, $header);\n  },\n\n  _handleUnselectedSortHeaderClick: function (ev) {\n    var $header = $(ev.currentTarget).closest('th');\n\n    if ($header.hasClass('loading')) {\n      return;\n    }\n\n    var attr = $header.attr('data-attribute');\n\n    this.elementIndex.setSelectedSortAttribute(attr);\n    this._handleSortHeaderClick(ev, $header);\n  },\n\n  _handleSortHeaderClick: function (ev, $header) {\n    if (this.$selectedSortHeader) {\n      this.$selectedSortHeader.removeClass('ordered asc desc');\n    }\n\n    $header.addClass('ordered loading');\n    this.elementIndex.updateElements();\n\n    // No need for two spinners\n    this.elementIndex.setIndexAvailable();\n  },\n\n  _updateScreenReaderStatus: function () {\n    const attribute = this.elementIndex.getSelectedSortAttribute();\n    const direction =\n      this.elementIndex.getSelectedSortDirection() === 'asc'\n        ? Craft.t('app', 'Ascending')\n        : Craft.t('app', 'Descending');\n    const label = this.elementIndex.getSortLabel(attribute);\n\n    if (!attribute && !direction && !label) return;\n\n    const message = Craft.t(\n      'app',\n      'Table {name} sorted by {attribute}, {direction}',\n      {\n        name: this.$table.attr('data-name'),\n        attribute: label,\n        direction: direction,\n      }\n    );\n\n    this.$statusMessage.empty();\n    this.$statusMessage.text(message);\n  },\n\n  _updateTableAttributes: function ($element, tableAttributes) {\n    var $tr = $element.closest('tr');\n\n    for (var attr in tableAttributes) {\n      if (!tableAttributes.hasOwnProperty(attr)) {\n        continue;\n      }\n\n      $tr\n        .children('[data-attr=\"' + attr + '\"]:first')\n        .html(tableAttributes[attr]);\n    }\n  },\n\n  destroy: function () {\n    if (this._broadcastListener) {\n      Craft.messageReceiver.removeEventListener(\n        'message',\n        this._broadcastListener\n      );\n      delete this._broadcastListener;\n    }\n\n    this.base();\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Tab manager\n */\nCraft.Tabs = Garnish.Base.extend({\n  $container: null,\n  $tablist: null,\n  $menuBtn: null,\n  $tabs: null,\n  $firstTab: null,\n  $lastTab: null,\n  $selectedTab: null,\n  $focusableTab: null,\n  menu: null,\n\n  init: function (container) {\n    this.$container = $(container);\n    this.$tablist = this.$container.find('> [role=\"tablist\"]:first');\n    this.$tabs = this.$tablist.find('> [role=\"tab\"]');\n    this.$firstTab = this.$tabs.first();\n    this.$lastTab = this.$tabs.last();\n    this.$selectedTab = this.$tabs.filter('.sel:first');\n    this.$focusableTab = this.$tabs.filter('[tabindex=0]:first');\n    this.$menuBtn = this.$container.find('> .menubtn:first').menubtn();\n    this.menu = this.$menuBtn.data('menubtn').menu;\n\n    // Is there already a tab manager?\n    if (this.$container.data('tabs')) {\n      console.warn('Double-instantiating a tab manager on an element');\n      this.$container.data('tabs').destroy();\n    }\n\n    this.$container.data('tabs', this);\n\n    for (let i = 0; i < this.$tabs.length; i++) {\n      const $a = this.$tabs.eq(i);\n\n      // Does it link to an anchor?\n      const href = $a.attr('href');\n      if (href && href.charAt(0) === '#') {\n        this.addListener($a, 'keydown', (ev) => {\n          if ([Garnish.SPACE_KEY, Garnish.RETURN_KEY].includes(ev.keyCode)) {\n            ev.preventDefault();\n            this.selectTab(ev.currentTarget);\n          }\n        });\n        this.addListener($a, 'click', (ev) => {\n          ev.preventDefault();\n          this.selectTab(ev.currentTarget);\n        });\n      }\n\n      this.addListener($a, 'keydown', (ev) => {\n        let $tab;\n        if (\n          [Garnish.LEFT_KEY, Garnish.RIGHT_KEY].includes(ev.keyCode) &&\n          $.contains(this.$tablist[0], ev.currentTarget)\n        ) {\n          if (\n            ev.keyCode ===\n            (Craft.orientation === 'ltr' ? Garnish.LEFT_KEY : Garnish.RIGHT_KEY)\n          ) {\n            $tab = $(ev.currentTarget).prevAll(\n              '[role=\"tab\"]:not(.hidden):first'\n            );\n            $tab = $tab.length ? $tab : this.$lastTab;\n          } else {\n            $tab = $(ev.currentTarget).nextAll(\n              '[role=\"tab\"]:not(.hidden):first'\n            );\n            $tab = $tab.length ? $tab : this.$firstTab;\n          }\n        } else if (\n          ev.keyCode === Garnish.HOME_KEY ||\n          ev.keyCode === Garnish.END_KEY\n        ) {\n          $tab =\n            ev.keyCode === Garnish.HOME_KEY ? this.$firstTab : this.$lastTab;\n        }\n\n        if ($tab) {\n          ev.preventDefault();\n          this.makeTabFocusable($tab);\n          $tab.focus();\n          this.scrollToTab($tab);\n        }\n      });\n    }\n\n    this.updateMenuBtn();\n\n    Garnish.$win.on('resize', () => {\n      this.updateMenuBtn();\n    });\n\n    // Prevent menu options from updating the URL\n    this.menu.$options.on('click', (ev) => {\n      const $option = $(ev.currentTarget);\n      const href = $option.attr('href');\n      if (href && href.charAt(0) === '#') {\n        ev.preventDefault();\n      }\n    });\n\n    this.menu.on('optionselect', (ev) => {\n      this.selectTab($(ev.selectedOption).data('id'));\n    });\n  },\n\n  selectTab: function (tab) {\n    const $tab = this._getTab(tab);\n\n    if ($tab[0] === this.$selectedTab[0]) {\n      return;\n    }\n\n    this.deselectTab();\n    this.$selectedTab = $tab.addClass('sel').attr('aria-selected', 'true');\n    this.makeTabFocusable($tab);\n    $tab.focus();\n    this.scrollToTab($tab);\n\n    this.menu.$options.removeClass('sel');\n    this.menu.$options.filter(`[data-id=\"${$tab.data('id')}\"]`).addClass('sel');\n\n    this.trigger('selectTab', {\n      $tab: $tab,\n    });\n\n    $('#content').trigger('scroll');\n  },\n\n  deselectTab: function () {\n    const $tab = this.$selectedTab\n      .removeClass('sel')\n      .attr('aria-selected', 'false');\n    this.$selectedTab = null;\n\n    this.trigger('deselectTab', {\n      $tab: $tab,\n    });\n  },\n\n  makeTabFocusable: function (tab) {\n    const $tab = this._getTab(tab);\n\n    if ($tab[0] === this.$focusableTab[0]) {\n      return;\n    }\n\n    this.$focusableTab.attr('tabindex', '-1');\n    this.$focusableTab = $tab.attr('tabindex', '0');\n  },\n\n  scrollToTab: function (tab) {\n    const $tab = this._getTab(tab);\n    const scrollLeft = this.$tablist.scrollLeft();\n    const tabOffset = $tab.offset().left;\n    const elemScrollOffset = tabOffset - this.$tablist.offset().left;\n    let targetScrollLeft = false;\n\n    // Is the tab hidden on the left?\n    if (elemScrollOffset < 0) {\n      targetScrollLeft = scrollLeft + elemScrollOffset - 24;\n    } else {\n      const tabWidth = $tab.outerWidth();\n      const ulWidth = this.$tablist.prop('clientWidth');\n\n      // Is it hidden to the right?\n      if (elemScrollOffset + tabWidth > ulWidth) {\n        targetScrollLeft =\n          scrollLeft + (elemScrollOffset - (ulWidth - tabWidth)) + 24;\n      }\n    }\n\n    if (targetScrollLeft !== false) {\n      this.$tablist.scrollLeft(targetScrollLeft);\n    }\n  },\n\n  updateMenuBtn: function () {\n    if (\n      Math.floor(this.$tablist.prop('scrollWidth') - 48) >\n      this.$container.prop('clientWidth')\n    ) {\n      this.$tablist.addClass('scrollable');\n      this.$menuBtn.removeClass('hidden');\n    } else {\n      this.$tablist.removeClass('scrollable');\n      this.$menuBtn.addClass('hidden');\n    }\n  },\n\n  _getTab: function (tab) {\n    if (tab instanceof jQuery) {\n      return tab;\n    }\n\n    if (tab instanceof HTMLElement) {\n      return $(tab);\n    }\n\n    if (typeof tab !== 'string') {\n      throw 'Invalid tab ID';\n    }\n\n    const $tab = this.$tabs.filter(`[data-id=\"${tab}\"]`);\n\n    if (!$tab.length) {\n      throw `Invalid tab ID: ${tab}`;\n    }\n\n    return $tab;\n  },\n\n  destroy: function () {\n    this.$container.removeData('tabs');\n    this.base();\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Tag select input\n */\nCraft.TagSelectInput = Craft.BaseElementSelectInput.extend(\n  {\n    searchTimeout: null,\n    searchMenu: null,\n\n    $container: null,\n    $elementsContainer: null,\n    $elements: null,\n    $addTagInput: null,\n    $spinner: null,\n\n    _ignoreBlur: false,\n\n    init: function (settings) {\n      // Normalize the settings\n      // ---------------------------------------------------------------------\n\n      // Are they still passing in a bunch of arguments?\n      if (!$.isPlainObject(settings)) {\n        // Loop through all of the old arguments and apply them to the settings\n        var normalizedSettings = {},\n          args = ['id', 'name', 'tagGroupId', 'sourceElementId'];\n\n        for (var i = 0; i < args.length; i++) {\n          if (typeof arguments[i] !== 'undefined') {\n            normalizedSettings[args[i]] = arguments[i];\n          } else {\n            break;\n          }\n        }\n\n        settings = normalizedSettings;\n      }\n\n      this.base($.extend({}, Craft.TagSelectInput.defaults, settings));\n\n      this.$addTagInput = this.$container.children('.add').children('.text');\n      this.$spinner = this.$addTagInput.next();\n\n      this.addListener(this.$addTagInput, 'input', () => {\n        if (this.searchTimeout) {\n          clearTimeout(this.searchTimeout);\n        }\n\n        this.searchTimeout = setTimeout(this.searchForTags.bind(this), 500);\n      });\n\n      this.addListener(this.$addTagInput, 'keydown', function (ev) {\n        if (ev.keyCode === Garnish.RETURN_KEY) {\n          ev.preventDefault();\n        }\n\n        let $option;\n\n        switch (ev.keyCode) {\n          case Garnish.RETURN_KEY: {\n            ev.preventDefault();\n            if (this.searchMenu) {\n              this.selectTag(this.searchMenu.$options.filter('.hover'));\n            }\n            return;\n          }\n\n          case Garnish.DOWN_KEY: {\n            ev.preventDefault();\n            if (this.searchMenu) {\n              let $hoverOption = this.searchMenu.$options.filter('.hover');\n              if ($hoverOption.length) {\n                let $nextOption = $hoverOption\n                  .parent()\n                  .nextAll()\n                  .find('a:not(.disabled)')\n                  .first();\n                if ($nextOption.length) {\n                  this.focusOption($nextOption);\n                }\n              } else {\n                this.focusOption(this.searchMenu.$options.eq(0));\n              }\n            }\n            return;\n          }\n\n          case Garnish.UP_KEY: {\n            ev.preventDefault();\n            if (this.searchMenu) {\n              let $hoverOption = this.searchMenu.$options.filter('.hover');\n              if ($hoverOption.length) {\n                let $prevOption = $hoverOption\n                  .parent()\n                  .prevAll()\n                  .find('a:not(.disabled)')\n                  .last();\n                if ($prevOption.length) {\n                  this.focusOption($prevOption);\n                }\n              } else {\n                this.focusOption(\n                  this.searchMenu.$options.eq(\n                    this.searchMenu.$options.length - 1\n                  )\n                );\n              }\n            }\n            return;\n          }\n        }\n      });\n\n      this.addListener(this.$addTagInput, 'focus', function () {\n        if (this.searchMenu) {\n          this.searchMenu.show();\n        }\n      });\n\n      this.addListener(this.$addTagInput, 'blur', function () {\n        if (this._ignoreBlur) {\n          this._ignoreBlur = false;\n          return;\n        }\n\n        setTimeout(() => {\n          if (this.searchMenu) {\n            this.searchMenu.hide();\n          }\n        }, 1);\n      });\n    },\n\n    focusOption: function ($option) {\n      this.searchMenu.$options.removeClass('hover');\n      $option.addClass('hover');\n      this.searchMenu.$menuList.attr(\n        'aria-activedescendant',\n        $option.attr('id')\n      );\n    },\n\n    // No \"add\" button\n    getAddElementsBtn: $.noop,\n\n    getElementSortAxis: function () {\n      return null;\n    },\n\n    searchForTags: function () {\n      if (this.searchMenu) {\n        this.killSearchMenu();\n      }\n\n      var val = this.$addTagInput.val();\n\n      if (val) {\n        this.$spinner.removeClass('hidden');\n\n        var excludeIds = [];\n\n        for (var i = 0; i < this.$elements.length; i++) {\n          var id = $(this.$elements[i]).data('id');\n\n          if (id) {\n            excludeIds.push(id);\n          }\n        }\n\n        if (this.settings.sourceElementId) {\n          excludeIds.push(this.settings.sourceElementId);\n        }\n\n        var data = {\n          search: this.$addTagInput.val(),\n          tagGroupId: this.settings.tagGroupId,\n          excludeIds: excludeIds,\n        };\n\n        Craft.sendActionRequest('POST', 'tags/search-for-tags', {data})\n          .then((response) => {\n            if (this.searchMenu) {\n              this.killSearchMenu();\n            }\n            this.$spinner.addClass('hidden');\n            var $menu = $('<div class=\"menu tagmenu\"/>').appendTo(Garnish.$bod),\n              $ul = $('<ul/>').appendTo($menu);\n\n            var $li;\n\n            for (var i = 0; i < response.data.tags.length; i++) {\n              $li = $('<li/>').appendTo($ul);\n\n              $('<a data-icon=\"tag\"/>')\n                .appendTo($li)\n                .text(response.data.tags[i].title)\n                .data('id', response.data.tags[i].id)\n                .addClass(response.data.tags[i].exclude ? 'disabled' : '');\n            }\n\n            if (!response.data.exactMatch) {\n              $li = $('<li/>').appendTo($ul);\n              $('<a data-icon=\"plus\"/>').appendTo($li).text(data.search);\n            }\n\n            $ul.find('a:not(.disabled):first').addClass('hover');\n\n            this.searchMenu = new Garnish.Menu($menu, {\n              attachToElement: this.$addTagInput,\n              onOptionSelect: this.selectTag.bind(this),\n            });\n\n            this.addListener($menu, 'mousedown', () => {\n              this._ignoreBlur = true;\n            });\n\n            this.searchMenu.show();\n          })\n          .catch(({response}) => {\n            // Just in case\n            if (this.searchMenu) {\n              this.killSearchMenu();\n            }\n\n            this.$spinner.addClass('hidden');\n          });\n      } else {\n        this.$spinner.addClass('hidden');\n      }\n    },\n\n    selectTag: function (option) {\n      var $option = $(option);\n\n      if ($option.hasClass('disabled')) {\n        return;\n      }\n\n      var id = $option.data('id');\n      var title = $option.text();\n\n      var $element = $('<div/>', {\n        class: 'element small removable',\n        'data-id': id,\n        'data-site-id': this.settings.targetSiteId,\n        'data-label': title,\n        'data-editable': '1',\n      }).appendTo(this.$elementsContainer);\n\n      var $input = $('<input/>', {\n        type: 'hidden',\n        name: this.settings.name + '[]',\n        value: id,\n      }).appendTo($element);\n\n      $('<button/>', {\n        class: 'delete icon',\n        title: Craft.t('app', 'Remove'),\n        type: 'button',\n        'aria-label': Craft.t('app', 'Remove {label}', {\n          label: title,\n        }),\n      }).appendTo($element);\n\n      var $titleContainer = $('<div/>', {\n        class: 'label',\n      }).appendTo($element);\n\n      $('<span/>', {\n        class: 'title',\n        text: title,\n      }).appendTo($titleContainer);\n\n      var margin = -($element.outerWidth() + 10);\n      this.$addTagInput.css('margin-' + Craft.left, margin + 'px');\n\n      var animateCss = {};\n      animateCss['margin-' + Craft.left] = 0;\n      this.$addTagInput.velocity(animateCss, 'fast');\n\n      this.$elements = this.$elements.add($element);\n\n      this.addElements($element);\n\n      this.killSearchMenu();\n      this.$addTagInput.val('');\n      this.$addTagInput.trigger('focus');\n\n      if (!id) {\n        // We need to create the tag first\n        $element.addClass('loading disabled');\n\n        var data = {\n          groupId: this.settings.tagGroupId,\n          title: title,\n        };\n\n        Craft.sendActionRequest('POST', 'tags/create-tag', {data})\n          .then((response) => {\n            $element.attr('data-id', response.data.id);\n            $input.val(response.data.id);\n\n            $element.removeClass('loading disabled');\n          })\n          .catch(({response}) => {\n            this.removeElement($element);\n            Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n          });\n      }\n    },\n\n    killSearchMenu: function () {\n      this.searchMenu.hide();\n      this.searchMenu.destroy();\n      this.searchMenu = null;\n    },\n  },\n  {\n    defaults: {\n      tagGroupId: null,\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Thumb Element Index View\n */\nCraft.ThumbsElementIndexView = Craft.BaseElementIndexView.extend({\n  getElementContainer: function () {\n    return this.$container.children('ul');\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\nCraft.ui = {\n  createButton: function (config) {\n    const $btn = $('<button/>', {\n      type: config.type || 'button',\n      class: 'btn',\n    });\n    if (config.id) {\n      $btn.attr('id', config.id);\n    }\n    if (config.class) {\n      $btn.addClass(config.class);\n    }\n    if (config.ariaLabel) {\n      $btn.attr('aria-label', config.ariaLabel);\n    }\n    if (config.role) {\n      $btn.attr('role', config.role);\n    }\n    if (config.html) {\n      $btn.html(config.html);\n    } else if (config.label) {\n      $btn.append($('<div class=\"label\"/>').text(config.label));\n    } else {\n      $btn.addClass('btn-empty');\n    }\n    if (config.toggle) {\n      $btn.attr('aria-expanded', 'false');\n    }\n    if (config.controls) {\n      $btn.attr('aria-controls', config.controls);\n    }\n    if (config.spinner) {\n      $btn.append($('<div class=\"spinner spinner-absolute\"/>'));\n    }\n    return $btn;\n  },\n\n  createSubmitButton: function (config) {\n    const $btn = this.createButton(\n      Object.assign({}, config, {\n        type: 'submit',\n        label: config.label || Craft.t('app', 'Submit'),\n      })\n    );\n    $btn.addClass('submit');\n    return $btn;\n  },\n\n  createTextInput: function (config) {\n    config = $.extend(\n      {\n        autocomplete: false,\n      },\n      config\n    );\n    var $input = $('<input/>', {\n      attr: {\n        class: 'text',\n        type: config.type || 'text',\n        inputmode: config.inputmode,\n        id: config.id,\n        size: config.size,\n        name: config.name,\n        value: config.value,\n        maxlength: config.maxlength,\n        autofocus: this.getAutofocusValue(config.autofocus),\n        autocomplete:\n          typeof config.autocomplete === 'boolean'\n            ? config.autocomplete\n              ? 'on'\n              : 'off'\n            : config.autocomplete,\n        disabled: this.getDisabledValue(config.disabled),\n        readonly: config.readonly,\n        title: config.title,\n        placeholder: config.placeholder,\n        step: config.step,\n        min: config.min,\n        max: config.max,\n      },\n    });\n\n    if (config.class) {\n      $input.addClass(config.class);\n    }\n    if (config.placeholder) {\n      $input.addClass('nicetext');\n    }\n    if (config.type === 'password') {\n      $input.addClass('password');\n    }\n    if (config.disabled) {\n      $input.addClass('disabled');\n    }\n    if (!config.size) {\n      $input.addClass('fullwidth');\n    }\n\n    if (config.showCharsLeft && config.maxlength) {\n      $input\n        .attr('data-show-chars-left')\n        .css(\n          'padding-' + (Craft.orientation === 'ltr' ? 'right' : 'left'),\n          7.2 * config.maxlength.toString().length + 14 + 'px'\n        );\n    }\n\n    if (config.placeholder || config.showCharsLeft) {\n      new Garnish.NiceText($input);\n    }\n\n    if (config.type === 'password') {\n      return $('<div class=\"passwordwrapper\"/>').append($input);\n    } else {\n      return $input;\n    }\n  },\n\n  createTextField: function (config) {\n    if (!config.id) {\n      config.id = 'text' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createTextInput(config), config);\n  },\n\n  createCopyTextInput: function (config) {\n    let id = config.id || 'copytext' + Math.floor(Math.random() * 1000000000);\n    let buttonId = config.buttonId || `${id}-btn`;\n\n    let $container = $('<div/>', {\n      class: 'copytext',\n    });\n\n    let $input = this.createTextInput(\n      $.extend({}, config, {\n        readonly: true,\n      })\n    ).appendTo($container);\n\n    let $btn = $('<button/>', {\n      type: 'button',\n      id: buttonId,\n      class: 'btn',\n      'data-icon': 'clipboard',\n      title: Craft.t('app', 'Copy to clipboard'),\n      'aria-label': Craft.t('app', 'Copy to clipboard'),\n    }).appendTo($container);\n\n    $btn.on('click', () => {\n      $input[0].select();\n      document.execCommand('copy');\n      Craft.cp.displayNotice(Craft.t('app', 'Copied to clipboard.'));\n      $container.trigger('copy');\n      $input[0].setSelectionRange(0, 0);\n    });\n\n    return $container;\n  },\n\n  createCopyTextBtn: function (config) {\n    let id = config.id || 'copytext' + Math.floor(Math.random() * 1000000000);\n    let value = config.value;\n\n    let $btn = $('<div/>', {\n      id,\n      class: 'copytextbtn',\n      role: 'button',\n      title: Craft.t('app', 'Copy to clipboard'),\n      'aria-label': Craft.t('app', 'Copy to clipboard'),\n      tabindex: '0',\n    });\n\n    if (config.class) {\n      $btn.addClass(config.class);\n    }\n\n    let $input = $('<input/>', {\n      value,\n      readonly: true,\n      size: value.length,\n      tabindex: '-1',\n    }).appendTo($btn);\n\n    let $icon = $('<span/>', {\n      'data-icon': 'clipboard',\n      'aria-hidden': 'true',\n    }).appendTo($btn);\n\n    const copyValue = function () {\n      $input[0].select();\n      document.execCommand('copy');\n      Craft.cp.displayNotice(Craft.t('app', 'Copied to clipboard.'));\n      $btn.trigger('copy');\n      $input[0].setSelectionRange(0, 0);\n      $btn.focus();\n    };\n\n    $btn.on('click', () => {\n      copyValue();\n    });\n\n    $btn.on('keydown', (ev) => {\n      if (ev.keyCode === Garnish.SPACE_KEY) {\n        copyValue();\n        ev.preventDefault();\n      }\n    });\n\n    return $btn;\n  },\n\n  createCopyTextField: function (config) {\n    if (!config.id) {\n      config.id = 'copytext' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createCopyTextInput(config), config);\n  },\n\n  createCopyTextPrompt: function (config) {\n    let $container = $('<div/>', {\n      class: 'modal fitted',\n    });\n    let $body = $('<div/>', {\n      class: 'body',\n    }).appendTo($container);\n    this.createCopyTextField(\n      $.extend(\n        {\n          size: Math.max(Math.min(config.value.length, 50), 25),\n        },\n        config\n      )\n    ).appendTo($body);\n\n    const $label = $body.find('label');\n\n    // Provide accessible name for modal dialog\n    if ($label.length > 0 && $label.attr('id')) {\n      $container.attr('aria-labelledby', $label.attr('id'));\n    }\n\n    let modal = new Garnish.Modal($container, {\n      closeOtherModals: false,\n    });\n    $container.on('copy', () => {\n      modal.hide();\n    });\n    return $container;\n  },\n\n  createTextarea: function (config) {\n    var $textarea = $('<textarea/>', {\n      class: 'text',\n      rows: config.rows || 2,\n      cols: config.cols || 50,\n      id: config.id,\n      name: config.name,\n      maxlength: config.maxlength,\n      autofocus: config.autofocus && !Garnish.isMobileBrowser(true),\n      disabled: !!config.disabled,\n      placeholder: config.placeholder,\n      html: config.value,\n    });\n\n    if (config.showCharsLeft) {\n      $textarea.attr('data-show-chars-left', '');\n    }\n\n    if (config.class) {\n      $textarea.addClass(config.class);\n    }\n\n    if (!config.size) {\n      $textarea.addClass('fullwidth');\n    }\n\n    return $textarea;\n  },\n\n  createTextareaField: function (config) {\n    if (!config.id) {\n      config.id = 'textarea' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createTextarea(config), config);\n  },\n\n  createSelect: function (config) {\n    var $container = $('<div/>', {\n      class: 'select',\n    });\n\n    if (config.class) {\n      $container.addClass(config.class);\n    }\n\n    var $select = $('<select/>', {\n      id: config.id,\n      name: config.name,\n      autofocus: config.autofocus && Garnish.isMobileBrowser(true),\n      disabled: config.disabled,\n      'data-target-prefix': config.targetPrefix,\n      'aria-labelledby': config.labelledBy,\n    }).appendTo($container);\n\n    // Normalize the options into an array\n    if ($.isPlainObject(config.options)) {\n      let options = [];\n      for (var key in config.options) {\n        if (!config.options.hasOwnProperty(key)) {\n          continue;\n        }\n        let option = config.options[key];\n        if ($.isPlainObject(option)) {\n          if (typeof option.optgroup !== 'undefined') {\n            options.push(option);\n          } else {\n            options.push({\n              label: option.label,\n              value: typeof option.value !== 'undefined' ? option.value : key,\n              disabled:\n                typeof option.disabled !== 'undefined'\n                  ? option.disabled\n                  : false,\n            });\n          }\n        } else {\n          options.push({\n            label: option,\n            value: key,\n          });\n        }\n      }\n      config.options = options;\n    }\n\n    var $optgroup = null;\n\n    for (let i = 0; i < config.options.length; i++) {\n      let option = config.options[i];\n\n      // Starting a new <optgroup>?\n      if (typeof option.optgroup !== 'undefined') {\n        $optgroup = $('<optgroup/>', {\n          label: option.label,\n        }).appendTo($select);\n      } else {\n        $('<option/>', {\n          value: option.value,\n          selected: option.value == config.value,\n          disabled:\n            typeof option.disabled !== 'undefined' ? option.disabled : false,\n          html: option.label,\n        }).appendTo($optgroup || $select);\n      }\n    }\n\n    if (config.toggle) {\n      $select.addClass('fieldtoggle');\n      new Craft.FieldToggle($select);\n    }\n\n    return $container;\n  },\n\n  createSelectField: function (config) {\n    if (!config.id) {\n      config.id = 'select' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createSelect(config), config);\n  },\n\n  createCheckbox: function (config) {\n    var id = config.id || 'checkbox' + Math.floor(Math.random() * 1000000000);\n\n    var $input = $('<input/>', {\n      type: 'checkbox',\n      value: typeof config.value !== 'undefined' ? config.value : '1',\n      id: id,\n      class: 'checkbox',\n      name: config.name,\n      checked: config.checked ? 'checked' : null,\n      autofocus: this.getAutofocusValue(config.autofocus),\n      disabled: this.getDisabledValue(config.disabled),\n      'data-target': config.toggle,\n      'data-reverse-target': config.reverseToggle,\n    });\n\n    if (config.class) {\n      $input.addClass(config.class);\n    }\n\n    if (config.toggle || config.reverseToggle) {\n      $input.addClass('fieldtoggle');\n      new Craft.FieldToggle($input);\n    }\n\n    var $label = $('<label/>', {\n      for: id,\n      html: config.label,\n    });\n\n    // Should we include a hidden input first?\n    if (\n      config.name &&\n      (config.name.length < 3 || config.name.slice(-2) !== '[]')\n    ) {\n      return $([\n        $('<input/>', {\n          type: 'hidden',\n          name: config.name,\n          value: '',\n        })[0],\n        $input[0],\n        $label[0],\n      ]);\n    } else {\n      return $([$input[0], $label[0]]);\n    }\n  },\n\n  createCheckboxField: function (config) {\n    if (!config.id) {\n      config.id = 'checkbox' + Math.floor(Math.random() * 1000000000);\n    }\n\n    var $field = $('<div class=\"field checkboxfield\"/>', {\n      id: `${config.id}-field`,\n    });\n\n    if (config.first) {\n      $field.addClass('first');\n    }\n    if (config.instructions) {\n      $field.addClass('has-instructions');\n    }\n\n    this.createCheckbox(config).appendTo($field);\n\n    if (config.instructions) {\n      $('<div class=\"instructions\"/>')\n        .text(config.instructions)\n        .appendTo($field);\n    }\n\n    return $field;\n  },\n\n  createCheckboxSelect: function (config) {\n    var $container = $('<fieldset class=\"checkbox-select\"/>');\n\n    if (config.class) {\n      $container.addClass(config.class);\n    }\n\n    var allValue, allChecked;\n\n    if (config.showAllOption) {\n      allValue = config.allValue || '*';\n      allChecked = config.values == allValue;\n\n      // Create the \"All\" checkbox\n      $('<div/>')\n        .appendTo($container)\n        .append(\n          this.createCheckbox({\n            id: config.id,\n            class: 'all',\n            label: '<b>' + (config.allLabel || Craft.t('app', 'All')) + '</b>',\n            name: config.name,\n            value: allValue,\n            checked: allChecked,\n            autofocus: config.autofocus,\n          })\n        );\n    } else {\n      allChecked = false;\n    }\n\n    // Create the actual options\n    for (var i = 0; i < config.options.length; i++) {\n      var option = config.options[i];\n\n      if (option.value == allValue) {\n        continue;\n      }\n\n      $('<div/>')\n        .appendTo($container)\n        .append(\n          this.createCheckbox({\n            label: option.label,\n            name: config.name ? config.name + '[]' : null,\n            value: option.value,\n            checked: allChecked || (config.values || []).includes(option.value),\n            disabled: allChecked,\n          })\n        );\n    }\n\n    new Garnish.CheckboxSelect($container);\n\n    return $container;\n  },\n\n  createCheckboxSelectField: function (config) {\n    config.fieldset = true;\n    if (!config.id) {\n      config.id = 'checkboxselect' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createCheckboxSelect(config), config);\n  },\n\n  createLightswitch: function (config) {\n    var value = config.value || '1';\n    var indeterminateValue = config.indeterminateValue || '-';\n\n    var $container = $('<button/>', {\n      type: 'button',\n      class: 'lightswitch',\n      'data-value': value,\n      'data-indeterminate-value': indeterminateValue,\n      id: config.id,\n      role: 'switch',\n      'aria-checked': config.on\n        ? 'true'\n        : config.indeterminate\n        ? 'mixed'\n        : 'false',\n      'aria-labelledby': config.labelId,\n      'data-target': config.toggle,\n      'data-reverse-target': config.reverseToggle,\n    });\n\n    if (config.on) {\n      $container.addClass('on');\n    } else if (config.indeterminate) {\n      $container.addClass('indeterminate');\n    }\n\n    if (config.small) {\n      $container.addClass('small');\n    }\n\n    if (config.disabled) {\n      $container.addClass('disabled');\n    }\n\n    $(\n      '<div class=\"lightswitch-container\">' +\n        '<div class=\"handle\"></div>' +\n        '</div>'\n    ).appendTo($container);\n\n    if (config.name) {\n      $('<input/>', {\n        type: 'hidden',\n        name: config.name,\n        value: config.on\n          ? value\n          : config.indeterminate\n          ? indeterminateValue\n          : '',\n        disabled: config.disabled,\n      }).appendTo($container);\n    }\n\n    if (config.toggle || config.reverseToggle) {\n      $container.addClass('fieldtoggle');\n      new Craft.FieldToggle($container);\n    }\n\n    new Craft.LightSwitch($container, {\n      onChange: config.onChange || $.noop,\n    });\n\n    return $container;\n  },\n\n  createLightswitchField: function (config) {\n    if (!config.id) {\n      config.id = 'lightswitch' + Math.floor(Math.random() * 1000000000);\n    }\n    if (!config.labelId) {\n      config.labelId = `${config.id}-label`;\n    }\n    return this.createField(this.createLightswitch(config), config).addClass(\n      'lightswitch-field'\n    );\n  },\n\n  createColorInput: function (config) {\n    const id = config.id || 'color' + Math.floor(Math.random() * 1000000000);\n    const containerId = config.containerId || id + '-container';\n    const name = config.name || null;\n    const value = config.value || null;\n    const small = config.small || false;\n    const autofocus = config.autofocus && Garnish.isMobileBrowser(true);\n    const disabled = config.disabled || false;\n\n    const $container = $('<div/>', {\n      id: containerId,\n      class: 'flex color-container',\n    });\n\n    const $colorPreviewContainer = $('<div/>', {\n      class: 'color static' + (small ? ' small' : ''),\n    }).appendTo($container);\n\n    const $colorPreview = $('<div/>', {\n      class: 'color-preview',\n      style: config.value ? {backgroundColor: config.value} : null,\n    }).appendTo($colorPreviewContainer);\n\n    const $inputContainer = $('<div/>', {\n      class: 'color-input-container',\n    })\n      .append(\n        $('<div/>', {\n          class: 'color-hex-indicator light code',\n          'aria-hidden': 'true',\n          text: '#',\n        })\n      )\n      .appendTo($container);\n\n    const $input = this.createTextInput({\n      id: id,\n      name: name,\n      value: Craft.ltrim(value, '#'),\n      size: 10,\n      class: 'color-input',\n      autofocus: autofocus,\n      disabled: disabled,\n      'aria-label': Craft.t('app', 'Color hex value'),\n    }).appendTo($inputContainer);\n\n    new Craft.ColorInput($container);\n    return $container;\n  },\n\n  createColorField: function (config) {\n    config.fieldset = true;\n    o;\n    if (!config.id) {\n      config.id = 'color' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createColorInput(config), config);\n  },\n\n  createDateInput: function (config) {\n    const isMobile = Garnish.isMobileBrowser();\n    const id =\n      (config.id || 'date' + Math.floor(Math.random() * 1000000000)) + '-date';\n    const name = config.name || null;\n    const inputName = name ? name + '[date]' : null;\n    const value =\n      config.value && typeof config.value.getMonth === 'function'\n        ? config.value\n        : null;\n    const autofocus = config.autofocus && Garnish.isMobileBrowser(true);\n    const disabled = config.disabled || false;\n\n    const $container = $('<div/>', {\n      class: 'datewrapper',\n    });\n\n    const $input = this.createTextInput({\n      id: id,\n      type: isMobile ? 'date' : 'text',\n      class: isMobile && !value ? 'empty-value' : false,\n      name: inputName,\n      value: value\n        ? isMobile\n          ? value.toISOString().split('T')[0]\n          : Craft.formatDate(value)\n        : '',\n      placeholder: ' ',\n      autocomplete: false,\n      autofocus: autofocus,\n      disabled: disabled,\n    }).appendTo($container);\n\n    $('<div data-icon=\"date\"></div>').appendTo($container);\n\n    if (name) {\n      $('<input/>', {\n        type: 'hidden',\n        name: name + '[timezone]',\n        val: Craft.timezone,\n      }).appendTo($container);\n    }\n\n    if (isMobile) {\n      $input.datetimeinput();\n    } else {\n      $input.datepicker(\n        $.extend(\n          {\n            defaultDate: value || new Date(),\n          },\n          Craft.datepickerOptions\n        )\n      );\n    }\n\n    if (config.hasOuterContainer) {\n      return $container;\n    }\n\n    return $('<div class=\"datetimewrapper\"/>').append($container).datetime();\n  },\n\n  createDateField: function (config) {\n    if (!config.id) {\n      config.id = 'date' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createDateInput(config), config);\n  },\n\n  createDateRangePicker: function (config) {\n    var now = new Date();\n    var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n    config = $.extend(\n      {\n        class: '',\n        options: [\n          'today',\n          'thisWeek',\n          'thisMonth',\n          'thisYear',\n          'past7Days',\n          'past30Days',\n          'past90Days',\n          'pastYear',\n        ],\n        onChange: $.noop,\n        selected: null,\n        startDate: null,\n        endDate: null,\n      },\n      config\n    );\n\n    var $menu = $('<div/>', {class: 'menu'});\n    var $ul = $('<ul/>', {class: 'padded'}).appendTo($menu);\n    var $allOption = $('<a/>')\n      .addClass('sel')\n      .text(Craft.t('app', 'All'))\n      .data('handle', 'all');\n\n    $('<li/>').append($allOption).appendTo($ul);\n\n    var option;\n    var selectedOption;\n    for (var i = 0; i < config.options.length; i++) {\n      var handle = config.options[i];\n      switch (handle) {\n        case 'today':\n          option = {\n            label: Craft.t('app', 'Today'),\n            startDate: today,\n            endDate: today,\n          };\n          break;\n        case 'thisWeek':\n          var firstDayOffset = now.getDay() - Craft.datepickerOptions.firstDay;\n          if (firstDayOffset < 0) {\n            firstDayOffset += 7;\n          }\n          option = {\n            label: Craft.t('app', 'This week'),\n            startDate: new Date(\n              now.getFullYear(),\n              now.getMonth(),\n              now.getDate() - firstDayOffset\n            ),\n            endDate: today,\n          };\n          break;\n        case 'thisMonth':\n          option = {\n            label: Craft.t('app', 'This month'),\n            startDate: new Date(now.getFullYear(), now.getMonth()),\n            endDate: today,\n          };\n          break;\n        case 'thisYear':\n          option = {\n            label: Craft.t('app', 'This year'),\n            startDate: new Date(now.getFullYear(), 0),\n            endDate: today,\n          };\n          break;\n        case 'past7Days':\n          option = {\n            label: Craft.t('app', 'Past {num} days', {num: 7}),\n            startDate: new Date(\n              now.getFullYear(),\n              now.getMonth(),\n              now.getDate() - 7\n            ),\n            endDate: today,\n          };\n          break;\n        case 'past30Days':\n          option = {\n            label: Craft.t('app', 'Past {num} days', {num: 30}),\n            startDate: new Date(\n              now.getFullYear(),\n              now.getMonth(),\n              now.getDate() - 30\n            ),\n            endDate: today,\n          };\n          break;\n        case 'past90Days':\n          option = {\n            label: Craft.t('app', 'Past {num} days', {num: 90}),\n            startDate: new Date(\n              now.getFullYear(),\n              now.getMonth(),\n              now.getDate() - 90\n            ),\n            endDate: today,\n          };\n          break;\n        case 'pastYear':\n          option = {\n            label: Craft.t('app', 'Past year'),\n            startDate: new Date(\n              now.getFullYear(),\n              now.getMonth(),\n              now.getDate() - 365\n            ),\n            endDate: today,\n          };\n          break;\n      }\n\n      var $li = $('<li/>');\n      var $a = $('<a/>', {text: option.label})\n        .data('handle', handle)\n        .data('startDate', option.startDate)\n        .data('endDate', option.endDate)\n        .data('startTime', option.startDate ? option.startDate.getTime() : null)\n        .data('endTime', option.endDate ? option.endDate.getTime() : null);\n\n      if (config.selected && handle == config.selected) {\n        selectedOption = $a[0];\n      }\n\n      $li.append($a);\n      $li.appendTo($ul);\n    }\n\n    $('<hr/>').appendTo($menu);\n\n    var $flex = $('<div/>', {class: 'flex flex-nowrap padded'}).appendTo($menu);\n    var $startDate = this.createDateField({label: Craft.t('app', 'From')})\n      .appendTo($flex)\n      .find('input');\n    var $endDate = this.createDateField({label: Craft.t('app', 'To')})\n      .appendTo($flex)\n      .find('input');\n\n    // prevent ESC keypresses in the date inputs from closing the menu\n    var $dateInputs = $startDate.add($endDate);\n    $dateInputs.on('keyup', function (ev) {\n      if (\n        ev.keyCode === Garnish.ESC_KEY &&\n        $(this).data('datepicker') &&\n        $(this).data('datepicker').dpDiv.is(':visible')\n      ) {\n        ev.stopPropagation();\n      }\n    });\n\n    // prevent clicks in the datepicker divs from closing the menu\n    if ($startDate.data('datepicker')) {\n      $startDate.data('datepicker').dpDiv.on('mousedown', function (ev) {\n        ev.stopPropagation();\n      });\n    }\n    if ($endDate.data('datepicker')) {\n      $endDate.data('datepicker').dpDiv.on('mousedown', function (ev) {\n        ev.stopPropagation();\n      });\n    }\n\n    var menu = new Garnish.Menu($menu, {\n      onOptionSelect: function (option) {\n        var $option = $(option);\n        $btn.text($option.text());\n        menu.setPositionRelativeToAnchor();\n        $menu.find('.sel').removeClass('sel');\n        $option.addClass('sel');\n\n        // Update the start/end dates\n        $startDate.datepicker('setDate', $option.data('startDate'));\n        $endDate.datepicker('setDate', $option.data('endDate'));\n\n        config.onChange(\n          $option.data('startDate') || null,\n          $option.data('endDate') || null,\n          $option.data('handle')\n        );\n      },\n    });\n\n    $dateInputs.on('change', function () {\n      // Do the start & end dates match one of our options?\n      let startDate = $startDate.datepicker('getDate');\n      let endDate = $endDate.datepicker('getDate');\n      let startTime = startDate ? startDate.getTime() : null;\n      let endTime = endDate ? endDate.getTime() : null;\n\n      let $options = $ul.find('a');\n      let $option;\n      let foundOption = false;\n\n      for (let i = 0; i < $options.length; i++) {\n        $option = $options.eq(i);\n        if (\n          startTime === ($option.data('startTime') || null) &&\n          endTime === ($option.data('endTime') || null)\n        ) {\n          menu.selectOption($option[0]);\n          foundOption = true;\n          config.onChange(null, null, $option.data('handle'));\n          break;\n        }\n      }\n\n      if (!foundOption) {\n        $menu.find('.sel').removeClass('sel');\n        $flex.addClass('sel');\n\n        if (!startTime && !endTime) {\n          $btn.text(Craft.t('app', 'All'));\n        } else if (startTime && endTime) {\n          $btn.text($startDate.val() + ' - ' + $endDate.val());\n        } else if (startTime) {\n          $btn.text(Craft.t('app', 'From {date}', {date: $startDate.val()}));\n        } else {\n          $btn.text(Craft.t('app', 'To {date}', {date: $endDate.val()}));\n        }\n        menu.setPositionRelativeToAnchor();\n\n        config.onChange(startDate, endDate, 'custom');\n      }\n    });\n\n    menu.on('hide', function () {\n      $startDate.datepicker('hide');\n      $endDate.datepicker('hide');\n    });\n\n    let btnClasses = 'btn menubtn';\n    if (config.class) {\n      btnClasses = btnClasses + ' ' + config.class;\n    }\n\n    let $btn = $('<button/>', {\n      type: 'button',\n      class: btnClasses,\n      'data-icon': 'date',\n      text: Craft.t('app', 'All'),\n    });\n\n    new Garnish.MenuBtn($btn, menu);\n\n    if (selectedOption) {\n      menu.selectOption(selectedOption);\n    }\n\n    if (config.startDate) {\n      $startDate.datepicker('setDate', config.startDate);\n    }\n\n    if (config.endDate) {\n      $endDate.datepicker('setDate', config.endDate);\n    }\n\n    if (config.startDate || config.endDate) {\n      $dateInputs.trigger('change');\n    }\n\n    return $btn;\n  },\n\n  createTimeInput: function (config) {\n    const isMobile = Garnish.isMobileBrowser();\n    const id =\n      (config.id || 'time' + Math.floor(Math.random() * 1000000000)) + '-time';\n    const name = config.name || null;\n    const inputName = name ? name + '[time]' : null;\n    const value =\n      config.value && typeof config.value.getMonth === 'function'\n        ? config.value\n        : null;\n    const autofocus = config.autofocus && Garnish.isMobileBrowser(true);\n    const disabled = config.disabled || false;\n\n    const $container = $('<div/>', {\n      class: 'timewrapper',\n    });\n\n    const $input = this.createTextInput({\n      id: id,\n      type: isMobile ? 'time' : 'text',\n      class: isMobile && !value ? 'empty-value' : false,\n      name: inputName,\n      placeholder: ' ',\n      autocomplete: false,\n      autofocus: autofocus,\n      disabled: disabled,\n    }).appendTo($container);\n\n    $('<div data-icon=\"time\"></div>').appendTo($container);\n\n    if (name) {\n      $('<input/>', {\n        type: 'hidden',\n        name: name + '[timezone]',\n        val: Craft.timezone,\n      }).appendTo($container);\n    }\n\n    if (isMobile) {\n      if (value) {\n        $input.val(value.toISOString().split('T')[1]);\n      }\n      $input.datetimeinput();\n    } else {\n      $input.timepicker(Craft.timepickerOptions);\n      if (value) {\n        $input.timepicker(\n          'setTime',\n          value.getHours() * 3600 + value.getMinutes() * 60 + value.getSeconds()\n        );\n      }\n    }\n\n    if (config.hasOuterContainer) {\n      return $container;\n    }\n\n    return $('<div class=\"datetimewrapper\"/>').append($container).datetime();\n  },\n\n  createTimeField: function (config) {\n    if (!config.id) {\n      config.id = 'time' + Math.floor(Math.random() * 1000000000);\n    }\n    return this.createField(this.createTimeInput(config), config);\n  },\n\n  createField: function (input, config) {\n    const label =\n      config.label && config.label !== '__blank__' ? config.label : null;\n\n    const $field = $(config.fieldset ? '<fieldset/>' : '<div/>', {\n      class: 'field',\n      id: config.fieldId || (config.id ? config.id + '-field' : null),\n    });\n\n    if (config.first) {\n      $field.addClass('first');\n    }\n\n    if (config.fieldClass) {\n      $field.addClass(config.fieldClass);\n    }\n\n    if (label && config.fieldset) {\n      $('<legend/>', {\n        text: label,\n        class: 'visually-hidden',\n        'data-label': label,\n      }).appendTo($field);\n    }\n\n    if (label) {\n      const $heading = $('<div class=\"heading\"/>').appendTo($field);\n\n      $(config.fieldset ? '<legend/>' : '<label/>', {\n        id:\n          config.labelId ||\n          (config.id\n            ? `${config.id}-${config.fieldset ? 'legend' : 'label'}`\n            : null),\n        class: config.required ? 'required' : null,\n        for: (!config.fieldset && config.id) || null,\n        text: label,\n      }).appendTo($heading);\n    }\n\n    if (config.instructions) {\n      $('<div class=\"instructions\"/>')\n        .text(config.instructions)\n        .appendTo($field);\n    }\n\n    $('<div class=\"input\"/>').append(input).appendTo($field);\n\n    if (config.tip) {\n      const $tip = $('<p class=\"notice has-icon\"/>');\n      $('<span class=\"icon\" aria-hidden=\"true\"/>').appendTo($tip);\n      $('<span class=\"visually-hidden\"/>')\n        .text(Craft.t('app', 'Tip') + ': ')\n        .appendTo($tip);\n      $('<span/>').text(config.tip).appendTo($tip);\n      $tip.appendTo($field);\n    }\n\n    if (config.warning) {\n      const $warning = $('<p class=\"warning has-icon\"/>');\n      $('<span class=\"icon\" aria-hidden=\"true\"/>').appendTo($warning);\n      $('<span class=\"visually-hidden\"/>')\n        .text(Craft.t('app', 'Warning') + ': ')\n        .appendTo($warning);\n      $('<span/>').text(config.warning).appendTo($warning);\n      $warning.appendTo($field);\n    }\n\n    if (config.errors) {\n      this.addErrorsToField($field, config.errors);\n    }\n\n    return $field;\n  },\n\n  createErrorList: function (errors) {\n    var $list = $('<ul class=\"errors\"/>');\n\n    if (errors) {\n      this.addErrorsToList($list, errors);\n    }\n\n    return $list;\n  },\n\n  addErrorsToList: function ($list, errors) {\n    for (var i = 0; i < errors.length; i++) {\n      $('<li/>').text(errors[i]).appendTo($list);\n    }\n  },\n\n  addErrorsToField: function ($field, errors) {\n    if (!errors) {\n      return;\n    }\n\n    $field.addClass('has-errors');\n    $field.children('.input').addClass('errors');\n\n    var $errors = $field.children('ul.errors');\n\n    if (!$errors.length) {\n      $errors = this.createErrorList().appendTo($field);\n    }\n\n    this.addErrorsToList($errors, errors);\n  },\n\n  clearErrorsFromField: function ($field) {\n    $field.removeClass('has-errors');\n    $field.children('.input').removeClass('errors');\n    $field.children('ul.errors').remove();\n  },\n\n  getAutofocusValue: function (autofocus) {\n    return autofocus && !Garnish.isMobileBrowser(true) ? 'autofocus' : null;\n  },\n\n  getDisabledValue: function (disabled) {\n    return disabled ? 'disabled' : null;\n  },\n};\n","/** global: Craft */\n/** global: Garnish */\n/**\n * File Manager.\n */\nCraft.Uploader = Garnish.Base.extend(\n  {\n    uploader: null,\n    allowedKinds: null,\n    $element: null,\n    settings: null,\n    _rejectedFiles: {},\n    _extensionList: null,\n    _totalFileCounter: 0,\n    _validFileCounter: 0,\n\n    init: function ($element, settings) {\n      this._rejectedFiles = {size: [], type: [], limit: []};\n      this.$element = $element;\n      this.allowedKinds = null;\n      this._extensionList = null;\n      this._totalFileCounter = 0;\n      this._validFileCounter = 0;\n\n      settings = $.extend({}, Craft.Uploader.defaults, settings);\n\n      var events = settings.events;\n      delete settings.events;\n\n      if (settings.allowedKinds && settings.allowedKinds.length) {\n        if (typeof settings.allowedKinds === 'string') {\n          settings.allowedKinds = [settings.allowedKinds];\n        }\n\n        this.allowedKinds = settings.allowedKinds;\n        delete settings.allowedKinds;\n      }\n\n      settings.autoUpload = false;\n\n      this.uploader = this.$element.fileupload(settings);\n      for (var event in events) {\n        if (!events.hasOwnProperty(event)) {\n          continue;\n        }\n\n        this.uploader.on(event, events[event]);\n      }\n\n      this.settings = settings;\n\n      this.uploader.on('fileuploadadd', this.onFileAdd.bind(this));\n    },\n\n    /**\n     * Set uploader parameters.\n     */\n    setParams: function (paramObject) {\n      // If CSRF protection isn't enabled, these won't be defined.\n      if (\n        typeof Craft.csrfTokenName !== 'undefined' &&\n        typeof Craft.csrfTokenValue !== 'undefined'\n      ) {\n        // Add the CSRF token\n        paramObject[Craft.csrfTokenName] = Craft.csrfTokenValue;\n      }\n\n      this.uploader.fileupload('option', {formData: paramObject});\n    },\n\n    /**\n     * Get the number of uploads in progress.\n     */\n    getInProgress: function () {\n      return this.uploader.fileupload('active');\n    },\n\n    /**\n     * Return true, if this is the last upload.\n     */\n    isLastUpload: function () {\n      // Processing the last file or not processing at all.\n      return this.getInProgress() < 2;\n    },\n\n    /**\n     * Called on file add.\n     */\n    onFileAdd: function (e, data) {\n      e.stopPropagation();\n\n      var validateExtension = false;\n\n      if (this.allowedKinds) {\n        if (!this._extensionList) {\n          this._createExtensionList();\n        }\n\n        validateExtension = true;\n      }\n\n      // Make sure that file API is there before relying on it\n      data.process().done(() => {\n        var file = data.files[0];\n        var pass = true;\n        if (validateExtension) {\n          var matches = file.name.match(/\\.([a-z0-4_]+)$/i);\n          var fileExtension = matches[1];\n          if (\n            $.inArray(fileExtension.toLowerCase(), this._extensionList) === -1\n          ) {\n            pass = false;\n            this._rejectedFiles.type.push('“' + file.name + '”');\n          }\n        }\n\n        if (file.size > this.settings.maxFileSize) {\n          this._rejectedFiles.size.push('“' + file.name + '”');\n          pass = false;\n        }\n\n        // If the validation has passed for this file up to now, check if we're not hitting any limits\n        if (\n          pass &&\n          typeof this.settings.canAddMoreFiles === 'function' &&\n          !this.settings.canAddMoreFiles(this._validFileCounter)\n        ) {\n          this._rejectedFiles.limit.push('“' + file.name + '”');\n          pass = false;\n        }\n\n        if (pass) {\n          this._validFileCounter++;\n          data.submit();\n        }\n\n        if (++this._totalFileCounter === data.originalFiles.length) {\n          this._totalFileCounter = 0;\n          this._validFileCounter = 0;\n          this.processErrorMessages();\n        }\n      });\n\n      return true;\n    },\n\n    /**\n     * Process error messages.\n     */\n    processErrorMessages: function () {\n      var str;\n\n      if (this._rejectedFiles.type.length) {\n        if (this._rejectedFiles.type.length === 1) {\n          str =\n            'The file {files} could not be uploaded. The allowed file kinds are: {kinds}.';\n        } else {\n          str =\n            'The files {files} could not be uploaded. The allowed file kinds are: {kinds}.';\n        }\n\n        str = Craft.t('app', str, {\n          files: this._rejectedFiles.type.join(', '),\n          kinds: this.allowedKinds.join(', '),\n        });\n        this._rejectedFiles.type = [];\n        alert(str);\n      }\n\n      if (this._rejectedFiles.size.length) {\n        if (this._rejectedFiles.size.length === 1) {\n          str =\n            'The file {files} could not be uploaded, because it exceeds the maximum upload size of {size}.';\n        } else {\n          str =\n            'The files {files} could not be uploaded, because they exceeded the maximum upload size of {size}.';\n        }\n\n        str = Craft.t('app', str, {\n          files: this._rejectedFiles.size.join(', '),\n          size: this.humanFileSize(Craft.maxUploadSize),\n        });\n        this._rejectedFiles.size = [];\n        alert(str);\n      }\n\n      if (this._rejectedFiles.limit.length) {\n        if (this._rejectedFiles.limit.length === 1) {\n          str =\n            'The file {files} could not be uploaded, because the field limit has been reached.';\n        } else {\n          str =\n            'The files {files} could not be uploaded, because the field limit has been reached.';\n        }\n\n        str = Craft.t('app', str, {\n          files: this._rejectedFiles.limit.join(', '),\n        });\n        this._rejectedFiles.limit = [];\n        alert(str);\n      }\n    },\n\n    humanFileSize: function (bytes) {\n      var threshold = 1024;\n\n      if (bytes < threshold) {\n        return bytes + ' B';\n      }\n\n      var units = ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n      var u = -1;\n\n      do {\n        bytes = bytes / threshold;\n        ++u;\n      } while (bytes >= threshold);\n\n      return bytes.toFixed(1) + ' ' + units[u];\n    },\n\n    _createExtensionList: function () {\n      this._extensionList = [];\n\n      for (var i = 0; i < this.allowedKinds.length; i++) {\n        var allowedKind = this.allowedKinds[i];\n\n        if (typeof Craft.fileKinds[allowedKind] !== 'undefined') {\n          for (\n            var j = 0;\n            j < Craft.fileKinds[allowedKind].extensions.length;\n            j++\n          ) {\n            var ext = Craft.fileKinds[allowedKind].extensions[j];\n            this._extensionList.push(ext);\n          }\n        }\n      }\n    },\n\n    destroy: function () {\n      this.$element.fileupload('destroy');\n      this.base();\n    },\n  },\n  {\n    defaults: {\n      dropZone: null,\n      pasteZone: null,\n      fileInput: null,\n      sequentialUploads: true,\n      maxFileSize: Craft.maxUploadSize,\n      allowedKinds: null,\n      events: {},\n      canAddMoreFiles: null,\n      headers: {Accept: 'application/json;q=0.9,*/*;q=0.8'},\n      paramName: 'assets-upload',\n    },\n  }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Handle Generator\n */\nCraft.UriFormatGenerator = Craft.BaseInputGenerator.extend({\n  generateTargetValue: function (sourceVal) {\n    // Remove HTML tags\n    sourceVal = sourceVal.replace('/<(.*?)>/g', '');\n\n    // Make it lowercase\n    sourceVal = sourceVal.toLowerCase();\n\n    // Convert extended ASCII characters to basic ASCII\n    sourceVal = Craft.asciiString(sourceVal);\n\n    // Handle must start with a letter and end with a letter/number\n    sourceVal = sourceVal.replace(/^[^a-z]+/, '');\n    sourceVal = sourceVal.replace(/[^a-z0-9]+$/, '');\n\n    // Get the \"words\"\n    var words = Craft.filterArray(sourceVal.split(/[^a-z0-9]+/));\n\n    var uriFormat = words.join(Craft.slugWordSeparator);\n\n    if (uriFormat && this.settings.suffix) {\n      uriFormat += this.settings.suffix;\n    }\n\n    return uriFormat;\n  },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * User index class\n */\nCraft.UserIndex = Craft.BaseElementIndex.extend({\n  init: function (elementType, $container, settings) {\n    this.on('selectSource', this.updateUrl.bind(this));\n    this.base(elementType, $container, settings);\n  },\n\n  getDefaultSourceKey: function () {\n    // Did they request a specific group in the URL?\n    if (\n      this.settings.context === 'index' &&\n      typeof defaultSourceSlug !== 'undefined'\n    ) {\n      for (let i = 0; i < this.$sources.length; i++) {\n        const $source = $(this.$sources[i]);\n        if ($source.data('slug') === defaultSourceSlug) {\n          return $source.data('key');\n        }\n      }\n    }\n\n    return this.base();\n  },\n\n  updateUrl: function () {\n    if (this.settings.context === 'index') {\n      let uri = 'users';\n      const slug = this.$source.data('slug');\n      if (slug) {\n        uri += `/${slug}`;\n      }\n      Craft.setPath(uri);\n    }\n  },\n});\n\n// Register it!\nCraft.registerElementIndexClass('craft\\\\elements\\\\User', Craft.UserIndex);\n","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ruleSet[1].rules[3].use[1]!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[3]!../../../../../../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[4]!./charts.scss\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"3790022a\", content, true, {});","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ruleSet[1].rules[3].use[1]!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[3]!../../../../../../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[4]!./craft.scss\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"80058a3c\", content, true, {});","/**\n * Translates the list format produced by css-loader into something\n * easier to manipulate.\n */\nexport default function listToStyles (parentId, list) {\n  var styles = []\n  var newStyles = {}\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i]\n    var id = item[0]\n    var css = item[1]\n    var media = item[2]\n    var sourceMap = item[3]\n    var part = {\n      id: parentId + ':' + i,\n      css: css,\n      media: media,\n      sourceMap: sourceMap\n    }\n    if (!newStyles[id]) {\n      styles.push(newStyles[id] = { id: id, parts: [part] })\n    } else {\n      newStyles[id].parts.push(part)\n    }\n  }\n  return styles\n}\n","/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n  Modified by Evan You @yyx990803\n*/\n\nimport listToStyles from './listToStyles'\n\nvar hasDocument = typeof document !== 'undefined'\n\nif (typeof DEBUG !== 'undefined' && DEBUG) {\n  if (!hasDocument) {\n    throw new Error(\n    'vue-style-loader cannot be used in a non-browser environment. ' +\n    \"Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.\"\n  ) }\n}\n\n/*\ntype StyleObject = {\n  id: number;\n  parts: Array<StyleObjectPart>\n}\n\ntype StyleObjectPart = {\n  css: string;\n  media: string;\n  sourceMap: ?string\n}\n*/\n\nvar stylesInDom = {/*\n  [id: number]: {\n    id: number,\n    refs: number,\n    parts: Array<(obj?: StyleObjectPart) => void>\n  }\n*/}\n\nvar head = hasDocument && (document.head || document.getElementsByTagName('head')[0])\nvar singletonElement = null\nvar singletonCounter = 0\nvar isProduction = false\nvar noop = function () {}\nvar options = null\nvar ssrIdKey = 'data-vue-ssr-id'\n\n// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n// tags it will allow on a page\nvar isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\\b/.test(navigator.userAgent.toLowerCase())\n\nexport default function addStylesClient (parentId, list, _isProduction, _options) {\n  isProduction = _isProduction\n\n  options = _options || {}\n\n  var styles = listToStyles(parentId, list)\n  addStylesToDom(styles)\n\n  return function update (newList) {\n    var mayRemove = []\n    for (var i = 0; i < styles.length; i++) {\n      var item = styles[i]\n      var domStyle = stylesInDom[item.id]\n      domStyle.refs--\n      mayRemove.push(domStyle)\n    }\n    if (newList) {\n      styles = listToStyles(parentId, newList)\n      addStylesToDom(styles)\n    } else {\n      styles = []\n    }\n    for (var i = 0; i < mayRemove.length; i++) {\n      var domStyle = mayRemove[i]\n      if (domStyle.refs === 0) {\n        for (var j = 0; j < domStyle.parts.length; j++) {\n          domStyle.parts[j]()\n        }\n        delete stylesInDom[domStyle.id]\n      }\n    }\n  }\n}\n\nfunction addStylesToDom (styles /* Array<StyleObject> */) {\n  for (var i = 0; i < styles.length; i++) {\n    var item = styles[i]\n    var domStyle = stylesInDom[item.id]\n    if (domStyle) {\n      domStyle.refs++\n      for (var j = 0; j < domStyle.parts.length; j++) {\n        domStyle.parts[j](item.parts[j])\n      }\n      for (; j < item.parts.length; j++) {\n        domStyle.parts.push(addStyle(item.parts[j]))\n      }\n      if (domStyle.parts.length > item.parts.length) {\n        domStyle.parts.length = item.parts.length\n      }\n    } else {\n      var parts = []\n      for (var j = 0; j < item.parts.length; j++) {\n        parts.push(addStyle(item.parts[j]))\n      }\n      stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }\n    }\n  }\n}\n\nfunction createStyleElement () {\n  var styleElement = document.createElement('style')\n  styleElement.type = 'text/css'\n  head.appendChild(styleElement)\n  return styleElement\n}\n\nfunction addStyle (obj /* StyleObjectPart */) {\n  var update, remove\n  var styleElement = document.querySelector('style[' + ssrIdKey + '~=\"' + obj.id + '\"]')\n\n  if (styleElement) {\n    if (isProduction) {\n      // has SSR styles and in production mode.\n      // simply do nothing.\n      return noop\n    } else {\n      // has SSR styles but in dev mode.\n      // for some reason Chrome can't handle source map in server-rendered\n      // style tags - source maps in <style> only works if the style tag is\n      // created and inserted dynamically. So we remove the server rendered\n      // styles and inject new ones.\n      styleElement.parentNode.removeChild(styleElement)\n    }\n  }\n\n  if (isOldIE) {\n    // use singleton mode for IE9.\n    var styleIndex = singletonCounter++\n    styleElement = singletonElement || (singletonElement = createStyleElement())\n    update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)\n    remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)\n  } else {\n    // use multi-style-tag mode in all other cases\n    styleElement = createStyleElement()\n    update = applyToTag.bind(null, styleElement)\n    remove = function () {\n      styleElement.parentNode.removeChild(styleElement)\n    }\n  }\n\n  update(obj)\n\n  return function updateStyle (newObj /* StyleObjectPart */) {\n    if (newObj) {\n      if (newObj.css === obj.css &&\n          newObj.media === obj.media &&\n          newObj.sourceMap === obj.sourceMap) {\n        return\n      }\n      update(obj = newObj)\n    } else {\n      remove()\n    }\n  }\n}\n\nvar replaceText = (function () {\n  var textStore = []\n\n  return function (index, replacement) {\n    textStore[index] = replacement\n    return textStore.filter(Boolean).join('\\n')\n  }\n})()\n\nfunction applyToSingletonTag (styleElement, index, remove, obj) {\n  var css = remove ? '' : obj.css\n\n  if (styleElement.styleSheet) {\n    styleElement.styleSheet.cssText = replaceText(index, css)\n  } else {\n    var cssNode = document.createTextNode(css)\n    var childNodes = styleElement.childNodes\n    if (childNodes[index]) styleElement.removeChild(childNodes[index])\n    if (childNodes.length) {\n      styleElement.insertBefore(cssNode, childNodes[index])\n    } else {\n      styleElement.appendChild(cssNode)\n    }\n  }\n}\n\nfunction applyToTag (styleElement, obj) {\n  var css = obj.css\n  var media = obj.media\n  var sourceMap = obj.sourceMap\n\n  if (media) {\n    styleElement.setAttribute('media', media)\n  }\n  if (options.ssrId) {\n    styleElement.setAttribute(ssrIdKey, obj.id)\n  }\n\n  if (sourceMap) {\n    // https://developer.chrome.com/devtools/docs/javascript-debugging\n    // this makes source maps inside style tags work properly in Chrome\n    css += '\\n/*# sourceURL=' + sourceMap.sources[0] + ' */'\n    // http://stackoverflow.com/a/26603875\n    css += '\\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'\n  }\n\n  if (styleElement.styleSheet) {\n    styleElement.styleSheet.cssText = css\n  } else {\n    while (styleElement.firstChild) {\n      styleElement.removeChild(styleElement.firstChild)\n    }\n    styleElement.appendChild(document.createTextNode(css))\n  }\n}\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 = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(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 = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var __WEBPACK_NAMESPACE_OBJECT__ = jQuery;","/** global: Craft */\n/** global: Garnish */\nimport $ from 'jquery';\n\n/**\n * CP class\n */\nCraft.CP = Garnish.Base.extend(\n  {\n    authManager: null,\n\n    $nav: null,\n    $navToggle: null,\n    $globalSidebar: null,\n    $globalContainer: null,\n    $mainContainer: null,\n    $alerts: null,\n    $crumbs: null,\n    $breadcrumbList: null,\n    $breadcrumbItems: null,\n    $notificationContainer: null,\n    $main: null,\n    $primaryForm: null,\n    $headerContainer: null,\n    $header: null,\n    $mainContent: null,\n    $details: null,\n    $sidebarContainer: null,\n    $sidebarToggle: null,\n    $sidebar: null,\n    $contentContainer: null,\n    $edition: null,\n\n    $confirmUnloadForms: null,\n    $deltaForms: null,\n    $collapsibleTables: null,\n\n    isMobile: null,\n    fixedHeader: false,\n\n    breadcrumbListWidth: 0,\n    breadcrumbDisclosureItem: `<li class=\"breadcrumb-toggle-wrapper\" data-disclosure-item><button data-disclosure-trigger aria-controls=\"breadcrumb-disclosure\" aria-haspopup=\"true\">${Craft.t(\n      'app',\n      'More…'\n    )}</button><div id=\"breadcrumb-disclosure\" class=\"menu menu--disclosure\" data-disclosure-menu><ul></ul></div></li>`,\n\n    tabManager: null,\n\n    enableQueue: true,\n    totalJobs: 0,\n    jobInfo: null,\n    displayedJobInfo: null,\n    displayedJobInfoUnchanged: 1,\n    trackJobProgressTimeout: null,\n    jobProgressIcon: null,\n\n    checkingForUpdates: false,\n    forcingRefreshOnUpdatesCheck: false,\n    includingDetailsOnUpdatesCheck: false,\n    checkForUpdatesCallbacks: null,\n\n    resizeTimeout: null,\n\n    init: function () {\n      // Is this session going to expire?\n      if (Craft.remainingSessionTime !== 0) {\n        this.authManager = new Craft.AuthManager();\n      }\n\n      // Find all the key elements\n      this.$nav = $('#nav');\n      this.$navToggle = $('#primary-nav-toggle');\n      this.$globalSidebar = $('#global-sidebar');\n      this.$globalContainer = $('#global-container');\n      this.$mainContainer = $('#main-container');\n      this.$alerts = $('#alerts');\n      this.$crumbs = $('#crumbs');\n      this.$breadcrumbList = $('.breadcrumb-list');\n      this.$breadcrumbItems = $('.breadcrumb-list li');\n      this.$notificationContainer = $('#notifications');\n      this.$main = $('#main');\n      this.$primaryForm = $('#main-form');\n      this.$headerContainer = $('#header-container');\n      this.$header = $('#header');\n      this.$mainContent = $('#main-content');\n      this.$details = $('#details');\n      this.$sidebarContainer = $('#sidebar-container');\n      this.$sidebarToggle = $('#sidebar-toggle');\n      this.$sidebar = $('#sidebar');\n      this.$contentContainer = $('#content-container');\n      this.$collapsibleTables = $('table.collapsible');\n\n      this.isMobile = Garnish.isMobileBrowser();\n\n      this.updateContentHeading();\n\n      // Swap any instruction text with info icons\n      let $allInstructions = this.$details.find(\n        '.meta > .field > .instructions'\n      );\n\n      for (let i = 0; i < $allInstructions.length; i++) {\n        let $instructions = $allInstructions.eq(i);\n        let $label = $instructions.siblings('.heading').children('label');\n        $('<span/>', {\n          class: 'info',\n          html: $instructions.children().html(),\n        }).appendTo($label);\n        $instructions.remove();\n      }\n\n      if (!this.isMobile && this.$header.length) {\n        this.addListener(Garnish.$win, 'scroll', 'updateFixedHeader');\n        this.updateFixedHeader();\n      }\n\n      Garnish.$doc.ready(() => {\n        // Update responsive tables on window resize\n        this.addListener(Garnish.$win, 'resize', (ev) => {\n          // Ignore element resizes\n          if (ev.target === window) {\n            this.handleWindowResize();\n\n            clearTimeout(this.resizeTimeout);\n            var cp = this;\n            this.resizeTimeout = setTimeout(function () {\n              cp.setSidebarNavAttributes();\n            }, 100);\n          }\n        });\n        this.handleWindowResize();\n        this.setSidebarNavAttributes();\n\n        // Wait a frame before initializing any confirm-unload forms,\n        // so other JS that runs on ready() has a chance to initialize\n        Garnish.requestAnimationFrame(this.initSpecialForms.bind(this));\n      });\n\n      // Alerts\n      if (this.$alerts.length) {\n        this.initAlerts();\n      }\n\n      // Toggles\n      this.addListener(this.$navToggle, 'click', 'toggleNav');\n      this.addListener(this.$sidebarToggle, 'click', 'toggleSidebar');\n\n      // Does this page have a primary form?\n      if (!this.$primaryForm.length) {\n        this.$primaryForm = $('form[data-saveshortcut]:first');\n      }\n\n      // Does the primary form support the save shortcut?\n      if (\n        this.$primaryForm.length &&\n        Garnish.hasAttr(this.$primaryForm, 'data-saveshortcut')\n      ) {\n        let shortcuts = [];\n        let actions = this.$primaryForm.data('actions');\n        if (typeof actions === 'undefined') {\n          shortcuts.push([\n            {\n              keyCode: Garnish.S_KEY,\n              ctrl: true,\n            },\n            {\n              redirect: this.$primaryForm.data('saveshortcut-redirect'),\n              retainScroll: Garnish.hasAttr(\n                this.$primaryForm,\n                'saveshortcut-scroll'\n              ),\n            },\n          ]);\n        } else {\n          for (let i = 0; i < actions.length; i++) {\n            let action = actions[i];\n            if (!action.shortcut) {\n              continue;\n            }\n            shortcuts.push([\n              {\n                keyCode: Garnish.S_KEY,\n                ctrl: true,\n                shift: !!action.shift,\n              },\n              {\n                action: action.action,\n                redirect: action.redirect,\n                confirm: action.confirm,\n                params: action.params,\n                data: action.data,\n                retainScroll: action.retainScroll,\n              },\n            ]);\n          }\n        }\n        for (let i = 0; i < shortcuts.length; i++) {\n          Garnish.uiLayerManager.registerShortcut(shortcuts[i][0], () => {\n            this.submitPrimaryForm(shortcuts[i][1]);\n          });\n        }\n      }\n\n      this.initTabs();\n\n      if (this.tabManager) {\n        if (window.LOCATION_HASH) {\n          const $tab = this.tabManager.$tabs.filter(\n            `[href=\"#${window.LOCATION_HASH}\"]`\n          );\n          if ($tab.length) {\n            this.tabManager.selectTab($tab);\n          }\n        }\n      }\n\n      // Should we match the previous scroll position?\n      let scrollY = Craft.getLocalStorage('scrollY');\n      if (typeof scrollY !== 'undefined') {\n        Craft.removeLocalStorage('scrollY');\n        Garnish.$doc.ready(() => {\n          Garnish.requestAnimationFrame(() => {\n            window.scrollTo(0, scrollY);\n          });\n        });\n      }\n\n      if ($.isTouchCapable()) {\n        this.$mainContainer.on(\n          'focus',\n          'input, textarea, .focusable-input',\n          this._handleInputFocus.bind(this)\n        );\n        this.$mainContainer.on(\n          'blur',\n          'input, textarea, .focusable-input',\n          this._handleInputBlur.bind(this)\n        );\n      }\n\n      // Announcements HUD\n      if (Craft.announcements.length) {\n        let $btn = $('#announcements-btn').removeClass('hidden');\n        const hasUnreads = Craft.announcements.some((a) => a.unread);\n        let $unreadMessage;\n        if (hasUnreads) {\n          $unreadMessage = $('<span/>', {\n            class: 'visually-hidden',\n            html: Craft.t('app', 'Unread messages'),\n          });\n          $btn.addClass('unread').append($unreadMessage);\n        }\n        let hud;\n        this.addListener($btn, 'click', () => {\n          if (!hud) {\n            let contents = '';\n            Craft.announcements.forEach((a) => {\n              contents +=\n                `<div class=\"announcement ${\n                  a.unread ? 'unread' : ''\n                }\" role=\"listitem\">` +\n                '<div class=\"announcement__header\">' +\n                `<h3 class=\"announcement__heading h2\">${a.heading}</h3>` +\n                '<div class=\"announcement-label-container\">' +\n                `<div class=\"announcement-icon\" aria-hidden=\"true\">${a.icon}</div>` +\n                `<div class=\"announcement-label\">${a.label}</div>` +\n                '</div>' +\n                '</div>' +\n                `<p>${a.body}</p>` +\n                '</div>';\n            });\n            hud = new Garnish.HUD(\n              $btn,\n              `<h2 class=\"visually-hidden\">${Craft.t(\n                'app',\n                'Announcements'\n              )}</h2><div id=\"announcements\" role=\"list\">${contents}</div>`,\n              {\n                onShow: () => {\n                  $btn.addClass('active');\n                },\n                onHide: () => {\n                  $btn.removeClass('active');\n                },\n              }\n            );\n\n            // Open outbound links in new windows\n            $('a', hud.$main).each(function () {\n              if (\n                this.hostname.length &&\n                this.hostname !== location.hostname &&\n                typeof $(this).attr('target') === 'undefined'\n              ) {\n                $(this).attr('rel', 'noopener').attr('target', '_blank');\n              }\n            });\n\n            if (hasUnreads) {\n              $btn.removeClass('unread');\n              $unreadMessage.remove();\n              Craft.sendActionRequest(\n                'POST',\n                'users/mark-announcements-as-read',\n                {\n                  data: {\n                    ids: Craft.announcements.map((a) => a.id),\n                  },\n                }\n              );\n            }\n          } else {\n            hud.show();\n          }\n        });\n      }\n\n      // Add .stuck class to #footer when stuck\n      // h/t https://stackoverflow.com/a/61115077/1688568\n      const footer = document.getElementById('footer');\n      if (footer) {\n        const observer = new IntersectionObserver(\n          ([ev]) => {\n            ev.target.classList.toggle('stuck', ev.intersectionRatio < 1);\n          },\n          {\n            rootMargin: '0px 0px -1px 0px',\n            threshold: [1],\n          }\n        );\n        observer.observe(footer);\n      }\n    },\n\n    get $contentHeader() {\n      const $contentHeader = $('#content-header');\n      if ($contentHeader.length) {\n        return $contentHeader;\n      }\n      return $('<header/>', {\n        id: 'content-header',\n        class: 'pane-header',\n      }).prependTo($('#content'));\n    },\n\n    get $noticeContainer() {\n      const $noticeContainer = $('#content-notice');\n      if ($noticeContainer.length) {\n        return $noticeContainer;\n      }\n      return $('<div id=\"content-notice\"/>')\n        .attr('role', 'status')\n        .prependTo(this.$contentHeader);\n    },\n\n    initSpecialForms: function () {\n      // Look for forms that we should watch for changes on\n      this.$confirmUnloadForms = $('form[data-confirm-unload]');\n      this.$deltaForms = $('form[data-delta]');\n\n      if (!this.$confirmUnloadForms.length) {\n        return;\n      }\n\n      const $forms = this.$confirmUnloadForms.add(this.$deltaForms);\n\n      for (let i = 0; i < $forms.length; i++) {\n        const $form = $forms.eq(i);\n        let serialized;\n        if (!$form.data('initialSerializedValue')) {\n          if (typeof $form.data('serializer') === 'function') {\n            serialized = $form.data('serializer')();\n          } else {\n            serialized = $form.serialize();\n          }\n          $form.data('initialSerializedValue', serialized);\n        }\n        this.addListener($form, 'submit', function (ev) {\n          if (Garnish.hasAttr($form, 'data-confirm-unload')) {\n            this.removeListener(Garnish.$win, 'beforeunload');\n          }\n          if (Garnish.hasAttr($form, 'data-delta')) {\n            ev.preventDefault();\n            let serialized;\n            if (typeof $form.data('serializer') === 'function') {\n              serialized = $form.data('serializer')();\n            } else {\n              serialized = $form.serialize();\n            }\n            const data = Craft.findDeltaData(\n              $form.data('initialSerializedValue'),\n              serialized,\n              $form.data('delta-names'),\n              null,\n              $form.data('initial-delta-values'),\n              $form.data('modified-delta-names')\n            );\n            Craft.createForm(data).appendTo(Garnish.$bod).submit();\n          }\n        });\n      }\n\n      this.addListener(Garnish.$win, 'beforeunload', function (ev) {\n        let confirmUnload = false;\n        if (\n          typeof Craft.livePreview !== 'undefined' &&\n          Craft.livePreview.inPreviewMode\n        ) {\n          confirmUnload = true;\n        } else {\n          for (let i = 0; i < this.$confirmUnloadForms.length; i++) {\n            const $form = this.$confirmUnloadForms.eq(i);\n            let serialized;\n            if (typeof $form.data('serializer') === 'function') {\n              serialized = $form.data('serializer')();\n            } else {\n              serialized = $form.serialize();\n            }\n            if ($form.data('initialSerializedValue') !== serialized) {\n              confirmUnload = true;\n              break;\n            }\n          }\n        }\n\n        if (confirmUnload) {\n          var message = Craft.t(\n            'app',\n            'Any changes will be lost if you leave this page.'\n          );\n\n          if (ev) {\n            ev.originalEvent.returnValue = message;\n          } else {\n            window.event.returnValue = message;\n          }\n\n          return message;\n        }\n      });\n    },\n\n    _handleInputFocus: function () {\n      this.updateFixedHeader();\n    },\n\n    _handleInputBlur: function () {\n      this.updateFixedHeader();\n    },\n\n    /**\n     * Submits a form.\n     * @param {Object} [options]\n     * @param {string} [options.action] The `action` param value override\n     * @param {string} [options.redirect] The `redirect` param value override\n     * @param {string} [options.confirm] A confirmation message that should be shown to the user before submit\n     * @param {Object} [options.params] Additional params that should be added to the form, defined as name/value pairs\n     * @param {Object} [options.data] Additional data to be passed to the submit event\n     * @param {boolean} [options.retainScroll] Whether the scroll position should be stored and reapplied on the next page load\n     */\n    submitPrimaryForm: function (options) {\n      // Give other stuff on the page a chance to prepare\n      this.trigger('beforeSaveShortcut');\n\n      if (typeof options !== 'object' || !$.isPlainObject(options)) {\n        options = {};\n      }\n\n      if (!options.redirect) {\n        options.redirect = this.$primaryForm.data('saveshortcut-redirect');\n      }\n\n      if (!options.data) {\n        options.data = {};\n      }\n      options.data.saveShortcut = true;\n\n      Craft.submitForm(this.$primaryForm, options);\n    },\n\n    updateSidebarMenuLabel: function () {\n      this.updateContentHeading();\n    },\n\n    updateContentHeading: function () {\n      const $item = this.$sidebar.find('a.sel:first');\n      const $label = $item.children('.label');\n      $('#content-heading').text($label.length ? $label.text() : $item.text());\n      Garnish.$bod.removeClass('showing-sidebar');\n    },\n\n    toggleNav: function () {\n      const isExpanded = this.navIsExpanded();\n\n      if (isExpanded === null) return;\n\n      if (isExpanded) {\n        this.disableGlobalSidebarLinks();\n        this.$navToggle.focus();\n        this.$navToggle.attr('aria-expanded', 'false');\n        Garnish.$bod.removeClass('showing-nav');\n      } else {\n        this.enableGlobalSidebarLinks();\n        this.$globalSidebar.find(':focusable')[0].focus();\n        this.$navToggle.attr('aria-expanded', 'true');\n        Garnish.$bod.addClass('showing-nav');\n      }\n    },\n\n    enableGlobalSidebarLinks: function () {\n      const focusableItems = this.$globalSidebar.find(':focusable');\n\n      $(focusableItems).each(function () {\n        $(this).attr('tabindex', '0');\n      });\n    },\n\n    disableGlobalSidebarLinks: function () {\n      const focusableItems = this.$globalSidebar.find(':focusable');\n\n      $(focusableItems).each(function () {\n        $(this).attr('tabindex', '-1');\n      });\n    },\n\n    setSidebarNavAttributes: function () {\n      const isExpanded = this.navIsExpanded();\n\n      if (isExpanded === null) return;\n\n      if (!isExpanded) {\n        this.disableGlobalSidebarLinks();\n      } else {\n        this.enableGlobalSidebarLinks();\n      }\n    },\n\n    navIsExpanded: function () {\n      if (!this.$globalSidebar[0]) return null;\n\n      const isAlwaysVisible = getComputedStyle(this.$globalSidebar[0])\n        .getPropertyValue('--is-always-visible')\n        .trim();\n\n      return (\n        this.$navToggle.attr('aria-expanded') === 'true' ||\n        isAlwaysVisible === 'true'\n      );\n    },\n\n    toggleSidebar: function () {\n      const expanded = this.$sidebarToggle.attr('aria-expanded') === 'true';\n      const newState = expanded ? 'false' : 'true';\n      this.$sidebarToggle.attr('aria-expanded', newState);\n      Garnish.$bod.toggleClass('showing-sidebar');\n    },\n\n    initTabs: function () {\n      if (this.tabManager) {\n        this.tabManager.destroy();\n        this.tabManager = null;\n      }\n\n      const $tabs = $('#tabs');\n      if (!$tabs.length) {\n        return;\n      }\n\n      this.tabManager = new Craft.Tabs($tabs);\n\n      this.tabManager.on('selectTab', (ev) => {\n        const href = ev.$tab.attr('href');\n\n        // Show its content area\n        if (href && href.charAt(0) === '#') {\n          $(href).removeClass('hidden');\n        }\n\n        // Trigger a resize event to update any UI components that are listening for it\n        Garnish.$win.trigger('resize');\n\n        // Fixes Redactor fixed toolbars on previously hidden panes\n        Garnish.$doc.trigger('scroll');\n\n        // If there is a revision menu, set its links to this tab ID\n        if (href && href.charAt(0) === '#') {\n          const menuBtn = $('#context-btn').menubtn().data('menubtn');\n          if (menuBtn) {\n            for (let i = 0; i < menuBtn.menu.$options.length; i++) {\n              let a = menuBtn.menu.$options[i];\n              if (a.href) {\n                a.href = a.href.match(/^[^#]*/)[0] + href;\n              }\n            }\n          }\n        }\n\n        if (typeof history !== 'undefined') {\n          // Delay changing the hash so it doesn't cause the browser to jump on page load\n          Garnish.requestAnimationFrame(() => {\n            history.replaceState(undefined, undefined, href);\n          });\n        }\n      });\n\n      this.tabManager.on('deselectTab', (ev) => {\n        const href = ev.$tab.attr('href');\n        if (href && href.charAt(0) === '#') {\n          // Hide its content area\n          $(ev.$tab.attr('href')).addClass('hidden');\n        }\n      });\n    },\n\n    updateTabs: function (tabs) {\n      if (tabs) {\n        const $tabContainer = $(tabs).attr('id', 'tabs');\n        if (this.tabManager) {\n          this.tabManager.$container.replaceWith($tabContainer);\n        } else {\n          $tabContainer.appendTo(this.$contentHeader);\n        }\n        this.initTabs();\n      } else if (this.tabManager) {\n        if (this.tabManager.$container.siblings().length) {\n          this.tabManager.$container.remove();\n        } else {\n          this.tabManager.$container.parent().remove();\n        }\n        this.tabManager.destroy();\n        this.tabManager = null;\n      }\n    },\n\n    /**\n     * @deprecated in 3.7.0\n     */\n    get $tabsContainer() {\n      return this.tabManager ? this.tabManager.$container : undefined;\n    },\n    /**\n     * @deprecated in 3.7.0\n     */\n    get $tabsList() {\n      return this.tabManager ? this.tabManager.$tablist : undefined;\n    },\n    /**\n     * @deprecated in 3.7.0\n     */\n    get $tabs() {\n      return this.tabManager ? this.tabManager.$tablist.find('> a') : undefined;\n    },\n    /**\n     * @deprecated in 3.7.0\n     */\n    get $selectedTab() {\n      return this.tabManager ? this.tabManager.$selectedTab : undefined;\n    },\n    /**\n     * @deprecated in 3.7.0\n     */\n    get selectedTabIndex() {\n      return this.tabManager\n        ? this.tabManager.$tabs.index(this.tabManager.$selectedTab)\n        : undefined;\n    },\n    /**\n     * @deprecated in 3.7.0\n     */\n    get $focusableTab() {\n      return this.tabManager ? this.tabManager.$focusableTab : undefined;\n    },\n    /**\n     * @param {(jQuery|HTMLElement|string)} tab\n     * @deprecated in 3.7.0\n     */\n    selectTab: function (tab) {\n      if (this.tabManager) {\n        this.tabManager.selectTab(tab);\n      }\n    },\n    /**\n     * @deprecated in 3.7.0\n     */\n    deselectTab: function () {\n      if (this.tabManager) {\n        this.tabManager.deselectTab();\n      }\n    },\n\n    handleWindowResize: function () {\n      this.updateResponsiveTables();\n      this.handleBreadcrumbVisibility();\n    },\n\n    breadcrumbItemsWrap: function () {\n      if (!this.$breadcrumbItems[0]) return;\n\n      this.$breadcrumbList.css(\n        Craft.orientation === 'ltr' ? 'margin-right' : 'margin-left',\n        ''\n      );\n      const listWidth = this.$breadcrumbList[0].getBoundingClientRect().width;\n      let totalItemWidth = 0;\n\n      // Iterate through all list items (inclusive of more button)\n      const $items = this.$breadcrumbList.find('li');\n      for (let i = 0; i < $items.length; i++) {\n        totalItemWidth += $items.get(i).getBoundingClientRect().width;\n      }\n\n      this.breadcrumbListWidth = listWidth;\n\n      if (totalItemWidth <= listWidth) {\n        return false;\n      }\n\n      // If it's less than a pixel off, it's probably just a rounding error.\n      // Give the container an extra pixel to be safe, though\n      if (totalItemWidth < listWidth + 1) {\n        this.$breadcrumbList.css(\n          Craft.orientation === 'ltr' ? 'margin-right' : 'margin-left',\n          '-1px'\n        );\n        return false;\n      }\n\n      return true;\n    },\n\n    handleBreadcrumbVisibility: function () {\n      if (!this.breadcrumbItemsWrap()) return;\n\n      if (this.$breadcrumbList.find('[data-disclosure-item]').length === 0) {\n        this.$breadcrumbList.append(this.breadcrumbDisclosureItem);\n      }\n\n      const triggerWidth = this.$breadcrumbList.find(\n        '[data-disclosure-item]'\n      )[0].offsetWidth;\n      let visibleItemWidth = triggerWidth;\n      let finalIndex;\n      let newWidth;\n      const listWidth = this.breadcrumbListWidth;\n\n      // Find breadcrumbs that should remain visible without overflowing\n      this.$breadcrumbItems.each(function (index) {\n        newWidth = visibleItemWidth + this.offsetWidth;\n\n        if (newWidth < listWidth) {\n          finalIndex = index;\n          visibleItemWidth += this.offsetWidth;\n        } else {\n          return false;\n        }\n      });\n\n      // Separate breadcrums that should remain visible vs. hidden\n      const shownItems = this.$breadcrumbItems.slice(0, finalIndex + 1);\n      const hiddenItems = this.$breadcrumbItems.slice(finalIndex + 1);\n\n      // Empty list DOM and add shown items and trigger item\n      this.$breadcrumbList.html('');\n      this.$breadcrumbList.append(shownItems);\n      this.$breadcrumbList.append(this.breadcrumbDisclosureItem);\n\n      // Add hidden items to disclosure menu and initialize\n      this.$breadcrumbList\n        .find('[data-disclosure-menu] ul')\n        .append(hiddenItems);\n      this.$breadcrumbList.find('[data-disclosure-trigger]').disclosureMenu();\n    },\n\n    updateResponsiveTables: function () {\n      for (\n        this.updateResponsiveTables._i = 0;\n        this.updateResponsiveTables._i < this.$collapsibleTables.length;\n        this.updateResponsiveTables._i++\n      ) {\n        this.updateResponsiveTables._$table = this.$collapsibleTables.eq(\n          this.updateResponsiveTables._i\n        );\n        this.updateResponsiveTables._containerWidth =\n          this.updateResponsiveTables._$table.parent().width();\n        this.updateResponsiveTables._check = false;\n\n        if (this.updateResponsiveTables._containerWidth > 0) {\n          // Is this the first time we've checked this table?\n          if (\n            typeof this.updateResponsiveTables._$table.data(\n              'lastContainerWidth'\n            ) === 'undefined'\n          ) {\n            this.updateResponsiveTables._check = true;\n          } else {\n            this.updateResponsiveTables._isCollapsed =\n              this.updateResponsiveTables._$table.hasClass('collapsed');\n\n            // Getting wider?\n            if (\n              this.updateResponsiveTables._containerWidth >\n              this.updateResponsiveTables._$table.data('lastContainerWidth')\n            ) {\n              if (this.updateResponsiveTables._isCollapsed) {\n                this.updateResponsiveTables._$table.removeClass('collapsed');\n                this.updateResponsiveTables._check = true;\n              }\n            } else if (!this.updateResponsiveTables._isCollapsed) {\n              this.updateResponsiveTables._check = true;\n            }\n          }\n\n          // Are we checking the table width?\n          if (this.updateResponsiveTables._check) {\n            if (\n              this.updateResponsiveTables._$table.width() - 30 >\n              this.updateResponsiveTables._containerWidth\n            ) {\n              this.updateResponsiveTables._$table.addClass('collapsed');\n            }\n          }\n\n          // Remember the container width for next time\n          this.updateResponsiveTables._$table.data(\n            'lastContainerWidth',\n            this.updateResponsiveTables._containerWidth\n          );\n        }\n      }\n    },\n\n    updateFixedHeader: function () {\n      if (this.isMobile) {\n        return;\n      }\n\n      // Have we scrolled passed the top of #main?\n      if (\n        this.$main.length &&\n        this.$headerContainer[0].getBoundingClientRect().top < 0\n      ) {\n        if (!this.fixedHeader) {\n          var headerHeight = this.$headerContainer.height();\n\n          // Hard-set the minimum content container height\n          this.$contentContainer.css(\n            'min-height',\n            'calc(100vh - ' + (headerHeight + 14 + 48 - 1) + 'px)'\n          );\n\n          // Hard-set the header container height\n          this.$headerContainer.height(headerHeight);\n          Garnish.$bod.addClass('fixed-header');\n\n          // Fix the sidebar and details pane positions if they are taller than #content-container\n          var contentHeight = this.$contentContainer.outerHeight();\n          var $detailsHeight = this.$details.outerHeight();\n          var css = {\n            top: headerHeight + 'px',\n            'max-height': 'calc(100vh - ' + headerHeight + 'px)',\n          };\n          this.$sidebar.addClass('fixed').css(css);\n          this.$details.addClass('fixed').css(css);\n          this.fixedHeader = true;\n        }\n      } else if (this.fixedHeader) {\n        this.$headerContainer.height('auto');\n        Garnish.$bod.removeClass('fixed-header');\n        this.$contentContainer.css('min-height', '');\n        this.$sidebar.removeClass('fixed').css({\n          top: '',\n          'max-height': '',\n        });\n        this.$details.removeClass('fixed').css({\n          top: '',\n          'max-height': '',\n        });\n        this.fixedHeader = false;\n      }\n    },\n\n    /**\n     * Dispays a notification.\n     *\n     * @param {string} type `notice`, `success`, or `error`\n     * @param {string} message\n     * @param {Object} [settings]\n     * @param {string} [settings.icon] The icon to show on the notification\n     * @param {string} [settings.iconLabel] The icon’s ARIA label\n     * @param {string} [settings.details] Any additional HTML that should be included below the message\n     * @returns {Object} The notification\n     */\n    displayNotification: function (type, message, settings) {\n      const notification = new Craft.CP.Notification(type, message, settings);\n\n      this.trigger('displayNotification', {\n        notificationType: type,\n        message,\n        notification,\n      });\n\n      return notification;\n    },\n\n    /**\n     * Displays a notice.\n     *\n     * @param {string} message\n     * @param {Object} [settings]\n     * @param {string} [settings.icon] The icon to show on the notification\n     * @param {string} [settings.iconLabel] The icon’s ARIA label\n     * @param {string} [settings.details] Any additional HTML that should be included below the message\n     * @returns {Object} The notification\n     */\n    displayNotice: function (message, settings) {\n      return this.displayNotification(\n        'notice',\n        message,\n        Object.assign(\n          {\n            icon: 'info',\n            iconLabel: Craft.t('app', 'Notice'),\n          },\n          settings\n        )\n      );\n    },\n\n    /**\n     * Displays a success notification.\n     *\n     * @param {string} message\n     * @param {Object} [settings]\n     * @param {string} [settings.icon] The icon to show on the notification\n     * @param {string} [settings.iconLabel] The icon’s ARIA label\n     * @param {string} [settings.details] Any additional HTML that should be included below the message\n     * @returns {Object} The notification\n     */\n    displaySuccess: function (message, settings) {\n      return this.displayNotification(\n        'success',\n        message,\n        Object.assign(\n          {\n            icon: 'check',\n            iconLabel: Craft.t('app', 'Success'),\n          },\n          settings\n        )\n      );\n    },\n\n    /**\n     * Displays an error.\n     *\n     * @param {string} message\n     * @param {Object} [settings]\n     * @param {string} [settings.icon] The icon to show on the notification\n     * @param {string} [settings.iconLabel] The icon’s ARIA label\n     * @param {string} [settings.details] Any additional HTML that should be included below the message\n     * @returns {Object} The notification\n     */\n    displayError: function (message, settings) {\n      if (!message || typeof message === 'object') {\n        settings = message;\n        message = Craft.t('app', 'A server error occurred.');\n      }\n\n      return this.displayNotification(\n        'error',\n        message,\n        Object.assign(\n          {\n            icon: 'alert',\n            iconLabel: Craft.t('app', 'Error'),\n          },\n          settings\n        )\n      );\n    },\n\n    fetchAlerts: function () {\n      return Craft.queue.push(\n        () =>\n          new Promise((resolve, reject) => {\n            const data = {\n              path: Craft.path,\n            };\n            Craft.sendActionRequest('POST', 'app/get-cp-alerts', {data})\n              .then(({data}) => {\n                resolve(data.alerts);\n              })\n              .catch(reject);\n          })\n      );\n    },\n\n    displayAlerts: function (alerts) {\n      this.$alerts.remove();\n\n      if (Garnish.isArray(alerts) && alerts.length) {\n        this.$alerts = $('<ul id=\"alerts\"/>').prependTo($('#page-container'));\n\n        for (var i = 0; i < alerts.length; i++) {\n          $(\n            `<li><span data-icon=\"alert\" aria-label=\"${Craft.t(\n              'app',\n              'Error'\n            )}\"></span> ${alerts[i]}</li>`\n          ).appendTo(this.$alerts);\n        }\n\n        var height = this.$alerts.outerHeight();\n        this.$alerts\n          .css('margin-top', -height)\n          .velocity({'margin-top': 0}, 'fast');\n\n        this.initAlerts();\n      }\n    },\n\n    initAlerts: function () {\n      // Are there any shunnable alerts?\n      var $shunnableAlerts = this.$alerts.find('a[class^=\"shun:\"]');\n\n      for (var i = 0; i < $shunnableAlerts.length; i++) {\n        this.addListener($shunnableAlerts[i], 'click', (ev) => {\n          ev.preventDefault();\n\n          Craft.queue.push(\n            () =>\n              new Promise((resolve, reject) => {\n                const $link = $(ev.currentTarget);\n                const data = {\n                  message: $link.prop('className').substring(5),\n                };\n                Craft.sendActionRequest('POST', 'app/shun-cp-alert', {data})\n                  .then(() => {\n                    $link.parent().remove();\n                    resolve();\n                  })\n                  .catch(({response}) => {\n                    this.displayError(response.data.message);\n                    reject();\n                  });\n              })\n          );\n        });\n      }\n    },\n\n    checkForUpdates: function (forceRefresh, includeDetails, callback) {\n      // Make 'includeDetails' optional\n      if (typeof includeDetails === 'function') {\n        callback = includeDetails;\n        includeDetails = false;\n      }\n\n      // If forceRefresh == true, we're currently checking for updates, and not currently forcing a refresh,\n      // then just set a new callback that re-checks for updates when the current one is done.\n      if (\n        this.checkingForUpdates &&\n        ((forceRefresh === true && !this.forcingRefreshOnUpdatesCheck) ||\n          (includeDetails === true && !this.includingDetailsOnUpdatesCheck))\n      ) {\n        var realCallback = callback;\n        callback = () => {\n          this.checkForUpdates(forceRefresh, includeDetails, realCallback);\n        };\n      }\n\n      // Callback function?\n      if (typeof callback === 'function') {\n        if (!Garnish.isArray(this.checkForUpdatesCallbacks)) {\n          this.checkForUpdatesCallbacks = [];\n        }\n\n        this.checkForUpdatesCallbacks.push(callback);\n      }\n\n      if (!this.checkingForUpdates) {\n        this.checkingForUpdates = true;\n        this.forcingRefreshOnUpdatesCheck = forceRefresh === true;\n        this.includingDetailsOnUpdatesCheck = includeDetails === true;\n\n        this._checkForUpdates(forceRefresh, includeDetails).then((info) => {\n          this.updateUtilitiesBadge();\n          this.checkingForUpdates = false;\n\n          if (Garnish.isArray(this.checkForUpdatesCallbacks)) {\n            var callbacks = this.checkForUpdatesCallbacks;\n            this.checkForUpdatesCallbacks = null;\n\n            for (var i = 0; i < callbacks.length; i++) {\n              callbacks[i](info);\n            }\n          }\n\n          this.trigger('checkForUpdates', {\n            updateInfo: info,\n          });\n        });\n      }\n    },\n\n    _checkForUpdates: function (forceRefresh, includeDetails) {\n      return new Promise((resolve, reject) => {\n        if (!forceRefresh) {\n          this._checkForCachedUpdates(includeDetails)\n            .then((info) => {\n              if (info.cached) {\n                resolve(info);\n                return;\n              }\n\n              this._getUpdates(includeDetails).then((info) => {\n                resolve(info);\n              });\n            })\n            .catch(reject);\n        } else {\n          this._getUpdates(includeDetails).then(resolve).catch(reject);\n        }\n      });\n    },\n\n    _checkForCachedUpdates: function (includeDetails) {\n      return new Promise(function (resolve, reject) {\n        var data = {\n          onlyIfCached: true,\n          includeDetails: includeDetails,\n        };\n\n        Craft.sendActionRequest('POST', 'app/check-for-updates', {data})\n          .then(({data}) => {\n            resolve(data);\n          })\n          .catch(() => {\n            resolve({cached: false});\n          });\n      });\n    },\n\n    _getUpdates: function (includeDetails) {\n      return new Promise((resolve, reject) => {\n        Craft.sendApiRequest('GET', 'updates')\n          .then((updates) => {\n            this._cacheUpdates(updates, includeDetails).then((data) => {\n              resolve(data);\n            });\n          })\n          .catch(reject);\n      });\n    },\n\n    _cacheUpdates: function (updates, includeDetails) {\n      return new Promise((resolve, reject) => {\n        const data = {\n          updates,\n          includeDetails,\n        };\n\n        Craft.sendActionRequest('POST', 'app/cache-updates', {data})\n          .then(({data}) => {\n            resolve(data);\n          })\n          .catch(reject);\n      });\n    },\n\n    updateUtilitiesBadge: function () {\n      var $utilitiesLink = $('#nav-utilities').find('> a:not(.sel)');\n\n      // Ignore if there is no (non-selected) Utilities nav item\n      if (!$utilitiesLink.length) {\n        return;\n      }\n\n      Craft.queue.push(\n        () =>\n          new Promise((resolve, reject) => {\n            Craft.sendActionRequest('POST', 'app/get-utilities-badge-count')\n              .then(({data}) => {\n                // Get the existing utility nav badge and screen reader text, if any\n                let $badge = $utilitiesLink.children('.badge');\n                let $screenReaderText = $utilitiesLink.children(\n                  '[data-notification]'\n                );\n\n                if (data.badgeCount) {\n                  if (!$badge.length) {\n                    $badge = $(\n                      '<span class=\"badge\" aria-hidden=\"true\"/>'\n                    ).appendTo($utilitiesLink);\n                  }\n\n                  if (!$screenReaderText.length) {\n                    $screenReaderText = $(\n                      '<span class=\"visually-hidden\" data-notification/>'\n                    ).appendTo($utilitiesLink);\n                  }\n\n                  $badge.text(data.badgeCount);\n                  $screenReaderText.text(\n                    Craft.t(\n                      'app',\n                      '{num, number} {num, plural, =1{notification} other{notifications}}',\n                      {\n                        num: data.badgeCount,\n                      }\n                    )\n                  );\n                } else if ($badge.length && $screenReaderText.length) {\n                  $badge.remove();\n                  $screenReaderText.remove();\n                }\n                resolve();\n              })\n              .catch(reject);\n          })\n      );\n    },\n\n    runQueue: function () {\n      if (!this.enableQueue) {\n        return;\n      }\n\n      if (Craft.runQueueAutomatically) {\n        Craft.queue.push(\n          () =>\n            new Promise((resolve, reject) => {\n              Craft.sendActionRequest('POST', 'queue/run')\n                .then(() => {\n                  this.trackJobProgress(false, true);\n                  resolve();\n                })\n                .catch(reject);\n            })\n        );\n      } else {\n        this.trackJobProgress(false, true);\n      }\n    },\n\n    trackJobProgress: function (delay, force) {\n      if (force && this.trackJobProgressTimeout) {\n        clearTimeout(this.trackJobProgressTimeout);\n        this.trackJobProgressTimeout = null;\n      }\n\n      // Ignore if we're already tracking jobs, or the queue is disabled\n      if (this.trackJobProgressTimeout || !this.enableQueue) {\n        return;\n      }\n\n      if (delay === true) {\n        // Determine the delay based on how long the displayed job info has remained unchanged\n        var timeout = Math.min(60000, this.displayedJobInfoUnchanged * 500);\n        this.trackJobProgressTimeout = setTimeout(\n          this._trackJobProgressInternal.bind(this),\n          timeout\n        );\n      } else {\n        this._trackJobProgressInternal();\n      }\n    },\n\n    _trackJobProgressInternal: function () {\n      Craft.queue.push(\n        () =>\n          new Promise((resolve, reject) => {\n            Craft.sendActionRequest(\n              'POST',\n              'queue/get-job-info?limit=50&dontExtendSession=1'\n            )\n              .then(({data}) => {\n                this.trackJobProgressTimeout = null;\n                this.totalJobs = data.total;\n                this.setJobInfo(data.jobs);\n                if (this.jobInfo.length) {\n                  // Check again after a delay\n                  this.trackJobProgress(true);\n                }\n                resolve();\n              })\n              .catch(reject);\n          })\n      );\n    },\n\n    setJobInfo: function (jobInfo) {\n      if (!this.enableQueue) {\n        return;\n      }\n\n      this.jobInfo = jobInfo;\n\n      // Update the displayed job info\n      var oldInfo = this.displayedJobInfo;\n      this.displayedJobInfo = this.getDisplayedJobInfo();\n\n      // Same old same old?\n      if (\n        oldInfo &&\n        this.displayedJobInfo &&\n        oldInfo.id === this.displayedJobInfo.id &&\n        oldInfo.progress === this.displayedJobInfo.progress &&\n        oldInfo.progressLabel === this.displayedJobInfo.progressLabel &&\n        oldInfo.status === this.displayedJobInfo.status\n      ) {\n        this.displayedJobInfoUnchanged++;\n      } else {\n        // Reset the counter\n        this.displayedJobInfoUnchanged = 1;\n      }\n\n      this.updateJobIcon();\n\n      // Fire a setJobInfo event\n      this.trigger('setJobInfo');\n    },\n\n    /**\n     * Returns info for the job that should be displayed in the control panel sidebar\n     */\n    getDisplayedJobInfo: function () {\n      if (!this.enableQueue) {\n        return null;\n      }\n\n      // Set the status preference order\n      var statuses = [\n        Craft.CP.JOB_STATUS_RESERVED,\n        Craft.CP.JOB_STATUS_FAILED,\n        Craft.CP.JOB_STATUS_WAITING,\n      ];\n\n      for (var i = 0; i < statuses.length; i++) {\n        for (var j = 0; j < this.jobInfo.length; j++) {\n          if (\n            this.jobInfo[j].status === statuses[i] &&\n            (statuses[i] !== Craft.CP.JOB_STATUS_WAITING ||\n              !this.jobInfo[j].delay)\n          ) {\n            return this.jobInfo[j];\n          }\n        }\n      }\n\n      return null;\n    },\n\n    updateJobIcon: function () {\n      if (!this.enableQueue || !this.$nav.length) {\n        return;\n      }\n\n      if (this.displayedJobInfo) {\n        if (!this.jobProgressIcon) {\n          this.jobProgressIcon = new JobProgressIcon();\n        }\n\n        if (\n          this.displayedJobInfo.status === Craft.CP.JOB_STATUS_RESERVED ||\n          this.displayedJobInfo.status === Craft.CP.JOB_STATUS_WAITING\n        ) {\n          this.jobProgressIcon.hideFailMode();\n          this.jobProgressIcon.setDescription(\n            this.displayedJobInfo.description,\n            this.displayedJobInfo.progressLabel\n          );\n          this.jobProgressIcon.setProgress(this.displayedJobInfo.progress);\n        } else if (\n          this.displayedJobInfo.status === Craft.CP.JOB_STATUS_FAILED\n        ) {\n          this.jobProgressIcon.showFailMode(Craft.t('app', 'Failed'));\n        }\n      } else {\n        if (this.jobProgressIcon) {\n          this.jobProgressIcon.hideFailMode();\n          this.jobProgressIcon.complete();\n          delete this.jobProgressIcon;\n        }\n      }\n    },\n\n    /**\n     * Returns the active site for the control panel\n     *\n     * @returns {number}\n     */\n    getSiteId: function () {\n      // If the old BaseElementIndex.siteId value is in localStorage, go aheand and remove & return that\n      let siteId = Craft.getLocalStorage('BaseElementIndex.siteId');\n      if (typeof siteId !== 'undefined') {\n        Craft.removeLocalStorage('BaseElementIndex.siteId');\n        try {\n          this.setSiteId(siteId);\n        } catch (e) {}\n      }\n      return Craft.siteId;\n    },\n\n    /**\n     * Sets the active site for the control panel\n     * @param {number} siteId\n     */\n    setSiteId: function (siteId) {\n      const site = Craft.sites.find((s) => s.id === siteId);\n\n      if (!site) {\n        throw `Invalid site ID: ${siteId}`;\n      }\n\n      Craft.siteId = siteId;\n\n      // update the base URLs used get Craft.getUrl(), etc.\n      Craft.actionUrl = Craft.getUrl(Craft.actionUrl, {site: site.handle});\n      Craft.baseCpUrl = Craft.getUrl(Craft.baseCpUrl, {site: site.handle});\n      Craft.baseUrl = Craft.getUrl(Craft.baseUrl, {site: site.handle});\n\n      // update the current URL\n      const url = Craft.getUrl(document.location.href, {site: site.handle});\n      history.replaceState({}, '', url);\n\n      // update the site--x body class\n      for (let className of document.body.classList) {\n        if (className.match(/^site--/)) {\n          document.body.classList.remove(className);\n        }\n      }\n      document.body.classList.add(`site--${site.handle}`);\n\n      // update other URLs on the page\n      $('a').each(function () {\n        if (\n          this.hostname.length &&\n          this.hostname === location.hostname &&\n          this.href.indexOf(Craft.cpTrigger) !== -1\n        ) {\n          this.href = Craft.getUrl(this.href, {site: site.handle});\n        }\n      });\n    },\n  },\n  {\n    //maxWidth: 1051, //1024,\n\n    /**\n     * @deprecated in 4.2.0. Use Craft.notificationDuration instead.\n     */\n    notificationDuration: 5000,\n\n    JOB_STATUS_WAITING: 1,\n    JOB_STATUS_RESERVED: 2,\n    JOB_STATUS_DONE: 3,\n    JOB_STATUS_FAILED: 4,\n  }\n);\n\nCraft.CP.Notification = Garnish.Base.extend({\n  type: null,\n  message: null,\n  settings: null,\n  closing: false,\n  closeTimeout: null,\n  _preventDelayedClose: false,\n  $container: null,\n  $closeBtn: null,\n  originalActiveElement: null,\n\n  init: function (type, message, settings) {\n    this.type = type;\n    this.message = message;\n    this.settings = settings || {};\n\n    this.$container = $('<div/>', {\n      class: 'notification',\n      'data-type': this.type,\n    }).appendTo(Craft.cp.$notificationContainer);\n\n    const $body = $('<div class=\"notification-body\"/>')\n      .appendTo(this.$container)\n      .attr('role', 'status');\n\n    if (this.settings.icon) {\n      const $icon = $('<span/>', {\n        class: 'notification-icon',\n        'data-icon': this.settings.icon,\n      }).appendTo($body);\n      if (this.settings.iconLabel) {\n        $icon.attr({\n          'aria-label': this.settings.iconLabel,\n          role: 'img',\n        });\n      } else {\n        $icon.attr('aria-hidden', 'true');\n      }\n    }\n\n    const $main = $('<div class=\"notification-main\"/>').appendTo($body);\n\n    $('<div/>', {\n      class: 'notification-message',\n      text: this.message,\n    }).appendTo($main);\n\n    const $closeBtnContainer = $('<div/>').appendTo(this.$container);\n    this.$closeBtn = $('<button/>', {\n      type: 'button',\n      class: 'notification-close-btn',\n      'aria-label': Craft.t('app', 'Close'),\n      'data-icon': 'remove',\n    }).appendTo($closeBtnContainer);\n\n    if (this.settings.details) {\n      const $detailsContainer = $('<div class=\"notification-details\"/>')\n        .append(this.settings.details)\n        .appendTo($main);\n\n      const $focusableElement = $detailsContainer.find('button,input');\n      if ($focusableElement.length) {\n        Garnish.uiLayerManager.addLayer(this.$container);\n        Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n          this.close();\n        });\n        this.originalActiveElement = document.activeElement;\n        this.$container.attr('tabindex', '-1').focus();\n        this.$container.on('keydown', (ev) => {\n          if (ev.keyCode === Garnish.ESC_KEY) {\n            ev.stopPropagation();\n            this.close();\n          }\n        });\n      }\n    }\n\n    this.$container\n      .css({\n        opacity: 0,\n        'margin-bottom': this._negMargin(),\n      })\n      .velocity({opacity: 1, 'margin-bottom': 0}, {duration: 'fast'});\n\n    Craft.initUiElements(this.$container);\n\n    this.addListener(this.$closeBtn, 'click', 'close');\n\n    if (Craft.notificationDuration) {\n      this._initDelayedClose();\n    }\n  },\n\n  _initDelayedClose: function () {\n    if (this._preventDelayedClose) {\n      return;\n    }\n\n    if (!Craft.isVisible()) {\n      Garnish.$doc.one('visibilitychange', () => {\n        this._initDelayedClose();\n      });\n      return;\n    }\n\n    this.delayedClose();\n\n    this.$container.on(\n      'keypress keyup change focus blur click mousedown mouseup',\n      (ev) => {\n        if (ev.target != this.$closeBtn[0]) {\n          this.$container.off(\n            'keypress keyup change focus blur click mousedown mouseup'\n          );\n          this.preventDelayedClose();\n        }\n      }\n    );\n  },\n\n  _negMargin: function () {\n    return `-${this.$container.outerHeight() + 12}px`;\n  },\n\n  close: function () {\n    if (this.closing) {\n      return;\n    }\n\n    if (this.closeTimeout) {\n      clearTimeout(this.closeTimeout);\n      this.closeTimeout = null;\n    }\n\n    this.closing = true;\n\n    if (\n      this.originalActiveElement &&\n      document.activeElement &&\n      (document.activeElement === this.$container[0] ||\n        $.contains(this.$container[0], document.activeElement))\n    ) {\n      $(this.originalActiveElement).focus();\n    }\n\n    this.$container.velocity(\n      {opacity: 0, 'margin-bottom': this._negMargin()},\n      {\n        duration: 'fast',\n        complete: () => {\n          this.$container.remove();\n        },\n      }\n    );\n  },\n\n  delayedClose: function () {\n    this.closeTimeout = setTimeout(() => {\n      this.close();\n    }, Craft.notificationDuration);\n\n    // Hold off on closing automatically on hover\n    this.$container.one('mouseover', () => {\n      clearTimeout(this.closeTimeout);\n      this.closeTimeout = null;\n\n      this.$container.on('mouseout', (ev) => {\n        if (ev.target == this.$container[0]) {\n          this.$container.off('mouseout');\n          this.delayedClose();\n        }\n      });\n    });\n  },\n\n  preventDelayedClose: function () {\n    this._preventDelayedClose = true;\n\n    if (this.closeTimeout) {\n      clearTimeout(this.closeTimeout);\n      this.closeTimeout = null;\n    }\n\n    this.$container.off('mouseover mouseout');\n  },\n});\n\nGarnish.$scrollContainer = Garnish.$win;\nCraft.cp = new Craft.CP();\n\n/**\n * Job progress icon class\n */\nvar JobProgressIcon = Garnish.Base.extend({\n  $li: null,\n  $a: null,\n  $label: null,\n  $progressLabel: null,\n\n  progress: null,\n  failMode: false,\n\n  _$bgCanvas: null,\n  _$staticCanvas: null,\n  _$hoverCanvas: null,\n  _$failCanvas: null,\n\n  _staticCtx: null,\n  _hoverCtx: null,\n  _canvasSize: null,\n  _arcPos: null,\n  _arcRadius: null,\n  _lineWidth: null,\n\n  _arcStartPos: 0,\n  _arcEndPos: 0,\n  _arcStartStepSize: null,\n  _arcEndStepSize: null,\n  _arcStep: null,\n  _arcStepTimeout: null,\n  _arcAnimateCallback: null,\n\n  _progressBar: null,\n\n  init: function () {\n    this.$li = $('<li/>').appendTo(Craft.cp.$nav.children('ul'));\n    this.$a = $('<a/>', {\n      id: 'job-icon',\n      href: Craft.canAccessQueueManager\n        ? Craft.getUrl('utilities/queue-manager')\n        : null,\n    }).appendTo(this.$li);\n    this.$canvasContainer = $('<span class=\"icon\"/>').appendTo(this.$a);\n    var $labelContainer = $('<span class=\"label\"/>').appendTo(this.$a);\n    this.$label = $('<span/>').appendTo($labelContainer);\n    this.$progressLabel = $('<span class=\"progress-label\"/>')\n      .appendTo($labelContainer)\n      .hide();\n\n    let m = window.devicePixelRatio > 1 ? 2 : 1;\n    this._canvasSize = 18 * m;\n    this._arcPos = this._canvasSize / 2;\n    this._arcRadius = 7 * m;\n    this._lineWidth = 3 * m;\n\n    this._$bgCanvas = this._createCanvas('bg', '#61666b');\n    this._$staticCanvas = this._createCanvas('static', '#d7d9db');\n    this._$hoverCanvas = this._createCanvas('hover', '#fff');\n    this._$failCanvas = this._createCanvas('fail', '#da5a47').hide();\n\n    this._staticCtx = this._$staticCanvas[0].getContext('2d');\n    this._hoverCtx = this._$hoverCanvas[0].getContext('2d');\n\n    this._drawArc(this._$bgCanvas[0].getContext('2d'), 0, 1);\n    this._drawArc(this._$failCanvas[0].getContext('2d'), 0, 1);\n  },\n\n  setDescription: function (description, progressLabel) {\n    this.$a.attr('title', description);\n    this.$label.text(description);\n    if (progressLabel) {\n      this.$progressLabel.text(progressLabel).show();\n    } else {\n      this.$progressLabel.hide();\n    }\n  },\n\n  setProgress: function (progress) {\n    if (progress == 0) {\n      this._$staticCanvas.hide();\n      this._$hoverCanvas.hide();\n    } else {\n      this._$staticCanvas.show();\n      this._$hoverCanvas.show();\n      if (this.progress && progress > this.progress) {\n        this._animateArc(0, progress / 100);\n      } else {\n        this._setArc(0, progress / 100);\n      }\n    }\n\n    this.progress = progress;\n  },\n\n  complete: function () {\n    this._animateArc(0, 1, () => {\n      this._$bgCanvas.velocity('fadeOut');\n\n      this._animateArc(1, 1, () => {\n        this.$a.remove();\n        this.destroy();\n      });\n    });\n  },\n\n  showFailMode: function (message) {\n    if (this.failMode) {\n      return;\n    }\n\n    this.failMode = true;\n    this.progress = null;\n\n    this._$bgCanvas.hide();\n    this._$staticCanvas.hide();\n    this._$hoverCanvas.hide();\n    this._$failCanvas.show();\n\n    this.setDescription(message);\n  },\n\n  hideFailMode: function () {\n    if (!this.failMode) {\n      return;\n    }\n\n    this.failMode = false;\n\n    this._$bgCanvas.show();\n    this._$staticCanvas.show();\n    this._$hoverCanvas.show();\n    this._$failCanvas.hide();\n  },\n\n  _createCanvas: function (id, color) {\n    var $canvas = $(\n        '<canvas id=\"job-icon-' +\n          id +\n          '\" width=\"' +\n          this._canvasSize +\n          '\" height=\"' +\n          this._canvasSize +\n          '\"/>'\n      ).appendTo(this.$canvasContainer),\n      ctx = $canvas[0].getContext('2d');\n\n    ctx.strokeStyle = color;\n    ctx.lineWidth = this._lineWidth;\n    ctx.lineCap = 'round';\n    return $canvas;\n  },\n\n  _setArc: function (startPos, endPos) {\n    this._arcStartPos = startPos;\n    this._arcEndPos = endPos;\n\n    this._drawArc(this._staticCtx, startPos, endPos);\n    this._drawArc(this._hoverCtx, startPos, endPos);\n  },\n\n  _drawArc: function (ctx, startPos, endPos) {\n    ctx.clearRect(0, 0, this._canvasSize, this._canvasSize);\n    ctx.beginPath();\n    ctx.arc(\n      this._arcPos,\n      this._arcPos,\n      this._arcRadius,\n      (1.5 + startPos * 2) * Math.PI,\n      (1.5 + endPos * 2) * Math.PI\n    );\n    ctx.stroke();\n    ctx.closePath();\n  },\n\n  _animateArc: function (targetStartPos, targetEndPos, callback) {\n    if (this._arcStepTimeout) {\n      clearTimeout(this._arcStepTimeout);\n    }\n\n    this._arcStep = 0;\n    this._arcStartStepSize = (targetStartPos - this._arcStartPos) / 10;\n    this._arcEndStepSize = (targetEndPos - this._arcEndPos) / 10;\n    this._arcAnimateCallback = callback;\n    this._takeNextArcStep();\n  },\n\n  _takeNextArcStep: function () {\n    this._setArc(\n      this._arcStartPos + this._arcStartStepSize,\n      this._arcEndPos + this._arcEndStepSize\n    );\n\n    this._arcStep++;\n\n    if (this._arcStep < 10) {\n      this._arcStepTimeout = setTimeout(this._takeNextArcStep.bind(this), 50);\n    } else if (this._arcAnimateCallback) {\n      this._arcAnimateCallback();\n    }\n  },\n});\n"],"names":["Craft","Accordion","Garnish","Base","extend","$trigger","targetSelector","_$target","init","trigger","this","$","data","console","warn","destroy","attr","addListener","event","key","keyCode","SPACE_KEY","RETURN_KEY","preventDefault","onTriggerClick","hideTarget","showTarget","$target","length","_currentHeight","height","removeClass","addClass","i","$t","prop","_targetHeight","css","overflow","velocity","getUserPreferredAnimationDuration","eq","$win","hasClass","removeData","base","AddressesInput","$container","$addBtn","$addBtnItem","$cards","container","settings","setSettings","defaults","find","closest","initCard","updateAddButton","createAddress","$card","ev","target","editAddress","$actionBtn","disclosureMenu","menu","$menu","$editBtn","stopPropagation","$deleteBtn","confirm","t","addressId","draftId","sendActionRequest","elementId","then","remove","not","createElementEditor","on","id","response","$newCard","html","replaceWith","insertBefore","initUiElements","add","canCreateAddress","maxAddresses","elementType","ownerId","element","AdminTable","totalItems","sorter","$noItems","$table","$tbody","$deleteBtns","allowDeleteAll","minItems","noItemsSelector","tableSelector","children","sortable","DataTableSorter","onSortChange","reorderItems","bind","handleDeleteBtnClick","updateUI","addRow","row","maxItems","$row","appendTo","addItems","ids","$items","idAttribute","push","JSON","stringify","reorderAction","onReorderItems","cp","displaySuccess","reorderSuccessMessage","displayError","reorderFailMessage","confirmDeleteItem","deleteItem","confirmDeleteMessage","name","getItemName","getItemId","deleteAction","handleDeleteItemSuccess","handleDeleteItemFailure","deleteFailMessage","removeItems","onDeleteItem","deleteSuccessMessage","escapeHtml","nameAttribute","hide","show","$moveButtons","newItemBtnSelector","noop","AssetImageEditor","Modal","$body","$footer","$imageTools","$buttons","$cancelBtn","$replaceBtn","$saveBtn","$focalPointBtn","$editorContainer","$straighten","$croppingCanvas","$spinner","$constraintContainer","$constraintRadioInputs","$customConstraints","canvas","image","viewport","focalPoint","grid","croppingCanvas","clipper","croppingRectangle","cropperHandles","cropperGrid","croppingShade","imageStraightenAngle","viewportRotation","originalWidth","originalHeight","imageVerticeCoords","zoomRatio","animationInProgress","currentView","assetId","cacheBust","draggingCropper","scalingCropper","draggingFocal","previousMouseX","previousMouseY","shiftKeyHeld","editorHeight","editorWidth","cropperState","scaleFactor","flipData","focalPointState","maxImageSize","lastLoadedDimensions","imageIsLoading","mouseMoveEvent","croppingConstraint","constraintOrientation","showingCustomConstraint","saving","renderImage","renderCropper","_queue","Queue","Date","now","allowDegreeFractions","isImagick","prefersReducedMotion","animationDuration","x","y","$bod","type","class","text","allowSavingAsNew","ui","createButton","label","spinner","saveImage","createSubmitButton","removeListener","$shade","getMaxImageSize","loadEditor","browserViewportWidth","$doc","get","documentElement","clientWidth","browserViewportHeight","clientHeight","Math","max","window","devicePixelRatio","alert","$tabs","$viewsContainer","$views","innerHeight","innerWidth","_showSpinner","updateSizeAndPosition","$customConstraintWrapper","filter","parent","append","size","value","val","test","fabric","StaticCanvas","width","enableRetinaScaling","requestAnimationFrame","renderAll","imageUrl","getActionUrl","Image","fromURL","imageObject","set","originX","originY","left","top","getHeight","getWidth","getScaledImageDimensions","_setFittedImageVerticeCoordinates","_repositionEditorElements","focalState","imageDimensions","offsetX","offsetY","focal","focalData","adjustedX","adjustedY","storeFocalPointState","_createFocalPoint","_createViewport","storeCropperState","_addControlListeners","_handleMouseMove","_handleMouseDown","_handleMouseUp","_handleMouseOut","_hideSpinner","first","_reloadImage","setSrc","outerHeight","previousEditorDimensions","setDimensions","currentScaledDimensions","getZoomToFitRatio","previouslyOccupiedArea","_getBoundingRectangle","_repositionCropper","getZoomToCoverRatio","_repositionImage","_repositionViewport","_repositionFocalPoint","_zoomImage","Rect","fill","globalCompositeOperation","sizeFactor","focalX","focalY","deltaX","deltaY","Group","Circle","radius","strokeWidth","stroke","toggleFocalPoint","dimensions","state","currentWidth","ratio","hasOrientationChanged","_","imageRatio","editorRatio","min","round","_getPrevTab","newTabIndex","activeTabIndex","_getActiveTabIndex","_getNextTab","_getActiveTab","$activeTab","index","_handleTabClick","LEFT_KEY","UP_KEY","$prevTab","activateTab","RIGHT_KEY","DOWN_KEY","$nextTab","rotateImage","flipImage","straighteningInput","SlideRuleInput","onStart","_showGrid","onChange","slider","straighten","onEnd","_hideGrid","_cleanupFocalPointAfterStraighten","SHIFT_KEY","_handleConstraintChange","_handleOrientationClick","_applyCustomConstraint","_handleConstraintClick","constraint","currentTarget","siblings","_showCustomConstraint","_hideCustomConstraint","setCroppingConstraint","enforceCroppingConstraint","$constraints","$constraint","labelSelector","$label","split","reverse","join","replace","_getCustomConstraint","w","h","parseFloat","isNaN","_setCustomConstraint","$tab","tab","view","tabindex","showView","enableSlider","disableSlider","Promise","resolve","reject","disableCropMode","enableCropMode","zoomFactor","degrees","parseInt","imageZoomRatio","newAngle","angle","scaledImageDimensions","viewportProperties","imageProperties","angleInRadians","PI","newDeltaX","cos","sin","newDeltaY","modifiedDeltaX","modifiedDeltaY","temp","animate","duration","onComplete","cleanAngle","_adjustFocalPointByAngle","_resetFocalPointPosition","axis","editorCenter","setValue","properties","scaleY","scaleX","previousAngle","_adjustEditorElementsOnStraighten","newCenterX","newCenterY","angleDelta","currentZoomRatio","adjustmentRatio","cropperCenterX","cropperCenterY","imageVertices","getImageVerticeCoords","rectangle","_getZoomRatioToFitRectangle","_isCenterInside","opacity","object","containingObject","newFocalX","newFocalY","adjustedFocalX","adjustedFocalY","containingVertices","vertex","rectangleVertices","_getRectangleVertices","verticeIndex","arePointsInsideRectangle","edge","_getEdgeCrossed","rectangleCenter","distanceFromVertexToEdge","abs","sqrt","pow","distanceFromCenterToEdge","$button","postData","imageRotation","cropData","zoom","onSave","broadcaster","postMessage","runQueue","Preview","refresh","message","scaledWidth","scaledHeight","boundingBox","_getImageBoundingBox","scale","vertScale","horiScale","getCombinedZoomRatio","strokeOptions","gridWidth","gridHeight","xStep","yStep","Line","onFadeOut","removeAllListeners","_editorModeTransition","cropperData","_showCropper","_hideCropper","targetZoom","inverseZoomFactor","imageOffsetX","imageOffsetY","callback","pause","resume","clipperData","_setupCropperLayer","_redrawCropperElements","backgroundColor","hoverCursor","selection","position","rectangleRatio","rectWidth","rectHeight","lineOptions","gridOptions","pathGroup","Path","cropTextTop","cropTextBackgroundColor","previousImageArea","currentOffset","areaFactor","coordinateSet","a","b","c","d","_isMouseOver","move","handle","_cropperHandleHitTest","pageX","pageY","_handleMouseMoveInternal","_handleFocalDrag","_handleCropperDrag","_handleCropperResize","_setMouseCursor","vertices","dxi","dyi","furthest","furthestDeltas","newX","newY","previousHeight","previousWidth","startingRectangle","_calculateNewCropperSizeByDeltas","cropperDirection","topDelta","leftDelta","change","match","isMobileBrowser","cursor","parentOffset","offset","mouseX","mouseY","lb","rb","tb","bb","topLeft","topRight","bottomRight","bottomLeft","zoomMode","topVerticalSegment","bottomVerticalSegment","rightHorizontalSegment","leftHorizontalSegment","verticalOffset","horizontalOffset","_debug","fabricObj","points","ab","_getVector","bc","scalarAbAb","_getScalarProduct","scalarBcBc","point","ap","bp","scalarAbAp","scalarBcBp","projectsOnAB","projectsOnBC","_getVectorMagnitude","vector","_getAngleBetweenVectors","acos","edgePoints","centerPoint","smallestDiff","edgeCrossed","edgeIndex","toCenter","edgeVector","toVertex","diff","box","proportion","AssetIndex","BaseElementIndex","$includeSubfoldersContainer","$includeSubfoldersCheckbox","showingIncludeSubfoldersCheckbox","$uploadButton","$uploadInput","$progressBar","$folders","uploader","promptHandler","progressBar","_uploadTotalFiles","_uploadFileProgress","_currentUploaderSettings","_assetDrag","_folderDrag","_expandDropTargetFolderTimeout","_tempExpandedFolders","_fileConflictTemplate","choices","title","_folderConflictTemplate","context","_initIndexPageMode","$main","modal","_positionProgressBar","initSources","initSource","$source","_createFolderContextMenu","getSourceLevel","updateDropTargets","deinitSource","contextMenu","selectable","multiSelect","DragDrop","activeDropTargetClass","helperOpacity","getSelectedElements","has","helper","$file","_getFileDragHelper","dropTargets","$draggee","targets","$sources","hasAttr","onDragStart","_onDragStart","onDropTargetChange","_onDropTargetChange","onDragStop","_onFileDragStop","helperBaseZindex","$draggeeHelper","$helperSidebar","$helperNav","$helperUl","draggedSourceIds","each","_getVolumeOrFolderUidFromSourceKey","inArray","_onFolderDragStop","$activeDropTarget","originatingSource","targetFolderId","originalAssetIds","originalAssetId","getElementInfo","setIndexBusy","resetProgressBar","setItemCount","showProgressBar","parameterArray","action","params","folderId","_performBatchRequests","onMoveFinish","responseArray","resetPrompts","conflict","addPrompt","suggestedFilename","prompt","error","setIndexAvailable","hideProgressBar","reloadIndex","performAfterMoveActions","sourceSelect","selectItem","_totalVisible","deselectAllElements","_collapseExtraExpandedFolders","updateElements","getPromptCount","fadeOutHelpers","showBatchPrompts","returnData","newParameterArray","choice","filename","force","apply","returnHelpersToDraggees","folderIds","sort","parentId","requestId","fileMoveList","newSourceKey","success","transferList","newFolderId","newFolderUid","merge","_performActualFolderMove","folderDeleteList","moveCallback","counter","limit","setInstanceState","refreshSources","_selectSourceByFolderId","$targetSource","_getSourceByKey","$parentSources","parents","$parentSource","selectSource","afterInit","style","addButton","PromptHandler","ProgressBar","options","url","fileInput","dropZone","events","fileuploadstart","_onUploadStart","fileuploadprogressall","_onUploadProgress","fileuploaddone","_onUploadSuccess","fileuploadalways","_onUploadAlways","fileuploadfail","_onUploadFailure","criteria","kind","allowedKinds","Uploader","isIndexBusy","getDefaultSourceKey","defaultSource","defaultSourceParts","volumeSource","toArray","s","subfolderSource","_getChildSources","_expandSource","onSelectSource","sourceKey","setParams","_updateUrl","$parent","nestedSources","$thisSource","getParentSource","unshift","uri","forEach","$s","setPath","m","startSearching","hideSidebar","floor","random","insertAfter","$search","$subContainer","setSelecetedSourceState","checked","getSelectedSourceState","marginBottom","stopSearching","complete","getViewParams","includeSubfolders","progress","loaded","total","setProgressPercentage","result","selectElementAfterUpdate","file","isLastUpload","_uploadFollowup","_updateAfterUpload","jqXHR","responseJSON","clearSearch","setSelectedSortAttribute","doFollowup","parameterIndex","followupAlways","incrementProcessedItemCount","updateProgressBar","followupSuccess","sourceAssetId","conflictingAssetId","targetFilename","followupFailure","onUpdateElements","_onUpdateElements","getAllElements","newElements","$newElements","removeAllItems","$elements","_onKeyDown","elementSelect","_onElementFocus","shiftKey","PreviewFileModal","openInstance","selfDestruct","$element","$focusedItem","_loadPreview","item","startingWidth","startingHeight","$outerContainer","$innerContainer","_$firstRowCells","$helperCells","$helperCell","$firstRowCell","$dropTarget","clearTimeout","dropTargetFolder","_hasSubfolders","_isExpanded","setTimeout","_expandFolder","dropTargetFolderId","$excludedSources","_collapseFolder","splice","getSourceActions","actions","onSelect","_createSubfolder","_renameFolder","destructive","_deleteFolder","menuOptions","onClick","ContextMenu","menuClass","$parentFolder","subfolderName","folderName","_prepareParentForChildren","$subfolder","folderUid","$a","_appendSubfolder","displayNotice","$targetFolder","folder","trim","_cleanUpTree","oldName","newName","initSourceToggle","$existingChildren","subfolderLabel","folderInserted","$existingChild","before","deinitSourceToggle","scrollTop","windowHeight","finalCallback","activeRequests","parameters","shift","registerElementIndexClass","AssetSelectInput","BaseElementSelectInput","hud","$uploadBtn","openPreviewTimeout","arguments","canUpload","_attachUploader","updateAddElementsBtn","$elementsContainer","openPreview","onAddElements","clearOpenPreviewTimeout","minGutter","formData","fieldId","sourceElementId","siteId","$addElementBtn","describedBy","multiple","csrfTokenName","csrfTokenValue","canAddMoreFiles","_onUploadComplete","next","enableAddElementsBtn","disableAddElementsBtn","selectUploadedFile","canAddMoreElements","$newElement","prepend","margin","outerWidth","animateCss","addElements","thumbSize","viewMode","appendHeadHtml","headHtml","slotsTaken","AssetSelectorModal","BaseElementSelectorModal","$selectTransformBtn","_selectedTransform","transforms","createSelectTransformButton","$btnGroup","$primaryButtons","$selectBtn","$menuList","MenuButton","MenuBtn","onOptionSelect","onSelectTransform","disable","onSelectionChange","$selectedElements","elementIndex","allowTransforms","enable","option","transform","selectImagesWithTransform","transformUrls","imageIdsWithMissingUrls","$item","showFooterSpinner","fetchMissingTransformUrls","hideFooterSpinner","selectElements","pop","info","elementInfo","canSelectImageTransforms","registerElementSelectorModalClass","AuthManager","remainingSessionTime","checkRemainingSessionTimer","showLoginModalTimer","decrementLogoutWarningInterval","showingLogoutWarningModal","showingLoginModal","logoutWarningModal","loginModal","$logoutWarningPara","$passwordInput","$loginBtn","$loginErrorPara","submitLoginIfLoggedOut","username","updateRemainingSessionTime","setCheckRemainingSessionTimer","seconds","checkRemainingSessionTime","extendSession","ajax","dataType","textStatus","timeout","minSafeSessionTime","showLogoutWarningModal","checkInterval","showLoginModal","submitLogin","hideLogoutWarningModal","hideLoginModal","quickShow","$form","$logoutBtn","$renewSessionBtn","prependTo","autoShow","closeOtherModals","hideOnEsc","hideOnShadeClick","shadeClass","onFadeIn","updateLogoutWarningMessage","setInterval","decrementLogoutWarning","time","secondsToHumanTimeDuration","clearInterval","quick","quickHide","$inputContainer","$inputsFlexContainer","$passwordContainer","$buttonContainer","$passwordWrapper","PasswordInput","onToggleInput","$newPasswordInput","logout","redirectTo","renewSession","validatePassword","removeAttr","login","clearLoginError","loginName","password","showLoginError","shake","initialized","idPrefix","instanceState","sourceStates","sourceStatesStorageKey","searchTimeout","$sidebar","showingSidebar","rootSourceKey","sourceViewModes","$rootSource","sourcesByKey","$visibleSources","$sourceActionsContainer","$sourceActionsBtn","$toolbar","toolbarOffset","$searchContainer","$filterBtn","searching","searchText","sortByScore","trashed","drafts","$clearSearchBtn","$statusMenuBtn","$statusMenuContainer","statusMenu","status","$siteMenuBtn","siteMenu","$updateSpinner","$viewModeBtnContainer","viewModeBtns","_autoSelectElements","$countSpinner","$countContainer","$actionsContainer","page","resultSet","totalResults","$exportBtn","actionsHeadHtml","actionsBodyHtml","$selectAllContainer","$selectAllCheckbox","showingActionTriggers","exporters","exportersByType","_$triggers","_ignoreFailedRequest","_cancelToken","viewMenus","activeViewMenu","filterHuds","randomString","getDefaultInstanceState","storageKey","getLocalStorage","toolbarSelector","menubtn","_handleStatusChange","$option","$options","_setSite","_handleSiteChange","defaultSiteId","getSiteId","$storedSiteOption","updateElementsIfSearchTextChanged","queryParams","getQueryParams","selector","selectOption","setQueryParam","selectDefaultSource","lastDashPos","lastIndexOf","substring","dir","setPage","pageNum","onAfterInit","_createCancelToken","axios","CancelToken","source","token","_cancelRequests","cancel","getSourceContainer","getSite","sites","_getSourcesInList","Select","multi","allowEmpty","vertical","_handleSourceSelectionChange","getQueryParam","getSourceByKey","refreshSourcesAction","expandedSources","indexOf","$toggle","_getSourceToggle","selectedSource","paths","path","getDefaultExpandedSources","updateSortField","storeInstanceState","setLocalStorage","getSourceState","defaultValue","viewState","k","hasOwnProperty","includes","storeSortAttributeAndDirection","getPageUrl","history","replaceState","_resetCount","updateSourceMenu","empty","groupedActions","administrative","group","_buildActionList","$ul","userIsAdmin","allowAdminChanges","createCustomizeSourcesModal","updateViewMenu","hideTrigger","ViewMenu","showTrigger","search","batchSize","canHaveDrafts","savedDraftsOnly","draftOf","condition","disabledElementIds","paginated","_isViewPaginated","getSortAttributeAndDirection","sortAttribute","sortDirection","order","collapsedElementIds","serialized","filters","preservePagination","pageChanged","updateElementsAction","cancelToken","$scrollContainer","_updateView","$elementContainer","getElementContainer","firstFocusableElement","e","showActionTriggers","_createTriggers","submitAction","actionParams","selectedElementIds","getSelectedElementIds","_findAction","viewParams","expandPostArray","elementAction","elementIds","download","downloadFromUrl","submitActionsAction","badgeCounts","_updateBadgeCounts","afterAction","actionClass","onAfterAction","hideActionTriggers","detach","updateActionTriggers","totalSelected","getEnabledElements","setStatus","getSelectedSortAttribute","attribute","getSortOption","getDefaultSort","getSelectedSortDirection","direction","setSortAttribute","sortOption","defaultDir","attributes","lastAttr","oldHistory","orderHistory","setSortDirection","setSelectedSortDirection","canSortByStructure","alt","getSortOptions","getSortLabel","getSelectedViewMode","parentsUntil","getRootSource","Object","keys","updateContentHeading","$firstOption","getViewModesForSource","sourceViewMode","$viewModeBtn","className","mode","icon","selectViewMode","doesSourceHaveViewMode","updateFilterBtn","urlParams","setUrl","getUrl","selectSourceByKey","sortOptions","o","defaultSort","getTableColumnOptions","getTableColumnOption","getDefaultTableColumns","getSelectedTableColumns","setSelectedTableColumns","tableColumns","updateTableColumnField","viewModes","createView","getViewClass","TableElementIndexView","ThumbsElementIndexView","rememberDisabledElementId","forgetDisabledElementId","enableElements","onEnableElements","disableElements","onDisableElements","getElementById","enableElementsById","makeArray","disableElementsById","getButtonContainer","isShowingSidebar","buttonContainer","CustomizeSourcesModal","onHide","onSelectSite","elements","$selectedItems","_handleActionTriggerSubmit","getPostData","_handleMenuActionTriggerSubmit","selectedOption","queryParam","firstSite","updateSourceVisibility","$heading","$headings","setSiteId","toString","_handleSelectionChange","_handleSourceDblClick","_toggleSource","_handleSourceToggleClick","prev","$list","topLevel","_collapseSource","$childSources","activeElement","document","_countResults","itemLabel","elementTypeNames","elementTypeName","toLowerCase","itemsLabel","elementTypePluralName","last","countLabel","items","$paginationContainer","totalPages","ceil","$paginationNav","$prevBtn","role","disabled","$nextBtn","appendBodyHtml","bodyHtml","selectAllElements","checkboxMode","body","contains","focus","selectElementById","$badge","countElementsAction","count","$btn","triggers","safeMenuActions","destructiveMenuActions","formatInputId","$menuTrigger","$safeList","_createMenuTriggerList","$destructiveList","$div","_showExportHud","typeOptions","$typeField","createSelectField","$formatField","$typeSelect","formattable","$limitField","createTextField","placeholder","$submitBtn","HUD","submitting","format","showFilterHud","FilterHud","showing","hasRules","$sortAttributeSelect","$sortDirectionPicker","sortDirectionListbox","$tableColumnsContainer","$revertContainer","$revertBtn","$closeBtn","_buildMenu","DisclosureMenu","tidyTableColumnField","FX_DURATION","$scoreOption","select","$lastContainer","lastIndex","$checkbox","$checkboxes","_getTableColumnCheckboxes","defaultOrder","map","column","reduce","obj","checkboxA","checkboxB","revert","$metaContainer","_createSortField","_createTableColumnsField","$footerContainer","_createRevertBtn","$sortAttributeSelectContainer","createSelect","Listbox","$selectedOption","$field","createField","fieldset","columns","createCheckbox","DragSort","_onTableColumnChange","$selectedCheckboxes","compare","loading","$clearBtn","cleared","$loadingContent","hudClass","$hud","$tip","hudHtml","$btnContainer","clear","setBusy","setReady","setFocus","elem","func","setFocusWithin","updateSizeAndPositionInternal","searchOffset","getBoundingClientRect","onShow","serialize","BaseElementIndexView","$loadingMoreSpinner","$scroller","thumbLoader","loadingMore","_morePending","_handleEnableElements","_handleDisableElements","setTotalVisible","setMorePending","ElementThumbLoader","load","isVerticalList","_handleElementEditing","isTouchCapable","maybeLoadMore","selectElement","selectAll","deselectAll","getTotalVisible","totalVisible","getMorePending","morePending","canLoadMore","loadMore","loadMoreElementsAction","getLoadMoreParams","appendElements","onAppendElements","off","elementSort","elementEditor","fieldLabel","_initialized","isPlainObject","normalizedSettings","args","modalStorageKey","maintainHierarchy","getContainer","getFieldLabel","getElementsContainer","getAddElementsBtn","getSpinner","initElementSelect","initElementSort","resetElements","getElements","$targetItem","getSelectedItems","ignoreHandleSelector","getElementSortAxis","collapseDraggees","magnetStrength","helperLagBase","resetItemOrder","updateButtonContainer","showSpinner","hideSpinner","focusNextLogicalElement","focusLastRemoveBtn","$removeBtns","removeElements","editable","_handleShowElementEditor","removeElement","BACKSPACE_KEY","DELETE_KEY","assign","elementSelectInput","prevalidate","replaceElement","replacementId","$existing","$nextDeleteBtn","lastElementIndex","onRemoveElements","$allElements","_animateStructureElementAway","animateElementAway","right","REMOVE_FX_DURATION","showModal","createModal","createElementSelectorModal","getModalSettings","sources","hideOnSelect","showSiteMenu","getDisabledElementIds","onModalSelect","onModalHide","triggerElement","modalTitle","modalSettings","allowSelfRelations","selectStructuredElements","slotsLeft","slice","updateDisabledElementsInModal","createNewElement","appendElement","animateElementIntoPlace","onSelectElements","disableCancelBtn","disableSelectBtn","containerId","branchLimit","selectionLabel","onResponse","enableCancelBtn","enableSelectBtn","$newElementsContainer","filteredElements","clone","removeText","setElementSize","single","$modalElement","$inputElement","origOffset","destOffset","$helper","zIndex","ADD_FX_DURATION","$li","editorSettings","supportSidebarToggleView","$content","$sourceToggles","$sidebarToggleBtn","$sidebarCloseBtn","$mainHeading","$secondaryButtons","$headingId","fullscreen","updateModalBottomPadding","footerHeight","updateSidebarView","sidebarShouldBeHidden","buildSidebarToggleView","resetView","$mainHeader","$sidebarHeader","getActiveSourceName","toggle","controls","closeSidebar","toggleSidebar","sidebarIsOpen","openSidebar","uiLayerManager","addLayer","registerShortcut","ESC_KEY","$focusedEl","getFocusedElement","removeLayer","_createElementIndex","updateSelectBtnState","updateHeading","clearMouseUpTimeout","disableElementsOnSelect","bodyAction","createElementIndex","indexSettings","touchData","firstTap","secondTap","resizable","onCancel","BaseInputGenerator","listening","startListening","setNewSource","stopListening","onSourceTextChange","updateTarget","onTargetTextChange","onFormSubmit","is","sourceVal","targetVal","generateTargetValue","dispatchEvent","InputEvent","inputType","Event","selectFullValue","CategoryIndex","editableGroups","$newCategoryBtnGroup","$newCategoryBtn","updateButton","editableCategoryGroups","g","uid","defaultGroupHandle","selectedSourceHandle","$menuBtn","selectedGroup","menuId","visibleLabel","ariaLabel","isCtrlKeyPressed","originalEvent","button","open","_createCategory","$menuContainer","anchorRole","href","groupId","location","cpEditUrl","fresh","groupSourceKey","CategorySelectInput","selectedCategoryIds","categoryIds","$allCategories","_animateCategoryAway","charts","DataTable","rows","cellIndex","parseTime","d3","timeParse","Tip","setContent","setPosition","BaseChart","$chart","chartBaseClass","dataTable","formatLocale","timeFormatLocale","orientation","svg","globalSettings","formats","d3Formats","formatLocaleDefinition","d3FormatLocaleDefinition","timeFormatLocaleDefinition","d3TimeFormatLocaleDefinition","resize","baseSettings","draw","chartClass","onAfterDrawTicks","tickKey","tick","$tickText","numberFormat","percentFormat","currencyFormat","shortDateFormats","day","month","year","bottom","colors","Area","tip","drawingArea","getChartMargin","translateX","translateY","drawTicks","drawAxes","drawChart","drawTipTriggers","getX","xAxis","axisBottom","tickFormat","getXFormatter","ticks","call","yAxis","getY","axisLeft","getYFormatter","tickValues","getYTickValues","axisRight","showAxis","tickSizeOuter","gridlines","xLineAxis","tickSize","yLineAxis","line","datum","area","y0","y1","plots","enter","tips","chartMargin","xAxisTickInterval","node","getTotalLength","tipTriggerWidth","$xValue","$yValue","content","values","yTicksMaxWidth","computedTickWidth","formatter","padded","xDomainMin","xDomainMax","xDomain","scaleTime","range","domain","yDomain","getYMaxValue","scaleLinear","utils","getTimeFormatter","getNumberFormatter","maxValue","getDuration","secondsNum","hours","minutes","chartSettings","dataScale","ColorInput","$input","$colorContainer","$colorPreview","$colorInput","createColorInput","handleTextChange","input","createElement","setAttribute","updateColor","repeat","_browserSupportsColorInputs","doesBrowserSupportColorInputs","CpScreenSlideout","Slideout","namespace","showingLoadSpinner","hasTabs","hasCpLink","hasSidebar","$header","$tabContainer","$loadSpinner","$editLink","$sidebarBtn","$noticeContainer","tabManager","ignoreFailedRequest","fieldsWithErrors","ltr","showSidebar","$contents","containerElement","containerAttributes","method","novalidate","closeOnEsc","closeOnShadeClick","S_KEY","ctrl","handleSubmit","closeMeMaybe","refreshInitialData","showLoadSpinner","getParams","headers","requestOptions","update","deltaNames","initialDeltaValues","hideLoadSpinner","updateHeaderVisibility","forceShow","showHeader","submitButtonLabel","updateTabs","tabs","formAttributes","setElementAttributes","editUrl","sidebar","hostname","notice","Tabs","_closedSidebarStyles","offsetWidth","_openedSidebarStyles","one","trapFocusWithin","showSubmitSpinner","hideSubmitSpinner","submit","findDeltaData","handleSubmitResponse","handleSubmitError","clearErrors","notificationSettings","modelName","closeOnSubmit","close","isAxiosError","errors","showErrors","entries","fieldErrors","addErrorsToField","clearErrorsFromField","isDirty","isOpen","rxhtmlTag","jQuery","htmlPrefilter","navHeight","arr","isArray","grouped","thisKey","category","translations","formatMessage","pattern","tokens","_tokenizePattern","_parseToken","start","pos","depth","chars","param","arg","number","formatNumber","plural","selectorChars","p","formatDate","date","datepicker","datepickerOptions","dateFormat","shortcutText","clientOs","str","escapeRegex","getText","encodeUriComponent","encodeURIComponent","differences","chr","re","RegExp","setSelectionRange","inputName","rtrim","baseUrl","anchor","anchorPos","fromEntries","URLSearchParams","qsPos","isEmptyObject","pathParam","pathMatch","omitScriptNameInUrls","usePathInfo","scriptName","getCpUrl","baseCpUrl","getSiteUrl","baseSiteUrl","actionUrl","hash","origin","pathname","qs","pageTrigger","pageParam","getCsrfInput","postActionRequest","contentType","_actionHeaders","errorThrown","readyState","send","registeredAssetBundles","registeredJsFiles","toUpperCase","actionName","namespaceInputName","v","getTime","request","sendApiRequest","_getApiHeaders","apiHeaders","baseURL","baseApiUrl","apiParams","_apiHeaders","processCraftHeaders","httpProxy","proxy","apiResponse","_processApiHeaders","_loadingApiHeaders","_apiHeaderWaitlist","_rejectApiRequests","clearCachedApiHeaders","XMLHttpRequest","setRequestHeader","responseType","onload","disposition","getResponseHeader","matches","exec","blob","Blob","link","URL","createObjectURL","appendChild","click","removeChild","stringToArray","oldData","newData","modifiedDeltaNames","groupedOldParams","_groupParamsByDeltaNames","groupedNewParams","__root__","n","concat","withRoot","initialValues","encodeURIComponentExceptEqualChar","decodeURIComponent","paramLoop","paramName","serializeParam","subName","expanded","parentElem","createForm","chunks","obj1","obj2","sortObjectKeys","Array","getObjectKeys","escapeChars","escaped","ltrim","startsWith","substr","filterArray","filtered","removeFromArray","getLast","uppercaseFirst","charAt","lowercaseFirst","parseUrl","scheme","host","port","query","Proxy","searchParams","isSameHost","requestUrlInfo","urlInfo","showSeconds","secondsInWeek","weeks","days","timeComponents","asciiString","charMap","normalize","char","asciiStr","asciiCharMap","uuid","crypto","randomUUID","getRandomValues","Uint8Array","namespaceId","createErrorList","$existingCss","existingCss","regexp","$existingJs","src","existingJs","appendFootHtml","infoicon","checkboxselect","fieldtoggle","lightswitch","nicetext","formsubmit","datetime","datetimeinput","_elementIndexClasses","_elementSelectorModalClasses","_elementEditorClasses","registerElementEditorClass","ElementEditorSlideout","systemUid","localStorage","parse","removeLocalStorage","removeItem","getCookie","cookie","setCookie","defaultCookieOptions","maxAge","expires","toUTCString","secure","removeCookie","hasThumb","otherSize","$oldImg","$newImg","sizes","srcset","picturefill","submitForm","redirect","retainScroll","scrollY","filterInputVal","regex","selectionStart","newVal","filterNumberInputVal","dataAttributes","subValue","isVisible","visibilityState","useMobileStyles","pageId","BroadcastChannel","channelName","appId","messageReceiver","addEventListener","instances","elementHtml","$replacement","$inputs","fn","animateLeft","easing","animateRight","$elem","itemSelector","cols","maxCols","minColWidth","fillMode","colClass","snapToGrid","Grid","InfoIcon","CheckboxSelect","FieldToggle","settingName","settingValue","thisSettings","indeterminateValue","LightSwitch","NiceText","$anchor","customTrigger","menuAnchor","$wrapper","checkValue","hasValue","charsLeftHtml","charsLeft","ready","$elementIndexSourcesContainer","$sourcesContainer","$sourcesHeader","$sourcesHeading","$sourceSettingsContainer","$sourceSettingsHeader","$addSourceMenu","addSourceMenu","$footerBtnContainer","$loadingSpinner","sourceSort","baseSortOptions","availableTableAttributes","customFieldAttributes","conditionBuilderHtml","conditionBuilderJs","userGroups","setContainer","buildModal","defaultSortOptions","addSource","$menuBtnContainer","sourceData","scrollContainerToElement","$newHeadingBtn","focusLabelInput","$newCustomSourceBtn","tableAttributes","$labelInput","getSourceName","focusIsInside","currentLayer","isNew","$itemLabel","$itemInput","Heading","updateItemLabel","heading","Source","CustomSource","save","disabledSourceKeys","reload","appendIndexSourceItem","$sourceItem","$lastSourceItem","isHeading","$lastTopLevelSource","BaseSource","$settingsContainer","handleActivatingKeypress","isNative","isSelected","deselect","createSettings","getIndexSourceItem","$sortDirectionInput","createLightswitchField","createSortField","createTableAttributesField","handleSortAttributeChange","useDefaultDir","$columnCheckboxes","selectedAttributes","createTableColumnOption","instructions","$labelField","defaultId","swapPlaceholders","createCheckboxSelectField","showAllOption","handleLabelInputChange","table","$rows","getHelper","caboose","Y_AXIS","$helperRow","helperClass","$cells","DeleteUserModal","userId","$deleteActionRadios","$deleteSubmitBtn","userSelect","_deleting","idParam","contentSummary","_submitBtnLabel","validateDeleteInputs","withContent","num","validates","onSubmit","DynamicGenerator","EditableTable","baseName","biggestId","$addRowBtn","$tableParent","$statusMessage","rowCount","hasMaxRows","hasMinRows","radioCheckboxes","copyDraggeeInputValuesToHelper","updateAllRows","initialize","initializeIfVisible","minRows","createRowObj","updateAddRowButton","canAddRow","staticRows","updateRow","canDeleteRow","updateDeleteRowButton","rowId","updateStatusMessage","allowDelete","deleteRow","$tr","onDeleteRow","allowAdd","maxRows","rowIdPrefix","createRow","defaultValues","onAddRow","allowReorder","Row","focusOnPrevRow","tdIndex","blurTd","prevRow","$prevTr","$tds","focusOnNextRow","nextRow","$nextTr","importData","lines","j","textualColTypes","colId","$cell","col","scope","code","small","createDateInput","createLightswitch","createTimeInput","createTextInput","niceTexts","tds","$textareas","tr","td","$textarea","textareasByColId","onHeightChange","onTextareaHeightChange","radioMode","applyToggleCheckbox","autopopulate","HandleGenerator","allowNonAlphaStart","onTextareaFocus","onRadioCheckboxChange","checkbox","checkboxColId","neg","checkboxCol","colum","ignoreNextTextareaFocus","handleKeypress","charCode","handlePaste","clipboardData","getData","validateValue","safeValue","tallestTextareaHeight","tdHeight","numericKeyCodes","ElementActionTrigger","maxLevels","newChildUrl","triggerEnabled","batch","bulk","defineProperty","activate","updateTrigger","validateSelection","enableTrigger","disableTrigger","valid","handleTriggerActivation","ElementEditor","isFullPage","$contentContainer","$revisionBtn","$revisionLabel","$expandSiteStatusesBtn","$statusIcon","$previewBtn","$editMetaBtn","metaHud","$nameTextInput","$saveMetaBtn","$siteStatusPane","$globalLightswitch","$siteLightswitches","$additionalSiteField","siteIds","newSiteIds","enableAutosave","lastSerializedValue","listeningForChanges","pauseLevel","queue","submittingForm","duplicatedElements","failed","httpStatus","httpError","openingPreview","preview","activatedPreviewToken","previewTokenQueue","previewLinks","hiddenTipsStorageKey","tipDismissBtn","slideout","$primaryForm","_createQueue","autosaveDrafts","siteStatuses","$spinnerContainer","canEditMultipleSites","previewTargets","enablePreview","$previewBtnContainer","createPreviewLink","createShareMenu","revisionId","serializeForm","isProvisionalDraft","initForProvisionalDraft","isUnpublishedDraft","initForDraft","canSaveCanonical","saveShortcut","createDraft","listenForChanges","showStatusHud","handleDismissibleTips","canonicalId","canCreateDrafts","statusIcons","checkForm","stopListeningForChanges","$discardButton","initialHeight","$notice","heightDiff","hashedCpEditUrl","provisional","createEditMetaBtn","expandSiteStatuses","$enabledForSiteField","_getOtherSupportedSites","_createSiteStatusField","$globalField","_showField","siteStatusValues","hasEnabled","hasDisabled","originalEnabledValue","originalSerializedStatus","enabledForSite","_updateGlobalStatus","serializedStatuses","additionalSites","_createAddlSiteField","_updateSiteStatuses","_removeField","allEnabled","allDisabled","turnOn","turnOff","turnIndeterminate","enabled","site","fieldClass","$lightswitch","some","selectLabelId","$addlSiteSelectLabel","$addlSiteSelectContainer","labelledBy","$addlSiteSelect","addlSiteInfo","enabledByDefault","_saveFailMessage","_saveSuccessMessage","$mainContainer","spinners","statusMessage","getTokenizedPreviewUrl","targetUrl","targetLabel","activatePreviewToken","updatePreviewLinks","updatePreviewLinkHref","isLive","getPreviewTokenParams","previewToken","getPreviewToken","randoParam","asPromise","siteToken","previewUrl","tokenParam","createTokenParams","getPreview","$statusIcons","scrollTo","ensureIsDraftOrRevision","onlyIfChanged","removeActionParams","isPreviewActive","$editor","redirectName","saveDraft","isActive","modifiedFieldNames","preparedData","prepareData","deltaName","extraData","visibleLayoutElements","selectedTabId","_saveHeaders","_afterSaveDraft","createdProvisionalDraft","docTitle","draftName","revisionMenu","oldId","siteSettings","creator","timestamp","updatePreviewTargets","checkMetaValues","selectors","modifiedAttributes","$fields","noChanges","$allTabContainers","changedElements","missingElements","tabInfo","$oldElement","$placeholder","$unusedTabContainers","afterUpdate","_showFailStatus","setStatusMessage","deltaCallback","swapDuplicatedElementIds","idsRE","namespacedFields","pre","post","_filterFieldInputName","nestedNames","lastHandle","fieldsWithoutContent","newTarget","$previewLink","delay","showMetaHud","createMetaHud","onMetaHudShow","$hudBody","$nameField","$nameInputContainer","saveMeta","onMetaHudHide","onMetaHudEscape","shakeMetaHud","autosave","$confirmUnloadForms","hideTip","getHiddenTipsUids","setHiddenTipsUids","uids","targetElement","$targetParent","layoutElementUid","Storage","hiddenTips","editor","saveParams","onSaveElement","validators","ElementFieldSettings","allowMultipleSources","$maintainHierarchyField","$maintainHierarchyInput","$sourcesField","$sourceSelect","$branchLimitField","$maxRelationsField","$minRelationsField","maintainHierarchyFieldId","sourcesFieldId","branchLimitFieldId","minRelationsFieldId","maxRelationsFieldId","updateLimitFields","updateMaintainHierarchyField","showField","$checkedInputs","workers","Worker","$thumbs","$thumb","$scrollParent","scrollParent","addToQueue","invisibleThumbs","thumb","active","loadNext","scrollParentOffset","scrollParentHeight","thumbOffset","retryAll","loader","$img","ElevatedSessionForm","inputs","form","getInputPostVal","handleFormSubmit","elevatedSessionManager","fetchingTimeout","stopImmediatePropagation","inputsChanged","$currentInput","requireElevatedSession","ElevatedSessionManager","passwordModal","$errorPara","minSafeElevatedSessionTimeout","showPasswordModal","$passwordModal","focusPasswordInput","submitPassword","currentPassword","showPasswordError","EntryIndex","publishableSections","$newEntryBtnGroup","$newEntryBtn","defaultSectionHandle","selectedSection","section","_createEntry","sectionId","entry","sectionSourceKey","FieldLayoutDesigner","$configInput","$newTabBtn","$libraryToggle","$selectedLibrary","$fieldLibrary","$uiLibrary","$uiLibraryElements","$fieldSearch","$clearFieldSearchBtn","$fieldGroups","tabGrid","elementDrag","_config","$workspace","$fieldSearchContainer","initTab","ElementDrag","customizableTabs","tabDrag","TabDrag","customizableUi","$libraryPicker","$matches","$group","Tab","removeFieldByHandle","addTab","updatePositionInConfig","config","updateConfig","createSlideout","contents","js","eval","designer","destroyed","settingsNamespace","createMenu","initElement","menuBtn","onTabOptionSelect","$prev","$next","settingsHtml","settingsJs","applySettings","$indicator","hasConditions","Element","findIndex","designerConfig","newIndex","tabConfig","oldIndex","isField","requirable","hasCustomWidth","hasSettings","isRequired","showSettings","initUi","SlidePicker","step","valueLabel","pct","$fieldsContainer","selectorHtml","updateRequiredClass","required","elementConfig","BaseDrag","Drag","$insertion","showingInsertion","$caboose","findItems","createInsertion","createCaboose","removeCaboose","swapDraggeeWithInsertion","swapInsertionWithDraggee","setMidpoints","getClosestItem","_closestItem","_closestItemMouseDiff","_i","_$item","_midpoint","_mouseDiff","getDist","checkForNewClosestItem","refreshCols","display","draggeeDisplay","visibility","helpers","_showDraggee","onDrag","draggingLibraryElement","draggingField","originalTab","isDraggeeMandatory","isHoveringOverTab","hitTest","$fieldContainers","$libraryElement","targetPrefix","reverseTargetSelector","_$reverseTarget","getType","normalizeTargetSelector","findTargets","onToggleChange","nodeName","getToggleVal","boolean","postVal","_show","totalCols","colGutterDrop","colPctWidth","possibleItemColspans","possibleItemPositionsByColspan","itemPositions","itemColspansByPosition","layouts","layout","itemHeights","leftPadding","_refreshingCols","_refreshColsAfterRefresh","_forceRefreshColsAfterRefresh","handleContainerHeightProxy","setItems","oldHeight","scrollHeight","gutter","itemIndex","tallestItemHeight","colIndex","itemHeight","remainder","itemHeightsByColspan","positionRight","positionLeft","minColspan","maxColspan","colspan","getItemWidthCss","minPosition","maxPosition","colHeights","createLayouts","layoutTotalCols","highestTotalCols","layoutHeights","shortestHeight","shortestLayouts","emptySpaces","emptySpace","colspans","getItemLeftPosCss","positions","isSimpleLayout","positionItems","completeRefreshCols","onRefreshCols","getItemWidth","getItemWidthInPx","getItemLeftPosInPx","prevPositions","prevColspans","prevColHeights","prevEmptySpace","LayoutGenerator","endingCol","affectedColHeights","onItemResize","newHeight","tallestColHeightsByPosition","colHeightsForPosition","tallestColHeight","words","handleCasing","ImageUpload","initImageUpload","containerSelector","uploadAction","postParameters","fileInputSelector","uploadParamName","initButtons","uploadButtonSelector","deleteButtonSelector","refreshImage","onAfterRefreshImage","$icon","$liveRegion","wrap","previousSibling","nodeType","Node","TEXT_NODE","nodeValue","showHud","closeOtherHUDs","indeterminate","dragger","dragStartMargin","outerContainer","X_AXIS","_onDrag","_onDragStop","muteEvent","changed","_onSettle","_getOffMargin","_onMouseDown","_onMouseUp","dragging","_getMargin","mouseDistX","selectedOptionIndex","selectedClass","focusClass","LivePreview","$extraFields","$dragHandle","$previewContainer","$iframeContainer","$iframe","$fieldPlaceholder","basePostData","inPreviewMode","fields","lastPostData","updateIframeInterval","checkAgain","dragStartEditorWidth","_slideInOnIframeLoad","_scrollX","_scrollY","_editorWidth","_editorWidthInPx","protocol","previewParams","extraFields","defaultEditorWidth","moveFieldsBack","editorWidthInPx","inPx","minEditorWidthInPx","exit","$editorHeader","handleWindowResize","getIframeWidth","$clone","_getClone","updateIframe","slideIn","createToken","previewAction","submitPrimaryForm","updateWidths","$newClone","field","contentWindow","scrollLeft","xhrFields","withCredentials","crossDomain","handleSuccess","handleError","forceUpdateIframe","write","copyInputValues","livePreview","$textInput","$showPasswordToggle","showingPassword","passwordInput","initInputFocusEvents","hidePassword","setCurrentInput","updateToggleLabel","showPassword","autocapitalize","togglePassword","onInputChange","selectionEnd","$previewWrapper","$previewSkipLink","$bumperLink","$notifier","$previewHeader","$targetBtn","$targetMenu","$deviceTypeContainer","$orientationBtn","$refreshBtn","$deviceMask","$devicePreviewContainer","iframeLoaded","$tempInput","activeTarget","currentDeviceType","deviceOrientation","deviceWidth","deviceHeight","deviceMaskDimensions","phone","tablet","iframeHeight","_updateIframeProxy","previewSkipLinkText","$modalLabel","Pro","switchTarget","_buildDeviceTypeFieldset","_getDeviceTypeTranslation","translation","_getDeviceOrientationTranslation","deviceType","deviceBtnGroup","switchDeviceType","_activeTarget","_autoRefresh","previewTarget","hideModalBackgroundLayers","resetModalBackgroundLayerVisibility","_devicePreviewIsActive","updateDevicePreview","_useIframeResizer","previewIframeResizerOptions","resetScroll","sameHost","frameborder","iFrameResize","checkOrigin","scrolling","onInit","iframe","_updateNotifier","newDeviceType","switchOrientation","hZoom","wZoom","previewHeight","previewWidth","maskHeight","maskWidth","translate","rotationDeg","marginTop","marginLeft","$triggerElement","$bumperButtonStart","$bumperButtonEnd","defaultSettings","_onHide","instance","loadAsset","focusItem","_addBumperButtons","_addModalName","headingId","destruct","desiredHeight","desiredWidth","containerHeight","containerWidth","_resizeContainer","previewHtml","$innerProgressBar","$progressBarStatus","_itemCount","_processedItemCount","_displaySteps","displaySteps","setProcessedItemCount","fadeTo","incrementItemCount","percentage","$modalContainerDiv","$prompt","$promptApplyToRemainingContainer","$promptApplyToRemainingCheckbox","$promptApplyToRemainingLabel","$pomptChoices","_prompts","_promptBatchCallback","_promptBatchReturnData","_promptBatchNum","_showNextPromptInBatch","remainingInBatch","_showPrompt","_handleBatchPromptSelection","applyToRemaining","choiceData","itemsToGo","_promptCallback","$promptMessage","$promptChoices","$promptButtons","$radioButton","_selectPromptChoice","fadeOut","_cancelPrompt","running","paused","pausedForVisibility","jobs","isPaused","_resume","job","_add","qResolve","qReject","_exec","totalSteps","HOME_KEY","END_KEY","_min","_max","Number","isInteger","prevAll","triggerEvent","$activeButton","startPositionX","graduationsMin","graduationsMax","slideMin","slideMax","$overlay","$cursor","$graduations","$graduationsUl","_handleResize","_handleTapStart","_handleTapMove","_handleTapEnd","_handleKeypress","graduationsCalculatedWidth","valueToPosition","current","PAGE_UP_KEY","PAGE_DOWN_KEY","touch","startLeft","curX","positionToValue","scaleMin","scaleMax","addModalAttributes","autoOpen","setTriggerElement","_cancelTransitionListeners","addPanel","removePanel","openPanels","panel","updateStyles","totalPanels","SlugGenerator","allowUppercaseInSlug","limitAutoSlugsToAscii","XRegExp","matchChain","slugWordSeparator","Structure","structureDrag","$parents","initToggle","StructureDrag","initNewChildMenus","viewStateKey","$addBtns","onNewChildMenuClick","showMenu","getIndent","level","baseIndent","nestedIndent","addElement","$parentUl","_removeUl","structure","draggeeLevel","$helperLi","$targets","draggeeHeight","$level","cancelDrag","$lis","$closestTarget","closestTargetPos","closestTargetYDiff","closestTargetOffset","closestTargetHeight","targetOffset","targetHeight","targetYMidpoint","targetYDiff","$closestTargetLi","closestTargetLevel","$nextTargetLi","nextTargetLevel","hoveringBetweenRows","draggeeX","targetItemMouseDiffX","$parentLis","$closestParentLi","closestParentLiXDiff","closestParentLevel","$parentLi","parentLiX","parentLiXDiff","parentLevel","onMouseUp","$draggeeParent","moved","$closestSiblings","newLevel","setLevel","structureId","prevId","indent","$childLis","StructureTableSorter","tableView","_basePadding","_helperMargin","_$titleHelperCell","_titleHelperCellOuterWidth","_ancestors","_updateAncestorsFrame","_draggeeLevel","_draggeeLevelDelta","draggingLastElements","_loadingDraggeeLevelDelta","_targetLevel","_targetLevelBounds","_positionChanged","singleHelper","helperSpacingY","findDraggee","$nextRow","nextRowLevel","nextRowLevelDelta","_getAjaxBaseData","delta","drag","canInsertBefore","_getLevelBounds","canInsertAfter","_getAncestors","_setTargetLevelBounds","_updateIndent","onInsertionPointChange","_updateAncestorsBeforeRepaint","levelDiff","padding","_getLevelIndent","$prevRow","prevRowLevel","$spinnerRow","_createSpinnerRowAfter","onPositionChange","_expandElement","onReturnHelpersToDraggees","newDraggeeIndexes","oldDraggeeIndexes","$postDraggeeItems","nextAll","_minLevel","_maxLevel","forcePositionChange","_mouseDist","realMouseX","mousedownX","_indentationDist","LEVEL_INDENT","_targetLevelMouseDiff","_magnetImpact","MAX_GIVE","_closestLevelMagnetIndent","targetLevel","_level","_$prevRow","cancelAnimationFrame","_updateAncestors","_$ancestor","_newAncestors","ancestorTitle","HELPER_MARGIN","$tableCaption","$selectedSortHeader","structureTableSort","_totalVisiblePostStructureTableDraggee","_morePendingPostStructureTableDraggee","_broadcastListener","initTableHeaders","_updateScreenReaderStatus","_collapseElement","attributeHtml","selectedSortAttr","$tableHeaders","sortValue","selectedSortDir","makeColumnSortable","sorted","headerHtml","$instructions","$headerButton","_handleSelectedSortHeaderClick","_handleUnselectedSortHeaderClick","_isStructureTableDraggingLastElements","positionedAfter","updateResponsiveTables","$nextNextRow","descendantOf","$nextRows","newSortDir","_handleSortHeaderClick","_updateTableAttributes","removeEventListener","$tablist","$firstTab","$lastTab","$selectedTab","$focusableTab","selectTab","makeTabFocusable","scrollToTab","updateMenuBtn","_getTab","deselectTab","elemScrollOffset","targetScrollLeft","tabWidth","ulWidth","HTMLElement","TagSelectInput","searchMenu","$addTagInput","_ignoreBlur","searchForTags","selectTag","$hoverOption","$nextOption","focusOption","$prevOption","killSearchMenu","excludeIds","tagGroupId","tags","exclude","exactMatch","Menu","attachToElement","targetSiteId","$titleContainer","autocomplete","inputmode","maxlength","autofocus","getAutofocusValue","getDisabledValue","readonly","showCharsLeft","createCopyTextInput","buttonId","execCommand","createCopyTextBtn","copyValue","createCopyTextField","createCopyTextPrompt","createTextarea","createTextareaField","$select","optgroup","$optgroup","selected","reverseToggle","for","createCheckboxField","createCheckboxSelect","allValue","allChecked","allLabel","labelId","$colorPreviewContainer","createColorField","isMobile","getMonth","toISOString","timezone","defaultDate","hasOuterContainer","createDateField","createDateRangePicker","today","getFullYear","getDate","startDate","endDate","$allOption","firstDayOffset","getDay","firstDay","$flex","$startDate","$endDate","$dateInputs","dpDiv","setPositionRelativeToAnchor","startTime","endTime","foundOption","btnClasses","timepicker","timepickerOptions","getHours","getMinutes","getSeconds","createTimeField","warning","$warning","addErrorsToList","$errors","_rejectedFiles","_extensionList","_totalFileCounter","_validFileCounter","autoUpload","fileupload","onFileAdd","paramObject","getInProgress","validateExtension","_createExtensionList","process","done","files","pass","fileExtension","maxFileSize","originalFiles","processErrorMessages","kinds","humanFileSize","maxUploadSize","bytes","threshold","u","toFixed","allowedKind","fileKinds","extensions","ext","pasteZone","sequentialUploads","Accept","UriFormatGenerator","uriFormat","suffix","UserIndex","updateUrl","defaultSourceSlug","slug","__esModule","default","module","locals","exports","listToStyles","list","styles","newStyles","part","media","sourceMap","parts","hasDocument","DEBUG","Error","stylesInDom","head","getElementsByTagName","singletonElement","singletonCounter","isProduction","ssrIdKey","isOldIE","navigator","userAgent","addStylesClient","_isProduction","_options","addStylesToDom","newList","mayRemove","domStyle","refs","addStyle","createStyleElement","styleElement","querySelector","parentNode","styleIndex","applyToSingletonTag","applyToTag","newObj","textStore","replaceText","replacement","Boolean","styleSheet","cssText","cssNode","createTextNode","childNodes","ssrId","btoa","unescape","firstChild","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","getter","definition","enumerable","prototype","CP","authManager","$nav","$navToggle","$globalSidebar","$globalContainer","$alerts","$crumbs","$breadcrumbList","$breadcrumbItems","$notificationContainer","$headerContainer","$mainContent","$details","$sidebarContainer","$sidebarToggle","$edition","$deltaForms","$collapsibleTables","fixedHeader","breadcrumbListWidth","breadcrumbDisclosureItem","enableQueue","totalJobs","jobInfo","displayedJobInfo","displayedJobInfoUnchanged","trackJobProgressTimeout","jobProgressIcon","checkingForUpdates","forcingRefreshOnUpdatesCheck","includingDetailsOnUpdatesCheck","checkForUpdatesCallbacks","resizeTimeout","$allInstructions","updateFixedHeader","setSidebarNavAttributes","initSpecialForms","initAlerts","shortcuts","shortcut","initTabs","LOCATION_HASH","_handleInputFocus","_handleInputBlur","announcements","$unreadMessage","hasUnreads","unread","footer","IntersectionObserver","classList","intersectionRatio","rootMargin","observe","$contentHeader","$forms","confirmUnload","returnValue","updateSidebarMenuLabel","toggleNav","isExpanded","navIsExpanded","disableGlobalSidebarLinks","enableGlobalSidebarLinks","focusableItems","isAlwaysVisible","getComputedStyle","getPropertyValue","newState","toggleClass","$tabsContainer","$tabsList","selectedTabIndex","handleBreadcrumbVisibility","breadcrumbItemsWrap","listWidth","totalItemWidth","finalIndex","visibleItemWidth","shownItems","hiddenItems","_$table","_containerWidth","_check","_isCollapsed","headerHeight","displayNotification","notification","Notification","notificationType","iconLabel","fetchAlerts","alerts","displayAlerts","$shunnableAlerts","$link","checkForUpdates","forceRefresh","includeDetails","realCallback","_checkForUpdates","updateUtilitiesBadge","callbacks","updateInfo","_getUpdates","_checkForCachedUpdates","cached","onlyIfCached","updates","_cacheUpdates","$utilitiesLink","$screenReaderText","badgeCount","runQueueAutomatically","trackJobProgress","_trackJobProgressInternal","setJobInfo","oldInfo","getDisplayedJobInfo","progressLabel","updateJobIcon","statuses","JOB_STATUS_RESERVED","JOB_STATUS_FAILED","JOB_STATUS_WAITING","JobProgressIcon","hideFailMode","setDescription","description","setProgress","showFailMode","cpTrigger","notificationDuration","JOB_STATUS_DONE","closing","closeTimeout","_preventDelayedClose","originalActiveElement","$closeBtnContainer","details","_negMargin","_initDelayedClose","delayedClose","preventDelayedClose","$progressLabel","failMode","_$bgCanvas","_$staticCanvas","_$hoverCanvas","_$failCanvas","_staticCtx","_hoverCtx","_canvasSize","_arcPos","_arcRadius","_lineWidth","_arcStartPos","_arcEndPos","_arcStartStepSize","_arcEndStepSize","_arcStep","_arcStepTimeout","_arcAnimateCallback","_progressBar","canAccessQueueManager","$canvasContainer","$labelContainer","_createCanvas","getContext","_drawArc","_animateArc","_setArc","color","$canvas","ctx","strokeStyle","lineWidth","lineCap","startPos","endPos","clearRect","beginPath","arc","closePath","targetStartPos","targetEndPos","_takeNextArcStep"],"sourceRoot":""}
\ No newline at end of file
diff --git a/src/web/assets/cp/src/js/ElementEditor.js b/src/web/assets/cp/src/js/ElementEditor.js
index 9b00b586f62..b0348dab8e9 100644
--- a/src/web/assets/cp/src/js/ElementEditor.js
+++ b/src/web/assets/cp/src/js/ElementEditor.js
@@ -1633,13 +1633,7 @@ Craft.ElementEditor = Garnish.Base.extend(
                 'g'
               ),
               (m, pre, id, post) => {
-                let duplicate = false;
-                try {
-                  duplicate = this._filterFieldInputName(pre);
-                } catch (e) {
-                  console.warn(`Unexpected input name: ${m}`);
-                }
-                if (!duplicate) {
+                if (!this._filterFieldInputName(pre)) {
                   return m;
                 }
                 return pre + this.duplicatedElements[id] + post;
@@ -1651,17 +1645,12 @@ Craft.ElementEditor = Garnish.Base.extend(
               (m, name, id) => {
                 // Ignore param names that end in `[enabled]`, `[type]`, etc.
                 // (`[sortOrder]` should pass here, which could be set to a specific order index, but *not* `[sortOrder][]`!)
-                let duplicate = false;
-                try {
-                  duplicate =
-                    this._filterFieldInputName(name) &&
-                    !name.match(
-                      new RegExp(`${lb}(enabled|sortOrder|type|typeId)${rb}$`)
-                    );
-                } catch (e) {
-                  console.warn(`Unexpected input name: ${m}`);
-                }
-                if (!duplicate) {
+                if (
+                  !this._filterFieldInputName(name) ||
+                  name.match(
+                    new RegExp(`${lb}(enabled|sortOrder|type|typeId)${rb}$`)
+                  )
+                ) {
                   return m;
                 }
                 return `&${name}=${this.duplicatedElements[id]}`;
@@ -1679,13 +1668,13 @@ Craft.ElementEditor = Garnish.Base.extend(
       const lb = encodeURIComponent('[');
       const rb = encodeURIComponent(']');
       const nestedNames = name.match(
-        new RegExp(`(\\bfields|${lb}fields${rb})${lb}[^${rb}]+${rb}`, 'g')
+        new RegExp(`(\\bfields|${lb}fields${rb})${lb}.+?${rb}`, 'g')
       );
       if (!nestedNames) {
         throw `Unexpected input name: ${name}`;
       }
       const lastHandle = nestedNames[nestedNames.length - 1].match(
-        new RegExp(`(?:\\bfields|${lb}fields${rb})${lb}([^${rb}]+)${rb}`)
+        new RegExp(`(?:\\bfields|${lb}fields${rb})${lb}(.+?)${rb}`)
       )[1];
       return Craft.fieldsWithoutContent.includes(lastHandle);
     },