diff --git a/modules/backend/ServiceProvider.php b/modules/backend/ServiceProvider.php
index ac0e5cd..b0a5026 100644
--- a/modules/backend/ServiceProvider.php
+++ b/modules/backend/ServiceProvider.php
@@ -4,6 +4,7 @@
use Backend;
use BackendMenu;
use BackendAuth;
+use Backend\Models\UserRole;
use Backend\Classes\WidgetManager;
use System\Classes\MailManager;
use System\Classes\CombineAssets;
@@ -74,6 +75,11 @@ protected function registerAssetBundles()
$combiner->registerBundle('~/modules/backend/formwidgets/repeater/assets/less/repeater.less');
$combiner->registerBundle('~/modules/backend/formwidgets/codeeditor/assets/js/build.js');
$combiner->registerBundle('~/modules/backend/formwidgets/fileupload/assets/less/fileupload.less');
+ $combiner->registerBundle('~/modules/backend/formwidgets/nestedform/assets/less/nestedform.less');
+ $combiner->registerBundle('~/modules/backend/formwidgets/richeditor/assets/js/build-plugins.js');
+ $combiner->registerBundle('~/modules/backend/formwidgets/colorpicker/assets/less/colorpicker.less');
+ $combiner->registerBundle('~/modules/backend/formwidgets/permissioneditor/assets/less/permissioneditor.less');
+ $combiner->registerBundle('~/modules/backend/formwidgets/markdowneditor/assets/less/markdowneditor.less');
/*
* Rich Editor is protected by DRM
@@ -136,10 +142,18 @@ protected function registerBackendPermissions()
'label' => 'system::lang.permissions.view_the_dashboard',
'tab' => 'system::lang.permissions.name'
],
+ 'backend.manage_default_dashboard' => [
+ 'label' => 'system::lang.permissions.manage_default_dashboard',
+ 'tab' => 'system::lang.permissions.name',
+ ],
'backend.manage_users' => [
'label' => 'system::lang.permissions.manage_other_administrators',
'tab' => 'system::lang.permissions.name'
],
+ 'backend.impersonate_users' => [
+ 'label' => 'system::lang.permissions.impersonate_users',
+ 'tab' => 'system::lang.permissions.name',
+ ],
'backend.manage_preferences' => [
'label' => 'system::lang.permissions.manage_preferences',
'tab' => 'system::lang.permissions.name'
@@ -155,7 +169,12 @@ protected function registerBackendPermissions()
'media.manage_media' => [
'label' => 'backend::lang.permissions.manage_media',
'tab' => 'system::lang.permissions.name',
- ]
+ ],
+ 'backend.allow_unsafe_markdown' => [
+ 'label' => 'backend::lang.permissions.allow_unsafe_markdown',
+ 'tab' => 'system::lang.permissions.name',
+ 'roles' => UserRole::CODE_DEVELOPER,
+ ],
]);
});
}
@@ -179,6 +198,7 @@ protected function registerBackendWidgets()
$manager->registerFormWidget('Backend\FormWidgets\Repeater', 'repeater');
$manager->registerFormWidget('Backend\FormWidgets\TagList', 'taglist');
$manager->registerFormWidget('Backend\FormWidgets\MediaFinder', 'mediafinder');
+ $manager->registerFormWidget('Backend\FormWidgets\NestedForm', 'nestedform');
});
}
diff --git a/modules/backend/assets/css/october.css b/modules/backend/assets/css/october.css
index 8ccbe68..e11e700 100644
--- a/modules/backend/assets/css/october.css
+++ b/modules/backend/assets/css/october.css
@@ -1,1008 +1,1116 @@
-@import "../vendor/jcrop/css/jquery.Jcrop.min.css";@import "../../../system/assets/vendor/prettify/prettify.css";@import "../../../system/assets/vendor/prettify/theme-desert.css";@-webkit-keyframes showSweetAlert{0%{transform:scale(0.7);-webkit-transform:scale(0.7)}
-45%{transform:scale(1.05);-webkit-transform:scale(1.05)}
-80%{transform:scale(0.95);-webkit-tranform:scale(0.95)}
-100%{transform:scale(1);-webkit-transform:scale(1)}
-}
-@keyframes showSweetAlert{0%{transform:scale(0.7);-webkit-transform:scale(0.7)}
-45%{transform:scale(1.05);-webkit-transform:scale(1.05)}
-80%{transform:scale(0.95);-webkit-tranform:scale(0.95)}
-100%{transform:scale(1);-webkit-transform:scale(1)}
-}
-@-webkit-keyframes hideSweetAlert{0%{transform:scale(1);-webkit-transform:scale(1)}
-100%{transform:scale(0.5);-webkit-transform:scale(0.5)}
-}
-@keyframes hideSweetAlert{0%{transform:scale(1);-webkit-transform:scale(1)}
-100%{transform:scale(0.5);-webkit-transform:scale(0.5)}
-}
-.showSweetAlert{-webkit-animation:showSweetAlert 0.3s;animation:showSweetAlert 0.3s}
-.hideSweetAlert{-webkit-animation:hideSweetAlert 0.2s;animation:hideSweetAlert 0.2s}
-@-webkit-keyframes animateSuccessTip{0%{width:0;left:1px;top:19px}
-54%{width:0;left:1px;top:19px}
-70%{width:50px;left:-8px;top:37px}
-84%{width:17px;left:21px;top:48px}
-100%{width:25px;left:14px;top:45px}
-}
-@keyframes animateSuccessTip{0%{width:0;left:1px;top:19px}
-54%{width:0;left:1px;top:19px}
-70%{width:50px;left:-8px;top:37px}
-84%{width:17px;left:21px;top:48px}
-100%{width:25px;left:14px;top:45px}
-}
-@-webkit-keyframes animateSuccessLong{0%{width:0;right:46px;top:54px}
-65%{width:0;right:46px;top:54px}
-84%{width:55px;right:0px;top:35px}
-100%{width:47px;right:8px;top:38px}
-}
-@keyframes animateSuccessLong{0%{width:0;right:46px;top:54px}
-65%{width:0;right:46px;top:54px}
-84%{width:55px;right:0px;top:35px}
-100%{width:47px;right:8px;top:38px}
-}
-@-webkit-keyframes rotatePlaceholder{0%{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}
-5%{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}
-12%{transform:rotate(-405deg);-webkit-transform:rotate(-405deg)}
-100%{transform:rotate(-405deg);-webkit-transform:rotate(-405deg)}
-}
-@keyframes rotatePlaceholder{0%{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}
-5%{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}
-12%{transform:rotate(-405deg);-webkit-transform:rotate(-405deg)}
-100%{transform:rotate(-405deg);-webkit-transform:rotate(-405deg)}
-}
-.animateSuccessTip{-webkit-animation:animateSuccessTip 0.75s;animation:animateSuccessTip 0.75s}
-.animateSuccessLong{-webkit-animation:animateSuccessLong 0.75s;animation:animateSuccessLong 0.75s}
-.icon.success.animate::after{-webkit-animation:rotatePlaceholder 4.25s ease-in;animation:rotatePlaceholder 4.25s ease-in}
-@-webkit-keyframes animateErrorIcon{0%{transform:rotateX(100deg);-webkit-transform:rotateX(100deg);opacity:0}
-100%{transform:rotateX(0deg);-webkit-transform:rotateX(0deg);opacity:1}
-}
-@keyframes animateErrorIcon{0%{transform:rotateX(100deg);-webkit-transform:rotateX(100deg);opacity:0}
-100%{transform:rotateX(0deg);-webkit-transform:rotateX(0deg);opacity:1}
-}
-.animateErrorIcon{-webkit-animation:animateErrorIcon 0.5s;animation:animateErrorIcon 0.5s}
-@-webkit-keyframes animateXMark{0%{transform:scale(0.4);-webkit-transform:scale(0.4);margin-top:26px;opacity:0}
-50%{transform:scale(0.4);-webkit-transform:scale(0.4);margin-top:26px;opacity:0}
-80%{transform:scale(1.15);-webkit-transform:scale(1.15);margin-top:-6px}
-100%{transform:scale(1);-webkit-transform:scale(1);margin-top:0;opacity:1}
-}
-@keyframes animateXMark{0%{transform:scale(0.4);-webkit-transform:scale(0.4);margin-top:26px;opacity:0}
-50%{transform:scale(0.4);-webkit-transform:scale(0.4);margin-top:26px;opacity:0}
-80%{transform:scale(1.15);-webkit-transform:scale(1.15);margin-top:-6px}
-100%{transform:scale(1);-webkit-transform:scale(1);margin-top:0;opacity:1}
-}
-.animateXMark{-webkit-animation:animateXMark 0.5s;animation:animateXMark 0.5s}
-@-webkit-keyframes pulseWarning{0%{border-color:#F8D486}
-100%{border-color:#F8BB86}
-}
-@keyframes pulseWarning{0%{border-color:#F8D486}
-100%{border-color:#F8BB86}
-}
-.pulseWarning{-webkit-animation:pulseWarning 0.75s infinite alternate;animation:pulseWarning 0.75s infinite alternate}
-@-webkit-keyframes pulseWarningIns{0%{background-color:#F8D486}
-100%{background-color:#F8BB86}
-}
-@keyframes pulseWarningIns{0%{background-color:#F8D486}
-100%{background-color:#F8BB86}
-}
-.pulseWarningIns{-webkit-animation:pulseWarningIns 0.75s infinite alternate;animation:pulseWarningIns 0.75s infinite alternate}
-.sweet-overlay{background-color:rgba(0,0,0,0.4);position:fixed;left:0;right:0;top:0;bottom:0;display:none;z-index:7600}
-.sweet-alert{background-color:#f9f9f9;width:478px;padding:17px;border-radius:5px;text-align:center;position:fixed;left:50%;top:50%;margin-left:-256px;margin-top:-200px;overflow:hidden;display:none;z-index:8600}
-@media all and (max-width:767px){.sweet-alert{width:auto;margin-left:0;margin-right:0;left:15px;right:15px}
-}
-.sweet-alert .icon{width:80px;height:80px;border:4px solid gray;border-radius:50%;margin:20px auto;position:relative;box-sizing:content-box}
-.sweet-alert .icon.error{border-color:#952518}
-.sweet-alert .icon.error .x-mark{position:relative;display:block}
-.sweet-alert .icon.error .line{position:absolute;height:5px;width:47px;background-color:#ab2a1c;display:block;top:37px;border-radius:2px}
-.sweet-alert .icon.error .line.left{-webkit-transform:rotate(45deg);transform:rotate(45deg);left:17px}
-.sweet-alert .icon.error .line.right{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);right:16px}
-.sweet-alert .icon.warning{border-color:#eea236}
-.sweet-alert .icon.warning .body{position:absolute;width:5px;height:47px;left:50%;top:10px;border-radius:2px;margin-left:-2px;background-color:#f0ad4e}
-.sweet-alert .icon.warning .dot{position:absolute;width:7px;height:7px;border-radius:50%;margin-left:-3px;left:50%;bottom:10px;background-color:#f0ad4e}
-.sweet-alert .icon.info{border-color:#46b8da}
-.sweet-alert .icon.info::before{content:"";position:absolute;width:5px;height:29px;left:50%;bottom:17px;border-radius:2px;margin-left:-2px;background-color:#5bc0de}
-.sweet-alert .icon.info::after{content:"";position:absolute;width:7px;height:7px;border-radius:50%;margin-left:-3px;top:19px;background-color:#5bc0de}
-.sweet-alert .icon.success{border-color:#2b9854}
-.sweet-alert .icon.success::before,.sweet-alert .icon.success::after{content:'';border-radius:50%;position:absolute;width:60px;height:120px;background:white;-webkit-transform:rotate(45deg);transform:rotate(45deg)}
-.sweet-alert .icon.success::before{border-radius:120px 0 0 120px;top:-7px;left:-33px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:60px 60px;transform-origin:60px 60px}
-.sweet-alert .icon.success::after{border-radius:0 120px 120px 0;top:-11px;left:30px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0px 60px;transform-origin:0px 60px}
-.sweet-alert .icon.success .placeholder{width:80px;height:80px;border:4px solid rgba(49,172,95,0.2);border-radius:50%;box-sizing:content-box;position:absolute;left:-4px;top:-4px;z-index:2}
-.sweet-alert .icon.success .fix{width:5px;height:90px;background-color:#f9f9f9;position:absolute;left:28px;top:8px;z-index:1;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}
-.sweet-alert .icon.success .line{height:5px;background-color:#31ac5f;display:block;border-radius:2px;position:absolute;z-index:2}
-.sweet-alert .icon.success .line.tip{width:25px;left:14px;top:46px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}
-.sweet-alert .icon.success .line.long{width:47px;right:8px;top:38px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}
-.sweet-alert .icon.custom{background-size:contain;border-radius:0;border:none;background-position:center center;background-repeat:no-repeat}
-.sweet-alert .btn-default:focus{border-color:#656d79;outline:0}
-.sweet-alert .btn-success:focus{border-color:#2b9854;outline:0}
-.sweet-alert .btn-info:focus{border-color:#46b8da;outline:0}
-.sweet-alert .btn-danger:focus{border-color:#952518;outline:0}
-.sweet-alert .btn-warning:focus{border-color:#eea236;outline:0}
-.sweet-alert button::-moz-focus-inner{border:0}
-.sweet-overlay{background-color:rgba(0,0,0,0.2);z-index:10499}
-.sweet-alert{text-align:right;border-radius:3px;-webkit-box-shadow:0 27px 24px 0 rgba(0,0,0,0.2),0 40px 77px 0 rgba(0,0,0,0.22);box-shadow:0 27px 24px 0 rgba(0,0,0,0.2),0 40px 77px 0 rgba(0,0,0,0.22);z-index:10500}
-.sweet-alert h2{word-break:word-break;word-wrap:break-word;max-height:350px;overflow-y:auto;margin:10px 0 17px 0;color:#2b3e50;text-align:left;font-size:15px;line-height:23px}
-.sweet-alert p{margin:0}
-.sweet-alert p.text-muted{margin-bottom:20px;color:#555555}
-.control-simplelist{font-size:13px;padding:20px 20px 2px 20px;margin-bottom:20px;background:#ffffff;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
-.control-simplelist ul{padding-left:15px}
-.control-simplelist.form-control ul{margin-bottom:0}
-.control-simplelist.form-control li{padding-top:5px;padding-bottom:5px}
-.control-simplelist.with-icons ul,.control-simplelist.with-checkboxes ul,.control-simplelist.is-divided ul,.control-simplelist.is-selectable ul{list-style-type:none;padding-left:0}
-.control-simplelist.with-checkboxes li{margin-top:-5px}
-.control-simplelist.with-checkboxes li:first-child{margin-top:0}
-.control-simplelist.with-checkboxes li:last-child div.custom-checkbox{margin-bottom:0}
-.control-simplelist.with-checkboxes li:last-child div.custom-checkbox label{margin-bottom:5px}
-.control-simplelist.is-sortable li.placeholder{position:relative}
-.control-simplelist.is-sortable li.placeholder:before{top:-10px;position:absolute;content:'';display:block;width:0;height:0;border-top:4.5px solid transparent;border-bottom:4.5px solid transparent;border-left:5px solid #999999}
-.control-simplelist.is-sortable li.dragged{position:absolute;opacity:0.5;filter:alpha(opacity=50);z-index:2000;color:#e67e22;width:auto !important}
-.control-simplelist.is-scrollable{height:200px}
-.control-simplelist.is-scrollable.size-tiny{min-height:250px}
-.control-simplelist.is-scrollable.size-small{min-height:300px}
-.control-simplelist.is-scrollable.size-large{min-height:400px}
-.control-simplelist.is-scrollable.size-huge{min-height:450px}
-.control-simplelist.is-scrollable.size-giant{min-height:550px}
-.control-simplelist.is-divided,.control-simplelist.is-selectable,.control-simplelist.is-selectable-box{padding:0}
-.control-simplelist.is-divided li .heading,.control-simplelist.is-selectable li .heading,.control-simplelist.is-selectable-box li .heading{font-size:14px;font-weight:500}
-.control-simplelist.is-divided li,.control-simplelist.is-selectable li{padding:5px 10px;border-bottom:1px solid #d4d8da}
-.control-simplelist.is-divided li:last-child,.control-simplelist.is-selectable li:last-child{border-bottom:none}
-.control-simplelist.is-selectable li a{padding:5px 10px;margin:-5px -10px;display:block;color:#333333}
-.control-simplelist.is-selectable li:hover{background:#4ea5e0;cursor:pointer}
-.control-simplelist.is-selectable li:hover,.control-simplelist.is-selectable li:hover a{color:white}
-.control-simplelist.is-selectable li:hover a{text-decoration:none}
-.control-simplelist.is-selectable li.active a{background:#f0f0f0}
-.control-simplelist.is-selectable li.active a:hover{background:#4ea5e0}
-.control-simplelist.is-selectable-box{padding-top:15px;margin-bottom:0}
-.control-simplelist.is-selectable-box li{width:155px;margin:8px;display:inline-block;text-align:center;vertical-align:top}
-.control-simplelist.is-selectable-box li a{text-decoration:none;display:block;color:#333333}
-.control-simplelist.is-selectable-box li a .box{display:block;width:155px;height:155px;border:3px solid rgba(0,0,0,0.1);position:relative;-webkit-transition:border 0.3s ease;transition:border 0.3s ease}
-.control-simplelist.is-selectable-box li a .image{display:block;width:56px;height:56px;position:absolute;top:50%;left:50%;margin-top:-28px;margin-left:-28px}
-.control-simplelist.is-selectable-box li a .image > i{font-size:56px;color:rgba(0,0,0,0.25)}
-.control-simplelist.is-selectable-box li a .heading{margin:7px 0;padding:0}
-.control-simplelist.is-selectable-box li a .description{font-size:12px}
-.control-simplelist.is-selectable-box li a:hover .box{border-color:rgba(0,0,0,0.2)}
-.control-simplelist.is-selectable-box li a:hover .image > i{color:rgba(0,0,0,0.45)}
-.list-preview .control-simplelist.is-selectable ul{margin-bottom:0}
-.drag-noselect{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
-.control-scrollbar{position:relative;overflow:hidden;height:100%;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}
-.control-scrollbar > div{-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}
-.control-scrollbar > .scrollbar-scrollbar{position:absolute;z-index:100}
-.control-scrollbar > .scrollbar-scrollbar .scrollbar-track{background-color:transparent;position:relative;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}
-.control-scrollbar > .scrollbar-scrollbar .scrollbar-track .scrollbar-thumb{background-color:rgba(0,0,0,0.35);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;cursor:pointer;overflow:hidden;position:absolute}
-.control-scrollbar > .scrollbar-scrollbar.disabled{display:none !important}
-.control-scrollbar.vertical > .scrollbar-scrollbar{right:0;margin-right:5px;width:6px}
-.control-scrollbar.vertical > .scrollbar-scrollbar .scrollbar-track{height:100%;width:6px}
-.control-scrollbar.vertical > .scrollbar-scrollbar .scrollbar-track .scrollbar-thumb{height:20px;width:6px;top:0;left:0}
-.control-scrollbar.vertical > .scrollbar-scrollbar:active,.control-scrollbar.vertical > .scrollbar-scrollbar:hover{width:8px;-webkit-transition:width 0.3s;transition:width 0.3s}
-.control-scrollbar.vertical > .scrollbar-scrollbar:active .scrollbar-track,.control-scrollbar.vertical > .scrollbar-scrollbar:hover .scrollbar-track,.control-scrollbar.vertical > .scrollbar-scrollbar:active .scrollbar-thumb,.control-scrollbar.vertical > .scrollbar-scrollbar:hover .scrollbar-thumb{width:8px;-webkit-transition:width 0.3s;transition:width 0.3s}
-.control-scrollbar.horizontal > .scrollbar-scrollbar{margin:0 0 5px;clear:both;height:6px}
-.control-scrollbar.horizontal > .scrollbar-scrollbar .scrollbar-track{width:100%;height:6px}
-.control-scrollbar.horizontal > .scrollbar-scrollbar .scrollbar-track .scrollbar-thumb{height:6px;margin:2px 0;left:0;top:0}
-.control-scrollbar.horizontal > .scrollbar-scrollbar:active,.control-scrollbar.horizontal > .scrollbar-scrollbar:hover{height:8px;-webkit-transition:height 0.3s;transition:height 0.3s}
-.control-scrollbar.horizontal > .scrollbar-scrollbar:active .scrollbar-track,.control-scrollbar.horizontal > .scrollbar-scrollbar:hover .scrollbar-track,.control-scrollbar.horizontal > .scrollbar-scrollbar:active .scrollbar-thumb,.control-scrollbar.horizontal > .scrollbar-scrollbar:hover .scrollbar-thumb{height:8px;-webkit-transition:height 0.3s;transition:height 0.3s}
-html.mobile .control-scrollbar{overflow:auto;-webkit-overflow-scrolling:touch}
-.no-touch .control-scrollbar > .scrollbar-scrollbar{opacity:0;-webkit-transition:opacity 0.3s;transition:opacity 0.3s}
-.no-touch .control-scrollbar:active > .scrollbar-scrollbar,.no-touch .control-scrollbar:hover > .scrollbar-scrollbar{opacity:1}
-@media (max-width:768px){.responsive-sidebar > .layout-cell:last-child .control-scrollbar{overflow:visible;height:auto}
-.responsive-sidebar > .layout-cell:last-child .control-scrollbar .scrollbar-scrollbar{display:none !important}
-}
-.control-filelist p.no-data{padding:22px 0;margin:0;color:#666666;font-size:14px;text-align:center;font-weight:normal;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
-.control-filelist ul{padding:0;margin:0}
-.control-filelist ul li{font-weight:normal;line-height:150%;position:relative;list-style:none}
-.control-filelist ul li a:hover{background:#dddddd}
-.control-filelist ul li.active > a{background:#dddddd;position:relative}
-.control-filelist ul li.active > a:after{position:absolute;height:100%;width:4px;left:0;top:0;background:#e67e22;display:block;content:' '}
-.control-filelist ul li a{display:block;padding:10px 45px 10px 20px;outline:none}
-.control-filelist ul li a:hover,.control-filelist ul li a:focus,.control-filelist ul li a:active{text-decoration:none}
-.control-filelist ul li a span{display:block}
-.control-filelist ul li a span.title{font-weight:normal;color:#405261;font-size:14px}
-.control-filelist ul li a span.description{color:#8f8f8f;font-size:12px;white-space:nowrap;font-weight:normal;overflow:hidden;text-overflow:ellipsis}
-.control-filelist ul li a span.description strong{color:#405261;font-weight:normal}
-.control-filelist ul li.group > h4,.control-filelist ul li.group > div.group > h4{font-weight:normal;font-size:14px;margin-top:0;margin-bottom:0;position:relative}
-.control-filelist ul li.group > h4 a,.control-filelist ul li.group > div.group > h4 a{padding:10px 20px 10px 53px;color:#405261;position:relative;outline:none}
-.control-filelist ul li.group > h4 a:hover,.control-filelist ul li.group > div.group > h4 a:hover{background:transparent}
-.control-filelist ul li.group > h4 a:before,.control-filelist ul li.group > div.group > h4 a:before,.control-filelist ul li.group > h4 a:after,.control-filelist ul li.group > div.group > h4 a:after{width:10px;height:10px;display:block;position:absolute;top:1px}
-.control-filelist ul li.group > h4 a:after,.control-filelist ul li.group > div.group > h4 a:after{left:33px;top:9px;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f07b";color:#a1aab1;font-size:16px}
-.control-filelist ul li.group > h4 a:before,.control-filelist ul li.group > div.group > h4 a:before{left:20px;top:9px;color:#cfcfcf;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f0da";-webkit-transform:rotate(90deg) translate(5px,0);-ms-transform:rotate(90deg) translate(5px,0);transform:rotate(90deg) translate(5px,0);-webkit-transition:all 0.1s ease;transition:all 0.1s ease}
-.control-filelist ul li.group > ul > li > a{padding-left:52px}
-.control-filelist ul li.group > ul > li.group{padding-left:20px}
-.control-filelist ul li.group > ul > li.group > ul > li > a{padding-left:324px;margin-left:-270px}
-.control-filelist ul li.group > ul > li.group > ul > li.group > ul > li > a{padding-left:297px;margin-left:-243px}
-.control-filelist ul li.group > ul > li.group > ul > li.group > ul > li.group > ul > li > a{padding-left:270px;margin-left:-216px}
-.control-filelist ul li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li > a{padding-left:243px;margin-left:-189px}
-.control-filelist ul li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li > a{padding-left:216px;margin-left:-162px}
-.control-filelist ul li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li > a{padding-left:189px;margin-left:-135px}
-.control-filelist ul li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li > a{padding-left:162px;margin-left:-108px}
-.control-filelist ul li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li > a{padding-left:135px;margin-left:-81px}
-.control-filelist ul li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li > a{padding-left:108px;margin-left:-54px}
-.control-filelist ul li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li.group > ul > li > a{padding-left:81px;margin-left:-27px}
-.control-filelist ul li.group[data-status=collapsed] > h4 a:before,.control-filelist ul li.group[data-status=collapsed] > div.group > h4 a:before{-webkit-transform:rotate(0deg) translate(3px,0);-ms-transform:rotate(0deg) translate(3px,0);transform:rotate(0deg) translate(3px,0)}
-.control-filelist ul li.group[data-status=collapsed] > ul,.control-filelist ul li.group[data-status=collapsed] > div.subitems{display:none}
-.control-filelist ul li > div.controls{position:absolute;right:19px;top:6px}
-.control-filelist ul li > div.controls .dropdown{width:14px;height:21px}
-.control-filelist ul li > div.controls .dropdown.open a.control{display:block !important}
-.control-filelist ul li > div.controls .dropdown.open a.control:before{visibility:visible;display:block}
-.control-filelist ul li > div.controls a.control{color:#405261;font-size:14px;visibility:hidden;overflow:hidden;width:14px;height:21px;display:none;text-decoration:none;cursor:pointer;padding:0;opacity:0.5;filter:alpha(opacity=50)}
-.control-filelist ul li > div.controls a.control:before{visibility:visible;display:block;margin-right:0}
-.control-filelist ul li > div.controls a.control:hover{opacity:1;filter:alpha(opacity=100)}
-.control-filelist ul li:hover > div.controls,.control-filelist ul li:hover > a.control{display:block !important}
-.control-filelist ul li:hover > div.controls > a.control,.control-filelist ul li:hover > a.control > a.control{display:block !important}
-.control-filelist ul li .checkbox{position:absolute;top:-5px;right:0}
-.control-filelist ul li .checkbox label{margin-right:0}
-.control-filelist ul li .checkbox label:before{border-color:#cccccc}
-.control-filelist.single-line ul li a span.title{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}
-.control-filelist.filelist-hero ul li{background:#ffffff;border-bottom:none}
-.control-filelist.filelist-hero ul li > a{padding:11px 45px 10px 50px;font-size:13px;border-bottom:1px solid #ecf0f1}
-.control-filelist.filelist-hero ul li > a span.title{font-size:14px;font-weight:normal;color:#2b3e50}
-.control-filelist.filelist-hero ul li > a span.description{font-size:13px}
-.control-filelist.filelist-hero ul li > a .list-icon{position:absolute;left:14px;top:15px;font-size:22px;color:#b7c0c2}
-.control-filelist.filelist-hero ul li > a:hover{background:#4ea5e0;border-bottom:1px solid #4ea5e0 !important}
-.control-filelist.filelist-hero ul li > a:hover span.title,.control-filelist.filelist-hero ul li > a:hover span.description{color:#ffffff !important}
-.control-filelist.filelist-hero ul li > a:hover .list-icon{color:#ffffff !important}
-.control-filelist.filelist-hero ul li > a:active{background:#3498db;border-bottom:1px solid #3498db !important}
-.control-filelist.filelist-hero ul li > a:active span.title,.control-filelist.filelist-hero ul li > a:active span.description{color:#ffffff !important}
-.control-filelist.filelist-hero ul li > a:active .list-icon{color:#ffffff !important}
-.control-filelist.filelist-hero ul li .checkbox{top:-2px;right:0}
-.control-filelist.filelist-hero ul li.active > a{border-bottom:1px solid #dddddd}
-.control-filelist.filelist-hero ul li.active > a:after{top:-1px;bottom:-1px;height:auto}
-.control-filelist.filelist-hero ul li.active > a > span.borders:before{content:' ';position:absolute;width:100%;height:1px;display:block;left:0;background-color:#dddddd}
-.control-filelist.filelist-hero ul li.active > a > span.borders:before{top:-1px}
-.control-filelist.filelist-hero ul li.active > a:hover > span.borders:before{background-color:#4ea5e0}
-.control-filelist.filelist-hero ul li.active > a:active > span.borders:before{background-color:#3498db}
-.control-filelist.filelist-hero ul li > h4{padding-top:7px;padding-bottom:6px;border-bottom:1px solid #ecf0f1}
-.control-filelist.filelist-hero ul li > div.controls{display:none;position:absolute;right:16px;top:15px}
-.control-filelist.filelist-hero ul li > div.controls > a.control{width:16px;height:23px;background:transparent;overflow:hidden;display:inline-block;color:#ffffff !important;padding:0}
-.control-filelist.filelist-hero ul li > div.controls > a.control:before{font-size:17px}
-.control-filelist.filelist-hero ul li:hover > div.controls{display:block}
-.control-filelist.filelist-hero ul li.separator{position:relative;border-bottom:1px solid #95a5a6;padding:12px 15px 13px 15px}
-.control-filelist.filelist-hero ul li.separator:before{z-index:31;content:'';display:block;width:0;height:0;border-left:9.5px solid transparent;border-right:9.5px solid transparent;border-top:11px solid #ffffff;border-bottom-width:0;position:absolute;left:13px;bottom:-8px}
-.control-filelist.filelist-hero ul li.separator:after{z-index:30;content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-top:9px solid #95a5a6;border-bottom-width:0;position:absolute;left:14px;bottom:-9px}
-.control-filelist.filelist-hero ul li.separator h5{color:#2b3e50;font-size:14px;margin:0;font-weight:normal;padding:0}
-.control-filelist.filelist-hero ul > li.group > ul > li > a{padding-left:66px}
-.control-filelist.filelist-hero.single-level ul li:hover{background:#4ea5e0}
-.control-filelist.filelist-hero.single-level ul li:hover > a{background:#4ea5e0;border-bottom:1px solid #4ea5e0 !important}
-.control-filelist.filelist-hero.single-level ul li:hover > a span.title,.control-filelist.filelist-hero.single-level ul li:hover > a span.description{color:#ffffff !important}
-.control-filelist.filelist-hero.single-level ul li:hover > a .list-icon{color:#ffffff !important}
-.control-filelist.filelist-hero.single-level ul li:active{background:#3498db}
-.control-filelist.filelist-hero.single-level ul li:active > a{background:#3498db;border-bottom:1px solid #3498db !important}
-.control-filelist.filelist-hero.single-level ul li:active > a span.title,.control-filelist.filelist-hero.single-level ul li:active > a span.description{color:#ffffff !important}
-.control-filelist.filelist-hero.single-level ul li:active > a .list-icon{color:#ffffff !important}
-.touch .control-filelist li:not(.active) a:hover{background:transparent}
-.control-scrollpanel{position:relative;background:#ecf0f1}
-.control-scrollpanel .control-scrollbar.vertical > .scrollbar-scrollbar{right:0}
-.tooltip .tooltip-inner{text-align:left;padding:5px 8px}
-.tooltip.in{opacity:1;filter:alpha(opacity=100)}
-.oc-logo-white{background-image:url(../images/october-logo-white.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:contain}
-.oc-logo{background-image:url(../images/october-logo.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:contain}
-.layout.control-tabs.oc-logo-transparent:not(.has-tabs),.flex-layout-column.oc-logo-transparent:not(.has-tabs),.layout-cell.oc-logo-transparent{background-size:50% auto;background-repeat:no-repeat;background-image:url(../images/october-logo.svg);background-position:50% 50%;position:relative}
-.layout.control-tabs.oc-logo-transparent:not(.has-tabs):after,.flex-layout-column.oc-logo-transparent:not(.has-tabs):after,.layout-cell.oc-logo-transparent:after{content:'';display:table-cell;position:absolute;left:0;top:0;height:100%;width:100%;background:rgba(249,249,249,0.7)}
-.report-widget{padding:15px;background:white;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;font-size:13px}
-.report-widget h3{font-size:14px;color:#7e8c8d;text-transform:uppercase;font-weight:600;margin-top:0;margin-bottom:30px}
-.report-widget .height-100{height:100px}
-.report-widget .height-200{height:200px}
-.report-widget .height-300{height:300px}
-.report-widget .height-400{height:400px}
-.report-widget .height-500{height:500px}
-.report-widget p.report-description{margin-bottom:0;margin-top:15px;font-size:12px;line-height:190%;color:#7e8c8d}
-.report-widget a:not(.btn){color:#7e8c8d;text-decoration:none}
-.report-widget a:not(.btn):hover{color:#0181b9;text-decoration:none}
-.report-widget p.flash-message.static{margin-bottom:0}
-.report-widget .icon-circle.success{color:#31ac5f}
-.report-widget .icon-circle.primary{color:#34495e}
-.report-widget .icon-circle.warning{color:#f0ad4e}
-.report-widget .icon-circle.danger{color:#ab2a1c}
-.report-widget .icon-circle.info{color:#5bc0de}
-.control-treelist ol{padding:0;margin:0;list-style:none}
-.control-treelist ol ol{margin:0;margin-left:15px;padding-left:15px;border-left:1px solid #dbdee0}
-.control-treelist > ol > li > div.record:before{display:none}
-.control-treelist li{margin:0;padding:0}
-.control-treelist li > div.record{margin:0;font-size:12px;margin-bottom:5px;position:relative;display:block}
-.control-treelist li > div.record:before{color:#bdc3c7;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f111";font-size:6px;position:absolute;left:-18px;top:11px}
-.control-treelist li > div.record > a.move{display:inline-block;padding:7px 0 7px 10px;text-decoration:none;color:#bdc3c7}
-.control-treelist li > div.record > a.move:hover{color:#4ea5e0}
-.control-treelist li > div.record > a.move:before{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f0c9"}
-.control-treelist li > div.record > span{color:#666666;display:inline-block;padding:7px 15px 7px 5px}
-.control-treelist li.dragged{position:absolute;z-index:2000;width:auto !important;height:auto !important}
-.control-treelist li.dragged > div.record{opacity:0.5;filter:alpha(opacity=50);background:#4ea5e0 !important}
-.control-treelist li.dragged > div.record > a.move:before,.control-treelist li.dragged > div.record > span{color:white}
-.control-treelist li.dragged > div.record:before{display:none}
-.control-treelist li.placeholder{display:inline-block;position:relative;background:#4ea5e0 !important;height:25px;margin-bottom:5px}
-.control-treelist li.placeholder:before{display:block;position:absolute;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f053";color:#d35714;left:-10px;top:8px;z-index:2000}
-.control-treeview{margin-bottom:40px; }
-.control-treeview ol{margin:0;padding:0;list-style:none;background:#ffffff}
-.control-treeview ol > li{-webkit-transition:width 1s;transition:width 1s}
-.control-treeview ol > li > div{font-size:14px;font-weight:normal;background:#ffffff;border-bottom:1px solid #ecf0f1;position:relative}
-.control-treeview ol > li > div > a{color:#2b3e50;padding:11px 45px 10px 61px;display:block;line-height:150%;text-decoration:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}
-.control-treeview ol > li > div:before{content:' ';background-image:url(../images/treeview-icons.png);background-position:0px -28px;background-repeat:no-repeat;background-size:42px auto;position:absolute;width:21px;height:22px;left:28px;top:15px}
-.control-treeview ol > li > div span.comment{display:block;font-weight:400;color:#95a5a6;font-size:13px;margin-top:2px;overflow:hidden;text-overflow:ellipsis}
-.control-treeview ol > li > div > span.expand{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;display:none;position:absolute;width:20px;height:20px;top:19px;left:2px;cursor:pointer;color:#bdc3c7;-webkit-transition:transform 0.1s ease;transition:transform 0.1s ease}
-.control-treeview ol > li > div > span.expand:before{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f0da";line-height:100%;font-size:15px;position:relative;left:8px;top:2px}
-.control-treeview ol > li > div > span.drag-handle{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;-webkit-transition:opacity 0.4s;transition:opacity 0.4s;position:absolute;right:9px;bottom:0;width:18px;height:19px;cursor:move;color:#bdc3c7;opacity:0;filter:alpha(opacity=0)}
-.control-treeview ol > li > div > span.drag-handle:before{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f0c9";font-size:18px}
-.control-treeview ol > li > div span.borders{font-size:0}
-.control-treeview ol > li > div > ul.submenu{position:absolute;left:20px;bottom:-37px;padding:0;list-style:none;z-index:200;height:37px;display:none;margin-left:15px;background:transparent url(../images/treeview-submenu-tabs.png) repeat-x left -39px}
-.control-treeview ol > li > div > ul.submenu:before,.control-treeview ol > li > div > ul.submenu:after{background:transparent url(../images/treeview-submenu-tabs.png) no-repeat left top;content:' ';display:block;width:20px;height:37px;position:absolute;top:0}
-.control-treeview ol > li > div > ul.submenu:before{left:-20px}
-.control-treeview ol > li > div > ul.submenu:after{background-position:-100px top;right:-20px}
-.control-treeview ol > li > div > ul.submenu li{font-size:12px}
-.control-treeview ol > li > div > ul.submenu li a{display:block;padding:4px 3px 0 3px;color:#ffffff;text-decoration:none;outline:none}
-.control-treeview ol > li > div > ul.submenu li a i{margin-right:5px}
-.control-treeview ol > li > div:hover > ul.submenu{display:block}
-.control-treeview ol > li > div:active > ul.submenu{background-position:left -116px}
-.control-treeview ol > li > div:active > ul.submenu:before{background-position:left -77px}
-.control-treeview ol > li > div:active > ul.submenu:after{background-position:-100px -77px}
-.control-treeview ol > li > div .checkbox{position:absolute;top:-2px;right:0}
-.control-treeview ol > li > div .checkbox label{margin-right:0}
-.control-treeview ol > li > div .checkbox label:before{border-color:#cccccc}
-.control-treeview ol > li > div.popover-highlight{background-color:#4ea5e0 !important}
-.control-treeview ol > li > div.popover-highlight:before{background-position:0px -80px}
-.control-treeview ol > li > div.popover-highlight > a{color:#ffffff !important;cursor:default}
-.control-treeview ol > li > div.popover-highlight span{color:#ffffff !important}
-.control-treeview ol > li > div.popover-highlight > ul.submenu,.control-treeview ol > li > div.popover-highlight > span.drag-handle{display:none !important}
-.control-treeview ol > li.dragged div,.control-treeview ol > li > div:hover{background-color:#4ea5e0 !important}
-.control-treeview ol > li.dragged div > a,.control-treeview ol > li > div:hover > a{color:#ffffff !important}
-.control-treeview ol > li.dragged div:before,.control-treeview ol > li > div:hover:before{background-position:0px -80px}
-.control-treeview ol > li.dragged div:after,.control-treeview ol > li > div:hover:after{top:0 !important;bottom:0 !important}
-.control-treeview ol > li.dragged div span,.control-treeview ol > li > div:hover span{color:#ffffff !important}
-.control-treeview ol > li.dragged div span.drag-handle,.control-treeview ol > li > div:hover span.drag-handle{cursor:move;opacity:1;filter:alpha(opacity=100)}
-.control-treeview ol > li.dragged div span.borders,.control-treeview ol > li > div:hover span.borders{display:none}
-.control-treeview ol > li > div:active{background-color:#3498db !important}
-.control-treeview ol > li > div:active > a{color:#ffffff !important}
-.control-treeview ol > li[data-no-drag-mode] div:hover span.drag-handle{cursor:default !important;opacity:0.3 !important;filter:alpha(opacity=30) !important}
-.control-treeview ol > li.dragged li.has-subitems > div:before,.control-treeview ol > li.dragged.has-subitems > div:before{background-position:0px -52px}
-.control-treeview ol > li.dragged div > ul.submenu{display:none !important}
-.control-treeview ol > li > ol{padding-left:20px;padding-right:20px}
-.control-treeview ol > li[data-status=collapsed] > ol{display:none}
-.control-treeview ol > li.has-subitems > div:before{background-position:0 0;width:23px;height:26px;left:26px}
-.control-treeview ol > li.has-subitems > div:hover:before,.control-treeview ol > li.has-subitems > div.popover-highlight:before{background-position:0px -52px}
-.control-treeview ol > li.has-subitems > div span.expand{display:block}
-.control-treeview ol > li.placeholder{position:relative;opacity:0.5;filter:alpha(opacity=50)}
-.control-treeview ol > li.dragged{position:absolute;z-index:2000;opacity:0.25;filter:alpha(opacity=25)}
-.control-treeview ol > li.dragged > div{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
-.control-treeview ol > li.drop-target > div{background-color:#2581b8 !important}
-.control-treeview ol > li.drop-target > div > a{color:#ffffff}
-.control-treeview ol > li.drop-target > div > a > span.comment{color:#ffffff}
-.control-treeview ol > li.drop-target > div:before{background-position:0px -80px}
-.control-treeview ol > li.drop-target.has-subitems > div:before{background-position:0px -52px}
-.control-treeview ol > li[data-status=expanded] > div > span.expand{-webkit-transform:rotate(90deg) translate(0,0);-ms-transform:rotate(90deg) translate(0,0);transform:rotate(90deg) translate(0,0)}
-.control-treeview ol > li.drag-ghost{background-color:transparent;box-sizing:content-box}
-.control-treeview ol > li.active > div{background:#dddddd}
-.control-treeview ol > li.active > div:after{position:absolute;width:4px;left:0;top:-1px;bottom:-1px;background:#e67e22;display:block;content:' '}
-.control-treeview ol > li.active > div > span.comment,.control-treeview ol > li.active > div > span.expand{color:#8f8f8f}
-.control-treeview ol > li.active > div > span.borders:before,.control-treeview ol > li.active > div > span.borders:after{content:' ';position:absolute;width:100%;height:1px;display:block;left:0;background-color:#dddddd}
-.control-treeview ol > li.active > div > span.borders:before{top:-1px}
-.control-treeview ol > li.active > div > span.borders:after{bottom:-1px}
-.control-treeview ol > li.no-data{padding:18px 0;margin:0;color:#666666;font-size:14px;text-align:center;font-weight:400}
-.control-treeview ol > li > ol > li > div{margin-left:-20px;margin-right:-20px;padding-left:71px}
-.control-treeview ol > li > ol > li > div > a{margin-left:-71px;padding-left:71px}
-.control-treeview ol > li > ol > li > div:before{margin-left:10px}
-.control-treeview ol > li > ol > li > div > span.expand{left:12px}
-.control-treeview ol > li > ol > li > ol > li > div{margin-left:-40px;margin-right:-40px;padding-left:81px}
-.control-treeview ol > li > ol > li > ol > li > div > a{margin-left:-81px;padding-left:81px}
-.control-treeview ol > li > ol > li > ol > li > div:before{margin-left:20px}
-.control-treeview ol > li > ol > li > ol > li > div > span.expand{left:22px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > div{margin-left:-60px;margin-right:-60px;padding-left:91px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > div > a{margin-left:-91px;padding-left:91px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > div:before{margin-left:30px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > div > span.expand{left:32px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > div{margin-left:-80px;margin-right:-80px;padding-left:101px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > div > a{margin-left:-101px;padding-left:101px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > div:before{margin-left:40px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > div > span.expand{left:42px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div{margin-left:-100px;margin-right:-100px;padding-left:111px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div > a{margin-left:-111px;padding-left:111px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div:before{margin-left:50px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div > span.expand{left:52px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div{margin-left:-120px;margin-right:-120px;padding-left:121px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div > a{margin-left:-121px;padding-left:121px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div:before{margin-left:60px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div > span.expand{left:62px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div{margin-left:-140px;margin-right:-140px;padding-left:131px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div > a{margin-left:-131px;padding-left:131px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div:before{margin-left:70px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div > span.expand{left:72px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div{margin-left:-160px;margin-right:-160px;padding-left:141px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div > a{margin-left:-141px;padding-left:141px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div:before{margin-left:80px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div > span.expand{left:82px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div{margin-left:-180px;margin-right:-180px;padding-left:151px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div > a{margin-left:-151px;padding-left:151px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div:before{margin-left:90px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div > span.expand{left:92px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div{margin-left:-200px;margin-right:-200px;padding-left:161px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div > a{margin-left:-161px;padding-left:161px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div:before{margin-left:100px}
-.control-treeview ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > ol > li > div > span.expand{left:102px}
-.control-treeview p.no-data{padding:18px 0;margin:0;color:#666666;font-size:14px;text-align:center;font-weight:400}
-.control-treeview a.menu-control{display:block;margin:20px;padding:13px 15px;border:dotted 2px #ebebeb;color:#bdc3c7;font-size:12px;font-weight:600;text-transform:uppercase;border-radius:5px;vertical-align:middle}
-.control-treeview a.menu-control:hover,.control-treeview a.menu-control:focus{text-decoration:none;background-color:#4ea5e0;color:#ffffff;border:none;padding:15px 17px}
-.control-treeview a.menu-control:active{background:#3498db;color:#ffffff}
-.control-treeview a.menu-control i{margin-right:10px;font-size:14px}
-.control-treeview.treeview-light{margin-bottom:0;margin-top:20px}
-.control-treeview.treeview-light ol{background-color:transparent}
-.control-treeview.treeview-light ol > li > div{background-color:transparent;border-bottom:none}
-.control-treeview.treeview-light ol > li > div:before{top:15px}
-.control-treeview.treeview-light ol > li > div > a{padding-top:10px;padding-bottom:10px}
-.control-treeview.treeview-light ol > li > div span.expand{top:19px}
-.control-treeview.treeview-light ol > li > div > span.drag-handle{top:0;right:0;bottom:auto;height:100%;width:60px;background:#2581b8;-webkit-transition:none !important;transition:none !important}
-.control-treeview.treeview-light ol > li > div > span.drag-handle:before{position:absolute;left:50%;top:50%;margin-left:-6px}
-.control-treeview.treeview-light ol > li > div > ul.submenu{right:60px;left:auto;bottom:auto;top:0;height:100%;margin:0;background:transparent;white-space:nowrap;font-size:0}
-.control-treeview.treeview-light ol > li > div > ul.submenu:before,.control-treeview.treeview-light ol > li > div > ul.submenu:after{display:none}
-.control-treeview.treeview-light ol > li > div > ul.submenu li{height:100%;display:inline-block;background:#2581b8;border-right:1px solid #328ec8}
-.control-treeview.treeview-light ol > li > div > ul.submenu li p{display:table;height:100%;padding:0;margin:0}
-.control-treeview.treeview-light ol > li > div > ul.submenu li p a{display:table-cell;vertical-align:middle;height:100%;padding:0 20px;font-size:13px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}
-.control-treeview.treeview-light ol > li > div > ul.submenu li p a i.control-icon{font-size:22px;margin-right:0}
-body.dragging .control-treeview ol.dragging,body.dragging .control-treeview ol.dragging ol{background:#ccc;padding-right:20px;-webkit-transition:padding 1s;transition:padding 1s}
-body.dragging .control-treeview ol.dragging > li > div,body.dragging .control-treeview ol.dragging ol > li > div{margin-right:0;-webkit-transition:margin 1s;transition:margin 1s}
-body.dragging .control-treeview ol.dragging > li > div .custom-checkbox,body.dragging .control-treeview ol.dragging ol > li > div .custom-checkbox{-webkit-transition:opacity 0.5s;transition:opacity 0.5s;opacity:0;filter:alpha(opacity=0)}
-body.dragging .control-treeview.treeview-light ol.dragging > li > div,body.dragging .control-treeview.treeview-light ol.dragging ol > li > div{background-color:#f9f9f9}
-@media only screen and (-moz-min-device-pixel-ratio:1.5),only screen and (-o-min-device-pixel-ratio:3/2),only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-devicepixel-ratio:1.5),only screen and (min-resolution:1.5dppx){.control-treeview ol > li > div:before{background-position:0px -79px;background-size:21px auto}
-.control-treeview ol > li.has-subitems > div:before{background-position:0px -52px}
-.control-treeview ol > li.has-subitems > div:hover:before,.control-treeview ol > li.has-subitems > div.popover-highlight:before{background-position:0px -102px}
-.control-treeview ol > li.dragged > div:before,.control-treeview ol > li.dragged li > div:before,.control-treeview ol > li > div:hover:before,.control-treeview ol > li > div.popover-highlight:before{background-position:0px -129px}
-.control-treeview ol > li.dragged li.has-subitems > div:before,.control-treeview ol > li.dragged.has-subitems > div:before{background-position:0px -102px}
-.control-treeview ol > li.drop-target > div:before{background-position:0px -129px}
-.control-treeview ol > li.drop-target.has-subitems > div:before{background-position:0px -102px}
-}
-.sidenav-tree{width:300px}
-.sidenav-tree .control-toolbar{padding:0}
-.sidenav-tree .control-toolbar .toolbar-item{display:block}
-.sidenav-tree .control-toolbar input.form-control{border:none;outline:none;padding:12px 13px 13px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:inset -3px 0 3px rgba(0,0,0,0.1);box-shadow:inset -3px 0 3px rgba(0,0,0,0.1)}
-.sidenav-tree .control-toolbar input.form-control.search{background-position:right -78px}
-.sidenav-tree ul{padding:0;margin:0;list-style:none}
-.sidenav-tree div.scrollbar-thumb{background:rgba(0,0,0,0.2) !important}
-.sidenav-tree ul.top-level > li[data-status=collapsed] > div.group h3:before{-webkit-transform:rotate(0deg) translate(2px,-2px);-ms-transform:rotate(0deg) translate(2px,-2px);transform:rotate(0deg) translate(2px,-2px)}
-.sidenav-tree ul.top-level > li[data-status=collapsed] > div.group:before,.sidenav-tree ul.top-level > li[data-status=collapsed] > div.group:after{display:none}
-.sidenav-tree ul.top-level > li[data-status=collapsed] ul{display:none}
-.sidenav-tree ul.top-level > li > div.group{position:relative}
-.sidenav-tree ul.top-level > li > div.group h3{background:rgba(0,0,0,0.15);color:#ecf0f1;text-transform:uppercase;font-size:15px;padding:15px 15px 15px 40px;margin:0;position:relative;cursor:pointer;font-weight:400}
-.sidenav-tree ul.top-level > li > div.group h3:before{display:block;position:absolute;width:10px;height:10px;left:16px;top:15px;color:#cfcfcf;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f105";-webkit-transform:rotate(90deg) translate(5px,-3px);-ms-transform:rotate(90deg) translate(5px,-3px);transform:rotate(90deg) translate(5px,-3px);-webkit-transition:all 0.1s ease;transition:all 0.1s ease;font-size:16px}
-.sidenav-tree ul.top-level > li > div.group:before,.sidenav-tree ul.top-level > li > div.group:after{content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid #34495e;border-bottom-width:0;position:absolute;left:15px;bottom:-8px;z-index:101}
-.sidenav-tree ul.top-level > li > div.group:after{content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid rgba(0,0,0,0.15);border-bottom-width:0}
-.sidenav-tree ul.top-level > li > ul li a{display:block;position:relative;padding:18px 25px 18px 55px;background:transparent;border-bottom:1px solid rgba(0,0,0,0.15);color:#ffffff;text-decoration:none !important;opacity:0.65;filter:alpha(opacity=65)}
-.sidenav-tree ul.top-level > li > ul li a:active,.sidenav-tree ul.top-level > li > ul li a:hover{opacity:1;filter:alpha(opacity=100);text-decoration:none}
-.sidenav-tree ul.top-level > li > ul li a i{position:absolute;left:16px;top:18px;font-size:22px}
-.sidenav-tree ul.top-level > li > ul li a span{display:block;line-height:150%}
-.sidenav-tree ul.top-level > li > ul li a span.header{color:#ffffff;font-size:15px;margin-bottom:5px}
-.sidenav-tree ul.top-level > li > ul li a span.description{color:rgba(255,255,255,0.6);font-size:13px}
-.sidenav-tree ul.top-level > li > ul li:hover a,.sidenav-tree ul.top-level > li > ul li.active a{opacity:1;filter:alpha(opacity=100)}
-.sidenav-tree ul.top-level > li > ul li.active{border-left:5px solid #e67e22}
-.sidenav-tree ul.top-level > li > ul li.active a{color:rgba(255,255,255,0.91);padding-right:20px}
-.sidenav-tree ul.top-level > li > ul li.active a span.header{color:#ffffff}
-.sidenav-tree ul.top-level > li > ul li.active a span.description{color:rgba(255,255,255,0.91)}
-.sidenav-tree .back-link{display:none}
-@media (min-width:768px){.sidenav-tree-root .sidenav-tree{width:600px}
-.sidenav-tree-root .sidenav-tree ul.top-level > li > ul{font-size:0;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;align-content:stretch}
-.sidenav-tree-root .sidenav-tree ul.top-level > li > ul > li{display:inline-block;width:300px}
-.sidenav-tree-root .sidenav-tree ul.top-level > li > ul > li a{height:100%}
-}
-@media (min-width:768px) and (max-width:991px){.sidenav-tree-root .sidenav-tree{width:100%}
-.sidenav-tree-root .sidenav-tree ul.top-level > li > ul > li{width:50%}
-}
-@media (min-width:1200px){.sidenav-tree-root .sidenav-tree{width:900px}
-}
-@media (max-width:768px){.sidenav-tree{width:100%;height:auto !important;display:block !important}
-.sidenav-tree > .layout{display:none}
-.sidenav-tree-root .sidenav-tree{width:100% !important;height:100% !important;display:table-cell !important}
-.sidenav-tree-root .sidenav-tree .back-link{display:none !important}
-.sidenav-tree-root .sidenav-tree > .layout{display:table !important}
-.sidenav-tree-root #layout-body{display:none}
-body.has-sidenav-tree .sidenav-tree .back-link{display:block;padding:13px 15px;background:#2b3e50;color:#bdc3c7;font-size:14px;line-height:14px;text-transform:uppercase}
-body.has-sidenav-tree .sidenav-tree .back-link i{display:inline-block;margin-right:10px}
-body.has-sidenav-tree .sidenav-tree .back-link:hover{text-decoration:none}
-body.has-sidenav-tree #layout-body{display:block !important}
-}
-div.panel{padding:20px; }
-div.panel.no-padding{padding:0}
-div.panel.no-padding-bottom{padding-bottom:0}
-div.panel.padding-top{padding-top:20px}
-div.panel.padding-less{padding:15px}
-div.panel.transparent{background:transparent}
-div.panel.border-left{border-left:1px solid #e8eaeb}
-div.panel.border-right{border-right:1px solid #e8eaeb}
-div.panel.border-bottom{border-bottom:1px solid #e8eaeb}
-div.panel.border-top{border-top:1px solid #e8eaeb}
-div.panel.triangle-down{position:relative}
-div.panel.triangle-down:after{content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid #ffffff;border-bottom-width:0;position:absolute;left:15px;bottom:-8px;z-index:101}
-div.panel.triangle-down:before{content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-top:9px solid #e8eaeb;border-bottom-width:0;position:absolute;left:14px;bottom:-9px;z-index:100}
-div.panel h3.section,div.panel > label{text-transform:uppercase;color:#95a5a6;font-size:13px;font-weight:600;margin:0 0 15px 0}
-div.panel > label{margin-bottom:5px}
-.nav.selector-group{font-size:13px;letter-spacing:0.01em;margin-bottom:20px}
-.nav.selector-group li a{padding:7px 20px 7px 23px;color:#95a5a6}
-.nav.selector-group li.active{border-left:3px solid #e6802b;padding-left:0}
-.nav.selector-group li.active a{padding-left:20px;color:#2b3e50}
-.nav.selector-group li i[class^="icon-"]{font-size:17px;margin-right:6px;position:relative;top:1px}
-div.panel .nav.selector-group{margin:0 -20px 20px -20px}
-ul.tree-path{list-style:none;padding:0;margin-bottom:0}
-ul.tree-path li{display:inline-block;margin-right:1px;font-size:13px}
-ul.tree-path li:after{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f105";display:inline-block;font-size:13px;margin-left:5px;position:relative;top:1px;color:#95a5a6}
-ul.tree-path li:last-child a{cursor:default}
-ul.tree-path li:last-child:after{display:none}
-ul.tree-path li.go-up{font-size:12px;margin-right:7px}
-ul.tree-path li.go-up a{color:#95a5a6}
-ul.tree-path li.go-up a:hover{color:#0181b9}
-ul.tree-path li.go-up:after{display:none}
-ul.tree-path li.root a{font-weight:600;color:#405261}
-ul.tree-path li a{color:#95a5a6}
-ul.tree-path li a:hover{text-decoration:none}
-table.name-value-list{border-collapse:collapse;font-size:13px}
-table.name-value-list th,table.name-value-list td{padding:4px 0 4px 0;vertical-align:top}
-table.name-value-list tr:first-child th,table.name-value-list tr:first-child td{padding-top:0}
-table.name-value-list th{font-weight:600;color:#95a5a6;padding-right:15px;text-transform:uppercase}
-table.name-value-list td{color:#2b3e50;word-wrap:break-word}
-.scrollpad-scrollbar-size-tester{width:50px;height:50px;overflow-y:scroll;position:absolute;top:-200px;left:-200px}
-.scrollpad-scrollbar-size-tester div{height:100px}
-.scrollpad-scrollbar-size-tester::-webkit-scrollbar{width:0;height:0}
-div.control-scrollpad{position:relative;width:100%;height:100%;overflow:hidden}
-div.control-scrollpad > div{overflow:hidden;overflow-y:scroll;height:100%}
-div.control-scrollpad > div::-webkit-scrollbar{width:0;height:0}
-div.control-scrollpad[data-direction=horizontal] > div{overflow-x:scroll;overflow-y:hidden;width:100%}
-div.control-scrollpad[data-direction=horizontal] > div::-webkit-scrollbar{width:auto;height:0}
-div.control-scrollpad > .scrollpad-scrollbar{z-index:199;position:absolute;top:0;right:0;bottom:0;width:11px;background-color:transparent;opacity:0;overflow:hidden;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-transition:opacity 0.3s;transition:opacity 0.3s}
-div.control-scrollpad > .scrollpad-scrollbar .drag-handle{position:absolute;right:2px;min-height:10px;width:7px;background-color:rgba(0,0,0,0.35);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}
-div.control-scrollpad > .scrollpad-scrollbar:hover{opacity:0.7;filter:alpha(opacity=70);-webkit-transition:opacity 0 linear;transition:opacity 0 linear}
-div.control-scrollpad > .scrollpad-scrollbar[data-visible]{opacity:0.7;filter:alpha(opacity=70)}
-div.control-scrollpad > .scrollpad-scrollbar[data-hidden]{display:none}
-div.control-scrollpad[data-direction=horizontal] > .scrollpad-scrollbar{top:auto;left:0;width:auto;height:11px}
-div.control-scrollpad[data-direction=horizontal] > .scrollpad-scrollbar .drag-handle{right:auto;top:2px;height:7px;min-height:0;min-width:10px;width:auto}
-.svg-icon-container img.svg-icon{display:none}
-.svg-icon-container.svg-active-effects img.svg-icon{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:0.6;filter:alpha(opacity=60)}
-.svg-icon-container.svg-active-effects:hover img.svg-icon,.svg-icon-container.svg-active-effects.active img.svg-icon{-webkit-filter:none;filter:none;opacity:1;filter:alpha(opacity=100)}
-html.svg .svg-icon-container i.svg-replace{display:none}
-@-webkit-keyframes fadeIn{0%{opacity:0}
-100%{opacity:1}
-}
-@keyframes fadeIn{0%{opacity:0}
-100%{opacity:1}
-}
-.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}
-@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}
-100%{opacity:1;-webkit-transform:none;transform:none}
-}
-@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}
-100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}
-}
-.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}
-@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}
-100%{opacity:1;-webkit-transform:none;transform:none}
-}
-@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}
-100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}
-}
-.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}
-@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}
-100%{opacity:1;-webkit-transform:none;transform:none}
-}
-@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}
-100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}
-}
-.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}
-@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}
-100%{opacity:1;-webkit-transform:none;transform:none}
-}
-@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}
-100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}
-}
-.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}
-@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}
-100%{opacity:1;-webkit-transform:none;transform:none}
-}
-@-webkit-keyframes fadeOut{0%{opacity:1}
-100%{opacity:0}
-}
-@keyframes fadeOut{0%{opacity:1}
-100%{opacity:0}
-}
-.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}
-@-webkit-keyframes fadeOutDown{0%{opacity:1}
-100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}
-}
-@keyframes fadeOutDown{0%{opacity:1}
-100%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}
-}
-.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}
-@-webkit-keyframes fadeOutLeft{0%{opacity:1}
-100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}
-}
-@keyframes fadeOutLeft{0%{opacity:1}
-100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}
-}
-.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}
-@-webkit-keyframes fadeOutRight{0%{opacity:1}
-100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}
-}
-@keyframes fadeOutRight{0%{opacity:1}
-100%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}
-}
-.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}
-@-webkit-keyframes fadeOutUp{0%{opacity:1}
-100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}
-}
-@keyframes fadeOutUp{0%{opacity:1}
-100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}
-}
-.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}
-html:not(.mobile) body.drag *{cursor:drag !important;cursor:-webkit-grab !important;cursor:-moz-grab !important}
-body.dragging,body.dragging *{cursor:move !important}
-body.loading,body.loading *{cursor:wait !important}
-body.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default !important}
-html,body{height:100%; }
-body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";background:#f9f9f9;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
-#layout-canvas{min-height:100%;height:100%}
-.control-tabs.primary-tabs > ul.nav-tabs,.control-tabs.primary-tabs > div > ul.nav-tabs,.control-tabs.primary-tabs > div > div > ul.nav-tabs{margin-left:-20px;margin-right:-20px}
-.control-tabs.primary-tabs.tabs-no-inset > ul.nav-tabs,.control-tabs.primary-tabs.tabs-no-inset > div > ul.nav-tabs,.control-tabs.primary-tabs.tabs-no-inset > div > div > ul.nav-tabs{margin-left:0;margin-right:0}
-.layout{display:table;table-layout:fixed;height:100%;width:100%}
-.layout > .layout-row{display:table-row;vertical-align:top;height:100%}
-.layout > .layout-row > .layout-cell{display:table-cell;vertical-align:top;height:100%}
-.layout > .layout-row > .layout-cell.layout-container,.layout > .layout-row > .layout-cell .layout-container,.layout > .layout-row > .layout-cell.padded-container,.layout > .layout-row > .layout-cell .padded-container{padding:20px 20px 0 20px}
-.layout > .layout-row > .layout-cell.layout-container .container-flush,.layout > .layout-row > .layout-cell .layout-container .container-flush,.layout > .layout-row > .layout-cell.padded-container .container-flush,.layout > .layout-row > .layout-cell .padded-container .container-flush{padding-top:0}
-.layout > .layout-row > .layout-cell .layout-relative{position:relative;height:100%}
-.layout > .layout-row > .layout-cell .layout-absolute{position:absolute;height:100%;width:100%}
-.layout > .layout-row > .layout-cell.min-size{width:0}
-.layout > .layout-row > .layout-cell.min-height{height:0}
-.layout > .layout-row > .layout-cell.center{text-align:center}
-.layout > .layout-row > .layout-cell.middle{vertical-align:middle}
-.layout > .layout-row > .layout-cell.layout-container,.layout > .layout-row > .layout-cell .layout-container,.layout > .layout-row > .layout-cell.padded-container,.layout > .layout-row > .layout-cell .padded-container{padding:20px 20px 0 20px}
-.layout > .layout-row > .layout-cell.layout-container .container-flush,.layout > .layout-row > .layout-cell .layout-container .container-flush,.layout > .layout-row > .layout-cell.padded-container .container-flush,.layout > .layout-row > .layout-cell .padded-container .container-flush{padding-top:0}
-.layout > .layout-row > .layout-cell .layout-relative{position:relative;height:100%}
-.layout > .layout-row > .layout-cell .layout-absolute{position:absolute;height:100%;width:100%}
-.layout > .layout-row > .layout-cell.min-size{width:0}
-.layout > .layout-row > .layout-cell.min-height{height:0}
-.layout > .layout-row > .layout-cell.center{text-align:center}
-.layout > .layout-row > .layout-cell.middle{vertical-align:middle}
-.layout > .layout-row.min-size{height:0}
-.layout > .layout-cell{display:table-cell;vertical-align:top;height:100%}
-.layout > .layout-cell.layout-container,.layout > .layout-cell .layout-container,.layout > .layout-cell.padded-container,.layout > .layout-cell .padded-container{padding:20px 20px 0 20px}
-.layout > .layout-cell.layout-container .container-flush,.layout > .layout-cell .layout-container .container-flush,.layout > .layout-cell.padded-container .container-flush,.layout > .layout-cell .padded-container .container-flush{padding-top:0}
-.layout > .layout-cell .layout-relative{position:relative;height:100%}
-.layout > .layout-cell .layout-absolute{position:absolute;height:100%;width:100%}
-.layout > .layout-cell.min-size{width:0}
-.layout > .layout-cell.min-height{height:0}
-.layout > .layout-cell.center{text-align:center}
-.layout > .layout-cell.middle{vertical-align:middle}
-.whiteboard{background:white}
-.layout-fill-container{position:absolute;left:0;top:0;width:100%;height:100%}
-[data-calculate-width] > form,[data-calculate-width] > div{display:inline-block}
-body.compact-container .layout.layout-container,body.compact-container .layout .layout-container{padding:0 !important}
-body.slim-container .layout.layout-container,body.slim-container .layout .layout-container{padding-left:0 !important;padding-right:0 !important}
-@media (max-width:768px){.layout .hide-on-small{display:none}
-.layout.responsive-sidebar > .layout-cell:first-child{display:table-footer-group;height:auto}
-.layout.responsive-sidebar > .layout-cell:first-child .control-breadcrumb{display:none}
-.layout.responsive-sidebar > .layout-cell:last-child{display:table-header-group;width:auto;height:auto}
-.layout.responsive-sidebar > .layout-cell:last-child .layout-absolute{position:static}
-}
-.flex-layout-column{display:-webkit-box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:-ms-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}
-.flex-layout-column.full-height-strict{height:100%}
-.flex-layout-column.absolute{position:absolute !important}
-.flex-layout-column.fill-container{position:absolute;left:0;top:0;width:100%;height:100%}
-.flex-layout-row{display:-webkit-box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:-ms-flex;display:flex;-webkit-flex-direction:row;-moz-flex-direction:row;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}
-.flex-layout-column.justify-center,.flex-layout-row.justify-center{-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-webkit-box-pack:center;justify-content:center}
-.flex-layout-column.align-center,.flex-layout-row.align-center{-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;align-items:center;-webkit-align-content:center;-moz-align-content:center;-webkit-box-align:center;-ms-align-content:center;align-content:center}
-.flex-layout-column.full-height,.flex-layout-row.full-height{min-height:100%}
-.flex-layout-item{margin:0}
-.flex-layout-item.fix{-webkit-box-flex:0;-webkit-flex:0 0 auto;-moz-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}
-.flex-layout-item.stretch{-webkit-box-flex:1;-webkit-flex:1 1 auto;-moz-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}
-.flex-layout-item.stretch-constrain{-webkit-box-flex:1;-webkit-flex:1;-moz-flex:1;-ms-flex:1;flex:1}
-.flex-layout-item.center{-webkit-align-self:center;-moz-align-self:center;-ms-align-self:center;align-self:center}
-.flex-layout-item.relative{position:relative}
-.flex-layout-item.layout-container{max-width:none}
-body.mainmenu-open{overflow:hidden;position:fixed}
-.mainmenu-tooltip .tooltip-inner{font-size:13px;padding:6px 16px}
-nav#layout-mainmenu{background-color:#000000;padding:0 0 0 20px;line-height:0;white-space:nowrap;vertical-align:top}
-nav#layout-mainmenu a{text-decoration:none}
-nav#layout-mainmenu a:focus{background:transparent}
-nav#layout-mainmenu ul{margin:0;padding:0;list-style:none;float:left;white-space:nowrap;overflow:hidden}
-nav#layout-mainmenu ul li{color:rgba(255,255,255,0.6);display:inline-block;vertical-align:top;position:relative;margin-right:30px}
-nav#layout-mainmenu ul li a{display:inline-block;font-size:14px;color:inherit;outline:none;padding:14px 0 10px}
-nav#layout-mainmenu ul li a:hover{background-color:transparent}
-nav#layout-mainmenu ul li a:active,nav#layout-mainmenu ul li a:focus{text-decoration:none;color:rgba(255,255,255,0.6)}
-nav#layout-mainmenu ul li a i{line-height:1;font-size:30px;vertical-align:middle}
-nav#layout-mainmenu ul li a img.svg-icon{height:30px;width:30px;margin-right:10px;position:relative;top:0}
-nav#layout-mainmenu ul.nav{display:inline-block}
-nav#layout-mainmenu .toolbar-item{padding-right:0}
-nav#layout-mainmenu .toolbar-item:before,nav#layout-mainmenu .toolbar-item:after{margin-top:0}
-nav#layout-mainmenu .toolbar-item:before{left:-12px}
-nav#layout-mainmenu .toolbar-item:after{right:-12px}
-nav#layout-mainmenu .toolbar-item.scroll-active-before:before{color:#ffffff}
-nav#layout-mainmenu .toolbar-item.scroll-active-after:after{color:#ffffff}
-nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-preview{margin:0 0 0 21px}
-nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-preview i{font-size:20px}
-nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-preview a{position:relative;padding:0 10px;top:-1px}
-nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account{margin-right:0}
-nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account > a{padding:0 15px 0 10px;font-size:13px;position:relative}
-nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account.highlight > a{z-index:600}
-nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account img.account-avatar{width:45px}
-nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account .account-name{margin-right:15px}
-nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account ul{line-height:23px}
-html.svg nav#layout-mainmenu img.svg-icon,html.svg .mainmenu-collapsed img.svg-icon{display:inline-block}
-nav#layout-mainmenu ul li .mainmenu-accountmenu{position:fixed;top:0;right:20px;background:#f9f9f9;z-index:600;display:none;-webkit-box-shadow:0 1px 6px rgba(0,0,0,0.12),0 1px 4px rgba(0,0,0,0.24);box-shadow:0 1px 6px rgba(0,0,0,0.12),0 1px 4px rgba(0,0,0,0.24);border-radius:3px}
-nav#layout-mainmenu ul li .mainmenu-accountmenu.active{display:block}
-nav#layout-mainmenu ul li .mainmenu-accountmenu:after{content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-bottom:7px solid #f9f9f9;right:9px;top:-7px;position:absolute}
-nav#layout-mainmenu ul li .mainmenu-accountmenu ul{float:none;display:block;overflow:visible}
-nav#layout-mainmenu ul li .mainmenu-accountmenu li{padding:0;margin:0;font-weight:normal;text-align:left;display:block}
-nav#layout-mainmenu ul li .mainmenu-accountmenu li a{display:block;padding:10px 30px;text-align:left;font-size:14px;color:#666666}
-nav#layout-mainmenu ul li .mainmenu-accountmenu li a:hover,nav#layout-mainmenu ul li .mainmenu-accountmenu li a:focus{background:#4ea5e0;color:#ffffff}
-nav#layout-mainmenu ul li .mainmenu-accountmenu li a:active{background:#3498db;color:#ffffff}
-nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:hover:after,nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:focus:after,nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:active:after{content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-bottom:7px solid #4ea5e0;position:absolute;right:9px;top:-7px;z-index:102}
-nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:active:after{content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-bottom:7px solid #3498db}
-nav#layout-mainmenu ul li .mainmenu-accountmenu li.divider{height:1px;width:100%;background-color:#e0e0e0}
-nav#layout-mainmenu.navbar-mode-inline{height:60px}
-nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-preview a{height:60px;line-height:60px}
-nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-account > a{height:60px;line-height:60px}
-nav#layout-mainmenu.navbar-mode-inline ul li .mainmenu-accountmenu{top:70px}
-nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li{margin:5px 0}
-nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a{padding:10px 15px}
-nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a .nav-icon{position:relative;top:-1px;margin-right:5px;width:30px;height:30px}
-nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a .nav-icon i,nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a .nav-icon img{margin:0}
-nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a .nav-label{line-height:30px}
-nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li:first-child{margin-left:-13px}
-nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li:last-child{margin-right:0}
-nav#layout-mainmenu.navbar-mode-tile{height:78px}
-nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-preview a{height:78px;line-height:78px}
-nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-account > a{height:78px;line-height:78px}
-nav#layout-mainmenu.navbar-mode-tile ul li .mainmenu-accountmenu{top:88px}
-nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a{position:relative;width:65px;height:65px}
-nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a .nav-icon{text-align:center;display:block;position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-26.5px;width:30px;height:30px}
-nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a .nav-icon i,nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a .nav-icon img{margin:0}
-nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a .nav-label{display:block;width:100px;height:20px;line-height:20px;position:absolute;bottom:4px;left:50%;padding:0 5px;margin-left:-50px;overflow:hidden;text-overflow:ellipsis;text-align:center}
-nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li{padding:0 15px;margin:7px 0 0}
-nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li:first-child{margin-left:-7px}
-nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li:hover .nav-label{width:auto;min-width:100px;text-overflow:all;overflow:visible;z-index:2}
-nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li.active:first-child{margin-left:0}
-nav#layout-mainmenu .menu-toggle{height:45px;line-height:45px;font-size:16px;display:none}
-nav#layout-mainmenu .menu-toggle .menu-toggle-icon{background:#333;display:inline-block;height:45px;line-height:45px;width:45px;text-align:center;opacity:.7}
-nav#layout-mainmenu .menu-toggle .menu-toggle-icon i{line-height:45px;font-size:20px;vertical-align:bottom}
-nav#layout-mainmenu .menu-toggle .menu-toggle-title{margin-left:10px}
-nav#layout-mainmenu .menu-toggle:hover .menu-toggle-icon{opacity:1}
-body.mainmenu-open nav#layout-mainmenu .menu-toggle-icon{opacity:1}
-nav#layout-mainmenu.navbar-mode-collapse{padding-left:0;height:45px}
-nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-preview a{height:45px;line-height:45px}
-nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-account > a{height:45px;line-height:45px}
-nav#layout-mainmenu.navbar-mode-collapse ul li .mainmenu-accountmenu{top:55px}
-nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-account > a{padding-right:0}
-nav#layout-mainmenu.navbar-mode-collapse ul li .mainmenu-accountmenu:after{right:13px}
-nav#layout-mainmenu.navbar-mode-collapse ul.nav{display:none}
-nav#layout-mainmenu.navbar-mode-collapse .menu-toggle{display:inline-block;color:#ffffff !important}
-@media (max-width:769px){nav#layout-mainmenu.navbar{padding-left:0;height:45px}
-nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-preview a{height:45px;line-height:45px}
-nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account > a{height:45px;line-height:45px}
-nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu{top:55px}
-nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account > a{padding-right:0}
-nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu:after{right:13px}
-nav#layout-mainmenu.navbar ul.nav{display:none}
-nav#layout-mainmenu.navbar .menu-toggle{display:inline-block;color:#ffffff !important}
-}
-.mainmenu-collapsed{position:absolute;height:100%;top:0;left:0;margin:0;background:#000000}
-.mainmenu-collapsed > div{display:block;height:100%}
-.mainmenu-collapsed > div ul.mainmenu-nav li a{position:relative;width:65px;height:65px}
-.mainmenu-collapsed > div ul.mainmenu-nav li a .nav-icon{text-align:center;display:block;position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-26.5px;width:30px;height:30px}
-.mainmenu-collapsed > div ul.mainmenu-nav li a .nav-icon i,.mainmenu-collapsed > div ul.mainmenu-nav li a .nav-icon img{margin:0}
-.mainmenu-collapsed > div ul.mainmenu-nav li a .nav-label{display:block;width:100px;height:20px;line-height:20px;position:absolute;bottom:4px;left:50%;padding:0 5px;margin-left:-50px;overflow:hidden;text-overflow:ellipsis;text-align:center}
-.mainmenu-collapsed > div ul.mainmenu-nav li{padding:0 15px;margin:7px 0 0}
-.mainmenu-collapsed > div ul.mainmenu-nav li:first-child{margin-left:-7px}
-.mainmenu-collapsed > div ul.mainmenu-nav li:hover .nav-label{width:auto;min-width:100px;text-overflow:all;overflow:visible;z-index:2}
-.mainmenu-collapsed > div ul.mainmenu-nav li.active:first-child{margin-left:0}
-.mainmenu-collapsed > div ul.mainmenu-nav li:first-child{margin-left:0}
-.mainmenu-collapsed > div ul{margin:0;padding:5px 0 15px 15px;overflow:hidden}
-.mainmenu-collapsed > div ul li{color:rgba(255,255,255,0.6);display:inline-block;vertical-align:top;position:relative;margin-right:30px}
-.mainmenu-collapsed > div ul li a{display:inline-block;font-size:14px;color:inherit;outline:none}
-.mainmenu-collapsed > div ul li a:hover{background-color:transparent}
-.mainmenu-collapsed > div ul li a:active,.mainmenu-collapsed > div ul li a:focus{text-decoration:none;color:rgba(255,255,255,0.6)}
-.mainmenu-collapsed > div ul li a i{line-height:1;font-size:30px;vertical-align:middle}
-.mainmenu-collapsed > div ul li a img.svg-icon{height:30px;width:30px;position:relative;top:0}
-.mainmenu-collapsed .scroll-marker{position:absolute;left:0;width:100%;height:10px;display:none}
-.mainmenu-collapsed .scroll-marker:after{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f141";display:block;position:absolute;left:50%;margin-left:-3px;top:0;height:9px;font-size:10px;color:rgba(255,255,255,0.6)}
-.mainmenu-collapsed .scroll-marker.before{top:0}
-.mainmenu-collapsed .scroll-marker.after{bottom:3px}
-.mainmenu-collapsed .scroll-marker.after:after{top:2px}
-.mainmenu-collapsed.scroll-before .scroll-marker.before{display:block}
-.mainmenu-collapsed.scroll-after .scroll-marker.after{display:block}
-body.mainmenu-open .mainmenu-collapsed ul{position:absolute;left:0;top:10px;bottom:10px}
-html.mobile .mainmenu-collapsed ul{overflow:auto;-webkit-overflow-scrolling:touch}
-nav#layout-mainmenu.navbar ul li:hover a:active,.mainmenu-collapsed li:hover a:active,nav#layout-mainmenu.navbar ul li:hover a:focus,.mainmenu-collapsed li:hover a:focus{color:#ffffff !important}
-.touch .mainmenu-collapsed li a:hover{color:rgba(255,255,255,0.6)}
-nav#layout-mainmenu.navbar ul li.highlight > a,.mainmenu-collapsed li.highlight > a{color:#ffffff !important}
-nav#layout-mainmenu.navbar ul li.active,.mainmenu-collapsed li.active{color:#ffffff !important}
-nav#layout-mainmenu.navbar ul li.active a,.mainmenu-collapsed li.active a{color:#ffffff !important}
-nav#layout-mainmenu.navbar ul li:hover,.mainmenu-collapsed li:hover{color:#ffffff;background:transparent}
-body.drag nav#layout-mainmenu.navbar ul.nav li:hover,body.drag .mainmenu-collapsed ul li:hover{color:rgba(255,255,255,0.6)}
-.layout-sidenav-container{width:120px}
-#layout-sidenav{position:absolute;height:100%;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:14px}
-#layout-sidenav ul{position:relative;margin:0;padding:0;height:100%;overflow:hidden}
-#layout-sidenav ul li{display:block;text-align:center;position:relative}
-#layout-sidenav ul li a{padding:1.429em .714em;display:block;font-size:.929em;color:rgba(255,255,255,0.6);font-weight:normal;position:relative}
-#layout-sidenav ul li a:hover{text-decoration:none;background-color:transparent}
-#layout-sidenav ul li a:focus{background:transparent}
-#layout-sidenav ul li a i{color:rgba(255,255,255,0.6);display:block;margin-bottom:5px;font-size:2em}
-#layout-sidenav ul li:first-child a{padding-top:2.143em}
-#layout-sidenav ul li.active a,#layout-sidenav ul li a:hover{color:#ffffff}
-#layout-sidenav ul li.active a i,#layout-sidenav ul li a:hover i{color:#ffffff}
-#layout-sidenav ul li span.counter{display:block;position:absolute;top:1.071em;right:1.071em;padding:.143em .429em .214em .286em;background-color:#d9350f;color:#ffffff;font-size:.786em;line-height:100%;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;opacity:1;filter:alpha(opacity=100);-webkit-transform:scale(1,);-ms-transform:scale(1,);transform:scale(1,);-webkit-transition:all 0.3s;transition:all 0.3s}
-#layout-sidenav ul li span.counter.empty{opacity:0;filter:alpha(opacity=0);-webkit-transform:scale(0,);-ms-transform:scale(0,);transform:scale(0,)}
-@media (min-width:768px) and (max-width:991px){#layout-sidenav{font-size:12px}
-.layout-sidenav-container{width:100px}
-}
-@media (max-width:767px){#layout-sidenav{font-size:10px}
-.layout-sidenav-container{width:80px}
-}
-html.mobile #layout-sidenav ul{overflow:auto;-webkit-overflow-scrolling:touch}
-#layout-sidenav.layout-sidenav ul.drag li:not(.active) a:hover,.touch #layout-sidenav.layout-sidenav li:not(.active) a:hover{color:rgba(255,255,255,0.6) !important}
-#layout-sidenav.layout-sidenav ul.drag li:not(.active) a:hover i,.touch #layout-sidenav.layout-sidenav li:not(.active) a:hover i{color:rgba(255,255,255,0.6) !important}
-#layout-sidenav.layout-sidenav ul.drag li:not(.active) a:hover:after,.touch #layout-sidenav.layout-sidenav li:not(.active) a:hover:after{display:none !important}
-#layout-side-panel .fix-button{position:absolute;right:-25px;top:0;display:none;width:25px;height:25px;font-size:13px;background:#ecf0f1;z-index:120;opacity:0.5;filter:alpha(opacity=50);-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}
-#layout-side-panel .fix-button i{display:block;text-align:center;margin-top:5px;color:#aaaaaa}
-#layout-side-panel .fix-button:hover{text-decoration:none;display:block;opacity:1 !important;filter:alpha(opacity=100) !important}
-#layout-side-panel:hover .fix-button{display:block}
-#layout-side-panel .fix-button-content-header .fix-button{top:46px}
-#layout-side-panel .sidepanel-content-header{background:#d35400;color:white;font-size:15px;padding:12px 20px 13px;position:relative}
-#layout-side-panel .sidepanel-content-header:after{content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid #d35400;border-bottom-width:0;position:absolute;left:14px;bottom:-8px}
-body.side-panel-not-fixed #layout-side-panel{display:none}
-body.side-panel-not-fixed #layout-side-panel .fix-button{opacity:0.5;filter:alpha(opacity=50)}
-body.display-side-panel #layout-side-panel{display:block;position:absolute;z-index:600;width:350px;-webkit-box-shadow:3px 0px 3px 0 rgba(0,0,0,0.1);box-shadow:3px 0px 3px 0 rgba(0,0,0,0.1)}
-@media (min-width:992px){body.side-panel-fix-shadow #layout-side-panel{-webkit-box-shadow:none;box-shadow:none}
-}
-.touch #layout-side-panel .fix-button{display:none}
-@media (max-width:768px){#layout-side-panel .fix-button{display:none}
-}
-#layout-footer{width:100%;z-index:100;height:60px;position:fixed;bottom:0;color:#666666;background-color:rgba(255,255,255,0.8);border-top:1px solid #dfdfdf}
-#layout-footer .brand,#layout-footer .tagline{margin:10px;height:40px;line-height:40px}
-#layout-footer .brand{float:left;font-size:16px}
-#layout-footer .brand .logo{margin:0 10px}
-#layout-footer .tagline{float:right}
-#layout-footer .tagline p{color:#999999}
-body.outer{background:#2b3e50}
-body.outer .layout > .layout-row.layout-head{text-align:center;background:#f9f9f9}
-body.outer .layout > .layout-row.layout-head > .layout-cell{height:40%;padding:50px 0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;vertical-align:middle;position:relative}
-body.outer .layout > .layout-row.layout-head > .layout-cell:after{content:'';display:block;width:0;height:0;border-left:28px solid transparent;border-right:28px solid transparent;border-top:20px solid #f9f9f9;border-bottom-width:0;position:absolute;bottom:-20px;left:50%;margin-left:-28px}
-body.outer .layout > .layout-row.layout-head > .layout-cell h1.oc-logo{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;display:inline-block;width:100%;max-width:450px;height:170px;min-height:72px}
-body.outer .layout > .layout-row > .layout-cell{vertical-align:top}
-body.outer .layout > .layout-row > .layout-cell .outer-form-container{margin:0 auto;width:436px;padding:40px 0}
-body.outer .layout > .layout-row > .layout-cell .outer-form-container h2{font-size:18px;margin:20px 0;color:#feffff}
-body.outer .layout > .layout-row > .layout-cell .outer-form-container .horizontal-form{font-size:0;display:-webkit-box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:-ms-flex;display:flex}
-body.outer .layout > .layout-row > .layout-cell .outer-form-container .horizontal-form input{vertical-align:top;margin-right:9px;display:inline-block;border:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}
-body.outer .layout > .layout-row > .layout-cell .outer-form-container .horizontal-form button{background:#0181b9;text-align:center;font-size:13px;font-weight:600;height:40px;vertical-align:top;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}
-body.outer .layout > .layout-row > .layout-cell .outer-form-container .remember label{color:rgba(255,255,255,0.44)}
-body.outer .layout > .layout-row > .layout-cell .outer-form-container .forgot-password{margin-top:30px;font-size:13px;top:8px}
-body.outer .layout > .layout-row > .layout-cell .outer-form-container .forgot-password a{color:rgba(255,255,255,0.44)}
-body.outer .layout > .layout-row > .layout-cell .outer-form-container .forgot-password:before{color:rgba(255,255,255,0.44);font-size:14px;position:relative;margin-right:5px}
-html.csstransitions body.outer .outer-form-container{-webkit-transition:all 0.5s ease-out;transition:all 0.5s ease-out;-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1)}
-html.csstransitions body.outer.preload .outer-form-container{-webkit-transform:scale(0.2,0.2);-moz-transform:scale(0.2,0.2);-ms-transform:scale(0.2,0.2);-o-transform:scale(0.2,0.2);transform:scale(0.2,0.2)}
-@media (max-width:768px){body.outer .layout > .layout-row.layout-head > .layout-cell{padding:50px 20px}
-body.outer .layout > .layout-row > .layout-cell .outer-form-container{width:auto;padding:40px}
-body.outer .layout > .layout-row > .layout-cell .outer-form-container .horizontal-form{display:block}
-body.outer .layout > .layout-row > .layout-cell .outer-form-container .horizontal-form input{display:block;width:100% !important;margin-bottom:20px}
-}
-body.breadcrumb-fancy .control-breadcrumb,.control-breadcrumb.breadcrumb-fancy{margin-bottom:0;background-color:#e67e22}
-body.breadcrumb-fancy .control-breadcrumb li,.control-breadcrumb.breadcrumb-fancy li{background-color:#d35400;color:rgba(255,255,255,0.5)}
-body.breadcrumb-fancy .control-breadcrumb li a,.control-breadcrumb.breadcrumb-fancy li a{opacity:.5;-webkit-transition:all 0.3s ease;transition:all 0.3s ease}
-body.breadcrumb-fancy .control-breadcrumb li a:hover,.control-breadcrumb.breadcrumb-fancy li a:hover{opacity:1}
-body.breadcrumb-fancy .control-breadcrumb li:before,.control-breadcrumb.breadcrumb-fancy li:before{border-left-color:#ffffff;opacity:.5}
-body.breadcrumb-fancy .control-breadcrumb li:after,.control-breadcrumb.breadcrumb-fancy li:after{border-left-color:#d35400}
-body.breadcrumb-fancy .control-breadcrumb li:last-child,.control-breadcrumb.breadcrumb-fancy li:last-child{background-color:#d35400}
-body.breadcrumb-fancy .control-breadcrumb li:last-child:before,.control-breadcrumb.breadcrumb-fancy li:last-child:before{opacity:1;border-left-color:#d35400}
-.fancy-layout .tab-collapse-icon{position:absolute;display:block;text-decoration:none;outline:none;opacity:0.6;filter:alpha(opacity=60);-webkit-transition:all 0.3s;transition:all 0.3s;font-size:12px;color:#ffffff;right:11px}
-.fancy-layout .tab-collapse-icon:hover{text-decoration:none;opacity:1;filter:alpha(opacity=100)}
-.fancy-layout .tab-collapse-icon.primary{color:#475354;bottom:-25px;z-index:100;-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}
-.fancy-layout .tab-collapse-icon.primary i{position:relative;display:block}
-.fancy-layout .control-tabs.master-tabs,.fancy-layout.control-tabs.master-tabs{overflow:hidden}
-.fancy-layout .control-tabs.master-tabs:before,.fancy-layout.control-tabs.master-tabs:before,.fancy-layout .control-tabs.master-tabs:after,.fancy-layout.control-tabs.master-tabs:after{top:13px;font-size:14px;color:rgba(255,255,255,0.35)}
-.fancy-layout .control-tabs.master-tabs:before,.fancy-layout.control-tabs.master-tabs:before{left:8px}
-.fancy-layout .control-tabs.master-tabs:after,.fancy-layout.control-tabs.master-tabs:after{right:8px}
-.fancy-layout .control-tabs.master-tabs.scroll-before:before,.fancy-layout.control-tabs.master-tabs.scroll-before:before{color:#ffffff}
-.fancy-layout .control-tabs.master-tabs.scroll-after:after,.fancy-layout.control-tabs.master-tabs.scroll-after:after{color:#ffffff}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container{background:#d35400;padding-left:20px;padding-right:20px}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs{margin-left:-8px}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li{margin-left:-5px;top:1px;padding-top:3px}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li span.tab-close,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li span.tab-close{top:14px;right:-3px;left:auto;z-index:110;font-family:sans-serif}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li span.tab-close i,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li span.tab-close i{top:4px;right:1px;color:rgba(255,255,255,0.3) !important;font-style:normal;font-weight:bold;font-size:16px}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li span.tab-close i:hover,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li span.tab-close i:hover{color:#ffffff !important}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a{border-bottom:none;background:transparent;font-size:14px;color:rgba(255,255,255,0.35);padding:6px 0 0 24px!important;overflow:visible}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a > span.title,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a > span.title{position:relative;display:inline-block;padding:12px 5px 0 5px;height:38px;font-size:14px;z-index:100;background-color:#b9530f}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a > span.title:before,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a > span.title:before,.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a > span.title:after,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a > span.title:after{content:' ';position:absolute;width:20px;display:block;height:37px;top:0;z-index:100;background-color:#b9530f}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a > span.title:before,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a > span.title:before{left:-14px;-webkit-border-radius:8px 0 0 0;-moz-border-radius:8px 0 0 0;border-radius:8px 0 0 0;-webkit-transform:skewX(-20deg);-ms-transform:skewX(-20deg);transform:skewX(-20deg)}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a > span.title:after,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a > span.title:after{right:-14px;-webkit-border-radius:0 8px 0 0;-moz-border-radius:0 8px 0 0;border-radius:0 8px 0 0;-webkit-transform:skewX(20deg);-ms-transform:skewX(20deg);transform:skewX(20deg)}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a > span.title span,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a > span.title span{border-top:none;padding:0;margin-top:0;overflow:visible}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a:before,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a:before{z-index:110;position:absolute;top:18px;left:22px}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a[class*=icon] > span.title,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li a[class*=icon] > span.title{padding-left:18px}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active a,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active a{z-index:107;color:#ffffff}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active span.tab-close i,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active span.tab-close i{color:#ffffff}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active a > span.title,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active a > span.title{background-color:#e67e22;z-index:105}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active a > span.title:before,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active a > span.title:before{z-index:107;background-color:#e67e22}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active a > span.title:after,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active a > span.title:after{background-color:#e67e22;z-index:107}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li[data-modified] span.tab-close i,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li[data-modified] span.tab-close i{top:5px;font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li[data-modified] span.tab-close i:before,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li[data-modified] span.tab-close i:before{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f111";font-size:9px}
-.fancy-layout .control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li:first-child,.fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li:first-child{margin-left:0}
-.fancy-layout .control-tabs.master-tabs[data-closable] > div > div.tabs-container > ul.nav-tabs > li a > span.title,.fancy-layout.control-tabs.master-tabs[data-closable] > div > div.tabs-container > ul.nav-tabs > li a > span.title{padding-right:10px}
-.fancy-layout .control-tabs.master-tabs.has-tabs:before,.fancy-layout.control-tabs.master-tabs.has-tabs:before,.fancy-layout .control-tabs.master-tabs.has-tabs:after,.fancy-layout.control-tabs.master-tabs.has-tabs:after{display:block}
-.fancy-layout .control-tabs.secondary-tabs:before,.fancy-layout.control-tabs.secondary-tabs:before{left:5px}
-.fancy-layout .control-tabs.secondary-tabs:after,.fancy-layout.control-tabs.secondary-tabs:after{right:5px}
-.fancy-layout .control-tabs.secondary-tabs > div > ul.nav-tabs,.fancy-layout.control-tabs.secondary-tabs > div > ul.nav-tabs{background:#475354}
-.fancy-layout .control-tabs.secondary-tabs > div > ul.nav-tabs > li,.fancy-layout.control-tabs.secondary-tabs > div > ul.nav-tabs > li{border-right:none;padding-right:0;margin-right:0}
-.fancy-layout .control-tabs.secondary-tabs > div > ul.nav-tabs > li a,.fancy-layout.control-tabs.secondary-tabs > div > ul.nav-tabs > li a{background:transparent;border:none;padding:12px 10px 13px 10px;font-size:14px;font-weight:normal;line-height:14px;color:#919898}
-.fancy-layout .control-tabs.secondary-tabs > div > ul.nav-tabs > li a span span,.fancy-layout.control-tabs.secondary-tabs > div > ul.nav-tabs > li a span span{overflow:visible;border-top:none;margin-top:0;padding-top:0}
-.fancy-layout .control-tabs.secondary-tabs > div > ul.nav-tabs > li:first-child,.fancy-layout.control-tabs.secondary-tabs > div > ul.nav-tabs > li:first-child{padding-left:15px}
-.fancy-layout .control-tabs.secondary-tabs > div > ul.nav-tabs > li.active a,.fancy-layout.control-tabs.secondary-tabs > div > ul.nav-tabs > li.active a{color:#ffffff}
-.fancy-layout .control-tabs.secondary-tabs .tab-collapse-icon,.fancy-layout.control-tabs.secondary-tabs .tab-collapse-icon{position:absolute;display:block;text-decoration:none;outline:none;opacity:0.6;filter:alpha(opacity=60);-webkit-transition:all 0.3s;transition:all 0.3s;font-size:12px;color:#ffffff;right:11px}
-.fancy-layout .control-tabs.secondary-tabs .tab-collapse-icon:hover,.fancy-layout.control-tabs.secondary-tabs .tab-collapse-icon:hover{text-decoration:none;opacity:1;filter:alpha(opacity=100)}
-.fancy-layout .control-tabs.secondary-tabs .tab-collapse-icon.primary,.fancy-layout.control-tabs.secondary-tabs .tab-collapse-icon.primary{color:#475354;bottom:-25px;z-index:100;-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}
-.fancy-layout .control-tabs.secondary-tabs .tab-collapse-icon.primary i,.fancy-layout.control-tabs.secondary-tabs .tab-collapse-icon.primary i{position:relative;display:block}
-.fancy-layout .control-tabs.secondary-tabs .tab-collapse-icon.primary,.fancy-layout.control-tabs.secondary-tabs .tab-collapse-icon.primary{color:#ffffff;top:12px;right:11px;bottom:auto}
-.fancy-layout .control-tabs.secondary-tabs.primary-collapsed .tab-collapse-icon.primary,.fancy-layout.control-tabs.secondary-tabs.primary-collapsed .tab-collapse-icon.primary{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1)}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs{background:#f9f9f9}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li{margin-left:-19px}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li:first-child,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li:first-child{margin-left:0;padding-left:8px}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a{padding:8px 16px 0 16px;font-weight:400;height:36px;color:#2b3e50;opacity:0.6;filter:alpha(opacity=60)}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a > span.title,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a > span.title{position:relative;display:inline-block;padding:8px 5px 9px 5px;font-size:14px;z-index:100;height:27px !important;background-color:transparent}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a > span.title:before,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a > span.title:before,.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a > span.title:after,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a > span.title:after{content:' ';position:absolute;background-color:white;width:15px;height:28px;top:0;z-index:100;display:none}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a > span.title:before,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a > span.title:before{left:-11px;-webkit-border-radius:8px 0 0 0;-moz-border-radius:8px 0 0 0;border-radius:8px 0 0 0;-webkit-transform:skewX(-20deg);-ms-transform:skewX(-20deg);transform:skewX(-20deg)}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a > span.title:after,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a > span.title:after{right:-11px;-webkit-border-radius:0 8px 0 0;-moz-border-radius:0 8px 0 0;border-radius:0 8px 0 0;-webkit-transform:skewX(20deg);-ms-transform:skewX(20deg);transform:skewX(20deg)}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a > span.title span,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li a > span.title span{height:18px;font-size:14px}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li.active a,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li.active a{opacity:1;filter:alpha(opacity=100)}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li.active a > span.title,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li.active a > span.title{background-color:white}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li.active a > span.title:before,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li.active a > span.title:before,.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li.active a > span.title:after,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs > div > ul.nav-tabs > li.active a > span.title:after{display:block}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs .tab-collapse-icon.primary,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs .tab-collapse-icon.primary{color:#808c8d}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed .tab-collapse-icon.primary,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed .tab-collapse-icon.primary{color:white}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed > div > ul.nav-tabs,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed > div > ul.nav-tabs{background:#e67e22}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed > div > ul.nav-tabs > li a,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed > div > ul.nav-tabs > li a{color:white}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed > div > ul.nav-tabs > li a > span.title:before,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed > div > ul.nav-tabs > li a > span.title:before,.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed > div > ul.nav-tabs > li a > span.title:after,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed > div > ul.nav-tabs > li a > span.title:after{background-color:white}
-.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed > div > ul.nav-tabs > li.active a,.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed > div > ul.nav-tabs > li.active a{color:#2b3e50}
-.fancy-layout .control-tabs.primary-tabs.master-area > div > ul.nav-tabs,.fancy-layout.control-tabs.primary-tabs.master-area > div > ul.nav-tabs{-webkit-transition:background-color 0.5s;transition:background-color 0.5s;background:#e67e22}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs{background:#7f8c8d;margin-left:0 !important;margin-right:0 !important}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs:before,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs:before{display:none}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li{background:transparent;border-right:none;margin-right:-8px}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li:first-child,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li:first-child{margin-left:-5px}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li a,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li a{background:transparent;border:none;padding:12px 16px 0px;font-size:14px;font-weight:400;color:#95a5a6}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title{background:#d5d9d8;border-top:none;padding:5px 5px 3px 5px}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title:before,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title:before,.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title:after,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title:after{background:#d5d9d8;border-width:0;top:0}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title:before,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title:before{left:-20px}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title:after,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title:after{right:-20px}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title span,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title span{border-width:0;vertical-align:top}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li.active a,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li.active a{color:#808c8d}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li.active a:before,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li.active a:before{display:none}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li.active a span.title,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li.active a span.title{background:#fafafa}
-.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li.active a span.title:before,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li.active a span.title:before,.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li.active a span.title:after,.fancy-layout.control-tabs.primary-tabs > div > ul.nav-tabs > li.active a span.title:after{background:#fafafa}
-.fancy-layout .control-tabs.primary-tabs > .tab-content > .tab-pane,.fancy-layout.control-tabs.primary-tabs > .tab-content > .tab-pane{padding:20px 20px 0 20px}
-.fancy-layout .control-tabs.primary-tabs > .tab-content > .tab-pane.pane-compact,.fancy-layout.control-tabs.primary-tabs > .tab-content > .tab-pane.pane-compact{padding:0}
-.fancy-layout .control-tabs.primary-tabs.collapsed,.fancy-layout.control-tabs.primary-tabs.collapsed{display:none}
-.fancy-layout .control-tabs.has-tabs > div.tab-content,.fancy-layout.control-tabs.has-tabs > div.tab-content{background:#f9f9f9}
-.fancy-layout .control-tabs > div.tab-content > div.tab-pane,.fancy-layout.control-tabs > div.tab-content > div.tab-pane{padding:0}
-.fancy-layout .control-tabs > div.tab-content > div.tab-pane.padded-pane,.fancy-layout.control-tabs > div.tab-content > div.tab-pane.padded-pane{padding:20px 20px 0 20px}
-.fancy-layout .form-tabless-fields{position:relative;background:#e67e22;padding:18px 23px 0 23px;-webkit-transition:all 0.5s;transition:all 0.5s}
-.fancy-layout .form-tabless-fields:before,.fancy-layout .form-tabless-fields:after{content:" ";display:table}
-.fancy-layout .form-tabless-fields:after{clear:both}
-.fancy-layout .form-tabless-fields label{text-transform:uppercase;color:rgba(255,255,255,0.5);margin-bottom:0}
-.fancy-layout .form-tabless-fields input[type=text]{background:transparent;border:none;color:#ffffff;font-size:35px;font-weight:100;height:auto;padding:0;-webkit-box-shadow:none;box-shadow:none}
-.fancy-layout .form-tabless-fields input[type=text]::-moz-placeholder{color:rgba(255,255,255,0.5);opacity:1}
-.fancy-layout .form-tabless-fields input[type=text]:-ms-input-placeholder{color:rgba(255,255,255,0.5)}
-.fancy-layout .form-tabless-fields input[type=text]::-webkit-input-placeholder{color:rgba(255,255,255,0.5)}
-.fancy-layout .form-tabless-fields input[type=text]:focus,.fancy-layout .form-tabless-fields input[type=text]:hover{background-color:rgba(255,255,255,0.1)}
-.fancy-layout .form-tabless-fields .form-group{padding-bottom:0}
-.fancy-layout .form-tabless-fields .form-group.is-required > label:after{display:none}
-.fancy-layout .form-tabless-fields .tab-collapse-icon{position:absolute;display:block;text-decoration:none;outline:none;opacity:0.6;filter:alpha(opacity=60);-webkit-transition:all 0.3s;transition:all 0.3s;font-size:12px;color:#ffffff;right:11px}
-.fancy-layout .form-tabless-fields .tab-collapse-icon:hover{text-decoration:none;opacity:1;filter:alpha(opacity=100)}
-.fancy-layout .form-tabless-fields .tab-collapse-icon.primary{color:#475354;bottom:-25px;z-index:100;-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}
-.fancy-layout .form-tabless-fields .tab-collapse-icon.primary i{position:relative;display:block}
-.fancy-layout .form-tabless-fields .tab-collapse-icon.tabless{top:14px}
-.fancy-layout .form-tabless-fields.collapsed{padding:5px 23px 0 10px}
-.fancy-layout .form-tabless-fields.collapsed .tab-collapse-icon.tabless{-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}
-.fancy-layout .form-tabless-fields.collapsed .form-group:not(.collapse-visible){display:none}
-.fancy-layout .form-tabless-fields.collapsed .form-buttons{margin-left:10px;padding-bottom:0}
-.fancy-layout .form-tabless-fields .loading-indicator-container .loading-indicator{background-color:#e67e22;padding:0 0 0 30px;color:rgba(255,255,255,0.5);margin-top:1px;height:90%;font-size:12px;line-height:100%}
-.fancy-layout .form-tabless-fields .loading-indicator-container .loading-indicator > span{left:-10px;top:18px}
-.fancy-layout .form-buttons{-webkit-transition:all 0.5s;transition:all 0.5s;padding-top:14px;padding-bottom:5px}
-.fancy-layout .form-buttons .btn{padding:0;margin-right:5px;margin-top:-6px;margin-right:30px;background:transparent;color:#ffffff;font-weight:normal;-webkit-box-shadow:none;box-shadow:none;opacity:0.5;filter:alpha(opacity=50);-webkit-transition:all 0.3s ease;transition:all 0.3s ease}
-.fancy-layout .form-buttons .btn:hover{opacity:1;filter:alpha(opacity=100)}
-.fancy-layout .form-buttons .btn:last-child{margin-right:0}
-.fancy-layout .form-buttons .btn[class^="oc-icon-"]:before,.fancy-layout .form-buttons .btn[class*=" oc-icon-"]:before{opacity:1}
-.fancy-layout form.oc-data-changed .btn.save{opacity:1;filter:alpha(opacity=100)}
-.fancy-layout .field-codeeditor{border:none !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
-.fancy-layout .field-codeeditor .editor-code{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
-.fancy-layout .field-richeditor{border:none;border-left:1px solid #d1d6d9 !important}
-.fancy-layout .field-richeditor,.fancy-layout .field-richeditor .fr-toolbar,.fancy-layout .field-richeditor .fr-wrapper{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-top-right-radius:0;border-top-left-radius:0}
-.fancy-layout .secondary-content-tabs .field-richeditor .fr-toolbar{background:white}
-body.side-panel-not-fixed .fancy-layout .field-richeditor{border-left:none}
-html.cssanimations .fancy-layout .form-tabless-fields .loading-indicator-container .loading-indicator > span{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite;background-image:url('../../../system/assets/ui/images/loader-white.svg');background-size:20px 20px}
-html.gecko .fancy-layout .control-tabs.secondary-tabs > div > ul.nav-tabs > li.active a{padding-top:13px}
-.flyout-container > .flyout{overflow:hidden;width:0;left:0 !important;-webkit-transition:width 0.1s;transition:width 0.1s}
-.flyout-overlay{width:100%;height:100%;top:0;z-index:5000;position:absolute;background-color:rgba(0,0,0,0);-webkit-transition:background-color 0.3s;transition:background-color 0.3s}
-.flyout-toggle{position:absolute;top:20px;left:0;width:23px;height:25px;background:#2b3e50;cursor:pointer;border-bottom-right-radius:4px;border-top-right-radius:4px;color:#bdc3c7;font-size:10px}
-.flyout-toggle i{margin:7px 0 0 6px;display:inline-block}
-.flyout-toggle:hover i{color:#ffffff}
-body.flyout-visible{overflow:hidden}
-body.flyout-visible .flyout-overlay{background-color:rgba(0,0,0,0.3)}
\ No newline at end of file
+@import "../vendor/jcrop/css/jquery.Jcrop.min.css";
+@import "../../../system/assets/vendor/prettify/prettify.css";
+@import "../../../system/assets/vendor/prettify/theme-desert.css";
+@-webkit-keyframes showSweetAlert {0% {transform:scale(0.7);-webkit-transform:scale(0.7) }45% {transform:scale(1.05);-webkit-transform:scale(1.05) }80% {transform:scale(0.95);-webkit-tranform:scale(0.95) }100% {transform:scale(1);-webkit-transform:scale(1) }}
+@keyframes showSweetAlert {0% {transform:scale(0.7);-webkit-transform:scale(0.7) }45% {transform:scale(1.05);-webkit-transform:scale(1.05) }80% {transform:scale(0.95);-webkit-tranform:scale(0.95) }100% {transform:scale(1);-webkit-transform:scale(1) }}
+@-webkit-keyframes hideSweetAlert {0% {transform:scale(1);-webkit-transform:scale(1) }100% {transform:scale(0.5);-webkit-transform:scale(0.5) }}
+@keyframes hideSweetAlert {0% {transform:scale(1);-webkit-transform:scale(1) }100% {transform:scale(0.5);-webkit-transform:scale(0.5) }}
+.showSweetAlert {-webkit-animation:showSweetAlert 0.3s;animation:showSweetAlert 0.3s}
+.hideSweetAlert {-webkit-animation:hideSweetAlert 0.2s;animation:hideSweetAlert 0.2s}
+@-webkit-keyframes animateSuccessTip {0% {width:0;left:1px;top:19px }54% {width:0;left:1px;top:19px }70% {width:50px;left:-8px;top:37px }84% {width:17px;left:21px;top:48px }100% {width:25px;left:14px;top:45px }}
+@keyframes animateSuccessTip {0% {width:0;left:1px;top:19px }54% {width:0;left:1px;top:19px }70% {width:50px;left:-8px;top:37px }84% {width:17px;left:21px;top:48px }100% {width:25px;left:14px;top:45px }}
+@-webkit-keyframes animateSuccessLong {0% {width:0;right:46px;top:54px }65% {width:0;right:46px;top:54px }84% {width:55px;right:0;top:35px }100% {width:47px;right:8px;top:38px }}
+@keyframes animateSuccessLong {0% {width:0;right:46px;top:54px }65% {width:0;right:46px;top:54px }84% {width:55px;right:0;top:35px }100% {width:47px;right:8px;top:38px }}
+@-webkit-keyframes rotatePlaceholder {0% {transform:rotate(-45deg);-webkit-transform:rotate(-45deg) }5% {transform:rotate(-45deg);-webkit-transform:rotate(-45deg) }12% {transform:rotate(-405deg);-webkit-transform:rotate(-405deg) }100% {transform:rotate(-405deg);-webkit-transform:rotate(-405deg) }}
+@keyframes rotatePlaceholder {0% {transform:rotate(-45deg);-webkit-transform:rotate(-45deg) }5% {transform:rotate(-45deg);-webkit-transform:rotate(-45deg) }12% {transform:rotate(-405deg);-webkit-transform:rotate(-405deg) }100% {transform:rotate(-405deg);-webkit-transform:rotate(-405deg) }}
+.animateSuccessTip {-webkit-animation:animateSuccessTip 0.75s;animation:animateSuccessTip 0.75s}
+.animateSuccessLong {-webkit-animation:animateSuccessLong 0.75s;animation:animateSuccessLong 0.75s}
+.icon.success.animate::after {-webkit-animation:rotatePlaceholder 4.25s ease-in;animation:rotatePlaceholder 4.25s ease-in}
+@-webkit-keyframes animateErrorIcon {0% {transform:rotateX(100deg);-webkit-transform:rotateX(100deg);opacity:0 }100% {transform:rotateX(0deg);-webkit-transform:rotateX(0deg);opacity:1 }}
+@keyframes animateErrorIcon {0% {transform:rotateX(100deg);-webkit-transform:rotateX(100deg);opacity:0 }100% {transform:rotateX(0deg);-webkit-transform:rotateX(0deg);opacity:1 }}
+.animateErrorIcon {-webkit-animation:animateErrorIcon 0.5s;animation:animateErrorIcon 0.5s}
+@-webkit-keyframes animateXMark {0% {transform:scale(0.4);-webkit-transform:scale(0.4);margin-top:26px;opacity:0 }50% {transform:scale(0.4);-webkit-transform:scale(0.4);margin-top:26px;opacity:0 }80% {transform:scale(1.15);-webkit-transform:scale(1.15);margin-top:-6px }100% {transform:scale(1);-webkit-transform:scale(1);margin-top:0;opacity:1 }}
+@keyframes animateXMark {0% {transform:scale(0.4);-webkit-transform:scale(0.4);margin-top:26px;opacity:0 }50% {transform:scale(0.4);-webkit-transform:scale(0.4);margin-top:26px;opacity:0 }80% {transform:scale(1.15);-webkit-transform:scale(1.15);margin-top:-6px }100% {transform:scale(1);-webkit-transform:scale(1);margin-top:0;opacity:1 }}
+.animateXMark {-webkit-animation:animateXMark 0.5s;animation:animateXMark 0.5s}
+@-webkit-keyframes pulseWarning {0% {border-color:#F8D486 }100% {border-color:#F8BB86 }}
+@keyframes pulseWarning {0% {border-color:#F8D486 }100% {border-color:#F8BB86 }}
+.pulseWarning {-webkit-animation:pulseWarning 0.75s infinite alternate;animation:pulseWarning 0.75s infinite alternate}
+@-webkit-keyframes pulseWarningIns {0% {background-color:#F8D486 }100% {background-color:#F8BB86 }}
+@keyframes pulseWarningIns {0% {background-color:#F8D486 }100% {background-color:#F8BB86 }}
+.pulseWarningIns {-webkit-animation:pulseWarningIns 0.75s infinite alternate;animation:pulseWarningIns 0.75s infinite alternate}
+.sweet-overlay {background-color:rgba(0,0,0,0.4);position:fixed;left:0;right:0;top:0;bottom:0;display:none;z-index:7600}
+.sweet-alert {background-color:#f9f9f9;width:478px;padding:17px;border-radius:5px;text-align:center;position:fixed;left:50%;top:50%;margin-left:-256px;margin-top:-200px;overflow:hidden;display:none;z-index:8600}
+@media all and (max-width:767px) {.sweet-alert {width:auto;margin-left:0;margin-right:0;left:15px;right:15px }}
+.sweet-alert .icon {width:80px;height:80px;border:4px solid gray;border-radius:50%;margin:20px auto;position:relative;box-sizing:content-box}
+.sweet-alert .icon.error {border-color:#952518}
+.sweet-alert .icon.error .x-mark {position:relative;display:block}
+.sweet-alert .icon.error .line {position:absolute;height:5px;width:47px;background-color:#ab2a1c;display:block;top:37px;border-radius:2px}
+.sweet-alert .icon.error .line.left {-webkit-transform:rotate(45deg);transform:rotate(45deg);left:17px}
+.sweet-alert .icon.error .line.right {-webkit-transform:rotate(-45deg);transform:rotate(-45deg);right:16px}
+.sweet-alert .icon.warning {border-color:#eea236}
+.sweet-alert .icon.warning .body {position:absolute;width:5px;height:47px;left:50%;top:10px;border-radius:2px;margin-left:-2px;background-color:#f0ad4e}
+.sweet-alert .icon.warning .dot {position:absolute;width:7px;height:7px;border-radius:50%;margin-left:-3px;left:50%;bottom:10px;background-color:#f0ad4e}
+.sweet-alert .icon.info {border-color:#46b8da}
+.sweet-alert .icon.info::before {content:"";position:absolute;width:5px;height:29px;left:50%;bottom:17px;border-radius:2px;margin-left:-2px;background-color:#5bc0de}
+.sweet-alert .icon.info::after {content:"";position:absolute;width:7px;height:7px;border-radius:50%;margin-left:-3px;top:19px;background-color:#5bc0de}
+.sweet-alert .icon.success {border-color:#2b9854}
+.sweet-alert .icon.success::before,
+.sweet-alert .icon.success::after {content:'';border-radius:50%;position:absolute;width:60px;height:120px;background:white;-webkit-transform:rotate(45deg);transform:rotate(45deg)}
+.sweet-alert .icon.success::before {border-radius:120px 0 0 120px;top:-7px;left:-33px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:60px 60px;transform-origin:60px 60px}
+.sweet-alert .icon.success::after {border-radius:0 120px 120px 0;top:-11px;left:30px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 60px;transform-origin:0 60px}
+.sweet-alert .icon.success .placeholder {width:80px;height:80px;border:4px solid rgba(49,172,95,0.2);border-radius:50%;box-sizing:content-box;position:absolute;left:-4px;top:-4px;z-index:2}
+.sweet-alert .icon.success .fix {width:5px;height:90px;background-color:#f9f9f9;position:absolute;left:28px;top:8px;z-index:1;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}
+.sweet-alert .icon.success .line {height:5px;background-color:#31ac5f;display:block;border-radius:2px;position:absolute;z-index:2}
+.sweet-alert .icon.success .line.tip {width:25px;left:14px;top:46px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}
+.sweet-alert .icon.success .line.long {width:47px;right:8px;top:38px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}
+.sweet-alert .icon.custom {background-size:contain;border-radius:0;border:none;background-position:center center;background-repeat:no-repeat}
+.sweet-alert .btn-default:focus {border-color:#656d79;outline:0}
+.sweet-alert .btn-success:focus {border-color:#2b9854;outline:0}
+.sweet-alert .btn-info:focus {border-color:#46b8da;outline:0}
+.sweet-alert .btn-danger:focus {border-color:#952518;outline:0}
+.sweet-alert .btn-warning:focus {border-color:#eea236;outline:0}
+.sweet-alert button::-moz-focus-inner {border:0}
+.sweet-overlay {background-color:rgba(0,0,0,0.2);z-index:10499}
+.sweet-alert {text-align:right;border-radius:3px;-webkit-box-shadow:0 27px 24px 0 rgba(0,0,0,0.2),0 40px 77px 0 rgba(0,0,0,0.22);box-shadow:0 27px 24px 0 rgba(0,0,0,0.2),0 40px 77px 0 rgba(0,0,0,0.22);z-index:10500}
+.sweet-alert h2 {word-break:break-word;word-wrap:break-word;max-height:350px;overflow-y:auto;margin:10px 0 17px 0;color:#2b3e50;text-align:left;font-size:15px;line-height:23px}
+.sweet-alert p {margin:0}
+.sweet-alert p.text-muted {margin-bottom:20px;color:#555}
+.control-simplelist {font-size:13px;padding:20px 20px 2px 20px;margin-bottom:20px;background:#fff;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
+.control-simplelist ul {padding-left:15px}
+.control-simplelist.form-control ul {margin-bottom:0}
+.control-simplelist.form-control li {padding-top:5px;padding-bottom:5px}
+.control-simplelist.with-icons ul,
+.control-simplelist.with-checkboxes ul,
+.control-simplelist.is-divided ul,
+.control-simplelist.is-selectable ul {list-style-type:none;padding-left:0}
+.control-simplelist.with-checkboxes li {margin-top:-5px}
+.control-simplelist.with-checkboxes li:first-child {margin-top:0}
+.control-simplelist.with-checkboxes li:last-child div.custom-checkbox {margin-bottom:0}
+.control-simplelist.with-checkboxes li:last-child div.custom-checkbox label {margin-bottom:5px}
+.control-simplelist.is-sortable li.placeholder {position:relative}
+.control-simplelist.is-sortable li.placeholder:before {top:-10px;position:absolute;content:'';display:block;width:0;height:0;border-top:4.5px solid transparent;border-bottom:4.5px solid transparent;border-left:5px solid #999}
+.control-simplelist.is-sortable li.dragged {position:absolute;opacity:0.5;filter:alpha(opacity=50);z-index:2000;color:#e67e22;width:auto !important}
+.control-simplelist.is-scrollable {height:200px}
+.control-simplelist.is-scrollable.size-tiny {min-height:250px}
+.control-simplelist.is-scrollable.size-small {min-height:300px}
+.control-simplelist.is-scrollable.size-large {min-height:400px}
+.control-simplelist.is-scrollable.size-huge {min-height:450px}
+.control-simplelist.is-scrollable.size-giant {min-height:550px}
+.control-simplelist.is-divided,
+.control-simplelist.is-selectable,
+.control-simplelist.is-selectable-box {padding:0}
+.control-simplelist.is-divided li .heading,
+.control-simplelist.is-selectable li .heading,
+.control-simplelist.is-selectable-box li .heading {font-size:14px;font-weight:500}
+.control-simplelist.is-divided li,
+.control-simplelist.is-selectable li {padding:5px 10px;border-bottom:1px solid #d4d8da}
+.control-simplelist.is-divided li:last-child,
+.control-simplelist.is-selectable li:last-child {border-bottom:none}
+.control-simplelist.is-selectable li a {padding:5px 10px;margin:-5px -10px;display:block;color:#333}
+.control-simplelist.is-selectable li:hover {background:#4ea5e0;cursor:pointer}
+.control-simplelist.is-selectable li:hover,
+.control-simplelist.is-selectable li:hover a {color:white}
+.control-simplelist.is-selectable li:hover a {text-decoration:none}
+.control-simplelist.is-selectable li.active a {background:#f0f0f0}
+.control-simplelist.is-selectable li.active a:hover {background:#4ea5e0}
+.control-simplelist.is-selectable-box {padding-top:15px;margin-bottom:0}
+.control-simplelist.is-selectable-box li {width:155px;margin:8px;display:inline-block;text-align:center;vertical-align:top}
+.control-simplelist.is-selectable-box li a {text-decoration:none;display:block;color:#333}
+.control-simplelist.is-selectable-box li a .box {display:block;width:155px;height:155px;border:3px solid rgba(0,0,0,0.1);position:relative;-webkit-transition:border 0.3s ease;transition:border 0.3s ease}
+.control-simplelist.is-selectable-box li a .image {display:block;width:56px;height:56px;position:absolute;top:50%;left:50%;margin-top:-28px;margin-left:-28px}
+.control-simplelist.is-selectable-box li a .image >i {font-size:56px;color:rgba(0,0,0,0.25)}
+.control-simplelist.is-selectable-box li a .heading {margin:7px 0;padding:0}
+.control-simplelist.is-selectable-box li a .description {font-size:12px}
+.control-simplelist.is-selectable-box li a:hover .box {border-color:rgba(0,0,0,0.2)}
+.control-simplelist.is-selectable-box li a:hover .image >i {color:rgba(0,0,0,0.45)}
+.list-preview .control-simplelist.is-selectable ul {margin-bottom:0}
+.drag-noselect {-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
+.control-scrollbar {position:relative;overflow:hidden;height:100%}
+.control-scrollbar >.scrollbar-scrollbar {position:absolute;z-index:100}
+.control-scrollbar >.scrollbar-scrollbar .scrollbar-track {background-color:transparent;position:relative;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}
+.control-scrollbar >.scrollbar-scrollbar .scrollbar-track .scrollbar-thumb {background-color:rgba(0,0,0,0.35);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;cursor:pointer;overflow:hidden;position:absolute}
+.control-scrollbar >.scrollbar-scrollbar.disabled {display:none !important}
+.control-scrollbar.vertical >.scrollbar-scrollbar {right:0;margin-right:5px;width:6px}
+.control-scrollbar.vertical >.scrollbar-scrollbar .scrollbar-track {height:100%;width:6px}
+.control-scrollbar.vertical >.scrollbar-scrollbar .scrollbar-track .scrollbar-thumb {height:20px;width:6px;top:0;left:0}
+.control-scrollbar.vertical >.scrollbar-scrollbar:active,
+.control-scrollbar.vertical >.scrollbar-scrollbar:hover {width:8px;-webkit-transition:width 0.3s;transition:width 0.3s}
+.control-scrollbar.vertical >.scrollbar-scrollbar:active .scrollbar-track,
+.control-scrollbar.vertical >.scrollbar-scrollbar:hover .scrollbar-track,
+.control-scrollbar.vertical >.scrollbar-scrollbar:active .scrollbar-thumb,
+.control-scrollbar.vertical >.scrollbar-scrollbar:hover .scrollbar-thumb {width:8px;-webkit-transition:width 0.3s;transition:width 0.3s}
+.control-scrollbar.horizontal >.scrollbar-scrollbar {margin:0 0 5px;clear:both;height:6px}
+.control-scrollbar.horizontal >.scrollbar-scrollbar .scrollbar-track {width:100%;height:6px}
+.control-scrollbar.horizontal >.scrollbar-scrollbar .scrollbar-track .scrollbar-thumb {height:6px;margin:2px 0;left:0;top:0}
+.control-scrollbar.horizontal >.scrollbar-scrollbar:active,
+.control-scrollbar.horizontal >.scrollbar-scrollbar:hover {height:8px;-webkit-transition:height 0.3s;transition:height 0.3s}
+.control-scrollbar.horizontal >.scrollbar-scrollbar:active .scrollbar-track,
+.control-scrollbar.horizontal >.scrollbar-scrollbar:hover .scrollbar-track,
+.control-scrollbar.horizontal >.scrollbar-scrollbar:active .scrollbar-thumb,
+.control-scrollbar.horizontal >.scrollbar-scrollbar:hover .scrollbar-thumb {height:8px;-webkit-transition:height 0.3s;transition:height 0.3s}
+html.mobile .control-scrollbar {overflow:auto;-webkit-overflow-scrolling:touch}
+.no-touch .control-scrollbar >.scrollbar-scrollbar {opacity:0;-webkit-transition:opacity 0.3s;transition:opacity 0.3s}
+.no-touch .control-scrollbar:active >.scrollbar-scrollbar,
+.no-touch .control-scrollbar:hover >.scrollbar-scrollbar {opacity:1}
+@media (max-width:768px) {.responsive-sidebar >.layout-cell:last-child .control-scrollbar {overflow:visible;height:auto }.responsive-sidebar >.layout-cell:last-child .control-scrollbar .scrollbar-scrollbar {display:none !important }}
+.control-filelist p.no-data {padding:22px 0;margin:0;color:#666;font-size:14px;text-align:center;font-weight:normal;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
+.control-filelist ul {padding:0;margin:0}
+.control-filelist ul li {font-weight:normal;line-height:150%;position:relative;list-style:none}
+.control-filelist ul li a:hover {background:#ddd}
+.control-filelist ul li.active >a {background:#ddd;position:relative}
+.control-filelist ul li.active >a:after {position:absolute;height:100%;width:4px;left:0;top:0;background:#e67e22;display:block;content:' '}
+.control-filelist ul li a {display:block;padding:10px 45px 10px 20px;outline:none}
+.control-filelist ul li a:hover,
+.control-filelist ul li a:focus,
+.control-filelist ul li a:active {text-decoration:none}
+.control-filelist ul li a span {display:block}
+.control-filelist ul li a span.title {font-weight:normal;color:#405261;font-size:14px}
+.control-filelist ul li a span.description {color:#8f8f8f;font-size:12px;white-space:nowrap;font-weight:normal;overflow:hidden;text-overflow:ellipsis}
+.control-filelist ul li a span.description strong {color:#405261;font-weight:normal}
+.control-filelist ul li.group >h4,
+.control-filelist ul li.group >div.group >h4 {font-weight:normal;font-size:14px;margin-top:0;margin-bottom:0;position:relative}
+.control-filelist ul li.group >h4 a,
+.control-filelist ul li.group >div.group >h4 a {padding:10px 20px 10px 53px;color:#405261;position:relative;outline:none}
+.control-filelist ul li.group >h4 a:hover,
+.control-filelist ul li.group >div.group >h4 a:hover {background:transparent}
+.control-filelist ul li.group >h4 a:before,
+.control-filelist ul li.group >div.group >h4 a:before,
+.control-filelist ul li.group >h4 a:after,
+.control-filelist ul li.group >div.group >h4 a:after {width:10px;height:10px;display:block;position:absolute;top:1px}
+.control-filelist ul li.group >h4 a:after,
+.control-filelist ul li.group >div.group >h4 a:after {left:33px;top:9px;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;content:"\f07b";color:#a1aab1;font-size:16px}
+.control-filelist ul li.group >h4 a:before,
+.control-filelist ul li.group >div.group >h4 a:before {left:20px;top:9px;color:#cfcfcf;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;content:"\f0da";-webkit-transform:rotate(90deg) translate(5px,0);-ms-transform:rotate(90deg) translate(5px,0);transform:rotate(90deg) translate(5px,0);-webkit-transition:all 0.1s ease;transition:all 0.1s ease}
+.control-filelist ul li.group >ul >li >a {padding-left:52px}
+.control-filelist ul li.group >ul >li.group {padding-left:20px}
+.control-filelist ul li.group >ul >li.group >ul >li >a {padding-left:324px;margin-left:-270px}
+.control-filelist ul li.group >ul >li.group >ul >li.group >ul >li >a {padding-left:297px;margin-left:-243px}
+.control-filelist ul li.group >ul >li.group >ul >li.group >ul >li.group >ul >li >a {padding-left:270px;margin-left:-216px}
+.control-filelist ul li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li >a {padding-left:243px;margin-left:-189px}
+.control-filelist ul li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li >a {padding-left:216px;margin-left:-162px}
+.control-filelist ul li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li >a {padding-left:189px;margin-left:-135px}
+.control-filelist ul li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li >a {padding-left:162px;margin-left:-108px}
+.control-filelist ul li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li >a {padding-left:135px;margin-left:-81px}
+.control-filelist ul li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li >a {padding-left:108px;margin-left:-54px}
+.control-filelist ul li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li.group >ul >li >a {padding-left:81px;margin-left:-27px}
+.control-filelist ul li.group[data-status=collapsed] >h4 a:before,
+.control-filelist ul li.group[data-status=collapsed] >div.group >h4 a:before {-webkit-transform:rotate(0deg) translate(3px,0);-ms-transform:rotate(0deg) translate(3px,0);transform:rotate(0deg) translate(3px,0)}
+.control-filelist ul li.group[data-status=collapsed] >ul,
+.control-filelist ul li.group[data-status=collapsed] >div.subitems {display:none}
+.control-filelist ul li >div.controls {position:absolute;right:19px;top:6px}
+.control-filelist ul li >div.controls .dropdown {width:14px;height:21px}
+.control-filelist ul li >div.controls .dropdown.open a.control {display:block !important}
+.control-filelist ul li >div.controls .dropdown.open a.control:before {visibility:visible;display:block}
+.control-filelist ul li >div.controls a.control {color:#405261;font-size:14px;visibility:hidden;overflow:hidden;width:14px;height:21px;display:none;text-decoration:none;cursor:pointer;padding:0;opacity:0.5;filter:alpha(opacity=50)}
+.control-filelist ul li >div.controls a.control:before {visibility:visible;display:block;margin-right:0}
+.control-filelist ul li >div.controls a.control:hover {opacity:1;filter:alpha(opacity=100)}
+.control-filelist ul li:hover >div.controls,
+.control-filelist ul li:hover >a.control {display:block !important}
+.control-filelist ul li:hover >div.controls >a.control,
+.control-filelist ul li:hover >a.control >a.control {display:block !important}
+.control-filelist ul li .checkbox {position:absolute;top:-5px;right:0}
+.control-filelist ul li .checkbox label {margin-right:0}
+.control-filelist ul li .checkbox label:before {border-color:#ccc}
+.control-filelist.single-line ul li a span.title {text-overflow:ellipsis;overflow:hidden;white-space:nowrap}
+.control-filelist.filelist-hero ul li {background:#fff;border-bottom:none}
+.control-filelist.filelist-hero ul li >a {padding:11px 45px 10px 50px;font-size:13px;border-bottom:1px solid #ecf0f1}
+.control-filelist.filelist-hero ul li >a span.title {font-size:14px;font-weight:normal;color:#2b3e50}
+.control-filelist.filelist-hero ul li >a span.description {font-size:13px}
+.control-filelist.filelist-hero ul li >a .list-icon {position:absolute;left:14px;top:15px;font-size:22px;color:#b7c0c2}
+.control-filelist.filelist-hero ul li >a:hover {background:#4ea5e0;border-bottom:1px solid #4ea5e0 !important}
+.control-filelist.filelist-hero ul li >a:hover span.title,
+.control-filelist.filelist-hero ul li >a:hover span.description {color:#fff !important}
+.control-filelist.filelist-hero ul li >a:hover .list-icon {color:#fff !important}
+.control-filelist.filelist-hero ul li >a:active {background:#3498db;border-bottom:1px solid #3498db !important}
+.control-filelist.filelist-hero ul li >a:active span.title,
+.control-filelist.filelist-hero ul li >a:active span.description {color:#fff !important}
+.control-filelist.filelist-hero ul li >a:active .list-icon {color:#fff !important}
+.control-filelist.filelist-hero ul li .checkbox {top:-2px;right:0}
+.control-filelist.filelist-hero ul li.active >a {border-bottom:1px solid #ddd}
+.control-filelist.filelist-hero ul li.active >a:after {top:-1px;bottom:-1px;height:auto}
+.control-filelist.filelist-hero ul li.active >a >span.borders:before {content:' ';position:absolute;width:100%;height:1px;display:block;left:0;background-color:#ddd}
+.control-filelist.filelist-hero ul li.active >a >span.borders:before {top:-1px}
+.control-filelist.filelist-hero ul li.active >a:hover >span.borders:before {background-color:#4ea5e0}
+.control-filelist.filelist-hero ul li.active >a:active >span.borders:before {background-color:#3498db}
+.control-filelist.filelist-hero ul li >h4 {padding-top:7px;padding-bottom:6px;border-bottom:1px solid #ecf0f1}
+.control-filelist.filelist-hero ul li >div.controls {display:none;position:absolute;right:16px;top:15px}
+.control-filelist.filelist-hero ul li >div.controls >a.control {width:16px;height:23px;background:transparent;overflow:hidden;display:inline-block;color:#fff !important;padding:0}
+.control-filelist.filelist-hero ul li >div.controls >a.control:before {font-size:17px}
+.control-filelist.filelist-hero ul li:hover >div.controls {display:block}
+.control-filelist.filelist-hero ul li.separator {position:relative;border-bottom:1px solid #95a5a6;padding:12px 15px 13px 15px}
+.control-filelist.filelist-hero ul li.separator:before {z-index:31;content:'';display:block;width:0;height:0;border-left:9.5px solid transparent;border-right:9.5px solid transparent;border-top:11px solid #fff;border-bottom-width:0;position:absolute;left:13px;bottom:-8px}
+.control-filelist.filelist-hero ul li.separator:after {z-index:30;content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-top:9px solid #95a5a6;border-bottom-width:0;position:absolute;left:14px;bottom:-9px}
+.control-filelist.filelist-hero ul li.separator h5 {color:#2b3e50;font-size:14px;margin:0;font-weight:normal;padding:0}
+.control-filelist.filelist-hero ul >li.group >ul >li >a {padding-left:66px}
+.control-filelist.filelist-hero.single-level ul li:hover {background:#4ea5e0}
+.control-filelist.filelist-hero.single-level ul li:hover >a {background:#4ea5e0;border-bottom:1px solid #4ea5e0 !important}
+.control-filelist.filelist-hero.single-level ul li:hover >a span.title,
+.control-filelist.filelist-hero.single-level ul li:hover >a span.description {color:#fff !important}
+.control-filelist.filelist-hero.single-level ul li:hover >a .list-icon {color:#fff !important}
+.control-filelist.filelist-hero.single-level ul li:active {background:#3498db}
+.control-filelist.filelist-hero.single-level ul li:active >a {background:#3498db;border-bottom:1px solid #3498db !important}
+.control-filelist.filelist-hero.single-level ul li:active >a span.title,
+.control-filelist.filelist-hero.single-level ul li:active >a span.description {color:#fff !important}
+.control-filelist.filelist-hero.single-level ul li:active >a .list-icon {color:#fff !important}
+.control-scrollpanel {position:relative;background:#ecf0f1}
+.control-scrollpanel .control-scrollbar.vertical >.scrollbar-scrollbar {right:0}
+.tooltip .tooltip-inner {text-align:left;padding:5px 8px}
+.tooltip.in {opacity:1;filter:alpha(opacity=100)}
+.oc-logo-white {background-image:url(../images/october-logo-white.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:contain}
+.oc-logo {background-image:url(../images/october-logo.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:contain}
+.layout.control-tabs.oc-logo-transparent:not(.has-tabs),
+.flex-layout-column.oc-logo-transparent:not(.has-tabs),
+.layout-cell.oc-logo-transparent {background-size:50% auto;background-repeat:no-repeat;background-image:url(../images/october-logo.svg);background-position:50% 50%;position:relative}
+.layout.control-tabs.oc-logo-transparent:not(.has-tabs):after,
+.flex-layout-column.oc-logo-transparent:not(.has-tabs):after,
+.layout-cell.oc-logo-transparent:after {content:'';display:table-cell;position:absolute;left:0;top:0;height:100%;width:100%;background:rgba(249,249,249,0.7)}
+.report-widget {padding:15px;background:white;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;font-size:13px}
+.report-widget h3 {font-size:14px;color:#7e8c8d;text-transform:uppercase;font-weight:600;margin-top:0;margin-bottom:30px}
+.report-widget .height-100 {height:100px}
+.report-widget .height-200 {height:200px}
+.report-widget .height-300 {height:300px}
+.report-widget .height-400 {height:400px}
+.report-widget .height-500 {height:500px}
+.report-widget p.report-description {margin-bottom:0;margin-top:15px;font-size:12px;line-height:190%;color:#7e8c8d}
+.report-widget a:not(.btn) {color:#7e8c8d;text-decoration:none}
+.report-widget a:not(.btn):hover {color:#0181b9;text-decoration:none}
+.report-widget p.flash-message.static {margin-bottom:0}
+.report-widget .icon-circle.success {color:#31ac5f}
+.report-widget .icon-circle.primary {color:#34495e}
+.report-widget .icon-circle.warning {color:#f0ad4e}
+.report-widget .icon-circle.danger {color:#ab2a1c}
+.report-widget .icon-circle.info {color:#5bc0de}
+.control-treelist ol {padding:0;margin:0;list-style:none}
+.control-treelist ol ol {margin:0;margin-left:15px;padding-left:15px;border-left:1px solid #dbdee0}
+.control-treelist >ol >li >div.record:before {display:none}
+.control-treelist li {margin:0;padding:0}
+.control-treelist li >div.record {margin:0;font-size:12px;margin-bottom:5px;position:relative;display:block}
+.control-treelist li >div.record:before {color:#bdc3c7;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;content:"\f111";font-size:6px;position:absolute;left:-18px;top:11px}
+.control-treelist li >div.record >a.move {display:inline-block;padding:7px 0 7px 10px;text-decoration:none;color:#bdc3c7}
+.control-treelist li >div.record >a.move:hover {color:#4ea5e0}
+.control-treelist li >div.record >a.move:before {font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;content:"\f0c9"}
+.control-treelist li >div.record >span {color:#666;display:inline-block;padding:7px 15px 7px 5px}
+.control-treelist li.dragged {position:absolute;z-index:2000;width:auto !important;height:auto !important}
+.control-treelist li.dragged >div.record {opacity:0.5;filter:alpha(opacity=50);background:#4ea5e0 !important}
+.control-treelist li.dragged >div.record >a.move:before,
+.control-treelist li.dragged >div.record >span {color:white}
+.control-treelist li.dragged >div.record:before {display:none}
+.control-treelist li.placeholder {display:inline-block;position:relative;background:#4ea5e0 !important;height:25px;margin-bottom:5px}
+.control-treelist li.placeholder:before {display:block;position:absolute;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;content:"\f053";color:#d35714;left:-10px;top:8px;z-index:2000}
+.control-treeview {margin-bottom:40px}
+.control-treeview ol {margin:0;padding:0;list-style:none;background:#fff}
+.control-treeview ol >li {-webkit-transition:width 1s;transition:width 1s}
+.control-treeview ol >li >div {font-size:14px;font-weight:normal;background:#fff;border-bottom:1px solid #ecf0f1;position:relative}
+.control-treeview ol >li >div >a {color:#2b3e50;padding:11px 45px 10px 61px;display:block;line-height:150%;text-decoration:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}
+.control-treeview ol >li >div:before {content:' ';background-image:url(../images/treeview-icons.png);background-position:0 -28px;background-repeat:no-repeat;background-size:42px auto;position:absolute;width:21px;height:22px;left:28px;top:15px}
+.control-treeview ol >li >div span.comment {display:block;font-weight:400;color:#95a5a6;font-size:13px;margin-top:2px;overflow:hidden;text-overflow:ellipsis}
+.control-treeview ol >li >div >span.expand {font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;display:none;position:absolute;width:20px;height:20px;top:19px;left:2px;cursor:pointer;color:#bdc3c7;-webkit-transition:transform 0.1s ease;transition:transform 0.1s ease}
+.control-treeview ol >li >div >span.expand:before {font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;content:"\f0da";line-height:100%;font-size:15px;position:relative;left:8px;top:2px}
+.control-treeview ol >li >div >span.drag-handle {font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;-webkit-transition:opacity 0.4s;transition:opacity 0.4s;position:absolute;right:9px;bottom:0;width:18px;height:19px;cursor:move;color:#bdc3c7;opacity:0;filter:alpha(opacity=0)}
+.control-treeview ol >li >div >span.drag-handle:before {font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;content:"\f0c9";font-size:18px}
+.control-treeview ol >li >div span.borders {font-size:0}
+.control-treeview ol >li >div >ul.submenu {position:absolute;left:20px;bottom:-36.9px;padding:0;list-style:none;z-index:200;height:37px;display:none;margin-left:15px;background:transparent url(../images/treeview-submenu-tabs.png) repeat-x left -39px}
+.control-treeview ol >li >div >ul.submenu:before,
+.control-treeview ol >li >div >ul.submenu:after {background:transparent url(../images/treeview-submenu-tabs.png) no-repeat left top;content:' ';display:block;width:20px;height:37px;position:absolute;top:0}
+.control-treeview ol >li >div >ul.submenu:before {left:-20px}
+.control-treeview ol >li >div >ul.submenu:after {background-position:-100px top;right:-20px}
+.control-treeview ol >li >div >ul.submenu li {font-size:12px}
+.control-treeview ol >li >div >ul.submenu li a {display:block;padding:4px 3px 0 3px;color:#fff;text-decoration:none;outline:none}
+.control-treeview ol >li >div >ul.submenu li a i {margin-right:5px}
+.control-treeview ol >li >div:hover >ul.submenu {display:block}
+.control-treeview ol >li >div:active >ul.submenu {background-position:left -116px}
+.control-treeview ol >li >div:active >ul.submenu:before {background-position:left -77px}
+.control-treeview ol >li >div:active >ul.submenu:after {background-position:-100px -77px}
+.control-treeview ol >li >div .checkbox {position:absolute;top:-2px;right:0}
+.control-treeview ol >li >div .checkbox label {margin-right:0}
+.control-treeview ol >li >div .checkbox label:before {border-color:#ccc}
+.control-treeview ol >li >div.popover-highlight {background-color:#4ea5e0 !important}
+.control-treeview ol >li >div.popover-highlight:before {background-position:0 -80px}
+.control-treeview ol >li >div.popover-highlight >a {color:#fff !important;cursor:default}
+.control-treeview ol >li >div.popover-highlight span {color:#fff !important}
+.control-treeview ol >li >div.popover-highlight >ul.submenu,
+.control-treeview ol >li >div.popover-highlight >span.drag-handle {display:none !important}
+.control-treeview ol >li.dragged div,
+.control-treeview ol >li >div:hover {background-color:#4ea5e0 !important}
+.control-treeview ol >li.dragged div >a,
+.control-treeview ol >li >div:hover >a {color:#fff !important}
+.control-treeview ol >li.dragged div:before,
+.control-treeview ol >li >div:hover:before {background-position:0 -80px}
+.control-treeview ol >li.dragged div:after,
+.control-treeview ol >li >div:hover:after {top:0 !important;bottom:0 !important}
+.control-treeview ol >li.dragged div span,
+.control-treeview ol >li >div:hover span {color:#fff !important}
+.control-treeview ol >li.dragged div span.drag-handle,
+.control-treeview ol >li >div:hover span.drag-handle {cursor:move;opacity:1;filter:alpha(opacity=100)}
+.control-treeview ol >li.dragged div span.borders,
+.control-treeview ol >li >div:hover span.borders {display:none}
+.control-treeview ol >li >div:active {background-color:#3498db !important}
+.control-treeview ol >li >div:active >a {color:#fff !important}
+.control-treeview ol >li[data-no-drag-mode] div:hover span.drag-handle {cursor:default !important;opacity:0.3 !important;filter:alpha(opacity=30) !important}
+.control-treeview ol >li.dragged li.has-subitems >div:before,
+.control-treeview ol >li.dragged.has-subitems >div:before {background-position:0 -52px}
+.control-treeview ol >li.dragged div >ul.submenu {display:none !important}
+.control-treeview ol >li >ol {padding-left:20px;padding-right:20px}
+.control-treeview ol >li[data-status=collapsed] >ol {display:none}
+.control-treeview ol >li.has-subitems >div:before {background-position:0 0;width:23px;height:26px;left:26px}
+.control-treeview ol >li.has-subitems >div:hover:before,
+.control-treeview ol >li.has-subitems >div.popover-highlight:before {background-position:0 -52px}
+.control-treeview ol >li.has-subitems >div span.expand {display:block}
+.control-treeview ol >li.placeholder {position:relative;opacity:0.5;filter:alpha(opacity=50)}
+.control-treeview ol >li.dragged {position:absolute;z-index:2000;opacity:0.25;filter:alpha(opacity=25)}
+.control-treeview ol >li.dragged >div {-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
+.control-treeview ol >li.drop-target >div {background-color:#2581b8 !important}
+.control-treeview ol >li.drop-target >div >a {color:#fff}
+.control-treeview ol >li.drop-target >div >a >span.comment {color:#fff}
+.control-treeview ol >li.drop-target >div:before {background-position:0 -80px}
+.control-treeview ol >li.drop-target.has-subitems >div:before {background-position:0 -52px}
+.control-treeview ol >li[data-status=expanded] >div >span.expand {-webkit-transform:rotate(90deg) translate(0,0);-ms-transform:rotate(90deg) translate(0,0);transform:rotate(90deg) translate(0,0)}
+.control-treeview ol >li.drag-ghost {background-color:transparent;box-sizing:content-box}
+.control-treeview ol >li.active >div {background:#ddd}
+.control-treeview ol >li.active >div:after {position:absolute;width:4px;left:0;top:-1px;bottom:-1px;background:#e67e22;display:block;content:' '}
+.control-treeview ol >li.active >div >span.comment,
+.control-treeview ol >li.active >div >span.expand {color:#8f8f8f}
+.control-treeview ol >li.active >div >span.borders:before,
+.control-treeview ol >li.active >div >span.borders:after {content:' ';position:absolute;width:100%;height:1px;display:block;left:0;background-color:#ddd}
+.control-treeview ol >li.active >div >span.borders:before {top:-1px}
+.control-treeview ol >li.active >div >span.borders:after {bottom:-1px}
+.control-treeview ol >li.no-data {padding:18px 0;margin:0;color:#666;font-size:14px;text-align:center;font-weight:400}
+.control-treeview ol >li >ol >li >div {margin-left:-20px;margin-right:-20px;padding-left:71px}
+.control-treeview ol >li >ol >li >div >a {margin-left:-71px;padding-left:71px}
+.control-treeview ol >li >ol >li >div:before {margin-left:10px}
+.control-treeview ol >li >ol >li >div >span.expand {left:12px}
+.control-treeview ol >li >ol >li >ol >li >div {margin-left:-40px;margin-right:-40px;padding-left:81px}
+.control-treeview ol >li >ol >li >ol >li >div >a {margin-left:-81px;padding-left:81px}
+.control-treeview ol >li >ol >li >ol >li >div:before {margin-left:20px}
+.control-treeview ol >li >ol >li >ol >li >div >span.expand {left:22px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >div {margin-left:-60px;margin-right:-60px;padding-left:91px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >div >a {margin-left:-91px;padding-left:91px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >div:before {margin-left:30px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >div >span.expand {left:32px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >div {margin-left:-80px;margin-right:-80px;padding-left:101px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >div >a {margin-left:-101px;padding-left:101px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >div:before {margin-left:40px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >div >span.expand {left:42px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div {margin-left:-100px;margin-right:-100px;padding-left:111px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div >a {margin-left:-111px;padding-left:111px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div:before {margin-left:50px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div >span.expand {left:52px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div {margin-left:-120px;margin-right:-120px;padding-left:121px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div >a {margin-left:-121px;padding-left:121px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div:before {margin-left:60px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div >span.expand {left:62px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div {margin-left:-140px;margin-right:-140px;padding-left:131px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div >a {margin-left:-131px;padding-left:131px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div:before {margin-left:70px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div >span.expand {left:72px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div {margin-left:-160px;margin-right:-160px;padding-left:141px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div >a {margin-left:-141px;padding-left:141px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div:before {margin-left:80px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div >span.expand {left:82px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div {margin-left:-180px;margin-right:-180px;padding-left:151px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div >a {margin-left:-151px;padding-left:151px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div:before {margin-left:90px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div >span.expand {left:92px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div {margin-left:-200px;margin-right:-200px;padding-left:161px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div >a {margin-left:-161px;padding-left:161px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div:before {margin-left:100px}
+.control-treeview ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >ol >li >div >span.expand {left:102px}
+.control-treeview p.no-data {padding:18px 0;margin:0;color:#666;font-size:14px;text-align:center;font-weight:400}
+.control-treeview a.menu-control {display:block;margin:20px;padding:13px 15px;border:dotted 2px #ebebeb;color:#bdc3c7;font-size:12px;font-weight:600;text-transform:uppercase;border-radius:5px;vertical-align:middle}
+.control-treeview a.menu-control:hover,
+.control-treeview a.menu-control:focus {text-decoration:none;background-color:#4ea5e0;color:#fff;border:none;padding:15px 17px}
+.control-treeview a.menu-control:active {background:#3498db;color:#fff}
+.control-treeview a.menu-control i {margin-right:10px;font-size:14px}
+.control-treeview.treeview-light {margin-bottom:0;margin-top:20px}
+.control-treeview.treeview-light ol {background-color:transparent}
+.control-treeview.treeview-light ol >li >div {background-color:transparent;border-bottom:none}
+.control-treeview.treeview-light ol >li >div:before {top:15px}
+.control-treeview.treeview-light ol >li >div >a {padding-top:10px;padding-bottom:10px}
+.control-treeview.treeview-light ol >li >div span.expand {top:19px}
+.control-treeview.treeview-light ol >li >div >span.drag-handle {top:0;right:0;bottom:auto;height:100%;width:60px;background:#2581b8;-webkit-transition:none !important;transition:none !important}
+.control-treeview.treeview-light ol >li >div >span.drag-handle:before {position:absolute;left:50%;top:50%;margin-left:-6px}
+.control-treeview.treeview-light ol >li >div >ul.submenu {right:60px;left:auto;bottom:auto;top:0;height:100%;margin:0;background:transparent;white-space:nowrap;font-size:0}
+.control-treeview.treeview-light ol >li >div >ul.submenu:before,
+.control-treeview.treeview-light ol >li >div >ul.submenu:after {display:none}
+.control-treeview.treeview-light ol >li >div >ul.submenu li {height:100%;display:inline-block;background:#2581b8;border-right:1px solid #328ec8}
+.control-treeview.treeview-light ol >li >div >ul.submenu li p {display:table;height:100%;padding:0;margin:0}
+.control-treeview.treeview-light ol >li >div >ul.submenu li p a {display:table-cell;vertical-align:middle;height:100%;padding:0 20px;font-size:13px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}
+.control-treeview.treeview-light ol >li >div >ul.submenu li p a i.control-icon {font-size:22px;margin-right:0}
+body.dragging .control-treeview ol.dragging,
+body.dragging .control-treeview ol.dragging ol {background:#ccc;padding-right:20px;-webkit-transition:padding 1s;transition:padding 1s}
+body.dragging .control-treeview ol.dragging >li >div,
+body.dragging .control-treeview ol.dragging ol >li >div {margin-right:0;-webkit-transition:margin 1s;transition:margin 1s}
+body.dragging .control-treeview ol.dragging >li >div .custom-checkbox,
+body.dragging .control-treeview ol.dragging ol >li >div .custom-checkbox {-webkit-transition:opacity 0.5s;transition:opacity 0.5s;opacity:0;filter:alpha(opacity=0)}
+body.dragging .control-treeview.treeview-light ol.dragging >li >div,
+body.dragging .control-treeview.treeview-light ol.dragging ol >li >div {background-color:#f9f9f9}
+@media only screen and (min--moz-device-pixel-ratio:1.5),only screen and (-o-min-device-pixel-ratio:3/2),only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-devicepixel-ratio:1.5),only screen and (min-resolution:1.5dppx) {.control-treeview ol >li >div:before {background-position:0 -79px;background-size:21px auto }.control-treeview ol >li.has-subitems >div:before {background-position:0 -52px }.control-treeview ol >li.has-subitems >div:hover:before,.control-treeview ol >li.has-subitems >div.popover-highlight:before {background-position:0 -102px }.control-treeview ol >li.dragged >div:before,.control-treeview ol >li.dragged li >div:before,.control-treeview ol >li >div:hover:before,.control-treeview ol >li >div.popover-highlight:before {background-position:0 -129px }.control-treeview ol >li.dragged li.has-subitems >div:before,.control-treeview ol >li.dragged.has-subitems >div:before {background-position:0 -102px }.control-treeview ol >li.drop-target >div:before {background-position:0 -129px }.control-treeview ol >li.drop-target.has-subitems >div:before {background-position:0 -102px }}
+.sidenav-tree {width:300px}
+.sidenav-tree .control-toolbar {padding:0}
+.sidenav-tree .control-toolbar .toolbar-item {display:block}
+.sidenav-tree .control-toolbar input.form-control {border:none;outline:none;padding:12px 13px 13px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:inset -3px 0 3px rgba(0,0,0,0.1);box-shadow:inset -3px 0 3px rgba(0,0,0,0.1)}
+.sidenav-tree .control-toolbar input.form-control.search {background-position:right -78px}
+.sidenav-tree ul {padding:0;margin:0;list-style:none}
+.sidenav-tree div.scrollbar-thumb {background:rgba(0,0,0,0.2) !important}
+.sidenav-tree ul.top-level >li[data-status=collapsed] >div.group h3:before {-webkit-transform:rotate(0deg) translate(2px,-2px);-ms-transform:rotate(0deg) translate(2px,-2px);transform:rotate(0deg) translate(2px,-2px)}
+.sidenav-tree ul.top-level >li[data-status=collapsed] >div.group:before,
+.sidenav-tree ul.top-level >li[data-status=collapsed] >div.group:after {display:none}
+.sidenav-tree ul.top-level >li[data-status=collapsed] ul {display:none}
+.sidenav-tree ul.top-level >li >div.group {position:relative}
+.sidenav-tree ul.top-level >li >div.group h3 {background:rgba(0,0,0,0.15);color:#ecf0f1;text-transform:uppercase;font-size:15px;padding:15px 15px 15px 40px;margin:0;position:relative;cursor:pointer;font-weight:400}
+.sidenav-tree ul.top-level >li >div.group h3:before {display:block;position:absolute;width:10px;height:10px;left:16px;top:15px;color:#cfcfcf;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;content:"\f105";-webkit-transform:rotate(90deg) translate(5px,-3px);-ms-transform:rotate(90deg) translate(5px,-3px);transform:rotate(90deg) translate(5px,-3px);-webkit-transition:all 0.1s ease;transition:all 0.1s ease;font-size:16px}
+.sidenav-tree ul.top-level >li >div.group:before,
+.sidenav-tree ul.top-level >li >div.group:after {content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid #34495e;border-bottom-width:0;position:absolute;left:15px;bottom:-8px;z-index:101}
+.sidenav-tree ul.top-level >li >div.group:after {content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid rgba(0,0,0,0.15);border-bottom-width:0}
+.sidenav-tree ul.top-level >li >ul li a {display:block;position:relative;padding:18px 25px 18px 55px;background:transparent;border-bottom:1px solid rgba(0,0,0,0.15);color:#fff;text-decoration:none !important;opacity:0.65;filter:alpha(opacity=65)}
+.sidenav-tree ul.top-level >li >ul li a:active,
+.sidenav-tree ul.top-level >li >ul li a:hover {opacity:1;filter:alpha(opacity=100);text-decoration:none}
+.sidenav-tree ul.top-level >li >ul li a i {position:absolute;left:16px;top:18px;font-size:22px}
+.sidenav-tree ul.top-level >li >ul li a span {display:block;line-height:150%}
+.sidenav-tree ul.top-level >li >ul li a span.header {color:#fff;font-size:15px;margin-bottom:5px}
+.sidenav-tree ul.top-level >li >ul li a span.description {color:rgba(255,255,255,0.6);font-size:13px}
+.sidenav-tree ul.top-level >li >ul li:hover a,
+.sidenav-tree ul.top-level >li >ul li.active a {opacity:1;filter:alpha(opacity=100)}
+.sidenav-tree ul.top-level >li >ul li.active {border-left:5px solid #e67e22}
+.sidenav-tree ul.top-level >li >ul li.active a {color:rgba(255,255,255,0.91);padding-right:20px}
+.sidenav-tree ul.top-level >li >ul li.active a span.header {color:#fff}
+.sidenav-tree ul.top-level >li >ul li.active a span.description {color:rgba(255,255,255,0.91)}
+.sidenav-tree .back-link {display:none}
+@media (min-width:768px) {.sidenav-tree-root .sidenav-tree {width:600px }.sidenav-tree-root .sidenav-tree ul.top-level >li >ul {font-size:0;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;align-content:stretch }.sidenav-tree-root .sidenav-tree ul.top-level >li >ul >li {display:inline-block;width:300px }.sidenav-tree-root .sidenav-tree ul.top-level >li >ul >li a {height:100% }}
+@media (min-width:768px) and (max-width:991px) {.sidenav-tree-root .sidenav-tree {width:100% }.sidenav-tree-root .sidenav-tree ul.top-level >li >ul >li {width:50% }}
+@media (min-width:1200px) {.sidenav-tree-root .sidenav-tree {width:900px }}
+@media (max-width:768px) {.sidenav-tree {width:100%;height:auto !important;display:block !important }.sidenav-tree >.layout {display:none }.sidenav-tree-root .sidenav-tree {width:100% !important;height:100% !important;display:table-cell !important }.sidenav-tree-root .sidenav-tree .back-link {display:none !important }.sidenav-tree-root .sidenav-tree >.layout {display:table !important }.sidenav-tree-root #layout-body {display:none }body.has-sidenav-tree .sidenav-tree .back-link {display:block;padding:13px 15px;background:#2b3e50;color:#bdc3c7;font-size:14px;line-height:14px;text-transform:uppercase }body.has-sidenav-tree .sidenav-tree .back-link i {display:inline-block;margin-right:10px }body.has-sidenav-tree .sidenav-tree .back-link:hover {text-decoration:none }body.has-sidenav-tree #layout-body {display:block !important }}
+div.panel {padding:20px}
+div.panel.no-padding {padding:0}
+div.panel.no-padding-bottom {padding-bottom:0}
+div.panel.padding-top {padding-top:20px}
+div.panel.padding-less {padding:15px}
+div.panel.transparent {background:transparent}
+div.panel.border-left {border-left:1px solid #e8eaeb}
+div.panel.border-right {border-right:1px solid #e8eaeb}
+div.panel.border-bottom {border-bottom:1px solid #e8eaeb}
+div.panel.border-top {border-top:1px solid #e8eaeb}
+div.panel.triangle-down {position:relative}
+div.panel.triangle-down:after {content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid #fff;border-bottom-width:0;position:absolute;left:15px;bottom:-8px;z-index:101}
+div.panel.triangle-down:before {content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-top:9px solid #e8eaeb;border-bottom-width:0;position:absolute;left:14px;bottom:-9px;z-index:100}
+div.panel h3.section,
+div.panel >label {text-transform:uppercase;color:#95a5a6;font-size:13px;font-weight:600;margin:0 0 15px 0}
+div.panel >label {margin-bottom:5px}
+.nav.selector-group {font-size:13px;letter-spacing:0.01em;margin-bottom:20px}
+.nav.selector-group li a {padding:7px 20px 7px 23px;color:#95a5a6}
+.nav.selector-group li.active {border-left:3px solid #e6802b;padding-left:0}
+.nav.selector-group li.active a {padding-left:20px;color:#2b3e50}
+.nav.selector-group li i[class^="icon-"] {font-size:17px;margin-right:6px;position:relative;top:1px}
+div.panel .nav.selector-group {margin:0 -20px 20px -20px}
+ul.tree-path {list-style:none;padding:0;margin-bottom:0}
+ul.tree-path li {display:inline-block;margin-right:1px;font-size:13px}
+ul.tree-path li:after {font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;content:"\f105";display:inline-block;font-size:13px;margin-left:5px;position:relative;top:1px;color:#95a5a6}
+ul.tree-path li:last-child a {cursor:default}
+ul.tree-path li:last-child:after {display:none}
+ul.tree-path li.go-up {font-size:12px;margin-right:7px}
+ul.tree-path li.go-up a {color:#95a5a6}
+ul.tree-path li.go-up a:hover {color:#0181b9}
+ul.tree-path li.go-up:after {display:none}
+ul.tree-path li.root a {font-weight:600;color:#405261}
+ul.tree-path li a {color:#95a5a6}
+ul.tree-path li a:hover {text-decoration:none}
+table.name-value-list {border-collapse:collapse;font-size:13px}
+table.name-value-list th,
+table.name-value-list td {padding:4px 0 4px 0;vertical-align:top}
+table.name-value-list tr:first-child th,
+table.name-value-list tr:first-child td {padding-top:0}
+table.name-value-list th {font-weight:600;color:#95a5a6;padding-right:15px;text-transform:uppercase}
+table.name-value-list td {color:#2b3e50;word-wrap:break-word}
+.scrollpad-scrollbar-size-tester {width:50px;height:50px;overflow-y:scroll;position:absolute;top:-200px;left:-200px}
+.scrollpad-scrollbar-size-tester div {height:100px}
+.scrollpad-scrollbar-size-tester::-webkit-scrollbar {width:0;height:0}
+div.control-scrollpad {position:relative;width:100%;height:100%;overflow:hidden}
+div.control-scrollpad >div {overflow:hidden;overflow-y:scroll;height:100%}
+div.control-scrollpad >div::-webkit-scrollbar {width:0;height:0}
+div.control-scrollpad[data-direction=horizontal] >div {overflow-x:scroll;overflow-y:hidden;width:100%}
+div.control-scrollpad[data-direction=horizontal] >div::-webkit-scrollbar {width:auto;height:0}
+div.control-scrollpad >.scrollpad-scrollbar {z-index:199;position:absolute;top:0;right:0;bottom:0;width:11px;background-color:transparent;opacity:0;overflow:hidden;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-transition:opacity 0.3s;transition:opacity 0.3s}
+div.control-scrollpad >.scrollpad-scrollbar .drag-handle {position:absolute;right:2px;min-height:10px;width:7px;background-color:rgba(0,0,0,0.35);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}
+div.control-scrollpad >.scrollpad-scrollbar:hover {opacity:0.7;filter:alpha(opacity=70);-webkit-transition:opacity 0 linear;transition:opacity 0 linear}
+div.control-scrollpad >.scrollpad-scrollbar[data-visible] {opacity:0.7;filter:alpha(opacity=70)}
+div.control-scrollpad >.scrollpad-scrollbar[data-hidden] {display:none}
+div.control-scrollpad[data-direction=horizontal] >.scrollpad-scrollbar {top:auto;left:0;width:auto;height:11px}
+div.control-scrollpad[data-direction=horizontal] >.scrollpad-scrollbar .drag-handle {right:auto;top:2px;height:7px;min-height:0;min-width:10px;width:auto}
+.svg-icon-container img.svg-icon {display:none}
+.svg-icon-container.svg-active-effects img.svg-icon {-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:0.6;filter:alpha(opacity=60)}
+.svg-icon-container.svg-active-effects:hover img.svg-icon,
+.svg-icon-container.svg-active-effects.active img.svg-icon {-webkit-filter:none;filter:none;opacity:1;filter:alpha(opacity=100)}
+html.svg .svg-icon-container i.svg-replace {display:none}
+@-webkit-keyframes fadeIn {0% {opacity:0 }100% {opacity:1 }}
+@keyframes fadeIn {0% {opacity:0 }100% {opacity:1 }}
+.fadeIn {-webkit-animation-name:fadeIn;animation-name:fadeIn}
+@-webkit-keyframes fadeInDown {0% {opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0) }100% {opacity:1;-webkit-transform:none;transform:none }}
+@keyframes fadeInDown {0% {opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0) }100% {opacity:1;-webkit-transform:none;-ms-transform:none;transform:none }}
+.fadeInDown {-webkit-animation-name:fadeInDown;animation-name:fadeInDown}
+@-webkit-keyframes fadeInLeft {0% {opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0) }100% {opacity:1;-webkit-transform:none;transform:none }}
+@keyframes fadeInLeft {0% {opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0) }100% {opacity:1;-webkit-transform:none;-ms-transform:none;transform:none }}
+.fadeInLeft {-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}
+@-webkit-keyframes fadeInRight {0% {opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0) }100% {opacity:1;-webkit-transform:none;transform:none }}
+@keyframes fadeInRight {0% {opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0) }100% {opacity:1;-webkit-transform:none;-ms-transform:none;transform:none }}
+.fadeInRight {-webkit-animation-name:fadeInRight;animation-name:fadeInRight}
+@-webkit-keyframes fadeInUp {0% {opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0) }100% {opacity:1;-webkit-transform:none;transform:none }}
+@keyframes fadeInUp {0% {opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0) }100% {opacity:1;-webkit-transform:none;-ms-transform:none;transform:none }}
+.fadeInUp {-webkit-animation-name:fadeInUp;animation-name:fadeInUp}
+@-webkit-keyframes fadeInUpBig {0% {opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0) }100% {opacity:1;-webkit-transform:none;transform:none }}
+@-webkit-keyframes fadeOut {0% {opacity:1 }100% {opacity:0 }}
+@keyframes fadeOut {0% {opacity:1 }100% {opacity:0 }}
+.fadeOut {-webkit-animation-name:fadeOut;animation-name:fadeOut}
+@-webkit-keyframes fadeOutDown {0% {opacity:1 }100% {opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0) }}
+@keyframes fadeOutDown {0% {opacity:1 }100% {opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0) }}
+.fadeOutDown {-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}
+@-webkit-keyframes fadeOutLeft {0% {opacity:1 }100% {opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0) }}
+@keyframes fadeOutLeft {0% {opacity:1 }100% {opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0) }}
+.fadeOutLeft {-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}
+@-webkit-keyframes fadeOutRight {0% {opacity:1 }100% {opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0) }}
+@keyframes fadeOutRight {0% {opacity:1 }100% {opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0) }}
+.fadeOutRight {-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}
+@-webkit-keyframes fadeOutUp {0% {opacity:1 }100% {opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0) }}
+@keyframes fadeOutUp {0% {opacity:1 }100% {opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0) }}
+.fadeOutUp {-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}
+html:not(.mobile) body.drag * {cursor:grab !important;cursor:-webkit-grab !important;cursor:-moz-grab !important}
+body.dragging,
+body.dragging * {cursor:move !important}
+body.loading,
+body.loading * {cursor:wait !important}
+body.no-select {-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default !important}
+html,
+body {height:100%}
+body {font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";background:#f9f9f9;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
+#layout-canvas {min-height:100%;height:100%}
+.control-tabs.primary-tabs >ul.nav-tabs,
+.control-tabs.primary-tabs >div >ul.nav-tabs,
+.control-tabs.primary-tabs >div >div >ul.nav-tabs {margin-left:-20px;margin-right:-20px}
+.control-tabs.primary-tabs.tabs-no-inset >ul.nav-tabs,
+.control-tabs.primary-tabs.tabs-no-inset >div >ul.nav-tabs,
+.control-tabs.primary-tabs.tabs-no-inset >div >div >ul.nav-tabs {margin-left:0;margin-right:0}
+.layout {display:table;table-layout:fixed;height:100%;width:100%}
+.layout >.layout-row {display:table-row;vertical-align:top;height:100%}
+.layout >.layout-row >.layout-cell {display:table-cell;vertical-align:top;height:100%}
+.layout >.layout-row >.layout-cell.layout-container,
+.layout >.layout-row >.layout-cell .layout-container,
+.layout >.layout-row >.layout-cell.padded-container,
+.layout >.layout-row >.layout-cell .padded-container {padding:20px 20px 0 20px}
+.layout >.layout-row >.layout-cell.layout-container .container-flush,
+.layout >.layout-row >.layout-cell .layout-container .container-flush,
+.layout >.layout-row >.layout-cell.padded-container .container-flush,
+.layout >.layout-row >.layout-cell .padded-container .container-flush {padding-top:0}
+.layout >.layout-row >.layout-cell .layout-relative {position:relative;height:100%}
+.layout >.layout-row >.layout-cell .layout-absolute {position:absolute;height:100%;width:100%}
+.layout >.layout-row >.layout-cell.min-size {width:0}
+.layout >.layout-row >.layout-cell.min-height {height:0}
+.layout >.layout-row >.layout-cell.center {text-align:center}
+.layout >.layout-row >.layout-cell.middle {vertical-align:middle}
+.layout >.layout-row >.layout-cell.layout-container,
+.layout >.layout-row >.layout-cell .layout-container,
+.layout >.layout-row >.layout-cell.padded-container,
+.layout >.layout-row >.layout-cell .padded-container {padding:20px 20px 0 20px}
+.layout >.layout-row >.layout-cell.layout-container .container-flush,
+.layout >.layout-row >.layout-cell .layout-container .container-flush,
+.layout >.layout-row >.layout-cell.padded-container .container-flush,
+.layout >.layout-row >.layout-cell .padded-container .container-flush {padding-top:0}
+.layout >.layout-row >.layout-cell .layout-relative {position:relative;height:100%}
+.layout >.layout-row >.layout-cell .layout-absolute {position:absolute;height:100%;width:100%}
+.layout >.layout-row >.layout-cell.min-size {width:0}
+.layout >.layout-row >.layout-cell.min-height {height:0}
+.layout >.layout-row >.layout-cell.center {text-align:center}
+.layout >.layout-row >.layout-cell.middle {vertical-align:middle}
+.layout >.layout-row.min-size {height:0.1px}
+.layout >.layout-cell {display:table-cell;vertical-align:top;height:100%}
+.layout >.layout-cell.layout-container,
+.layout >.layout-cell .layout-container,
+.layout >.layout-cell.padded-container,
+.layout >.layout-cell .padded-container {padding:20px 20px 0 20px}
+.layout >.layout-cell.layout-container .container-flush,
+.layout >.layout-cell .layout-container .container-flush,
+.layout >.layout-cell.padded-container .container-flush,
+.layout >.layout-cell .padded-container .container-flush {padding-top:0}
+.layout >.layout-cell .layout-relative {position:relative;height:100%}
+.layout >.layout-cell .layout-absolute {position:absolute;height:100%;width:100%}
+.layout >.layout-cell.min-size {width:0}
+.layout >.layout-cell.min-height {height:0}
+.layout >.layout-cell.center {text-align:center}
+.layout >.layout-cell.middle {vertical-align:middle}
+.whiteboard {background:white}
+.layout-fill-container {position:absolute;left:0;top:0;width:100%;height:100%}
+[data-calculate-width] >form,
+[data-calculate-width] >div {display:inline-block}
+body.compact-container .layout.layout-container,
+body.compact-container .layout .layout-container {padding:0 !important}
+body.slim-container .layout.layout-container,
+body.slim-container .layout .layout-container {padding-left:0 !important;padding-right:0 !important}
+@media (max-width:768px) {.layout .hide-on-small {display:none }.layout.responsive-sidebar >.layout-cell:first-child {display:table-footer-group;height:auto }.layout.responsive-sidebar >.layout-cell:first-child .control-breadcrumb {display:none }.layout.responsive-sidebar >.layout-cell:last-child {display:table-header-group;width:auto;height:auto }.layout.responsive-sidebar >.layout-cell:last-child .layout-absolute {position:static }}
+.flex-layout-column {display:-webkit-box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:-ms-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}
+.flex-layout-column.full-height-strict {height:100%}
+.flex-layout-column.absolute {position:absolute !important}
+.flex-layout-column.fill-container {position:absolute;left:0;top:0;width:100%;height:100%}
+.flex-layout-row {display:-webkit-box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:-ms-flex;display:flex;-webkit-flex-direction:row;-moz-flex-direction:row;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}
+.flex-layout-column.justify-center,
+.flex-layout-row.justify-center {-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-webkit-box-pack:center;justify-content:center}
+.flex-layout-column.align-center,
+.flex-layout-row.align-center {-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;align-items:center;-webkit-align-content:center;-moz-align-content:center;-webkit-box-align:center;-ms-align-content:center;align-content:center}
+.flex-layout-column.full-height,
+.flex-layout-row.full-height {min-height:100%}
+.flex-layout-item {margin:0}
+.flex-layout-item.fix {-webkit-box-flex:0;-webkit-flex:0 0 auto;-moz-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}
+.flex-layout-item.stretch {-webkit-box-flex:1;-webkit-flex:1 1 auto;-moz-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}
+.flex-layout-item.stretch-constrain {-webkit-box-flex:1;-webkit-flex:1;-moz-flex:1;-ms-flex:1;flex:1}
+.flex-layout-item.center {-webkit-align-self:center;-moz-align-self:center;-ms-align-self:center;align-self:center}
+.flex-layout-item.relative {position:relative}
+.flex-layout-item.layout-container {max-width:none}
+body.mainmenu-open {overflow:hidden;position:fixed}
+.mainmenu-tooltip .tooltip-inner {font-size:13px;padding:6px 16px}
+ul.mainmenu-nav {font-size:14px}
+ul.mainmenu-nav li {}
+ul.mainmenu-nav li .svg-icon {-webkit-backface-visibility:hidden;backface-visibility:hidden}
+ul.mainmenu-nav li span.counter {display:block;position:absolute;top:.143em;right:0;padding:.143em .429em .214em .286em;background-color:#d9350f;color:#fff;font-size:.786em;line-height:100%;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;opacity:1;filter:alpha(opacity=100);-webkit-transform:scale(1,);-ms-transform:scale(1,);transform:scale(1,);-webkit-transition:all 0.3s;transition:all 0.3s}
+ul.mainmenu-nav li span.counter.empty {opacity:0;filter:alpha(opacity=0);-webkit-transform:scale(0,);-ms-transform:scale(0,);transform:scale(0,)}
+nav#layout-mainmenu {background-color:#000;padding:0 0 0 20px;line-height:0;white-space:nowrap;display:flex}
+nav#layout-mainmenu a {text-decoration:none}
+nav#layout-mainmenu a:focus {background:transparent}
+nav#layout-mainmenu ul {margin:0;padding:0;list-style:none;float:left;white-space:nowrap;overflow:hidden}
+nav#layout-mainmenu ul li {color:rgba(255,255,255,0.6);display:inline-block;vertical-align:top;position:relative;margin-right:30px}
+nav#layout-mainmenu ul li a {display:inline-block;font-size:14px;color:inherit;padding:14px 0 10px}
+nav#layout-mainmenu ul li a:hover {background-color:transparent}
+nav#layout-mainmenu ul li a:active,
+nav#layout-mainmenu ul li a:focus {text-decoration:none;color:rgba(255,255,255,0.6)}
+nav#layout-mainmenu ul li a i {line-height:1;font-size:30px;vertical-align:middle}
+nav#layout-mainmenu ul li a img.svg-icon {height:30px;width:30px;margin-right:10px;position:relative;top:0}
+nav#layout-mainmenu ul.nav {display:inline-block}
+nav#layout-mainmenu .toolbar-item {flex:1 1 auto;display:block;padding-right:0;overflow:hidden}
+nav#layout-mainmenu .toolbar-item-account {flex:0 0 auto}
+nav#layout-mainmenu .toolbar-item:before,
+nav#layout-mainmenu .toolbar-item:after {margin-top:0}
+nav#layout-mainmenu .toolbar-item:before {left:-12px}
+nav#layout-mainmenu .toolbar-item:after {right:-12px}
+nav#layout-mainmenu .toolbar-item.scroll-active-before:before {color:#fff}
+nav#layout-mainmenu .toolbar-item.scroll-active-after:after {color:#fff}
+nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-preview {margin:0 0 0 21px}
+nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-preview i {font-size:20px}
+nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-preview a {position:relative;padding:0 10px;top:-1px}
+nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account {margin-right:0}
+nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account >a {padding:0 15px 0 10px;font-size:13px;position:relative}
+nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account.highlight >a {z-index:600}
+nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account img.account-avatar {width:45px;height:45px}
+nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account .account-name {margin-right:15px}
+nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account ul {line-height:23px}
+html.svg nav#layout-mainmenu img.svg-icon,
+html.svg .mainmenu-collapsed img.svg-icon {display:inline-block}
+nav#layout-mainmenu ul li .mainmenu-accountmenu {position:fixed;top:0;right:20px;background:#f9f9f9;z-index:600;display:none;-webkit-box-shadow:0 1px 6px rgba(0,0,0,0.12),0 1px 4px rgba(0,0,0,0.24);box-shadow:0 1px 6px rgba(0,0,0,0.12),0 1px 4px rgba(0,0,0,0.24);border-radius:3px}
+nav#layout-mainmenu ul li .mainmenu-accountmenu.active {display:block}
+nav#layout-mainmenu ul li .mainmenu-accountmenu:after {content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-bottom:7px solid #f9f9f9;right:9px;top:-7px;position:absolute}
+nav#layout-mainmenu ul li .mainmenu-accountmenu ul {float:none;display:block;overflow:visible}
+nav#layout-mainmenu ul li .mainmenu-accountmenu li {padding:0;margin:0;font-weight:normal;text-align:left;display:block}
+nav#layout-mainmenu ul li .mainmenu-accountmenu li a {display:block;padding:10px 30px;text-align:left;font-size:14px;color:#666}
+nav#layout-mainmenu ul li .mainmenu-accountmenu li a:hover,
+nav#layout-mainmenu ul li .mainmenu-accountmenu li a:focus {background:#4ea5e0;color:#fff}
+nav#layout-mainmenu ul li .mainmenu-accountmenu li a:active {background:#3498db;color:#fff}
+nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:hover:after,
+nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:focus:after,
+nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:active:after {content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-bottom:7px solid #4ea5e0;position:absolute;right:9px;top:-7px;z-index:102}
+nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:active:after {content:'';display:block;width:0;height:0;border-left:8.5px solid transparent;border-right:8.5px solid transparent;border-bottom:7px solid #3498db}
+nav#layout-mainmenu ul li .mainmenu-accountmenu li.divider {height:1px;width:100%;background-color:#e0e0e0}
+nav#layout-mainmenu.navbar-mode-inline,
+nav#layout-mainmenu.navbar-mode-inline_no_icons {height:60px}
+nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-preview a,
+nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-toolbar li.mainmenu-preview a {height:60px;line-height:60px}
+nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-account >a,
+nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-toolbar li.mainmenu-account >a {height:60px;line-height:60px}
+nav#layout-mainmenu.navbar-mode-inline ul li .mainmenu-accountmenu,
+nav#layout-mainmenu.navbar-mode-inline_no_icons ul li .mainmenu-accountmenu {top:70px}
+nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li,
+nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li {margin:5px 0}
+nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a,
+nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li a {padding:10px 15px}
+nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a .nav-icon,
+nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li a .nav-icon {position:relative;top:-1px;margin-right:5px;width:30px;height:30px}
+nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a .nav-icon i,
+nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li a .nav-icon i,
+nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a .nav-icon img,
+nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li a .nav-icon img {margin:0}
+nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li a .nav-label,
+nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li a .nav-label {line-height:30px}
+nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li:first-child,
+nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li:first-child {margin-left:-13px}
+nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li:last-child,
+nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li:last-child {margin-right:0}
+nav#layout-mainmenu.navbar-mode-inline_no_icons .nav-icon {display:none !important}
+nav#layout-mainmenu.navbar-mode-tile {height:78px}
+nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-preview a {height:78px;line-height:78px}
+nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-account >a {height:78px;line-height:78px}
+nav#layout-mainmenu.navbar-mode-tile ul li .mainmenu-accountmenu {top:88px}
+nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a {position:relative;width:65px;height:65px}
+nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a .nav-icon {text-align:center;display:block;position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-26.5px;width:30px;height:30px}
+nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a .nav-icon i,
+nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a .nav-icon img {margin:0}
+nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a .nav-label {display:block;width:100px;height:20px;line-height:20px;position:absolute;bottom:4px;left:50%;padding:0 5px;margin-left:-50px;overflow:hidden;text-overflow:ellipsis;text-align:center}
+nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li {padding:0 15px;margin:7px 0 0}
+nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li:first-child {margin-left:-7px}
+nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li:hover .nav-label {width:auto;min-width:100px;text-overflow:all;overflow:visible;z-index:2}
+nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li.active:first-child {margin-left:0}
+nav#layout-mainmenu .menu-toggle {height:45px;line-height:45px;font-size:16px;display:none}
+nav#layout-mainmenu .menu-toggle .menu-toggle-icon {background:#333;display:inline-block;height:45px;line-height:45px;width:45px;text-align:center;opacity:.7}
+nav#layout-mainmenu .menu-toggle .menu-toggle-icon i {line-height:45px;font-size:20px;vertical-align:bottom}
+nav#layout-mainmenu .menu-toggle .menu-toggle-title {margin-left:10px}
+nav#layout-mainmenu .menu-toggle:hover .menu-toggle-icon {opacity:1}
+body.mainmenu-open nav#layout-mainmenu .menu-toggle-icon {opacity:1}
+nav#layout-mainmenu.navbar-mode-collapse {padding-left:0;height:45px}
+nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-preview a {height:45px;line-height:45px}
+nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-account >a {height:45px;line-height:45px}
+nav#layout-mainmenu.navbar-mode-collapse ul li .mainmenu-accountmenu {top:55px}
+nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-account >a {padding-right:0}
+nav#layout-mainmenu.navbar-mode-collapse ul li .mainmenu-accountmenu:after {right:13px}
+nav#layout-mainmenu.navbar-mode-collapse ul.nav {display:none}
+nav#layout-mainmenu.navbar-mode-collapse .menu-toggle {display:inline-block;color:#fff !important}
+@media (max-width:769px) {nav#layout-mainmenu.navbar {padding-left:0;height:45px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-preview a {height:45px;line-height:45px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account >a {height:45px;line-height:45px }nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu {top:55px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account >a {padding-right:0 }nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu:after {right:13px }nav#layout-mainmenu.navbar ul.nav {display:none }nav#layout-mainmenu.navbar .menu-toggle {display:inline-block;color:#fff !important }}
+.mainmenu-collapsed {position:absolute;height:100%;top:0;left:0;margin:0;background:#000}
+.mainmenu-collapsed >div {display:block;height:100%}
+.mainmenu-collapsed >div ul.mainmenu-nav li a {position:relative;width:65px;height:65px}
+.mainmenu-collapsed >div ul.mainmenu-nav li a .nav-icon {text-align:center;display:block;position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-26.5px;width:30px;height:30px}
+.mainmenu-collapsed >div ul.mainmenu-nav li a .nav-icon i,
+.mainmenu-collapsed >div ul.mainmenu-nav li a .nav-icon img {margin:0}
+.mainmenu-collapsed >div ul.mainmenu-nav li a .nav-label {display:block;width:100px;height:20px;line-height:20px;position:absolute;bottom:4px;left:50%;padding:0 5px;margin-left:-50px;overflow:hidden;text-overflow:ellipsis;text-align:center}
+.mainmenu-collapsed >div ul.mainmenu-nav li {padding:0 15px;margin:7px 0 0}
+.mainmenu-collapsed >div ul.mainmenu-nav li:first-child {margin-left:-7px}
+.mainmenu-collapsed >div ul.mainmenu-nav li:hover .nav-label {width:auto;min-width:100px;text-overflow:all;overflow:visible;z-index:2}
+.mainmenu-collapsed >div ul.mainmenu-nav li.active:first-child {margin-left:0}
+.mainmenu-collapsed >div ul.mainmenu-nav li:first-child {margin-left:0}
+.mainmenu-collapsed >div ul {margin:0;padding:5px 0 15px 15px;overflow:hidden}
+.mainmenu-collapsed >div ul li {color:rgba(255,255,255,0.6);display:inline-block;vertical-align:top;position:relative;margin-right:30px}
+.mainmenu-collapsed >div ul li a {display:inline-block;font-size:14px;color:inherit}
+.mainmenu-collapsed >div ul li a:hover {background-color:transparent}
+.mainmenu-collapsed >div ul li a:active,
+.mainmenu-collapsed >div ul li a:focus {text-decoration:none;color:rgba(255,255,255,0.6)}
+.mainmenu-collapsed >div ul li a i {line-height:1;font-size:30px;vertical-align:middle}
+.mainmenu-collapsed >div ul li a img.svg-icon {height:30px;width:30px;position:relative;top:0}
+.mainmenu-collapsed .scroll-marker {position:absolute;left:0;width:100%;height:10px;display:none}
+.mainmenu-collapsed .scroll-marker:after {font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;content:"\f141";display:block;position:absolute;left:50%;margin-left:-3px;top:0;height:9px;font-size:10px;color:rgba(255,255,255,0.6)}
+.mainmenu-collapsed .scroll-marker.before {top:0}
+.mainmenu-collapsed .scroll-marker.after {bottom:3px}
+.mainmenu-collapsed .scroll-marker.after:after {top:2px}
+.mainmenu-collapsed.scroll-before .scroll-marker.before {display:block}
+.mainmenu-collapsed.scroll-after .scroll-marker.after {display:block}
+body.mainmenu-open .mainmenu-collapsed ul {position:absolute;left:0;top:10px;bottom:10px}
+html.mobile .mainmenu-collapsed ul {overflow:auto;-webkit-overflow-scrolling:touch}
+nav#layout-mainmenu.navbar ul li:hover a:active,
+.mainmenu-collapsed li:hover a:active,
+nav#layout-mainmenu.navbar ul li:hover a:focus,
+.mainmenu-collapsed li:hover a:focus {color:#fff !important}
+.touch .mainmenu-collapsed li a:hover {color:rgba(255,255,255,0.6)}
+nav#layout-mainmenu.navbar ul li.highlight >a,
+.mainmenu-collapsed li.highlight >a {color:#fff !important}
+nav#layout-mainmenu.navbar ul li.active,
+.mainmenu-collapsed li.active {color:#fff !important}
+nav#layout-mainmenu.navbar ul li.active a,
+.mainmenu-collapsed li.active a {color:#fff !important}
+nav#layout-mainmenu.navbar ul li:hover,
+.mainmenu-collapsed li:hover {color:#fff;background:transparent}
+body.drag nav#layout-mainmenu.navbar ul.nav li:hover,
+body.drag .mainmenu-collapsed ul li:hover {color:rgba(255,255,255,0.6)}
+.layout-sidenav-container {width:120px}
+#layout-sidenav {position:absolute;height:100%;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:14px}
+#layout-sidenav ul {position:relative;margin:0;padding:0;height:100%;overflow:hidden}
+#layout-sidenav ul li {display:block;text-align:center;position:relative}
+#layout-sidenav ul li a {padding:1.429em .714em;display:block;font-size:.929em;color:rgba(255,255,255,0.6);font-weight:normal;position:relative}
+#layout-sidenav ul li a:hover {text-decoration:none;background-color:transparent}
+#layout-sidenav ul li a:focus {background:transparent}
+#layout-sidenav ul li a i {color:rgba(255,255,255,0.6);display:block;margin-bottom:5px;font-size:2em}
+#layout-sidenav ul li:first-child a {padding-top:2.143em}
+#layout-sidenav ul li.active a,
+#layout-sidenav ul li a:hover {color:#fff}
+#layout-sidenav ul li.active a i,
+#layout-sidenav ul li a:hover i {color:#fff}
+#layout-sidenav ul li span.counter {display:block;position:absolute;top:1.071em;right:1.071em;padding:.143em .429em .214em .286em;background-color:#d9350f;color:#fff;font-size:.786em;line-height:100%;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;opacity:1;filter:alpha(opacity=100);-webkit-transform:scale(1,);-ms-transform:scale(1,);transform:scale(1,);-webkit-transition:all 0.3s;transition:all 0.3s}
+#layout-sidenav ul li span.counter.empty {opacity:0;filter:alpha(opacity=0);-webkit-transform:scale(0,);-ms-transform:scale(0,);transform:scale(0,)}
+@media (min-width:768px) and (max-width:991px) {#layout-sidenav {font-size:12px }.layout-sidenav-container {width:100px }}
+@media (max-width:767px) {#layout-sidenav {font-size:10px }.layout-sidenav-container {width:80px }}
+html.mobile #layout-sidenav ul {overflow:auto;-webkit-overflow-scrolling:touch}
+#layout-sidenav.layout-sidenav ul.drag li:not(.active) a:hover,
+.touch #layout-sidenav.layout-sidenav li:not(.active) a:hover {color:rgba(255,255,255,0.6) !important}
+#layout-sidenav.layout-sidenav ul.drag li:not(.active) a:hover i,
+.touch #layout-sidenav.layout-sidenav li:not(.active) a:hover i {color:rgba(255,255,255,0.6) !important}
+#layout-sidenav.layout-sidenav ul.drag li:not(.active) a:hover:after,
+.touch #layout-sidenav.layout-sidenav li:not(.active) a:hover:after {display:none !important}
+#layout-side-panel .fix-button {position:absolute;right:-25px;top:0;display:none;width:25px;height:25px;font-size:13px;background:#ecf0f1;z-index:120;opacity:0.5;filter:alpha(opacity=50);-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}
+#layout-side-panel .fix-button i {display:block;text-align:center;margin-top:5px;color:#aaa}
+#layout-side-panel .fix-button:hover {text-decoration:none;display:block;opacity:1 !important;filter:alpha(opacity=100) !important}
+#layout-side-panel:hover .fix-button {display:block}
+#layout-side-panel .fix-button-content-header .fix-button {top:46px}
+#layout-side-panel .sidepanel-content-header {background:#d35400;color:white;font-size:15px;padding:12px 20px 13px;position:relative}
+#layout-side-panel .sidepanel-content-header:after {content:'';display:block;width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:8px solid #d35400;border-bottom-width:0;position:absolute;left:14px;bottom:-8px}
+body.side-panel-not-fixed #layout-side-panel {display:none}
+body.side-panel-not-fixed #layout-side-panel .fix-button {opacity:0.5;filter:alpha(opacity=50)}
+body.display-side-panel #layout-side-panel {display:block;position:absolute;z-index:600;width:350px;-webkit-box-shadow:3px 0 3px 0 rgba(0,0,0,0.1);box-shadow:3px 0 3px 0 rgba(0,0,0,0.1)}
+@media (min-width:992px) {body.side-panel-fix-shadow #layout-side-panel {-webkit-box-shadow:none;box-shadow:none }}
+.touch #layout-side-panel .fix-button {display:none}
+@media (max-width:768px) {#layout-side-panel .fix-button {display:none }}
+#layout-footer {width:100%;z-index:100;height:60px;position:fixed;bottom:0;color:#666;background-color:rgba(255,255,255,0.8);border-top:1px solid #dfdfdf}
+#layout-footer .brand,
+#layout-footer .tagline {margin:10px;height:40px;line-height:40px}
+#layout-footer .brand {float:left;font-size:16px}
+#layout-footer .brand .logo {margin:0 10px}
+#layout-footer .tagline {float:right}
+#layout-footer .tagline p {color:#999}
+body.outer {background:#2b3e50}
+body.outer .layout >.layout-row.layout-head {text-align:center;background:#f9f9f9}
+body.outer .layout >.layout-row.layout-head >.layout-cell {height:40%;padding:50px 0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;vertical-align:middle;position:relative}
+body.outer .layout >.layout-row.layout-head >.layout-cell:after {content:'';display:block;width:0;height:0;border-left:28px solid transparent;border-right:28px solid transparent;border-top:20px solid #f9f9f9;border-bottom-width:0;position:absolute;bottom:-20px;left:50%;margin-left:-28px}
+body.outer .layout >.layout-row.layout-head >.layout-cell h1.oc-logo {font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;display:inline-block;width:100%;max-width:450px;height:170px;min-height:72px}
+body.outer .layout >.layout-row >.layout-cell {vertical-align:top}
+body.outer .layout >.layout-row >.layout-cell .outer-form-container {margin:0 auto;width:436px;padding:40px 0}
+body.outer .layout >.layout-row >.layout-cell .outer-form-container h2 {font-size:18px;margin:20px 0;color:#feffff}
+body.outer .layout >.layout-row >.layout-cell .outer-form-container .horizontal-form {font-size:0;display:-webkit-box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:-ms-flex;display:flex}
+body.outer .layout >.layout-row >.layout-cell .outer-form-container .horizontal-form input {vertical-align:top;margin-right:9px;display:inline-block;border:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}
+body.outer .layout >.layout-row >.layout-cell .outer-form-container .horizontal-form button {background:#0181b9;text-align:center;font-size:13px;font-weight:600;height:40px;vertical-align:top;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}
+body.outer .layout >.layout-row >.layout-cell .outer-form-container .remember label {color:rgba(255,255,255,0.44)}
+body.outer .layout >.layout-row >.layout-cell .outer-form-container .remember input#remember {display:none}
+body.outer .layout >.layout-row >.layout-cell .outer-form-container .forgot-password {margin-top:30px;font-size:13px;top:8px}
+body.outer .layout >.layout-row >.layout-cell .outer-form-container .forgot-password a {color:rgba(255,255,255,0.44)}
+body.outer .layout >.layout-row >.layout-cell .outer-form-container .forgot-password:before {color:rgba(255,255,255,0.44);font-size:14px;position:relative;margin-right:5px}
+html.csstransitions body.outer .outer-form-container {-webkit-transition:all 0.5s ease-out;transition:all 0.5s ease-out;-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1)}
+html.csstransitions body.outer.preload .outer-form-container {-webkit-transform:scale(0.2,0.2);-moz-transform:scale(0.2,0.2);-ms-transform:scale(0.2,0.2);-o-transform:scale(0.2,0.2);transform:scale(0.2,0.2)}
+@media (max-width:768px) {body.outer .layout >.layout-row.layout-head >.layout-cell {padding:50px 20px }body.outer .layout >.layout-row >.layout-cell .outer-form-container {width:auto;padding:40px }body.outer .layout >.layout-row >.layout-cell .outer-form-container .horizontal-form {display:block }body.outer .layout >.layout-row >.layout-cell .outer-form-container .horizontal-form input {display:block;width:100% !important;margin-bottom:20px }}
+body.breadcrumb-fancy .control-breadcrumb,
+.control-breadcrumb.breadcrumb-fancy {margin-bottom:0;background-color:#e67e22}
+body.breadcrumb-fancy .control-breadcrumb li,
+.control-breadcrumb.breadcrumb-fancy li {background-color:#d35400;color:rgba(255,255,255,0.5)}
+body.breadcrumb-fancy .control-breadcrumb li a,
+.control-breadcrumb.breadcrumb-fancy li a {opacity:.5;-webkit-transition:all 0.3s ease;transition:all 0.3s ease}
+body.breadcrumb-fancy .control-breadcrumb li a:hover,
+.control-breadcrumb.breadcrumb-fancy li a:hover {opacity:1}
+body.breadcrumb-fancy .control-breadcrumb li:before,
+.control-breadcrumb.breadcrumb-fancy li:before {border-left-color:#fff;opacity:.5}
+body.breadcrumb-fancy .control-breadcrumb li:after,
+.control-breadcrumb.breadcrumb-fancy li:after {border-left-color:#d35400}
+body.breadcrumb-fancy .control-breadcrumb li:last-child,
+.control-breadcrumb.breadcrumb-fancy li:last-child {background-color:#d35400}
+body.breadcrumb-fancy .control-breadcrumb li:last-child:before,
+.control-breadcrumb.breadcrumb-fancy li:last-child:before {opacity:1;border-left-color:#d35400}
+.fancy-layout .tab-collapse-icon {position:absolute;display:block;text-decoration:none;outline:none;opacity:0.6;filter:alpha(opacity=60);-webkit-transition:all 0.3s;transition:all 0.3s;font-size:12px;color:#fff;right:11px}
+.fancy-layout .tab-collapse-icon:hover {text-decoration:none;opacity:1;filter:alpha(opacity=100)}
+.fancy-layout .tab-collapse-icon.primary {color:#475354;bottom:-25px;z-index:100;-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}
+.fancy-layout .tab-collapse-icon.primary i {position:relative;display:block}
+.fancy-layout .control-tabs.master-tabs,
+.fancy-layout.control-tabs.master-tabs {overflow:hidden}
+.fancy-layout .control-tabs.master-tabs:before,
+.fancy-layout.control-tabs.master-tabs:before,
+.fancy-layout .control-tabs.master-tabs:after,
+.fancy-layout.control-tabs.master-tabs:after {top:13px;font-size:14px;color:rgba(255,255,255,0.35)}
+.fancy-layout .control-tabs.master-tabs:before,
+.fancy-layout.control-tabs.master-tabs:before {left:8px}
+.fancy-layout .control-tabs.master-tabs:after,
+.fancy-layout.control-tabs.master-tabs:after {right:8px}
+.fancy-layout .control-tabs.master-tabs.scroll-before:before,
+.fancy-layout.control-tabs.master-tabs.scroll-before:before {color:#fff}
+.fancy-layout .control-tabs.master-tabs.scroll-after:after,
+.fancy-layout.control-tabs.master-tabs.scroll-after:after {color:#fff}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container {background:#d35400;padding-left:20px;padding-right:20px}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs {margin-left:-8px}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li {margin-left:-5px;top:1px;padding-top:3px}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li span.tab-close,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li span.tab-close {top:14px;right:-3px;left:auto;z-index:110;font-family:sans-serif}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li span.tab-close i,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li span.tab-close i {top:4px;right:1px;color:rgba(255,255,255,0.3) !important;font-style:normal;font-weight:bold;font-size:16px}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li span.tab-close i:hover,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li span.tab-close i:hover {color:#fff !important}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a {border-bottom:none;background:transparent;font-size:14px;color:rgba(255,255,255,0.35);padding:6px 0 0 24px!important;overflow:visible}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a >span.title,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a >span.title {position:relative;display:inline-block;padding:12px 5px 0 5px;height:38px;font-size:14px;z-index:100;background-color:#b9530f}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a >span.title:before,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a >span.title:before,
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a >span.title:after,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a >span.title:after {content:' ';position:absolute;width:20px;display:block;height:37px;top:0;z-index:100;background-color:#b9530f}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a >span.title:before,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a >span.title:before {left:-14px;-webkit-border-radius:8px 0 0 0;-moz-border-radius:8px 0 0 0;border-radius:8px 0 0 0;-webkit-transform:skewX(-20deg);-ms-transform:skewX(-20deg);transform:skewX(-20deg)}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a >span.title:after,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a >span.title:after {right:-14px;-webkit-border-radius:0 8px 0 0;-moz-border-radius:0 8px 0 0;border-radius:0 8px 0 0;-webkit-transform:skewX(20deg);-ms-transform:skewX(20deg);transform:skewX(20deg)}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a >span.title span,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a >span.title span {border-top:none;padding:0;margin-top:0;overflow:visible}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a:before,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a:before {z-index:110;position:absolute;top:18px;left:22px}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a[class*=icon] >span.title,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li a[class*=icon] >span.title {padding-left:18px}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li.active a,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li.active a {z-index:107;color:#fff}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li.active span.tab-close i,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li.active span.tab-close i {color:#fff}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li.active a >span.title,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li.active a >span.title {background-color:#e67e22;z-index:105}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li.active a >span.title:before,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li.active a >span.title:before {z-index:107;background-color:#e67e22}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li.active a >span.title:after,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li.active a >span.title:after {background-color:#e67e22;z-index:107}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li[data-modified] span.tab-close i,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li[data-modified] span.tab-close i {top:5px;font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li[data-modified] span.tab-close i:before,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li[data-modified] span.tab-close i:before {font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;content:"\f111";font-size:9px}
+.fancy-layout .control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li:first-child,
+.fancy-layout.control-tabs.master-tabs >div >div.tabs-container >ul.nav-tabs >li:first-child {margin-left:0}
+.fancy-layout .control-tabs.master-tabs[data-closable] >div >div.tabs-container >ul.nav-tabs >li a >span.title,
+.fancy-layout.control-tabs.master-tabs[data-closable] >div >div.tabs-container >ul.nav-tabs >li a >span.title {padding-right:10px}
+.fancy-layout .control-tabs.master-tabs.has-tabs:before,
+.fancy-layout.control-tabs.master-tabs.has-tabs:before,
+.fancy-layout .control-tabs.master-tabs.has-tabs:after,
+.fancy-layout.control-tabs.master-tabs.has-tabs:after {display:block}
+.fancy-layout .control-tabs.secondary-tabs:before,
+.fancy-layout.control-tabs.secondary-tabs:before {left:5px}
+.fancy-layout .control-tabs.secondary-tabs:after,
+.fancy-layout.control-tabs.secondary-tabs:after {right:5px}
+.fancy-layout .control-tabs.secondary-tabs >div >ul.nav-tabs,
+.fancy-layout.control-tabs.secondary-tabs >div >ul.nav-tabs {background:#475354}
+.fancy-layout .control-tabs.secondary-tabs >div >ul.nav-tabs >li,
+.fancy-layout.control-tabs.secondary-tabs >div >ul.nav-tabs >li {border-right:none;padding-right:0;margin-right:0}
+.fancy-layout .control-tabs.secondary-tabs >div >ul.nav-tabs >li a,
+.fancy-layout.control-tabs.secondary-tabs >div >ul.nav-tabs >li a {background:transparent;border:none;padding:12px 10px 13px 10px;font-size:14px;font-weight:normal;line-height:14px;color:#919898}
+.fancy-layout .control-tabs.secondary-tabs >div >ul.nav-tabs >li a span span,
+.fancy-layout.control-tabs.secondary-tabs >div >ul.nav-tabs >li a span span {overflow:visible;border-top:none;margin-top:0;padding-top:0}
+.fancy-layout .control-tabs.secondary-tabs >div >ul.nav-tabs >li:first-child,
+.fancy-layout.control-tabs.secondary-tabs >div >ul.nav-tabs >li:first-child {padding-left:15px}
+.fancy-layout .control-tabs.secondary-tabs >div >ul.nav-tabs >li.active a,
+.fancy-layout.control-tabs.secondary-tabs >div >ul.nav-tabs >li.active a {color:#fff}
+.fancy-layout .control-tabs.secondary-tabs .tab-collapse-icon,
+.fancy-layout.control-tabs.secondary-tabs .tab-collapse-icon {position:absolute;display:block;text-decoration:none;outline:none;opacity:0.6;filter:alpha(opacity=60);-webkit-transition:all 0.3s;transition:all 0.3s;font-size:12px;color:#fff;right:11px}
+.fancy-layout .control-tabs.secondary-tabs .tab-collapse-icon:hover,
+.fancy-layout.control-tabs.secondary-tabs .tab-collapse-icon:hover {text-decoration:none;opacity:1;filter:alpha(opacity=100)}
+.fancy-layout .control-tabs.secondary-tabs .tab-collapse-icon.primary,
+.fancy-layout.control-tabs.secondary-tabs .tab-collapse-icon.primary {color:#475354;bottom:-25px;z-index:100;-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}
+.fancy-layout .control-tabs.secondary-tabs .tab-collapse-icon.primary i,
+.fancy-layout.control-tabs.secondary-tabs .tab-collapse-icon.primary i {position:relative;display:block}
+.fancy-layout .control-tabs.secondary-tabs .tab-collapse-icon.primary,
+.fancy-layout.control-tabs.secondary-tabs .tab-collapse-icon.primary {color:#fff;top:12px;right:11px;bottom:auto}
+.fancy-layout .control-tabs.secondary-tabs.primary-collapsed .tab-collapse-icon.primary,
+.fancy-layout.control-tabs.secondary-tabs.primary-collapsed .tab-collapse-icon.primary {-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-ms-transform:scale(1,1);-o-transform:scale(1,1);transform:scale(1,1)}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs {background:#f9f9f9}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li {margin-left:-19px}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li:first-child,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li:first-child {margin-left:0;padding-left:8px}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a {padding:8px 16px 0 16px;font-weight:400;height:36px;color:#2b3e50;opacity:0.6;filter:alpha(opacity=60)}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a >span.title,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a >span.title {position:relative;display:inline-block;padding:8px 5px 9px 5px;font-size:14px;z-index:100;height:27px !important;background-color:transparent}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a >span.title:before,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a >span.title:before,
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a >span.title:after,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a >span.title:after {content:' ';position:absolute;background-color:white;width:15px;height:28px;top:0;z-index:100;display:none}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a >span.title:before,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a >span.title:before {left:-11px;-webkit-border-radius:8px 0 0 0;-moz-border-radius:8px 0 0 0;border-radius:8px 0 0 0;-webkit-transform:skewX(-20deg);-ms-transform:skewX(-20deg);transform:skewX(-20deg)}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a >span.title:after,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a >span.title:after {right:-11px;-webkit-border-radius:0 8px 0 0;-moz-border-radius:0 8px 0 0;border-radius:0 8px 0 0;-webkit-transform:skewX(20deg);-ms-transform:skewX(20deg);transform:skewX(20deg)}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a >span.title span,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li a >span.title span {height:18px;font-size:14px}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li.active a,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li.active a {opacity:1;filter:alpha(opacity=100)}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li.active a >span.title,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li.active a >span.title {background-color:white}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li.active a >span.title:before,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li.active a >span.title:before,
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li.active a >span.title:after,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs >div >ul.nav-tabs >li.active a >span.title:after {display:block}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs .tab-collapse-icon.primary,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs .tab-collapse-icon.primary {color:#808c8d}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed .tab-collapse-icon.primary,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed .tab-collapse-icon.primary {color:white}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed >div >ul.nav-tabs,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed >div >ul.nav-tabs {background:#e67e22}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed >div >ul.nav-tabs >li a,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed >div >ul.nav-tabs >li a {color:white}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed >div >ul.nav-tabs >li a >span.title:before,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed >div >ul.nav-tabs >li a >span.title:before,
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed >div >ul.nav-tabs >li a >span.title:after,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed >div >ul.nav-tabs >li a >span.title:after {background-color:white}
+.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed >div >ul.nav-tabs >li.active a,
+.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed >div >ul.nav-tabs >li.active a {color:#2b3e50}
+.fancy-layout .control-tabs.primary-tabs.master-area >div >ul.nav-tabs,
+.fancy-layout.control-tabs.primary-tabs.master-area >div >ul.nav-tabs {-webkit-transition:background-color 0.5s;transition:background-color 0.5s;background:#e67e22}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs {background:#7f8c8d;margin-left:0 !important;margin-right:0 !important}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs:before,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs:before {display:none}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li {background:transparent;border-right:none;margin-right:-8px}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li:first-child,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li:first-child {margin-left:-5px}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li a,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li a {background:transparent;border:none;padding:12px 16px 0;font-size:14px;font-weight:400;color:#95a5a6}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li a span.title,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li a span.title {background:#d5d9d8;border-top:none;padding:5px 5px 3px 5px}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li a span.title:before,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li a span.title:before,
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li a span.title:after,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li a span.title:after {background:#d5d9d8;border-width:0;top:0}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li a span.title:before,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li a span.title:before {left:-20px}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li a span.title:after,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li a span.title:after {right:-20px}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li a span.title span,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li a span.title span {border-width:0;vertical-align:top}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li.active a,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li.active a {color:#808c8d}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li.active a:before,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li.active a:before {display:none}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li.active a span.title,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li.active a span.title {background:#fafafa}
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li.active a span.title:before,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li.active a span.title:before,
+.fancy-layout .control-tabs.primary-tabs >div >ul.nav-tabs >li.active a span.title:after,
+.fancy-layout.control-tabs.primary-tabs >div >ul.nav-tabs >li.active a span.title:after {background:#fafafa}
+.fancy-layout .control-tabs.primary-tabs >.tab-content >.tab-pane,
+.fancy-layout.control-tabs.primary-tabs >.tab-content >.tab-pane {padding:20px 20px 0 20px}
+.fancy-layout .control-tabs.primary-tabs >.tab-content >.tab-pane.pane-compact,
+.fancy-layout.control-tabs.primary-tabs >.tab-content >.tab-pane.pane-compact {padding:0}
+.fancy-layout .control-tabs.primary-tabs.collapsed,
+.fancy-layout.control-tabs.primary-tabs.collapsed {display:none}
+.fancy-layout .control-tabs.has-tabs >div.tab-content,
+.fancy-layout.control-tabs.has-tabs >div.tab-content {background:#f9f9f9}
+.fancy-layout .control-tabs >div.tab-content >div.tab-pane,
+.fancy-layout.control-tabs >div.tab-content >div.tab-pane {padding:0}
+.fancy-layout .control-tabs >div.tab-content >div.tab-pane.padded-pane,
+.fancy-layout.control-tabs >div.tab-content >div.tab-pane.padded-pane {padding:20px 20px 0 20px}
+.fancy-layout .form-tabless-fields {position:relative;background:#e67e22;padding:18px 23px 0 23px;-webkit-transition:all 0.5s;transition:all 0.5s}
+.fancy-layout .form-tabless-fields:before,
+.fancy-layout .form-tabless-fields:after {content:" ";display:table}
+.fancy-layout .form-tabless-fields:after {clear:both}
+.fancy-layout .form-tabless-fields label {text-transform:uppercase;color:rgba(255,255,255,0.5);margin-bottom:0}
+.fancy-layout .form-tabless-fields input[type=text] {background:transparent;border:none;color:#fff;font-size:35px;font-weight:100;height:auto;padding:0;-webkit-box-shadow:none;box-shadow:none}
+.fancy-layout .form-tabless-fields input[type=text]::-moz-placeholder {color:rgba(255,255,255,0.5);opacity:1}
+.fancy-layout .form-tabless-fields input[type=text]:-ms-input-placeholder {color:rgba(255,255,255,0.5)}
+.fancy-layout .form-tabless-fields input[type=text]::-webkit-input-placeholder {color:rgba(255,255,255,0.5)}
+.fancy-layout .form-tabless-fields input[type=text]:focus,
+.fancy-layout .form-tabless-fields input[type=text]:hover {background-color:rgba(255,255,255,0.1)}
+.fancy-layout .form-tabless-fields .form-group {padding-bottom:0}
+.fancy-layout .form-tabless-fields .form-group.is-required >label:after {display:none}
+.fancy-layout .form-tabless-fields .tab-collapse-icon {position:absolute;display:block;text-decoration:none;outline:none;opacity:0.6;filter:alpha(opacity=60);-webkit-transition:all 0.3s;transition:all 0.3s;font-size:12px;color:#fff;right:11px}
+.fancy-layout .form-tabless-fields .tab-collapse-icon:hover {text-decoration:none;opacity:1;filter:alpha(opacity=100)}
+.fancy-layout .form-tabless-fields .tab-collapse-icon.primary {color:#475354;bottom:-25px;z-index:100;-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}
+.fancy-layout .form-tabless-fields .tab-collapse-icon.primary i {position:relative;display:block}
+.fancy-layout .form-tabless-fields .tab-collapse-icon.tabless {top:14px}
+.fancy-layout .form-tabless-fields.collapsed {padding:5px 23px 0 10px}
+.fancy-layout .form-tabless-fields.collapsed .tab-collapse-icon.tabless {-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}
+.fancy-layout .form-tabless-fields.collapsed .form-group:not(.collapse-visible) {display:none}
+.fancy-layout .form-tabless-fields.collapsed .form-buttons {margin-left:10px;padding-bottom:0}
+.fancy-layout .form-tabless-fields .loading-indicator-container .loading-indicator {background-color:#e67e22;padding:0 0 0 30px;color:rgba(255,255,255,0.5);margin-top:1px;height:90%;font-size:12px;line-height:100%}
+.fancy-layout .form-tabless-fields .loading-indicator-container .loading-indicator >span {left:-10px;top:18px}
+.fancy-layout .form-buttons {-webkit-transition:all 0.5s;transition:all 0.5s;padding-top:14px;padding-bottom:5px}
+.fancy-layout .form-buttons .btn {padding:0;margin-right:5px;margin-top:-6px;margin-right:30px;background:transparent;color:#fff;font-weight:normal;-webkit-box-shadow:none;box-shadow:none;opacity:0.5;filter:alpha(opacity=50);-webkit-transition:all 0.3s ease;transition:all 0.3s ease}
+.fancy-layout .form-buttons .btn:hover {opacity:1;filter:alpha(opacity=100)}
+.fancy-layout .form-buttons .btn:last-child {margin-right:0}
+.fancy-layout .form-buttons .btn[class^="oc-icon-"]:before,
+.fancy-layout .form-buttons .btn[class*=" oc-icon-"]:before {opacity:1}
+.fancy-layout form.oc-data-changed .btn.save {opacity:1;filter:alpha(opacity=100)}
+.fancy-layout .field-codeeditor {border:none !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
+.fancy-layout .field-codeeditor .editor-code {-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
+.fancy-layout .field-richeditor {border:none;border-left:1px solid #d1d6d9 !important}
+.fancy-layout .field-richeditor,
+.fancy-layout .field-richeditor .fr-toolbar,
+.fancy-layout .field-richeditor .fr-wrapper {-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-top-right-radius:0;border-top-left-radius:0}
+.fancy-layout .secondary-content-tabs .field-richeditor .fr-toolbar {background:white}
+body.side-panel-not-fixed .fancy-layout .field-richeditor {border-left:none}
+html.cssanimations .fancy-layout .form-tabless-fields .loading-indicator-container .loading-indicator >span {-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite;background-image:url('../../../system/assets/ui/images/loader-white.svg');background-size:20px 20px}
+html.gecko .fancy-layout .control-tabs.secondary-tabs >div >ul.nav-tabs >li.active a {padding-top:13px}
+.flyout-container >.flyout {overflow:hidden;width:0;left:0 !important;-webkit-transition:width 0.1s;transition:width 0.1s}
+.flyout-overlay {width:100%;height:100%;top:0;z-index:5000;position:absolute;background-color:rgba(0,0,0,0);-webkit-transition:background-color 0.3s;transition:background-color 0.3s}
+.flyout-toggle {position:absolute;top:20px;left:0;width:23px;height:25px;background:#2b3e50;cursor:pointer;border-bottom-right-radius:4px;border-top-right-radius:4px;color:#bdc3c7;font-size:10px}
+.flyout-toggle i {margin:7px 0 0 6px;display:inline-block}
+.flyout-toggle:hover i {color:#fff}
+body.flyout-visible {overflow:hidden}
+body.flyout-visible .flyout-overlay {background-color:rgba(0,0,0,0.3)}
\ No newline at end of file
diff --git a/modules/backend/assets/js/auth/uninstall-sw.js b/modules/backend/assets/js/auth/uninstall-sw.js
new file mode 100644
index 0000000..eb48b39
--- /dev/null
+++ b/modules/backend/assets/js/auth/uninstall-sw.js
@@ -0,0 +1,10 @@
+// Only run on HTTPS connections
+if (location.protocol === 'https:') {
+ // Unregister all service workers before signing in to prevent cache issues
+ navigator.serviceWorker.getRegistrations().then(
+ function(registrations) {
+ for (let registration of registrations) {
+ registration.unregister();
+ }
+ });
+}
\ No newline at end of file
diff --git a/modules/backend/assets/js/october-min.js b/modules/backend/assets/js/october-min.js
index 7f04f1a..41cba97 100644
--- a/modules/backend/assets/js/october-min.js
+++ b/modules/backend/assets/js/october-min.js
@@ -36,145 +36,211 @@ return(document.cookie=[encode(key),'=',stringifyCookieValue(value),options.expi
var result=key?undefined:{};var cookies=document.cookie?document.cookie.split('; '):[];for(var i=0,l=cookies.length;i1?_len-1:0),_key=1;_key<_len;_key++){args[_key-1]=arguments[_key];}
+for(var _iterator=callbacks,_isArray=true,_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;){var _ref;if(_isArray){if(_i>=_iterator.length)break;_ref=_iterator[_i++];}else{_i=_iterator.next();if(_i.done)break;_ref=_i.value;}
+var callback=_ref;callback.apply(this,args);}}
+return this;}},{key:"off",value:function off(event,fn){if(!this._callbacks||arguments.length===0){this._callbacks={};return this;}
+var callbacks=this._callbacks[event];if(!callbacks){return this;}
if(arguments.length===1){delete this._callbacks[event];return this;}
-for(i=_i=0,_len=callbacks.length;_i<_len;i=++_i){callback=callbacks[i];if(callback===fn){callbacks.splice(i,1);break;}}
-return this;};return Emitter;})();Dropzone=(function(_super){var extend,resolveOption;__extends(Dropzone,_super);Dropzone.prototype.Emitter=Emitter;Dropzone.prototype.events=["drop","dragstart","dragend","dragenter","dragover","dragleave","addedfile","removedfile","thumbnail","error","errormultiple","processing","processingmultiple","uploadprogress","totaluploadprogress","sending","sendingmultiple","success","successmultiple","canceled","canceledmultiple","complete","completemultiple","reset","maxfilesexceeded","maxfilesreached","queuecomplete"];Dropzone.prototype.defaultOptions={url:null,method:"post",withCredentials:false,parallelUploads:2,uploadMultiple:false,maxFilesize:256,paramName:"file",createImageThumbnails:true,maxThumbnailFilesize:10,thumbnailWidth:120,thumbnailHeight:120,filesizeBase:1000,maxFiles:null,filesizeBase:1000,params:{},clickable:true,ignoreHiddenFiles:true,acceptedFiles:null,acceptedMimeTypes:null,autoProcessQueue:true,autoQueue:true,addRemoveLinks:false,previewsContainer:null,capture:null,dictDefaultMessage:"Drop files here to upload",dictFallbackMessage:"Your browser does not support drag'n'drop file uploads.",dictFallbackText:"Please use the fallback form below to upload your files like in the olden days.",dictFileTooBig:"File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.",dictInvalidFileType:"You can't upload files of this type.",dictResponseError:"Server responded with {{statusCode}} code.",dictCancelUpload:"Cancel upload",dictCancelUploadConfirmation:"Are you sure you want to cancel this upload?",dictRemoveFile:"Remove file",dictRemoveFileConfirmation:null,dictMaxFilesExceeded:"You can not upload any more files.",accept:function(file,done){return done();},init:function(){return noop;},forceFallback:false,fallback:function(){var child,messageElement,span,_i,_len,_ref;this.element.className=""+this.element.className+" dz-browser-not-supported";_ref=this.element.getElementsByTagName("div");for(_i=0,_len=_ref.length;_i<_len;_i++){child=_ref[_i];if(/(^| )dz-message($| )/.test(child.className)){messageElement=child;child.className="dz-message";continue;}}
+for(var i=0;i=_iterator2.length)break;_ref2=_iterator2[_i2++];}else{_i2=_iterator2.next();if(_i2.done)break;_ref2=_i2.value;}
+var child=_ref2;if(/(^| )dz-message($| )/.test(child.className)){messageElement=child;child.className="dz-message";break;}}
if(!messageElement){messageElement=Dropzone.createElement("
");this.element.appendChild(messageElement);}
-span=messageElement.getElementsByTagName("span")[0];if(span){span.textContent=this.options.dictFallbackMessage;}
-return this.element.appendChild(this.getFallbackForm());},resize:function(file){var info,srcRatio,trgRatio;info={srcX:0,srcY:0,srcWidth:file.width,srcHeight:file.height};srcRatio=file.width/file.height;info.optWidth=this.options.thumbnailWidth;info.optHeight=this.options.thumbnailHeight;if((info.optWidth==null)&&(info.optHeight==null)){info.optWidth=info.srcWidth;info.optHeight=info.srcHeight;}else if(info.optWidth==null){info.optWidth=srcRatio*info.optHeight;}else if(info.optHeight==null){info.optHeight=(1/srcRatio)*info.optWidth;}
-trgRatio=info.optWidth/info.optHeight;if(file.heighttrgRatio){info.srcHeight=file.height;info.srcWidth=info.srcHeight*trgRatio;}else{info.srcWidth=file.width;info.srcHeight=info.srcWidth/trgRatio;}}
-info.srcX=(file.width-info.srcWidth)/2;info.srcY=(file.height-info.srcHeight)/2;return info;},drop:function(e){return this.element.classList.remove("dz-drag-hover");},dragstart:noop,dragend:function(e){return this.element.classList.remove("dz-drag-hover");},dragenter:function(e){return this.element.classList.add("dz-drag-hover");},dragover:function(e){return this.element.classList.add("dz-drag-hover");},dragleave:function(e){return this.element.classList.remove("dz-drag-hover");},paste:noop,reset:function(){return this.element.classList.remove("dz-started");},addedfile:function(file){var node,removeFileEvent,removeLink,_i,_j,_k,_len,_len1,_len2,_ref,_ref1,_ref2,_results;if(this.element===this.previewsContainer){this.element.classList.add("dz-started");}
-if(this.previewsContainer){file.previewElement=Dropzone.createElement(this.options.previewTemplate.trim());file.previewTemplate=file.previewElement;this.previewsContainer.appendChild(file.previewElement);_ref=file.previewElement.querySelectorAll("[data-dz-name]");for(_i=0,_len=_ref.length;_i<_len;_i++){node=_ref[_i];node.textContent=file.name;}
-_ref1=file.previewElement.querySelectorAll("[data-dz-size]");for(_j=0,_len1=_ref1.length;_j<_len1;_j++){node=_ref1[_j];node.innerHTML=this.filesize(file.size);}
+var span=messageElement.getElementsByTagName("span")[0];if(span){if(span.textContent!=null){span.textContent=this.options.dictFallbackMessage;}else if(span.innerText!=null){span.innerText=this.options.dictFallbackMessage;}}
+return this.element.appendChild(this.getFallbackForm());},resize:function resize(file,width,height,resizeMethod){var info={srcX:0,srcY:0,srcWidth:file.width,srcHeight:file.height};var srcRatio=file.width/file.height;if(width==null&&height==null){width=info.srcWidth;height=info.srcHeight;}else if(width==null){width=height*srcRatio;}else if(height==null){height=width/srcRatio;}
+width=Math.min(width,info.srcWidth);height=Math.min(height,info.srcHeight);var trgRatio=width/height;if(info.srcWidth>width||info.srcHeight>height){if(resizeMethod==='crop'){if(srcRatio>trgRatio){info.srcHeight=file.height;info.srcWidth=info.srcHeight*trgRatio;}else{info.srcWidth=file.width;info.srcHeight=info.srcWidth/trgRatio;}}else if(resizeMethod==='contain'){if(srcRatio>trgRatio){height=width/srcRatio;}else{width=height*srcRatio;}}else{throw new Error("Unknown resizeMethod '"+resizeMethod+"'");}}
+info.srcX=(file.width-info.srcWidth)/2;info.srcY=(file.height-info.srcHeight)/2;info.trgWidth=width;info.trgHeight=height;return info;},transformFile:function transformFile(file,done){if((this.options.resizeWidth||this.options.resizeHeight)&&file.type.match(/image.*/)){return this.resizeImage(file,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,done);}else{return done(file);}},previewTemplate:"\n
\n
\n
\n
\n
\n
\n Check \n \n \n \n \n \n
\n
\n
\n Error \n \n \n \n \n \n \n \n
\n
",drop:function drop(e){return this.element.classList.remove("dz-drag-hover");},dragstart:function dragstart(e){},dragend:function dragend(e){return this.element.classList.remove("dz-drag-hover");},dragenter:function dragenter(e){return this.element.classList.add("dz-drag-hover");},dragover:function dragover(e){return this.element.classList.add("dz-drag-hover");},dragleave:function dragleave(e){return this.element.classList.remove("dz-drag-hover");},paste:function paste(e){},reset:function reset(){return this.element.classList.remove("dz-started");},addedfile:function addedfile(file){var _this2=this;if(this.element===this.previewsContainer){this.element.classList.add("dz-started");}
+if(this.previewsContainer){file.previewElement=Dropzone.createElement(this.options.previewTemplate.trim());file.previewTemplate=file.previewElement;this.previewsContainer.appendChild(file.previewElement);for(var _iterator3=file.previewElement.querySelectorAll("[data-dz-name]"),_isArray3=true,_i3=0,_iterator3=_isArray3?_iterator3:_iterator3[Symbol.iterator]();;){var _ref3;if(_isArray3){if(_i3>=_iterator3.length)break;_ref3=_iterator3[_i3++];}else{_i3=_iterator3.next();if(_i3.done)break;_ref3=_i3.value;}
+var node=_ref3;node.textContent=file.name;}
+for(var _iterator4=file.previewElement.querySelectorAll("[data-dz-size]"),_isArray4=true,_i4=0,_iterator4=_isArray4?_iterator4:_iterator4[Symbol.iterator]();;){if(_isArray4){if(_i4>=_iterator4.length)break;node=_iterator4[_i4++];}else{_i4=_iterator4.next();if(_i4.done)break;node=_i4.value;}
+node.innerHTML=this.filesize(file.size);}
if(this.options.addRemoveLinks){file._removeLink=Dropzone.createElement(""+this.options.dictRemoveFile+" ");file.previewElement.appendChild(file._removeLink);}
-removeFileEvent=(function(_this){return function(e){e.preventDefault();e.stopPropagation();if(file.status===Dropzone.UPLOADING){return Dropzone.confirm(_this.options.dictCancelUploadConfirmation,function(){return _this.removeFile(file);});}else{if(_this.options.dictRemoveFileConfirmation){return Dropzone.confirm(_this.options.dictRemoveFileConfirmation,function(){return _this.removeFile(file);});}else{return _this.removeFile(file);}}};})(this);_ref2=file.previewElement.querySelectorAll("[data-dz-remove]");_results=[];for(_k=0,_len2=_ref2.length;_k<_len2;_k++){removeLink=_ref2[_k];_results.push(removeLink.addEventListener("click",removeFileEvent));}
-return _results;}},removedfile:function(file){var _ref;if(file.previewElement){if((_ref=file.previewElement)!=null){_ref.parentNode.removeChild(file.previewElement);}}
-return this._updateMaxFilesReachedClass();},thumbnail:function(file,dataUrl){var thumbnailElement,_i,_len,_ref;if(file.previewElement){file.previewElement.classList.remove("dz-file-preview");_ref=file.previewElement.querySelectorAll("[data-dz-thumbnail]");for(_i=0,_len=_ref.length;_i<_len;_i++){thumbnailElement=_ref[_i];thumbnailElement.alt=file.name;thumbnailElement.src=dataUrl;}
-return setTimeout(((function(_this){return function(){return file.previewElement.classList.add("dz-image-preview");};})(this)),1);}},error:function(file,message){var node,_i,_len,_ref,_results;if(file.previewElement){file.previewElement.classList.add("dz-error");if(typeof message!=="String"&&message.error){message=message.error;}
-_ref=file.previewElement.querySelectorAll("[data-dz-errormessage]");_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){node=_ref[_i];_results.push(node.textContent=message);}
-return _results;}},errormultiple:noop,processing:function(file){if(file.previewElement){file.previewElement.classList.add("dz-processing");if(file._removeLink){return file._removeLink.textContent=this.options.dictCancelUpload;}}},processingmultiple:noop,uploadprogress:function(file,progress,bytesSent){var node,_i,_len,_ref,_results;if(file.previewElement){_ref=file.previewElement.querySelectorAll("[data-dz-uploadprogress]");_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){node=_ref[_i];if(node.nodeName==='PROGRESS'){_results.push(node.value=progress);}else{_results.push(node.style.width=""+progress+"%");}}
-return _results;}},totaluploadprogress:noop,sending:noop,sendingmultiple:noop,success:function(file){if(file.previewElement){return file.previewElement.classList.add("dz-success");}},successmultiple:noop,canceled:function(file){return this.emit("error",file,"Upload canceled.");},canceledmultiple:noop,complete:function(file){if(file._removeLink){file._removeLink.textContent=this.options.dictRemoveFile;}
-if(file.previewElement){return file.previewElement.classList.add("dz-complete");}},completemultiple:noop,maxfilesexceeded:noop,maxfilesreached:noop,queuecomplete:noop,previewTemplate:"\n
\n
\n
\n
\n
\n
\n Check \n \n \n \n \n \n
\n
\n
\n Error \n \n \n \n \n \n \n \n
\n
"};extend=function(){var key,object,objects,target,val,_i,_len;target=arguments[0],objects=2<=arguments.length?__slice.call(arguments,1):[];for(_i=0,_len=objects.length;_i<_len;_i++){object=objects[_i];for(key in object){val=object[key];target[key]=val;}}
-return target;};function Dropzone(element,options){var elementOptions,fallback,_ref;this.element=element;this.version=Dropzone.version;this.defaultOptions.previewTemplate=this.defaultOptions.previewTemplate.replace(/\n*/g,"");this.clickableElements=[];this.listeners=[];this.files=[];if(typeof this.element==="string"){this.element=document.querySelector(this.element);}
-if(!(this.element&&(this.element.nodeType!=null))){throw new Error("Invalid dropzone element.");}
-if(this.element.dropzone){throw new Error("Dropzone already attached.");}
-Dropzone.instances.push(this);this.element.dropzone=this;elementOptions=(_ref=Dropzone.optionsForElement(this.element))!=null?_ref:{};this.options=extend({},this.defaultOptions,elementOptions,options!=null?options:{});if(this.options.forceFallback||!Dropzone.isBrowserSupported()){return this.options.fallback.call(this);}
-if(this.options.url==null){this.options.url=this.element.getAttribute("action");}
-if(!this.options.url){throw new Error("No URL provided.");}
-if(this.options.acceptedFiles&&this.options.acceptedMimeTypes){throw new Error("You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.");}
-if(this.options.acceptedMimeTypes){this.options.acceptedFiles=this.options.acceptedMimeTypes;delete this.options.acceptedMimeTypes;}
-this.options.method=this.options.method.toUpperCase();if((fallback=this.getExistingFallback())&&fallback.parentNode){fallback.parentNode.removeChild(fallback);}
-if(this.options.previewsContainer!==false){if(this.options.previewsContainer){this.previewsContainer=Dropzone.getElement(this.options.previewsContainer,"previewsContainer");}else{this.previewsContainer=this.element;}}
-if(this.options.clickable){if(this.options.clickable===true){this.clickableElements=[this.element];}else{this.clickableElements=Dropzone.getElements(this.options.clickable,"clickable");}}
-this.init();}
-Dropzone.prototype.getAcceptedFiles=function(){var file,_i,_len,_ref,_results;_ref=this.files;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){file=_ref[_i];if(file.accepted){_results.push(file);}}
-return _results;};Dropzone.prototype.getRejectedFiles=function(){var file,_i,_len,_ref,_results;_ref=this.files;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){file=_ref[_i];if(!file.accepted){_results.push(file);}}
-return _results;};Dropzone.prototype.getFilesWithStatus=function(status){var file,_i,_len,_ref,_results;_ref=this.files;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){file=_ref[_i];if(file.status===status){_results.push(file);}}
-return _results;};Dropzone.prototype.getQueuedFiles=function(){return this.getFilesWithStatus(Dropzone.QUEUED);};Dropzone.prototype.getUploadingFiles=function(){return this.getFilesWithStatus(Dropzone.UPLOADING);};Dropzone.prototype.getActiveFiles=function(){var file,_i,_len,_ref,_results;_ref=this.files;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){file=_ref[_i];if(file.status===Dropzone.UPLOADING||file.status===Dropzone.QUEUED){_results.push(file);}}
-return _results;};Dropzone.prototype.init=function(){var eventName,noPropagation,setupHiddenFileInput,_i,_len,_ref,_ref1;if(this.element.tagName==="form"){this.element.setAttribute("enctype","multipart/form-data");}
+var removeFileEvent=function removeFileEvent(e){e.preventDefault();e.stopPropagation();if(file.status===Dropzone.UPLOADING){return Dropzone.confirm(_this2.options.dictCancelUploadConfirmation,function(){return _this2.removeFile(file);});}else{if(_this2.options.dictRemoveFileConfirmation){return Dropzone.confirm(_this2.options.dictRemoveFileConfirmation,function(){return _this2.removeFile(file);});}else{return _this2.removeFile(file);}}};for(var _iterator5=file.previewElement.querySelectorAll("[data-dz-remove]"),_isArray5=true,_i5=0,_iterator5=_isArray5?_iterator5:_iterator5[Symbol.iterator]();;){var _ref4;if(_isArray5){if(_i5>=_iterator5.length)break;_ref4=_iterator5[_i5++];}else{_i5=_iterator5.next();if(_i5.done)break;_ref4=_i5.value;}
+var removeLink=_ref4;removeLink.addEventListener("click",removeFileEvent);}}},removedfile:function removedfile(file){if(file.previewElement!=null&&file.previewElement.parentNode!=null){file.previewElement.parentNode.removeChild(file.previewElement);}
+return this._updateMaxFilesReachedClass();},thumbnail:function thumbnail(file,dataUrl){if(file.previewElement){file.previewElement.classList.remove("dz-file-preview");for(var _iterator6=file.previewElement.querySelectorAll("[data-dz-thumbnail]"),_isArray6=true,_i6=0,_iterator6=_isArray6?_iterator6:_iterator6[Symbol.iterator]();;){var _ref5;if(_isArray6){if(_i6>=_iterator6.length)break;_ref5=_iterator6[_i6++];}else{_i6=_iterator6.next();if(_i6.done)break;_ref5=_i6.value;}
+var thumbnailElement=_ref5;thumbnailElement.alt=file.name;thumbnailElement.src=dataUrl;}
+return setTimeout(function(){return file.previewElement.classList.add("dz-image-preview");},1);}},error:function error(file,message){if(file.previewElement){file.previewElement.classList.add("dz-error");if(typeof message!=="String"&&message.error){message=message.error;}
+for(var _iterator7=file.previewElement.querySelectorAll("[data-dz-errormessage]"),_isArray7=true,_i7=0,_iterator7=_isArray7?_iterator7:_iterator7[Symbol.iterator]();;){var _ref6;if(_isArray7){if(_i7>=_iterator7.length)break;_ref6=_iterator7[_i7++];}else{_i7=_iterator7.next();if(_i7.done)break;_ref6=_i7.value;}
+var node=_ref6;node.textContent=message;}}},errormultiple:function errormultiple(){},processing:function processing(file){if(file.previewElement){file.previewElement.classList.add("dz-processing");if(file._removeLink){return file._removeLink.innerHTML=this.options.dictCancelUpload;}}},processingmultiple:function processingmultiple(){},uploadprogress:function uploadprogress(file,progress,bytesSent){if(file.previewElement){for(var _iterator8=file.previewElement.querySelectorAll("[data-dz-uploadprogress]"),_isArray8=true,_i8=0,_iterator8=_isArray8?_iterator8:_iterator8[Symbol.iterator]();;){var _ref7;if(_isArray8){if(_i8>=_iterator8.length)break;_ref7=_iterator8[_i8++];}else{_i8=_iterator8.next();if(_i8.done)break;_ref7=_i8.value;}
+var node=_ref7;node.nodeName==='PROGRESS'?node.value=progress:node.style.width=progress+"%";}}},totaluploadprogress:function totaluploadprogress(){},sending:function sending(){},sendingmultiple:function sendingmultiple(){},success:function success(file){if(file.previewElement){return file.previewElement.classList.add("dz-success");}},successmultiple:function successmultiple(){},canceled:function canceled(file){return this.emit("error",file,this.options.dictUploadCanceled);},canceledmultiple:function canceledmultiple(){},complete:function complete(file){if(file._removeLink){file._removeLink.innerHTML=this.options.dictRemoveFile;}
+if(file.previewElement){return file.previewElement.classList.add("dz-complete");}},completemultiple:function completemultiple(){},maxfilesexceeded:function maxfilesexceeded(){},maxfilesreached:function maxfilesreached(){},queuecomplete:function queuecomplete(){},addedfiles:function addedfiles(){}};this.prototype._thumbnailQueue=[];this.prototype._processingThumbnail=false;}},{key:"extend",value:function extend(target){for(var _len2=arguments.length,objects=Array(_len2>1?_len2-1:0),_key2=1;_key2<_len2;_key2++){objects[_key2-1]=arguments[_key2];}
+for(var _iterator9=objects,_isArray9=true,_i9=0,_iterator9=_isArray9?_iterator9:_iterator9[Symbol.iterator]();;){var _ref8;if(_isArray9){if(_i9>=_iterator9.length)break;_ref8=_iterator9[_i9++];}else{_i9=_iterator9.next();if(_i9.done)break;_ref8=_i9.value;}
+var object=_ref8;for(var key in object){var val=object[key];target[key]=val;}}
+return target;}}]);function Dropzone(el,options){_classCallCheck(this,Dropzone);var _this=_possibleConstructorReturn(this,(Dropzone.__proto__||Object.getPrototypeOf(Dropzone)).call(this));var fallback=void 0,left=void 0;_this.element=el;_this.version=Dropzone.version;_this.defaultOptions.previewTemplate=_this.defaultOptions.previewTemplate.replace(/\n*/g,"");_this.clickableElements=[];_this.listeners=[];_this.files=[];if(typeof _this.element==="string"){_this.element=document.querySelector(_this.element);}
+if(!_this.element||_this.element.nodeType==null){throw new Error("Invalid dropzone element.");}
+if(_this.element.dropzone){throw new Error("Dropzone already attached.");}
+Dropzone.instances.push(_this);_this.element.dropzone=_this;var elementOptions=(left=Dropzone.optionsForElement(_this.element))!=null?left:{};_this.options=Dropzone.extend({},_this.defaultOptions,elementOptions,options!=null?options:{});if(_this.options.forceFallback||!Dropzone.isBrowserSupported()){var _ret;return _ret=_this.options.fallback.call(_this),_possibleConstructorReturn(_this,_ret);}
+if(_this.options.url==null){_this.options.url=_this.element.getAttribute("action");}
+if(!_this.options.url){throw new Error("No URL provided.");}
+if(_this.options.acceptedFiles&&_this.options.acceptedMimeTypes){throw new Error("You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.");}
+if(_this.options.uploadMultiple&&_this.options.chunking){throw new Error('You cannot set both: uploadMultiple and chunking.');}
+if(_this.options.acceptedMimeTypes){_this.options.acceptedFiles=_this.options.acceptedMimeTypes;delete _this.options.acceptedMimeTypes;}
+if(_this.options.renameFilename!=null){_this.options.renameFile=function(file){return _this.options.renameFilename.call(_this,file.name,file);};}
+_this.options.method=_this.options.method.toUpperCase();if((fallback=_this.getExistingFallback())&&fallback.parentNode){fallback.parentNode.removeChild(fallback);}
+if(_this.options.previewsContainer!==false){if(_this.options.previewsContainer){_this.previewsContainer=Dropzone.getElement(_this.options.previewsContainer,"previewsContainer");}else{_this.previewsContainer=_this.element;}}
+if(_this.options.clickable){if(_this.options.clickable===true){_this.clickableElements=[_this.element];}else{_this.clickableElements=Dropzone.getElements(_this.options.clickable,"clickable");}}
+_this.init();return _this;}
+_createClass(Dropzone,[{key:"getAcceptedFiles",value:function getAcceptedFiles(){return this.files.filter(function(file){return file.accepted;}).map(function(file){return file;});}},{key:"getRejectedFiles",value:function getRejectedFiles(){return this.files.filter(function(file){return!file.accepted;}).map(function(file){return file;});}},{key:"getFilesWithStatus",value:function getFilesWithStatus(status){return this.files.filter(function(file){return file.status===status;}).map(function(file){return file;});}},{key:"getQueuedFiles",value:function getQueuedFiles(){return this.getFilesWithStatus(Dropzone.QUEUED);}},{key:"getUploadingFiles",value:function getUploadingFiles(){return this.getFilesWithStatus(Dropzone.UPLOADING);}},{key:"getAddedFiles",value:function getAddedFiles(){return this.getFilesWithStatus(Dropzone.ADDED);}},{key:"getActiveFiles",value:function getActiveFiles(){return this.files.filter(function(file){return file.status===Dropzone.UPLOADING||file.status===Dropzone.QUEUED;}).map(function(file){return file;});}},{key:"init",value:function init(){var _this3=this;if(this.element.tagName==="form"){this.element.setAttribute("enctype","multipart/form-data");}
if(this.element.classList.contains("dropzone")&&!this.element.querySelector(".dz-message")){this.element.appendChild(Dropzone.createElement(""+this.options.dictDefaultMessage+"
"));}
-if(this.clickableElements.length){setupHiddenFileInput=(function(_this){return function(){if(_this.hiddenFileInput){document.body.removeChild(_this.hiddenFileInput);}
-_this.hiddenFileInput=document.createElement("input");_this.hiddenFileInput.setAttribute("type","file");if((_this.options.maxFiles==null)||_this.options.maxFiles>1){_this.hiddenFileInput.setAttribute("multiple","multiple");}
-_this.hiddenFileInput.className="dz-hidden-input";if(_this.options.acceptedFiles!=null){_this.hiddenFileInput.setAttribute("accept",_this.options.acceptedFiles);}
-if(_this.options.capture!=null){_this.hiddenFileInput.setAttribute("capture",_this.options.capture);}
-_this.hiddenFileInput.style.visibility="hidden";_this.hiddenFileInput.style.position="absolute";_this.hiddenFileInput.style.top="0";_this.hiddenFileInput.style.left="0";_this.hiddenFileInput.style.height="0";_this.hiddenFileInput.style.width="0";document.body.appendChild(_this.hiddenFileInput);return _this.hiddenFileInput.addEventListener("change",function(){var file,files,_i,_len;files=_this.hiddenFileInput.files;if(files.length){for(_i=0,_len=files.length;_i<_len;_i++){file=files[_i];_this.addFile(file);}}
-return setupHiddenFileInput();});};})(this);setupHiddenFileInput();}
-this.URL=(_ref=window.URL)!=null?_ref:window.webkitURL;_ref1=this.events;for(_i=0,_len=_ref1.length;_i<_len;_i++){eventName=_ref1[_i];this.on(eventName,this.options[eventName]);}
-this.on("uploadprogress",(function(_this){return function(){return _this.updateTotalUploadProgress();};})(this));this.on("removedfile",(function(_this){return function(){return _this.updateTotalUploadProgress();};})(this));this.on("canceled",(function(_this){return function(file){return _this.emit("complete",file);};})(this));this.on("complete",(function(_this){return function(file){if(_this.getUploadingFiles().length===0&&_this.getQueuedFiles().length===0){return setTimeout((function(){return _this.emit("queuecomplete");}),0);}};})(this));noPropagation=function(e){e.stopPropagation();if(e.preventDefault){return e.preventDefault();}else{return e.returnValue=false;}};this.listeners=[{element:this.element,events:{"dragstart":(function(_this){return function(e){return _this.emit("dragstart",e);};})(this),"dragenter":(function(_this){return function(e){noPropagation(e);return _this.emit("dragenter",e);};})(this),"dragover":(function(_this){return function(e){var efct;try{efct=e.dataTransfer.effectAllowed;}catch(_error){}
-e.dataTransfer.dropEffect='move'===efct||'linkMove'===efct?'move':'copy';noPropagation(e);return _this.emit("dragover",e);};})(this),"dragleave":(function(_this){return function(e){return _this.emit("dragleave",e);};})(this),"drop":(function(_this){return function(e){noPropagation(e);return _this.drop(e);};})(this),"dragend":(function(_this){return function(e){return _this.emit("dragend",e);};})(this)}}];this.clickableElements.forEach((function(_this){return function(clickableElement){return _this.listeners.push({element:clickableElement,events:{"click":function(evt){if((clickableElement!==_this.element)||(evt.target===_this.element||Dropzone.elementInside(evt.target,_this.element.querySelector(".dz-message")))){return _this.hiddenFileInput.click();}}}});};})(this));this.enable();return this.options.init.call(this);};Dropzone.prototype.destroy=function(){var _ref;this.disable();this.removeAllFiles(true);if((_ref=this.hiddenFileInput)!=null?_ref.parentNode:void 0){this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);this.hiddenFileInput=null;}
-delete this.element.dropzone;return Dropzone.instances.splice(Dropzone.instances.indexOf(this),1);};Dropzone.prototype.updateTotalUploadProgress=function(){var activeFiles,file,totalBytes,totalBytesSent,totalUploadProgress,_i,_len,_ref;totalBytesSent=0;totalBytes=0;activeFiles=this.getActiveFiles();if(activeFiles.length){_ref=this.getActiveFiles();for(_i=0,_len=_ref.length;_i<_len;_i++){file=_ref[_i];totalBytesSent+=file.upload.bytesSent;totalBytes+=file.upload.total;}
+if(this.clickableElements.length){var setupHiddenFileInput=function setupHiddenFileInput(){if(_this3.hiddenFileInput){_this3.hiddenFileInput.parentNode.removeChild(_this3.hiddenFileInput);}
+_this3.hiddenFileInput=document.createElement("input");_this3.hiddenFileInput.setAttribute("type","file");if(_this3.options.maxFiles===null||_this3.options.maxFiles>1){_this3.hiddenFileInput.setAttribute("multiple","multiple");}
+_this3.hiddenFileInput.className="dz-hidden-input";if(_this3.options.acceptedFiles!==null){_this3.hiddenFileInput.setAttribute("accept",_this3.options.acceptedFiles);}
+if(_this3.options.capture!==null){_this3.hiddenFileInput.setAttribute("capture",_this3.options.capture);}
+_this3.hiddenFileInput.style.visibility="hidden";_this3.hiddenFileInput.style.position="absolute";_this3.hiddenFileInput.style.top="0";_this3.hiddenFileInput.style.left="0";_this3.hiddenFileInput.style.height="0";_this3.hiddenFileInput.style.width="0";Dropzone.getElement(_this3.options.hiddenInputContainer,'hiddenInputContainer').appendChild(_this3.hiddenFileInput);return _this3.hiddenFileInput.addEventListener("change",function(){var files=_this3.hiddenFileInput.files;if(files.length){for(var _iterator10=files,_isArray10=true,_i10=0,_iterator10=_isArray10?_iterator10:_iterator10[Symbol.iterator]();;){var _ref9;if(_isArray10){if(_i10>=_iterator10.length)break;_ref9=_iterator10[_i10++];}else{_i10=_iterator10.next();if(_i10.done)break;_ref9=_i10.value;}
+var file=_ref9;_this3.addFile(file);}}
+_this3.emit("addedfiles",files);return setupHiddenFileInput();});};setupHiddenFileInput();}
+this.URL=window.URL!==null?window.URL:window.webkitURL;for(var _iterator11=this.events,_isArray11=true,_i11=0,_iterator11=_isArray11?_iterator11:_iterator11[Symbol.iterator]();;){var _ref10;if(_isArray11){if(_i11>=_iterator11.length)break;_ref10=_iterator11[_i11++];}else{_i11=_iterator11.next();if(_i11.done)break;_ref10=_i11.value;}
+var eventName=_ref10;this.on(eventName,this.options[eventName]);}
+this.on("uploadprogress",function(){return _this3.updateTotalUploadProgress();});this.on("removedfile",function(){return _this3.updateTotalUploadProgress();});this.on("canceled",function(file){return _this3.emit("complete",file);});this.on("complete",function(file){if(_this3.getAddedFiles().length===0&&_this3.getUploadingFiles().length===0&&_this3.getQueuedFiles().length===0){return setTimeout(function(){return _this3.emit("queuecomplete");},0);}});var noPropagation=function noPropagation(e){e.stopPropagation();if(e.preventDefault){return e.preventDefault();}else{return e.returnValue=false;}};this.listeners=[{element:this.element,events:{"dragstart":function dragstart(e){return _this3.emit("dragstart",e);},"dragenter":function dragenter(e){noPropagation(e);return _this3.emit("dragenter",e);},"dragover":function dragover(e){var efct=void 0;try{efct=e.dataTransfer.effectAllowed;}catch(error){}
+e.dataTransfer.dropEffect='move'===efct||'linkMove'===efct?'move':'copy';noPropagation(e);return _this3.emit("dragover",e);},"dragleave":function dragleave(e){return _this3.emit("dragleave",e);},"drop":function drop(e){noPropagation(e);return _this3.drop(e);},"dragend":function dragend(e){return _this3.emit("dragend",e);}}}];this.clickableElements.forEach(function(clickableElement){return _this3.listeners.push({element:clickableElement,events:{"click":function click(evt){if(clickableElement!==_this3.element||evt.target===_this3.element||Dropzone.elementInside(evt.target,_this3.element.querySelector(".dz-message"))){_this3.hiddenFileInput.click();}
+return true;}}});});this.enable();return this.options.init.call(this);}},{key:"destroy",value:function destroy(){this.disable();this.removeAllFiles(true);if(this.hiddenFileInput!=null?this.hiddenFileInput.parentNode:undefined){this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);this.hiddenFileInput=null;}
+delete this.element.dropzone;return Dropzone.instances.splice(Dropzone.instances.indexOf(this),1);}},{key:"updateTotalUploadProgress",value:function updateTotalUploadProgress(){var totalUploadProgress=void 0;var totalBytesSent=0;var totalBytes=0;var activeFiles=this.getActiveFiles();if(activeFiles.length){for(var _iterator12=this.getActiveFiles(),_isArray12=true,_i12=0,_iterator12=_isArray12?_iterator12:_iterator12[Symbol.iterator]();;){var _ref11;if(_isArray12){if(_i12>=_iterator12.length)break;_ref11=_iterator12[_i12++];}else{_i12=_iterator12.next();if(_i12.done)break;_ref11=_i12.value;}
+var file=_ref11;totalBytesSent+=file.upload.bytesSent;totalBytes+=file.upload.total;}
totalUploadProgress=100*totalBytesSent/totalBytes;}else{totalUploadProgress=100;}
-return this.emit("totaluploadprogress",totalUploadProgress,totalBytes,totalBytesSent);};Dropzone.prototype._getParamName=function(n){if(typeof this.options.paramName==="function"){return this.options.paramName(n);}else{return""+this.options.paramName+(this.options.uploadMultiple?"["+n+"]":"");}};Dropzone.prototype.getFallbackForm=function(){var existingFallback,fields,fieldsString,form;if(existingFallback=this.getExistingFallback()){return existingFallback;}
-fieldsString="";fields=Dropzone.createElement(fieldsString);if(this.element.tagName!=="FORM"){form=Dropzone.createElement("");form.appendChild(fields);}else{this.element.setAttribute("enctype","multipart/form-data");this.element.setAttribute("method",this.options.method);}
-return form!=null?form:fields;};Dropzone.prototype.getExistingFallback=function(){var fallback,getFallback,tagName,_i,_len,_ref;getFallback=function(elements){var el,_i,_len;for(_i=0,_len=elements.length;_i<_len;_i++){el=elements[_i];if(/(^| )fallback($| )/.test(el.className)){return el;}}};_ref=["div","form"];for(_i=0,_len=_ref.length;_i<_len;_i++){tagName=_ref[_i];if(fallback=getFallback(this.element.getElementsByTagName(tagName))){return fallback;}}};Dropzone.prototype.setupEventListeners=function(){var elementListeners,event,listener,_i,_len,_ref,_results;_ref=this.listeners;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){elementListeners=_ref[_i];_results.push((function(){var _ref1,_results1;_ref1=elementListeners.events;_results1=[];for(event in _ref1){listener=_ref1[event];_results1.push(elementListeners.element.addEventListener(event,listener,false));}
-return _results1;})());}
-return _results;};Dropzone.prototype.removeEventListeners=function(){var elementListeners,event,listener,_i,_len,_ref,_results;_ref=this.listeners;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){elementListeners=_ref[_i];_results.push((function(){var _ref1,_results1;_ref1=elementListeners.events;_results1=[];for(event in _ref1){listener=_ref1[event];_results1.push(elementListeners.element.removeEventListener(event,listener,false));}
-return _results1;})());}
-return _results;};Dropzone.prototype.disable=function(){var file,_i,_len,_ref,_results;this.clickableElements.forEach(function(element){return element.classList.remove("dz-clickable");});this.removeEventListeners();_ref=this.files;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){file=_ref[_i];_results.push(this.cancelUpload(file));}
-return _results;};Dropzone.prototype.enable=function(){this.clickableElements.forEach(function(element){return element.classList.add("dz-clickable");});return this.setupEventListeners();};Dropzone.prototype.filesize=function(size){var cutoff,i,selectedSize,selectedUnit,unit,units,_i,_len;units=['TB','GB','MB','KB','b'];selectedSize=selectedUnit=null;for(i=_i=0,_len=units.length;_i<_len;i=++_i){unit=units[i];cutoff=Math.pow(this.options.filesizeBase,4-i)/10;if(size>=cutoff){selectedSize=size/Math.pow(this.options.filesizeBase,4-i);selectedUnit=unit;break;}}
-selectedSize=Math.round(10*selectedSize)/10;return""+selectedSize+" "+selectedUnit;};Dropzone.prototype._updateMaxFilesReachedClass=function(){if((this.options.maxFiles!=null)&&this.getAcceptedFiles().length>=this.options.maxFiles){if(this.getAcceptedFiles().length===this.options.maxFiles){this.emit('maxfilesreached',this.files);}
-return this.element.classList.add("dz-max-files-reached");}else{return this.element.classList.remove("dz-max-files-reached");}};Dropzone.prototype.drop=function(e){var files,items;if(!e.dataTransfer){return;}
-this.emit("drop",e);files=e.dataTransfer.files;if(files.length){items=e.dataTransfer.items;if(items&&items.length&&(items[0].webkitGetAsEntry!=null)){this._addFilesFromItems(items);}else{this.handleFiles(files);}}};Dropzone.prototype.paste=function(e){var items,_ref;if((e!=null?(_ref=e.clipboardData)!=null?_ref.items:void 0:void 0)==null){return;}
-this.emit("paste",e);items=e.clipboardData.items;if(items.length){return this._addFilesFromItems(items);}};Dropzone.prototype.handleFiles=function(files){var file,_i,_len,_results;_results=[];for(_i=0,_len=files.length;_i<_len;_i++){file=files[_i];_results.push(this.addFile(file));}
-return _results;};Dropzone.prototype._addFilesFromItems=function(items){var entry,item,_i,_len,_results;_results=[];for(_i=0,_len=items.length;_i<_len;_i++){item=items[_i];if((item.webkitGetAsEntry!=null)&&(entry=item.webkitGetAsEntry())){if(entry.isFile){_results.push(this.addFile(item.getAsFile()));}else if(entry.isDirectory){_results.push(this._addFilesFromDirectory(entry,entry.name));}else{_results.push(void 0);}}else if(item.getAsFile!=null){if((item.kind==null)||item.kind==="file"){_results.push(this.addFile(item.getAsFile()));}else{_results.push(void 0);}}else{_results.push(void 0);}}
-return _results;};Dropzone.prototype._addFilesFromDirectory=function(directory,path){var dirReader,entriesReader;dirReader=directory.createReader();entriesReader=(function(_this){return function(entries){var entry,_i,_len;for(_i=0,_len=entries.length;_i<_len;_i++){entry=entries[_i];if(entry.isFile){entry.file(function(file){if(_this.options.ignoreHiddenFiles&&file.name.substring(0,1)==='.'){return;}
-file.fullPath=""+path+"/"+file.name;return _this.addFile(file);});}else if(entry.isDirectory){_this._addFilesFromDirectory(entry,""+path+"/"+entry.name);}}};})(this);return dirReader.readEntries(entriesReader,function(error){return typeof console!=="undefined"&&console!==null?typeof console.log==="function"?console.log(error):void 0:void 0;});};Dropzone.prototype.accept=function(file,done){if(file.size>this.options.maxFilesize*1024*1024){return done(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(file.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize));}else if(!Dropzone.isValidFile(file,this.options.acceptedFiles)){return done(this.options.dictInvalidFileType);}else if((this.options.maxFiles!=null)&&this.getAcceptedFiles().length>=this.options.maxFiles){done(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles));return this.emit("maxfilesexceeded",file);}else{return this.options.accept.call(this,file,done);}};Dropzone.prototype.addFile=function(file){file.upload={progress:0,total:file.size,bytesSent:0};this.files.push(file);file.status=Dropzone.ADDED;this.emit("addedfile",file);this._enqueueThumbnail(file);return this.accept(file,(function(_this){return function(error){if(error){file.accepted=false;_this._errorProcessing([file],error);}else{file.accepted=true;if(_this.options.autoQueue){_this.enqueueFile(file);}}
-return _this._updateMaxFilesReachedClass();};})(this));};Dropzone.prototype.enqueueFiles=function(files){var file,_i,_len;for(_i=0,_len=files.length;_i<_len;_i++){file=files[_i];this.enqueueFile(file);}
-return null;};Dropzone.prototype.enqueueFile=function(file){if(file.status===Dropzone.ADDED&&file.accepted===true){file.status=Dropzone.QUEUED;if(this.options.autoProcessQueue){return setTimeout(((function(_this){return function(){return _this.processQueue();};})(this)),0);}}else{throw new Error("This file can't be queued because it has already been processed or was rejected.");}};Dropzone.prototype._thumbnailQueue=[];Dropzone.prototype._processingThumbnail=false;Dropzone.prototype._enqueueThumbnail=function(file){if(this.options.createImageThumbnails&&file.type.match(/image.*/)&&file.size<=this.options.maxThumbnailFilesize*1024*1024){this._thumbnailQueue.push(file);return setTimeout(((function(_this){return function(){return _this._processThumbnailQueue();};})(this)),0);}};Dropzone.prototype._processThumbnailQueue=function(){if(this._processingThumbnail||this._thumbnailQueue.length===0){return;}
-this._processingThumbnail=true;return this.createThumbnail(this._thumbnailQueue.shift(),(function(_this){return function(){_this._processingThumbnail=false;return _this._processThumbnailQueue();};})(this));};Dropzone.prototype.removeFile=function(file){if(file.status===Dropzone.UPLOADING){this.cancelUpload(file);}
-this.files=without(this.files,file);this.emit("removedfile",file);if(this.files.length===0){return this.emit("reset");}};Dropzone.prototype.removeAllFiles=function(cancelIfNecessary){var file,_i,_len,_ref;if(cancelIfNecessary==null){cancelIfNecessary=false;}
-_ref=this.files.slice();for(_i=0,_len=_ref.length;_i<_len;_i++){file=_ref[_i];if(file.status!==Dropzone.UPLOADING||cancelIfNecessary){this.removeFile(file);}}
-return null;};Dropzone.prototype.createThumbnail=function(file,callback){var fileReader;fileReader=new FileReader;fileReader.onload=(function(_this){return function(){if(file.type==="image/svg+xml"){_this.emit("thumbnail",file,fileReader.result);if(callback!=null){callback();}
+return this.emit("totaluploadprogress",totalUploadProgress,totalBytes,totalBytesSent);}},{key:"_getParamName",value:function _getParamName(n){if(typeof this.options.paramName==="function"){return this.options.paramName(n);}else{return""+this.options.paramName+(this.options.uploadMultiple?"["+n+"]":"");}}},{key:"_renameFile",value:function _renameFile(file){if(typeof this.options.renameFile!=="function"){return file.name;}
+return this.options.renameFile(file);}},{key:"getFallbackForm",value:function getFallbackForm(){var existingFallback=void 0,form=void 0;if(existingFallback=this.getExistingFallback()){return existingFallback;}
+var fieldsString="";var fields=Dropzone.createElement(fieldsString);if(this.element.tagName!=="FORM"){form=Dropzone.createElement("");form.appendChild(fields);}else{this.element.setAttribute("enctype","multipart/form-data");this.element.setAttribute("method",this.options.method);}
+return form!=null?form:fields;}},{key:"getExistingFallback",value:function getExistingFallback(){var getFallback=function getFallback(elements){for(var _iterator13=elements,_isArray13=true,_i13=0,_iterator13=_isArray13?_iterator13:_iterator13[Symbol.iterator]();;){var _ref12;if(_isArray13){if(_i13>=_iterator13.length)break;_ref12=_iterator13[_i13++];}else{_i13=_iterator13.next();if(_i13.done)break;_ref12=_i13.value;}
+var el=_ref12;if(/(^| )fallback($| )/.test(el.className)){return el;}}};var _arr=["div","form"];for(var _i14=0;_i14<_arr.length;_i14++){var tagName=_arr[_i14];var fallback;if(fallback=getFallback(this.element.getElementsByTagName(tagName))){return fallback;}}}},{key:"setupEventListeners",value:function setupEventListeners(){return this.listeners.map(function(elementListeners){return function(){var result=[];for(var event in elementListeners.events){var listener=elementListeners.events[event];result.push(elementListeners.element.addEventListener(event,listener,false));}
+return result;}();});}},{key:"removeEventListeners",value:function removeEventListeners(){return this.listeners.map(function(elementListeners){return function(){var result=[];for(var event in elementListeners.events){var listener=elementListeners.events[event];result.push(elementListeners.element.removeEventListener(event,listener,false));}
+return result;}();});}},{key:"disable",value:function disable(){var _this4=this;this.clickableElements.forEach(function(element){return element.classList.remove("dz-clickable");});this.removeEventListeners();this.disabled=true;return this.files.map(function(file){return _this4.cancelUpload(file);});}},{key:"enable",value:function enable(){delete this.disabled;this.clickableElements.forEach(function(element){return element.classList.add("dz-clickable");});return this.setupEventListeners();}},{key:"filesize",value:function filesize(size){var selectedSize=0;var selectedUnit="b";if(size>0){var units=['tb','gb','mb','kb','b'];for(var i=0;i=cutoff){selectedSize=size/Math.pow(this.options.filesizeBase,4-i);selectedUnit=unit;break;}}
+selectedSize=Math.round(10*selectedSize)/10;}
+return""+selectedSize+" "+this.options.dictFileSizeUnits[selectedUnit];}},{key:"_updateMaxFilesReachedClass",value:function _updateMaxFilesReachedClass(){if(this.options.maxFiles!=null&&this.getAcceptedFiles().length>=this.options.maxFiles){if(this.getAcceptedFiles().length===this.options.maxFiles){this.emit('maxfilesreached',this.files);}
+return this.element.classList.add("dz-max-files-reached");}else{return this.element.classList.remove("dz-max-files-reached");}}},{key:"drop",value:function drop(e){if(!e.dataTransfer){return;}
+this.emit("drop",e);var files=[];for(var i=0;i=_iterator14.length)break;_ref13=_iterator14[_i15++];}else{_i15=_iterator14.next();if(_i15.done)break;_ref13=_i15.value;}
+var file=_ref13;this.addFile(file);}}},{key:"_addFilesFromItems",value:function _addFilesFromItems(items){var _this5=this;return function(){var result=[];for(var _iterator15=items,_isArray15=true,_i16=0,_iterator15=_isArray15?_iterator15:_iterator15[Symbol.iterator]();;){var _ref14;if(_isArray15){if(_i16>=_iterator15.length)break;_ref14=_iterator15[_i16++];}else{_i16=_iterator15.next();if(_i16.done)break;_ref14=_i16.value;}
+var item=_ref14;var entry;if(item.webkitGetAsEntry!=null&&(entry=item.webkitGetAsEntry())){if(entry.isFile){result.push(_this5.addFile(item.getAsFile()));}else if(entry.isDirectory){result.push(_this5._addFilesFromDirectory(entry,entry.name));}else{result.push(undefined);}}else if(item.getAsFile!=null){if(item.kind==null||item.kind==="file"){result.push(_this5.addFile(item.getAsFile()));}else{result.push(undefined);}}else{result.push(undefined);}}
+return result;}();}},{key:"_addFilesFromDirectory",value:function _addFilesFromDirectory(directory,path){var _this6=this;var dirReader=directory.createReader();var errorHandler=function errorHandler(error){return __guardMethod__(console,'log',function(o){return o.log(error);});};var readEntries=function readEntries(){return dirReader.readEntries(function(entries){if(entries.length>0){for(var _iterator16=entries,_isArray16=true,_i17=0,_iterator16=_isArray16?_iterator16:_iterator16[Symbol.iterator]();;){var _ref15;if(_isArray16){if(_i17>=_iterator16.length)break;_ref15=_iterator16[_i17++];}else{_i17=_iterator16.next();if(_i17.done)break;_ref15=_i17.value;}
+var entry=_ref15;if(entry.isFile){entry.file(function(file){if(_this6.options.ignoreHiddenFiles&&file.name.substring(0,1)==='.'){return;}
+file.fullPath=path+"/"+file.name;return _this6.addFile(file);});}else if(entry.isDirectory){_this6._addFilesFromDirectory(entry,path+"/"+entry.name);}}
+readEntries();}
+return null;},errorHandler);};return readEntries();}},{key:"accept",value:function accept(file,done){if(this.options.maxFilesize&&file.size>this.options.maxFilesize*1024*1024){return done(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(file.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize));}else if(!Dropzone.isValidFile(file,this.options.acceptedFiles)){return done(this.options.dictInvalidFileType);}else if(this.options.maxFiles!=null&&this.getAcceptedFiles().length>=this.options.maxFiles){done(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles));return this.emit("maxfilesexceeded",file);}else{return this.options.accept.call(this,file,done);}}},{key:"addFile",value:function addFile(file){var _this7=this;file.upload={uuid:Dropzone.uuidv4(),progress:0,total:file.size,bytesSent:0,filename:this._renameFile(file),chunked:this.options.chunking&&(this.options.forceChunking||file.size>this.options.chunkSize),totalChunkCount:Math.ceil(file.size/this.options.chunkSize)};this.files.push(file);file.status=Dropzone.ADDED;this.emit("addedfile",file);this._enqueueThumbnail(file);return this.accept(file,function(error){if(error){file.accepted=false;_this7._errorProcessing([file],error);}else{file.accepted=true;if(_this7.options.autoQueue){_this7.enqueueFile(file);}}
+return _this7._updateMaxFilesReachedClass();});}},{key:"enqueueFiles",value:function enqueueFiles(files){for(var _iterator17=files,_isArray17=true,_i18=0,_iterator17=_isArray17?_iterator17:_iterator17[Symbol.iterator]();;){var _ref16;if(_isArray17){if(_i18>=_iterator17.length)break;_ref16=_iterator17[_i18++];}else{_i18=_iterator17.next();if(_i18.done)break;_ref16=_i18.value;}
+var file=_ref16;this.enqueueFile(file);}
+return null;}},{key:"enqueueFile",value:function enqueueFile(file){var _this8=this;if(file.status===Dropzone.ADDED&&file.accepted===true){file.status=Dropzone.QUEUED;if(this.options.autoProcessQueue){return setTimeout(function(){return _this8.processQueue();},0);}}else{throw new Error("This file can't be queued because it has already been processed or was rejected.");}}},{key:"_enqueueThumbnail",value:function _enqueueThumbnail(file){var _this9=this;if(this.options.createImageThumbnails&&file.type.match(/image.*/)&&file.size<=this.options.maxThumbnailFilesize*1024*1024){this._thumbnailQueue.push(file);return setTimeout(function(){return _this9._processThumbnailQueue();},0);}}},{key:"_processThumbnailQueue",value:function _processThumbnailQueue(){var _this10=this;if(this._processingThumbnail||this._thumbnailQueue.length===0){return;}
+this._processingThumbnail=true;var file=this._thumbnailQueue.shift();return this.createThumbnail(file,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,true,function(dataUrl){_this10.emit("thumbnail",file,dataUrl);_this10._processingThumbnail=false;return _this10._processThumbnailQueue();});}},{key:"removeFile",value:function removeFile(file){if(file.status===Dropzone.UPLOADING){this.cancelUpload(file);}
+this.files=without(this.files,file);this.emit("removedfile",file);if(this.files.length===0){return this.emit("reset");}}},{key:"removeAllFiles",value:function removeAllFiles(cancelIfNecessary){if(cancelIfNecessary==null){cancelIfNecessary=false;}
+for(var _iterator18=this.files.slice(),_isArray18=true,_i19=0,_iterator18=_isArray18?_iterator18:_iterator18[Symbol.iterator]();;){var _ref17;if(_isArray18){if(_i19>=_iterator18.length)break;_ref17=_iterator18[_i19++];}else{_i19=_iterator18.next();if(_i19.done)break;_ref17=_i19.value;}
+var file=_ref17;if(file.status!==Dropzone.UPLOADING||cancelIfNecessary){this.removeFile(file);}}
+return null;}},{key:"resizeImage",value:function resizeImage(file,width,height,resizeMethod,callback){var _this11=this;return this.createThumbnail(file,width,height,resizeMethod,true,function(dataUrl,canvas){if(canvas==null){return callback(file);}else{var resizeMimeType=_this11.options.resizeMimeType;if(resizeMimeType==null){resizeMimeType=file.type;}
+var resizedDataURL=canvas.toDataURL(resizeMimeType,_this11.options.resizeQuality);if(resizeMimeType==='image/jpeg'||resizeMimeType==='image/jpg'){resizedDataURL=ExifRestore.restore(file.dataURL,resizedDataURL);}
+return callback(Dropzone.dataURItoBlob(resizedDataURL));}});}},{key:"createThumbnail",value:function createThumbnail(file,width,height,resizeMethod,fixOrientation,callback){var _this12=this;var fileReader=new FileReader();fileReader.onload=function(){file.dataURL=fileReader.result;if(file.type==="image/svg+xml"){if(callback!=null){callback(fileReader.result);}
return;}
-return _this.createThumbnailFromUrl(file,fileReader.result,callback);};})(this);return fileReader.readAsDataURL(file);};Dropzone.prototype.createThumbnailFromUrl=function(file,imageUrl,callback){var img;img=document.createElement("img");img.onload=(function(_this){return function(){var canvas,ctx,resizeInfo,thumbnail,_ref,_ref1,_ref2,_ref3;file.width=img.width;file.height=img.height;resizeInfo=_this.options.resize.call(_this,file);if(resizeInfo.trgWidth==null){resizeInfo.trgWidth=resizeInfo.optWidth;}
-if(resizeInfo.trgHeight==null){resizeInfo.trgHeight=resizeInfo.optHeight;}
-canvas=document.createElement("canvas");ctx=canvas.getContext("2d");canvas.width=resizeInfo.trgWidth;canvas.height=resizeInfo.trgHeight;drawImageIOSFix(ctx,img,(_ref=resizeInfo.srcX)!=null?_ref:0,(_ref1=resizeInfo.srcY)!=null?_ref1:0,resizeInfo.srcWidth,resizeInfo.srcHeight,(_ref2=resizeInfo.trgX)!=null?_ref2:0,(_ref3=resizeInfo.trgY)!=null?_ref3:0,resizeInfo.trgWidth,resizeInfo.trgHeight);thumbnail=canvas.toDataURL("image/png");_this.emit("thumbnail",file,thumbnail);if(callback!=null){return callback();}};})(this);if(callback!=null){img.onerror=callback;}
-return img.src=imageUrl;};Dropzone.prototype.processQueue=function(){var i,parallelUploads,processingLength,queuedFiles;parallelUploads=this.options.parallelUploads;processingLength=this.getUploadingFiles().length;i=processingLength;if(processingLength>=parallelUploads){return;}
-queuedFiles=this.getQueuedFiles();if(!(queuedFiles.length>0)){return;}
+return _this12.createThumbnailFromUrl(file,width,height,resizeMethod,fixOrientation,callback);};return fileReader.readAsDataURL(file);}},{key:"createThumbnailFromUrl",value:function createThumbnailFromUrl(file,width,height,resizeMethod,fixOrientation,callback,crossOrigin){var _this13=this;var img=document.createElement("img");if(crossOrigin){img.crossOrigin=crossOrigin;}
+img.onload=function(){var loadExif=function loadExif(callback){return callback(1);};if(typeof EXIF!=='undefined'&&EXIF!==null&&fixOrientation){loadExif=function loadExif(callback){return EXIF.getData(img,function(){return callback(EXIF.getTag(this,'Orientation'));});};}
+return loadExif(function(orientation){file.width=img.width;file.height=img.height;var resizeInfo=_this13.options.resize.call(_this13,file,width,height,resizeMethod);var canvas=document.createElement("canvas");var ctx=canvas.getContext("2d");canvas.width=resizeInfo.trgWidth;canvas.height=resizeInfo.trgHeight;if(orientation>4){canvas.width=resizeInfo.trgHeight;canvas.height=resizeInfo.trgWidth;}
+switch(orientation){case 2:ctx.translate(canvas.width,0);ctx.scale(-1,1);break;case 3:ctx.translate(canvas.width,canvas.height);ctx.rotate(Math.PI);break;case 4:ctx.translate(0,canvas.height);ctx.scale(1,-1);break;case 5:ctx.rotate(0.5*Math.PI);ctx.scale(1,-1);break;case 6:ctx.rotate(0.5*Math.PI);ctx.translate(0,-canvas.width);break;case 7:ctx.rotate(0.5*Math.PI);ctx.translate(canvas.height,-canvas.width);ctx.scale(-1,1);break;case 8:ctx.rotate(-0.5*Math.PI);ctx.translate(-canvas.height,0);break;}
+drawImageIOSFix(ctx,img,resizeInfo.srcX!=null?resizeInfo.srcX:0,resizeInfo.srcY!=null?resizeInfo.srcY:0,resizeInfo.srcWidth,resizeInfo.srcHeight,resizeInfo.trgX!=null?resizeInfo.trgX:0,resizeInfo.trgY!=null?resizeInfo.trgY:0,resizeInfo.trgWidth,resizeInfo.trgHeight);var thumbnail=canvas.toDataURL("image/png");if(callback!=null){return callback(thumbnail,canvas);}});};if(callback!=null){img.onerror=callback;}
+return img.src=file.dataURL;}},{key:"processQueue",value:function processQueue(){var parallelUploads=this.options.parallelUploads;var processingLength=this.getUploadingFiles().length;var i=processingLength;if(processingLength>=parallelUploads){return;}
+var queuedFiles=this.getQueuedFiles();if(!(queuedFiles.length>0)){return;}
if(this.options.uploadMultiple){return this.processFiles(queuedFiles.slice(0,parallelUploads-processingLength));}else{while(i=_iterator19.length)break;_ref18=_iterator19[_i20++];}else{_i20=_iterator19.next();if(_i20.done)break;_ref18=_i20.value;}
+var file=_ref18;file.processing=true;file.status=Dropzone.UPLOADING;this.emit("processing",file);}
if(this.options.uploadMultiple){this.emit("processingmultiple",files);}
-return this.uploadFiles(files);};Dropzone.prototype._getFilesWithXhr=function(xhr){var file,files;return files=(function(){var _i,_len,_ref,_results;_ref=this.files;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){file=_ref[_i];if(file.xhr===xhr){_results.push(file);}}
-return _results;}).call(this);};Dropzone.prototype.cancelUpload=function(file){var groupedFile,groupedFiles,_i,_j,_len,_len1,_ref;if(file.status===Dropzone.UPLOADING){groupedFiles=this._getFilesWithXhr(file.xhr);for(_i=0,_len=groupedFiles.length;_i<_len;_i++){groupedFile=groupedFiles[_i];groupedFile.status=Dropzone.CANCELED;}
-file.xhr.abort();for(_j=0,_len1=groupedFiles.length;_j<_len1;_j++){groupedFile=groupedFiles[_j];this.emit("canceled",groupedFile);}
-if(this.options.uploadMultiple){this.emit("canceledmultiple",groupedFiles);}}else if((_ref=file.status)===Dropzone.ADDED||_ref===Dropzone.QUEUED){file.status=Dropzone.CANCELED;this.emit("canceled",file);if(this.options.uploadMultiple){this.emit("canceledmultiple",[file]);}}
-if(this.options.autoProcessQueue){return this.processQueue();}};resolveOption=function(){var args,option;option=arguments[0],args=2<=arguments.length?__slice.call(arguments,1):[];if(typeof option==='function'){return option.apply(this,args);}
-return option;};Dropzone.prototype.uploadFile=function(file){return this.uploadFiles([file]);};Dropzone.prototype.uploadFiles=function(files){var file,formData,handleError,headerName,headerValue,headers,i,input,inputName,inputType,key,method,option,progressObj,response,updateProgress,url,value,xhr,_i,_j,_k,_l,_len,_len1,_len2,_len3,_m,_ref,_ref1,_ref2,_ref3,_ref4,_ref5;xhr=new XMLHttpRequest();for(_i=0,_len=files.length;_i<_len;_i++){file=files[_i];file.xhr=xhr;}
-method=resolveOption(this.options.method,files);url=resolveOption(this.options.url,files);xhr.open(method,url,true);xhr.withCredentials=!!this.options.withCredentials;response=null;handleError=(function(_this){return function(){var _j,_len1,_results;_results=[];for(_j=0,_len1=files.length;_j<_len1;_j++){file=files[_j];_results.push(_this._errorProcessing(files,response||_this.options.dictResponseError.replace("{{statusCode}}",xhr.status),xhr));}
-return _results;};})(this);updateProgress=(function(_this){return function(e){var allFilesFinished,progress,_j,_k,_l,_len1,_len2,_len3,_results;if(e!=null){progress=100*e.loaded/e.total;for(_j=0,_len1=files.length;_j<_len1;_j++){file=files[_j];file.upload={progress:progress,total:e.total,bytesSent:e.loaded};}}else{allFilesFinished=true;progress=100;for(_k=0,_len2=files.length;_k<_len2;_k++){file=files[_k];if(!(file.upload.progress===100&&file.upload.bytesSent===file.upload.total)){allFilesFinished=false;}
-file.upload.progress=progress;file.upload.bytesSent=file.upload.total;}
-if(allFilesFinished){return;}}
-_results=[];for(_l=0,_len3=files.length;_l<_len3;_l++){file=files[_l];_results.push(_this.emit("uploadprogress",file,progress,file.upload.bytesSent));}
-return _results;};})(this);xhr.onload=(function(_this){return function(e){var _ref;if(files[0].status===Dropzone.CANCELED){return;}
-if(xhr.readyState!==4){return;}
-response=xhr.responseText;if(xhr.getResponseHeader("content-type")&&~xhr.getResponseHeader("content-type").indexOf("application/json")){try{response=JSON.parse(response);}catch(_error){e=_error;response="Invalid JSON response from server.";}}
-updateProgress();if(!((200<=(_ref=xhr.status)&&_ref<300))){return handleError();}else{return _this._finished(files,response,e);}};})(this);xhr.onerror=(function(_this){return function(){if(files[0].status===Dropzone.CANCELED){return;}
-return handleError();};})(this);progressObj=(_ref=xhr.upload)!=null?_ref:xhr;progressObj.onprogress=updateProgress;headers={"Accept":"application/json","Cache-Control":"no-cache","X-Requested-With":"XMLHttpRequest"};if(this.options.headers){extend(headers,this.options.headers);}
-for(headerName in headers){headerValue=headers[headerName];xhr.setRequestHeader(headerName,headerValue);}
-formData=new FormData();if(this.options.params){_ref1=this.options.params;for(key in _ref1){value=_ref1[key];formData.append(key,value);}}
-for(_j=0,_len1=files.length;_j<_len1;_j++){file=files[_j];this.emit("sending",file,xhr,formData);}
+return this.uploadFiles(files);}},{key:"_getFilesWithXhr",value:function _getFilesWithXhr(xhr){var files=void 0;return files=this.files.filter(function(file){return file.xhr===xhr;}).map(function(file){return file;});}},{key:"cancelUpload",value:function cancelUpload(file){if(file.status===Dropzone.UPLOADING){var groupedFiles=this._getFilesWithXhr(file.xhr);for(var _iterator20=groupedFiles,_isArray20=true,_i21=0,_iterator20=_isArray20?_iterator20:_iterator20[Symbol.iterator]();;){var _ref19;if(_isArray20){if(_i21>=_iterator20.length)break;_ref19=_iterator20[_i21++];}else{_i21=_iterator20.next();if(_i21.done)break;_ref19=_i21.value;}
+var groupedFile=_ref19;groupedFile.status=Dropzone.CANCELED;}
+if(typeof file.xhr!=='undefined'){file.xhr.abort();}
+for(var _iterator21=groupedFiles,_isArray21=true,_i22=0,_iterator21=_isArray21?_iterator21:_iterator21[Symbol.iterator]();;){var _ref20;if(_isArray21){if(_i22>=_iterator21.length)break;_ref20=_iterator21[_i22++];}else{_i22=_iterator21.next();if(_i22.done)break;_ref20=_i22.value;}
+var _groupedFile=_ref20;this.emit("canceled",_groupedFile);}
+if(this.options.uploadMultiple){this.emit("canceledmultiple",groupedFiles);}}else if(file.status===Dropzone.ADDED||file.status===Dropzone.QUEUED){file.status=Dropzone.CANCELED;this.emit("canceled",file);if(this.options.uploadMultiple){this.emit("canceledmultiple",[file]);}}
+if(this.options.autoProcessQueue){return this.processQueue();}}},{key:"resolveOption",value:function resolveOption(option){if(typeof option==='function'){for(var _len3=arguments.length,args=Array(_len3>1?_len3-1:0),_key3=1;_key3<_len3;_key3++){args[_key3-1]=arguments[_key3];}
+return option.apply(this,args);}
+return option;}},{key:"uploadFile",value:function uploadFile(file){return this.uploadFiles([file]);}},{key:"uploadFiles",value:function uploadFiles(files){var _this14=this;this._transformFiles(files,function(transformedFiles){if(files[0].upload.chunked){var file=files[0];var transformedFile=transformedFiles[0];var startedChunkCount=0;file.upload.chunks=[];var handleNextChunk=function handleNextChunk(){var chunkIndex=0;while(file.upload.chunks[chunkIndex]!==undefined){chunkIndex++;}
+if(chunkIndex>=file.upload.totalChunkCount)return;startedChunkCount++;var start=chunkIndex*_this14.options.chunkSize;var end=Math.min(start+_this14.options.chunkSize,file.size);var dataBlock={name:_this14._getParamName(0),data:transformedFile.webkitSlice?transformedFile.webkitSlice(start,end):transformedFile.slice(start,end),filename:file.upload.filename,chunkIndex:chunkIndex};file.upload.chunks[chunkIndex]={file:file,index:chunkIndex,dataBlock:dataBlock,status:Dropzone.UPLOADING,progress:0,retries:0};_this14._uploadData(files,[dataBlock]);};file.upload.finishedChunkUpload=function(chunk){var allFinished=true;chunk.status=Dropzone.SUCCESS;chunk.dataBlock=null;chunk.xhr=null;for(var i=0;i=_iterator22.length)break;_ref21=_iterator22[_i24++];}else{_i24=_iterator22.next();if(_i24.done)break;_ref21=_i24.value;}
+var file=_ref21;file.xhr=xhr;}
+if(files[0].upload.chunked){files[0].upload.chunks[dataBlocks[0].chunkIndex].xhr=xhr;}
+var method=this.resolveOption(this.options.method,files);var url=this.resolveOption(this.options.url,files);xhr.open(method,url,true);xhr.timeout=this.resolveOption(this.options.timeout,files);xhr.withCredentials=!!this.options.withCredentials;xhr.onload=function(e){_this15._finishedUploading(files,xhr,e);};xhr.onerror=function(){_this15._handleUploadError(files,xhr);};var progressObj=xhr.upload!=null?xhr.upload:xhr;progressObj.onprogress=function(e){return _this15._updateFilesUploadProgress(files,xhr,e);};var headers={"Accept":"application/json","Cache-Control":"no-cache","X-Requested-With":"XMLHttpRequest"};if(this.options.headers){Dropzone.extend(headers,this.options.headers);}
+for(var headerName in headers){var headerValue=headers[headerName];if(headerValue){xhr.setRequestHeader(headerName,headerValue);}}
+var formData=new FormData();if(this.options.params){var additionalParams=this.options.params;if(typeof additionalParams==='function'){additionalParams=additionalParams.call(this,files,xhr,files[0].upload.chunked?this._getChunk(files[0],xhr):null);}
+for(var key in additionalParams){var value=additionalParams[key];formData.append(key,value);}}
+for(var _iterator23=files,_isArray23=true,_i25=0,_iterator23=_isArray23?_iterator23:_iterator23[Symbol.iterator]();;){var _ref22;if(_isArray23){if(_i25>=_iterator23.length)break;_ref22=_iterator23[_i25++];}else{_i25=_iterator23.next();if(_i25.done)break;_ref22=_i25.value;}
+var _file=_ref22;this.emit("sending",_file,xhr,formData);}
if(this.options.uploadMultiple){this.emit("sendingmultiple",files,xhr,formData);}
-if(this.element.tagName==="FORM"){_ref2=this.element.querySelectorAll("input, textarea, select, button");for(_k=0,_len2=_ref2.length;_k<_len2;_k++){input=_ref2[_k];inputName=input.getAttribute("name");inputType=input.getAttribute("type");if(input.tagName==="SELECT"&&input.hasAttribute("multiple")){_ref3=input.options;for(_l=0,_len3=_ref3.length;_l<_len3;_l++){option=_ref3[_l];if(option.selected){formData.append(inputName,option.value);}}}else if(!inputType||((_ref4=inputType.toLowerCase())!=="checkbox"&&_ref4!=="radio")||input.checked){formData.append(inputName,input.value);}}}
-for(i=_m=0,_ref5=files.length-1;0<=_ref5?_m<=_ref5:_m>=_ref5;i=0<=_ref5?++_m:--_m){formData.append(this._getParamName(i),files[i],files[i].name);}
-return xhr.send(formData);};Dropzone.prototype._finished=function(files,responseText,e){var file,_i,_len;for(_i=0,_len=files.length;_i<_len;_i++){file=files[_i];file.status=Dropzone.SUCCESS;this.emit("success",file,responseText,e);this.emit("complete",file);}
+this._addFormElementData(formData);for(var i=0;i=_iterator24.length)break;_ref23=_iterator24[_i26++];}else{_i26=_iterator24.next();if(_i26.done)break;_ref23=_i26.value;}
+var input=_ref23;var inputName=input.getAttribute("name");var inputType=input.getAttribute("type");if(inputType)inputType=inputType.toLowerCase();if(typeof inputName==='undefined'||inputName===null)continue;if(input.tagName==="SELECT"&&input.hasAttribute("multiple")){for(var _iterator25=input.options,_isArray25=true,_i27=0,_iterator25=_isArray25?_iterator25:_iterator25[Symbol.iterator]();;){var _ref24;if(_isArray25){if(_i27>=_iterator25.length)break;_ref24=_iterator25[_i27++];}else{_i27=_iterator25.next();if(_i27.done)break;_ref24=_i27.value;}
+var option=_ref24;if(option.selected){formData.append(inputName,option.value);}}}else if(!inputType||inputType!=="checkbox"&&inputType!=="radio"||input.checked){formData.append(inputName,input.value);}}}}},{key:"_updateFilesUploadProgress",value:function _updateFilesUploadProgress(files,xhr,e){var progress=void 0;if(typeof e!=='undefined'){progress=100*e.loaded/e.total;if(files[0].upload.chunked){var file=files[0];var chunk=this._getChunk(file,xhr);chunk.progress=progress;chunk.total=e.total;chunk.bytesSent=e.loaded;var fileProgress=0,fileTotal=void 0,fileBytesSent=void 0;file.upload.progress=0;file.upload.total=0;file.upload.bytesSent=0;for(var i=0;i=_iterator26.length)break;_ref25=_iterator26[_i28++];}else{_i28=_iterator26.next();if(_i28.done)break;_ref25=_i28.value;}
+var _file2=_ref25;_file2.upload.progress=progress;_file2.upload.total=e.total;_file2.upload.bytesSent=e.loaded;}}
+for(var _iterator27=files,_isArray27=true,_i29=0,_iterator27=_isArray27?_iterator27:_iterator27[Symbol.iterator]();;){var _ref26;if(_isArray27){if(_i29>=_iterator27.length)break;_ref26=_iterator27[_i29++];}else{_i29=_iterator27.next();if(_i29.done)break;_ref26=_i29.value;}
+var _file3=_ref26;this.emit("uploadprogress",_file3,_file3.upload.progress,_file3.upload.bytesSent);}}else{var allFilesFinished=true;progress=100;for(var _iterator28=files,_isArray28=true,_i30=0,_iterator28=_isArray28?_iterator28:_iterator28[Symbol.iterator]();;){var _ref27;if(_isArray28){if(_i30>=_iterator28.length)break;_ref27=_iterator28[_i30++];}else{_i30=_iterator28.next();if(_i30.done)break;_ref27=_i30.value;}
+var _file4=_ref27;if(_file4.upload.progress!==100||_file4.upload.bytesSent!==_file4.upload.total){allFilesFinished=false;}
+_file4.upload.progress=progress;_file4.upload.bytesSent=_file4.upload.total;}
+if(allFilesFinished){return;}
+for(var _iterator29=files,_isArray29=true,_i31=0,_iterator29=_isArray29?_iterator29:_iterator29[Symbol.iterator]();;){var _ref28;if(_isArray29){if(_i31>=_iterator29.length)break;_ref28=_iterator29[_i31++];}else{_i31=_iterator29.next();if(_i31.done)break;_ref28=_i31.value;}
+var _file5=_ref28;this.emit("uploadprogress",_file5,progress,_file5.upload.bytesSent);}}}},{key:"_finishedUploading",value:function _finishedUploading(files,xhr,e){var response=void 0;if(files[0].status===Dropzone.CANCELED){return;}
+if(xhr.readyState!==4){return;}
+if(xhr.responseType!=='arraybuffer'&&xhr.responseType!=='blob'){response=xhr.responseText;if(xhr.getResponseHeader("content-type")&&~xhr.getResponseHeader("content-type").indexOf("application/json")){try{response=JSON.parse(response);}catch(error){e=error;response="Invalid JSON response from server.";}}}
+this._updateFilesUploadProgress(files);if(!(200<=xhr.status&&xhr.status<300)){this._handleUploadError(files,xhr,response);}else{if(files[0].upload.chunked){files[0].upload.finishedChunkUpload(this._getChunk(files[0],xhr));}else{this._finished(files,response,e);}}}},{key:"_handleUploadError",value:function _handleUploadError(files,xhr,response){if(files[0].status===Dropzone.CANCELED){return;}
+if(files[0].upload.chunked&&this.options.retryChunks){var chunk=this._getChunk(files[0],xhr);if(chunk.retries++=_iterator30.length)break;_ref29=_iterator30[_i32++];}else{_i32=_iterator30.next();if(_i32.done)break;_ref29=_i32.value;}
+var file=_ref29;this._errorProcessing(files,response||this.options.dictResponseError.replace("{{statusCode}}",xhr.status),xhr);}}},{key:"submitRequest",value:function submitRequest(xhr,formData,files){xhr.send(formData);}},{key:"_finished",value:function _finished(files,responseText,e){for(var _iterator31=files,_isArray31=true,_i33=0,_iterator31=_isArray31?_iterator31:_iterator31[Symbol.iterator]();;){var _ref30;if(_isArray31){if(_i33>=_iterator31.length)break;_ref30=_iterator31[_i33++];}else{_i33=_iterator31.next();if(_i33.done)break;_ref30=_i33.value;}
+var file=_ref30;file.status=Dropzone.SUCCESS;this.emit("success",file,responseText,e);this.emit("complete",file);}
if(this.options.uploadMultiple){this.emit("successmultiple",files,responseText,e);this.emit("completemultiple",files);}
-if(this.options.autoProcessQueue){return this.processQueue();}};Dropzone.prototype._errorProcessing=function(files,message,xhr){var file,_i,_len;for(_i=0,_len=files.length;_i<_len;_i++){file=files[_i];file.status=Dropzone.ERROR;this.emit("error",file,message,xhr);this.emit("complete",file);}
+if(this.options.autoProcessQueue){return this.processQueue();}}},{key:"_errorProcessing",value:function _errorProcessing(files,message,xhr){for(var _iterator32=files,_isArray32=true,_i34=0,_iterator32=_isArray32?_iterator32:_iterator32[Symbol.iterator]();;){var _ref31;if(_isArray32){if(_i34>=_iterator32.length)break;_ref31=_iterator32[_i34++];}else{_i34=_iterator32.next();if(_i34.done)break;_ref31=_i34.value;}
+var file=_ref31;file.status=Dropzone.ERROR;this.emit("error",file,message,xhr);this.emit("complete",file);}
if(this.options.uploadMultiple){this.emit("errormultiple",files,message,xhr);this.emit("completemultiple",files);}
-if(this.options.autoProcessQueue){return this.processQueue();}};return Dropzone;})(Emitter);Dropzone.version="4.0.1";Dropzone.options={};Dropzone.optionsForElement=function(element){if(element.getAttribute("id")){return Dropzone.options[camelize(element.getAttribute("id"))];}else{return void 0;}};Dropzone.instances=[];Dropzone.forElement=function(element){if(typeof element==="string"){element=document.querySelector(element);}
-if((element!=null?element.dropzone:void 0)==null){throw new Error("No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.");}
-return element.dropzone;};Dropzone.autoDiscover=true;Dropzone.discover=function(){var checkElements,dropzone,dropzones,_i,_len,_results;if(document.querySelectorAll){dropzones=document.querySelectorAll(".dropzone");}else{dropzones=[];checkElements=function(elements){var el,_i,_len,_results;_results=[];for(_i=0,_len=elements.length;_i<_len;_i++){el=elements[_i];if(/(^| )dropzone($| )/.test(el.className)){_results.push(dropzones.push(el));}else{_results.push(void 0);}}
-return _results;};checkElements(document.getElementsByTagName("div"));checkElements(document.getElementsByTagName("form"));}
-_results=[];for(_i=0,_len=dropzones.length;_i<_len;_i++){dropzone=dropzones[_i];if(Dropzone.optionsForElement(dropzone)!==false){_results.push(new Dropzone(dropzone));}else{_results.push(void 0);}}
-return _results;};Dropzone.blacklistedBrowsers=[/opera.*Macintosh.*version\/12/i];Dropzone.isBrowserSupported=function(){var capableBrowser,regex,_i,_len,_ref;capableBrowser=true;if(window.File&&window.FileReader&&window.FileList&&window.Blob&&window.FormData&&document.querySelector){if(!("classList"in document.createElement("a"))){capableBrowser=false;}else{_ref=Dropzone.blacklistedBrowsers;for(_i=0,_len=_ref.length;_i<_len;_i++){regex=_ref[_i];if(regex.test(navigator.userAgent)){capableBrowser=false;continue;}}}}else{capableBrowser=false;}
-return capableBrowser;};without=function(list,rejectedItem){var item,_i,_len,_results;_results=[];for(_i=0,_len=list.length;_i<_len;_i++){item=list[_i];if(item!==rejectedItem){_results.push(item);}}
-return _results;};camelize=function(str){return str.replace(/[\-_](\w)/g,function(match){return match.charAt(1).toUpperCase();});};Dropzone.createElement=function(string){var div;div=document.createElement("div");div.innerHTML=string;return div.childNodes[0];};Dropzone.elementInside=function(element,container){if(element===container){return true;}
+if(this.options.autoProcessQueue){return this.processQueue();}}}],[{key:"uuidv4",value:function uuidv4(){return'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c){var r=Math.random()*16|0,v=c==='x'?r:r&0x3|0x8;return v.toString(16);});}}]);return Dropzone;}(Emitter);Dropzone.initClass();Dropzone.version="5.5.1";Dropzone.options={};Dropzone.optionsForElement=function(element){if(element.getAttribute("id")){return Dropzone.options[camelize(element.getAttribute("id"))];}else{return undefined;}};Dropzone.instances=[];Dropzone.forElement=function(element){if(typeof element==="string"){element=document.querySelector(element);}
+if((element!=null?element.dropzone:undefined)==null){throw new Error("No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.");}
+return element.dropzone;};Dropzone.autoDiscover=true;Dropzone.discover=function(){var dropzones=void 0;if(document.querySelectorAll){dropzones=document.querySelectorAll(".dropzone");}else{dropzones=[];var checkElements=function checkElements(elements){return function(){var result=[];for(var _iterator33=elements,_isArray33=true,_i35=0,_iterator33=_isArray33?_iterator33:_iterator33[Symbol.iterator]();;){var _ref32;if(_isArray33){if(_i35>=_iterator33.length)break;_ref32=_iterator33[_i35++];}else{_i35=_iterator33.next();if(_i35.done)break;_ref32=_i35.value;}
+var el=_ref32;if(/(^| )dropzone($| )/.test(el.className)){result.push(dropzones.push(el));}else{result.push(undefined);}}
+return result;}();};checkElements(document.getElementsByTagName("div"));checkElements(document.getElementsByTagName("form"));}
+return function(){var result=[];for(var _iterator34=dropzones,_isArray34=true,_i36=0,_iterator34=_isArray34?_iterator34:_iterator34[Symbol.iterator]();;){var _ref33;if(_isArray34){if(_i36>=_iterator34.length)break;_ref33=_iterator34[_i36++];}else{_i36=_iterator34.next();if(_i36.done)break;_ref33=_i36.value;}
+var dropzone=_ref33;if(Dropzone.optionsForElement(dropzone)!==false){result.push(new Dropzone(dropzone));}else{result.push(undefined);}}
+return result;}();};Dropzone.blacklistedBrowsers=[/opera.*(Macintosh|Windows Phone).*version\/12/i];Dropzone.isBrowserSupported=function(){var capableBrowser=true;if(window.File&&window.FileReader&&window.FileList&&window.Blob&&window.FormData&&document.querySelector){if(!("classList"in document.createElement("a"))){capableBrowser=false;}else{for(var _iterator35=Dropzone.blacklistedBrowsers,_isArray35=true,_i37=0,_iterator35=_isArray35?_iterator35:_iterator35[Symbol.iterator]();;){var _ref34;if(_isArray35){if(_i37>=_iterator35.length)break;_ref34=_iterator35[_i37++];}else{_i37=_iterator35.next();if(_i37.done)break;_ref34=_i37.value;}
+var regex=_ref34;if(regex.test(navigator.userAgent)){capableBrowser=false;continue;}}}}else{capableBrowser=false;}
+return capableBrowser;};Dropzone.dataURItoBlob=function(dataURI){var byteString=atob(dataURI.split(',')[1]);var mimeString=dataURI.split(',')[0].split(':')[1].split(';')[0];var ab=new ArrayBuffer(byteString.length);var ia=new Uint8Array(ab);for(var i=0,end=byteString.length,asc=0<=end;asc?i<=end:i>=end;asc?i++:i--){ia[i]=byteString.charCodeAt(i);}
+return new Blob([ab],{type:mimeString});};var without=function without(list,rejectedItem){return list.filter(function(item){return item!==rejectedItem;}).map(function(item){return item;});};var camelize=function camelize(str){return str.replace(/[\-_](\w)/g,function(match){return match.charAt(1).toUpperCase();});};Dropzone.createElement=function(string){var div=document.createElement("div");div.innerHTML=string;return div.childNodes[0];};Dropzone.elementInside=function(element,container){if(element===container){return true;}
while(element=element.parentNode){if(element===container){return true;}}
-return false;};Dropzone.getElement=function(el,name){var element;if(typeof el==="string"){element=document.querySelector(el);}else if(el.nodeType!=null){element=el;}
+return false;};Dropzone.getElement=function(el,name){var element=void 0;if(typeof el==="string"){element=document.querySelector(el);}else if(el.nodeType!=null){element=el;}
if(element==null){throw new Error("Invalid `"+name+"` option provided. Please provide a CSS selector or a plain HTML element.");}
-return element;};Dropzone.getElements=function(els,name){var e,el,elements,_i,_j,_len,_len1,_ref;if(els instanceof Array){elements=[];try{for(_i=0,_len=els.length;_i<_len;_i++){el=els[_i];elements.push(this.getElement(el,name));}}catch(_error){e=_error;elements=null;}}else if(typeof els==="string"){elements=[];_ref=document.querySelectorAll(els);for(_j=0,_len1=_ref.length;_j<_len1;_j++){el=_ref[_j];elements.push(el);}}else if(els.nodeType!=null){elements=[els];}
-if(!((elements!=null)&&elements.length)){throw new Error("Invalid `"+name+"` option provided. Please provide a CSS selector, a plain HTML element or a list of those.");}
-return elements;};Dropzone.confirm=function(question,accepted,rejected){if(window.confirm(question)){return accepted();}else if(rejected!=null){return rejected();}};Dropzone.isValidFile=function(file,acceptedFiles){var baseMimeType,mimeType,validType,_i,_len;if(!acceptedFiles){return true;}
-acceptedFiles=acceptedFiles.split(",");mimeType=file.type;baseMimeType=mimeType.replace(/\/.*$/,"");for(_i=0,_len=acceptedFiles.length;_i<_len;_i++){validType=acceptedFiles[_i];validType=validType.trim();if(validType.charAt(0)==="."){if(file.name.toLowerCase().indexOf(validType.toLowerCase(),file.name.length-validType.length)!==-1){return true;}}else if(/\/\*$/.test(validType)){if(baseMimeType===validType.replace(/\/.*$/,"")){return true;}}else{if(mimeType===validType){return true;}}}
-return false;};if(typeof jQuery!=="undefined"&&jQuery!==null){jQuery.fn.dropzone=function(options){return this.each(function(){return new Dropzone(this,options);});};}
-if(typeof module!=="undefined"&&module!==null){module.exports=Dropzone;}else{window.Dropzone=Dropzone;}
-Dropzone.ADDED="added";Dropzone.QUEUED="queued";Dropzone.ACCEPTED=Dropzone.QUEUED;Dropzone.UPLOADING="uploading";Dropzone.PROCESSING=Dropzone.UPLOADING;Dropzone.CANCELED="canceled";Dropzone.ERROR="error";Dropzone.SUCCESS="success";detectVerticalSquash=function(img){var alpha,canvas,ctx,data,ey,ih,iw,py,ratio,sy;iw=img.naturalWidth;ih=img.naturalHeight;canvas=document.createElement("canvas");canvas.width=1;canvas.height=ih;ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);data=ctx.getImageData(0,0,1,ih).data;sy=0;ey=ih;py=ih;while(py>sy){alpha=data[(py-1)*4+3];if(alpha===0){ey=py;}else{sy=py;}
-py=(ey+sy)>>1;}
-ratio=py/ih;if(ratio===0){return 1;}else{return ratio;}};drawImageIOSFix=function(ctx,img,sx,sy,sw,sh,dx,dy,dw,dh){var vertSquashRatio;vertSquashRatio=detectVerticalSquash(img);return ctx.drawImage(img,sx,sy,sw,sh,dx,dy,dw,dh/vertSquashRatio);};contentLoaded=function(win,fn){var add,doc,done,init,poll,pre,rem,root,top;done=false;top=true;doc=win.document;root=doc.documentElement;add=(doc.addEventListener?"addEventListener":"attachEvent");rem=(doc.addEventListener?"removeEventListener":"detachEvent");pre=(doc.addEventListener?"":"on");init=function(e){if(e.type==="readystatechange"&&doc.readyState!=="complete"){return;}
-(e.type==="load"?win:doc)[rem](pre+e.type,init,false);if(!done&&(done=true)){return fn.call(win,e.type||e);}};poll=function(){var e;try{root.doScroll("left");}catch(_error){e=_error;setTimeout(poll,50);return;}
-return init("poll");};if(doc.readyState!=="complete"){if(doc.createEventObject&&root.doScroll){try{top=!win.frameElement;}catch(_error){}
+return element;};Dropzone.getElements=function(els,name){var el=void 0,elements=void 0;if(els instanceof Array){elements=[];try{for(var _iterator36=els,_isArray36=true,_i38=0,_iterator36=_isArray36?_iterator36:_iterator36[Symbol.iterator]();;){if(_isArray36){if(_i38>=_iterator36.length)break;el=_iterator36[_i38++];}else{_i38=_iterator36.next();if(_i38.done)break;el=_i38.value;}
+elements.push(this.getElement(el,name));}}catch(e){elements=null;}}else if(typeof els==="string"){elements=[];for(var _iterator37=document.querySelectorAll(els),_isArray37=true,_i39=0,_iterator37=_isArray37?_iterator37:_iterator37[Symbol.iterator]();;){if(_isArray37){if(_i39>=_iterator37.length)break;el=_iterator37[_i39++];}else{_i39=_iterator37.next();if(_i39.done)break;el=_i39.value;}
+elements.push(el);}}else if(els.nodeType!=null){elements=[els];}
+if(elements==null||!elements.length){throw new Error("Invalid `"+name+"` option provided. Please provide a CSS selector, a plain HTML element or a list of those.");}
+return elements;};Dropzone.confirm=function(question,accepted,rejected){if(window.confirm(question)){return accepted();}else if(rejected!=null){return rejected();}};Dropzone.isValidFile=function(file,acceptedFiles){if(!acceptedFiles){return true;}
+acceptedFiles=acceptedFiles.split(",");var mimeType=file.type;var baseMimeType=mimeType.replace(/\/.*$/,"");for(var _iterator38=acceptedFiles,_isArray38=true,_i40=0,_iterator38=_isArray38?_iterator38:_iterator38[Symbol.iterator]();;){var _ref35;if(_isArray38){if(_i40>=_iterator38.length)break;_ref35=_iterator38[_i40++];}else{_i40=_iterator38.next();if(_i40.done)break;_ref35=_i40.value;}
+var validType=_ref35;validType=validType.trim();if(validType.charAt(0)==="."){if(file.name.toLowerCase().indexOf(validType.toLowerCase(),file.name.length-validType.length)!==-1){return true;}}else if(/\/\*$/.test(validType)){if(baseMimeType===validType.replace(/\/.*$/,"")){return true;}}else{if(mimeType===validType){return true;}}}
+return false;};if(typeof jQuery!=='undefined'&&jQuery!==null){jQuery.fn.dropzone=function(options){return this.each(function(){return new Dropzone(this,options);});};}
+if(typeof module!=='undefined'&&module!==null){module.exports=Dropzone;}else{window.Dropzone=Dropzone;}
+Dropzone.ADDED="added";Dropzone.QUEUED="queued";Dropzone.ACCEPTED=Dropzone.QUEUED;Dropzone.UPLOADING="uploading";Dropzone.PROCESSING=Dropzone.UPLOADING;Dropzone.CANCELED="canceled";Dropzone.ERROR="error";Dropzone.SUCCESS="success";var detectVerticalSquash=function detectVerticalSquash(img){var iw=img.naturalWidth;var ih=img.naturalHeight;var canvas=document.createElement("canvas");canvas.width=1;canvas.height=ih;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);var _ctx$getImageData=ctx.getImageData(1,0,1,ih),data=_ctx$getImageData.data;var sy=0;var ey=ih;var py=ih;while(py>sy){var alpha=data[(py-1)*4+3];if(alpha===0){ey=py;}else{sy=py;}
+py=ey+sy>>1;}
+var ratio=py/ih;if(ratio===0){return 1;}else{return ratio;}};var drawImageIOSFix=function drawImageIOSFix(ctx,img,sx,sy,sw,sh,dx,dy,dw,dh){var vertSquashRatio=detectVerticalSquash(img);return ctx.drawImage(img,sx,sy,sw,sh,dx,dy,dw,dh/vertSquashRatio);};var ExifRestore=function(){function ExifRestore(){_classCallCheck(this,ExifRestore);}
+_createClass(ExifRestore,null,[{key:"initClass",value:function initClass(){this.KEY_STR='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';}},{key:"encode64",value:function encode64(input){var output='';var chr1=undefined;var chr2=undefined;var chr3='';var enc1=undefined;var enc2=undefined;var enc3=undefined;var enc4='';var i=0;while(true){chr1=input[i++];chr2=input[i++];chr3=input[i++];enc1=chr1>>2;enc2=(chr1&3)<<4|chr2>>4;enc3=(chr2&15)<<2|chr3>>6;enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64;}else if(isNaN(chr3)){enc4=64;}
+output=output+this.KEY_STR.charAt(enc1)+this.KEY_STR.charAt(enc2)+this.KEY_STR.charAt(enc3)+this.KEY_STR.charAt(enc4);chr1=chr2=chr3='';enc1=enc2=enc3=enc4='';if(!(irawImageArray.length){break;}}
+return segments;}},{key:"decode64",value:function decode64(input){var output='';var chr1=undefined;var chr2=undefined;var chr3='';var enc1=undefined;var enc2=undefined;var enc3=undefined;var enc4='';var i=0;var buf=[];var base64test=/[^A-Za-z0-9\+\/\=]/g;if(base64test.exec(input)){console.warn('There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, \'+\', \'/\',and \'=\'\nExpect errors in decoding.');}
+input=input.replace(/[^A-Za-z0-9\+\/\=]/g,'');while(true){enc1=this.KEY_STR.indexOf(input.charAt(i++));enc2=this.KEY_STR.indexOf(input.charAt(i++));enc3=this.KEY_STR.indexOf(input.charAt(i++));enc4=this.KEY_STR.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;buf.push(chr1);if(enc3!==64){buf.push(chr2);}
+if(enc4!==64){buf.push(chr3);}
+chr1=chr2=chr3='';enc1=enc2=enc3=enc4='';if(!(i=0){newClass=newClass.replace(' '+className+' ',' ');}
+doc[add](pre+"DOMContentLoaded",init,false);doc[add](pre+"readystatechange",init,false);return win[add](pre+"load",init,false);}};Dropzone._autoDiscoverFunction=function(){if(Dropzone.autoDiscover){return Dropzone.discover();}};contentLoaded(window,Dropzone._autoDiscoverFunction);function __guard__(value,transform){return typeof value!=='undefined'&&value!==null?transform(value):undefined;}
+function __guardMethod__(obj,methodName,transform){if(typeof obj!=='undefined'&&obj!==null&&typeof obj[methodName]==='function'){return transform(obj,methodName);}else{return undefined;}}
+(function(window,document){var modalClass='.sweet-alert',overlayClass='.sweet-overlay',alertTypes=['error','warning','info','success'],defaultParams={title:'',text:'',type:null,allowOutsideClick:false,showCancelButton:false,showConfirmButton:true,closeOnConfirm:true,closeOnCancel:true,confirmButtonText:'OK',confirmButtonClass:'btn-primary',cancelButtonText:'Cancel',cancelButtonClass:'btn-default',containerClass:'',titleClass:'',textClass:'',imageUrl:null,imageSize:null,timer:null};var getModal=function(){return document.querySelector(modalClass);},getOverlay=function(){return document.querySelector(overlayClass);},hasClass=function(elem,className){return new RegExp(' '+className+' ').test(' '+elem.className+' ');},addClass=function(elem,className){if(className&&!hasClass(elem,className)){elem.className+=' '+className;}},removeClass=function(elem,className){var newClass=' '+elem.className.replace(/[\t\r\n]/g,' ')+' ';if(hasClass(elem,className)){while(newClass.indexOf(' '+className+' ')>=0){newClass=newClass.replace(' '+className+' ',' ');}
elem.className=newClass.replace(/^\s+|\s+$/g,'');}},escapeHtml=function(str){var div=document.createElement('div');div.appendChild(document.createTextNode(str));return div.innerHTML;},_show=function(elem){elem.style.opacity='';elem.style.display='block';},show=function(elems){if(elems&&!elems.length){return _show(elems);}
for(var i=0;i0){setTimeout(tick,interval);}else{elem.style.display='none';}};tick();},fireClick=function(node){if(MouseEvent){var mevt=new MouseEvent('click',{view:window,bubbles:false,cancelable:true});node.dispatchEvent(mevt);}else if(document.createEvent){var evt=document.createEvent('MouseEvents');evt.initEvent('click',false,false);node.dispatchEvent(evt);}else if(document.createEventObject){node.fireEvent('onclick');}else if(typeof node.onclick==='function'){node.onclick();}},stopEventPropagation=function(e){if(typeof e.stopPropagation==='function'){e.stopPropagation();e.preventDefault();}else if(window.event&&window.event.hasOwnProperty('cancelBubble')){window.event.cancelBubble=true;}};var previousActiveElement,previousDocumentClick,previousWindowKeyDown,lastFocusedButton;window.sweetAlertInitialize=function(){var sweetHTML='
',sweetWrap=document.createElement('div');sweetWrap.innerHTML=sweetHTML;document.body.appendChild(sweetWrap);}
+return false;},getTopMargin=function(elem){elem.style.left='-9999px';elem.style.display='block';var height=elem.clientHeight;var padding=parseInt(getComputedStyle(elem).getPropertyValue('padding'),10);elem.style.left='';elem.style.display='none';return('-'+parseInt(height/2+padding)+'px');},fadeIn=function(elem,interval){if(+elem.style.opacity<1){interval=interval||16;elem.style.opacity=0;elem.style.display='block';var last=+new Date();var tick=function(){elem.style.opacity=+elem.style.opacity+(new Date()-last)/100;last=+new Date();if(+elem.style.opacity<1){setTimeout(tick,interval);}};tick();}},fadeOut=function(elem,interval){interval=interval||16;elem.style.opacity=1;var last=+new Date();var tick=function(){elem.style.opacity=+elem.style.opacity-(new Date()-last)/100;last=+new Date();if(+elem.style.opacity>0){setTimeout(tick,interval);}else{elem.style.display='none';}};tick();},fireClick=function(node){if(MouseEvent){var mevt=new MouseEvent('click',{view:window,bubbles:false,cancelable:true});node.dispatchEvent(mevt);}else if(document.createEvent){var evt=document.createEvent('MouseEvents');evt.initEvent('click',false,false);node.dispatchEvent(evt);}else if(document.createEventObject){node.fireEvent('onclick');}else if(typeof node.onclick==='function'){node.onclick();}},stopEventPropagation=function(e){if(typeof e.stopPropagation==='function'){e.stopPropagation();e.preventDefault();}else if(window.event&&window.event.hasOwnProperty('cancelBubble')){window.event.cancelBubble=true;}};var previousActiveElement,previousDocumentClick,previousWindowKeyDown,lastFocusedButton;window.sweetAlertInitialize=function(){var sweetHTML='
',sweetWrap=document.createElement('div');sweetWrap.innerHTML=sweetHTML;document.body.appendChild(sweetWrap);}
window.sweetAlert=window.swal=function(){if(arguments[0]===undefined){window.console.error('sweetAlert expects at least 1 attribute!');return false;}
var params=extend({},defaultParams);switch(typeof arguments[0]){case'string':params.title=arguments[0];params.text=arguments[1]||'';params.type=arguments[2]||'';break;case'object':if(arguments[0].title===undefined){window.console.error('Missing "title" argument!');return false;}
params.title=arguments[0].title;params.text=arguments[0].text||defaultParams.text;params.type=arguments[0].type||defaultParams.type;params.allowOutsideClick=arguments[0].allowOutsideClick||defaultParams.allowOutsideClick;params.showCancelButton=arguments[0].showCancelButton!==undefined?arguments[0].showCancelButton:defaultParams.showCancelButton;params.showConfirmButton=arguments[0].showConfirmButton!==undefined?arguments[0].showConfirmButton:defaultParams.showConfirmButton;params.closeOnConfirm=arguments[0].closeOnConfirm!==undefined?arguments[0].closeOnConfirm:defaultParams.closeOnConfirm;params.closeOnCancel=arguments[0].closeOnCancel!==undefined?arguments[0].closeOnCancel:defaultParams.closeOnCancel;params.timer=arguments[0].timer||defaultParams.timer;params.confirmButtonText=(defaultParams.showCancelButton)?'Confirm':defaultParams.confirmButtonText;params.confirmButtonText=arguments[0].confirmButtonText||defaultParams.confirmButtonText;params.confirmButtonClass=arguments[0].confirmButtonClass||(arguments[0].type?'btn-'+arguments[0].type:null)||defaultParams.confirmButtonClass;params.cancelButtonText=arguments[0].cancelButtonText||defaultParams.cancelButtonText;params.cancelButtonClass=arguments[0].cancelButtonClass||defaultParams.cancelButtonClass;params.containerClass=arguments[0].containerClass||defaultParams.containerClass;params.titleClass=arguments[0].titleClass||defaultParams.titleClass;params.textClass=arguments[0].textClass||defaultParams.textClass;params.imageUrl=arguments[0].imageUrl||defaultParams.imageUrl;params.imageSize=arguments[0].imageSize||defaultParams.imageSize;params.doneFunction=arguments[1]||null;break;default:window.console.error('Unexpected type of argument! Expected "string" or "object", got '+typeof arguments[0]);return false;}
@@ -530,7 +596,7 @@ $(window).on('ajaxConfirmMessage',function(event,message){if(!message)return
$.oc.confirm(message,function(isConfirm){isConfirm?event.promise.resolve():event.promise.reject()})
event.preventDefault()
return true})
-$(document).on('ready',function(){if(!window.swal)return
+$(document).ready(function(){if(!window.swal)return
var swal=window.swal
window.sweetAlert=window.swal=function(message,callback){if(typeof message==='object'){message.confirmButtonText=message.confirmButtonText||$.oc.lang.get('alert.confirm_button_text')
message.cancelButtonText=message.cancelButtonText||$.oc.lang.get('alert.cancel_button_text')}
@@ -690,12 +756,12 @@ if(!data)$this.data('oc.verticalMenu',(data=new VerticalMenu(this,toggleSelector
if(typeof option=='string')data[option].call($this)})}
$.fn.verticalMenu.Constructor=VerticalMenu
$.fn.verticalMenu.noConflict=function(){$.fn.verticalMenu=old
-return this}}(window.jQuery);(function($){$(window).load(function(){$('nav.navbar').each(function(){var
+return this}}(window.jQuery);(function($){$(document).ready(function(){$('nav.navbar').each(function(){var
navbar=$(this),nav=$('ul.nav',navbar),collapseMode=navbar.hasClass('navbar-mode-collapse'),isMobile=$('html').hasClass('mobile')
nav.verticalMenu($('a.menu-toggle',navbar),{breakpoint:collapseMode?Infinity:769})
$('li.with-tooltip:not(.active) > a',navbar).tooltip({container:'body',placement:'bottom',template:''}).on('show.bs.tooltip',function(e){if(isMobile)e.preventDefault()})
-$('[data-calculate-width]',navbar).one('oc.widthFixed',function(){var dragScroll=$('[data-control=toolbar]',navbar).data('oc.dragScroll')
-if(dragScroll){dragScroll.goToElement($('ul.nav > li.active',navbar),undefined,{'duration':0})}})})})})(jQuery);+function($){"use strict";if($.oc===undefined)
+var dragScroll=$('[data-control=toolbar]',navbar).data('oc.dragScroll')
+if(dragScroll){dragScroll.goToElement($('ul.nav > li.active',navbar),undefined,{'duration':0})}})})})(jQuery);+function($){"use strict";if($.oc===undefined)
$.oc={}
var SideNav=function(element,options){this.options=options
this.$el=$(element)
@@ -740,7 +806,7 @@ $.fn.sideNav.noConflict=function(){$.fn.sideNav=old
return this}
$(document).ready(function(){$('[data-control="sidenav"]').sideNav()})}(window.jQuery);+function($){"use strict";var Base=$.oc.foundation.base,BaseProto=Base.prototype
var Scrollbar=function(element,options){var
-$el=this.$el=$(element),el=$el.get(0),self=this,options=this.options=options||{},sizeName=this.sizeName=options.vertical?'height':'width',isNative=$('html').hasClass('mobile'),isTouch=this.isTouch=Modernizr.touch,isScrollable=this.isScrollable=false,isLocked=this.isLocked=false,eventElementName=options.vertical?'pageY':'pageX',dragStart=0,startOffset=0;$.oc.foundation.controlUtils.markDisposable(element)
+$el=this.$el=$(element),el=$el.get(0),self=this,options=this.options=options||{},sizeName=this.sizeName=options.vertical?'height':'width',isNative=$('html').hasClass('mobile'),isTouch=this.isTouch=Modernizr.touchevents,isScrollable=this.isScrollable=false,isLocked=this.isLocked=false,eventElementName=options.vertical?'pageY':'pageX',dragStart=0,startOffset=0;$.oc.foundation.controlUtils.markDisposable(element)
Base.call(this)
this.$el.one('dispose-control',this.proxy(this.dispose))
if(isNative){return}
@@ -954,12 +1020,12 @@ this.$fixButton.click(function(){self.fixPanel()
return false})
$('.fix-button-container',this.$el).append(this.$fixButton)
this.$sideNavItems.click(function(){if($(this).data('no-side-panel')){return}
-if(Modernizr.touch&&$(window).width()this.options.breakpoint&&this.panelFixed()){this.hideSidePanel()}}
-SidePanelTab.prototype.updateActiveTab=function(){if(!this.panelVisible&&($(window).width() ul',group),self=this
duration=duration===undefined?100:duration
-$list.css({'overflow':'hidden','display':'','height':0})
-$list.animate({'height':$list[0].scrollHeight},{duration:duration,queue:false,complete:function(){$list.css({'overflow':'visible','height':'auto'})
+$list.css({'overflow':'hidden','height':0})
+$list.animate({'height':$list[0].scrollHeight},{duration:duration,queue:false,complete:function(){$list.css({'overflow':'visible','height':'auto','display':''})
$(group).attr('data-status','expanded')
$(window).trigger('oc.updateUi')
self.saveGroupStatus($(group).data('group-code'),false)}})}
diff --git a/modules/backend/assets/js/october.alert.js b/modules/backend/assets/js/october.alert.js
index 08118dc..11d9e64 100644
--- a/modules/backend/assets/js/october.alert.js
+++ b/modules/backend/assets/js/october.alert.js
@@ -9,6 +9,7 @@
*
* Dependences:
* - Sweet Alert
+ * - Translations (october.lang.js)
*/
(function($){
@@ -65,7 +66,7 @@ $(window).on('ajaxConfirmMessage', function(event, message){
* Override "Sweet Alert" functions to translate default buttons
*/
-$(document).on('ready', function(){
+$(document).ready(function(){
if (!window.swal) return
var swal = window.swal
diff --git a/modules/backend/assets/js/october.flyout.js b/modules/backend/assets/js/october.flyout.js
index 251bd71..1d5c9b1 100644
--- a/modules/backend/assets/js/october.flyout.js
+++ b/modules/backend/assets/js/october.flyout.js
@@ -172,7 +172,7 @@
}
Flyout.prototype.onDocumentKeydown = function(ev) {
- if (ev.which == 27) {
+ if (ev.key === 'Escape') {
this.hide();
}
}
@@ -218,7 +218,7 @@
// Currently flyouts don't use the document render event
// and can't be created dynamically (performance considerations).
- $(document).on('ready', function(){
+ $(document).ready(function(){
$('div[data-control=flyout]').flyout()
})
}(window.jQuery);
\ No newline at end of file
diff --git a/modules/backend/assets/js/october.js b/modules/backend/assets/js/october.js
index d85db8b..17fd9d3 100644
--- a/modules/backend/assets/js/october.js
+++ b/modules/backend/assets/js/october.js
@@ -33,4 +33,4 @@
=require october.datetime.js
=require backend.js
-*/
\ No newline at end of file
+*/
diff --git a/modules/backend/assets/js/october.navbar.js b/modules/backend/assets/js/october.navbar.js
index 4519e47..25c9b7d 100644
--- a/modules/backend/assets/js/october.navbar.js
+++ b/modules/backend/assets/js/october.navbar.js
@@ -1,8 +1,8 @@
/*
* Top navigation bar. Features of the bar:
- * - Hide content if the display width is less than 768px. In this case the menu icon is displayed.
+ * - Hide content if the display width is less than 768px. In this case the menu icon is displayed.
* When the icon is clicked, the menu content is displayed on the left side of the page.
- * - If the content doesn't fit the navbar, it can be dragged left and right.
+ * - If the content doesn't fit the navbar, it can be dragged left and right.
*
* Dependences:
* - DragScroll (october.dragscroll.js)
@@ -10,7 +10,7 @@
*/
(function($){
- $(window).load(function() {
+ $(document).ready(function(){
$('nav.navbar').each(function(){
var
navbar = $(this),
@@ -31,12 +31,11 @@
if (isMobile) e.preventDefault()
})
- $('[data-calculate-width]', navbar).one('oc.widthFixed', function() {
- var dragScroll = $('[data-control=toolbar]', navbar).data('oc.dragScroll')
- if (dragScroll) {
- dragScroll.goToElement($('ul.nav > li.active', navbar), undefined, {'duration': 0})
- }
- })
+ // Scroll to the currently active nav item.
+ var dragScroll = $('[data-control=toolbar]', navbar).data('oc.dragScroll')
+ if (dragScroll) {
+ dragScroll.goToElement($('ul.nav > li.active', navbar), undefined, {'duration': 0})
+ }
})
})
-})(jQuery);
\ No newline at end of file
+})(jQuery);
diff --git a/modules/backend/assets/js/october.scrollbar.js b/modules/backend/assets/js/october.scrollbar.js
index 26feada..c99628b 100644
--- a/modules/backend/assets/js/october.scrollbar.js
+++ b/modules/backend/assets/js/october.scrollbar.js
@@ -26,7 +26,7 @@
options = this.options = options || {},
sizeName = this.sizeName = options.vertical ? 'height' : 'width',
isNative = $('html').hasClass('mobile'),
- isTouch = this.isTouch = Modernizr.touch,
+ isTouch = this.isTouch = Modernizr.touchevents,
isScrollable = this.isScrollable = false,
isLocked = this.isLocked = false,
eventElementName = options.vertical ? 'pageY' : 'pageX',
diff --git a/modules/backend/assets/js/october.sidenav-tree.js b/modules/backend/assets/js/october.sidenav-tree.js
index 00622d6..4415486 100644
--- a/modules/backend/assets/js/october.sidenav-tree.js
+++ b/modules/backend/assets/js/october.sidenav-tree.js
@@ -100,13 +100,13 @@
$list.css({
'overflow': 'hidden',
- 'display': '',
'height': 0
})
$list.animate({'height': $list[0].scrollHeight}, { duration: duration, queue: false, complete: function() {
$list.css({
'overflow': 'visible',
- 'height': 'auto'
+ 'height': 'auto',
+ 'display': ''
})
$(group).attr('data-status', 'expanded')
$(window).trigger('oc.updateUi')
diff --git a/modules/backend/assets/js/october.sidepaneltab.js b/modules/backend/assets/js/october.sidepaneltab.js
index 18df967..2a5eba7 100644
--- a/modules/backend/assets/js/october.sidepaneltab.js
+++ b/modules/backend/assets/js/october.sidepaneltab.js
@@ -35,7 +35,7 @@
return
}
- if (Modernizr.touch && $(window).width() < self.options.breakpoint) {
+ if (Modernizr.touchevents && $(window).width() < self.options.breakpoint) {
if ($(this).data('menu-item') == self.visibleItemId && self.panelVisible) {
self.hideSidePanel()
return
@@ -50,7 +50,7 @@
return false
})
- if (!Modernizr.touch) {
+ if (!Modernizr.touchevents) {
// The side panel now opens only when a menu item is hovered and
// when the item doesn't have the "data-no-side-panel" attribute.
// TODO: remove the comment and the code below if no issues noticed.
@@ -115,7 +115,9 @@
this.visibleItemId = menuItemId
- $.oc.sideNav.setActiveItem(menuItemId)
+ if ($.oc.sideNav !== undefined) {
+ $.oc.sideNav.setActiveItem(menuItemId)
+ }
this.$sidePanelItems.each(function() {
var $el = $(this)
@@ -151,7 +153,7 @@
}
SidePanelTab.prototype.updatePanelPosition = function() {
- if (!this.panelFixed() || Modernizr.touch) {
+ if (!this.panelFixed() || Modernizr.touchevents) {
this.$el.height($(document).height() - this.mainNavHeight)
}
else {
@@ -164,6 +166,10 @@
}
SidePanelTab.prototype.updateActiveTab = function() {
+ if ($.oc.sideNav === undefined) {
+ return
+ }
+
if (!this.panelVisible && ($(window).width() < this.options.breakpoint || !this.panelFixed())) {
$.oc.sideNav.unsetActiveItem()
}
@@ -230,7 +236,7 @@
// DATA-API
// ============
- $(window).load(function() {
+ $(document).ready(function(){
$('[data-control=layout-sidepanel]').sidePanelTab()
})
@@ -238,7 +244,7 @@
// ====================
$(document).ready(function() {
- if (Modernizr.touch || (typeof(localStorage) !== 'undefined')) {
+ if (Modernizr.touchevents || (typeof(localStorage) !== 'undefined')) {
if (localStorage.ocSidePanelFixed == 0) {
$(document.body).addClass('side-panel-not-fixed')
$(window).trigger('resize')
diff --git a/modules/backend/assets/js/october.treeview.js b/modules/backend/assets/js/october.treeview.js
index 1a22d60..f443429 100644
--- a/modules/backend/assets/js/october.treeview.js
+++ b/modules/backend/assets/js/october.treeview.js
@@ -4,13 +4,13 @@
* Data attributes:
* - data-group-status-handler - AJAX handler to execute when an item is collapsed or expanded by a user
* - data-reorder-handler - AJAX handler to execute when items are reordered
- *
+ *
* Events
* - open.oc.treeview - this event is triggered on the list element when an item is clicked.
- *
+ *
* Dependences:
* - Tree list (october.treelist.js)
- *
+ *
*/
+function ($) { "use strict";
var Base = $.oc.foundation.base,
@@ -65,8 +65,11 @@
* Mark previously active item, if it was set
*/
var dataId = this.$el.data('oc.active-item')
- if (dataId !== undefined)
+ if (dataId !== undefined) {
this.markActive(dataId)
+ }
+
+ this.$scrollbar.on('oc.scrollEnd', this.proxy(this.onScroll))
}
TreeView.prototype.dispose = function() {
@@ -83,6 +86,7 @@
}
TreeView.prototype.unregisterHandlers = function() {
+ this.$scrollbar.off('oc.scrollEnd', this.proxy(this.onScroll))
this.$el.off('.treeview')
this.$el.off('move.oc.treelist', this.proxy(this.onNodeMove))
this.$el.off('aftermove.oc.treelist', this.proxy(this.onAfterNodeMove))
@@ -163,9 +167,9 @@
TreeView.prototype.toggleGroup = function(group) {
var $group = $(group);
- $group.attr('data-status') == 'expanded' ?
- this.collapseGroup($group) :
- this.expandGroup($group)
+ $group.attr('data-status') == 'expanded'
+ ? this.collapseGroup($group)
+ : this.expandGroup($group)
}
TreeView.prototype.sendGroupStatusRequest = function($group, status) {
@@ -229,7 +233,7 @@
}
// It seems the method is not used anymore as we re-create the control
- // instead of updating it. Remove later if nothing weird is noticed.
+ // instead of updating it. Remove later if nothing weird is noticed.
// -ab Apr 26 2015
//
TreeView.prototype.update = function() {
@@ -238,8 +242,9 @@
//this.initSortable()
var dataId = this.$el.data('oc.active-item')
- if (dataId !== undefined)
+ if (dataId !== undefined) {
this.markActive(dataId)
+ }
}
TreeView.prototype.handleMovedNode = function() {
@@ -250,11 +255,13 @@
}
TreeView.prototype.tweakCursorAdjustment = function(adjustment) {
- if (!adjustment)
+ if (!adjustment) {
return adjustment
+ }
- if (this.$scrollbar.length > 0)
+ if (this.$scrollbar.length > 0) {
adjustment.top -= this.$scrollbar.scrollTop()
+ }
return adjustment
}
@@ -297,60 +304,84 @@
this.toggleGroup($(ev.currentTarget).closest('li'))
return false
}
-
+
// TREEVIEW SCROLL ON DRAG
// ============================
-
+
+ TreeView.prototype.onScroll = function () {
+ if (!$('body').hasClass('dragging')) {
+ return
+ }
+
+ var changed = this.lastScrollPos - this.$scrollbar.scrollTop()
+
+ this.$el.children('ol').each(function() {
+ var sortable = $(this).data('oc.sortable')
+ sortable.refresh()
+ sortable.cursorAdjustment.top += changed // Keep cursor adjustment in sync with scroll
+ });
+
+ this.dragCallback()
+
+ this.lastScrollPos = this.$scrollbar.scrollTop()
+ }
+
TreeView.prototype.onDrag = function ($item, position, _super, event) {
-
+ this.lastScrollPos = this.$scrollbar.scrollTop()
+
this.dragCallback = function() {
_super($item, position, null, event)
};
-
+
this.clearScrollTimeout()
this.dragCallback()
-
+
if (!this.$scrollbar || this.$scrollbar.length === 0)
return
-
- if (position.top < 0)
+
+ if (position.top < 0) {
this.scrollOffset = -10 + Math.floor(position.top / 5)
- else if (position.top > this.$scrollbar.height())
+ }
+ else if (position.top > this.$scrollbar.height()) {
this.scrollOffset = 10 + Math.ceil((position.top - this.$scrollbar.height()) / 5)
- else
+ }
+ else {
return
-
- this.scrollMax = function() {
- return this.$el.height() - this.$scrollbar.height()
- };
-
+ }
+
this.dragScroll()
}
-
+
+ TreeView.prototype.scrollMax = function() {
+ return this.$el.height() - this.$scrollbar.height()
+ }
+
TreeView.prototype.dragScroll = function() {
var startScrollTop = this.$scrollbar.scrollTop()
var changed
this.scrollTimeout = null
- this.$scrollbar.scrollTop( Math.min(startScrollTop + this.scrollOffset, this.scrollMax()) )
+ this.$scrollbar.scrollTop(Math.min(startScrollTop + this.scrollOffset, this.scrollMax()))
+
changed = this.$scrollbar.scrollTop() - startScrollTop
- if (changed === 0)
+ if (changed === 0) {
return
+ }
this.$el.children('ol').each(function() {
var sortable = $(this).data('oc.sortable')
-
sortable.refresh()
sortable.cursorAdjustment.top -= changed // Keep cursor adjustment in sync with scroll
});
this.dragCallback()
+
this.$scrollbar.data('oc.scrollbar').setThumbPosition() // Update scrollbar position
-
+
this.scrollTimeout = window.setTimeout(this.proxy(this.dragScroll), 100)
}
-
+
TreeView.prototype.clearScrollTimeout = function() {
if (this.scrollTimeout) {
window.clearTimeout(this.scrollTimeout)
@@ -372,7 +403,7 @@
var options = $.extend({}, TreeView.DEFAULTS, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('oc.treeView', (data = new TreeView(this, options)))
- if (typeof option == 'string' && data) {
+ if (typeof option == 'string' && data) {
var methodArgs = [];
for (var i=1; i+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML=" ";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""," "],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ae(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ne(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ne(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n=void 0,r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n}else r&&(Q.set(this,i,k.event.trigger(k.extend(r.shift(),k.Event.prototype),r,this)),e.stopImmediatePropagation())}})):k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/
\ No newline at end of file
+
diff --git a/modules/backend/behaviors/relationcontroller/partials/_pivot_form.htm b/modules/backend/behaviors/relationcontroller/partials/_pivot_form.htm
index c27b4d6..b2a9ff1 100644
--- a/modules/backend/behaviors/relationcontroller/partials/_pivot_form.htm
+++ b/modules/backend/behaviors/relationcontroller/partials/_pivot_form.htm
@@ -2,6 +2,7 @@
= Form::ajax('onRelationManagePivotUpdate', [
'data' => ['_relation_field' => $relationField, 'manage_id' => $relationManageId],
+ 'data-request-success' => "$.oc.relationBehavior.changed('" . e($this->vars['relationField']) . "', 'updated')",
'data-popup-load-indicator' => true
]) ?>
@@ -41,6 +42,7 @@ = e(trans('backend::lang.relation.related_data', ['nam
= Form::ajax('onRelationManagePivotCreate', [
'data' => ['_relation_field' => $relationField, 'foreign_id' => $foreignId],
+ 'data-request-success' => "$.oc.relationBehavior.changed('" . e($this->vars['relationField']) . "', 'created')",
'data-popup-load-indicator' => true
]) ?>
diff --git a/modules/backend/behaviors/relationcontroller/partials/_toolbar.htm b/modules/backend/behaviors/relationcontroller/partials/_toolbar.htm
index 3b23bd4..d7f85f5 100644
--- a/modules/backend/behaviors/relationcontroller/partials/_toolbar.htm
+++ b/modules/backend/behaviors/relationcontroller/partials/_toolbar.htm
@@ -1,13 +1,16 @@
-
+ $text): ?>
-
+
= $this->relationMakePartial('button_update', [
- 'relationManageId' => $relationViewModel->getKey()
+ 'relationManageId' => $relationViewModel->getKey(),
+ 'text' => $text
]) ?>
- = $this->relationMakePartial('button_'.$button) ?>
+ = $this->relationMakePartial('button_' . $type, [
+ 'text' => $text
+ ]) ?>
diff --git a/modules/backend/behaviors/relationcontroller/partials/_view.htm b/modules/backend/behaviors/relationcontroller/partials/_view.htm
index bca42c2..7f154eb 100644
--- a/modules/backend/behaviors/relationcontroller/partials/_view.htm
+++ b/modules/backend/behaviors/relationcontroller/partials/_view.htm
@@ -1 +1,5 @@
+
+ = $relationViewFilterWidget->render() ?>
+
+
= $relationViewWidget->render() ?>
\ No newline at end of file
diff --git a/modules/backend/behaviors/reordercontroller/partials/_records.htm b/modules/backend/behaviors/reordercontroller/partials/_records.htm
index dc46b20..774461e 100644
--- a/modules/backend/behaviors/reordercontroller/partials/_records.htm
+++ b/modules/backend/behaviors/reordercontroller/partials/_records.htm
@@ -7,7 +7,7 @@
>
-
= $this->reorderGetRecordName($record) ?>
+
= e($this->reorderGetRecordName($record)) ?>
diff --git a/modules/backend/classes/AuthManager.php b/modules/backend/classes/AuthManager.php
index 9fd6250..85a59ae 100644
--- a/modules/backend/classes/AuthManager.php
+++ b/modules/backend/classes/AuthManager.php
@@ -1,7 +1,9 @@
useThrottle = Config::get('auth.throttle.enabled', true);
+ parent::init();
+ }
+
/**
* Registers a callback function that defines authentication permissions.
* The callback function should register permissions by calling the manager's
* registerPermissions() function. The manager instance is passed to the
* callback function as an argument. Usage:
*
- * BackendAuth::registerCallback(function($manager){
+ * BackendAuth::registerCallback(function ($manager) {
* $manager->registerPermissions([...]);
* });
*
@@ -81,7 +89,7 @@ public function registerCallback(callable $callback)
* - order - a position of the item in the menu, optional.
* - comment - a brief comment that describes the permission, optional.
* - tab - assign this permission to a tabbed group, optional.
- * @param string $owner Specifies the menu items owner plugin or module in the format Vendor/Module.
+ * @param string $owner Specifies the permissions' owner plugin or module in the format Author.Plugin
* @param array $definitions An array of the menu item definitions.
*/
public function registerPermissions($owner, array $definitions)
@@ -96,6 +104,29 @@ public function registerPermissions($owner, array $definitions)
}
}
+ /**
+ * Removes a single back-end permission
+ * @param string $owner Specifies the permissions' owner plugin or module in the format Author.Plugin
+ * @param string $code The code of the permission to remove
+ * @return void
+ */
+ public function removePermission($owner, $code)
+ {
+ if (!$this->permissions) {
+ throw new SystemException('Unable to remove permissions before they are loaded.');
+ }
+
+ $ownerPermissions = array_filter($this->permissions, function ($permission) use ($owner) {
+ return $permission->owner === $owner;
+ });
+
+ foreach ($ownerPermissions as $key => $permission) {
+ if ($permission->code === $code) {
+ unset($this->permissions[$key]);
+ }
+ }
+ }
+
/**
* Returns a list of the registered permissions items.
* @return array
@@ -150,9 +181,7 @@ public function listTabbedPermissions()
$tabs = [];
foreach ($this->listPermissions() as $permission) {
- $tab = isset($permission->tab)
- ? $permission->tab
- : 'backend::lang.form.undefined_tab';
+ $tab = $permission->tab ?? 'backend::lang.form.undefined_tab';
if (!array_key_exists($tab, $tabs)) {
$tabs[$tab] = [];
@@ -164,9 +193,38 @@ public function listTabbedPermissions()
return $tabs;
}
+ /**
+ * {@inheritdoc}
+ */
+ protected function createUserModelQuery()
+ {
+ return parent::createUserModelQuery()->withTrashed();
+ }
+
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function validateUserModel($user)
+ {
+ if ( ! $user instanceof $this->userModel) {
+ return false;
+ }
+
+ // Perform the deleted_at check manually since the relevant migrations
+ // might not have been run yet during the update to build 444.
+ // @see https://github.com/octobercms/october/issues/3999
+ if (array_key_exists('deleted_at', $user->getAttributes()) && $user->deleted_at !== null) {
+ return false;
+ }
+
+ return $user;
+ }
+
/**
* Returns an array of registered permissions belonging to a given role code
* @param string $role
+ * @param bool $includeOrphans
* @return array
*/
public function listPermissionsForRole($role, $includeOrphans = true)
diff --git a/modules/backend/classes/BackendController.php b/modules/backend/classes/BackendController.php
index 4330761..481df7a 100644
--- a/modules/backend/classes/BackendController.php
+++ b/modules/backend/classes/BackendController.php
@@ -4,10 +4,13 @@
use App;
use File;
use View;
+use Event;
use Config;
+use Request;
use Response;
use Illuminate\Routing\Controller as ControllerBase;
use October\Rain\Router\Helper as RouterHelper;
+use System\Classes\PluginManager;
use Closure;
/**
@@ -42,11 +45,61 @@ class BackendController extends ControllerBase
*/
public static $params;
+ /**
+ * @var boolean Flag to indicate that the CMS module is handling the current request
+ */
+ protected $cmsHandling = false;
+
+ /**
+ * Stores the requested controller so that the constructor is only run once
+ *
+ * @var Backend\Classes\Controller
+ */
+ protected $requestedController;
+
/**
* Instantiate a new BackendController instance.
*/
public function __construct()
{
+ $this->middleware(function ($request, $next) {
+ // Process the request before retrieving controller middleware, to allow for the session and auth data
+ // to be made available to the controller's constructor.
+ $response = $next($request);
+
+ // Find requested controller to determine if any middleware has been attached
+ $pathParts = explode('/', str_replace(Request::root() . '/', '', Request::url()));
+ if (count($pathParts)) {
+ // Drop off preceding backend URL part if needed
+ if (!empty(Config::get('cms.backendUri', 'backend'))) {
+ array_shift($pathParts);
+ }
+ $path = implode('/', $pathParts);
+
+ $requestedController = $this->getRequestedController($path);
+ if (
+ !is_null($requestedController)
+ && is_array($requestedController)
+ && count($requestedController['controller']->getMiddleware())
+ ) {
+ $action = $requestedController['action'];
+
+ // Collect applicable middleware and insert middleware into pipeline
+ $controllerMiddleware = collect($requestedController['controller']->getMiddleware())
+ ->reject(function ($data) use ($action) {
+ return static::methodExcludedByOptions($action, $data['options']);
+ })
+ ->pluck('middleware');
+
+ foreach ($controllerMiddleware as $middleware) {
+ $middleware->call($requestedController['controller'], $request, $response);
+ }
+ }
+ }
+
+ return $response;
+ });
+
$this->extendableConstruct();
}
@@ -58,6 +111,25 @@ public static function extend(Closure $callback)
self::extendableExtendCallback($callback);
}
+ /**
+ * Pass unhandled URLs to the CMS Controller, if it exists
+ *
+ * @param string $url
+ * @return Response
+ */
+ protected function passToCmsController($url)
+ {
+ if (
+ in_array('Cms', Config::get('cms.loadModules', [])) &&
+ class_exists('\Cms\Classes\Controller')
+ ) {
+ $this->cmsHandling = true;
+ return App::make('Cms\Classes\Controller')->run($url);
+ } else {
+ return Response::make(View::make('backend::404'), 404);
+ }
+ }
+
/**
* Finds and serves the requested backend controller.
* If the controller cannot be found, returns the Cms page with the URL /404.
@@ -70,20 +142,55 @@ public function run($url = null)
{
$params = RouterHelper::segmentizeUrl($url);
+ // Handle NotFoundHttpExceptions in the backend (usually triggered by abort(404))
+ Event::listen('exception.beforeRender', function ($exception, $httpCode, $request) {
+ if (!$this->cmsHandling && $exception instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) {
+ return View::make('backend::404');
+ }
+ }, 1);
+
/*
* Database check
*/
if (!App::hasDatabase()) {
return Config::get('app.debug', false)
? Response::make(View::make('backend::no_database'), 200)
- : App::make('Cms\Classes\Controller')->run($url);
+ : $this->passToCmsController($url);
+ }
+
+ $controllerRequest = $this->getRequestedController($url);
+ if (!is_null($controllerRequest)) {
+ return $controllerRequest['controller']->run(
+ $controllerRequest['action'],
+ $controllerRequest['params']
+ );
}
+ /*
+ * Fall back on Cms controller
+ */
+ return $this->passToCmsController($url);
+ }
+
+ /**
+ * Determines the controller and action to load in the backend via a provided URL.
+ *
+ * If a suitable controller is found, this will return an array with the controller class name as a string, the
+ * action to call as a string and an array of parameters. If a suitable controller and action cannot be found,
+ * this method will return null.
+ *
+ * @param string $url A URL to determine the requested controller and action for
+ * @return array|null A suitable controller, action and parameters in an array if found, otherwise null.
+ */
+ protected function getRequestedController($url)
+ {
+ $params = RouterHelper::segmentizeUrl($url);
+
/*
* Look for a Module controller
*/
- $module = isset($params[0]) ? $params[0] : 'backend';
- $controller = isset($params[1]) ? $params[1] : 'index';
+ $module = $params[0] ?? 'backend';
+ $controller = $params[1] ?? 'index';
self::$action = $action = isset($params[2]) ? $this->parseAction($params[2]) : 'index';
self::$params = $controllerParams = array_slice($params, 3);
$controllerClass = '\\'.$module.'\Controllers\\'.$controller;
@@ -92,7 +199,11 @@ public function run($url = null)
$action,
base_path().'/modules'
)) {
- return $controllerObj->run($action, $controllerParams);
+ return [
+ 'controller' => $controllerObj,
+ 'action' => $action,
+ 'params' => $controllerParams
+ ];
}
/*
@@ -100,7 +211,13 @@ public function run($url = null)
*/
if (count($params) >= 2) {
list($author, $plugin) = $params;
- $controller = isset($params[2]) ? $params[2] : 'index';
+
+ $pluginCode = ucfirst($author) . '.' . ucfirst($plugin);
+ if (PluginManager::instance()->isDisabled($pluginCode)) {
+ return Response::make(View::make('backend::404'), 404);
+ }
+
+ $controller = $params[2] ?? 'index';
self::$action = $action = isset($params[3]) ? $this->parseAction($params[3]) : 'index';
self::$params = $controllerParams = array_slice($params, 4);
$controllerClass = '\\'.$author.'\\'.$plugin.'\Controllers\\'.$controller;
@@ -109,14 +226,15 @@ public function run($url = null)
$action,
plugins_path()
)) {
- return $controllerObj->run($action, $controllerParams);
+ return [
+ 'controller' => $controllerObj,
+ 'action' => $action,
+ 'params' => $controllerParams
+ ];
}
}
- /*
- * Fall back on Cms controller
- */
- return App::make('Cms\Classes\Controller')->run($url);
+ return null;
}
/**
@@ -129,6 +247,10 @@ public function run($url = null)
*/
protected function findController($controller, $action, $inPath)
{
+ if (isset($this->requestedController)) {
+ return $this->requestedController;
+ }
+
/*
* Workaround: Composer does not support case insensitivity.
*/
@@ -136,21 +258,21 @@ protected function findController($controller, $action, $inPath)
$controller = Str::normalizeClassName($controller);
$controllerFile = $inPath.strtolower(str_replace('\\', '/', $controller)) . '.php';
if ($controllerFile = File::existsInsensitive($controllerFile)) {
- include_once($controllerFile);
+ include_once $controllerFile;
}
}
if (!class_exists($controller)) {
- return false;
+ return $this->requestedController = null;
}
$controllerObj = App::make($controller);
if ($controllerObj->actionExists($action)) {
- return $controllerObj;
+ return $this->requestedController = $controllerObj;
}
- return false;
+ return $this->requestedController = null;
}
/**
@@ -166,4 +288,17 @@ protected function parseAction($actionName)
return $actionName;
}
+
+ /**
+ * Determine if the given options exclude a particular method.
+ *
+ * @param string $method
+ * @param array $options
+ * @return bool
+ */
+ protected static function methodExcludedByOptions($method, array $options)
+ {
+ return (isset($options['only']) && !in_array($method, (array) $options['only'])) ||
+ (!empty($options['except']) && in_array($method, (array) $options['except']));
+ }
}
diff --git a/modules/backend/classes/Controller.php b/modules/backend/classes/Controller.php
index 24f0b66..c4e64b6 100644
--- a/modules/backend/classes/Controller.php
+++ b/modules/backend/classes/Controller.php
@@ -1,10 +1,10 @@
user = BackendAuth::getUser();
- parent::__construct();
-
/*
* Media Manager widget is available on all back-end pages
*/
@@ -156,6 +157,36 @@ public function __construct()
$manager = new MediaManager($this, 'ocmediamanager');
$manager->bindToController();
}
+
+ $this->extendableConstruct();
+ }
+
+ /**
+ * Extend this object properties upon construction.
+ */
+ public static function extend(Closure $callback)
+ {
+ self::extendableExtendCallback($callback);
+ }
+
+ public function __get($name)
+ {
+ return $this->extendableGet($name);
+ }
+
+ public function __set($name, $value)
+ {
+ $this->extendableSet($name, $value);
+ }
+
+ public function __call($name, $params)
+ {
+ return $this->extendableCall($name, $params);
+ }
+
+ public static function __callStatic($name, $params)
+ {
+ return self::extendableCallStatic($name, $params);
}
/**
@@ -171,13 +202,15 @@ public function run($action = null, $params = [])
/*
* Check security token.
+ * @see \System\Traits\SecurityController
*/
if (!$this->verifyCsrfToken()) {
- return Response::make(Lang::get('backend::lang.page.invalid_token.label'), 403);
+ return Response::make(Lang::get('system::lang.page.invalid_token.label'), 403);
}
/*
* Check forced HTTPS protocol.
+ * @see \System\Traits\SecurityController
*/
if (!$this->verifyForceSecure()) {
return Redirect::secure(Request::path());
@@ -192,7 +225,6 @@ public function run($action = null, $params = [])
* Check that user is logged in and has permission to view this page
*/
if (!$isPublicAction) {
-
/*
* Not logged in, redirect to login screen or show ajax error.
*/
@@ -210,8 +242,24 @@ public function run($action = null, $params = [])
}
}
- /*
- * Extensibility
+ /**
+ * @event backend.page.beforeDisplay
+ * Provides an opportunity to override backend page content
+ *
+ * Example usage:
+ *
+ * Event::listen('backend.page.beforeDisplay', function ((\Backend\Classes\Controller) $backendController, (string) $action, (array) $params) {
+ * trace_log('redirect all backend pages to google');
+ * return \Redirect::to('https://google.com');
+ * });
+ *
+ * Or
+ *
+ * $backendController->bindEvent('page.beforeDisplay', function ((string) $action, (array) $params) {
+ * trace_log('redirect all backend pages to google');
+ * return \Redirect::to('https://google.com');
+ * });
+ *
*/
if ($event = $this->fireSystemEvent('backend.page.beforeDisplay', [$action, $params])) {
return $event;
@@ -227,30 +275,32 @@ public function run($action = null, $params = [])
* Execute AJAX event
*/
if ($ajaxResponse = $this->execAjaxHandlers()) {
- return $ajaxResponse;
+ $result = $ajaxResponse;
}
/*
* Execute postback handler
*/
- if (
+ elseif (
($handler = post('_handler')) &&
($handlerResponse = $this->runAjaxHandler($handler)) &&
$handlerResponse !== true
) {
- return $handlerResponse;
+ $result = $handlerResponse;
}
/*
* Execute page action
*/
- $result = $this->execPageAction($action, $params);
-
- if (!is_string($result)) {
- return $result;
+ else {
+ $result = $this->execPageAction($action, $params);
}
- return Response::make($result, $this->statusCode);
+ /*
+ * Prepare and return response
+ * @see \System\Traits\ResponseMaker
+ */
+ return $this->makeResponse($result);
}
/**
@@ -340,11 +390,15 @@ protected function execPageAction($actionName, $parameters)
$result = null;
if (!$this->actionExists($actionName)) {
- throw new SystemException(sprintf(
- "Action %s is not found in the controller %s",
- $actionName,
- get_class($this)
- ));
+ if (Config::get('app.debug', false)) {
+ throw new SystemException(sprintf(
+ "Action %s is not found in the controller %s",
+ $actionName,
+ get_class($this)
+ ));
+ } else {
+ Response::make(View::make('backend::404'), 404);
+ }
}
// Execute the action
@@ -361,7 +415,7 @@ protected function execPageAction($actionName, $parameters)
}
// Load the view
- if (!$this->suppressView && is_null($result)) {
+ if (!$this->suppressView && $result === null) {
return $this->makeView($actionName);
}
@@ -397,7 +451,7 @@ protected function execAjaxHandlers()
* Validate the handler name
*/
if (!preg_match('/^(?:\w+\:{2})?on[A-Z]{1}[\w+]*$/', $handler)) {
- throw new SystemException(Lang::get('cms::lang.ajax_handler.invalid_name', ['name'=>$handler]));
+ throw new SystemException(Lang::get('backend::lang.ajax_handler.invalid_name', ['name'=>$handler]));
}
/*
@@ -408,7 +462,7 @@ protected function execAjaxHandlers()
foreach ($partialList as $partial) {
if (!preg_match('/^(?!.*\/\/)[a-z0-9\_][a-z0-9\_\-\/]*$/i', $partial)) {
- throw new SystemException(Lang::get('cms::lang.partial.invalid_name', ['name'=>$partial]));
+ throw new SystemException(Lang::get('backend::lang.partial.invalid_name', ['name'=>$partial]));
}
}
}
@@ -422,7 +476,7 @@ protected function execAjaxHandlers()
* Execute the handler
*/
if (!$result = $this->runAjaxHandler($handler)) {
- throw new ApplicationException(Lang::get('cms::lang.ajax_handler.not_found', ['name'=>$handler]));
+ throw new ApplicationException(Lang::get('backend::lang.ajax_handler.not_found', ['name'=>$handler]));
}
/*
@@ -499,6 +553,39 @@ protected function execAjaxHandlers()
*/
protected function runAjaxHandler($handler)
{
+ /**
+ * @event backend.ajax.beforeRunHandler
+ * Provides an opportunity to modify an AJAX request
+ *
+ * The parameter provided is `$handler` (the requested AJAX handler to be run)
+ *
+ * Example usage (forwards AJAX handlers to a backend widget):
+ *
+ * Event::listen('backend.ajax.beforeRunHandler', function ((\Backend\Classes\Controller) $controller, (string) $handler) {
+ * if (strpos($handler, '::')) {
+ * list($componentAlias, $handlerName) = explode('::', $handler);
+ * if ($componentAlias === $this->getBackendWidgetAlias()) {
+ * return $this->backendControllerProxy->runAjaxHandler($handler);
+ * }
+ * }
+ * });
+ *
+ * Or
+ *
+ * $this->controller->bindEvent('ajax.beforeRunHandler', function ((string) $handler) {
+ * if (strpos($handler, '::')) {
+ * list($componentAlias, $handlerName) = explode('::', $handler);
+ * if ($componentAlias === $this->getBackendWidgetAlias()) {
+ * return $this->backendControllerProxy->runAjaxHandler($handler);
+ * }
+ * }
+ * });
+ *
+ */
+ if ($event = $this->fireSystemEvent('backend.ajax.beforeRunHandler', [$handler])) {
+ return $event;
+ }
+
/*
* Process Widget handler
*/
@@ -520,7 +607,7 @@ protected function runAjaxHandler($handler)
if (($widget = $this->widget->{$widgetName}) && $widget->methodExists($handlerName)) {
$result = $this->runAjaxHandlerForWidget($widget, $handlerName);
- return ($result) ?: true;
+ return $result ?: true;
}
}
else {
@@ -531,7 +618,7 @@ protected function runAjaxHandler($handler)
if ($this->methodExists($pageHandler)) {
$result = call_user_func_array([$this, $pageHandler], $this->params);
- return ($result) ?: true;
+ return $result ?: true;
}
/*
@@ -539,7 +626,7 @@ protected function runAjaxHandler($handler)
*/
if ($this->methodExists($handler)) {
$result = call_user_func_array([$this, $handler], $this->params);
- return ($result) ?: true;
+ return $result ?: true;
}
/*
@@ -551,7 +638,7 @@ protected function runAjaxHandler($handler)
foreach ((array) $this->widget as $widget) {
if ($widget->methodExists($handler)) {
$result = $this->runAjaxHandlerForWidget($widget, $handler);
- return ($result) ?: true;
+ return $result ?: true;
}
}
}
@@ -603,16 +690,6 @@ public function getId($suffix = null)
return $id;
}
- /**
- * Sets the status code for the current web response.
- * @param int $code Status code
- */
- public function setStatusCode($code)
- {
- $this->statusCode = (int) $code;
- return $this;
- }
-
//
// Hints
//
@@ -673,55 +750,4 @@ public function isBackendHintHidden($name)
$hiddenHints = UserPreference::forUser()->get('backend::hints.hidden', []);
return array_key_exists($name, $hiddenHints);
}
-
- //
- // Security
- //
-
- /**
- * Checks the request data / headers for a valid CSRF token.
- * Returns false if a valid token is not found. Override this
- * method to disable the check.
- * @return bool
- */
- protected function verifyCsrfToken()
- {
- if (!Config::get('cms.enableCsrfProtection')) {
- return true;
- }
-
- if (in_array(Request::method(), ['HEAD', 'GET', 'OPTIONS'])) {
- return true;
- }
-
- $token = Request::input('_token') ?: Request::header('X-CSRF-TOKEN');
-
- if (!strlen($token)) {
- return false;
- }
-
- return hash_equals(
- Session::token(),
- $token
- );
- }
-
- /**
- * Checks if the back-end should force a secure protocol (HTTPS) enabled by config.
- * @return bool
- */
- protected function verifyForceSecure()
- {
- if (Request::secure() || Request::ajax()) {
- return true;
- }
-
- // @todo if year >= 2018 change default from false to null
- $forceSecure = Config::get('cms.backendForceSecure', false);
- if ($forceSecure === null) {
- $forceSecure = !Config::get('app.debug', false);
- }
-
- return !$forceSecure;
- }
}
diff --git a/modules/backend/classes/ControllerBehavior.php b/modules/backend/classes/ControllerBehavior.php
index 99beca8..1df06bd 100644
--- a/modules/backend/classes/ControllerBehavior.php
+++ b/modules/backend/classes/ControllerBehavior.php
@@ -37,6 +37,11 @@ class ControllerBehavior extends ExtensionBase
*/
protected $requiredProperties = [];
+ /**
+ * @var array Visible actions in context of the controller. Only takes effect if it is an array
+ */
+ protected $actions;
+
/**
* Constructor.
*/
@@ -58,6 +63,11 @@ public function __construct($controller)
]));
}
}
+
+ // Hide all methods that aren't explicitly listed as actions
+ if (is_array($this->actions)) {
+ $this->hideAction(array_diff(get_class_methods(get_class($this)), $this->actions));
+ }
}
/**
@@ -81,7 +91,7 @@ public function getConfig($name = null, $default = null)
/*
* Return all config
*/
- if (is_null($name)) {
+ if ($name === null) {
return $this->config;
}
diff --git a/modules/backend/classes/FilterScope.php b/modules/backend/classes/FilterScope.php
index 683b691..bf5d062 100644
--- a/modules/backend/classes/FilterScope.php
+++ b/modules/backend/classes/FilterScope.php
@@ -51,10 +51,15 @@ class FilterScope
*/
public $options;
+ /**
+ * @var array Other scope names this scope depends on, when the other scopes are modified, this scope will update.
+ */
+ public $dependsOn;
+
/**
* @var string Specifies contextual visibility of this form scope.
*/
- public $context = null;
+ public $context;
/**
* @var bool Specify if the scope is disabled or not.
@@ -113,33 +118,32 @@ public function displayAs($type, $config = [])
*/
protected function evalConfig($config)
{
- if (isset($config['options'])) {
- $this->options = $config['options'];
- }
- if (isset($config['context'])) {
- $this->context = $config['context'];
- }
- if (isset($config['default'])) {
- $this->defaults = $config['default'];
- }
- if (isset($config['conditions'])) {
- $this->conditions = $config['conditions'];
+ if ($config === null) {
+ $config = [];
}
- if (isset($config['scope'])) {
- $this->scope = $config['scope'];
- }
- if (isset($config['cssClass'])) {
- $this->cssClass = $config['cssClass'];
- }
- if (isset($config['nameFrom'])) {
- $this->nameFrom = $config['nameFrom'];
- }
- if (isset($config['descriptionFrom'])) {
- $this->descriptionFrom = $config['descriptionFrom'];
- }
- if (array_key_exists('disabled', $config)) {
- $this->disabled = $config['disabled'];
+
+ /*
+ * Standard config:property values
+ */
+ $applyConfigValues = [
+ 'options',
+ 'dependsOn',
+ 'context',
+ 'default',
+ 'conditions',
+ 'scope',
+ 'cssClass',
+ 'nameFrom',
+ 'descriptionFrom',
+ 'disabled',
+ ];
+
+ foreach ($applyConfigValues as $value) {
+ if (array_key_exists($value, $config)) {
+ $this->{$value} = $config[$value];
+ }
}
+
return $config;
}
diff --git a/modules/backend/classes/FormField.php b/modules/backend/classes/FormField.php
index a8980ae..f2b6efc 100644
--- a/modules/backend/classes/FormField.php
+++ b/modules/backend/classes/FormField.php
@@ -94,12 +94,12 @@ class FormField
/**
* @var string Specifies contextual visibility of this form field.
*/
- public $context = null;
+ public $context;
/**
* @var bool Specifies if this field is mandatory.
*/
- public $required = null;
+ public $required;
/**
* @var bool Specify if the field is read-only or not.
@@ -178,8 +178,8 @@ class FormField
/**
* Constructor.
- * @param string $fieldName
- * @param string $label
+ * @param string $fieldName The name of the field
+ * @param string $label The label of the field
*/
public function __construct($fieldName, $label)
{
@@ -234,9 +234,8 @@ public function options($value = null)
return [];
}
- else {
- $this->options = $value;
- }
+
+ $this->options = $value;
return $this;
}
@@ -249,6 +248,7 @@ public function options($value = null)
* - radio - creates a set of radio buttons.
* - checkbox - creates a single checkbox.
* - checkboxlist - creates a checkbox list.
+ * - switch - creates a switch field.
* @param string $type Specifies a render mode as described above
* @param array $config A list of render mode specific config.
*/
@@ -256,6 +256,7 @@ public function displayAs($type, $config = [])
{
$this->type = strtolower($type) ?: $this->type;
$this->config = $this->evalConfig($config);
+
return $this;
}
@@ -266,7 +267,7 @@ public function displayAs($type, $config = [])
*/
protected function evalConfig($config)
{
- if (is_null($config)) {
+ if ($config === null) {
$config = [];
}
@@ -423,6 +424,16 @@ public function getAttributes($position = 'field', $htmlBuild = true)
{
$result = array_get($this->attributes, $position, []);
$result = $this->filterAttributes($result, $position);
+
+ // Field is required, so add the "required" attribute
+ if ($position === 'field' && $this->required && (!isset($result['required']) || $result['required'])) {
+ $result['required'] = '';
+ }
+ // The "required" attribute is set and falsy, so unset it
+ elseif ($position === 'field' && isset($result['required']) && !$result['required']) {
+ unset($result['required']);
+ }
+
return $htmlBuild ? Html::attributes($result) : $result;
}
@@ -446,6 +457,10 @@ protected function filterAttributes($attributes, $position = 'field')
if ($position == 'field' && $this->readOnly) {
$attributes = $attributes + ['readonly' => 'readonly'];
+
+ if ($this->type == 'checkbox' || $this->type == 'switch') {
+ $attributes = $attributes + ['onclick' => 'return false;'];
+ }
}
return $attributes;
@@ -505,12 +520,10 @@ protected function filterTriggerAttributes($attributes, $position = 'field')
'data-trigger' => '[name="'.$fullTriggerField.'"]',
'data-trigger-action' => $triggerAction,
'data-trigger-condition' => $triggerCondition,
- 'data-trigger-closest-parent' => 'form'
+ 'data-trigger-closest-parent' => 'form, div[data-control="formwidget"]'
];
- $attributes = $attributes + $newAttributes;
-
- return $attributes;
+ return $attributes + $newAttributes;
}
/**
@@ -549,8 +562,7 @@ protected function filterPresetAttributes($attributes, $position = 'field')
$newAttributes['data-input-preset-prefix-input'] = $prefixInput;
}
- $attributes = $attributes + $newAttributes;
- return $attributes;
+ return $attributes + $newAttributes;
}
/**
@@ -567,9 +579,8 @@ public function getName($arrayName = null)
if ($arrayName) {
return $arrayName.'['.implode('][', HtmlHelper::nameToArray($this->fieldName)).']';
}
- else {
- return $this->fieldName;
- }
+
+ return $this->fieldName;
}
/**
@@ -686,7 +697,6 @@ protected function getFieldNameFromData($fieldName, $data, $default = null)
* relation value, all others will look up the relation object as normal.
*/
foreach ($keyParts as $key) {
-
if ($result instanceof Model && $result->hasRelation($key)) {
if ($key == $lastField) {
$result = $result->getRelationValue($key) ?: $default;
@@ -707,7 +717,6 @@ protected function getFieldNameFromData($fieldName, $data, $default = null)
}
$result = $result->{$key};
}
-
}
return $result;
diff --git a/modules/backend/classes/FormTabs.php b/modules/backend/classes/FormTabs.php
index 253c8e3..8da0526 100644
--- a/modules/backend/classes/FormTabs.php
+++ b/modules/backend/classes/FormTabs.php
@@ -27,15 +27,25 @@ class FormTabs implements IteratorAggregate, ArrayAccess
*/
public $fields = [];
+ /**
+ * @var array Names of tabs to lazy load.
+ */
+ public $lazy = [];
+
/**
* @var string Default tab label to use when none is specified.
*/
public $defaultTab = 'backend::lang.form.undefined_tab';
+ /**
+ * @var array List of icons for their corresponding tabs.
+ */
+ public $icons = [];
+
/**
* @var bool Should these tabs stretch to the bottom of the page layout.
*/
- public $stretch = null;
+ public $stretch;
/**
* @var boolean If set to TRUE, fields will not be displayed in tabs.
@@ -52,6 +62,11 @@ class FormTabs implements IteratorAggregate, ArrayAccess
*/
public $paneCssClass;
+ /**
+ * @var bool Each tab gets url fragment to be linkable.
+ */
+ public $linkable = true;
+
/**
* Constructor.
* Specifies a tabs rendering section. Supported sections are:
@@ -82,6 +97,10 @@ protected function evalConfig($config)
$this->defaultTab = $config['defaultTab'];
}
+ if (array_key_exists('icons', $config)) {
+ $this->icons = $config['icons'];
+ }
+
if (array_key_exists('stretch', $config)) {
$this->stretch = $config['stretch'];
}
@@ -97,6 +116,14 @@ protected function evalConfig($config)
if (array_key_exists('paneCssClass', $config)) {
$this->paneCssClass = $config['paneCssClass'];
}
+
+ if (array_key_exists('linkable', $config)) {
+ $this->linkable = (bool) $config['linkable'];
+ }
+
+ if (array_key_exists('lazy', $config)) {
+ $this->lazy = $config['lazy'];
+ }
}
/**
@@ -108,7 +135,7 @@ protected function evalConfig($config)
public function addField($name, FormField $field, $tab = null)
{
if (!$tab) {
- $tab = trans($this->defaultTab);
+ $tab = $this->defaultTab;
}
$this->fields[$tab][$name] = $field;
@@ -174,6 +201,18 @@ public function getAllFields()
return $tablessFields;
}
+ /**
+ * Returns an icon for the tab based on the tab's name.
+ * @param string $name
+ * @return string
+ */
+ public function getIcon($name)
+ {
+ if (!empty($this->icons[$name])) {
+ return $this->icons[$name];
+ }
+ }
+
/**
* Returns a tab pane CSS class.
* @param string $index
@@ -182,6 +221,10 @@ public function getAllFields()
*/
public function getPaneCssClass($index = null, $label = null)
{
+ if (is_string($this->paneCssClass)) {
+ return $this->paneCssClass;
+ }
+
if ($index !== null && isset($this->paneCssClass[$index])) {
return $this->paneCssClass[$index];
}
@@ -197,9 +240,10 @@ public function getPaneCssClass($index = null, $label = null)
*/
public function getIterator()
{
- return new ArrayIterator($this->suppressTabs
- ? $this->getAllFields()
- : $this->getFields()
+ return new ArrayIterator(
+ $this->suppressTabs
+ ? $this->getAllFields()
+ : $this->getFields()
);
}
@@ -232,6 +276,6 @@ public function offsetUnset($offset)
*/
public function offsetGet($offset)
{
- return isset($this->fields[$offset]) ? $this->fields[$offset] : null;
+ return $this->fields[$offset] ?? null;
}
}
diff --git a/modules/backend/classes/FormWidgetBase.php b/modules/backend/classes/FormWidgetBase.php
index a9616e3..d505e77 100644
--- a/modules/backend/classes/FormWidgetBase.php
+++ b/modules/backend/classes/FormWidgetBase.php
@@ -50,6 +50,11 @@ abstract class FormWidgetBase extends WidgetBase
*/
protected $formField;
+ /**
+ * @var Backend\Widgets\Form The parent form that contains this field
+ */
+ protected $parentForm = null;
+
/**
* @var string Form field name.
*/
@@ -79,12 +84,23 @@ public function __construct($controller, $formField, $configuration = [])
'data',
'sessionKey',
'previewMode',
- 'showLabels'
+ 'showLabels',
+ 'parentForm',
]);
parent::__construct($controller, $configuration);
}
+ /**
+ * Retrieve the parent form for this formwidget
+ *
+ * @return Backend\Widgets\Form|null
+ */
+ public function getParentForm()
+ {
+ return $this->parentForm;
+ }
+
/**
* Returns the HTML element field name for this widget, used for capturing
* user input, passed back to the getSaveValue method when saving.
@@ -133,5 +149,4 @@ public function getLoadValue()
return $this->formField->getValueFromData($this->data ?: $this->model, $defaultValue);
}
-
}
diff --git a/modules/backend/classes/ListColumn.php b/modules/backend/classes/ListColumn.php
index 99bd2e2..96384ad 100644
--- a/modules/backend/classes/ListColumn.php
+++ b/modules/backend/classes/ListColumn.php
@@ -81,6 +81,11 @@ class ListColumn
*/
public $cssClass;
+ /**
+ * @var string Specify a CSS class to attach to the list header cell element.
+ */
+ public $headCssClass;
+
/**
* @var string Specify a format or style for the column value, such as a Date.
*/
@@ -138,6 +143,9 @@ protected function evalConfig($config)
if (isset($config['cssClass'])) {
$this->cssClass = $config['cssClass'];
}
+ if (isset($config['headCssClass'])) {
+ $this->headCssClass = $config['headCssClass'];
+ }
if (isset($config['searchable'])) {
$this->searchable = $config['searchable'];
}
@@ -211,6 +219,17 @@ public function getAlignClass()
return $this->align ? 'list-cell-align-' . $this->align : '';
}
+ /**
+ * Returns a raw config item value.
+ * @param string $value
+ * @param string $default
+ * @return mixed
+ */
+ public function getConfig($value, $default = null)
+ {
+ return array_get($this->config, $value, $default);
+ }
+
/**
* Returns this columns value from a supplied data set, which can be
* an array or a model or another generic collection.
@@ -250,13 +269,12 @@ protected function getColumnNameFromData($columnName, $data, $default = null)
}
else {
if (is_array($result) && array_key_exists($key, $result)) {
- return $result[$key];
- }
- if (!isset($result->{$key})) {
+ $result = $result[$key];
+ } elseif (!isset($result->{$key})) {
return $default;
+ } else {
+ $result = $result->{$key};
}
-
- $result = $result->{$key};
}
}
diff --git a/modules/backend/classes/MainMenuItem.php b/modules/backend/classes/MainMenuItem.php
new file mode 100644
index 0000000..7c1d1a7
--- /dev/null
+++ b/modules/backend/classes/MainMenuItem.php
@@ -0,0 +1,131 @@
+permissions[$permission] = $definition;
+ }
+
+ /**
+ * @param SideMenuItem $sideMenu
+ */
+ public function addSideMenuItem(SideMenuItem $sideMenu)
+ {
+ $this->sideMenu[$sideMenu->code] = $sideMenu;
+ }
+
+ /**
+ * @param string $code
+ * @return SideMenuItem
+ * @throws SystemException
+ */
+ public function getSideMenuItem(string $code)
+ {
+ if (!array_key_exists($code, $this->sideMenu)) {
+ throw new SystemException('No sidenavigation item available with code ' . $code);
+ }
+
+ return $this->sideMenu[$code];
+ }
+
+ /**
+ * @param string $code
+ */
+ public function removeSideMenuItem(string $code)
+ {
+ unset($this->sideMenu[$code]);
+ }
+
+ /**
+ * @param array $data
+ * @return static
+ */
+ public static function createFromArray(array $data)
+ {
+ $instance = new static();
+ $instance->code = $data['code'];
+ $instance->owner = $data['owner'];
+ $instance->label = $data['label'];
+ $instance->url = $data['url'];
+ $instance->icon = $data['icon'] ?? null;
+ $instance->iconSvg = $data['iconSvg'] ?? null;
+ $instance->counter = $data['counter'] ?? null;
+ $instance->counterLabel = $data['counterLabel'] ?? null;
+ $instance->badge = $data['badge'] ?? null;
+ $instance->permissions = $data['permissions'] ?? $instance->permissions;
+ $instance->order = $data['order'] ?? $instance->order;
+ return $instance;
+ }
+}
diff --git a/modules/backend/classes/NavigationManager.php b/modules/backend/classes/NavigationManager.php
index 0ea6770..ee57c16 100644
--- a/modules/backend/classes/NavigationManager.php
+++ b/modules/backend/classes/NavigationManager.php
@@ -3,6 +3,10 @@
use Event;
use BackendAuth;
use System\Classes\PluginManager;
+use Validator;
+use SystemException;
+use Log;
+use Config;
/**
* Manages the backend navigation.
@@ -20,7 +24,7 @@ class NavigationManager
protected $callbacks = [];
/**
- * @var array List of registered items.
+ * @var MainMenuItem[] List of registered items.
*/
protected $items;
@@ -30,32 +34,8 @@ class NavigationManager
protected $contextMainMenuItemCode;
protected $contextSideMenuItemCode;
- protected static $mainItemDefaults = [
- 'code' => null,
- 'label' => null,
- 'icon' => null,
- 'iconSvg' => null,
- 'url' => null,
- 'permissions' => [],
- 'order' => 500,
- 'sideMenu' => []
- ];
-
- protected static $sideItemDefaults = [
- 'code' => null,
- 'label' => null,
- 'icon' => null,
- 'url' => null,
- 'iconSvg' => null,
- 'counter' => null,
- 'counterLabel'=> null,
- 'order' => -1,
- 'attributes' => [],
- 'permissions' => []
- ];
-
/**
- * @var System\Classes\PluginManager
+ * @var PluginManager
*/
protected $pluginManager;
@@ -70,6 +50,7 @@ protected function init()
/**
* Loads the menu items from modules and plugins
* @return void
+ * @throws SystemException
*/
protected function loadItems()
{
@@ -94,15 +75,25 @@ protected function loadItems()
$this->registerMenuItems($id, $items);
}
- /*
- * Extensibility
+ /**
+ * @event backend.menu.extendItems
+ * Provides an opportunity to manipulate the backend navigation
+ *
+ * Example usage:
+ *
+ * Event::listen('backend.menu.extendItems', function ((\Backend\Classes\NavigationManager) $navigationManager) {
+ * $navigationManager->addMainMenuItems(...)
+ * $navigationManager->addSideMenuItems(...)
+ * $navigationManager->removeMainMenuItem(...)
+ * });
+ *
*/
Event::fire('backend.menu.extendItems', [$this]);
/*
* Sort menu items
*/
- uasort($this->items, function ($a, $b) {
+ uasort($this->items, static function ($a, $b) {
return $a->order - $b->order;
});
@@ -122,14 +113,16 @@ protected function loadItems()
*/
$orderCount = 0;
foreach ($item->sideMenu as $sideMenuItem) {
- if ($sideMenuItem->order !== -1) continue;
+ if ($sideMenuItem->order !== -1) {
+ continue;
+ }
$sideMenuItem->order = ($orderCount += 100);
}
/*
* Sort side menu items
*/
- uasort($item->sideMenu, function ($a, $b) {
+ uasort($item->sideMenu, static function ($a, $b) {
return $a->order - $b->order;
});
@@ -146,7 +139,7 @@ protected function loadItems()
* `registerMenuItems` method. The manager instance is passed to the callback
* function as an argument. Usage:
*
- * BackendMenu::registerCallback(function($manager){
+ * BackendMenu::registerCallback(function ($manager) {
* $manager->registerMenuItems([...]);
* });
*
@@ -168,19 +161,25 @@ public function registerCallback(callable $callback)
* - permissions - an array of permissions the back-end user should have, optional.
* The item will be displayed if the user has any of the specified permissions.
* - order - a position of the item in the menu, optional.
- * - sideMenu - an array of side menu items, optional. If provided, the array items
- * should represent the side menu item code, and each value should be an associative
- * array with the following keys:
- * - label - specifies the menu label localization string key, required.
- * - icon - an icon name from the Font Awesome icon collection, required.
- * - url - the back-end relative URL the menu item should point to, required.
- * - attributes - an array of attributes and values to apply to the menu item, optional.
- * - permissions - an array of permissions the back-end user should have, optional.
* - counter - an optional numeric value to output near the menu icon. The value should be
* a number or a callable returning a number.
* - counterLabel - an optional string value to describe the numeric reference in counter.
+ * - sideMenu - an array of side menu items, optional. If provided, the array items
+ * should represent the side menu item code, and each value should be an associative
+ * array with the following keys:
+ * - label - specifies the menu label localization string key, required.
+ * - icon - an icon name from the Font Awesome icon collection, required.
+ * - url - the back-end relative URL the menu item should point to, required.
+ * - attributes - an array of attributes and values to apply to the menu item, optional.
+ * - permissions - an array of permissions the back-end user should have, optional.
+ * - counter - an optional numeric value to output near the menu icon. The value should be
+ * a number or a callable returning a number.
+ * - counterLabel - an optional string value to describe the numeric reference in counter.
+ * - badge - an optional string value to output near the menu icon. The value should be
+ * a string. This value will override the counter if set.
* @param string $owner Specifies the menu items owner plugin or module in the format Author.Plugin.
* @param array $definitions An array of the menu item definitions.
+ * @throws SystemException
*/
public function registerMenuItems($owner, array $definitions)
{
@@ -188,6 +187,24 @@ public function registerMenuItems($owner, array $definitions)
$this->items = [];
}
+ $validator = Validator::make($definitions, [
+ '*.label' => 'required',
+ '*.icon' => 'required_without:*.iconSvg',
+ '*.url' => 'required',
+ '*.sideMenu.*.label' => 'nullable|required',
+ '*.sideMenu.*.icon' => 'nullable|required_without:*.sideMenu.*.iconSvg',
+ '*.sideMenu.*.url' => 'nullable|required',
+ ]);
+
+ if ($validator->fails()) {
+ $errorMessage = 'Invalid menu item detected in ' . $owner . '. Contact the plugin author to fix (' . $validator->errors()->first() . ')';
+ if (Config::get('app.debug', false)) {
+ throw new SystemException($errorMessage);
+ }
+
+ Log::error($errorMessage);
+ }
+
$this->addMainMenuItems($owner, $definitions);
}
@@ -207,7 +224,7 @@ public function addMainMenuItems($owner, array $definitions)
* Dynamically add a single main menu item
* @param string $owner
* @param string $code
- * @param array $definitions
+ * @param array $definition
*/
public function addMainMenuItem($owner, $code, array $definition)
{
@@ -217,20 +234,39 @@ public function addMainMenuItem($owner, $code, array $definition)
$definition = array_merge((array) $this->items[$itemKey], $definition);
}
- $item = (object) array_merge(self::$mainItemDefaults, array_merge($definition, [
+ $item = array_merge($definition, [
'code' => $code,
'owner' => $owner
- ]));
+ ]);
- $this->items[$itemKey] = $item;
+ $this->items[$itemKey] = MainMenuItem::createFromArray($item);
+
+ if (array_key_exists('sideMenu', $item)) {
+ $this->addSideMenuItems($owner, $code, $item['sideMenu']);
+ }
+ }
+
+ /**
+ * @param string $owner
+ * @param string $code
+ * @return MainMenuItem
+ * @throws SystemException
+ */
+ public function getMainMenuItem(string $owner, string $code)
+ {
+ $itemKey = $this->makeItemKey($owner, $code);
- if ($item->sideMenu) {
- $this->addSideMenuItems($owner, $code, $item->sideMenu);
+ if (!array_key_exists($itemKey, $this->items)) {
+ throw new SystemException('No main menu item found with key ' . $itemKey);
}
+
+ return $this->items[$itemKey];
}
/**
* Removes a single main menu item
+ * @param $owner
+ * @param $code
*/
public function removeMainMenuItem($owner, $code)
{
@@ -256,7 +292,8 @@ public function addSideMenuItems($owner, $code, array $definitions)
* @param string $owner
* @param string $code
* @param string $sideCode
- * @param array $definitions
+ * @param array $definition
+ * @return bool
*/
public function addSideMenuItem($owner, $code, $sideCode, array $definition)
{
@@ -277,13 +314,18 @@ public function addSideMenuItem($owner, $code, $sideCode, array $definition)
$definition = array_merge((array) $mainItem->sideMenu[$sideCode], $definition);
}
- $item = (object) array_merge(self::$sideItemDefaults, $definition);
+ $item = SideMenuItem::createFromArray($definition);
- $this->items[$itemKey]->sideMenu[$sideCode] = $item;
+ $this->items[$itemKey]->addSideMenuItem($item);
+ return true;
}
/**
* Removes a single main menu item
+ * @param string $owner
+ * @param string $code
+ * @param string $sideCode
+ * @return bool
*/
public function removeSideMenuItem($owner, $code, $sideCode)
{
@@ -293,12 +335,14 @@ public function removeSideMenuItem($owner, $code, $sideCode)
}
$mainItem = $this->items[$itemKey];
- unset($mainItem->sideMenu[$sideCode]);
+ $mainItem->removeSideMenuItem($sideCode);
+ return true;
}
/**
* Returns a list of the main menu items.
* @return array
+ * @throws SystemException
*/
public function listMainMenuItems()
{
@@ -306,18 +350,50 @@ public function listMainMenuItems()
$this->loadItems();
}
+ foreach ($this->items as $item) {
+ if ($item->badge) {
+ $item->counter = (string) $item->badge;
+ continue;
+ }
+ if ($item->counter === false) {
+ continue;
+ }
+
+ if ($item->counter !== null && is_callable($item->counter)) {
+ $item->counter = call_user_func($item->counter, $item);
+ } elseif (!empty((int) $item->counter)) {
+ $item->counter = (int) $item->counter;
+ } elseif (!empty($sideItems = $this->listSideMenuItems($item->owner, $item->code))) {
+ $item->counter = 0;
+ foreach ($sideItems as $sideItem) {
+ if ($sideItem->badge) {
+ continue;
+ }
+ $item->counter += $sideItem->counter;
+ }
+ }
+
+ if (empty($item->counter) || !is_numeric($item->counter)) {
+ $item->counter = null;
+ }
+ }
+
return $this->items;
}
/**
* Returns a list of side menu items for the currently active main menu item.
* The currently active main menu item is set with the setContext methods.
+ * @param null $owner
+ * @param null $code
+ * @return SideMenuItem[]
+ * @throws SystemException
*/
public function listSideMenuItems($owner = null, $code = null)
{
$activeItem = null;
- if (!is_null($owner) && !is_null($code)) {
+ if ($owner !== null && $code !== null) {
$activeItem = @$this->items[$this->makeItemKey($owner, $code)];
} else {
foreach ($this->listMainMenuItems() as $item) {
@@ -335,8 +411,18 @@ public function listSideMenuItems($owner = null, $code = null)
$items = $activeItem->sideMenu;
foreach ($items as $item) {
+ if ($item->badge) {
+ $item->counter = (string) $item->badge;
+ continue;
+ }
if ($item->counter !== null && is_callable($item->counter)) {
$item->counter = call_user_func($item->counter, $item);
+ if (empty($item->counter)) {
+ $item->counter = null;
+ }
+ }
+ if (!is_null($item->counter) && !is_numeric($item->counter)) {
+ throw new SystemException("The menu item {$activeItem->code}.{$item->code}'s counter property is invalid. Check to make sure it's numeric or callable. Value: " . var_export($item->counter, true));
}
}
@@ -404,17 +490,18 @@ public function setContextSideMenu($sideMenuItemCode)
/**
* Determines if a main menu item is active.
- * @param mixed $item Specifies the item object.
+ * @param MainMenuItem $item Specifies the item object.
* @return boolean Returns true if the menu item is active.
*/
public function isMainMenuItemActive($item)
{
- return $this->contextOwner == $item->owner && $this->contextMainMenuItemCode == $item->code;
+ return $this->contextOwner === $item->owner && $this->contextMainMenuItemCode === $item->code;
}
/**
* Returns the currently active main menu item
- * @param mixed $item Returns the item object or null.
+ * @return null|MainMenuItem $item Returns the item object or null.
+ * @throws SystemException
*/
public function getActiveMainMenuItem()
{
@@ -429,7 +516,7 @@ public function getActiveMainMenuItem()
/**
* Determines if a side menu item is active.
- * @param mixed $item Specifies the item object.
+ * @param SideMenuItem $item Specifies the item object.
* @return boolean Returns true if the side item is active.
*/
public function isSideMenuItemActive($item)
@@ -439,7 +526,7 @@ public function isSideMenuItemActive($item)
return true;
}
- return $this->contextOwner == $item->owner && $this->contextSideMenuItemCode == $item->code;
+ return $this->contextOwner === $item->owner && $this->contextSideMenuItemCode === $item->code;
}
/**
@@ -466,15 +553,13 @@ public function getContextSidenavPartial($owner, $mainMenuItemCode)
{
$key = $owner.$mainMenuItemCode;
- return array_key_exists($key, $this->contextSidenavPartials)
- ? $this->contextSidenavPartials[$key]
- : null;
+ return $this->contextSidenavPartials[$key] ?? null;
}
/**
* Removes menu items from an array if the supplied user lacks permission.
- * @param User $user A user object
- * @param array $items A collection of menu items
+ * @param \Backend\Models\User $user A user object
+ * @param MainMenuItem[]|SideMenuItem[] $items A collection of menu items
* @return array The filtered menu items
*/
protected function filterItemPermissions($user, array $items)
@@ -483,7 +568,7 @@ protected function filterItemPermissions($user, array $items)
return $items;
}
- $items = array_filter($items, function ($item) use ($user) {
+ $items = array_filter($items, static function ($item) use ($user) {
if (!$item->permissions || !count($item->permissions)) {
return true;
}
@@ -496,7 +581,8 @@ protected function filterItemPermissions($user, array $items)
/**
* Internal method to make a unique key for an item.
- * @param object $item
+ * @param string $owner
+ * @param string $code
* @return string
*/
protected function makeItemKey($owner, $code)
diff --git a/modules/backend/classes/ReportWidgetBase.php b/modules/backend/classes/ReportWidgetBase.php
index 8d5b708..d37e180 100644
--- a/modules/backend/classes/ReportWidgetBase.php
+++ b/modules/backend/classes/ReportWidgetBase.php
@@ -15,6 +15,14 @@ public function __construct($controller, $properties = [])
{
$this->properties = $this->validateProperties($properties);
+ /*
+ * Ensure the provided alias (if present) takes effect as the widget configuration is
+ * not passed to the WidgetBase constructor which would normally take care of that
+ */
+ if (!isset($this->alias)) {
+ $this->alias = $properties['alias'] ?? $this->defaultAlias;
+ }
+
parent::__construct($controller);
}
}
diff --git a/modules/backend/classes/SideMenuItem.php b/modules/backend/classes/SideMenuItem.php
new file mode 100644
index 0000000..27ec84e
--- /dev/null
+++ b/modules/backend/classes/SideMenuItem.php
@@ -0,0 +1,123 @@
+attributes[$attribute] = $value;
+ }
+
+ public function removeAttribute($attribute)
+ {
+ unset($this->attributes[$attribute]);
+ }
+
+ /**
+ * @param string $permission
+ * @param array $definition
+ */
+ public function addPermission(string $permission, array $definition)
+ {
+ $this->permissions[$permission] = $definition;
+ }
+
+ /**
+ * @param string $permission
+ * @return void
+ */
+ public function removePermission(string $permission)
+ {
+ unset($this->permissions[$permission]);
+ }
+
+ /**
+ * @param array $data
+ * @return static
+ */
+ public static function createFromArray(array $data)
+ {
+ $instance = new static();
+ $instance->code = $data['code'];
+ $instance->owner = $data['owner'];
+ $instance->label = $data['label'];
+ $instance->url = $data['url'];
+ $instance->icon = $data['icon'] ?? null;
+ $instance->iconSvg = $data['iconSvg'] ?? null;
+ $instance->counter = $data['counter'] ?? null;
+ $instance->counterLabel = $data['counterLabel'] ?? null;
+ $instance->attributes = $data['attributes'] ?? $instance->attributes;
+ $instance->badge = $data['badge'] ?? null;
+ $instance->permissions = $data['permissions'] ?? $instance->permissions;
+ $instance->order = $data['order'] ?? $instance->order;
+ return $instance;
+ }
+}
diff --git a/modules/backend/classes/Skin.php b/modules/backend/classes/Skin.php
index 47facba..e46865c 100644
--- a/modules/backend/classes/Skin.php
+++ b/modules/backend/classes/Skin.php
@@ -80,11 +80,10 @@ public function getPath($path = null, $isPublic = false)
? $this->publicSkinPath . $path
: $this->skinPath . $path;
}
- else {
- return $isPublic
- ? $this->defaultPublicSkinPath . $path
- : $this->defaultSkinPath . $path;
- }
+
+ return $isPublic
+ ? $this->defaultPublicSkinPath . $path
+ : $this->defaultSkinPath . $path;
}
/**
diff --git a/modules/backend/classes/WidgetBase.php b/modules/backend/classes/WidgetBase.php
index 468f56d..3444b91 100644
--- a/modules/backend/classes/WidgetBase.php
+++ b/modules/backend/classes/WidgetBase.php
@@ -1,7 +1,5 @@
alias)) {
- $this->alias = (isset($this->config->alias)) ? $this->config->alias : $this->defaultAlias;
+ $this->alias = $this->config->alias ?? $this->defaultAlias;
}
/*
diff --git a/modules/backend/classes/WidgetManager.php b/modules/backend/classes/WidgetManager.php
index 18ce9e4..7ec610c 100644
--- a/modules/backend/classes/WidgetManager.php
+++ b/modules/backend/classes/WidgetManager.php
@@ -1,6 +1,8 @@
$widgetInfo];
}
- $widgetCode = isset($widgetInfo['code']) ? $widgetInfo['code'] : null;
+ $widgetCode = $widgetInfo['code'] ?? null;
if (!$widgetCode) {
$widgetCode = Str::getClassId($className);
@@ -114,10 +116,9 @@ public function registerFormWidget($className, $widgetInfo = null)
}
/**
- * Manually registers form widget for consideration.
- * Usage:
+ * Manually registers form widget for consideration. Usage:
*
- * WidgetManager::registerFormWidgets(function($manager){
+ * WidgetManager::registerFormWidgets(function ($manager) {
* $manager->registerFormWidget('Backend\FormWidgets\CodeEditor', 'codeeditor');
* });
*
@@ -199,13 +200,31 @@ public function listReportWidgets()
*
* Example usage:
*
- * Event::listen('system.reportwidgets.extendItems', function($manager) {
+ * Event::listen('system.reportwidgets.extendItems', function ($manager) {
* $manager->removeReportWidget('Acme\ReportWidgets\YourWidget');
* });
*
*/
Event::fire('system.reportwidgets.extendItems', [$this]);
+ $user = BackendAuth::getUser();
+ foreach ($this->reportWidgets as $widget => $config) {
+ if (!empty($config['permissions'])) {
+ if (!$user->hasAccess($config['permissions'], false)) {
+ unset($this->reportWidgets[$widget]);
+ }
+ }
+ }
+
+ return $this->reportWidgets;
+ }
+
+ /**
+ * Returns the raw array of registered report widgets.
+ * @return array Array keys are class names.
+ */
+ public function getReportWidgets()
+ {
return $this->reportWidgets;
}
@@ -218,10 +237,9 @@ public function registerReportWidget($className, $widgetInfo)
}
/**
- * Manually registers report widget for consideration.
- * Usage:
+ * Manually registers report widget for consideration. Usage:
*
- * WidgetManager::registerReportWidgets(function($manager){
+ * WidgetManager::registerReportWidgets(function ($manager) {
* $manager->registerReportWidget('RainLab\GoogleAnalytics\ReportWidgets\TrafficOverview', [
* 'name' => 'Google Analytics traffic overview',
* 'context' => 'dashboard'
@@ -247,5 +265,4 @@ public function removeReportWidget($className)
unset($this->reportWidgets[$className]);
}
-
}
diff --git a/modules/backend/controllers/Auth.php b/modules/backend/controllers/Auth.php
index a024c6b..7bd8d59 100644
--- a/modules/backend/controllers/Auth.php
+++ b/modules/backend/controllers/Auth.php
@@ -3,6 +3,7 @@
use Mail;
use Flash;
use Backend;
+use Request;
use Validator;
use BackendAuth;
use Backend\Models\AccessLog;
@@ -11,6 +12,7 @@
use ApplicationException;
use ValidationException;
use Exception;
+use Config;
/**
* Authentication controller
@@ -32,6 +34,7 @@ class Auth extends Controller
public function __construct()
{
parent::__construct();
+
$this->layout = 'auth';
}
@@ -50,15 +53,16 @@ public function signin()
{
$this->bodyClass = 'signin';
+ // Clear Cache and any previous data to fix invalid security token issue
+ $this->setResponseHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
+
try {
if (post('postback')) {
return $this->signin_onSubmit();
}
- else {
- $this->bodyClass .= ' preload';
- }
- }
- catch (Exception $ex) {
+
+ $this->bodyClass .= ' preload';
+ } catch (Exception $ex) {
Flash::error($ex->getMessage());
}
}
@@ -75,7 +79,7 @@ public function signin_onSubmit()
throw new ValidationException($validation);
}
- if (is_null($remember = config('cms.backendForceRemember', true))) {
+ if (is_null($remember = Config::get('cms.backendForceRemember', true))) {
$remember = (bool) post('remember');
}
@@ -85,12 +89,17 @@ public function signin_onSubmit()
'password' => post('password')
], $remember);
- try {
- // Load version updates
- UpdateManager::instance()->update();
+ if (is_null($runMigrationsOnLogin = Config::get('cms.runMigrationsOnLogin', null))) {
+ $runMigrationsOnLogin = Config::get('app.debug', false);
}
- catch (Exception $ex) {
- Flash::error($ex->getMessage());
+
+ if ($runMigrationsOnLogin) {
+ try {
+ // Load version updates
+ UpdateManager::instance()->update();
+ } catch (Exception $ex) {
+ Flash::error($ex->getMessage());
+ }
}
// Log the sign in event
@@ -105,7 +114,17 @@ public function signin_onSubmit()
*/
public function signout()
{
- BackendAuth::logout();
+ if (BackendAuth::isImpersonator()) {
+ BackendAuth::stopImpersonate();
+ } else {
+ BackendAuth::logout();
+ }
+
+ // Add HTTP Header 'Clear Site Data' to purge all sensitive data upon signout
+ if (Request::secure()) {
+ $this->setResponseHeader('Clear-Site-Data', 'cache, cookies, storage, executionContexts');
+ }
+
return Backend::redirect('backend');
}
@@ -118,12 +137,14 @@ public function restore()
if (post('postback')) {
return $this->restore_onSubmit();
}
- }
- catch (Exception $ex) {
+ } catch (Exception $ex) {
Flash::error($ex->getMessage());
}
}
+ /**
+ * Submits the restore form.
+ */
public function restore_onSubmit()
{
$rules = [
@@ -145,7 +166,7 @@ public function restore_onSubmit()
Flash::success(trans('backend::lang.account.restore_success'));
$code = $user->getResetPasswordCode();
- $link = Backend::url('backend/auth/reset/'.$user->id.'/'.$code);
+ $link = Backend::url('backend/auth/reset/' . $user->id . '/' . $code);
$data = [
'name' => $user->full_name,
@@ -172,8 +193,7 @@ public function reset($userId = null, $code = null)
if (!$userId || !$code) {
throw new ApplicationException(trans('backend::lang.account.reset_error'));
}
- }
- catch (Exception $ex) {
+ } catch (Exception $ex) {
Flash::error($ex->getMessage());
}
@@ -181,6 +201,9 @@ public function reset($userId = null, $code = null)
$this->vars['id'] = $userId;
}
+ /**
+ * Submits the reset form.
+ */
public function reset_onSubmit()
{
if (!post('id') || !post('code')) {
diff --git a/modules/backend/controllers/Files.php b/modules/backend/controllers/Files.php
index 97a68ee..adc5bcf 100644
--- a/modules/backend/controllers/Files.php
+++ b/modules/backend/controllers/Files.php
@@ -1,7 +1,10 @@
findFileObject($code)->output();
- exit;
+ return $this->findFileObject($code)->output('inline', true);
+ }
+ catch (Exception $ex) {
}
- catch (Exception $ex) {}
- return App::make('Cms\Classes\Controller')->setStatusCode(404)->run('/404');
+ return Response::make(View::make('backend::404'), 404);
}
/**
@@ -39,16 +42,58 @@ public function get($code = null)
public function thumb($code = null, $width = 100, $height = 100, $mode = 'auto', $extension = 'auto')
{
try {
- echo $this->findFileObject($code)->outputThumb(
+ return $this->findFileObject($code)->outputThumb(
$width,
$height,
- compact('mode', 'extension')
+ compact('mode', 'extension'),
+ true
);
- exit;
}
- catch (Exception $ex) {}
+ catch (Exception $ex) {
+ }
+
+ return Response::make(View::make('backend::404'), 404);
+ }
+
+ /**
+ * Attempt to return a redirect to a temporary URL to the asset instead of streaming the asset - if supported
+ *
+ * @param System|Models\File $file
+ * @param string|null $path Optional, defaults to the getDiskPath() of the file
+ * @return string|null
+ */
+ protected static function getTemporaryUrl($file, $path = null)
+ {
+ // Get the disk and adapter used
+ $url = null;
+ $disk = $file->getDisk();
+ $adapter = $disk->getAdapter();
+ if (class_exists('\League\Flysystem\Cached\CachedAdapter') && $adapter instanceof \League\Flysystem\Cached\CachedAdapter) {
+ $adapter = $adapter->getAdapter();
+ }
+
+ if ((class_exists('\League\Flysystem\AwsS3v3\AwsS3Adapter') && $adapter instanceof \League\Flysystem\AwsS3v3\AwsS3Adapter) ||
+ (class_exists('\League\Flysystem\Rackspace\RackspaceAdapter') && $adapter instanceof \League\Flysystem\Rackspace\RackspaceAdapter) ||
+ method_exists($adapter, 'getTemporaryUrl')
+ ) {
+ if (empty($path)) {
+ $path = $file->getDiskPath();
+ }
+
+ // Check to see if the URL has already been generated
+ $pathKey = 'backend.file:' . $path;
+ $url = Cache::get($pathKey);
+
+ // The AWS S3 storage drivers will return a valid temporary URL even if the file does not exist
+ if (is_null($url) && $disk->exists($path)) {
+ $expires = now()->addSeconds(Config::get('cms.storage.uploads.temporaryUrlTTL', 3600));
+ $url = Cache::remember($pathKey, $expires, function () use ($disk, $path, $expires) {
+ return $disk->temporaryUrl($path, $expires);
+ });
+ }
+ }
- return App::make('Cms\Classes\Controller')->setStatusCode(404)->run('/404');
+ return $url;
}
/**
@@ -58,7 +103,13 @@ public function thumb($code = null, $width = 100, $height = 100, $mode = 'auto',
*/
public static function getDownloadUrl($file)
{
- return Backend::url('backend/files/get/' . self::getUniqueCode($file));
+ $url = static::getTemporaryUrl($file);
+
+ if (!empty($url)) {
+ return $url;
+ } else {
+ return Backend::url('backend/files/get/' . self::getUniqueCode($file));
+ }
}
/**
@@ -71,7 +122,13 @@ public static function getDownloadUrl($file)
*/
public static function getThumbUrl($file, $width, $height, $options)
{
- return Backend::url('backend/files/thumb/' . self::getUniqueCode($file)) . '/' . $width . '/' . $height . '/' . $options['mode'] . '/' . $options['extension'];
+ $url = static::getTemporaryUrl($file, $file->getDiskPath($file->getThumbFilename($width, $height, $options)));
+
+ if (!empty($url)) {
+ return $url;
+ } else {
+ return Backend::url('backend/files/thumb/' . self::getUniqueCode($file)) . '/' . $width . '/' . $height . '/' . $options['mode'] . '/' . $options['extension'];
+ }
}
/**
@@ -110,7 +167,7 @@ protected function findFileObject($code)
if (!$file = FileModel::find((int) $id)) {
throw new ApplicationException('Unable to find file');
}
-
+
/**
* Ensure that the file model utilized for this request is
* the one specified in the relationship configuration
diff --git a/modules/backend/controllers/Index.php b/modules/backend/controllers/Index.php
index 962186e..75a18eb 100644
--- a/modules/backend/controllers/Index.php
+++ b/modules/backend/controllers/Index.php
@@ -1,7 +1,6 @@
user->hasAccess('backend.access_dashboard')) {
- $true = function () { return true; };
+ $true = function () {
+ return true;
+ };
if ($first = array_first(BackendMenu::listMainMenuItems(), $true)) {
return Redirect::intended($first->url);
}
diff --git a/modules/backend/controllers/UserGroups.php b/modules/backend/controllers/UserGroups.php
index f0a0dab..ed5e4d3 100644
--- a/modules/backend/controllers/UserGroups.php
+++ b/modules/backend/controllers/UserGroups.php
@@ -1,7 +1,6 @@
bindEvent('page.beforeDisplay', function() {
+ $this->bindEvent('page.beforeDisplay', function () {
if (!$this->user->isSuperUser()) {
return Response::make(View::make('backend::access_denied'), 403);
}
diff --git a/modules/backend/controllers/Users.php b/modules/backend/controllers/Users.php
index 6aba916..3aa4f7e 100644
--- a/modules/backend/controllers/Users.php
+++ b/modules/backend/controllers/Users.php
@@ -1,6 +1,10 @@
where('is_superuser', false);
}
}
-
+
/**
* Prevents non-superusers from even seeing the is_superuser filter
*/
@@ -79,6 +83,16 @@ public function listFilterExtendScopes($filterWidget)
}
}
+ /**
+ * Strike out deleted records
+ */
+ public function listInjectRowClass($record, $definition = null)
+ {
+ if ($record->trashed()) {
+ return 'strike';
+ }
+ }
+
/**
* Extends the form query to prevent non-superusers from accessing superusers at all
*/
@@ -87,6 +101,9 @@ public function formExtendQuery($query)
if (!$this->user->isSuperUser()) {
$query->where('is_superuser', false);
}
+
+ // Ensure soft-deleted records can still be managed
+ $query->withTrashed();
}
/**
@@ -102,6 +119,50 @@ public function update($recordId, $context = null)
return $this->asExtension('FormController')->update($recordId, $context);
}
+ /**
+ * Handle restoring users
+ */
+ public function update_onRestore($recordId)
+ {
+ $this->formFindModelObject($recordId)->restore();
+
+ Flash::success(Lang::get('backend::lang.form.restore_success', ['name' => Lang::get('backend::lang.user.name')]));
+
+ return Redirect::refresh();
+ }
+
+ /**
+ * Impersonate this user
+ */
+ public function update_onImpersonateUser($recordId)
+ {
+ if (!$this->user->hasAccess('backend.impersonate_users')) {
+ return Response::make(Lang::get('backend::lang.page.access_denied.label'), 403);
+ }
+
+ $model = $this->formFindModelObject($recordId);
+
+ BackendAuth::impersonate($model);
+
+ Flash::success(Lang::get('backend::lang.account.impersonate_success'));
+
+ return Backend::redirect('backend/users/myaccount');
+ }
+
+ /**
+ * Unsuspend this user
+ */
+ public function update_onUnsuspendUser($recordId)
+ {
+ $model = $this->formFindModelObject($recordId);
+
+ $model->unsuspend();
+
+ Flash::success(Lang::get('backend::lang.account.unsuspend_success'));
+
+ return Redirect::refresh();
+ }
+
/**
* My Settings controller
*/
@@ -158,7 +219,9 @@ public function formExtendFields($form)
$defaultGroupIds = UserGroup::where('is_new_user_default', true)->lists('id');
$groupField = $form->getField('groups');
- $groupField->value = $defaultGroupIds;
+ if ($groupField) {
+ $groupField->value = $defaultGroupIds;
+ }
}
}
diff --git a/modules/backend/controllers/accesslogs/config_filter.yaml b/modules/backend/controllers/accesslogs/config_filter.yaml
new file mode 100644
index 0000000..2e35941
--- /dev/null
+++ b/modules/backend/controllers/accesslogs/config_filter.yaml
@@ -0,0 +1,16 @@
+# ===================================
+# Filter Scope Definitions
+# ===================================
+
+scopes:
+
+ created_at:
+ label: backend::lang.access_log.created_at
+ type: daterange
+ conditions: created_at >= ':after' AND created_at <= ':before'
+
+ user:
+ label: backend::lang.access_log.login
+ modelClass: Backend\Models\User
+ conditions: user_id in (:filtered)
+ nameFrom: login
diff --git a/modules/backend/controllers/accesslogs/config_list.yaml b/modules/backend/controllers/accesslogs/config_list.yaml
index 5d12e49..c146ba8 100644
--- a/modules/backend/controllers/accesslogs/config_list.yaml
+++ b/modules/backend/controllers/accesslogs/config_list.yaml
@@ -12,4 +12,6 @@ showSetup: true
toolbar:
buttons: list_toolbar
search:
- prompt: backend::lang.list.search_prompt
\ No newline at end of file
+ prompt: backend::lang.list.search_prompt
+
+filter: config_filter.yaml
diff --git a/modules/backend/controllers/auth/reset.htm b/modules/backend/controllers/auth/reset.htm
index 039178a..6761a36 100644
--- a/modules/backend/controllers/auth/reset.htm
+++ b/modules/backend/controllers/auth/reset.htm
@@ -2,8 +2,8 @@
= e(trans('backend::lang.account.enter_new_password')) ?>
= Form::open() ?>
-
-
+
+
diff --git a/modules/backend/controllers/userroles/create.htm b/modules/backend/controllers/userroles/create.htm
index 07f55b3..0ba5e30 100644
--- a/modules/backend/controllers/userroles/create.htm
+++ b/modules/backend/controllers/userroles/create.htm
@@ -19,14 +19,16 @@
= e(trans('backend::lang.form.create')) ?>
-
- = e(trans('backend::lang.form.delete')) ?>
diff --git a/modules/backend/controllers/users/_btn_impersonate.htm b/modules/backend/controllers/users/_btn_impersonate.htm
new file mode 100644
index 0000000..823af53
--- /dev/null
+++ b/modules/backend/controllers/users/_btn_impersonate.htm
@@ -0,0 +1,14 @@
+user->hasAccess('backend.impersonate_users')): ?>
+
+
+ = e(trans('backend::lang.account.impersonate')) ?>
+
+
+
\ No newline at end of file
diff --git a/modules/backend/controllers/users/_btn_unsuspend.htm b/modules/backend/controllers/users/_btn_unsuspend.htm
new file mode 100644
index 0000000..dcae86c
--- /dev/null
+++ b/modules/backend/controllers/users/_btn_unsuspend.htm
@@ -0,0 +1,14 @@
+isSuspended()): ?>
+
+
+ = e(trans('backend::lang.account.unsuspend')) ?>
+
+
+
diff --git a/modules/backend/controllers/users/_hint_trashed.htm b/modules/backend/controllers/users/_hint_trashed.htm
new file mode 100644
index 0000000..7c15ebd
--- /dev/null
+++ b/modules/backend/controllers/users/_hint_trashed.htm
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/modules/backend/controllers/users/config_filter.yaml b/modules/backend/controllers/users/config_filter.yaml
index 7d6bc79..08ebb3f 100644
--- a/modules/backend/controllers/users/config_filter.yaml
+++ b/modules/backend/controllers/users/config_filter.yaml
@@ -21,3 +21,10 @@ scopes:
modelClass: Backend\Models\UserRole
conditions: role_id in (:filtered)
nameFrom: name
+
+ show_deleted:
+ label: backend::lang.user.show_deleted
+ type: checkbox
+ modelClass: Backend\Models\User
+ scope: withTrashed
+ default: 0
diff --git a/modules/backend/controllers/users/create.htm b/modules/backend/controllers/users/create.htm
index 1340ef0..3197f49 100644
--- a/modules/backend/controllers/users/create.htm
+++ b/modules/backend/controllers/users/create.htm
@@ -20,6 +20,7 @@
@@ -28,6 +29,7 @@
fatalError): ?>
+ trashed()): ?>
+ = $this->makePartial('hint_trashed') ?>
+
+
diff --git a/modules/backend/database/migrations/2013_10_01_000001_Db_Backend_Users.php b/modules/backend/database/migrations/2013_10_01_000001_Db_Backend_Users.php
index caa9066..f01fb85 100644
--- a/modules/backend/database/migrations/2013_10_01_000001_Db_Backend_Users.php
+++ b/modules/backend/database/migrations/2013_10_01_000001_Db_Backend_Users.php
@@ -24,6 +24,7 @@ public function up()
$table->timestamp('activated_at')->nullable();
$table->timestamp('last_login')->nullable();
$table->timestamps();
+ $table->timestamp('deleted_at')->nullable();
});
}
diff --git a/modules/backend/database/migrations/2017_10_01_000010_Db_Backend_User_Roles.php b/modules/backend/database/migrations/2017_10_01_000010_Db_Backend_User_Roles.php
index 601893a..5fad314 100644
--- a/modules/backend/database/migrations/2017_10_01_000010_Db_Backend_User_Roles.php
+++ b/modules/backend/database/migrations/2017_10_01_000010_Db_Backend_User_Roles.php
@@ -88,7 +88,8 @@ protected function migratePermissionsFromGroupsToRoles()
'permissions' => $group->permissions ?? null
]);
}
- catch (Exception $ex) {}
+ catch (Exception $ex) {
+ }
$permissions[$group->id] = $group->permissions ?? null;
}
@@ -130,7 +131,8 @@ protected function migratePermissionsFromGroupsToRoles()
$perms = json_decode($permString, true);
$userPerms = array_merge($userPerms, $perms);
}
- catch (Exception $ex) {}
+ catch (Exception $ex) {
+ }
}
if (count($userPerms) > 0) {
@@ -157,6 +159,7 @@ protected function splicePermissionsForUser($userId, $permissions)
'permissions' => json_encode($newPerms)
]);
}
- catch (Exception $ex) {}
+ catch (Exception $ex) {
+ }
}
}
diff --git a/modules/backend/database/migrations/2018_12_16_000011_Db_Backend_Add_Deleted_At.php b/modules/backend/database/migrations/2018_12_16_000011_Db_Backend_Add_Deleted_At.php
new file mode 100644
index 0000000..6266f64
--- /dev/null
+++ b/modules/backend/database/migrations/2018_12_16_000011_Db_Backend_Add_Deleted_At.php
@@ -0,0 +1,25 @@
+timestamp('deleted_at')->nullable()->after('updated_at');
+ });
+ }
+ }
+
+ public function down()
+ {
+ if (Schema::hasColumn('backend_users', 'deleted_at')) {
+ Schema::table('backend_users', function (Blueprint $table) {
+ $table->dropColumn('deleted_at');
+ });
+ }
+ }
+}
diff --git a/modules/backend/formwidgets/CodeEditor.php b/modules/backend/formwidgets/CodeEditor.php
index e6dd6a1..9572aa6 100644
--- a/modules/backend/formwidgets/CodeEditor.php
+++ b/modules/backend/formwidgets/CodeEditor.php
@@ -215,5 +215,4 @@ protected function applyEditorPreferences()
$this->displayIndentGuides = $preferences->editor_display_indent_guides;
$this->showPrintMargin = $preferences->editor_show_print_margin;
}
-
}
diff --git a/modules/backend/formwidgets/ColorPicker.php b/modules/backend/formwidgets/ColorPicker.php
index 6c4f24e..2819658 100644
--- a/modules/backend/formwidgets/ColorPicker.php
+++ b/modules/backend/formwidgets/ColorPicker.php
@@ -43,6 +43,16 @@ class ColorPicker extends FormWidgetBase
*/
public $showAlpha = false;
+ /**
+ * @var bool If true, the color picker is set to read-only mode
+ */
+ public $readOnly = false;
+
+ /**
+ * @var bool If true, the color picker is set to disabled mode
+ */
+ public $disabled = false;
+
//
// Object properties
//
@@ -61,6 +71,8 @@ public function init()
'availableColors',
'allowEmpty',
'showAlpha',
+ 'readOnly',
+ 'disabled',
]);
}
@@ -83,6 +95,8 @@ public function prepareVars()
$this->vars['availableColors'] = $availableColors = $this->getAvailableColors();
$this->vars['allowEmpty'] = $this->allowEmpty;
$this->vars['showAlpha'] = $this->showAlpha;
+ $this->vars['readOnly'] = $this->readOnly;
+ $this->vars['disabled'] = $this->disabled;
$this->vars['isCustomColor'] = !in_array($value, $availableColors);
}
diff --git a/modules/backend/formwidgets/DataTable.php b/modules/backend/formwidgets/DataTable.php
index faf9bc0..65d18f5 100644
--- a/modules/backend/formwidgets/DataTable.php
+++ b/modules/backend/formwidgets/DataTable.php
@@ -149,8 +149,13 @@ protected function makeTableWidget()
$config = $this->makeConfig((array) $this->config);
$config->dataSource = 'client';
- $config->alias = studly_case(HtmlHelper::nameToId($this->fieldName)) . 'datatable';
- $config->fieldName = $this->fieldName;
+ if (isset($this->getParentForm()->arrayName)) {
+ $config->alias = studly_case(HtmlHelper::nameToId($this->getParentForm()->arrayName . '[' . $this->fieldName . ']')) . 'datatable';
+ $config->fieldName = $this->getParentForm()->arrayName . '[' . $this->fieldName . ']';
+ } else {
+ $config->alias = studly_case(HtmlHelper::nameToId($this->fieldName)) . 'datatable';
+ $config->fieldName = $this->fieldName;
+ }
$table = new Table($this->controller, $config);
@@ -160,25 +165,35 @@ protected function makeTableWidget()
}
/**
+ * Dropdown/autocomplete option callback handler
+ *
* Looks at the model for getXXXDataTableOptions or getDataTableOptions methods
- * to obtain values for autocomplete field types.
- * @param string $field Table field name
- * @param string $data Data for the entire table
- * @return array
+ * to obtain values for autocomplete and dropdown column types.
+ *
+ * @param string $columnName The name of the column to pass through to the callback.
+ * @param array $rowData The data provided for the current row in the datatable.
+ * @return array The options to make available to the dropdown or autocomplete, in format ["value" => "label"]
*/
- public function getDataTableOptions($field, $data)
+ public function getDataTableOptions($columnName, $rowData)
{
- $methodName = 'get'.studly_case($this->fieldName).'DataTableOptions';
+ $methodName = 'get' . studly_case($this->fieldName) . 'DataTableOptions';
if (!$this->model->methodExists($methodName) && !$this->model->methodExists('getDataTableOptions')) {
- throw new ApplicationException(Lang::get('backend::lang.model.missing_method', ['class' => get_class($this->model), 'method' => 'getDataTableOptions']));
+ throw new ApplicationException(
+ Lang::get(
+ 'backend::lang.model.missing_method',
+ [
+ 'class' => get_class($this->model),
+ 'method' => 'getDataTableOptions'
+ ]
+ )
+ );
}
if ($this->model->methodExists($methodName)) {
- $result = $this->model->$methodName($field, $data);
- }
- else {
- $result = $this->model->getDataTableOptions($this->fieldName, $field, $data);
+ $result = $this->model->$methodName($columnName, $rowData);
+ } else {
+ $result = $this->model->getDataTableOptions($this->fieldName, $columnName, $rowData);
}
if (!is_array($result)) {
@@ -187,5 +202,4 @@ public function getDataTableOptions($field, $data)
return $result;
}
-
}
diff --git a/modules/backend/formwidgets/DatePicker.php b/modules/backend/formwidgets/DatePicker.php
index 2259174..569bb62 100644
--- a/modules/backend/formwidgets/DatePicker.php
+++ b/modules/backend/formwidgets/DatePicker.php
@@ -1,5 +1,6 @@
mode = strtolower($this->mode);
if ($this->minDate !== null) {
- $this->minDate = is_integer($this->minDate)
+ $this->minDate = is_int($this->minDate)
? Carbon::createFromTimestamp($this->minDate)
: Carbon::parse($this->minDate);
}
if ($this->maxDate !== null) {
- $this->maxDate = is_integer($this->maxDate)
+ $this->maxDate = is_int($this->maxDate)
? Carbon::createFromTimestamp($this->maxDate)
: Carbon::parse($this->maxDate);
}
@@ -116,12 +117,15 @@ public function render()
*/
public function prepareVars()
{
-
if ($value = $this->getLoadValue()) {
-
$value = DateTimeHelper::makeCarbon($value, false);
-
- $value = $value instanceof Carbon ? $value->toDateTimeString() : $value;
+ if ($this->mode === 'date' && !$this->ignoreTimezone) {
+ $backendTimeZone = \Backend\Models\Preference::get('timezone');
+ $value->setTimezone($backendTimeZone);
+ $value->setTime(0, 0, 0);
+ $value->setTimezone(Config::get('app.timezone'));
+ }
+ $value = $value->toDateTimeString();
}
$this->vars['name'] = $this->getFieldName();
diff --git a/modules/backend/formwidgets/FileUpload.php b/modules/backend/formwidgets/FileUpload.php
index ad1395f..3a6cb23 100644
--- a/modules/backend/formwidgets/FileUpload.php
+++ b/modules/backend/formwidgets/FileUpload.php
@@ -1,13 +1,13 @@
maxFilesize = $this->getUploadMaxFilesize();
+
$this->fillFromConfig([
'prompt',
'imageWidth',
'imageHeight',
'fileTypes',
+ 'maxFilesize',
'mimeTypes',
'thumbOptions',
'useCaption',
@@ -105,7 +119,7 @@ public function init()
$this->previewMode = true;
}
- $this->checkUploadPostback();
+ $this->getConfigFormWidget();
}
/**
@@ -122,10 +136,18 @@ public function render()
*/
protected function prepareVars()
{
+ if ($this->formField->disabled) {
+ $this->previewMode = true;
+ }
+
if ($this->previewMode) {
$this->useCaption = false;
}
+ if ($this->maxFilesize > $this->getUploadMaxFilesize()) {
+ throw new ApplicationException('Maximum allowed size for uploaded files: ' . $this->getUploadMaxFilesize());
+ }
+
$this->vars['fileList'] = $fileList = $this->getFileList();
$this->vars['singleFile'] = $fileList->first();
$this->vars['displayMode'] = $this->getDisplayMode();
@@ -133,12 +155,51 @@ protected function prepareVars()
$this->vars['imageHeight'] = $this->imageHeight;
$this->vars['imageWidth'] = $this->imageWidth;
$this->vars['acceptedFileTypes'] = $this->getAcceptedFileTypes(true);
+ $this->vars['maxFilesize'] = $this->maxFilesize;
$this->vars['cssDimensions'] = $this->getCssDimensions();
$this->vars['cssBlockDimensions'] = $this->getCssDimensions('block');
$this->vars['useCaption'] = $this->useCaption;
$this->vars['prompt'] = $this->getPromptText();
}
+ /**
+ * Get the file record for this request, returns false if none available
+ *
+ * @return System\Models\File|false
+ */
+ protected function getFileRecord()
+ {
+ $record = false;
+
+ if (!empty(post('file_id'))) {
+ $record = $this->getRelationModel()::find(post('file_id')) ?: false;
+ }
+
+ return $record;
+ }
+
+ /**
+ * Get the instantiated config Form widget
+ *
+ * @return void
+ */
+ public function getConfigFormWidget()
+ {
+ if ($this->configFormWidget) {
+ return $this->configFormWidget;
+ }
+
+ $config = $this->makeConfig('~/modules/system/models/file/fields.yaml');
+ $config->model = $this->getFileRecord() ?: $this->getRelationModel();
+ $config->alias = $this->alias . $this->defaultAlias;
+ $config->arrayName = $this->getFieldName();
+
+ $widget = $this->makeWidget(Form::class, $config);
+ $widget->bindToController();
+
+ return $this->configFormWidget = $widget;
+ }
+
protected function getFileList()
{
$list = $this
@@ -207,7 +268,7 @@ protected function getCssDimensions($mode = null)
$cssDimensions = '';
if ($mode == 'block') {
- $cssDimensions .= ($this->imageWidth)
+ $cssDimensions .= $this->imageWidth
? 'width: '.$this->imageWidth.'px;'
: 'width: '.$this->imageHeight.'px;';
@@ -216,7 +277,7 @@ protected function getCssDimensions($mode = null)
: 'height: auto;';
}
else {
- $cssDimensions .= ($this->imageWidth)
+ $cssDimensions .= $this->imageWidth
? 'width: '.$this->imageWidth.'px;'
: 'width: auto;';
@@ -299,7 +360,7 @@ public function onSortAttachments()
public function onLoadAttachmentConfig()
{
$fileModel = $this->getRelationModel();
- if (($fileId = post('file_id')) && ($file = $fileModel::find($fileId))) {
+ if ($file = $this->getFileRecord()) {
$file = $this->decorateFileAttributes($file);
$this->vars['file'] = $file;
@@ -320,11 +381,14 @@ public function onLoadAttachmentConfig()
public function onSaveAttachmentConfig()
{
try {
- $fileModel = $this->getRelationModel();
- if (($fileId = post('file_id')) && ($file = $fileModel::find($fileId))) {
- $file->title = post('title');
- $file->description = post('description');
- $file->save();
+ $formWidget = $this->getConfigFormWidget();
+ if ($file = $formWidget->model) {
+ $modelsToSave = $this->prepareModelsToSave($file, $formWidget->getSaveData());
+ Db::transaction(function () use ($modelsToSave, $formWidget) {
+ foreach ($modelsToSave as $modelToSave) {
+ $modelToSave->save(null, $formWidget->getSessionKey());
+ }
+ });
return ['displayName' => $file->title ?: $file->file_name];
}
@@ -354,15 +418,10 @@ public function getSaveValue($value)
}
/**
- * Checks the current request to see if it is a postback containing a file upload
- * for this particular widget.
+ * Upload handler for the server-side processing of uploaded files
*/
- protected function checkUploadPostback()
+ public function onUpload()
{
- if (!($uniqueId = Request::header('X-OCTOBER-FILEUPLOAD')) || $uniqueId != $this->getId()) {
- return;
- }
-
try {
if (!Input::hasFile('file_data')) {
throw new ApplicationException('File missing from request');
@@ -407,7 +466,8 @@ protected function checkUploadPostback()
$parent = $fileRelation->getParent();
if ($this->attachOnUpload && $parent && $parent->exists) {
$fileRelation->add($file);
- } else {
+ }
+ else {
$fileRelation->add($file, $this->sessionKey);
}
@@ -419,14 +479,13 @@ protected function checkUploadPostback()
'path' => $file->pathUrl
];
- Response::json($result, 200)->send();
-
+ $response = Response::make($result, 200);
}
catch (Exception $ex) {
- Response::json($ex->getMessage(), 400)->send();
+ $response = Response::make($ex->getMessage(), 400);
}
- exit;
+ return $response;
}
/**
@@ -437,25 +496,10 @@ protected function checkUploadPostback()
*/
protected function decorateFileAttributes($file)
{
- /*
- * File is protected, create a secure public path
- */
- if (!$file->isPublic()) {
- $path = $thumb = FilesController::getDownloadUrl($file);
-
- if ($this->imageWidth || $this->imageHeight) {
- $thumb = FilesController::getThumbUrl($file, $this->imageWidth, $this->imageHeight, $this->thumbOptions);
- }
- }
- /*
- * Otherwise use public paths
- */
- else {
- $path = $thumb = $file->getPath();
+ $path = $thumb = $file->getPath();
- if ($this->imageWidth || $this->imageHeight) {
- $thumb = $file->getThumb($this->imageWidth, $this->imageHeight, $this->thumbOptions);
- }
+ if ($this->imageWidth || $this->imageHeight) {
+ $thumb = $file->getThumb($this->imageWidth, $this->imageHeight, $this->thumbOptions);
}
$file->pathUrl = $path;
@@ -463,4 +507,20 @@ protected function decorateFileAttributes($file)
return $file;
}
+
+ /**
+ * Return max upload filesize in Mb
+ * @return integer
+ */
+ protected function getUploadMaxFilesize()
+ {
+ $size = ini_get('upload_max_filesize');
+ if (preg_match('/^([\d\.]+)([KMG])$/i', $size, $match)) {
+ $pos = array_search($match[2], ['K', 'M', 'G']);
+ if ($pos !== false) {
+ $size = $match[1] * pow(1024, $pos + 1);
+ }
+ }
+ return floor($size / 1024 / 1024);
+ }
}
diff --git a/modules/backend/formwidgets/MarkdownEditor.php b/modules/backend/formwidgets/MarkdownEditor.php
index e8100f8..d6ec6ac 100644
--- a/modules/backend/formwidgets/MarkdownEditor.php
+++ b/modules/backend/formwidgets/MarkdownEditor.php
@@ -1,6 +1,8 @@
fillFromConfig([
'mode',
'safe',
+ 'readOnly',
+ 'disabled',
]);
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
public function render()
{
@@ -65,10 +79,13 @@ public function prepareVars()
$this->vars['size'] = $this->formField->size;
$this->vars['name'] = $this->getFieldName();
$this->vars['value'] = $this->getLoadValue();
+ $this->vars['readOnly'] = $this->readOnly;
+ $this->vars['disabled'] = $this->disabled;
+ $this->vars['useMediaManager'] = BackendAuth::getUser()->hasAccess('media.manage_media');
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
protected function loadAssets()
{
@@ -77,6 +94,34 @@ protected function loadAssets()
$this->addJs('/modules/backend/formwidgets/codeeditor/assets/js/build-min.js', 'core');
}
+ /**
+ * Check to see if the generated HTML should be cleaned to remove any potential XSS
+ *
+ * @return boolean
+ */
+ protected function shouldCleanHtml()
+ {
+ $user = BackendAuth::getUser();
+ return !$user || !$user->hasAccess('backend.allow_unsafe_markdown');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getSaveValue($value)
+ {
+ if ($this->shouldCleanHtml()) {
+ $value = Html::clean($value);
+ }
+
+ return $value;
+ }
+
+ /**
+ * AJAX handler to render the markdown as HTML
+ *
+ * @return array ['preview' => $generatedHTML]
+ */
public function onRefresh()
{
$value = post($this->getFieldName());
@@ -84,6 +129,10 @@ public function onRefresh()
? Markdown::parseSafe($value)
: Markdown::parse($value);
+ if ($this->shouldCleanHtml()) {
+ $previewHtml = Html::clean($previewHtml);
+ }
+
return [
'preview' => $previewHtml
];
diff --git a/modules/backend/formwidgets/MediaFinder.php b/modules/backend/formwidgets/MediaFinder.php
index 817d0af..0fb4799 100644
--- a/modules/backend/formwidgets/MediaFinder.php
+++ b/modules/backend/formwidgets/MediaFinder.php
@@ -1,9 +1,8 @@
formField->disabled) {
+ $user = BackendAuth::getUser();
+
+ if ($this->formField->disabled
+ || $this->formField->readOnly
+ || !$user
+ || !$user->hasAccess('media.manage_media')
+ ) {
$this->previewMode = true;
}
}
@@ -86,8 +91,11 @@ public function render()
public function prepareVars()
{
$value = $this->getLoadValue();
+ $isImage = $this->mode === 'image';
+
$this->vars['value'] = $value;
- $this->vars['imageUrl'] = $value ? MediaLibrary::url($value) : '';
+ $this->vars['imageUrl'] = $isImage && $value ? MediaLibrary::url($value) : '';
+ $this->vars['imageExists'] = $isImage && $value ? MediaLibrary::instance()->exists($value) : '';
$this->vars['field'] = $this->formField;
$this->vars['prompt'] = str_replace('%s', ' ', trans($this->prompt));
$this->vars['mode'] = $this->mode;
diff --git a/modules/backend/formwidgets/NestedForm.php b/modules/backend/formwidgets/NestedForm.php
new file mode 100644
index 0000000..cd3b5ce
--- /dev/null
+++ b/modules/backend/formwidgets/NestedForm.php
@@ -0,0 +1,85 @@
+fillFromConfig([
+ 'form',
+ 'usePanelStyles',
+ ]);
+
+ if ($this->formField->disabled) {
+ $this->previewMode = true;
+ }
+
+ $config = $this->makeConfig($this->form);
+ $config->model = $this->model;
+ $config->data = $this->getLoadValue();
+ $config->alias = $this->alias . $this->defaultAlias;
+ $config->arrayName = $this->getFieldName();
+ $config->isNested = true;
+
+ if (object_get($this->getParentForm()->config, 'enableDefaults') === true) {
+ $config->enableDefaults = true;
+ }
+
+ $widget = $this->makeWidget(Form::class, $config);
+ $widget->previewMode = $this->previewMode;
+ $widget->bindToController();
+
+ $this->formWidget = $widget;
+ }
+
+ protected function loadAssets()
+ {
+ $this->addCss('css/nestedform.css', 'core');
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function render()
+ {
+ $this->prepareVars();
+ return $this->makePartial('nestedform');
+ }
+
+ public function prepareVars()
+ {
+ $this->formWidget->previewMode = $this->previewMode;
+ }
+}
diff --git a/modules/backend/formwidgets/PermissionEditor.php b/modules/backend/formwidgets/PermissionEditor.php
index 014e523..be7c81a 100644
--- a/modules/backend/formwidgets/PermissionEditor.php
+++ b/modules/backend/formwidgets/PermissionEditor.php
@@ -7,6 +7,26 @@
* User/group permission editor
* This widget is used by the system internally on the System / Administrators pages.
*
+ * Available Modes:
+ * - radio: Default mode, used by user-level permissions.
+ * Provides three-state control over each available permission. States are
+ * -1: Explicitly deny the permission
+ * 0: Inherit the permission's value from a parent source (User inherits from Role)
+ * 1: Explicitly grant the permission
+ * - checkbox: Used to define permissions for roles. Intended to define a base of what permissions are available
+ * Provides two state control over each available permission. States are
+ * 1: Explicitly allow the permission
+ * null: If the checkbox is not ticked, the permission will not be sent to the server and will not be stored.
+ * This is interpreted as the permission not being present and thus not allowed
+ * - switch: Used to define overriding permissions in a simpler UX than the radio.
+ * Provides two state control over each available permission. States are
+ * 1: Explicitly allow the permission
+ * -1: Explicitly deny the permission
+ *
+ * Available permissions can be defined in the form of an array of permission codes to allow:
+ * NOTE: Users are still not allowed to modify permissions that they themselves do not have access to
+ * availablePermissions: ['some.author.permission', 'some.other.permission', 'etc.some.system.permission']
+ *
* @package october\backend
* @author Alexey Bobkov, Samuel Georges
*/
@@ -14,7 +34,15 @@ class PermissionEditor extends FormWidgetBase
{
protected $user;
- public $mode;
+ /**
+ * @var string Mode to display the permission editor with. Available options: radio, checkbox, switch
+ */
+ public $mode = 'radio';
+
+ /**
+ * @var array Permission codes to allow to be interacted with through this widget
+ */
+ public $availablePermissions;
/**
* @inheritDoc
@@ -22,7 +50,8 @@ class PermissionEditor extends FormWidgetBase
public function init()
{
$this->fillFromConfig([
- 'mode'
+ 'mode',
+ 'availablePermissions',
]);
$this->user = BackendAuth::getUser();
@@ -51,7 +80,7 @@ public function prepareVars()
$permissionsData = [];
}
- $this->vars['checkboxMode'] = $this->getControlMode() === 'checkbox';
+ $this->vars['mode'] = $this->mode;
$this->vars['permissions'] = $this->getFilteredPermissions();
$this->vars['baseFieldName'] = $this->getFieldName();
$this->vars['permissionsData'] = $permissionsData;
@@ -79,11 +108,6 @@ protected function loadAssets()
$this->addJs('js/permissioneditor.js', 'core');
}
- protected function getControlMode()
- {
- return strlen($this->mode) ? $this->mode : 'radio';
- }
-
/**
* Returns a safely parsed set of permissions, ensuring the user cannot elevate
* their own permissions or permissions of another user above their own.
@@ -117,19 +141,19 @@ protected function getSaveValueSecure($value)
/**
* Returns the available permissions; removing those that the logged-in user does not have access to
*
- * @return array The permissions that the logged-in user does have access to
+ * @return array The permissions that the logged-in user does have access to ['permission-tab' => $arrayOfAllowedPermissionObjects]
*/
protected function getFilteredPermissions()
{
$permissions = BackendAuth::listTabbedPermissions();
- if ($this->user->isSuperUser()) {
- return $permissions;
- }
-
foreach ($permissions as $tab => $permissionsArray) {
foreach ($permissionsArray as $index => $permission) {
- if (!$this->user->hasAccess($permission->code)) {
+ if (!$this->user->hasAccess($permission->code) ||
+ (
+ is_array($this->availablePermissions) &&
+ !in_array($permission->code, $this->availablePermissions)
+ )) {
unset($permissionsArray[$index]);
}
}
diff --git a/modules/backend/formwidgets/RecordFinder.php b/modules/backend/formwidgets/RecordFinder.php
index 232010b..b02e3ab 100644
--- a/modules/backend/formwidgets/RecordFinder.php
+++ b/modules/backend/formwidgets/RecordFinder.php
@@ -12,10 +12,18 @@
* label: User
* type: recordfinder
* list: ~/plugins/rainlab/user/models/user/columns.yaml
+ * recordsPerPage: 10
* title: Find Record
* prompt: Click the Find button to find a user
+ * keyFrom: id
* nameFrom: name
* descriptionFrom: email
+ * conditions: email = "bob@example.com"
+ * scope: whereActive
+ * searchMode: all
+ * searchScope: searchUsers
+ * useRelation: false
+ * modelClass: RainLab\User\Models\User
*
* @package october\backend
* @author Alexey Bobkov, Samuel Georges
@@ -36,7 +44,7 @@ class RecordFinder extends FormWidgetBase
/**
* @var string Relation column to display for the name
*/
- public $nameFrom;
+ public $nameFrom = 'name';
/**
* @var string Relation column to display for the description
@@ -81,6 +89,16 @@ class RecordFinder extends FormWidgetBase
*/
public $searchScope;
+ /**
+ * @var boolean Flag for using the name of the field as a relation name to interact with directly on the parent model. Default: true. Disable to return just the selected model's ID
+ */
+ public $useRelation = true;
+
+ /**
+ * @var string Class of the model to use for listing records when useRelation = false
+ */
+ public $modelClass;
+
//
// Object properties
//
@@ -121,8 +139,14 @@ public function init()
'searchMode',
'searchScope',
'recordsPerPage',
+ 'useRelation',
+ 'modelClass',
]);
+ if (!$this->useRelation && !class_exists($this->modelClass)) {
+ throw new ApplicationException(Lang::get('backend::lang.recordfinder.invalid_model_class', ['modelClass' => $this->modelClass]));
+ }
+
if (post('recordfinder_flag')) {
$this->listWidget = $this->makeListWidget();
$this->listWidget->bindToController();
@@ -153,8 +177,13 @@ public function render()
public function onRefresh()
{
- list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom);
- $model->{$attribute} = post($this->getFieldName());
+ $value = post($this->getFieldName());
+ if ($this->useRelation) {
+ list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom);
+ $model->{$attribute} = $value;
+ } else {
+ $this->formField->value = $value;
+ }
$this->prepareVars();
return ['#'.$this->getId('container') => $this->makePartial('recordfinder')];
@@ -162,8 +191,12 @@ public function onRefresh()
public function onClearRecord()
{
- list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom);
- $model->{$attribute} = null;
+ if ($this->useRelation) {
+ list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom);
+ $model->{$attribute} = null;
+ } else {
+ $this->formField->value = null;
+ }
$this->prepareVars();
return ['#'.$this->getId('container') => $this->makePartial('recordfinder')];
@@ -211,13 +244,18 @@ public function getSaveValue($value)
*/
public function getLoadValue()
{
- list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom);
-
- if (!is_null($model)) {
- return $model->{$attribute};
+ $value = null;
+
+ if ($this->useRelation) {
+ list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom);
+ if ($model !== null) {
+ $value = $model->{$attribute};
+ }
+ } else {
+ $value = $this->modelClass::where($this->keyFrom, parent::getLoadValue())->first();
}
- return null;
+ return $value;
}
public function getKeyValue()
@@ -226,7 +264,9 @@ public function getKeyValue()
return null;
}
- return $this->relationModel->{$this->keyFrom};
+ return $this->useRelation ?
+ $this->relationModel->{$this->keyFrom} :
+ $this->formField->value;
}
public function getNameValue()
@@ -265,7 +305,13 @@ public function onFindRecord()
protected function makeListWidget()
{
$config = $this->makeConfig($this->getConfig('list'));
- $config->model = $this->getRelationModel();
+
+ if ($this->useRelation) {
+ $config->model = $this->getRelationModel();
+ } else {
+ $config->model = new $this->modelClass;
+ }
+
$config->alias = $this->alias . 'List';
$config->showSetup = false;
$config->showCheckboxes = false;
@@ -289,9 +335,11 @@ protected function makeListWidget()
});
}
else {
- $widget->bindEvent('list.extendQueryBefore', function ($query) {
- $this->getRelationObject()->addDefinedConstraintsToQuery($query);
- });
+ if ($this->useRelation) {
+ $widget->bindEvent('list.extendQueryBefore', function ($query) {
+ $this->getRelationObject()->addDefinedConstraintsToQuery($query);
+ });
+ }
}
return $widget;
diff --git a/modules/backend/formwidgets/Relation.php b/modules/backend/formwidgets/Relation.php
index 27f8259..c80be47 100644
--- a/modules/backend/formwidgets/Relation.php
+++ b/modules/backend/formwidgets/Relation.php
@@ -1,12 +1,9 @@
config->select)) {
@@ -112,20 +115,26 @@ protected function makeRenderFormField()
$field->type = 'dropdown';
}
+ // Order query by the configured option.
+ if ($this->order) {
+ // Using "raw" to allow authors to use a string to define the order clause.
+ $query->orderByRaw($this->order);
+ }
+
// It is safe to assume that if the model and related model are of
// the exact same class, then it cannot be related to itself
if ($model->exists && (get_class($model) == get_class($relationModel))) {
$query->where($relationModel->getKeyName(), '<>', $model->getKey());
}
- if ($scopeMethod = $this->scope) {
- $query->$scopeMethod($model);
- }
-
// Even though "no constraints" is applied, belongsToMany constrains the query
// by joining its pivot table. Remove all joins from the query.
$query->getQuery()->getQuery()->joins = [];
+ if ($scopeMethod = $this->scope) {
+ $query->$scopeMethod($model);
+ }
+
// Determine if the model uses a tree trait
$treeTraits = ['October\Rain\Database\Traits\NestedTree', 'October\Rain\Database\Traits\SimpleTree'];
$usesTree = count(array_intersect($treeTraits, class_uses($relationModel))) > 0;
diff --git a/modules/backend/formwidgets/Repeater.php b/modules/backend/formwidgets/Repeater.php
index 15786a8..95ac67c 100644
--- a/modules/backend/formwidgets/Repeater.php
+++ b/modules/backend/formwidgets/Repeater.php
@@ -2,7 +2,6 @@
use Lang;
use ApplicationException;
-use Backend\Classes\FormField;
use Backend\Classes\FormWidgetBase;
/**
@@ -10,9 +9,6 @@
*/
class Repeater extends FormWidgetBase
{
- const INDEX_PREFIX = '___index_';
- const GROUP_PREFIX = '___group_';
-
//
// Configurable properties
//
@@ -25,7 +21,7 @@ class Repeater extends FormWidgetBase
/**
* @var string Prompt text for adding new items.
*/
- public $prompt = 'Add new item';
+ public $prompt;
/**
* @var bool Items can be sorted.
@@ -40,12 +36,21 @@ class Repeater extends FormWidgetBase
/**
* @var int Minimum items required. Pre-displays those items when not using groups
*/
- public $minItems = null;
+ public $minItems;
/**
* @var int Maximum items permitted
*/
- public $maxItems = null;
+ public $maxItems;
+
+ /**
+ * @var string The style of the repeater. Can be one of three values:
+ * - "default": Shows all repeater items expanded on load.
+ * - "collapsed": Shows all repeater items collapsed on load.
+ * - "accordion": Shows only the first repeater item expanded on load. When another item is clicked, all other open
+ * items are collapsed.
+ */
+ public $style;
//
// Object properties
@@ -56,16 +61,6 @@ class Repeater extends FormWidgetBase
*/
protected $defaultAlias = 'repeater';
- /**
- * @var string Form field name for capturing an index.
- */
- protected $indexInputName;
-
- /**
- * @var int Count of repeated items.
- */
- protected $indexCount = 0;
-
/**
* @var array Meta data associated to each field, organised by index
*/
@@ -81,22 +76,41 @@ class Repeater extends FormWidgetBase
*/
protected static $onAddItemCalled = false;
- protected $useGroups = false;
+ /**
+ * Determines if a child repeater has made an AJAX request to add an item
+ *
+ * @var bool
+ */
+ protected $childAddItemCalled = false;
/**
- * @var string Form field name for capturing an index.
+ * Determines which child index has made the AJAX request to add an item
+ *
+ * @var int
*/
- protected $groupInputName;
+ protected $childIndexCalled;
+
+ protected $useGroups = false;
protected $groupDefinitions = [];
+ /**
+ * Determines if repeater has been initialised previously
+ *
+ * @var boolean
+ */
+ protected $loaded = false;
+
/**
* @inheritDoc
*/
public function init()
{
+ $this->prompt = Lang::get('backend::lang.repeater.add_new_item');
+
$this->fillFromConfig([
'form',
+ 'style',
'prompt',
'sortable',
'titleFrom',
@@ -108,14 +122,16 @@ public function init()
$this->previewMode = true;
}
- $fieldName = $this->formField->getName(false);
- $this->indexInputName = self::INDEX_PREFIX.$fieldName;
- $this->groupInputName = self::GROUP_PREFIX.$fieldName;
+ // Check for loaded flag in POST
+ if ((bool) post($this->alias . '_loaded') === true) {
+ $this->loaded = true;
+ }
+ $this->checkAddItemRequest();
$this->processGroupMode();
if (!self::$onAddItemCalled) {
- $this->processExistingItems();
+ $this->processItems();
}
}
@@ -136,7 +152,7 @@ public function prepareVars()
// Refresh the loaded data to support being modified by filterFields
// @see https://github.com/octobercms/october/issues/2613
if (!self::$onAddItemCalled) {
- $this->processExistingItems();
+ $this->processItems();
}
if ($this->previewMode) {
@@ -145,14 +161,12 @@ public function prepareVars()
}
}
- $this->vars['indexInputName'] = $this->indexInputName;
- $this->vars['groupInputName'] = $this->groupInputName;
-
$this->vars['prompt'] = $this->prompt;
$this->vars['formWidgets'] = $this->formWidgets;
$this->vars['titleFrom'] = $this->titleFrom;
$this->vars['minItems'] = $this->minItems;
$this->vars['maxItems'] = $this->maxItems;
+ $this->vars['style'] = $this->style;
$this->vars['useGroups'] = $this->useGroups;
$this->vars['groupDefinitions'] = $this->groupDefinitions;
@@ -186,12 +200,6 @@ protected function processSaveValue($value)
return $value;
}
- if ($this->useGroups) {
- foreach ($value as $index => &$data) {
- $data['_group'] = $this->getGroupCodeFromIndex($index);
- }
- }
-
if ($this->minItems && count($value) < $this->minItems) {
throw new ApplicationException(Lang::get('backend::lang.repeater.min_items_failed', ['name' => $this->fieldName, 'min' => $this->minItems, 'items' => count($value)]));
}
@@ -199,56 +207,79 @@ protected function processSaveValue($value)
throw new ApplicationException(Lang::get('backend::lang.repeater.max_items_failed', ['name' => $this->fieldName, 'max' => $this->maxItems, 'items' => count($value)]));
}
+ /*
+ * Give repeated form field widgets an opportunity to process the data.
+ */
+ foreach ($value as $index => $data) {
+ if (isset($this->formWidgets[$index])) {
+ if ($this->useGroups) {
+ $value[$index] = array_merge($this->formWidgets[$index]->getSaveData(), ['_group' => $data['_group']]);
+ } else {
+ $value[$index] = $this->formWidgets[$index]->getSaveData();
+ }
+ }
+ }
+
return array_values($value);
}
/**
- * Processes existing form data and applies it to the form widgets.
+ * Processes form data and applies it to the form widgets.
* @return void
*/
- protected function processExistingItems()
+ protected function processItems()
{
- $loadedIndexes = $loadedGroups = [];
- $loadValue = $this->getLoadValue();
+ $currentValue = ($this->loaded === true)
+ ? post($this->formField->getName())
+ : $this->getLoadValue();
+
+ // Detect when a child widget is trying to run an AJAX handler
+ // outside of the form element that contains all the repeater
+ // fields that would normally be used to identify that case
+ $handler = $this->controller->getAjaxHandler();
+ if (!$this->loaded && starts_with($handler, $this->alias . 'Form')) {
+ // Attempt to get the index of the repeater
+ $handler = str_after($handler, $this->alias . 'Form');
+ preg_match("~^(\d+)~", $handler, $matches);
+
+ if (isset($matches[1])) {
+ $index = $matches[1];
+ $this->makeItemFormWidget($index);
+ }
+ }
+
+ if (!$this->childAddItemCalled && $currentValue === null) {
+ $this->formWidgets = [];
+ return;
+ }
+
+ if ($this->childAddItemCalled && !isset($currentValue[$this->childIndexCalled])) {
+ // If no value is available but a child repeater has added an item, add a "stub" repeater item
+ $this->makeItemFormWidget($this->childIndexCalled);
+ }
// Ensure that the minimum number of items are preinitialized
// ONLY DONE WHEN NOT IN GROUP MODE
if (!$this->useGroups && $this->minItems > 0) {
- if (!is_array($loadValue)) {
- $loadValue = [];
+ if (!is_array($currentValue)) {
+ $currentValue = [];
for ($i = 0; $i < $this->minItems; $i++) {
- $loadValue[$i] = [];
+ $currentValue[$i] = [];
}
- } elseif (count($loadValue) < $this->minItems) {
- for ($i = 0; $i < ($this->minItems - count($loadValue)); $i++) {
- $loadValue[] = [];
+ } elseif (count($currentValue) < $this->minItems) {
+ for ($i = 0; $i < ($this->minItems - count($currentValue)); $i++) {
+ $currentValue[] = [];
}
}
}
- if (is_array($loadValue)) {
- foreach ($loadValue as $index => $loadedValue) {
- $loadedIndexes[] = $index;
- $loadedGroups[] = array_get($loadedValue, '_group');
- }
- }
-
- $itemIndexes = post($this->indexInputName, $loadedIndexes);
- $itemGroups = post($this->groupInputName, $loadedGroups);
-
- if (!count($itemIndexes)) {
+ if (!is_array($currentValue)) {
return;
}
- $items = array_combine(
- (array) $itemIndexes,
- (array) ($this->useGroups ? $itemGroups : $itemIndexes)
- );
-
- foreach ($items as $itemIndex => $groupCode) {
- $this->makeItemFormWidget($itemIndex, $groupCode);
- $this->indexCount = max((int) $itemIndex, $this->indexCount);
- }
+ collect($currentValue)->each(function ($value, $index) {
+ $this->makeItemFormWidget($index, array_get($value, '_group', null));
+ });
}
/**
@@ -265,12 +296,16 @@ protected function makeItemFormWidget($index = 0, $groupCode = null)
$config = $this->makeConfig($configDefinition);
$config->model = $this->model;
- $config->data = $this->getLoadValueFromIndex($index);
- $config->alias = $this->alias . 'Form'.$index;
+ $config->data = $this->getValueFromIndex($index);
+ $config->alias = $this->alias . 'Form' . $index;
$config->arrayName = $this->getFieldName().'['.$index.']';
$config->isNested = true;
+ if (self::$onAddItemCalled || $this->minItems > 0) {
+ $config->enableDefaults = true;
+ }
$widget = $this->makeWidget('Backend\Widgets\Form', $config);
+ $widget->previewMode = $this->previewMode;
$widget->bindToController();
$this->indexMeta[$index] = [
@@ -281,17 +316,20 @@ protected function makeItemFormWidget($index = 0, $groupCode = null)
}
/**
- * Returns the load data at a given index.
+ * Returns the data at a given index.
* @param int $index
*/
- protected function getLoadValueFromIndex($index)
+ protected function getValueFromIndex($index)
{
- $loadValue = $this->getLoadValue();
- if (!is_array($loadValue)) {
- $loadValue = [];
+ $value = ($this->loaded === true)
+ ? post($this->formField->getName())
+ : $this->getLoadValue();
+
+ if (!is_array($value)) {
+ $value = [];
}
- return array_get($loadValue, $index, []);
+ return array_get($value, $index, []);
}
//
@@ -300,18 +338,19 @@ protected function getLoadValueFromIndex($index)
public function onAddItem()
{
- self::$onAddItemCalled = true;
-
- $this->indexCount++;
-
$groupCode = post('_repeater_group');
+ $index = $this->getNextIndex();
+
$this->prepareVars();
- $this->vars['widget'] = $this->makeItemFormWidget($this->indexCount, $groupCode);
- $this->vars['indexValue'] = $this->indexCount;
+ $this->vars['widget'] = $this->makeItemFormWidget($index, $groupCode);
+ $this->vars['indexValue'] = $index;
+
+ $itemContainer = '@#' . $this->getId('items');
- $itemContainer = '@#'.$this->getId('items');
- return [$itemContainer => $this->makePartial('repeater_item')];
+ return [
+ $itemContainer => $this->makePartial('repeater_item')
+ ];
}
public function onRemoveItem()
@@ -329,6 +368,65 @@ public function onRefresh()
return $widget->onRefresh();
}
+ /**
+ * Determines the next available index number for assigning to a new repeater item.
+ *
+ * @return int
+ */
+ protected function getNextIndex()
+ {
+ if ($this->loaded === true) {
+ $data = post($this->formField->getName());
+
+ if (is_array($data) && count($data)) {
+ return (max(array_keys($data)) + 1);
+ }
+ } else {
+ $data = $this->getLoadValue();
+
+ if (is_array($data)) {
+ return count($data);
+ }
+ }
+
+ return 0;
+ }
+
+ /**
+ * Determines the repeater that has triggered an AJAX request to add an item.
+ *
+ * @return void
+ */
+ protected function checkAddItemRequest()
+ {
+ $handler = $this->getParentForm()
+ ->getController()
+ ->getAjaxHandler();
+
+ if ($handler === null || strpos($handler, '::') === false) {
+ return;
+ }
+
+ list($widgetName, $handlerName) = explode('::', $handler);
+ if ($handlerName !== 'onAddItem') {
+ return;
+ }
+
+ if ($this->alias === $widgetName) {
+ // This repeater has made the AJAX request
+ self::$onAddItemCalled = true;
+ } else if (strpos($widgetName, $this->alias . 'Form') === 0) {
+ // A child repeater has made the AJAX request
+
+ // Get index from AJAX handler
+ $handlerSuffix = str_replace($this->alias . 'Form', '', $widgetName);
+ if (preg_match('/^[0-9]+/', $handlerSuffix, $matches)) {
+ $this->childAddItemCalled = true;
+ $this->childIndexCalled = (int) $matches[0];
+ }
+ }
+ }
+
//
// Group mode
//
@@ -350,7 +448,7 @@ protected function getGroupFormFieldConfig($code)
return null;
}
- return ['fields' => $fields];
+ return ['fields' => $fields, 'enableDefaults' => object_get($this->config, 'enableDefaults')];
}
/**
diff --git a/modules/backend/formwidgets/RichEditor.php b/modules/backend/formwidgets/RichEditor.php
index 48f5481..0949ced 100644
--- a/modules/backend/formwidgets/RichEditor.php
+++ b/modules/backend/formwidgets/RichEditor.php
@@ -2,11 +2,14 @@
use App;
use File;
-use Event;
use Lang;
+use Event;
+use Config;
use Request;
-use Backend\Classes\FormWidgetBase;
+use Backend;
+use BackendAuth;
use Backend\Models\EditorSetting;
+use Backend\Classes\FormWidgetBase;
/**
* Rich Editor
@@ -17,6 +20,8 @@
*/
class RichEditor extends FormWidgetBase
{
+ use \Backend\Traits\UploadableWidget;
+
//
// Configurable properties
//
@@ -29,13 +34,18 @@ class RichEditor extends FormWidgetBase
/**
* @var boolean Determines whether content has HEAD and HTML tags.
*/
- public $toolbarButtons = null;
+ public $toolbarButtons;
/**
* @var boolean If true, the editor is set to read-only mode
*/
public $readOnly = false;
+ /**
+ * @var string|null Path in the Media Library where uploaded files should be stored. If null it will be pulled from Request::input('path');
+ */
+ public $uploadPath = '/uploaded-files';
+
//
// Object properties
//
@@ -84,6 +94,7 @@ public function prepareVars()
$this->vars['name'] = $this->getFieldName();
$this->vars['value'] = $this->getLoadValue();
$this->vars['toolbarButtons'] = $this->evalToolbarButtons();
+ $this->vars['useMediaManager'] = BackendAuth::getUser()->hasAccess('media.manage_media');
$this->vars['globalToolbarButtons'] = EditorSetting::getConfigured('html_toolbar_buttons');
$this->vars['allowEmptyTags'] = EditorSetting::getConfigured('html_allow_empty_tags');
@@ -95,6 +106,7 @@ public function prepareVars()
$this->vars['imageStyles'] = EditorSetting::getConfiguredStyles('html_style_image');
$this->vars['linkStyles'] = EditorSetting::getConfiguredStyles('html_style_link');
$this->vars['paragraphStyles'] = EditorSetting::getConfiguredStyles('html_style_paragraph');
+ $this->vars['paragraphFormats'] = EditorSetting::getConfiguredFormats('html_paragraph_formats');
$this->vars['tableStyles'] = EditorSetting::getConfiguredStyles('html_style_table');
$this->vars['tableCellStyles'] = EditorSetting::getConfiguredStyles('html_style_table_cell');
}
@@ -129,6 +141,16 @@ protected function loadAssets()
{
$this->addCss('css/richeditor.css', 'core');
$this->addJs('js/build-min.js', 'core');
+
+ if (Config::get('develop.decompileBackendAssets', false)) {
+ $scripts = Backend::decompileAsset($this->getAssetPath('js/build-plugins.js'));
+ foreach ($scripts as $script) {
+ $this->addJs($script, 'core');
+ }
+ } else {
+ $this->addJs('js/build-plugins-min.js', 'core');
+ }
+
$this->addJs('/modules/backend/formwidgets/codeeditor/assets/js/build-min.js', 'core');
if ($lang = $this->getValidEditorLang()) {
@@ -214,8 +236,8 @@ protected function getPageLinksArray()
$iterator = function ($links, $level = 0) use (&$iterator) {
$result = [];
- foreach ($links as $linkUrl => $link) {
+ foreach ($links as $linkUrl => $link) {
/*
* Remove scheme and host from URL
*/
@@ -224,6 +246,13 @@ protected function getPageLinksArray()
$linkUrl = substr($linkUrl, strlen($baseUrl));
}
+ /*
+ * Root page fallback.
+ */
+ if (strlen($linkUrl) === 0) {
+ $linkUrl = '/';
+ }
+
$linkName = str_repeat(' ', $level * 4);
$linkName .= is_array($link) ? array_get($link, 'title', '') : $link;
$result[] = ['name' => $linkName, 'url' => $linkUrl];
diff --git a/modules/backend/formwidgets/TagList.php b/modules/backend/formwidgets/TagList.php
index 0ec1d41..2e2b5c0 100644
--- a/modules/backend/formwidgets/TagList.php
+++ b/modules/backend/formwidgets/TagList.php
@@ -1,6 +1,7 @@
vars['placeholder'] = $this->placeholder;
$this->vars['useKey'] = $this->useKey;
$this->vars['field'] = $this->formField;
$this->vars['fieldOptions'] = $this->getFieldOptions();
@@ -129,7 +137,9 @@ protected function hydrateRelationSaveValue($names)
$newTags = $this->customTags ? array_diff($names, $existingTags) : [];
foreach ($newTags as $newTag) {
- $newModel = $relationModel::create([$this->nameFrom => $newTag]);
+ $newModel = new $relationModel;
+ $newModel->{$this->nameFrom} = $newTag;
+ $newModel->save();
$existingTags[$newModel->getKey()] = $newTag;
}
@@ -161,7 +171,15 @@ public function getFieldOptions()
$options = $this->formField->options();
if (!$options && $this->mode === static::MODE_RELATION) {
- $options = $this->getRelationModel()->lists($this->nameFrom);
+ $options = RelationBase::noConstraints(function () {
+ $query = $this->getRelationObject()->newQuery();
+
+ // Even though "no constraints" is applied, belongsToMany constrains the query
+ // by joining its pivot table. Remove all joins from the query.
+ $query->getQuery()->getQuery()->joins = [];
+
+ return $query->lists($this->nameFrom);
+ });
}
return $options;
@@ -191,9 +209,10 @@ protected function getCustomSeparators()
protected function getSeparatorCharacter()
{
switch (strtolower($this->separator)) {
- case 'comma': return ',';
- case 'space': return ' ';
+ case 'comma':
+ return ',';
+ case 'space':
+ return ' ';
}
}
-
}
diff --git a/modules/backend/formwidgets/codeeditor/assets/css/codeeditor.css b/modules/backend/formwidgets/codeeditor/assets/css/codeeditor.css
index b4c3859..097f073 100644
--- a/modules/backend/formwidgets/codeeditor/assets/css/codeeditor.css
+++ b/modules/backend/formwidgets/codeeditor/assets/css/codeeditor.css
@@ -1,23 +1,27 @@
-.field-codeeditor{width:100%;position:relative;border:2px solid #d1d6d9;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
-.field-codeeditor textarea{opacity:0;filter:alpha(opacity=0)}
-.field-codeeditor.editor-focus{border:2px solid #d1d6d9}
-.field-codeeditor.size-tiny{min-height:50px}
-.field-codeeditor.size-small{min-height:100px}
-.field-codeeditor.size-large{min-height:200px}
-.field-codeeditor.size-huge{min-height:250px}
-.field-codeeditor.size-giant{min-height:350px}
-.field-codeeditor .ace_search{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:14px;color:#333333;z-index:13}
-.field-codeeditor .editor-code{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
-.field-codeeditor .editor-toolbar{position:absolute;top:10px;right:25px;z-index:10}
-.field-codeeditor .editor-toolbar > ul,.field-codeeditor .editor-toolbar ul > li{list-style-type:none;padding:0;margin:0}
-.field-codeeditor .editor-toolbar > ul > li{float:left}
-.field-codeeditor .editor-toolbar > ul > li .tooltip.left{margin-right:25px}
-.field-codeeditor .editor-toolbar > ul > li > a{display:block;height:25px;width:25px;color:#666;font-size:20px;text-align:center;text-decoration:none}
-.field-codeeditor .editor-toolbar > ul > li > a > abbr{position:absolute;font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}
-.field-codeeditor .editor-toolbar > ul > li > a > i{opacity:0.7;filter:alpha(opacity=70);display:block}
-.field-codeeditor .editor-toolbar > ul > li > a > i:before{font-size:15px}
-.field-codeeditor .editor-toolbar > ul > li > a:hover > i,.field-codeeditor .editor-toolbar > ul > li > a:focus > i{opacity:1;filter:alpha(opacity=100)}
-.field-codeeditor.editor-fullscreen{z-index:301;position:fixed !important;top:0;left:0;height:100%;border-width:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
-.field-codeeditor.editor-fullscreen .editor-code{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
-.field-codeeditor.editor-fullscreen .editor-toolbar{z-index:302}
-.field-codeeditor.editor-fullscreen .ace_search{z-index:303}
\ No newline at end of file
+.field-codeeditor {width:100%;position:relative;border:2px solid #d1d6d9;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
+.field-codeeditor textarea {opacity:0;filter:alpha(opacity=0)}
+.field-codeeditor.editor-focus {border:2px solid #d1d6d9}
+.field-codeeditor.size-tiny {min-height:50px}
+.field-codeeditor.size-small {min-height:100px}
+.field-codeeditor.size-large {min-height:200px}
+.field-codeeditor.size-huge {min-height:250px}
+.field-codeeditor.size-giant {min-height:350px}
+.field-codeeditor .ace_search {font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:14px;color:#333;z-index:13}
+.field-codeeditor .ace_search .ace_search_form.ace_nomatch {outline:none !important}
+.field-codeeditor .ace_search .ace_search_form.ace_nomatch .ace_search_field {border:.0625rem solid red;-webkit-box-shadow:0 0 .1875rem .125rem red;box-shadow:0 0 .1875rem .125rem red;z-index:1;position:relative}
+.field-codeeditor .editor-code {-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
+.field-codeeditor .editor-toolbar {position:absolute;padding:0 5px;bottom:10px;right:25px;z-index:10;background:rgba(0,0,0,0.8);border-radius:5px}
+.field-codeeditor .editor-toolbar >ul,
+.field-codeeditor .editor-toolbar ul >li {list-style-type:none;padding:0;margin:0}
+.field-codeeditor .editor-toolbar >ul >li {float:left}
+.field-codeeditor .editor-toolbar >ul >li .tooltip.left {margin-right:25px}
+.field-codeeditor .editor-toolbar >ul >li >a {display:block;height:25px;width:25px;color:#666;font-size:20px;text-align:center;text-decoration:none;text-shadow:0 0 5px #000}
+.field-codeeditor .editor-toolbar >ul >li >a >abbr {position:absolute;font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}
+.field-codeeditor .editor-toolbar >ul >li >a >i {opacity:1;filter:alpha(opacity=100);display:block}
+.field-codeeditor .editor-toolbar >ul >li >a >i:before {font-size:15px}
+.field-codeeditor .editor-toolbar >ul >li >a:hover >i,
+.field-codeeditor .editor-toolbar >ul >li >a:focus >i {opacity:1;filter:alpha(opacity=100);color:#fff}
+.field-codeeditor.editor-fullscreen {z-index:301;position:fixed !important;top:0;left:0;height:100%;border-width:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
+.field-codeeditor.editor-fullscreen .editor-toolbar {z-index:302}
+.field-codeeditor.editor-fullscreen .editor-code {-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
+.field-codeeditor.editor-fullscreen .ace_search {z-index:303}
\ No newline at end of file
diff --git a/modules/backend/formwidgets/codeeditor/assets/js/build-min.js b/modules/backend/formwidgets/codeeditor/assets/js/build-min.js
index 69a59b7..d651f97 100644
--- a/modules/backend/formwidgets/codeeditor/assets/js/build-min.js
+++ b/modules/backend/formwidgets/codeeditor/assets/js/build-min.js
@@ -4586,7 +4586,7 @@ ace.require('ace/config').set('basePath',this.options.vendorPath)
editor.setOptions({enableEmmet:options.enableEmmet,enableBasicAutocompletion:options.autocompletion==='basic',enableSnippets:options.enableSnippets,enableLiveAutocompletion:options.autocompletion==='live'})
editor.renderer.setScrollMargin(options.margin,options.margin,0,0)
editor.renderer.setPadding(options.margin)
-this.$toolbar.find('>ul>li>a').each(function(){var abbr=$(this).find('>abbr'),label=abbr.text(),help=abbr.attr('title'),title=label+' ('+help+' )';$(this).attr('title',title)}).tooltip({delay:500,placement:'bottom',html:true});this.$fullscreenDisable.hide()
+this.$toolbar.find('>ul>li>a').each(function(){var abbr=$(this).find('>abbr'),label=abbr.text(),help=abbr.attr('title'),title=label+' ('+help+' )';$(this).attr('title',title)}).tooltip({delay:500,placement:'top',html:true});this.$fullscreenDisable.hide()
this.$fullscreenEnable.on('click.codeeditor','>a',$.proxy(this.toggleFullscreen,this))
this.$fullscreenDisable.on('click.codeeditor','>a',$.proxy(this.toggleFullscreen,this))
this.$searchboxDisable.hide()
@@ -4595,7 +4595,7 @@ this.$searchboxDisable.on('click.codeeditor','>a',$.proxy(this.toggleSearchbox,t
this.$replaceboxDisable.hide()
this.$replaceboxEnable.on('click.codeeditor','>a',$.proxy(this.toggleReplacebox,this))
this.$replaceboxDisable.on('click.codeeditor','>a',$.proxy(this.toggleReplacebox,this))
-this.$el.hotKey({hotkey:'esc',hotkeyMac:'esc',callback:this.proxy(this.onEscape)})
+this.$el.hotKey({hotkey:'esc',callback:this.proxy(this.onEscape)})
editor.commands.addCommand({name:'toggleFullscreen',bindKey:{win:'Ctrl+Shift+F',mac:'Ctrl+Shift+F'},exec:$.proxy(this.toggleFullscreen,this),readOnly:true})}
CodeEditor.prototype.dispose=function(){if(this.$el===null)
return
diff --git a/modules/backend/formwidgets/codeeditor/assets/js/codeeditor.js b/modules/backend/formwidgets/codeeditor/assets/js/codeeditor.js
index 62c8e1c..2d0ade8 100644
--- a/modules/backend/formwidgets/codeeditor/assets/js/codeeditor.js
+++ b/modules/backend/formwidgets/codeeditor/assets/js/codeeditor.js
@@ -5,7 +5,7 @@
* - data-control="codeeditor" - enables the code editor plugin
* - data-vendor-path="/" - sets the path to find Ace editor files
* - data-language="php" - set the coding language used
- * - data-theme="textmate" - the colour scheme and theme
+ * - data-theme="textmate" - the colour scheme and theme
*
* JavaScript API:
* $('textarea').codeEditor({ vendorPath: '/', language: 'php '})
@@ -186,7 +186,7 @@
})
.tooltip({
delay: 500,
- placement: 'bottom',
+ placement: 'top',
html: true
})
;
@@ -201,14 +201,13 @@
this.$replaceboxDisable.hide()
this.$replaceboxEnable.on('click.codeeditor', '>a', $.proxy(this.toggleReplacebox, this))
- this.$replaceboxDisable.on('click.codeeditor', '>a', $.proxy(this.toggleReplacebox, this))
+ this.$replaceboxDisable.on('click.codeeditor', '>a', $.proxy(this.toggleReplacebox, this))
/*
* Hotkeys
*/
this.$el.hotKey({
hotkey: 'esc',
- hotkeyMac: 'esc',
callback: this.proxy(this.onEscape)
})
@@ -373,11 +372,11 @@
this.editor.resize()
this.editor.focus()
}
-
+
CodeEditor.prototype.toggleSearchbox = function() {
this.$searchboxEnable.toggle()
this.$searchboxDisable.toggle()
-
+
this.editor.execCommand("find")
this.editor.resize()
@@ -387,7 +386,7 @@
CodeEditor.prototype.toggleReplacebox = function() {
this.$replaceboxEnable.toggle()
this.$replaceboxDisable.toggle()
-
+
this.editor.execCommand("replace")
this.editor.resize()
@@ -407,7 +406,7 @@
var options = $.extend({}, CodeEditor.DEFAULTS, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('oc.codeEditor', (data = new CodeEditor(this, options)))
if (typeof option == 'string') result = data[option].apply(data, args)
- if (typeof result != 'undefined') return false
+ if (typeof result != 'undefined') return false
})
return result ? result : this
diff --git a/modules/backend/formwidgets/codeeditor/assets/less/codeeditor.less b/modules/backend/formwidgets/codeeditor/assets/less/codeeditor.less
index 3f523c2..f216286 100644
--- a/modules/backend/formwidgets/codeeditor/assets/less/codeeditor.less
+++ b/modules/backend/formwidgets/codeeditor/assets/less/codeeditor.less
@@ -20,6 +20,19 @@
font-size: 14px;
color: @text-color;
z-index: @zindex-form + 3;
+
+ // Fixes double focus on search box
+ .ace_search_form.ace_nomatch {
+ outline: none !important;
+
+ .ace_search_field {
+ border: .0625rem solid red;
+ -webkit-box-shadow: 0 0 .1875rem .125rem red;
+ box-shadow: 0 0 .1875rem .125rem red;
+ z-index: 1;
+ position: relative;
+ }
+ }
}
.editor-code {
@@ -28,9 +41,13 @@
.editor-toolbar {
position: absolute;
- top: 10px;
+ padding: 0 5px;
+ bottom: 10px;
right: 25px;
z-index: @zindex-form;
+ background: rgba(0,0,0,.8);
+ border-radius: 5px;
+
> ul, ul > li { list-style-type: none; padding: 0; margin: 0; }
> ul > li {
float: left;
@@ -47,34 +64,40 @@
font-size: 20px;
text-align: center;
text-decoration: none;
+ text-shadow: 0 0 5px #000;
+
> abbr {
position: absolute;
.text-hide();
}
> i {
- .opacity(.7);
+ .opacity(1);
display: block;
&:before {
font-size: 15px;
}
}
&:hover, &:focus {
- > i { .opacity(1); }
+ > i {
+ .opacity(1);
+ color: #fff;
+ }
}
-
}
}
&.editor-fullscreen {
z-index: @zindex-fullscreen + 1;
- position: fixed!important;
+ position: fixed !important;
top: 0;
left: 0;
height: 100%;
border-width: 0;
.border-radius(0);
+ .editor-toolbar {
+ z-index: @zindex-fullscreen + 2;
+ }
.editor-code { .border-radius(0); }
- .editor-toolbar { z-index: @zindex-fullscreen + 2; }
.ace_search { z-index: @zindex-fullscreen + 3; }
}
-}
\ No newline at end of file
+}
diff --git a/modules/backend/formwidgets/codeeditor/partials/_codeeditor.htm b/modules/backend/formwidgets/codeeditor/partials/_codeeditor.htm
index d8609f6..33d1c97 100644
--- a/modules/backend/formwidgets/codeeditor/partials/_codeeditor.htm
+++ b/modules/backend/formwidgets/codeeditor/partials/_codeeditor.htm
@@ -24,7 +24,8 @@
data-read-only="= $readOnly ? 'true' : 'false' ?>"
data-language="= $language ?>"
data-margin="= $margin ?>"
- data-vendor-path="= Url::asset('/modules/backend/formwidgets/codeeditor/assets/vendor/ace') ?>">
+ data-vendor-path="= Url::asset('/modules/backend/formwidgets/codeeditor/assets/vendor/ace') ?>"
+ = $this->formField->getAttributes() ?>>
diff --git a/modules/cms/controllers/index/_layout_toolbar.htm b/modules/cms/controllers/index/_layout_toolbar.htm
index dee70f5..fe336a1 100644
--- a/modules/cms/controllers/index/_layout_toolbar.htm
+++ b/modules/cms/controllers/index/_layout_toolbar.htm
@@ -8,11 +8,5 @@
= e(trans('backend::lang.form.save')) ?>
-
-
\ No newline at end of file
+ = $this->makePartial('common_toolbar_actions', ['toolbarSource' => 'layout']); ?>
+
diff --git a/modules/cms/controllers/index/_page_toolbar.htm b/modules/cms/controllers/index/_page_toolbar.htm
index 857d644..e72f76d 100644
--- a/modules/cms/controllers/index/_page_toolbar.htm
+++ b/modules/cms/controllers/index/_page_toolbar.htm
@@ -1,6 +1,6 @@
\ No newline at end of file
+ = $this->makePartial('common_toolbar_actions', ['toolbarSource' => 'page']); ?>
+
diff --git a/modules/cms/controllers/index/_partial_toolbar.htm b/modules/cms/controllers/index/_partial_toolbar.htm
index 8b193cc..4f4df2c 100644
--- a/modules/cms/controllers/index/_partial_toolbar.htm
+++ b/modules/cms/controllers/index/_partial_toolbar.htm
@@ -8,11 +8,5 @@
= e(trans('backend::lang.form.save')) ?>
-
-
\ No newline at end of file
+ = $this->makePartial('common_toolbar_actions', ['toolbarSource' => 'partial']); ?>
+
diff --git a/modules/cms/controllers/index/_safemode_notice.htm b/modules/cms/controllers/index/_safemode_notice.htm
new file mode 100644
index 0000000..b9e320c
--- /dev/null
+++ b/modules/cms/controllers/index/_safemode_notice.htm
@@ -0,0 +1,6 @@
+
diff --git a/modules/cms/controllers/index/_sidepanel.htm b/modules/cms/controllers/index/_sidepanel.htm
index c8eca67..e38e505 100644
--- a/modules/cms/controllers/index/_sidepanel.htm
+++ b/modules/cms/controllers/index/_sidepanel.htm
@@ -7,6 +7,7 @@
user->hasAccess('cms.manage_pages')): ?>
@@ -26,6 +27,7 @@
-
= e(trans('system::lang.mail_templates.layout')) ?>
-
= $formModel->code ?>
+
= e(trans('system::lang.mail_templates.partial')) ?>
+
= e($formModel->code) ?>
@@ -29,6 +29,7 @@ = e(trans('system::lang.mail_templates.layout')) ?>
= e(trans('system::lang.mail_templates.layout')) ?>
@@ -26,6 +27,7 @@
= e(trans('system::lang.mail_templates.template')) ?>
-
= $formModel->code ?>
+
= e($formModel->code) ?>
@@ -29,6 +29,7 @@ = e(trans('system::lang.mail_templates.template')) ?>
= e(trans('system::lang.mail_templates.template')) ?>
referer as $referer): ?>
- = $referer ?>
+ = e($referer) ?>
diff --git a/modules/system/controllers/requestlogs/index.htm b/modules/system/controllers/requestlogs/index.htm
index d20ced2..9a1c240 100644
--- a/modules/system/controllers/requestlogs/index.htm
+++ b/modules/system/controllers/requestlogs/index.htm
@@ -2,4 +2,4 @@
= $this->makeHintPartial('system_requestlogs_hint', 'hint') ?>
-= $this->listRender() ?>
\ No newline at end of file
+= $this->listRender() ?>
diff --git a/modules/system/controllers/requestlogs/preview.htm b/modules/system/controllers/requestlogs/preview.htm
index fe9b835..4d73dff 100644
--- a/modules/system/controllers/requestlogs/preview.htm
+++ b/modules/system/controllers/requestlogs/preview.htm
@@ -42,4 +42,4 @@ = e(trans('system::lang.request_log.referer')) ?>
= e(trans('system::lang.request_log.return_link')) ?>
-
\ No newline at end of file
+
diff --git a/modules/system/controllers/settings/update.htm b/modules/system/controllers/settings/update.htm
index 3925c72..64f6311 100644
--- a/modules/system/controllers/settings/update.htm
+++ b/modules/system/controllers/settings/update.htm
@@ -11,6 +11,7 @@