diff --git a/bin/lswsgi b/bin/lswsgi index ca17d470a..1f0b01600 100755 Binary files a/bin/lswsgi and b/bin/lswsgi differ diff --git a/public/static/baseTemplate/assets/finalBase/favicon.png b/public/static/baseTemplate/assets/finalBase/favicon.png index f72790ed5..8834c6716 100644 Binary files a/public/static/baseTemplate/assets/finalBase/favicon.png and b/public/static/baseTemplate/assets/finalBase/favicon.png differ diff --git a/public/static/baseTemplate/assets/finalBase/finalBase.css b/public/static/baseTemplate/assets/finalBase/finalBase.css index af337ac4e..65e913913 100644 --- a/public/static/baseTemplate/assets/finalBase/finalBase.css +++ b/public/static/baseTemplate/assets/finalBase/finalBase.css @@ -1653,27 +1653,7 @@ @charset "UTF-8";.fc-button .ui-icon,.fc-content,.fc-view{position:relative}.fc-cell-overlay,.fc-grid .fc-other-month .fc-day-number{opacity:.3;filter:alpha(opacity=30)}.carousel-caption,.carousel-control{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.6)}.irs,.jcrop-tracker{-webkit-touch-callout:none}.dd-dragel,.xchart .color2 .line .fill,.xchart .color3 .line .fill,.xchart .color4 .line .fill,.xchart .color5 .line .fill,.xchart .color6 .line .fill,.xchart .color7 .line .fill,.xchart .color8 .line .fill,.xchart .color9 .line .fill{pointer-events:none}.ui-accordion .ui-accordion-header{font-size:15px;font-weight:700;position:relative;display:block;min-height:0;margin-top:2px;padding:10px;cursor:pointer;border-width:1px;border-style:solid}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{margin-right:10px}.ui-accordion .ui-accordion-content{overflow:hidden;padding:15px 0;border-top:0}.fc{text-align:left;direction:ltr}.fc table{border-spacing:0;border-collapse:collapse}.fc-agenda table,table.fc-border-separate{border-collapse:separate}.fc td,.fc th{padding:0;vertical-align:top}.fc-header td{white-space:nowrap}.fc-header-left{width:25%;text-align:left}.fc-header-center{text-align:center}.fc-header-right,.fc-rtl .fc-event{text-align:right}.fc-header-right{width:25%}.fc-event-inner,.fc-view{width:100%;overflow:hidden}.fc-header-title{display:inline-block;vertical-align:top}.fc-header-title h2{font-size:20px;margin-top:7px;white-space:nowrap}.fc .fc-header-space{padding-left:10px}.fc-header .fc-button{margin-bottom:1em;vertical-align:top;margin-right:-1px}.fc-header .fc-corner-right,.fc-header .ui-corner-right{margin-right:0}.fc-header .fc-state-hover,.fc-header .ui-state-hover{z-index:2}.fc-header .fc-state-down{z-index:3}.fc-header .fc-state-active,.fc-header .ui-state-active{z-index:4}.fc-content{z-index:1;clear:both;zoom:1}.fc-widget-content,.fc-widget-header{border-width:1px;border-style:solid}.fc-state-highlight{background:#fcf8e3}.fc-cell-overlay{background:#bce8f1}.fc-icon-left-single-arrow:after{content:'\f104'}.fc-icon-right-single-arrow:after{content:'\f105'}.fc-icon-left-double-arrow:after{content:'\f100'}.fc-icon-right-double-arrow:after{content:'\f101'}.fc-button .ui-icon{top:50%;float:left;margin-top:-8px}.fc-event-container>*{z-index:8}.fc-event-container>.ui-draggable-dragging,.fc-event-container>.ui-resizable-resizing{z-index:9}.fc-event{font-size:11px;padding:3px;cursor:default}a.fc-event{text-decoration:none}.fc-event-draggable,a.fc-event{cursor:pointer}.fc-agenda-days th,.fc-grid th{text-align:center}.fc-event-inner{height:100%}.fc-event-time,.fc-event-title{padding:0 1px}.fc .ui-resizable-handle{font-size:300%;line-height:50%;position:absolute;z-index:99999;display:block;overflow:hidden}.fc-event-hori{margin-bottom:1px;border-width:1px 0}.fc-ltr .fc-event-hori.fc-event-start,.fc-rtl .fc-event-hori.fc-event-end{border-left-width:1px;border-top-left-radius:3px;border-bottom-left-radius:3px}.fc-ltr .fc-event-hori.fc-event-end,.fc-rtl .fc-event-hori.fc-event-start{border-right-width:1px;border-top-right-radius:3px;border-bottom-right-radius:3px}.fc-event-hori .ui-resizable-e{top:0!important;right:-3px!important;width:7px!important;height:100%!important;cursor:e-resize}.fc-event-hori .ui-resizable-w{top:0!important;left:-3px!important;width:7px!important;height:100%!important;cursor:w-resize}.fc-border-separate td,.fc-border-separate th{border-width:1px 0 0 1px}.fc-agenda-days .fc-agenda-axis,.fc-border-separate td.fc-last,.fc-border-separate th.fc-last{border-right-width:1px}.fc-border-separate tr.fc-last td,.fc-border-separate tr.fc-last th{border-bottom-width:1px}.fc-border-separate tbody tr.fc-first td,.fc-border-separate tbody tr.fc-first th{border-top-width:0}.fc .fc-week-number{width:22px;text-align:center}.fc .fc-week-number div{padding:0 2px}.fc-grid .fc-day-number{float:right;padding:0 2px}.fc-grid .fc-day-content{clear:both;padding:2px 2px 1px}.fc-grid .fc-event-time{font-weight:700}.fc-rtl .fc-grid .fc-day-number{float:left}.fc-rtl .fc-grid .fc-event-time{float:right}.fc-agenda .fc-agenda-axis{font-weight:400;width:50px;padding:0 3px;text-align:right;vertical-align:middle}.fc-agenda-slots .fc-agenda-axis{white-space:nowrap}.fc-agenda .fc-week-number{font-weight:700}.fc-agenda .fc-day-content{padding:2px 2px 1px}.fc-agenda-days .fc-col0{border-left-width:0}.fc-agenda-allday th{border-width:0 1px}.fc-agenda-allday .fc-day-content{min-height:33px}.fc-agenda-divider-inner{overflow:hidden;height:2px}.fc-widget-header .fc-agenda-divider-inner{background:#eee}.fc-agenda-slots th{border-width:1px 1px 0}.fc-agenda-slots td{border-width:1px 0 0;background:0 0}.fc-agenda-slots td div{height:20px}.fc-agenda-slots tr.fc-slot0 td,.fc-agenda-slots tr.fc-slot0 th{border-top-width:0}.fc-agenda-slots tr.fc-minor td,.fc-agenda-slots tr.fc-minor th{border-top-style:dotted}.fc-event-vert{border-width:0 1px}.fc-event-vert.fc-event-start{border-top-width:1px;border-top-left-radius:3px;border-top-right-radius:3px}.fc-event-vert.fc-event-end{border-bottom-width:1px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.fc-event-vert .fc-event-time{font-size:10px;white-space:nowrap}.fc-event-vert .fc-event-inner{position:relative;z-index:2}.fc-event-vert .fc-event-bg{position:absolute;z-index:1;top:0;left:0;width:100%;height:100%;opacity:.25;background:#fff;filter:alpha(opacity=25)}.carousel,.carousel-inner{position:relative}.fc-event-vert .ui-resizable-s{font-family:monospace;font-size:11px!important;line-height:8px!important;bottom:0!important;overflow:hidden!important;width:100%!important;height:8px!important;cursor:s-resize;text-align:center}.carousel-inner{overflow:hidden;width:100%}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{font-size:20px;position:absolute;top:0;bottom:0;left:0;width:15%;text-align:center;opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid: DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid: DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{text-decoration:none;opacity:.9;color:#fff;outline:0;filter:alpha(opacity=90)}.carousel-control .icon-chevron-left,.carousel-control .icon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;z-index:5;top:50%;display:inline-block}.carousel-control .icon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .icon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{font-family:serif;width:20px;height:20px;margin-top:-10px}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;z-index:15;bottom:10px;left:50%;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;cursor:pointer;text-indent:-999px;border:1px solid #fff;border-radius:10px;background-color:#000\9;background-color:rgba(0,0,0,0)}.xchart .color2.comp .fill,.xchart .color3.comp .fill,.xchart .color4.comp .fill,.xchart .color5.comp .fill,.xchart .color6.comp .fill,.xchart .color7.comp .fill,.xchart .color8.comp .fill,.xchart .color9.comp .fill{display:none}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;z-index:10;right:15%;bottom:20px;left:15%;padding-top:20px;padding-bottom:20px;text-align:center}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .icon-chevron-left,.carousel-control .icon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{font-size:30px;width:30px;height:30px;margin-top:-15px}.carousel-control .icon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .icon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.lg-gauge,.md-gauge,.sm-gauge,.xl-gauge,.xs-gauge{margin:0 auto}.xs-gauge{width:90px;height:70px}.sm-gauge{width:130px;height:100px}.md-gauge{width:170px;height:120px}.lg-gauge{width:240px;height:150px}.xl-gauge{width:340px;height:180px}.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,.8);border:2px solid rgba(230,230,230,.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:700;margin:.25em 0}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:.1em 0}.easyPieChart{position:relative;text-align:center;margin-left:auto;margin-right:auto}.easyPieChart canvas{position:absolute;top:0;left:0}.chart,.chart-alt,.chart-alt-1,.chart-alt-2,.chart-alt-3,.chart-home{text-align:center;font-weight:700;margin:0 auto}.chart-wrapper{width:100%;height:350px}.chart-container{width:100%;height:100%;font-size:14px;line-height:1.2em}.xchart .line{stroke-width:3px;fill:none}.xchart .fill{stroke-width:0}.xchart circle{stroke:#FFF;stroke-width:3px}.xchart .axis .domain{fill:none}.xchart .axis .tick line{stroke:#EEE;stroke-width:1px}.xchart .axis text{fill:#666;font-size:12px}.xchart .color2 .line{stroke:#f26522}.xchart .color2 circle,.xchart .color2 rect{fill:#f26522}.xchart .color2 .fill{fill:rgba(242,101,34,.1)}.xchart .color2.comp .pointer,.xchart .color2.comp circle,.xchart .color2.comp rect{fill:#f9b99a}.xchart .color2.comp .line{stroke:#f9b99a}.xchart .color3 .line{stroke:#c6080d}.xchart .color3 circle,.xchart .color3 rect{fill:#c6080d}.xchart .color3 .fill{fill:rgba(198,8,13,.1)}.xchart .color3.comp .pointer,.xchart .color3.comp circle,.xchart .color3.comp rect{fill:#f8555a}.xchart .color3.comp .line{stroke:#f8555a}.xchart .color4 .line{stroke:#672d8b}.xchart .color4 circle,.xchart .color4 rect{fill:#672d8b}.xchart .color4 .fill{fill:rgba(103,45,139,.1)}.xchart .color4.comp .pointer,.xchart .color4.comp circle,.xchart .color4.comp rect{fill:#a869ce}.xchart .color4.comp .line{stroke:#a869ce}.xchart .color5 .line{stroke:#ce1797}.xchart .color5 circle,.xchart .color5 rect{fill:#ce1797}.xchart .color5 .fill{fill:rgba(206,23,151,.1)}.xchart .color5.comp .pointer,.xchart .color5.comp circle,.xchart .color5.comp rect{fill:#f075cb}.xchart .color5.comp .line{stroke:#f075cb}.xchart .color6 .line{stroke:#d9ce00}.xchart .color6 circle,.xchart .color6 rect{fill:#d9ce00}.xchart .color6 .fill{fill:rgba(217,206,0,.1)}.xchart .color6.comp .pointer,.xchart .color6.comp circle,.xchart .color6.comp rect{fill:#fff75a}.xchart .color6.comp .line{stroke:#fff75a}.xchart .color7 .line{stroke:#754c24}.xchart .color7 circle,.xchart .color7 rect{fill:#754c24}.xchart .color7 .fill{fill:rgba(117,76,36,.1)}.xchart .color7.comp .pointer,.xchart .color7.comp circle,.xchart .color7.comp rect{fill:#c98c50}.xchart .color7.comp .line{stroke:#c98c50}.xchart .color8 .line{stroke:#2eb9b4}.xchart .color8 circle,.xchart .color8 rect{fill:#2eb9b4}.xchart .color8 .fill{fill:rgba(46,185,180,.1)}.xchart .color8.comp .pointer,.xchart .color8.comp circle,.xchart .color8.comp rect{fill:#86e1de}.xchart .color8.comp .line{stroke:#86e1de}.xchart .color9 .line{stroke:#0e2e42}.xchart .color9 circle,.xchart .color9 rect{fill:#0e2e42}.xchart .color9 .fill{fill:rgba(14,46,66,.1)}.xchart .color9.comp .pointer,.xchart .color9.comp circle,.xchart .color9.comp rect{fill:#2477ab}.xchart .color9.comp .line{stroke:#2477ab}.chosen-container{position:relative;display:inline-block;zoom:1;width:100%!important;vertical-align:middle;border-width:1px;border-style:solid}.chosen-container .chosen-drop{position:absolute;z-index:1010;top:38px;left:-9999px;width:100%;border-width:1px;border-style:solid;border-top:0;background:#fff}.chosen-container.chosen-with-drop .chosen-drop{right:-1px;left:-1px;width:auto;padding:10px}.chosen-container-single .chosen-single{line-height:38px;position:relative;display:block;overflow:hidden;height:38px;margin:0;padding:0 10px!important;cursor:pointer;white-space:nowrap;text-decoration:none}.chosen-container-single .chosen-single span{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{font-size:9px;font-weight:700;line-height:16px;position:absolute;top:9px;right:26px;display:block;width:16px;height:16px;text-align:center}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0 0 10px;white-space:nowrap}.chosen-container-single .chosen-search i,.chosen-container-single .chosen-single div{line-height:38px;position:absolute;z-index:4;top:50%;right:0;display:block;width:38px;height:38px;margin-top:-19px;text-align:center;border-left:1px solid transparent}.chosen-container-active.chosen-with-drop .chosen-single div{border-bottom:1px solid transparent;border-bottom-right-radius:0}.chosen-container-single .chosen-search i{margin-top:-19px;padding:0!important}.chosen-container-single .chosen-search input{width:100%;padding:0 38px 0 5px}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{position:relative;overflow-x:hidden;overflow-y:auto;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{line-height:20px;margin:5px 0;padding:3px 10px;list-style:none}.chosen-container .chosen-results li.group-result{font-weight:700;margin:0;text-transform:uppercase}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;cursor:default;color:#ccc}.chosen-container .chosen-results li.no-results{display:list-item;margin:0;text-align:center}.chosen-container .chosen-results li.no-results span{font-weight:700}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi{height:auto;min-height:38px;padding:0}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;box-sizing:border-box;width:100%;height:auto!important;height:1%;margin:0;padding:0;cursor:text}.minicolors-grid .minicolors-picker>div,.minicolors-panel{-webkit-box-sizing:content-box;-moz-box-sizing:content-box}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0 10px;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input{width:100%;height:38px;padding:0;border:0!important;outline:0;background:0 0!important;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.chosen-container-multi .chosen-choices li.search-field .default{color:#999}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:6px 0 6px 6px;padding:3px 25px 3px 5px;cursor:default;border-width:1px;border-style:solid}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{line-height:12px;position:absolute;top:5px;right:5px;display:block;width:12px;height:12px;cursor:pointer;text-align:center;opacity:.5}.chosen-container-multi .chosen-results li.result-selected{opacity:.6;filter:alpha(opacity=60)}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{opacity:1}.minicolors{position:relative}.minicolors-swatch{position:absolute;display:inline-block;margin:0;padding:0;cursor:text;vertical-align:middle;border:1px solid #ccc;background:url(../../images/colorpicker.png) -80px 0}.minicolors-swatch-color{position:absolute;top:0;right:0;bottom:0;left:0}.minicolors input[type=hidden]+.minicolors-swatch{position:static;width:28px;cursor:pointer}.minicolors-panel{box-sizing:content-box;width:173px;height:152px;border:1px solid #ccc;box-shadow:0 0 20px rgba(0,0,0,.2)}.minicolors-panel.minicolors-visible{display:block}.minicolors-position-top .minicolors-panel{top:-180px}.minicolors-position-right .minicolors-panel{right:0;left:auto}.minicolors-position-bottom .minicolors-panel{top:36px;bottom:auto}.minicolors-position-left .minicolors-panel{right:auto;left:0}.minicolors-with-opacity .minicolors-panel{width:200px}.minicolors .minicolors-grid{position:absolute;top:6px;left:6px;width:150px;height:150px;cursor:crosshair;background:url(../../images/colorpicker.png) -120px 0}.minicolors .minicolors-grid-inner{position:absolute;top:0;left:0;width:150px;height:150px;background:0 0}.minicolors-slider-saturation .minicolors-grid{background-position:-420px 0}.minicolors-slider-saturation .minicolors-grid-inner{background:url(../../images/colorpicker.png) -270px 0}.minicolors-slider-brightness .minicolors-grid{background-position:-570px 0}.minicolors-slider-brightness .minicolors-grid-inner{background:#000}.minicolors-slider-wheel .minicolors-grid{background-position:-720px 0}.minicolors-opacity-slider,.minicolors-slider{position:absolute;top:6px;left:160px;width:20px;height:150px;cursor:row-resize;background:url(../../images/colorpicker.png) #fff}.minicolors-slider-saturation .minicolors-slider{background-position:-60px 0}.minicolors-slider-brightness .minicolors-slider,.minicolors-slider-wheel .minicolors-slider{background-position:-20px 0}.minicolors-opacity-slider{left:184px;display:none;background-position:-40px 0}.minicolors-with-opacity .minicolors-opacity-slider{display:block}.minicolors-grid .minicolors-picker{position:absolute;top:70px;left:70px;width:12px;height:12px;margin-top:-6px;margin-left:-6px;border:1px solid #000;border-radius:10px;background:0 0}.minicolors-grid .minicolors-picker>div{position:absolute;top:0;left:0;box-sizing:content-box;width:8px;height:8px;border:2px solid #fff;border-radius:8px}.minicolors-picker{position:absolute;top:0;left:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;width:18px;height:2px;margin-top:-2px;border:1px solid #000;background:#fff}.minicolors-inline{display:inline-block}.minicolors-inline .minicolors-input{display:none!important}.minicolors-inline .minicolors-panel{position:relative;z-index:auto;top:auto;left:auto;display:inline-block;box-shadow:none}.minicolors-theme-default .minicolors-swatch{top:5px;left:5px;width:24px;height:24px}.minicolors-theme-default.minicolors-position-right .minicolors-swatch{right:5px;left:auto}.minicolors-theme-default.minicolors{display:inline-block;width:100%}.minicolors-theme-default.minicolors-position-right .minicolors-input{padding-right:34px}.minicolors-theme-default.minicolors-position-left .minicolors-input{padding-left:34px}.minicolors-theme-bootstrap .minicolors-swatch{top:3px;left:3px;width:28px;height:28px;border-radius:3px}.minicolors-theme-bootstrap.minicolors-position-right .minicolors-swatch{right:3px;left:auto}.minicolors-theme-bootstrap .minicolors-input{padding-left:44px}.minicolors-theme-bootstrap.minicolors-position-right .minicolors-input{padding-right:44px;padding-left:12px}div.dataTables_length label{font-weight:400;line-height:32px;text-align:left;display:block}div.dataTables_length select{float:left;width:75px;margin-right:10px}div.dataTables_filter label{font-weight:400;float:right}div.dataTables_filter input{display:inline-block;width:200px;margin-left:10px;padding:0 10px}div.dataTables_info{padding-top:8px}div.dataTables_paginate{float:right;margin:0}div.dataTables_paginate ul.pagination{margin:0;white-space:nowrap}table.dataTable{clear:both;max-width:none!important;margin-top:10px!important;margin-bottom:10px!important}div.dataTables_scrollBody table,div.dataTables_scrollFoot table{margin-top:0!important;border-top:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_desc_disabled{cursor:pointer}table.dataTable thead .sorting_asc_disabled .glyph-icon,table.dataTable thead .sorting_desc_disabled .glyph-icon{opacity:.7}table.dataTable thead>tr>th{padding-right:18px;padding-left:18px}table.dataTable th:active{outline:0}div.dataTables_scrollHead table{margin-bottom:0!important;border-bottom-right-radius:0;border-bottom-left-radius:0}div.DTFC_LeftHeadWrapper table,div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child,div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,div.DTFC_RightHeadWrapper table,div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child,div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child,div.dataTables_scrollHead table thead tr:last-child td:first-child,div.dataTables_scrollHead table thead tr:last-child th:first-child{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}div.dataTables_scrollBody table{margin-bottom:0!important}div.dataTables_scrollBody tbody tr:first-child td,div.dataTables_scrollBody tbody tr:first-child th{border-top:none}.table tbody tr.active td,.table tbody tr.active th{color:#fff;background-color:#08c}.table tbody tr.active:hover td,.table tbody tr.active:hover th{background-color:#0075b0!important}.table tbody tr.active a{color:#fff}div.DTTT .btn,ul.DTTT_dropdown.dropdown-menu a{color:#333!important}.table-striped tbody tr.active:nth-child(odd) td,.table-striped tbody tr.active:nth-child(odd) th{background-color:#017ebc}table.DTTT_selectable tbody tr{cursor:pointer}div.DTTT .btn{font-size:12px}div.DTTT .btn:hover{text-decoration:none!important}ul.DTTT_dropdown.dropdown-menu{z-index:2003}ul.DTTT_dropdown.dropdown-menu li{position:relative}ul.DTTT_dropdown.dropdown-menu li:hover a{color:#fff!important;background-color:#08c}div.DTTT_collection_background{z-index:2002}.DTTT_Print #page-content{margin:0}div.DTTT_print_info.modal{height:150px;margin-top:-75px;text-align:center}div.DTTT_print_info h6{font-size:28px;font-weight:400;line-height:28px;margin:1em}div.DTTT_print_info p{font-size:14px;line-height:20px}div.DTFC_LeftFootWrapper table,div.DTFC_LeftHeadWrapper table,div.DTFC_RightFootWrapper table,div.DTFC_RightHeadWrapper table,table.DTFC_Cloned tr.even{margin-bottom:0;background-color:#fff}div.DTFC_LeftHeadWrapper table,div.DTFC_RightHeadWrapper table{margin-bottom:0!important;border-top-right-radius:0!important}div.DTFC_LeftBodyWrapper table,div.DTFC_RightBodyWrapper table{margin-bottom:0!important;border-top:none}div.DTFC_LeftBodyWrapper tbody tr:first-child td,div.DTFC_LeftBodyWrapper tbody tr:first-child th,div.DTFC_LeftFootWrapper table,div.DTFC_RightBodyWrapper tbody tr:first-child td,div.DTFC_RightBodyWrapper tbody tr:first-child th,div.DTFC_RightFootWrapper table{border-top:none}/*! * DataTables + Font Awesome integration * License: MIT - http://datatables.net/license - */table.dataTable thead th{position:relative;background-image:none!important}table.dataTable thead th.sorting:after,table.dataTable thead th.sorting_asc:after,table.dataTable thead th.sorting_desc:after{position:absolute;top:12px;right:8px;display:block;font-family:FontAwesome}table.dataTable thead th.sorting:after{content:"\f0dc";font-size:13px}table.dataTable thead th.sorting_asc:after{content:"\f0de"}table.dataTable thead th.sorting_desc:after{content:"\f0dd"}table.table thead th.sorting:after,table.table thead th.sorting_asc:after,table.table thead th.sorting_desc:after{top:12px}div.dataTables_paginate a.paginate_button.first,div.dataTables_paginate a.paginate_button.previous{position:relative;padding-left:24px}div.dataTables_paginate a.paginate_button.last,div.dataTables_paginate a.paginate_button.next{position:relative;padding-right:24px}div.dataTables_paginate a.first:before,div.dataTables_paginate a.previous:before{position:absolute;top:8px;left:10px;display:block;font-family:FontAwesome}div.dataTables_paginate a.last:after,div.dataTables_paginate a.next:after{position:absolute;top:8px;right:10px;display:block;font-family:FontAwesome}div.dataTables_paginate a.first:before{content:"\f100"}div.dataTables_paginate a.previous:before{content:"\f104"}div.dataTables_paginate a.next:after{content:"\f105"}div.dataTables_paginate a.last:after{content:"\f101"}div.dataTables_paginate li.first>a,div.dataTables_paginate li.previous>a{position:relative;padding-left:24px}div.dataTables_paginate li.last>a,div.dataTables_paginate li.next>a{position:relative;padding-right:24px}div.dataTables_paginate li.first a:before,div.dataTables_paginate li.previous a:before{position:absolute;top:6px;left:10px;display:block;font-family:FontAwesome}div.dataTables_paginate li.last a:after,div.dataTables_paginate li.next a:after{position:absolute;top:6px;right:10px;display:block;font-family:FontAwesome}div.dataTables_paginate li.first a:before{content:"\f100"}div.dataTables_paginate li.previous a:before{content:"\f104"}div.dataTables_paginate li.next a:after{content:"\f105"}div.dataTables_paginate li.last a:after{content:"\f101"}div.columns div.dataTables_paginate li.first a:before,div.columns div.dataTables_paginate li.last a:after,div.columns div.dataTables_paginate li.next a:after,div.columns div.dataTables_paginate li.previous a:before{top:0}.DTTT_container{float:right;margin-left:10px}.DTTT_container a div{cursor:pointer}.dataTables_scrollBody table.dataTable thead th.sorting:after{display:none}.tr-selected,.tr-selected td{background:#eefacd!important;color:#393c31!important}table.dataTable.dtr-inline.collapsed tbody td:first-child,table.dataTable.dtr-inline.collapsed tbody th:first-child{position:relative;padding-left:30px;cursor:pointer}table.dataTable.dtr-inline.collapsed tbody td:first-child:before,table.dataTable.dtr-inline.collapsed tbody th:first-child:before{top:8px;left:4px;height:16px;width:16px;display:block;position:absolute;color:#fff;border:2px solid #fff;border-radius:16px;text-align:center;line-height:14px;box-shadow:0 0 3px #444;box-sizing:content-box;content:'+';background-color:#31b131}table.dataTable.dtr-inline.collapsed tbody td:first-child.dataTables_empty:before,table.dataTable.dtr-inline.collapsed tbody th:first-child.dataTables_empty:before,table.dataTable.dtr-inline.collapsed tbody tr.child td:before{display:none}table.dataTable.dtr-inline.collapsed tbody tr.parent td:first-child:before,table.dataTable.dtr-inline.collapsed tbody tr.parent th:first-child:before{content:'-';background-color:#d33333}table.dataTable.dtr-column tbody td.control,table.dataTable.dtr-column tbody th.control{position:relative;cursor:pointer}table.dataTable.dtr-column tbody td.control:before,table.dataTable.dtr-column tbody th.control:before{top:50%;left:50%;height:16px;width:16px;margin-top:-10px;margin-left:-10px;display:block;position:absolute;color:#fff;border:2px solid #fff;border-radius:16px;text-align:center;line-height:14px;box-shadow:0 0 3px #444;box-sizing:content-box;content:'+';background-color:#31b131}table.dataTable.dtr-column tbody tr.parent td.control:before,table.dataTable.dtr-column tbody tr.parent th.control:before{content:'-';background-color:#d33333}table.dataTable tr.child{padding:.5em 1em}table.dataTable tr.child:hover{background:0 0!important}table.dataTable tr.child ul{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable tr.child ul li{border-bottom:1px solid #efefef;padding:.5em 0}table.dataTable tr.child ul li:first-child{padding-top:0}table.dataTable tr.child ul li:last-child{border-bottom:none}table.dataTable tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:700}div.FixedHeader_Cloned td,div.FixedHeader_Cloned th{background-color:#fff!important}.DTFC_LeftBodyLiner .table,.DTFC_LeftFootWrapper .table{margin:0!important}table.DTCR_clonedT - -/* Fix for tiny text throughout CyberPanel */ -small { - font-size: 0.875rem !important; - line-height: 1.4; -} - -/* Ensure form helper text is readable */ -.form-text, .help-block, .help-text { - font-size: 0.875rem !important; - line-height: 1.4; -} - -/* Fix for any inline small text */ -[style*="font-size: 0.6"], -[style*="font-size: 0.7"], -[style*="font-size: 10px"], -[style*="font-size: 11px"] { - font-size: 0.875rem !important; -}able{background-color:rgba(255,255,255,.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#0259C4;z-index:201}.DTFC_LeftBodyLiner .table thead th:after{display:none!important}.bsdatepicker:after,.bsdatepicker:before{position:absolute;display:inline-block;content:''}.bsdatepicker{top:0;left:0;margin-top:1px;padding:4px!important}.bsdatepicker:before{top:-7px;left:6px;border-right:7px solid transparent;border-bottom:7px solid transparent;border-bottom-color:transparent;border-left:7px solid transparent}.bsdatepicker:after{top:-6px;left:7px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.bsdatepicker>div{display:none}.bsdatepicker table{width:100%;margin:0}.bsdatepicker td,.bsdatepicker th{width:20px;height:20px;margin:3px;text-align:center}.bsdatepicker td.day:hover{cursor:pointer}.bsdatepicker td.day.disabled{color:#eee}.bsdatepicker td span.old,.bsdatepicker td.new,.bsdatepicker td.old{color:#999}.bsdatepicker td span{line-height:44px;display:block;float:left;width:54px;height:44px;margin:2px;cursor:pointer}.bsdatepicker th.switch{width:145px}.bsdatepicker th.next,.bsdatepicker th.prev{font-size:21px}.bsdatepicker thead tr:first-child th{cursor:pointer}.ui-datepicker-inline{position:static!important;width:100%;float:none;margin-top:0}.ui-datepicker .ui-datepicker-header,.ui-datepicker-header{font-size:13px;line-height:40px;position:relative;height:40px}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:50%;overflow:hidden;width:30px;height:30px;margin-top:-15px;cursor:pointer;border-width:1px;border-style:solid}.ui-datepicker .ui-datepicker-prev{left:5px}.ui-datepicker .ui-datepicker-next{right:5px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{line-height:28px;display:block;float:none;height:28px;margin:0 auto;text-align:center}.ui-datepicker .ui-datepicker-title{font-weight:700;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:13px;height:28px;margin:0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{font-size:13px;line-height:1.6em;width:96%;margin:2%;border-collapse:collapse}.ui-datepicker th{font-weight:700;padding:0 0 5px;text-align:center;border:0}.ui-datepicker td{padding:1px;border:0}.ui-datepicker td a,.ui-datepicker td span{font-size:13px;display:block;padding:2px 5px;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{padding:10px}.ui-datepicker .ui-datepicker-buttonpane button{line-height:26px;float:right;height:28px;padding:0 15px;border-width:1px;border-style:solid;background:#fff}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-radius:0}.ui-datepicker-row-break{font-size:0;clear:both;width:100%}.daterangepicker.dropdown-menu{z-index:3000;max-width:none}.daterangepicker.opensleft .calendar,.daterangepicker.opensleft .ranges{float:left;margin:4px}.daterangepicker.opensright .calendar,.daterangepicker.opensright .ranges{float:right;margin:4px}.daterangepicker .ranges{width:188px;margin:0 0 0 10px;text-align:left}.daterangepicker .ranges .range_inputs>div{float:left}.daterangepicker .ranges .range_inputs>div:nth-child(2){padding-left:11px}.daterangepicker .calendar{display:none;max-width:270px}.show-calendar.daterangepicker .calendar{display:block}.daterangepicker .applyBtn{float:right;width:110px}.daterangepicker .cancelBtn{float:left}.daterangepicker .calendar td,.daterangepicker .calendar th{font-size:12px;text-align:center;white-space:nowrap}.daterangepicker .ranges label{font-size:11px;font-weight:700;line-height:20px;display:block;width:74px;height:20px;margin-bottom:2px;text-transform:uppercase;color:#333}.daterangepicker .ranges input{font-size:11px}.daterangepicker .ranges .input-mini{font-size:11px;line-height:30px;display:block;width:88px;height:30px;margin:0 0 10px;padding:0 6px;vertical-align:middle;color:#555;border:1px solid #ccc;border-radius:4px;background-color:#eee}.daterangepicker.opensleft:after,.daterangepicker.opensleft:before,.daterangepicker.opensright:after,.daterangepicker.opensright:before{position:absolute;display:inline-block;content:''}.daterangepicker .ranges ul{margin:0;padding:0;list-style:none}.daterangepicker .ranges li{margin-bottom:3px;padding:3px 12px;cursor:pointer}.daterangepicker .calendar-date{padding:5px;border-width:1px;border-style:solid;background:#fff}.daterangepicker .calendar-time{line-height:30px;margin:8px auto 0;text-align:center}.daterangepicker{position:absolute;top:100px;left:20px;margin-top:1px;padding:5px!important;background:#fff}.daterangepicker.opensleft:before{top:-7px;right:9px;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);border-left:7px solid transparent}.daterangepicker.opensleft:after{top:-6px;right:10px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.daterangepicker.opensright:before{top:-7px;left:9px;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);border-left:7px solid transparent}.daterangepicker.opensright:after{top:-6px;left:10px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.daterangepicker table{width:100%;margin:0}.daterangepicker td,.daterangepicker th{width:20px;height:20px;cursor:pointer;text-align:center;white-space:nowrap}.daterangepicker td.off{color:#999}.daterangepicker td.in-range{border-radius:0}.daterangepicker td.in-range:hover{color:#000}.daterangepicker td.week,.daterangepicker th.week{font-size:80%;color:#ccc}.daterangepicker select.monthselect,.daterangepicker select.yearselect{font-size:12px;height:auto;margin:0;padding:1px;cursor:default}.daterangepicker select.monthselect{width:56%;margin-right:2%}.daterangepicker select.yearselect{width:40%}.daterangepicker select.ampmselect,.daterangepicker select.hourselect,.daterangepicker select.minuteselect{width:50px;margin-bottom:0}.ui-dialog .ui-dialog-titlebar{position:relative;padding:10px;border-bottom:1px solid transparent}.ui-dialog .ui-dialog-title{overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{line-height:20px;position:absolute;top:50%;right:10px;width:20px;height:20px;margin:-10px 0 0;border:1px solid #ccc;background:#fff}.ui-dialog .ui-dialog-titlebar-close:before{line-height:18px;position:absolute;top:0;left:0;width:18px;height:18px;opacity:.6;-moz-opacity:.6;filter:alpha(opacity: 60)}.ui-dialog .ui-dialog-titlebar-close:hover:before{opacity:.9;-moz-opacity:.9;filter:alpha(opacity: 90)}.ui-dialog .ui-dialog-titlebar-close .ui-button-text{display:none}.ui-dialog .ui-dialog-content{position:relative;overflow:auto;padding:0;border:0;background:0 0}.ui-dialog-buttonset button{padding:8px 15px;border-width:1px;border-style:solid}.ui-dialog .ui-dialog-buttonpane{border-width:1px 0 0!important}.ui-dialog .ui-dialog-buttonpane .ui-button{line-height:28px;float:right;height:28px;padding:0 15px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-dialog .infobox,.ui-dialog .ui-tabs{margin-bottom:0}.ui-dialog .ui-tabs .ui-tabs-panel{padding:10px}.ui-widget-overlay{position:fixed;z-index:1049;top:0;left:0;width:100%;height:100%}.ui-widget-overlay img{position:absolute;top:50%;left:50%;margin:-27px 0 0 -27px}.ui-resizable{position:relative}.ui-resizable-handle{font-size:.1px;position:absolute;display:block}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{top:-5px;left:0;width:100%;height:7px;cursor:n-resize}.ui-resizable-s{bottom:-5px;left:0;width:100%;height:7px;cursor:s-resize}.ui-resizable-e{top:0;right:-5px;width:7px;height:100%;cursor:e-resize}.ui-resizable-w{top:0;left:-5px;width:7px;height:100%;cursor:w-resize}.ui-resizable-se{right:1px;bottom:1px;width:12px;height:12px;cursor:se-resize}.ui-resizable-sw{bottom:-5px;left:-5px;width:9px;height:9px;cursor:sw-resize}.ui-resizable-nw{top:-5px;left:-5px;width:9px;height:9px;cursor:nw-resize}.ui-resizable-ne{top:-5px;right:-5px;width:9px;height:9px;cursor:ne-resize}.dropdown,.dropup{position:relative;display:inline-block}.dropdown-menu,.minicolors-panel,.popover,.ui-datepicker,.ui-dialog,.ui-menu{position:absolute;z-index:1050!important;top:105%;left:0;display:none;float:left;min-width:150px;margin:5px 0 0;padding:5px;list-style:none;text-align:left;border-width:1px;border-style:solid;background:#fff}.ui-datepicker{padding:0}.dropdown-menu,.popover,.ui-dialog{box-shadow:0 1px 7px 2px rgba(135,158,171,.2)}.dropdown-menu{font-size:13px;line-height:1.6em;padding:5px 0;text-transform:none;border:0;min-width:150px}.dropdown-menu,.minicolors-panel,.popover,.ui-menu{top:100%}.dropdown-menu .divider{margin:5px 1px}.dropdown-menu.float-right{right:0;left:auto}.dropdown-menu .header{font-size:11px;font-weight:700;line-height:1.4em;margin:0 0 5px;padding:5px 5px 10px;text-transform:uppercase;color:#888;border-bottom:#dfe8f1 solid 1px}.dropdown-menu .dropdown-header{font-size:11px;font-weight:300;padding:5px 15px;text-transform:uppercase;color:#000}.dropdown-menu li{position:relative}.dropdown-menu li>a,.ui-menu li>a{font-weight:400;line-height:20px;position:relative;display:block;clear:both;margin:0;padding:5px 15px;cursor:pointer;white-space:nowrap}.dropdown>.dropdown-menu:before,.minicolors-position-bottom .minicolors-panel:before{position:absolute;top:-7px;left:7px;display:inline-block;content:'';border-right:7px solid transparent;border-bottom:7px solid transparent;border-bottom-color:transparent;border-left:7px solid transparent}.dropdown>.dropdown-menu:after,.minicolors-position-bottom .minicolors-panel:after{position:absolute;top:-6px;left:8px;display:inline-block;content:'';border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.dropdown>.dropdown-menu.float-right:before,.dropup>.dropdown-menu.float-right:before,.minicolors-position-right .minicolors-panel:before{right:7px;left:auto}.dropdown>.dropdown-menu.float-right:after,.dropup>.dropdown-menu.float-right:after,.minicolors-position-right .minicolors-panel:after{right:8px;left:auto}.minicolors-inline .minicolors-panel:after,.minicolors-inline .minicolors-panel:before{display:none}.dropdown-dividers{padding:0}.dropdown-dividers li{padding:3px;border-bottom:#ccc solid 1px}.dropdown-dividers li:last-child{border-bottom:0}.dropdown-dividers li>a{padding:2px 10px}.push-left{left:100%!important;margin-left:-30px}.open>.dropdown-menu{display:block}.dropup .dropdown-menu{top:auto;bottom:100%;margin-bottom:8px}.dropup>.dropdown-menu:before,.minicolors-position-top .minicolors-panel:before{position:absolute;bottom:-7px;left:7px;display:inline-block;content:'';border-top:7px solid #ccc;border-top-color:rgba(0,0,0,.2);border-right:7px solid transparent;border-left:7px solid transparent}.dropup>.dropdown-menu:after,.minicolors-position-top .minicolors-panel:after{position:absolute;bottom:-6px;left:8px;display:inline-block;content:'';border-top:6px solid #fff;border-right:6px solid transparent;border-left:6px solid transparent}.minicolors-position-top.minicolors-position-right .minicolors-panel:before{right:6px;left:auto}.minicolors-position-top.minicolors-position-right .minicolors-panel:after{right:7px;left:auto}.dropdown-submenu{position:relative;z-index:40}.dropdown-submenu>.dropdown-menu{top:50%;left:90%;margin-top:-6px;margin-left:-1px;border-radius:0 4px 4px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;border-radius:4px 4px 4px 0}.dropdown-submenu>a:after{position:relative;display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-5px;content:' ';opacity:.4;border-width:5px 0 5px 5px;border-style:solid;border-color:transparent transparent transparent #ccc;-moz-opacity:.4;filter:alpha(opacity: 40)}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.float-left{float:none!important}.dropdown-submenu.float-left>.dropdown-menu{left:-110%;margin-left:10px;border-radius:4px 0 4px 4px}.dropdown-submenu.float-left>.dropdown-menu.dropdown-dividers{margin-left:20px}.ui-menu-item{padding:3px 6px}.dropzone,.dropzone *,.dropzone-previews,.dropzone-previews *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.dropzone{padding:1em;border:1px solid rgba(0,0,0,.08);background:rgba(0,0,0,.02)}.dropzone.dz-clickable,.dropzone.dz-clickable .dz-message,.dropzone.dz-clickable .dz-message span{cursor:pointer}.dropzone.dz-clickable *{cursor:default}.dropzone .dz-message{opacity:1;-ms-filter:none;filter:none}.dropzone.dz-drag-hover{border-color:rgba(0,0,0,.15);background:rgba(0,0,0,.04)}.dropzone.dz-started .dz-message{display:none}.dropzone .dz-preview,.dropzone-previews .dz-preview{position:relative;display:inline-block;margin:17px;padding:6px;vertical-align:top;border:1px solid #acacac;background:rgba(255,255,255,.8)}.btn-file,.fileinput .btn,.fileinput .thumbnail,.fileinput-filename{vertical-align:middle}.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail],.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail]{display:none}.dropzone .dz-preview .dz-details,.dropzone-previews .dz-preview .dz-details{position:relative;width:100px;height:100px;margin-bottom:22px;padding:5px;background:#ebebeb}.dropzone .dz-preview .dz-details .dz-filename,.dropzone-previews .dz-preview .dz-details .dz-filename{overflow:hidden;height:100%}.dropzone .dz-preview .dz-details img,.dropzone-previews .dz-preview .dz-details img{position:absolute;top:0;left:0;width:100px;height:100px}.dropzone .dz-preview .dz-details .dz-size,.dropzone-previews .dz-preview .dz-details .dz-size{line-height:28px;position:absolute;bottom:-28px;left:3px;height:28px}.dropzone .dz-preview.dz-error .dz-error-mark,.dropzone .dz-preview.dz-success .dz-success-mark,.dropzone-previews .dz-preview.dz-error .dz-error-mark,.dropzone-previews .dz-preview.dz-success .dz-success-mark{display:block}.dropzone .dz-preview:hover .dz-details img,.dropzone-previews .dz-preview:hover .dz-details img{display:none}.dropzone .dz-preview .dz-error-mark,.dropzone .dz-preview .dz-success-mark,.dropzone-previews .dz-preview .dz-error-mark,.dropzone-previews .dz-preview .dz-success-mark{font-size:30px;position:absolute;top:-10px;right:-10px;display:none;width:40px;height:40px;text-align:center}.dropzone .dz-preview .dz-success-mark,.dropzone-previews .dz-preview .dz-success-mark{color:#8cc657}.dropzone .dz-preview .dz-error-mark,.dropzone-previews .dz-preview .dz-error-mark{color:#ee162d}.dropzone .dz-preview .dz-progress,.dropzone-previews .dz-preview .dz-progress{position:absolute;top:100px;right:6px;left:6px;display:none;height:6px;background:#d7d7d7}.dropzone .dz-preview .dz-progress .dz-upload,.dropzone-previews .dz-preview .dz-progress .dz-upload{position:absolute;top:0;bottom:0;left:0;width:0;background-color:#8cc657}.dropzone .dz-preview.dz-processing .dz-progress,.dropzone-previews .dz-preview.dz-processing .dz-progress{display:block}.dropzone .dz-preview .dz-error-message,.dropzone-previews .dz-preview .dz-error-message{position:absolute;z-index:500;top:-5px;left:-20px;display:none;min-width:140px;max-width:500px;padding:8px 10px;color:#800;background:rgba(245,245,245,.8)}.dropzone .dz-preview:hover.dz-error .dz-error-message,.dropzone-previews .dz-preview:hover.dz-error .dz-error-message{display:block}.dropzone{position:relative;min-height:350px;cursor:pointer}.dz-message{font-size:35px;line-height:50px;position:absolute;top:50%;left:50%;width:50%;height:50px;margin-top:-50px;margin-left:-25%;padding:25px;text-align:center}.btn-file{position:relative;overflow:hidden}.btn-file>input{position:absolute;top:0;right:0;width:100%;height:100%;margin:0;font-size:23px;cursor:pointer;filter:alpha(opacity=0);opacity:0;direction:ltr}.fileinput{display:inline-block;margin-bottom:9px}.fileinput .form-control{display:inline-block;padding-top:7px;padding-bottom:5px;margin-bottom:0;vertical-align:middle;cursor:text}.fileinput .thumbnail{display:inline-block;margin-bottom:5px;overflow:hidden;text-align:center}.fileinput .thumbnail>img{max-height:100%}.fileinput-exists .fileinput-new,.fileinput-new .fileinput-exists{display:none}.fileinput-inline .fileinput-controls{display:inline}.fileinput-filename{display:inline-block;overflow:hidden}.form-control .fileinput-filename{vertical-align:bottom}.fileinput.input-group{display:table}.fileinput.input-group>*{position:relative;z-index:2}.fileinput.input-group>.btn-file{z-index:1}.fileinput-new .input-group .btn-file,.fileinput-new.input-group .btn-file{border-radius:0 4px 4px 0}.fileinput-new .input-group .btn-file.btn-sm,.fileinput-new .input-group .btn-file.btn-xs,.fileinput-new.input-group .btn-file.btn-sm,.fileinput-new.input-group .btn-file.btn-xs{border-radius:0 3px 3px 0}.fileinput-new .input-group .btn-file.btn-lg,.fileinput-new.input-group .btn-file.btn-lg{border-radius:0 6px 6px 0}.form-group.has-warning .fileinput .fileinput-preview{color:#8a6d3b}.form-group.has-warning .fileinput .thumbnail{border-color:#faebcc}.form-group.has-error .fileinput .fileinput-preview{color:#a94442}.form-group.has-error .fileinput .thumbnail{border-color:#ebccd1}.form-group.has-success .fileinput .fileinput-preview{color:#3c763d}.form-group.has-success .fileinput .thumbnail{border-color:#d6e9c6}.bootstrap-switch{line-height:8px;position:relative;display:inline-block;overflow:hidden;min-width:100px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:left;vertical-align:middle;border:1px solid #ccc;border-radius:4px}.irs,.jcrop-tracker{-webkit-user-select:none}.bootstrap-switch.bootstrap-switch-mini{min-width:71px}.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label{font-size:10px;line-height:9px;padding-top:4px;padding-bottom:4px}.bootstrap-switch.bootstrap-switch-small{min-width:79px}.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label{font-size:12px;line-height:18px;padding-top:3px;padding-bottom:3px}.bootstrap-switch.bootstrap-switch-large{min-width:120px}.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label{font-size:14px;line-height:normal;padding-top:9px;padding-bottom:9px}.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container{-webkit-transition:margin-left .5s;transition:margin-left .5s}.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-container{margin-left:0}.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label{border-top-right-radius:3px;border-bottom-right-radius:3px}.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-container{margin-left:-50%}.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label{border-top-left-radius:3px;border-bottom-left-radius:3px}.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-container{margin-left:-25%}.bootstrap-switch.bootstrap-switch-disabled,.bootstrap-switch.bootstrap-switch-indeterminate,.bootstrap-switch.bootstrap-switch-readonly{cursor:default!important;opacity:.5;filter:alpha(opacity=50)}.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label{cursor:default!important}.bootstrap-switch.bootstrap-switch-focused{border-color:#ccc;outline:0}.bootstrap-switch .bootstrap-switch-container{top:0;display:inline-block;width:150%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-radius:4px}.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on,.bootstrap-switch .bootstrap-switch-label{font-size:12px;line-height:20px;text-transform:uppercase;display:inline-block!important;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:100%;padding-top:4px;padding-bottom:4px;cursor:pointer}div.switch-toggle,div.switch-toggle:after{display:block;background:#fff;border-radius:50px}.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on{z-index:1;width:33.333333333%;text-align:center}.bootstrap-switch .bootstrap-switch-label{z-index:100;width:33.333333333%;margin-top:-1px;margin-bottom:-1px;text-align:center;color:#333;background:#fff}.bootstrap-switch input[type=radio],.bootstrap-switch input[type=checkbox]{position:absolute!important;z-index:-1;top:0;left:0;opacity:0;filter:alpha(opacity=0)}.bootstrap-switch input[type=radio].form-control,.bootstrap-switch input[type=checkbox].form-control{height:auto}div.switch-toggle{height:24px;width:48px;position:relative;cursor:pointer;box-shadow:inset 0 0 1px rgba(0,0,0,.2);-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}div.switch-toggle:after,div.switch-toggle:before{position:absolute;content:''}div.switch-toggle:after{height:18px;width:18px;top:3px;left:3px;box-shadow:1px 1px 3px rgba(0,0,0,.3);-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}div.switch-toggle:before{right:1px;top:12px;color:#fff}.irs,.irs-line{position:relative;display:block}div.switch-toggle:hover:after{left:5px}div.switch-toggle.switch-on:before{content:'';right:40px}.switch-toggle.switch-on{background:#0c0}div.switch-toggle.switch-on:after{left:26px}div.switch-toggle.switch-on:hover:after{left:24px}.irs{-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.irs-line{overflow:hidden;outline:0!important}.irs-line-left,.irs-line-mid,.irs-line-right{position:absolute;display:block;top:0}.irs-line-left{left:0;width:11%}.irs-line-mid{left:9%;width:82%}.irs-line-right{right:0;width:11%}.irs-bar,.irs-shadow{position:absolute;width:0;left:0}.irs-bar{display:block}.irs-bar-edge{position:absolute;display:block;top:0;left:0}.irs-shadow{display:none}.irs-from,.irs-max,.irs-min,.irs-single,.irs-slider,.irs-to{display:block;position:absolute;cursor:default}.irs-slider{z-index:1}.irs-slider.type_last{z-index:2}.irs-min{left:0}.irs-max{right:0}.irs-from,.irs-single,.irs-to{top:0;left:0;white-space:nowrap}.irs-grid{position:absolute;display:none;bottom:0;left:0;width:100%;height:20px}.irs-with-grid .irs-grid{display:block}.irs-grid-pol{position:absolute;top:0;left:0;width:1px;height:8px;background:#000}.irs-grid-pol.small{height:4px}.irs-grid-text{position:absolute;bottom:0;left:0;white-space:nowrap;text-align:center;font-size:9px;line-height:9px;padding:0 3px;color:#000}.irs-disable-mask{position:absolute;display:block;top:0;left:-1%;width:102%;height:100%;cursor:default;background:rgba(0,0,0,0);z-index:2}.irs-disabled{opacity:.4}.lt-ie9 .irs-disabled{filter:alpha(opacity=40)}.irs-hidden-input{position:absolute!important;display:block!important;top:0!important;left:0!important;width:0!important;height:0!important;font-size:0!important;line-height:0!important;padding:0!important;margin:0!important;outline:0!important;z-index:-9999!important;background:0 0!important;border-style:solid!important;border-color:transparent!important}.jcrop-dragbar.ord-s,.jcrop-handle.ord-s,.jcrop-handle.ord-se,.jcrop-handle.ord-sw{margin-bottom:-4px;bottom:0}.jcrop-dragbar.ord-e,.jcrop-handle.ord-e,.jcrop-handle.ord-ne,.jcrop-handle.ord-se{right:0;margin-right:-4px}.modal,.modal-content,.note-air-editor,div.pp_pic_holder a:focus{outline:0}.jcrop-holder{text-align:left;direction:ltr}.jcrop-hline,.jcrop-vline{font-size:0;position:absolute;background:url(../../images/jcrop.gif) #fff}.jcrop-vline{width:1px!important;height:100%}.jcrop-vline.right{right:0}.jcrop-hline{width:100%;height:1px!important}.jcrop-hline.bottom{bottom:0}.jcrop-tracker{width:100%;height:100%;-webkit-tap-highlight-color:transparent}.jcrop-handle{font-size:1px;width:7px;height:7px;border:1px solid #eee;background-color:#333}.jcrop-handle.ord-n{top:0;left:50%;margin-top:-4px;margin-left:-4px}.jcrop-handle.ord-s{left:50%;margin-left:-4px}.jcrop-handle.ord-e{top:50%;margin-top:-4px}.jcrop-handle.ord-w{top:50%;left:0;margin-top:-4px;margin-left:-4px}.jcrop-handle.ord-nw{top:0;left:0;margin-top:-4px;margin-left:-4px}.jcrop-handle.ord-ne{top:0;margin-top:-4px}.jcrop-handle.ord-sw{left:0;margin-left:-4px}.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{width:100%;height:7px}.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{width:7px;height:100%}.jcrop-dragbar.ord-n{margin-top:-4px}.jcrop-dragbar.ord-w{margin-left:-4px}.jcrop-light .jcrop-hline,.jcrop-light .jcrop-vline{opacity:.7!important;background:#fff;filter:alpha(opacity=70)!important}.jcrop-light .jcrop-handle{border-color:#fff;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#000}.jcrop-dark .jcrop-hline,.jcrop-dark .jcrop-vline{opacity:.7!important;background:#000;filter:alpha(opacity=70)!important}.jcrop-dark .jcrop-handle{border-color:#000;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#fff}.solid-line .jcrop-hline,.solid-line .jcrop-vline{background:#fff}.jcrop-holder img,img.jcrop-preview{max-width:none}.jcrop-holder #preview-pane{position:absolute;z-index:2000;top:10px;right:-280px;display:block;padding:6px;border:1px solid rgba(0,0,0,.4);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;background-color:#fff}#preview-pane .preview-container{overflow:hidden;width:250px;height:170px}.jGrowl{z-index:9999;position:absolute}#loadingbar,body>.jGrowl{position:fixed}.jGrowl.top-left{top:0;left:0}.jGrowl.top-right{top:0;right:0}.jGrowl.bottom-left{bottom:0;left:0}.jGrowl.bottom-right{right:0;bottom:0}.jGrowl.center{top:50%;left:50%;width:0;margin-left:-170px}.center .jGrowl-closer,.center .jGrowl-notification{margin-right:auto;margin-left:auto}.jGrowl .jGrowl-closer,.jGrowl .jGrowl-notification{font-size:12px;display:none;zoom:1;width:300px;padding:10px 15px;white-space:normal;opacity:.95;filter:progid: DXImageTransform.Microsoft.Alpha(Opacity=95);margin:10px}.jGrowl .jGrowl-notification:hover{opacity:1;filter:progid: DXImageTransform.Microsoft.Alpha(Opacity=100)}.jGrowl .jGrowl-notification{min-height:20px}.jGrowl .jGrowl-notification .jGrowl-header{font-size:.85em;font-weight:700}.jGrowl .jGrowl-notification .jGrowl-close{font-weight:700;z-index:99;float:right;cursor:pointer}.jGrowl .jGrowl-closer{font-weight:700;cursor:pointer;text-align:center}#loadingbar{z-index:2147483647;top:0;left:-6px;width:1%;height:4px;-webkit-transition:all .5s ease-in-out;-moz-transition:all .5s ease-in-out;-ms-transition:all .5s ease-in-out;-o-transition:all .5s ease-in-out;transition:all .5s ease-in-out;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}#loadingbar.left{right:0;left:100%;width:100%}#loadingbar.up{top:100%;bottom:0;left:0;width:5px;height:100%}#loadingbar.down{left:0;width:5px;height:0}#loadingbar.waiting dd,#loadingbar.waiting dt{-webkit-animation:pulse 2s ease-out 0s infinite;-moz-animation:pulse 2s ease-out 0s infinite;-ms-animation:pulse 2s ease-out 0s infinite;-o-animation:pulse 2s ease-out 0s infinite;animation:pulse 2s ease-out 0s infinite}#loadingbar dt{right:-80px;clip:rect(-6px,90px,14px,-6px);width:180px;opacity:.6}#loadingbar dd{right:0;clip:rect(-6px,22px,14px,10px);width:20px;opacity:.6}#loadingbar dd,#loadingbar dt{position:absolute;top:0;height:2px;-webkit-border-radius:100%;-moz-border-radius:100%;border-radius:100%;-webkit-box-shadow:#ff6439 1px 0 6px 1px;-moz-box-shadow:#fa7753 1px 0 6px 1px;box-shadow:#ff6439 1px 0 6px 1px;-ms-box-shadow:#fa7753 1px 0 6px 1px}.jvectormap-label,.jvectormap-zoomin,.jvectormap-zoomout{position:absolute;border-radius:3px;padding:5px;border-width:1px;border-style:solid}#loadingbar.left dt{left:-4px;clip:rect(-6px,185px,14px,25px);width:180px;opacity:.6}#loadingbar.left dd{left:0;clip:rect(-6px,22px,14px,0);width:20px;margin:0;opacity:.6}#loadingbar.down dd,#loadingbar.down dt,#loadingbar.up dd,#loadingbar.up dt{right:auto;left:-5px;width:10px}#loadingbar.left dd,#loadingbar.left dt{top:0;height:2px}#loadingbar.down dt{top:auto;bottom:-47px;clip:rect(-6px,20px,130px,-6px);height:180px;opacity:.6}#loadingbar.down dd{top:auto;bottom:0;clip:rect(-6px,22px,20px,10px);height:20px;margin:0;opacity:.6}#loadingbar.up dt{top:-10px;bottom:auto;clip:rect(13px,20px,190px,-6px);height:180px;opacity:.6}#loadingbar.up dd{top:0;bottom:auto;clip:rect(-6px,22px,25px,10px);height:20px;margin:0;opacity:.6}@keyframes pulse{100%,30%{opacity:.6}60%{opacity:0}}@-moz-keyframes pulse{100%,30%{opacity:.6}60%{opacity:0}}@-ms-keyframes pulse{100%,30%{opacity:.6}60%{opacity:0}}@-webkit-keyframes pulse{100%,30%{opacity:.6}60%{opacity:0}}.jvectormap-label{display:none;font-size:12px;z-index:1200}.jvectormap-zoomin,.jvectormap-zoomout{left:10px;cursor:pointer;line-height:10px;text-align:center}.jvectormap-zoomin{top:10px}.jvectormap-zoomout{top:35px}.modal,.modal-backdrop{top:0;left:0;right:0;bottom:0}.wmd-panel{width:100%}.wmd-input{height:300px;width:100%;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box}.wmd-preview{width:100%;margin-top:20px}.wmd-panel .btn-toolbar{margin-bottom:0;padding:0 0 5px;width:100%}.fa-header:before{content:'H';font-family:arial,helvetica,sans-serif;font-weight:700}.wmd-prompt-background{background-color:#000}.wmd-prompt-dialog{border:1px solid #999;background-color:#F5F5F5}.wmd-prompt-dialog>div{font-size:.8em;font-family:arial,helvetica,sans-serif}.wmd-prompt-dialog>form>input[type=text]{border:1px solid #999;color:#000}.wmd-prompt-dialog>form>input[type=button]{border:1px solid #888;font-family:trebuchet MS,helvetica,sans-serif;font-size:.8em;font-weight:700}.wmd-button-group1{margin-left:5px!important}.wmd-button-bar{margin-bottom:5px}.close{font-size:21px;font-weight:700;line-height:1;float:right;opacity:.2;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20)}.close:focus,.close:hover{cursor:pointer;text-decoration:none;opacity:.5;color:#000;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;border:0;background:0 0;-webkit-appearance:none}.modal-open{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;z-index:1050;display:none;overflow:auto;overflow-y:scroll;-webkit-overflow-scrolling:touch}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px;border-radius:6px}.modal-content{position:relative;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;background-color:#fff;background-clip:padding-box;box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #dfe8f1}.modal-header .close{margin-top:2px}.modal-dialog{border:0;box-shadow:0 15px 45px rgba(0,0,0,.3)!important}.modal.display-block .modal-dialog{box-shadow:0 6px 25px rgba(0,0,0,.1)!important;-webkit-transform:translate(0,-20px);-ms-transform:translate(0,-20px);transform:translate(0,-20px)}.modal-title{line-height:1.42857143;margin:0}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #dfe8f1}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.display-block.modal{position:static;z-index:5;display:block;overflow:visible!important;opacity:1;-moz-opacity:1;filter:alpha(opacity: 100)}.display-block.modal .modal-dialog{margin-bottom:0}.modal-open #page-content-wrapper{z-index:inherit}.ms-container{position:relative}.ms-container .glyph-icon{font-size:20px;line-height:30px;position:absolute;top:50%;left:50%;width:30px;height:30px;margin:-15px 0 0 -15px;text-align:center}.ms-container:after{font-size:0;line-height:0;display:block;visibility:hidden;clear:both;height:0;min-height:0;content:'.'}.ms-container .ms-selectable,.ms-container .ms-selection{float:left;width:45%;color:#555;background:#fff}.ms-container .ms-selection{float:right}.ms-container .ms-list{position:relative;overflow-y:auto;height:200px;padding:5px 10px;border-width:1px;border-style:solid}.ms-list li{line-height:20px;margin:5px 0;padding:3px 10px}.ms-container ul{margin:0;padding:0;list-style-type:none}.ms-container .ms-optgroup-container{width:100%}.ms-container .ms-optgroup-label{line-height:20px;margin:0;padding:3px 10px;cursor:pointer}.ms-container li.ms-hover{cursor:pointer}.ms-container li.disabled{cursor:text}.fileinput-button{position:relative;overflow:hidden}.fileinput-button input{font-size:200px;position:absolute;top:0;right:0;margin:0;cursor:pointer;opacity:0;-ms-filter:'alpha(opacity=0)';direction:ltr}@media screen\9{.fileinput-button input{font-size:100%;height:100%;filter:alpha(opacity=0)}}.fileupload-buttonbar .btn,.fileupload-buttonbar .toggle{float:left;margin-right:10px;margin-bottom:5px}.fileupload-buttonbar .toggle{margin-top:7px;margin-left:10px}.template-upload .size{margin:0}.progress-animated .bar,.progress-animated .progress-bar{background:url(../images/animated-overlay.gif)!important;filter:none}.fileupload-process{display:none;float:right}.files .processing .preview,.fileupload-processing .fileupload-process{display:block;width:32px;height:32px;background:url(../images/loader-dark.gif) center no-repeat;background-size:contain}.files audio,.files video{max-width:300px}table.table td .toggle{margin:7px 10px 0 0}@media (max-width:767px){.files .btn span,.files .toggle,.fileupload-buttonbar .toggle{display:none}.files .name{width:80px;word-wrap:break-word}.files audio,.files video{max-width:80px}.files canvas,.files img{max-width:100%}}.blueimp-gallery,.blueimp-gallery>.slides>.slide>.slide-content{position:absolute;top:0;right:0;bottom:0;left:0;-moz-backface-visibility:hidden}.blueimp-gallery>.slides>.slide>.slide-content{margin:auto;width:auto;height:auto;max-width:100%;max-height:100%;opacity:1}.blueimp-gallery{position:fixed;z-index:999999;overflow:hidden;background:#000;background:rgba(0,0,0,.9);opacity:0;display:none;direction:ltr;-ms-touch-action:none;touch-action:none}.blueimp-gallery-carousel{position:relative;z-index:auto;margin:1em auto;padding-bottom:56.25%;box-shadow:0 0 10px #000;-ms-touch-action:pan-y;touch-action:pan-y}.blueimp-gallery-display{display:block;opacity:1}.blueimp-gallery>.slides{position:relative;height:100%;overflow:hidden}.blueimp-gallery-carousel>.slides{position:absolute}.blueimp-gallery>.slides>.slide{position:relative;float:left;height:100%;text-align:center;-webkit-transition-timing-function:cubic-bezier(.645,.045,.355,1);-moz-transition-timing-function:cubic-bezier(.645,.045,.355,1);-ms-transition-timing-function:cubic-bezier(.645,.045,.355,1);-o-transition-timing-function:cubic-bezier(.645,.045,.355,1);transition-timing-function:cubic-bezier(.645,.045,.355,1)}.blueimp-gallery,.blueimp-gallery>.slides>.slide>.slide-content{-webkit-transition:opacity .5s linear;-moz-transition:opacity .5s linear;-ms-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear}.blueimp-gallery>.slides>.slide-loading{background:url(../img/loading.gif) center no-repeat;background-size:64px 64px}.blueimp-gallery>.slides>.slide-loading>.slide-content{opacity:0}.blueimp-gallery>.slides>.slide-error{background:url(../img/error.png) center no-repeat}.blueimp-gallery>.slides>.slide-error>.slide-content{display:none}.blueimp-gallery>.next,.blueimp-gallery>.prev{position:absolute;top:50%;left:15px;width:40px;height:40px;margin-top:-23px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-decoration:none;text-shadow:0 0 2px #000;text-align:center;background:#222;background:rgba(0,0,0,.5);-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;cursor:pointer;display:none}.blueimp-gallery>.next{left:auto;right:15px}.blueimp-gallery>.close,.blueimp-gallery>.title{position:absolute;top:15px;left:15px;margin:0 40px 0 0;font-size:20px;line-height:30px;color:#fff;text-shadow:0 0 2px #000;opacity:.8;display:none}.blueimp-gallery>.close{padding:15px;right:15px;left:auto;margin:-15px;font-size:30px;text-decoration:none;cursor:pointer}.dd,.dd-list{padding:0;list-style:none}.blueimp-gallery>.play-pause{position:absolute;right:15px;bottom:15px;width:15px;height:15px;background:url(../img/play-pause.png) no-repeat;cursor:pointer;opacity:.5;display:none}.blueimp-gallery-playing>.play-pause{background-position:-15px 0}.blueimp-gallery>.close:hover,.blueimp-gallery>.next:hover,.blueimp-gallery>.play-pause:hover,.blueimp-gallery>.prev:hover,.blueimp-gallery>.title:hover{color:#fff;opacity:1}.blueimp-gallery-controls>.close,.blueimp-gallery-controls>.next,.blueimp-gallery-controls>.play-pause,.blueimp-gallery-controls>.prev,.blueimp-gallery-controls>.title{display:block;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.blueimp-gallery-left>.prev,.blueimp-gallery-right>.next,.blueimp-gallery-single>.next,.blueimp-gallery-single>.play-pause,.blueimp-gallery-single>.prev{display:none}.blueimp-gallery>.close,.blueimp-gallery>.next,.blueimp-gallery>.play-pause,.blueimp-gallery>.prev,.blueimp-gallery>.slides>.slide>.slide-content{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body:last-child .blueimp-gallery>.slides>.slide-error{background-image:url(../img/error.svg)}body:last-child .blueimp-gallery>.play-pause{width:20px;height:20px;background-size:40px 20px;background-image:url(../img/play-pause.svg)}body:last-child .blueimp-gallery-playing>.play-pause{background-position:-20px 0}.blueimp-gallery>.indicator{position:absolute;top:auto;right:15px;bottom:15px;left:15px;margin:0 40px;padding:0;list-style:none;text-align:center;line-height:10px;display:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.blueimp-gallery>.indicator>li{display:inline-block;width:9px;height:9px;margin:6px 3px 0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;border:1px solid transparent;background:#ccc;background:center no-repeat rgba(255,255,255,.25);border-radius:5px;box-shadow:0 0 2px #000;opacity:.5;cursor:pointer}.dd-empty,.dd-handle,.dd-placeholder{-moz-box-sizing:border-box;margin:5px 0}.blueimp-gallery>.indicator>.active,.blueimp-gallery>.indicator>li:hover{background-color:#fff;border-color:#fff;opacity:1}.blueimp-gallery-controls>.indicator{display:block;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.blueimp-gallery-single>.indicator,.blueimp-gallery>.slides>.slide>.video-content>video,.blueimp-gallery>.slides>.slide>.video-playing>a,.blueimp-gallery>.slides>.slide>.video-playing>img{display:none}.blueimp-gallery>.slides>.slide>.video-content>img{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;width:auto;height:auto;max-width:100%;max-height:100%;-moz-backface-visibility:hidden}.blueimp-gallery>.slides>.slide>.video-content>video{position:absolute;top:0;left:0;width:100%;height:100%}.blueimp-gallery>.slides>.slide>.video-content>iframe{position:absolute;top:100%;left:0;width:100%;height:100%;border:none}.blueimp-gallery>.slides>.slide>.video-playing>iframe{top:0}.blueimp-gallery>.slides>.slide>.video-content>a{position:absolute;top:50%;right:0;left:0;margin:-64px auto 0;width:128px;height:128px;background:url(../img/video-play.png) center no-repeat;opacity:.8;cursor:pointer}.dd,.dd-item>button,.dd-list{position:relative}.blueimp-gallery>.slides>.slide>.video-content>a:hover{opacity:1}.blueimp-gallery>.slides>.slide>.video-playing>video,.dd,.dd-list{display:block}.blueimp-gallery>.slides>.slide>.video-loading>a{background:url(../img/loading.gif) center no-repeat;background-size:64px 64px}body:last-child .blueimp-gallery>.slides>.slide>.video-content:not(.video-loading)>a{background-image:url(../img/video-play.svg)}.dd{font-size:13px;line-height:20px;margin:15px 0 0}.dd-list{margin:0}.dd-list .dd-list{padding-left:30px}.dd-collapsed .dd-list{display:none}.dd-empty,.dd-item,.dd-placeholder{font-size:13px;line-height:20px;position:relative;display:block;min-height:20px;margin:0;padding:0}.dd-handle{display:block;box-sizing:border-box;height:30px;padding:5px 10px;text-decoration:none;color:#333;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;background:#fafafa}.dd-handle:hover{background:#fff}.dd-item>button{font-size:12px;line-height:1;display:block;float:left;overflow:hidden;width:25px;height:20px;margin:5px 0;padding:0;cursor:pointer;text-align:center;white-space:nowrap;text-indent:100%;border:0;background:0 0}.dd-item>button:before{position:absolute;display:block;width:100%;content:'+';text-align:center;text-indent:0}.dd-item>button[data-action=collapse]:before{content:'-'}.dd-empty,.dd-placeholder{box-sizing:border-box;min-height:30px;padding:0;border:1px dashed #b6bcbf;background:#f2fbff}.dd-empty{min-height:100px;border:1px dashed #bbb;background-color:#dfe8f1;background-image:-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:-moz-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-moz-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-position:0 0,30px 30px;background-size:60px 60px}.dd-dragel{position:absolute;z-index:9999}.dd-dragel>.dd-item .dd-handle{margin-top:0}.dd-dragel .dd-handle{-webkit-box-shadow:2px 4px 6px 0 rgba(0,0,0,.1);box-shadow:2px 4px 6px 0 rgba(0,0,0,.1)}#nestable-menu{margin:0 0 15px;padding:0}#nestable-output,#nestable2-output{-moz-box-sizing:border-box;box-sizing:border-box;width:100%;height:7em}#nestable2 .dd-handle{color:#fff;border:1px solid #999;background:#bbb}#nestable2 .dd-handle:hover{background:#bbb}#nestable2 .dd-item>button:before{color:#fff}.dd-hover>.dd-handle{background:#2ea8e5!important}.dd3-content{display:block;-moz-box-sizing:border-box;box-sizing:border-box;height:30px;margin:5px 0;padding:5px 10px 5px 40px;text-decoration:none;color:#333;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;background:#fafafa}.dd3-content:hover{color:#2ea8e5;background:#fff}.dd3-handle,.dd3-handle:hover{background:#ddd}.dd-dragel>.dd3-item>.dd3-content{margin:0}.dd3-item>button{margin-left:30px}.dd3-handle{position:absolute;top:0;left:0;overflow:hidden;width:30px;margin:0;cursor:pointer;white-space:nowrap;text-indent:100%;border:1px solid #aaa;border-top-right-radius:0;border-bottom-right-radius:0}.dd3-handle:before{font-size:20px;font-weight:400;position:absolute;top:3px;left:0;display:block;width:100%;content:'≡';text-align:center;text-indent:0;color:#fff}.popover,.popover-title:empty{display:none}.datepicker-dropdown:after,.datepicker-dropdown:before,.form-wizard>ul>li a:before,.popover .arrow:after{content:''}.noty-wrapper{font-size:14px;font-weight:700;position:fixed;z-index:10000;left:0;width:100%;margin:0;padding:0;list-style:none;opacity:95;-moz-opacity:95;filter:alpha(opacity: 95)}.noty-wrapper:hover{opacity:1;-moz-opacity:1;filter:alpha(opacity: 100)}.noty_message{line-height:20px;padding:15px 10px;text-align:center}#noty_bottom{bottom:0}#noty_top{top:0}#noty_center{top:50%;left:50%}#noty_center li{margin:10px 0;border:0}.popover{z-index:1049;top:0;left:0;min-width:250px;margin:0;padding:0}.popover .popover-content{padding:15px}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{font-size:12px;font-weight:700;margin:0;padding:10px 15px;text-transform:uppercase;border-bottom-width:1px;border-bottom-style:solid}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-style:solid;border-color:transparent}.popover .arrow,.popover .arrow:after{border-width:10px}.popover.top .arrow{bottom:-22px;left:50%;margin-left:-11px}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:rgba(0,0,0,.2);border-bottom-width:0}.popover.right .arrow{top:50%;left:-22px;margin-top:-11px}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:rgba(0,0,0,.2);border-left-width:0}.popover.bottom .arrow{top:-22px;left:50%;margin-left:-11px}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:rgba(0,0,0,.2)}.popover.left .arrow{top:50%;right:-22px;margin-top:-11px}.popover.left .arrow:after{right:1px;bottom:-10px;border-right-width:0;border-left-color:rgba(0,0,0,.2)}.popover .dropdown-menu,.popover .nav-list{margin:0;border:0}.display-block.popover{box-shadow:0 0 0 transparent;float:none;width:auto;margin:15px}.fixed-header .popover{position:fixed;-webkit-transform:translate3d(0,0,0)}div.pp_default .pp_bottom,div.pp_default .pp_bottom .pp_left,div.pp_default .pp_bottom .pp_middle,div.pp_default .pp_bottom .pp_right,div.pp_default .pp_top,div.pp_default .pp_top .pp_left,div.pp_default .pp_top .pp_middle,div.pp_default .pp_top .pp_right{height:13px}div.pp_default .pp_top .pp_left{background:url(images/default/sprite.png) -78px -93px no-repeat}div.pp_default .pp_top .pp_middle{background:url(images/default/sprite_x.png) top left repeat-x}div.pp_default .pp_top .pp_right{background:url(images/default/sprite.png) -112px -93px no-repeat}div.pp_default .pp_content .ppt{color:#f8f8f8}div.pp_default .pp_content_container .pp_left{padding-left:13px;background:url(images/default/sprite_y.png) -7px 0 repeat-y}div.pp_default .pp_content_container .pp_right{padding-right:13px;background:url(images/default/sprite_y.png) top right repeat-y}div.pp_default .pp_content{background-color:#fff}div.pp_default .pp_next:hover{cursor:pointer;background:url(images/default/sprite_next.png) center right no-repeat}div.pp_default .pp_previous:hover{cursor:pointer;background:url(images/default/sprite_prev.png) center left no-repeat}div.pp_default .pp_expand{width:28px;height:28px;cursor:pointer;background:url(images/default/sprite.png) 0 -29px no-repeat}div.pp_default .pp_expand:hover{cursor:pointer;background:url(images/default/sprite.png) 0 -56px no-repeat}div.pp_default .pp_contract{width:28px;height:28px;cursor:pointer;background:url(images/default/sprite.png) 0 -84px no-repeat}div.pp_default .pp_contract:hover{cursor:pointer;background:url(images/default/sprite.png) 0 -113px no-repeat}div.pp_default .pp_close{width:30px;height:30px;cursor:pointer;background:url(images/default/sprite.png) 2px 1px no-repeat}div.pp_default #pp_full_res .pp_inline{color:#000}div.pp_default .pp_gallery ul li a{border:1px solid #aaa;background:url(images/default/default_thumb.png) center center #f8f8f8}div.pp_default .pp_gallery ul li a:hover,div.pp_default .pp_gallery ul li.selected a{border-color:#fff}div.pp_default .pp_social{margin-top:7px}div.pp_default .pp_gallery a.pp_arrow_next,div.pp_default .pp_gallery a.pp_arrow_previous{position:static;left:auto}div.pp_default .pp_nav .pp_pause,div.pp_default .pp_nav .pp_play{width:30px;height:30px;background:url(images/default/sprite.png) -51px 1px no-repeat}div.pp_default .pp_nav .pp_pause{background-position:-51px -29px}div.pp_default .pp_details{position:relative}div.pp_default a.pp_arrow_next,div.pp_default a.pp_arrow_previous{width:20px;height:20px;margin:4px 0 0;background:url(images/default/sprite.png) -31px -3px no-repeat}div.pp_default a.pp_arrow_next{left:52px;background-position:-82px -3px}div.pp_default .pp_content_container .pp_details{margin-top:5px}div.pp_default .pp_nav{position:relative;clear:none;width:110px;height:30px}div.pp_default .pp_nav .currentTextHolder{font-family:Georgia;font-size:11px;font-style:italic;line-height:25px;position:absolute;top:2px;left:75px;margin:0;padding:0 0 0 10px;color:#999}.progress-bar,.sb-slidebar .chat-box li a.chat-wrapper:hover,div.ppt{color:#fff}div.pp_default .pp_arrow_next:hover,div.pp_default .pp_arrow_previous:hover,div.pp_default .pp_close:hover,div.pp_default .pp_nav .pp_pause:hover,div.pp_default .pp_nav .pp_play:hover{opacity:.7}div.pp_default .pp_description{font-size:11px;font-weight:700;line-height:14px;margin:5px 50px 5px 0}div.pp_default .pp_bottom .pp_left{background:url(images/default/sprite.png) -78px -127px no-repeat}div.pp_default .pp_bottom .pp_middle{background:url(images/default/sprite_x.png) bottom left repeat-x}div.pp_default .pp_bottom .pp_right{background:url(images/default/sprite.png) -112px -127px no-repeat}div.pp_default .pp_loaderIcon{background:url(images/default/loader.gif) center center no-repeat}div.pp_overlay{position:absolute;z-index:9500;top:0;left:0;display:none;width:100%;background:#000}div.pp_pic_holder{position:absolute;z-index:10000;display:none;width:100px}.pp_top{position:relative;height:20px}* html .pp_top{padding:0 20px}.pp_top .pp_left{position:absolute;left:0;width:20px;height:20px}.pp_top .pp_middle{position:absolute;right:20px;left:20px;height:20px}* html .pp_top .pp_middle{position:static;left:0}.pp_top .pp_right{position:absolute;top:0;right:0;left:auto;width:20px;height:20px}.pp_content{min-width:40px;height:40px}* html .pp_content{width:40px}.pp_fade{display:none}.pp_content_container{position:relative;width:100%;text-align:left}.pp_content_container .pp_left{padding-left:20px}.pp_content_container .pp_right{padding-right:20px}.pp_content_container .pp_details{float:left;margin:10px 0 2px}.pp_description{display:none;margin:0}.pp_social{float:left;margin:0}.pp_social .facebook{float:left;overflow:hidden;width:55px;margin-left:5px}.pp_social .twitter{float:left}.pp_nav{float:left;clear:right;margin:3px 10px 0 0}.pp_nav p{float:left;margin:2px 4px;white-space:nowrap}.pp_nav .pp_pause,.pp_nav .pp_play{float:left;margin-right:4px;text-indent:-10000px}a.pp_arrow_next,a.pp_arrow_previous{display:block;float:left;overflow:hidden;width:14px;height:15px;margin-top:3px;text-indent:-10000px}.pp_hoverContainer{position:absolute;z-index:2000;top:0;width:100%}.pp_gallery{position:absolute;z-index:10000;left:50%;display:none;margin-top:-50px}.pp_gallery div{position:relative;float:left;overflow:hidden}.pp_gallery ul{position:relative;float:left;height:35px;margin:0 0 0 5px;padding:0;white-space:nowrap}a.pp_close,a.pp_contract,a.pp_expand{position:absolute;text-indent:-10000px}.pp_gallery ul a{display:block;float:left;overflow:hidden;height:33px;border:1px solid #000;border:1px solid rgba(0,0,0,.5)}.pp_gallery li.selected a,.pp_gallery ul a:hover{border-color:#fff}.pp_gallery ul a img{border:0}.pp_gallery li{display:block;float:left;margin:0 5px 0 0;padding:0}.pp_gallery li.default a{display:block;width:50px;height:33px;background:url(images/facebook/default_thumbnail.gif) no-repeat}.pp_gallery li.default a img{display:none}.pp_gallery .pp_arrow_next,.pp_gallery .pp_arrow_previous{margin-top:7px!important}a.pp_contract,a.pp_expand{z-index:20000;top:10px;right:30px;display:none;width:20px;height:20px;cursor:pointer}a.pp_close{line-height:22px;top:0;right:0;display:block}.pp_bottom{position:relative;height:20px}* html .pp_bottom{padding:0 20px}.pp_bottom .pp_left{position:absolute;left:0;width:20px;height:20px}.pp_bottom .pp_middle{position:absolute;right:20px;left:20px;height:20px}* html .pp_bottom .pp_middle{position:static;left:0}.pp_bottom .pp_right{position:absolute;top:0;right:0;left:auto;width:20px;height:20px}.pp_loaderIcon{position:absolute;top:50%;left:50%;display:block;width:24px;height:24px;margin:-12px 0 0 -12px}#pp_full_res{line-height:1!important}#pp_full_res .pp_inline{text-align:left}#pp_full_res .pp_inline p{margin:0 0 15px}div.ppt{font-size:17px;z-index:9999;display:none;margin:0 0 5px 15px}.progress,.progress-bar,.progress-label,.progress-overlay,.progressbar,.progressbar-value{font-weight:700;line-height:20px;height:20px;border-radius:4px}.progress,.progressbar{position:relative;text-align:center;background:rgba(0,0,0,.05);box-shadow:inset 1px 1px 3px rgba(0,0,0,.2)}.progress-bar,.progress-label,.progress-overlay,.progressbar-value{position:absolute;z-index:4;top:0;left:0;overflow:hidden}.progress .progress-bar{position:relative!important;border-radius:0}.progressbar-value.ui-state-default,.progressbar-value.ui-state-default .progress-label{line-height:18px;height:18px}.progress-label{z-index:6;width:100%}.progress-overlay{z-index:5;width:100%;opacity:.15;background:url(../../images/animated-overlay.gif);filter:alpha(opacity=15)}.progressbar-small .progress-label,.progressbar-small .progress-overlay,.progressbar-small .progressbar-value,.progressbar-small.progressbar{height:10px}.progressbar-small .progressbar-value.ui-state-default{height:8px}.progressbar-smaller .progress-label,.progressbar-smaller .progress-overlay,.progressbar-smaller .progressbar-value,.progressbar-smaller.progressbar{height:4px}.progressbar-smaller .progressbar-value.ui-state-default{height:2px}.bg-black .progress-overlay{opacity:1;filter:alpha(opacity=100)}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;border-radius:4px;background-color:#f5f5f5;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{font-size:12px;line-height:20px;float:left;width:0;height:100%;-webkit-transition:width .6s ease;transition:width .6s ease;text-align:center;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15)}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.ui-rangeSlider{height:50px;padding-top:30px}.ui-rangeSlider-withArrows .ui-rangeSlider-container{margin:0 15px}.ui-rangeSlider-disabled.ui-rangeSlider-noArrow .ui-rangeSlider-container{border-color:#8490a3}.ui-rangeSlider-arrow,.ui-rangeSlider-container{height:20px}.ui-rangeSlider-arrow{width:14px;cursor:pointer}.ui-rangeSlider-leftArrow{border-radius:4px 0 0 4px}.ui-rangeSlider-rightArrow{border-radius:0 4px 4px 0}.ui-rangeSlider-arrow-inner{position:absolute;top:50%;width:0;height:0;margin-top:-5px;border:5px solid transparent}.ui-rangeSlider-leftArrow .ui-rangeSlider-arrow-inner{left:0;margin-left:-1px;border-right:5px solid #666}.ui-rangeSlider-leftArrow:hover .ui-rangeSlider-arrow-inner{border-right:5px solid #333}.ui-rangeSlider-rightArrow .ui-rangeSlider-arrow-inner{right:0;margin-right:-1px;border-left:5px solid #666}.ui-rangeSlider-rightArrow:hover .ui-rangeSlider-arrow-inner{border-left:5px solid #333}.ui-rangeSlider-innerBar{left:-10px;overflow:hidden;width:110%;height:100%}.ui-rangeSlider-bar{height:18px;margin:1px 0;cursor:move;cursor:grab;cursor:-moz-grab}.ui-rangeSlider-disabled .ui-rangeSlider-bar{background:#93aeca}.ui-rangeSlider-handle{width:10px;height:30px;cursor:col-resize;background:0 0}.ui-rangeSlider-label{font-size:15px;bottom:27px;padding:5px 10px;cursor:col-resize;color:#fff;background-color:rgba(0,0,0,.7)}.ui-rangeSlider-label:active,.ui-rangeSlider-label:hover{background:#000}.ui-rangeSlider-label-inner{position:absolute;z-index:99;top:100%;left:50%;display:block;margin-left:-5px;border-top:5px solid rgba(0,0,0,.7);border-right:5px solid transparent;border-left:5px solid transparent}.sb-left,.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-rangeSlider-label:active .ui-rangeSlider-label-inner,.ui-rangeSlider-label:hover .ui-rangeSlider-label-inner{border-top:5px solid #000}.ui-editRangeSlider-inputValue{font-size:15px;width:2em;text-align:center;border:0}#sb-site,.sb-site-container,.sb-slidebar,body,html{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}html.sb-scroll-lock.sb-active:not(.sb-static){overflow:hidden}#sb-site .sb-overlay{display:none}.sb-active #sb-site .sb-overlay{display:block}#sb-site,.sb-site-container{position:relative;width:100%}.sb-slidebar{position:fixed;z-index:0;top:0;display:none;overflow-y:auto;height:100%;overflow-x:hidden;-webkit-transform:translate(0);width:30%}.sb-slidebar.sb-right.sb-active{right:-3px}.sb-right{right:0}.sb-slidebar .scrollable-content{height:100%}.sb-slidebar.sb-static,html.sb-static .sb-slidebar{position:absolute}.sb-slidebar.sb-active{display:block}.sb-style-overlay{z-index:9999}.sb-momentum-scrolling{-webkit-overflow-scrolling:touch}.sb-width-thin{width:15%}.sb-width-wide{width:45%}@media (max-width:480px){.sb-slidebar{width:70%}.sb-width-thin{width:55%}.sb-width-wide{width:85%}}@media (min-width:481px){.sb-slidebar{width:55%}.sb-width-thin{width:40%}.sb-width-wide{width:70%}}@media (min-width:768px){.sb-slidebar{width:40%}.sb-width-thin{width:25%}.sb-width-wide{width:55%}}@media (min-width:992px){.sb-slidebar{width:30%}.sb-width-thin{width:15%}.sb-width-wide{width:45%}}@media (min-width:1200px){.sb-slidebar{width:350px}.sb-width-thin{width:5%}.sb-width-wide{width:35%}}#sb-site,.sb-site-container,.sb-slide,.sb-slidebar{-webkit-transition:-webkit-transform .4s ease;-moz-transition:-moz-transform .4s ease;-o-transition:-o-transform .4s ease;transition:transform .4s ease;-webkit-transition-property:-webkit-transform,left,right;-webkit-backface-visibility:hidden}.sb-hide{display:none}.sb-slidebar .popover-title{font-size:13px;font-size:11px;line-height:36px;display:block;height:36px;margin:2px 0;padding:0 15px;border-width:0}.sb-slidebar .divider{background:rgba(255,255,255,.1)}.sb-slidebar.sb-left .divider-header{font-size:14px;opacity:.4}.sb-slidebar .popover-title .caret{float:right;margin-top:17px}.sb-slidebar .progress-box li a{display:block;padding:0}.sb-slidebar .files-box{padding:10px 0}.sb-slidebar .files-box li.divider{margin:5px 0;padding:0}.sb-slidebar .notifications-box li,.sb-slidebar .progress-box li{padding:15px;border-color:rgba(255,255,255,.1)}.sb-slidebar .notifications-box li:last-child,.sb-slidebar .progress-box li:last-child{padding-bottom:20px}.sb-slidebar .notifications-box-alt li:first-child{padding-top:15px}.sb-slidebar ul.chat-box{margin:0;padding:0;list-style:none}.sb-slidebar .chat-box li{position:relative;margin:15px;padding:0}.sb-slidebar .chat-box li a.chat-wrapper{display:block;padding:10px}.sb-slidebar .chat-box li a.btn-md{position:absolute;top:50%;right:0;margin-top:-17px;padding:0 10px}.sb-slidebar .chat-box li a.btn-md .glyph-icon{opacity:.5}.sb-slidebar .chat-box li .status-badge{float:left;margin:0 10px 0 0}.sb-slidebar .chat-box li b{font-size:12px;display:block;padding:4px 0 0}.sb-slidebar .chat-box li p{font-size:11px;opacity:.6}.popover-title:hover{text-decoration:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle,.ui-slider .ui-slider-range,.ui-slider-horizontal,.ui-slider-vertical{-webkit-border-radius:100px;-moz-border-radius:100px;border-radius:100px}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:8px;height:8px;border:6px solid #FFF;box-sizing:initial;cursor:pointer;box-shadow:1px 1px 3px rgba(0,0,0,.3)}.ui-slider .ui-slider-handle:active,.ui-slider .ui-slider-handle:hover{border-color:#fff}.ui-slider .ui-slider-range{position:absolute;z-index:1;display:block;border:0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:7px;background:#ddd;-webkit-box-shadow:inset 0 1px 6px #717171;-moz-box-shadow:inset 0 1px 6px #717171;box-shadow:inset 0 1px 6px #717171}.ui-slider-horizontal .ui-slider-handle{top:-7px;margin-left:-7px}.ui-slider-horizontal .ui-slider-range{top:0;height:100%;opacity:.6;-moz-opacity:.6;filter:alpha(opacity: 60)}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:7px;height:100px;background:#ddd;-webkit-box-shadow:inset 1px 0 6px #717171;-moz-box-shadow:inset 1px 0 6px #717171;box-shadow:inset 1px 0 6px #717171}.ui-slider-vertical .ui-slider-handle{left:-7px;margin-bottom:-8px;margin-left:0}.ui-slider-vertical .ui-slider-range{left:0;width:100%;opacity:.6;-moz-opacity:.6;filter:alpha(opacity: 60)}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.note-editor{border:1px solid #bfc8d1}.note-editor .note-dropzone{position:absolute;z-index:1;display:none;opacity:.95;color:#87cefa;border:2px dashed #87cefa;background-color:#fff;pointer-event:none}.note-editor .note-dropzone .note-dropzone-message{font-size:28px;font-weight:700;display:table-cell;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf;border:2px dashed #098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-toolbar{border-bottom:1px solid #bfc8d1;background-color:#FEFEFF}.note-editor.fullscreen{position:fixed;z-index:1050;top:0;left:0;width:100%}.note-editor.fullscreen .note-editable{background-color:#fff}.note-editor.codeview .note-editable,.note-editor.fullscreen .note-resizebar{display:none}.note-editor.codeview .note-codable{display:block}.note-editor .note-statusbar{background-color:#FEFEFF}.note-editor .note-statusbar .note-resizebar{width:100%;height:8px;cursor:s-resize;border-top:1px solid #bfc8d1}.note-editor .note-statusbar .note-resizebar .note-icon-bar{width:20px;margin:1px auto;border-top:1px solid #bfc8d1}.note-editor .note-editable{overflow:auto;padding:10px;outline:0}.note-editor .note-editable[contenteditable=false]{background-color:#dfe8f1}.note-editor .note-codable{font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;display:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-bottom:0;padding:10px;resize:none;color:#ccc;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background-color:#222;box-shadow:none;-ms-box-sizing:border-box}.note-popover .popover{max-width:none}.note-popover .popover .popover-content a{display:inline-block;overflow:hidden;max-width:200px;vertical-align:middle;white-space:nowrap;text-overflow:ellipsis}.editable-buttons,.editable-input,.note-dialog .note-help-dialog .note-shortcut-layout td{vertical-align:top}.note-popover .popover .arrow{left:20px}.note-popover .popover .popover-content,.note-toolbar{margin:0;padding:0 0 5px 5px}.note-popover .popover .popover-content>.btn-group,.note-toolbar>.btn-group{margin-top:5px;margin-right:5px;margin-left:0}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group,.note-popover .popover .popover-content .note-style blockquote,.note-popover .popover .popover-content .note-style h1,.note-popover .popover .popover-content .note-style h2,.note-popover .popover .popover-content .note-style h3,.note-popover .popover .popover-content .note-style h4,.note-popover .popover .popover-content .note-style h5,.note-popover .popover .popover-content .note-style h6,.note-toolbar .note-color .dropdown-menu .btn-group,.note-toolbar .note-style blockquote,.note-toolbar .note-style h1,.note-toolbar .note-style h2,.note-toolbar .note-style h3,.note-toolbar .note-style h4,.note-toolbar .note-style h5,.note-toolbar .note-style h6{margin:0}.note-popover .popover .popover-content .note-table .dropdown-menu,.note-toolbar .note-table .dropdown-menu{min-width:0;padding:5px}.note-popover .popover .popover-content .note-table .dropdown-menu .note-dimension-picker,.note-toolbar .note-table .dropdown-menu .note-dimension-picker{font-size:18px}.note-popover .popover .popover-content .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-mousecatcher,.note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute!important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover .popover-content .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-unhighlighted,.note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative!important;z-index:1;width:5em;height:5em;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC)}.note-popover .popover .popover-content .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-highlighted,.note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-highlighted{position:absolute!important;z-index:2;width:1em;height:1em;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC)}.note-popover .popover .popover-content .note-color .dropdown-toggle,.note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover .popover-content .note-color .dropdown-menu,.note-toolbar .note-color .dropdown-menu{min-width:290px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group:first-child,.note-toolbar .note-color .dropdown-menu .btn-group:first-child{margin:0 5px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-palette-title,.note-toolbar .note-color .dropdown-menu .btn-group .note-palette-title{font-size:12px;margin:2px 7px;text-align:center;border-bottom:1px solid #eee}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset,.note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset{font-size:12px;margin:5px;padding:0 3px;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset:hover,.note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset:hover{background:#eee}.note-popover .popover .popover-content .note-para .dropdown-menu,.note-toolbar .note-para .dropdown-menu{min-width:216px;padding:5px}.note-popover .popover .popover-content .note-para .dropdown-menu>div:first-child,.note-toolbar .note-para .dropdown-menu>div:first-child{margin-right:5px}.note-popover .popover .popover-content .dropdown-menu,.note-toolbar .dropdown-menu{min-width:90px}.note-popover .popover .popover-content .dropdown-menu.right,.note-toolbar .dropdown-menu.right{right:0;left:auto}.note-popover .popover .popover-content .dropdown-menu.right::before,.note-toolbar .dropdown-menu.right::before{right:9px;left:auto!important}.note-popover .popover .popover-content .dropdown-menu.right::after,.note-toolbar .dropdown-menu.right::after{right:10px;left:auto!important}.note-popover .popover .popover-content .dropdown-menu li a i,.note-toolbar .dropdown-menu li a i{visibility:hidden;color:#00bfff}.note-popover .popover .popover-content .dropdown-menu li a.checked i,.note-toolbar .dropdown-menu li a.checked i,.tooltip{visibility:visible}.note-popover .popover .popover-content .note-fontsize-10,.note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover .popover-content .note-color-palette,.note-toolbar .note-color-palette{line-height:1}.note-popover .popover .popover-content .note-color-palette div .note-color-btn,.note-toolbar .note-color-palette div .note-color-btn{width:17px;height:17px;margin:0;padding:0;border:1px solid #fff}.note-popover .popover .popover-content .note-color-palette div .note-color-btn:hover,.note-toolbar .note-color-palette div .note-color-btn:hover{border:1px solid #000}.note-dialog>div{display:none}.note-dialog .note-image-dialog .note-dropzone{font-size:30px;line-height:4;min-height:100px;margin-bottom:10px;text-align:center;color:#d3d3d3;border:4px dashed #d3d3d3}.note-dialog .note-help-dialog{font-size:12px;opacity:.9;color:#ccc;border:0;background:0 0;background-color:#222!important;-webkit-opacity:.9;-khtml-opacity:.9;-moz-opacity:.9;-ms-filter:alpha(opacity=90);filter:alpha(opacity=90)}.note-dialog .note-help-dialog .modal-content{border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:0 0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.note-dialog .note-help-dialog a{font-size:12px;color:#fff}.note-dialog .note-help-dialog .title{font-size:14px;font-weight:700;padding-bottom:5px;color:#fff;border-bottom:#fff 1px solid}.note-dialog .note-help-dialog .modal-close{font-size:14px;cursor:pointer;color:#dd0}.note-dialog .note-help-dialog .note-shortcut-layout{width:100%}.note-dialog .note-help-dialog .note-shortcut{margin-top:8px}.note-dialog .note-help-dialog .note-shortcut th{font-size:13px;text-align:left;color:#dd0}.note-dialog .note-help-dialog .note-shortcut td:first-child{font-family:'Courier New';min-width:110px;padding-right:10px;text-align:right;color:#dd0}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid #000}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;opacity:.3;background-color:#000;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;-ms-filter:alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle,.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid #000}.note-handle .note-control-selection .note-control-sizing{width:7px;height:7px;border:1px solid #000;background-color:#fff}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:0;border-bottom:0}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:0;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:0;border-right:0}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-selection-info{font-size:12px;right:0;bottom:0;margin:5px;padding:5px;opacity:.7;color:#fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background-color:#000;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;-ms-filter:alpha(opacity=70);filter:alpha(opacity=70)}.ui-tabs-nav{margin:0;padding:0;list-style:none;border-bottom:1px solid transparent}.ui-tabs-nav li>a{line-height:32px;height:32px;margin-right:5px;padding:0 20px;border-bottom:0}.ui-tabs-nav li{margin-bottom:-1px}.ui-tabs-panel{display:block;padding:15px;background:0 0}.ui-tabs-panel:last-child{border-bottom:0!important}.ui-tabs-nav>li,.ui-tabs-nav>li>a{position:relative;float:left}.ui-tabs-nav>li>a .float-left.glyph-icon{float:none!important;margin-right:5px}.ui-tabs-nav>li>a .float-right.glyph-icon{float:none!important;margin-right:0;margin-left:5px}.tabs-navigation>ul{margin:0;padding:0;border-width:1px;border-style:solid;border-radius:0;background:#fff}.tabs-navigation>ul li{margin:0}.tabs-navigation>ul li>a{font-size:20px;line-height:64px;height:64px;margin:0!important;padding:0 35px;border-right-width:1px;border-right-style:solid;border-radius:0;background:0 0}.tabs-navigation>ul li.ui-tabs-active a{line-height:64px;height:64px;margin:0!important;padding-bottom:0;color:#000!important;background:#eff4f6}.tabs-navigation>ul li.ui-tabs-active a:hover,.tabs-navigation>ul li>a:hover{background:#eff4f6}#theme-options{position:fixed;top:110px;right:-300px;z-index:9999;width:300px;-webkit-transition:transform .5s ease;-o-transition:transform .5s ease;transition:transform .5s ease}.btn.theme-switcher,.theme-switcher .glyph-icon{width:54px;height:50px;line-height:50px;display:block}#theme-options.active{transform:translateX(-300px);-ms-transform:translateX(-300px);-o-transform:translateX(-300px);-webkit-transform:translateX(-300px)}.btn.theme-switcher{font-size:27px;border-width:1px;border-style:solid;border-right:0;border-radius:3px 0 0 3px;text-align:center;position:absolute;left:-54px;top:25px;z-index:55;padding:0}#theme-switcher-wrapper,#theme-switcher-wrapper .header:first-child{border-top-left-radius:3px}#theme-switcher-wrapper{background:#fff;width:300px;padding:0;border-bottom-left-radius:3px;position:relative;z-index:60;-webkit-transition:transform .5s ease;-o-transition:transform .5s ease;transition:transform .5s ease;max-height:580px}#theme-options.active #theme-switcher-wrapper{box-shadow:0 4px 5px rgba(0,0,0,.3)}#theme-switcher-wrapper .header{background:#FEFEFF;border-top:#dfe8f1 solid 1px;border-bottom:#dfe8f1 solid 1px;text-transform:uppercase;padding:13px 15px 10px;font-size:12px}#theme-switcher-wrapper .header a{font-weight:700;text-transform:capitalize;float:right}#theme-switcher-wrapper ul+.header{border-radius:0}#theme-switcher-wrapper ul li{height:34px;line-height:28px;margin:5px 0;padding:0 15px;border-bottom:#dfe8f1 solid 1px}#theme-switcher-wrapper ul li:last-child{border-bottom:0;margin-bottom:0}#theme-switcher-wrapper ul li label{font-size:13px}.tocify-subheader li,.tooltip{font-size:12px}#theme-switcher-wrapper ul li .switch-toggle{float:right;margin-top:3px}.theme-color-wrapper h5{text-transform:capitalize;font-weight:700;font-size:12px;margin:0 5px 5px}.theme-color-wrapper{padding:10px}.theme-color-wrapper a{height:24px;width:24px;display:block;overflow:hidden;text-indent:-999em;float:left;margin:2px;border-radius:50px;border:2px solid #fff!important;box-shadow:1px 2px 3px rgba(0,0,0,.1);opacity:.8}.theme-color-wrapper a.active,.theme-color-wrapper a:hover{opacity:1;border-color:red!important}.bootstrap-timepicker{position:relative}.dropdown.bootstrap-timepicker{float:none}.bootstrap-timepicker-widget.dropdown-menu.open{display:inline-block;padding:10px}.bootstrap-timepicker-widget table{width:100%;margin:0}.bootstrap-timepicker-widget table td{line-height:32px;width:42px;height:32px}.bootstrap-timepicker-widget table td.separator{width:auto;padding:0 5px}.bootstrap-timepicker-widget table td a{display:block;text-align:center}.bootstrap-timepicker-widget table td a i{margin:0 auto}.bootstrap-timepicker-widget table td input{width:100%;min-width:32px;margin:0;padding:0 5px;text-align:center}.bootstrap-timepicker-widget table td input.bootstrap-timepicker-meridian{font-weight:700}.tocify{margin-top:20px}.tocify li,.tocify ul{list-style:none;margin:0;padding:0;border:none;line-height:30px}.tocify-header{text-indent:10px}.tocify-item{margin-bottom:5px!important}.tocify-subheader{text-indent:20px;display:none}.tocify-subheader .tocify-subheader{text-indent:30px}.tocify-subheader .tocify-subheader .tocify-subheader{text-indent:40px}.nav-list .nav-header,.nav-list>li>a{margin:0}.nav-list>li>a{padding:5px}.tooltip{line-height:1.4;position:absolute;z-index:1030;display:block;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:8px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-8px;padding:0 5px}.tooltip-inner{max-width:200px;padding:10px 15px;text-align:center;text-decoration:none;color:#fff;background-color:rgba(0,0,0,.9)}.tooltip-arrow{position:absolute;width:0;height:0;border-style:solid;border-color:transparent}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,.9)}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:rgba(0,0,0,.9)}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:rgba(0,0,0,.9)}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,.9)}.bootstrap-touchspin .input-group-btn-vertical{position:relative;white-space:nowrap;width:1%;vertical-align:middle;display:table-cell}.bootstrap-touchspin .input-group-btn-vertical>.btn{display:block;float:none;width:100%;max-width:100%;padding:8px 10px;margin-left:-1px;height:auto;position:relative;overflow:hidden}.bootstrap-touchspin .input-group-btn-vertical .bootstrap-touchspin-up{border-radius:0 4px 0 0}.bootstrap-touchspin .input-group-btn-vertical .bootstrap-touchspin-down{margin-top:-2px;border-radius:0 0 4px}.bootstrap-touchspin .input-group-btn-vertical i{position:absolute;top:-8px;left:11px;font-size:9px;font-weight:400}div[id^=uniform-],div[id^=uniform-] input,div[id^=uniform-] span{line-height:18px;display:block;float:left;width:auto;width:20px;height:auto;height:20px;margin:0 3px 0 0;padding:0;cursor:pointer}div[id^=uniform-]{margin-right:10px;opacity:.9;filter:alpha(opacity=90);-moz-opacity:90}div[id^=uniform-] span{position:relative;display:-moz-inline-box;display:inline-block;zoom:1;margin-top:-1px;text-align:center;border-width:1px;border-style:solid}div.radio[id^=uniform-]>span{margin-top:-7px}.input-group-addon div[id^=uniform-] span i,div[id^=uniform-] span i{display:none}div[id^=uniform-] span.checked i{font-size:14px;line-height:18px;display:block;height:18px}div.radio[id^=uniform-] span.checked i{font-size:9px}div.radio[id^=uniform-] span{border-radius:50px}div[id^=uniform-] input{position:absolute;top:0;left:0;display:-moz-inline-box;display:inline-block;zoom:1;opacity:0;border:none;background:0 0;filter:alpha(opacity=0);-moz-opacity:0}div.checker[id^=uniform-] label{line-height:19px}div.selector{line-height:38px;position:relative;display:block;overflow:hidden;width:auto!important;height:38px;margin:0;padding:0 10px!important;cursor:pointer;white-space:nowrap;text-decoration:none;border-width:1px;border-style:solid}.selector i,div.selector span{line-height:38px;display:block;height:38px;padding:0!important}.selector i{position:absolute;z-index:4;top:50%;right:0;width:38px;margin-top:-19px;text-align:center;border-left:1px solid transparent}div.selector select{position:absolute;z-index:5;top:0;left:0;width:100%;height:38px;opacity:0;border:none;background:0 0;filter:alpha(opacity=0);-moz-opacity:0}div.selector span{width:auto!important}.form-wizard>ul{position:relative;display:table;width:100%;margin:0 0 20px;list-style:none}.form-wizard>ul>li{display:table-cell;width:1%;text-align:center}.form-wizard>ul>li a,.form-wizard>ul>li a:hover{position:relative;display:block;opacity:1;color:#666;-moz-opacity:1;filter:alpha(opacity: 100)}.form-wizard>ul>li a:before{position:absolute;z-index:4;top:20px;left:0;width:100%;height:4px;background:#ccc}.form-wizard>ul>li:first-child a:before{left:50%}.form-wizard>ul>li:last-child a:before{right:50%;left:auto;width:50%}.form-wizard>ul>li a .wizard-step{font-size:16px;line-height:42px;position:relative;z-index:5;display:block;width:40px;height:40px;margin:0 auto 5px;cursor:pointer;text-align:center;color:#fafafa;border-radius:100px;background:#ccc}.form-wizard>ul>li a .wizard-description{font-size:13px;font-weight:700;opacity:.6;-moz-opacity:.6;filter:alpha(opacity: 60)}.form-wizard>ul>li a .wizard-description small{font-size:12px;font-weight:400;display:block;padding:3px 0 0;opacity:.7;-moz-opacity:.7;filter:alpha(opacity: 70)}.form-wizard>ul>li a .wizard-description:hover,.form-wizard>ul>li.active a .wizard-description{opacity:1;-moz-opacity:1;filter:alpha(opacity: 100)}.form-wizard>ul>li a.disabled .wizard-step{background:#ccc}.loader,.msgBox{display:none}.actionBar{margin-top:20px;margin-bottom:20px;padding:20px 0 0;border-top:#ddd solid 1px}.actionBar a.btn{float:right;margin-left:10px}/*! X-editable - v1.5.1 + */table.dataTable thead th{position:relative;background-image:none!important}table.dataTable thead th.sorting:after,table.dataTable thead th.sorting_asc:after,table.dataTable thead th.sorting_desc:after{position:absolute;top:12px;right:8px;display:block;font-family:FontAwesome}table.dataTable thead th.sorting:after{content:"\f0dc";font-size:13px}table.dataTable thead th.sorting_asc:after{content:"\f0de"}table.dataTable thead th.sorting_desc:after{content:"\f0dd"}table.table thead th.sorting:after,table.table thead th.sorting_asc:after,table.table thead th.sorting_desc:after{top:12px}div.dataTables_paginate a.paginate_button.first,div.dataTables_paginate a.paginate_button.previous{position:relative;padding-left:24px}div.dataTables_paginate a.paginate_button.last,div.dataTables_paginate a.paginate_button.next{position:relative;padding-right:24px}div.dataTables_paginate a.first:before,div.dataTables_paginate a.previous:before{position:absolute;top:8px;left:10px;display:block;font-family:FontAwesome}div.dataTables_paginate a.last:after,div.dataTables_paginate a.next:after{position:absolute;top:8px;right:10px;display:block;font-family:FontAwesome}div.dataTables_paginate a.first:before{content:"\f100"}div.dataTables_paginate a.previous:before{content:"\f104"}div.dataTables_paginate a.next:after{content:"\f105"}div.dataTables_paginate a.last:after{content:"\f101"}div.dataTables_paginate li.first>a,div.dataTables_paginate li.previous>a{position:relative;padding-left:24px}div.dataTables_paginate li.last>a,div.dataTables_paginate li.next>a{position:relative;padding-right:24px}div.dataTables_paginate li.first a:before,div.dataTables_paginate li.previous a:before{position:absolute;top:6px;left:10px;display:block;font-family:FontAwesome}div.dataTables_paginate li.last a:after,div.dataTables_paginate li.next a:after{position:absolute;top:6px;right:10px;display:block;font-family:FontAwesome}div.dataTables_paginate li.first a:before{content:"\f100"}div.dataTables_paginate li.previous a:before{content:"\f104"}div.dataTables_paginate li.next a:after{content:"\f105"}div.dataTables_paginate li.last a:after{content:"\f101"}div.columns div.dataTables_paginate li.first a:before,div.columns div.dataTables_paginate li.last a:after,div.columns div.dataTables_paginate li.next a:after,div.columns div.dataTables_paginate li.previous a:before{top:0}.DTTT_container{float:right;margin-left:10px}.DTTT_container a div{cursor:pointer}.dataTables_scrollBody table.dataTable thead th.sorting:after{display:none}.tr-selected,.tr-selected td{background:#eefacd!important;color:#393c31!important}table.dataTable.dtr-inline.collapsed tbody td:first-child,table.dataTable.dtr-inline.collapsed tbody th:first-child{position:relative;padding-left:30px;cursor:pointer}table.dataTable.dtr-inline.collapsed tbody td:first-child:before,table.dataTable.dtr-inline.collapsed tbody th:first-child:before{top:8px;left:4px;height:16px;width:16px;display:block;position:absolute;color:#fff;border:2px solid #fff;border-radius:16px;text-align:center;line-height:14px;box-shadow:0 0 3px #444;box-sizing:content-box;content:'+';background-color:#31b131}table.dataTable.dtr-inline.collapsed tbody td:first-child.dataTables_empty:before,table.dataTable.dtr-inline.collapsed tbody th:first-child.dataTables_empty:before,table.dataTable.dtr-inline.collapsed tbody tr.child td:before{display:none}table.dataTable.dtr-inline.collapsed tbody tr.parent td:first-child:before,table.dataTable.dtr-inline.collapsed tbody tr.parent th:first-child:before{content:'-';background-color:#d33333}table.dataTable.dtr-column tbody td.control,table.dataTable.dtr-column tbody th.control{position:relative;cursor:pointer}table.dataTable.dtr-column tbody td.control:before,table.dataTable.dtr-column tbody th.control:before{top:50%;left:50%;height:16px;width:16px;margin-top:-10px;margin-left:-10px;display:block;position:absolute;color:#fff;border:2px solid #fff;border-radius:16px;text-align:center;line-height:14px;box-shadow:0 0 3px #444;box-sizing:content-box;content:'+';background-color:#31b131}table.dataTable.dtr-column tbody tr.parent td.control:before,table.dataTable.dtr-column tbody tr.parent th.control:before{content:'-';background-color:#d33333}table.dataTable tr.child{padding:.5em 1em}table.dataTable tr.child:hover{background:0 0!important}table.dataTable tr.child ul{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable tr.child ul li{border-bottom:1px solid #efefef;padding:.5em 0}table.dataTable tr.child ul li:first-child{padding-top:0}table.dataTable tr.child ul li:last-child{border-bottom:none}table.dataTable tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:700}div.FixedHeader_Cloned td,div.FixedHeader_Cloned th{background-color:#fff!important}.DTFC_LeftBodyLiner .table,.DTFC_LeftFootWrapper .table{margin:0!important}table.DTCR_clonedTable{background-color:rgba(255,255,255,.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#0259C4;z-index:201}.DTFC_LeftBodyLiner .table thead th:after{display:none!important}.bsdatepicker:after,.bsdatepicker:before{position:absolute;display:inline-block;content:''}.bsdatepicker{top:0;left:0;margin-top:1px;padding:4px!important}.bsdatepicker:before{top:-7px;left:6px;border-right:7px solid transparent;border-bottom:7px solid transparent;border-bottom-color:transparent;border-left:7px solid transparent}.bsdatepicker:after{top:-6px;left:7px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.bsdatepicker>div{display:none}.bsdatepicker table{width:100%;margin:0}.bsdatepicker td,.bsdatepicker th{width:20px;height:20px;margin:3px;text-align:center}.bsdatepicker td.day:hover{cursor:pointer}.bsdatepicker td.day.disabled{color:#eee}.bsdatepicker td span.old,.bsdatepicker td.new,.bsdatepicker td.old{color:#999}.bsdatepicker td span{line-height:44px;display:block;float:left;width:54px;height:44px;margin:2px;cursor:pointer}.bsdatepicker th.switch{width:145px}.bsdatepicker th.next,.bsdatepicker th.prev{font-size:21px}.bsdatepicker thead tr:first-child th{cursor:pointer}.ui-datepicker-inline{position:static!important;width:100%;float:none;margin-top:0}.ui-datepicker .ui-datepicker-header,.ui-datepicker-header{font-size:13px;line-height:40px;position:relative;height:40px}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:50%;overflow:hidden;width:30px;height:30px;margin-top:-15px;cursor:pointer;border-width:1px;border-style:solid}.ui-datepicker .ui-datepicker-prev{left:5px}.ui-datepicker .ui-datepicker-next{right:5px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{line-height:28px;display:block;float:none;height:28px;margin:0 auto;text-align:center}.ui-datepicker .ui-datepicker-title{font-weight:700;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:13px;height:28px;margin:0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{font-size:13px;line-height:1.6em;width:96%;margin:2%;border-collapse:collapse}.ui-datepicker th{font-weight:700;padding:0 0 5px;text-align:center;border:0}.ui-datepicker td{padding:1px;border:0}.ui-datepicker td a,.ui-datepicker td span{font-size:13px;display:block;padding:2px 5px;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{padding:10px}.ui-datepicker .ui-datepicker-buttonpane button{line-height:26px;float:right;height:28px;padding:0 15px;border-width:1px;border-style:solid;background:#fff}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-radius:0}.ui-datepicker-row-break{font-size:0;clear:both;width:100%}.daterangepicker.dropdown-menu{z-index:3000;max-width:none}.daterangepicker.opensleft .calendar,.daterangepicker.opensleft .ranges{float:left;margin:4px}.daterangepicker.opensright .calendar,.daterangepicker.opensright .ranges{float:right;margin:4px}.daterangepicker .ranges{width:188px;margin:0 0 0 10px;text-align:left}.daterangepicker .ranges .range_inputs>div{float:left}.daterangepicker .ranges .range_inputs>div:nth-child(2){padding-left:11px}.daterangepicker .calendar{display:none;max-width:270px}.show-calendar.daterangepicker .calendar{display:block}.daterangepicker .applyBtn{float:right;width:110px}.daterangepicker .cancelBtn{float:left}.daterangepicker .calendar td,.daterangepicker .calendar th{font-size:12px;text-align:center;white-space:nowrap}.daterangepicker .ranges label{font-size:11px;font-weight:700;line-height:20px;display:block;width:74px;height:20px;margin-bottom:2px;text-transform:uppercase;color:#333}.daterangepicker .ranges input{font-size:11px}.daterangepicker .ranges .input-mini{font-size:11px;line-height:30px;display:block;width:88px;height:30px;margin:0 0 10px;padding:0 6px;vertical-align:middle;color:#555;border:1px solid #ccc;border-radius:4px;background-color:#eee}.daterangepicker.opensleft:after,.daterangepicker.opensleft:before,.daterangepicker.opensright:after,.daterangepicker.opensright:before{position:absolute;display:inline-block;content:''}.daterangepicker .ranges ul{margin:0;padding:0;list-style:none}.daterangepicker .ranges li{margin-bottom:3px;padding:3px 12px;cursor:pointer}.daterangepicker .calendar-date{padding:5px;border-width:1px;border-style:solid;background:#fff}.daterangepicker .calendar-time{line-height:30px;margin:8px auto 0;text-align:center}.daterangepicker{position:absolute;top:100px;left:20px;margin-top:1px;padding:5px!important;background:#fff}.daterangepicker.opensleft:before{top:-7px;right:9px;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);border-left:7px solid transparent}.daterangepicker.opensleft:after{top:-6px;right:10px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.daterangepicker.opensright:before{top:-7px;left:9px;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);border-left:7px solid transparent}.daterangepicker.opensright:after{top:-6px;left:10px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.daterangepicker table{width:100%;margin:0}.daterangepicker td,.daterangepicker th{width:20px;height:20px;cursor:pointer;text-align:center;white-space:nowrap}.daterangepicker td.off{color:#999}.daterangepicker td.in-range{border-radius:0}.daterangepicker td.in-range:hover{color:#000}.daterangepicker td.week,.daterangepicker th.week{font-size:80%;color:#ccc}.daterangepicker select.monthselect,.daterangepicker select.yearselect{font-size:12px;height:auto;margin:0;padding:1px;cursor:default}.daterangepicker select.monthselect{width:56%;margin-right:2%}.daterangepicker select.yearselect{width:40%}.daterangepicker select.ampmselect,.daterangepicker select.hourselect,.daterangepicker select.minuteselect{width:50px;margin-bottom:0}.ui-dialog .ui-dialog-titlebar{position:relative;padding:10px;border-bottom:1px solid transparent}.ui-dialog .ui-dialog-title{overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{line-height:20px;position:absolute;top:50%;right:10px;width:20px;height:20px;margin:-10px 0 0;border:1px solid #ccc;background:#fff}.ui-dialog .ui-dialog-titlebar-close:before{line-height:18px;position:absolute;top:0;left:0;width:18px;height:18px;opacity:.6;-moz-opacity:.6;filter:alpha(opacity: 60)}.ui-dialog .ui-dialog-titlebar-close:hover:before{opacity:.9;-moz-opacity:.9;filter:alpha(opacity: 90)}.ui-dialog .ui-dialog-titlebar-close .ui-button-text{display:none}.ui-dialog .ui-dialog-content{position:relative;overflow:auto;padding:0;border:0;background:0 0}.ui-dialog-buttonset button{padding:8px 15px;border-width:1px;border-style:solid}.ui-dialog .ui-dialog-buttonpane{border-width:1px 0 0!important}.ui-dialog .ui-dialog-buttonpane .ui-button{line-height:28px;float:right;height:28px;padding:0 15px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-dialog .infobox,.ui-dialog .ui-tabs{margin-bottom:0}.ui-dialog .ui-tabs .ui-tabs-panel{padding:10px}.ui-widget-overlay{position:fixed;z-index:1049;top:0;left:0;width:100%;height:100%}.ui-widget-overlay img{position:absolute;top:50%;left:50%;margin:-27px 0 0 -27px}.ui-resizable{position:relative}.ui-resizable-handle{font-size:.1px;position:absolute;display:block}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{top:-5px;left:0;width:100%;height:7px;cursor:n-resize}.ui-resizable-s{bottom:-5px;left:0;width:100%;height:7px;cursor:s-resize}.ui-resizable-e{top:0;right:-5px;width:7px;height:100%;cursor:e-resize}.ui-resizable-w{top:0;left:-5px;width:7px;height:100%;cursor:w-resize}.ui-resizable-se{right:1px;bottom:1px;width:12px;height:12px;cursor:se-resize}.ui-resizable-sw{bottom:-5px;left:-5px;width:9px;height:9px;cursor:sw-resize}.ui-resizable-nw{top:-5px;left:-5px;width:9px;height:9px;cursor:nw-resize}.ui-resizable-ne{top:-5px;right:-5px;width:9px;height:9px;cursor:ne-resize}.dropdown,.dropup{position:relative;display:inline-block}.dropdown-menu,.minicolors-panel,.popover,.ui-datepicker,.ui-dialog,.ui-menu{position:absolute;z-index:1050!important;top:105%;left:0;display:none;float:left;min-width:150px;margin:5px 0 0;padding:5px;list-style:none;text-align:left;border-width:1px;border-style:solid;background:#fff}.ui-datepicker{padding:0}.dropdown-menu,.popover,.ui-dialog{box-shadow:0 1px 7px 2px rgba(135,158,171,.2)}.dropdown-menu{font-size:13px;line-height:1.6em;padding:5px 0;text-transform:none;border:0;min-width:150px}.dropdown-menu,.minicolors-panel,.popover,.ui-menu{top:100%}.dropdown-menu .divider{margin:5px 1px}.dropdown-menu.float-right{right:0;left:auto}.dropdown-menu .header{font-size:11px;font-weight:700;line-height:1.4em;margin:0 0 5px;padding:5px 5px 10px;text-transform:uppercase;color:#888;border-bottom:#dfe8f1 solid 1px}.dropdown-menu .dropdown-header{font-size:11px;font-weight:300;padding:5px 15px;text-transform:uppercase;color:#000}.dropdown-menu li{position:relative}.dropdown-menu li>a,.ui-menu li>a{font-weight:400;line-height:20px;position:relative;display:block;clear:both;margin:0;padding:5px 15px;cursor:pointer;white-space:nowrap}.dropdown>.dropdown-menu:before,.minicolors-position-bottom .minicolors-panel:before{position:absolute;top:-7px;left:7px;display:inline-block;content:'';border-right:7px solid transparent;border-bottom:7px solid transparent;border-bottom-color:transparent;border-left:7px solid transparent}.dropdown>.dropdown-menu:after,.minicolors-position-bottom .minicolors-panel:after{position:absolute;top:-6px;left:8px;display:inline-block;content:'';border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.dropdown>.dropdown-menu.float-right:before,.dropup>.dropdown-menu.float-right:before,.minicolors-position-right .minicolors-panel:before{right:7px;left:auto}.dropdown>.dropdown-menu.float-right:after,.dropup>.dropdown-menu.float-right:after,.minicolors-position-right .minicolors-panel:after{right:8px;left:auto}.minicolors-inline .minicolors-panel:after,.minicolors-inline .minicolors-panel:before{display:none}.dropdown-dividers{padding:0}.dropdown-dividers li{padding:3px;border-bottom:#ccc solid 1px}.dropdown-dividers li:last-child{border-bottom:0}.dropdown-dividers li>a{padding:2px 10px}.push-left{left:100%!important;margin-left:-30px}.open>.dropdown-menu{display:block}.dropup .dropdown-menu{top:auto;bottom:100%;margin-bottom:8px}.dropup>.dropdown-menu:before,.minicolors-position-top .minicolors-panel:before{position:absolute;bottom:-7px;left:7px;display:inline-block;content:'';border-top:7px solid #ccc;border-top-color:rgba(0,0,0,.2);border-right:7px solid transparent;border-left:7px solid transparent}.dropup>.dropdown-menu:after,.minicolors-position-top .minicolors-panel:after{position:absolute;bottom:-6px;left:8px;display:inline-block;content:'';border-top:6px solid #fff;border-right:6px solid transparent;border-left:6px solid transparent}.minicolors-position-top.minicolors-position-right .minicolors-panel:before{right:6px;left:auto}.minicolors-position-top.minicolors-position-right .minicolors-panel:after{right:7px;left:auto}.dropdown-submenu{position:relative;z-index:40}.dropdown-submenu>.dropdown-menu{top:50%;left:90%;margin-top:-6px;margin-left:-1px;border-radius:0 4px 4px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;border-radius:4px 4px 4px 0}.dropdown-submenu>a:after{position:relative;display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-5px;content:' ';opacity:.4;border-width:5px 0 5px 5px;border-style:solid;border-color:transparent transparent transparent #ccc;-moz-opacity:.4;filter:alpha(opacity: 40)}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.float-left{float:none!important}.dropdown-submenu.float-left>.dropdown-menu{left:-110%;margin-left:10px;border-radius:4px 0 4px 4px}.dropdown-submenu.float-left>.dropdown-menu.dropdown-dividers{margin-left:20px}.ui-menu-item{padding:3px 6px}.dropzone,.dropzone *,.dropzone-previews,.dropzone-previews *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.dropzone{padding:1em;border:1px solid rgba(0,0,0,.08);background:rgba(0,0,0,.02)}.dropzone.dz-clickable,.dropzone.dz-clickable .dz-message,.dropzone.dz-clickable .dz-message span{cursor:pointer}.dropzone.dz-clickable *{cursor:default}.dropzone .dz-message{opacity:1;-ms-filter:none;filter:none}.dropzone.dz-drag-hover{border-color:rgba(0,0,0,.15);background:rgba(0,0,0,.04)}.dropzone.dz-started .dz-message{display:none}.dropzone .dz-preview,.dropzone-previews .dz-preview{position:relative;display:inline-block;margin:17px;padding:6px;vertical-align:top;border:1px solid #acacac;background:rgba(255,255,255,.8)}.btn-file,.fileinput .btn,.fileinput .thumbnail,.fileinput-filename{vertical-align:middle}.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail],.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail]{display:none}.dropzone .dz-preview .dz-details,.dropzone-previews .dz-preview .dz-details{position:relative;width:100px;height:100px;margin-bottom:22px;padding:5px;background:#ebebeb}.dropzone .dz-preview .dz-details .dz-filename,.dropzone-previews .dz-preview .dz-details .dz-filename{overflow:hidden;height:100%}.dropzone .dz-preview .dz-details img,.dropzone-previews .dz-preview .dz-details img{position:absolute;top:0;left:0;width:100px;height:100px}.dropzone .dz-preview .dz-details .dz-size,.dropzone-previews .dz-preview .dz-details .dz-size{line-height:28px;position:absolute;bottom:-28px;left:3px;height:28px}.dropzone .dz-preview.dz-error .dz-error-mark,.dropzone .dz-preview.dz-success .dz-success-mark,.dropzone-previews .dz-preview.dz-error .dz-error-mark,.dropzone-previews .dz-preview.dz-success .dz-success-mark{display:block}.dropzone .dz-preview:hover .dz-details img,.dropzone-previews .dz-preview:hover .dz-details img{display:none}.dropzone .dz-preview .dz-error-mark,.dropzone .dz-preview .dz-success-mark,.dropzone-previews .dz-preview .dz-error-mark,.dropzone-previews .dz-preview .dz-success-mark{font-size:30px;position:absolute;top:-10px;right:-10px;display:none;width:40px;height:40px;text-align:center}.dropzone .dz-preview .dz-success-mark,.dropzone-previews .dz-preview .dz-success-mark{color:#8cc657}.dropzone .dz-preview .dz-error-mark,.dropzone-previews .dz-preview .dz-error-mark{color:#ee162d}.dropzone .dz-preview .dz-progress,.dropzone-previews .dz-preview .dz-progress{position:absolute;top:100px;right:6px;left:6px;display:none;height:6px;background:#d7d7d7}.dropzone .dz-preview .dz-progress .dz-upload,.dropzone-previews .dz-preview .dz-progress .dz-upload{position:absolute;top:0;bottom:0;left:0;width:0;background-color:#8cc657}.dropzone .dz-preview.dz-processing .dz-progress,.dropzone-previews .dz-preview.dz-processing .dz-progress{display:block}.dropzone .dz-preview .dz-error-message,.dropzone-previews .dz-preview .dz-error-message{position:absolute;z-index:500;top:-5px;left:-20px;display:none;min-width:140px;max-width:500px;padding:8px 10px;color:#800;background:rgba(245,245,245,.8)}.dropzone .dz-preview:hover.dz-error .dz-error-message,.dropzone-previews .dz-preview:hover.dz-error .dz-error-message{display:block}.dropzone{position:relative;min-height:350px;cursor:pointer}.dz-message{font-size:35px;line-height:50px;position:absolute;top:50%;left:50%;width:50%;height:50px;margin-top:-50px;margin-left:-25%;padding:25px;text-align:center}.btn-file{position:relative;overflow:hidden}.btn-file>input{position:absolute;top:0;right:0;width:100%;height:100%;margin:0;font-size:23px;cursor:pointer;filter:alpha(opacity=0);opacity:0;direction:ltr}.fileinput{display:inline-block;margin-bottom:9px}.fileinput .form-control{display:inline-block;padding-top:7px;padding-bottom:5px;margin-bottom:0;vertical-align:middle;cursor:text}.fileinput .thumbnail{display:inline-block;margin-bottom:5px;overflow:hidden;text-align:center}.fileinput .thumbnail>img{max-height:100%}.fileinput-exists .fileinput-new,.fileinput-new .fileinput-exists{display:none}.fileinput-inline .fileinput-controls{display:inline}.fileinput-filename{display:inline-block;overflow:hidden}.form-control .fileinput-filename{vertical-align:bottom}.fileinput.input-group{display:table}.fileinput.input-group>*{position:relative;z-index:2}.fileinput.input-group>.btn-file{z-index:1}.fileinput-new .input-group .btn-file,.fileinput-new.input-group .btn-file{border-radius:0 4px 4px 0}.fileinput-new .input-group .btn-file.btn-sm,.fileinput-new .input-group .btn-file.btn-xs,.fileinput-new.input-group .btn-file.btn-sm,.fileinput-new.input-group .btn-file.btn-xs{border-radius:0 3px 3px 0}.fileinput-new .input-group .btn-file.btn-lg,.fileinput-new.input-group .btn-file.btn-lg{border-radius:0 6px 6px 0}.form-group.has-warning .fileinput .fileinput-preview{color:#8a6d3b}.form-group.has-warning .fileinput .thumbnail{border-color:#faebcc}.form-group.has-error .fileinput .fileinput-preview{color:#a94442}.form-group.has-error .fileinput .thumbnail{border-color:#ebccd1}.form-group.has-success .fileinput .fileinput-preview{color:#3c763d}.form-group.has-success .fileinput .thumbnail{border-color:#d6e9c6}.bootstrap-switch{line-height:8px;position:relative;display:inline-block;overflow:hidden;min-width:100px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:left;vertical-align:middle;border:1px solid #ccc;border-radius:4px}.irs,.jcrop-tracker{-webkit-user-select:none}.bootstrap-switch.bootstrap-switch-mini{min-width:71px}.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label{font-size:10px;line-height:9px;padding-top:4px;padding-bottom:4px}.bootstrap-switch.bootstrap-switch-small{min-width:79px}.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label{font-size:12px;line-height:18px;padding-top:3px;padding-bottom:3px}.bootstrap-switch.bootstrap-switch-large{min-width:120px}.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label{font-size:14px;line-height:normal;padding-top:9px;padding-bottom:9px}.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container{-webkit-transition:margin-left .5s;transition:margin-left .5s}.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-container{margin-left:0}.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label{border-top-right-radius:3px;border-bottom-right-radius:3px}.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-container{margin-left:-50%}.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label{border-top-left-radius:3px;border-bottom-left-radius:3px}.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-container{margin-left:-25%}.bootstrap-switch.bootstrap-switch-disabled,.bootstrap-switch.bootstrap-switch-indeterminate,.bootstrap-switch.bootstrap-switch-readonly{cursor:default!important;opacity:.5;filter:alpha(opacity=50)}.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label{cursor:default!important}.bootstrap-switch.bootstrap-switch-focused{border-color:#ccc;outline:0}.bootstrap-switch .bootstrap-switch-container{top:0;display:inline-block;width:150%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-radius:4px}.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on,.bootstrap-switch .bootstrap-switch-label{font-size:12px;line-height:20px;text-transform:uppercase;display:inline-block!important;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:100%;padding-top:4px;padding-bottom:4px;cursor:pointer}div.switch-toggle,div.switch-toggle:after{display:block;background:#fff;border-radius:50px}.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on{z-index:1;width:33.333333333%;text-align:center}.bootstrap-switch .bootstrap-switch-label{z-index:100;width:33.333333333%;margin-top:-1px;margin-bottom:-1px;text-align:center;color:#333;background:#fff}.bootstrap-switch input[type=radio],.bootstrap-switch input[type=checkbox]{position:absolute!important;z-index:-1;top:0;left:0;opacity:0;filter:alpha(opacity=0)}.bootstrap-switch input[type=radio].form-control,.bootstrap-switch input[type=checkbox].form-control{height:auto}div.switch-toggle{height:24px;width:48px;position:relative;cursor:pointer;box-shadow:inset 0 0 1px rgba(0,0,0,.2);-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}div.switch-toggle:after,div.switch-toggle:before{position:absolute;content:''}div.switch-toggle:after{height:18px;width:18px;top:3px;left:3px;box-shadow:1px 1px 3px rgba(0,0,0,.3);-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}div.switch-toggle:before{right:1px;top:12px;color:#fff}.irs,.irs-line{position:relative;display:block}div.switch-toggle:hover:after{left:5px}div.switch-toggle.switch-on:before{content:'';right:40px}.switch-toggle.switch-on{background:#0c0}div.switch-toggle.switch-on:after{left:26px}div.switch-toggle.switch-on:hover:after{left:24px}.irs{-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.irs-line{overflow:hidden;outline:0!important}.irs-line-left,.irs-line-mid,.irs-line-right{position:absolute;display:block;top:0}.irs-line-left{left:0;width:11%}.irs-line-mid{left:9%;width:82%}.irs-line-right{right:0;width:11%}.irs-bar,.irs-shadow{position:absolute;width:0;left:0}.irs-bar{display:block}.irs-bar-edge{position:absolute;display:block;top:0;left:0}.irs-shadow{display:none}.irs-from,.irs-max,.irs-min,.irs-single,.irs-slider,.irs-to{display:block;position:absolute;cursor:default}.irs-slider{z-index:1}.irs-slider.type_last{z-index:2}.irs-min{left:0}.irs-max{right:0}.irs-from,.irs-single,.irs-to{top:0;left:0;white-space:nowrap}.irs-grid{position:absolute;display:none;bottom:0;left:0;width:100%;height:20px}.irs-with-grid .irs-grid{display:block}.irs-grid-pol{position:absolute;top:0;left:0;width:1px;height:8px;background:#000}.irs-grid-pol.small{height:4px}.irs-grid-text{position:absolute;bottom:0;left:0;white-space:nowrap;text-align:center;font-size:9px;line-height:9px;padding:0 3px;color:#000}.irs-disable-mask{position:absolute;display:block;top:0;left:-1%;width:102%;height:100%;cursor:default;background:rgba(0,0,0,0);z-index:2}.irs-disabled{opacity:.4}.lt-ie9 .irs-disabled{filter:alpha(opacity=40)}.irs-hidden-input{position:absolute!important;display:block!important;top:0!important;left:0!important;width:0!important;height:0!important;font-size:0!important;line-height:0!important;padding:0!important;margin:0!important;outline:0!important;z-index:-9999!important;background:0 0!important;border-style:solid!important;border-color:transparent!important}.jcrop-dragbar.ord-s,.jcrop-handle.ord-s,.jcrop-handle.ord-se,.jcrop-handle.ord-sw{margin-bottom:-4px;bottom:0}.jcrop-dragbar.ord-e,.jcrop-handle.ord-e,.jcrop-handle.ord-ne,.jcrop-handle.ord-se{right:0;margin-right:-4px}.modal,.modal-content,.note-air-editor,div.pp_pic_holder a:focus{outline:0}.jcrop-holder{text-align:left;direction:ltr}.jcrop-hline,.jcrop-vline{font-size:0;position:absolute;background:url(../../images/jcrop.gif) #fff}.jcrop-vline{width:1px!important;height:100%}.jcrop-vline.right{right:0}.jcrop-hline{width:100%;height:1px!important}.jcrop-hline.bottom{bottom:0}.jcrop-tracker{width:100%;height:100%;-webkit-tap-highlight-color:transparent}.jcrop-handle{font-size:1px;width:7px;height:7px;border:1px solid #eee;background-color:#333}.jcrop-handle.ord-n{top:0;left:50%;margin-top:-4px;margin-left:-4px}.jcrop-handle.ord-s{left:50%;margin-left:-4px}.jcrop-handle.ord-e{top:50%;margin-top:-4px}.jcrop-handle.ord-w{top:50%;left:0;margin-top:-4px;margin-left:-4px}.jcrop-handle.ord-nw{top:0;left:0;margin-top:-4px;margin-left:-4px}.jcrop-handle.ord-ne{top:0;margin-top:-4px}.jcrop-handle.ord-sw{left:0;margin-left:-4px}.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{width:100%;height:7px}.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{width:7px;height:100%}.jcrop-dragbar.ord-n{margin-top:-4px}.jcrop-dragbar.ord-w{margin-left:-4px}.jcrop-light .jcrop-hline,.jcrop-light .jcrop-vline{opacity:.7!important;background:#fff;filter:alpha(opacity=70)!important}.jcrop-light .jcrop-handle{border-color:#fff;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#000}.jcrop-dark .jcrop-hline,.jcrop-dark .jcrop-vline{opacity:.7!important;background:#000;filter:alpha(opacity=70)!important}.jcrop-dark .jcrop-handle{border-color:#000;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#fff}.solid-line .jcrop-hline,.solid-line .jcrop-vline{background:#fff}.jcrop-holder img,img.jcrop-preview{max-width:none}.jcrop-holder #preview-pane{position:absolute;z-index:2000;top:10px;right:-280px;display:block;padding:6px;border:1px solid rgba(0,0,0,.4);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;background-color:#fff}#preview-pane .preview-container{overflow:hidden;width:250px;height:170px}.jGrowl{z-index:9999;position:absolute}#loadingbar,body>.jGrowl{position:fixed}.jGrowl.top-left{top:0;left:0}.jGrowl.top-right{top:0;right:0}.jGrowl.bottom-left{bottom:0;left:0}.jGrowl.bottom-right{right:0;bottom:0}.jGrowl.center{top:50%;left:50%;width:0;margin-left:-170px}.center .jGrowl-closer,.center .jGrowl-notification{margin-right:auto;margin-left:auto}.jGrowl .jGrowl-closer,.jGrowl .jGrowl-notification{font-size:12px;display:none;zoom:1;width:300px;padding:10px 15px;white-space:normal;opacity:.95;filter:progid: DXImageTransform.Microsoft.Alpha(Opacity=95);margin:10px}.jGrowl .jGrowl-notification:hover{opacity:1;filter:progid: DXImageTransform.Microsoft.Alpha(Opacity=100)}.jGrowl .jGrowl-notification{min-height:20px}.jGrowl .jGrowl-notification .jGrowl-header{font-size:.85em;font-weight:700}.jGrowl .jGrowl-notification .jGrowl-close{font-weight:700;z-index:99;float:right;cursor:pointer}.jGrowl .jGrowl-closer{font-weight:700;cursor:pointer;text-align:center}#loadingbar{z-index:2147483647;top:0;left:-6px;width:1%;height:4px;-webkit-transition:all .5s ease-in-out;-moz-transition:all .5s ease-in-out;-ms-transition:all .5s ease-in-out;-o-transition:all .5s ease-in-out;transition:all .5s ease-in-out;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}#loadingbar.left{right:0;left:100%;width:100%}#loadingbar.up{top:100%;bottom:0;left:0;width:5px;height:100%}#loadingbar.down{left:0;width:5px;height:0}#loadingbar.waiting dd,#loadingbar.waiting dt{-webkit-animation:pulse 2s ease-out 0s infinite;-moz-animation:pulse 2s ease-out 0s infinite;-ms-animation:pulse 2s ease-out 0s infinite;-o-animation:pulse 2s ease-out 0s infinite;animation:pulse 2s ease-out 0s infinite}#loadingbar dt{right:-80px;clip:rect(-6px,90px,14px,-6px);width:180px;opacity:.6}#loadingbar dd{right:0;clip:rect(-6px,22px,14px,10px);width:20px;opacity:.6}#loadingbar dd,#loadingbar dt{position:absolute;top:0;height:2px;-webkit-border-radius:100%;-moz-border-radius:100%;border-radius:100%;-webkit-box-shadow:#ff6439 1px 0 6px 1px;-moz-box-shadow:#fa7753 1px 0 6px 1px;box-shadow:#ff6439 1px 0 6px 1px;-ms-box-shadow:#fa7753 1px 0 6px 1px}.jvectormap-label,.jvectormap-zoomin,.jvectormap-zoomout{position:absolute;border-radius:3px;padding:5px;border-width:1px;border-style:solid}#loadingbar.left dt{left:-4px;clip:rect(-6px,185px,14px,25px);width:180px;opacity:.6}#loadingbar.left dd{left:0;clip:rect(-6px,22px,14px,0);width:20px;margin:0;opacity:.6}#loadingbar.down dd,#loadingbar.down dt,#loadingbar.up dd,#loadingbar.up dt{right:auto;left:-5px;width:10px}#loadingbar.left dd,#loadingbar.left dt{top:0;height:2px}#loadingbar.down dt{top:auto;bottom:-47px;clip:rect(-6px,20px,130px,-6px);height:180px;opacity:.6}#loadingbar.down dd{top:auto;bottom:0;clip:rect(-6px,22px,20px,10px);height:20px;margin:0;opacity:.6}#loadingbar.up dt{top:-10px;bottom:auto;clip:rect(13px,20px,190px,-6px);height:180px;opacity:.6}#loadingbar.up dd{top:0;bottom:auto;clip:rect(-6px,22px,25px,10px);height:20px;margin:0;opacity:.6}@keyframes pulse{100%,30%{opacity:.6}60%{opacity:0}}@-moz-keyframes pulse{100%,30%{opacity:.6}60%{opacity:0}}@-ms-keyframes pulse{100%,30%{opacity:.6}60%{opacity:0}}@-webkit-keyframes pulse{100%,30%{opacity:.6}60%{opacity:0}}.jvectormap-label{display:none;font-size:12px;z-index:1200}.jvectormap-zoomin,.jvectormap-zoomout{left:10px;cursor:pointer;line-height:10px;text-align:center}.jvectormap-zoomin{top:10px}.jvectormap-zoomout{top:35px}.modal,.modal-backdrop{top:0;left:0;right:0;bottom:0}.wmd-panel{width:100%}.wmd-input{height:300px;width:100%;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box}.wmd-preview{width:100%;margin-top:20px}.wmd-panel .btn-toolbar{margin-bottom:0;padding:0 0 5px;width:100%}.fa-header:before{content:'H';font-family:arial,helvetica,sans-serif;font-weight:700}.wmd-prompt-background{background-color:#000}.wmd-prompt-dialog{border:1px solid #999;background-color:#F5F5F5}.wmd-prompt-dialog>div{font-size:.8em;font-family:arial,helvetica,sans-serif}.wmd-prompt-dialog>form>input[type=text]{border:1px solid #999;color:#000}.wmd-prompt-dialog>form>input[type=button]{border:1px solid #888;font-family:trebuchet MS,helvetica,sans-serif;font-size:.8em;font-weight:700}.wmd-button-group1{margin-left:5px!important}.wmd-button-bar{margin-bottom:5px}.close{font-size:21px;font-weight:700;line-height:1;float:right;opacity:.2;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20)}.close:focus,.close:hover{cursor:pointer;text-decoration:none;opacity:.5;color:#000;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;border:0;background:0 0;-webkit-appearance:none}.modal-open{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;z-index:1050;display:none;overflow:auto;overflow-y:scroll;-webkit-overflow-scrolling:touch}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px;border-radius:6px}.modal-content{position:relative;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;background-color:#fff;background-clip:padding-box;box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #dfe8f1}.modal-header .close{margin-top:2px}.modal-dialog{border:0;box-shadow:0 15px 45px rgba(0,0,0,.3)!important}.modal.display-block .modal-dialog{box-shadow:0 6px 25px rgba(0,0,0,.1)!important;-webkit-transform:translate(0,-20px);-ms-transform:translate(0,-20px);transform:translate(0,-20px)}.modal-title{line-height:1.42857143;margin:0}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #dfe8f1}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.display-block.modal{position:static;z-index:5;display:block;overflow:visible!important;opacity:1;-moz-opacity:1;filter:alpha(opacity: 100)}.display-block.modal .modal-dialog{margin-bottom:0}.modal-open #page-content-wrapper{z-index:inherit}.ms-container{position:relative}.ms-container .glyph-icon{font-size:20px;line-height:30px;position:absolute;top:50%;left:50%;width:30px;height:30px;margin:-15px 0 0 -15px;text-align:center}.ms-container:after{font-size:0;line-height:0;display:block;visibility:hidden;clear:both;height:0;min-height:0;content:'.'}.ms-container .ms-selectable,.ms-container .ms-selection{float:left;width:45%;color:#555;background:#fff}.ms-container .ms-selection{float:right}.ms-container .ms-list{position:relative;overflow-y:auto;height:200px;padding:5px 10px;border-width:1px;border-style:solid}.ms-list li{line-height:20px;margin:5px 0;padding:3px 10px}.ms-container ul{margin:0;padding:0;list-style-type:none}.ms-container .ms-optgroup-container{width:100%}.ms-container .ms-optgroup-label{line-height:20px;margin:0;padding:3px 10px;cursor:pointer}.ms-container li.ms-hover{cursor:pointer}.ms-container li.disabled{cursor:text}.fileinput-button{position:relative;overflow:hidden}.fileinput-button input{font-size:200px;position:absolute;top:0;right:0;margin:0;cursor:pointer;opacity:0;-ms-filter:'alpha(opacity=0)';direction:ltr}@media screen\9{.fileinput-button input{font-size:100%;height:100%;filter:alpha(opacity=0)}}.fileupload-buttonbar .btn,.fileupload-buttonbar .toggle{float:left;margin-right:10px;margin-bottom:5px}.fileupload-buttonbar .toggle{margin-top:7px;margin-left:10px}.template-upload .size{margin:0}.progress-animated .bar,.progress-animated .progress-bar{background:url(../images/animated-overlay.gif)!important;filter:none}.fileupload-process{display:none;float:right}.files .processing .preview,.fileupload-processing .fileupload-process{display:block;width:32px;height:32px;background:url(../images/loader-dark.gif) center no-repeat;background-size:contain}.files audio,.files video{max-width:300px}table.table td .toggle{margin:7px 10px 0 0}@media (max-width:767px){.files .btn span,.files .toggle,.fileupload-buttonbar .toggle{display:none}.files .name{width:80px;word-wrap:break-word}.files audio,.files video{max-width:80px}.files canvas,.files img{max-width:100%}}.blueimp-gallery,.blueimp-gallery>.slides>.slide>.slide-content{position:absolute;top:0;right:0;bottom:0;left:0;-moz-backface-visibility:hidden}.blueimp-gallery>.slides>.slide>.slide-content{margin:auto;width:auto;height:auto;max-width:100%;max-height:100%;opacity:1}.blueimp-gallery{position:fixed;z-index:999999;overflow:hidden;background:#000;background:rgba(0,0,0,.9);opacity:0;display:none;direction:ltr;-ms-touch-action:none;touch-action:none}.blueimp-gallery-carousel{position:relative;z-index:auto;margin:1em auto;padding-bottom:56.25%;box-shadow:0 0 10px #000;-ms-touch-action:pan-y;touch-action:pan-y}.blueimp-gallery-display{display:block;opacity:1}.blueimp-gallery>.slides{position:relative;height:100%;overflow:hidden}.blueimp-gallery-carousel>.slides{position:absolute}.blueimp-gallery>.slides>.slide{position:relative;float:left;height:100%;text-align:center;-webkit-transition-timing-function:cubic-bezier(.645,.045,.355,1);-moz-transition-timing-function:cubic-bezier(.645,.045,.355,1);-ms-transition-timing-function:cubic-bezier(.645,.045,.355,1);-o-transition-timing-function:cubic-bezier(.645,.045,.355,1);transition-timing-function:cubic-bezier(.645,.045,.355,1)}.blueimp-gallery,.blueimp-gallery>.slides>.slide>.slide-content{-webkit-transition:opacity .5s linear;-moz-transition:opacity .5s linear;-ms-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear}.blueimp-gallery>.slides>.slide-loading{background:url(../img/loading.gif) center no-repeat;background-size:64px 64px}.blueimp-gallery>.slides>.slide-loading>.slide-content{opacity:0}.blueimp-gallery>.slides>.slide-error{background:url(../img/error.png) center no-repeat}.blueimp-gallery>.slides>.slide-error>.slide-content{display:none}.blueimp-gallery>.next,.blueimp-gallery>.prev{position:absolute;top:50%;left:15px;width:40px;height:40px;margin-top:-23px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-decoration:none;text-shadow:0 0 2px #000;text-align:center;background:#222;background:rgba(0,0,0,.5);-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;cursor:pointer;display:none}.blueimp-gallery>.next{left:auto;right:15px}.blueimp-gallery>.close,.blueimp-gallery>.title{position:absolute;top:15px;left:15px;margin:0 40px 0 0;font-size:20px;line-height:30px;color:#fff;text-shadow:0 0 2px #000;opacity:.8;display:none}.blueimp-gallery>.close{padding:15px;right:15px;left:auto;margin:-15px;font-size:30px;text-decoration:none;cursor:pointer}.dd,.dd-list{padding:0;list-style:none}.blueimp-gallery>.play-pause{position:absolute;right:15px;bottom:15px;width:15px;height:15px;background:url(../img/play-pause.png) no-repeat;cursor:pointer;opacity:.5;display:none}.blueimp-gallery-playing>.play-pause{background-position:-15px 0}.blueimp-gallery>.close:hover,.blueimp-gallery>.next:hover,.blueimp-gallery>.play-pause:hover,.blueimp-gallery>.prev:hover,.blueimp-gallery>.title:hover{color:#fff;opacity:1}.blueimp-gallery-controls>.close,.blueimp-gallery-controls>.next,.blueimp-gallery-controls>.play-pause,.blueimp-gallery-controls>.prev,.blueimp-gallery-controls>.title{display:block;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.blueimp-gallery-left>.prev,.blueimp-gallery-right>.next,.blueimp-gallery-single>.next,.blueimp-gallery-single>.play-pause,.blueimp-gallery-single>.prev{display:none}.blueimp-gallery>.close,.blueimp-gallery>.next,.blueimp-gallery>.play-pause,.blueimp-gallery>.prev,.blueimp-gallery>.slides>.slide>.slide-content{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body:last-child .blueimp-gallery>.slides>.slide-error{background-image:url(../img/error.svg)}body:last-child .blueimp-gallery>.play-pause{width:20px;height:20px;background-size:40px 20px;background-image:url(../img/play-pause.svg)}body:last-child .blueimp-gallery-playing>.play-pause{background-position:-20px 0}.blueimp-gallery>.indicator{position:absolute;top:auto;right:15px;bottom:15px;left:15px;margin:0 40px;padding:0;list-style:none;text-align:center;line-height:10px;display:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.blueimp-gallery>.indicator>li{display:inline-block;width:9px;height:9px;margin:6px 3px 0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;border:1px solid transparent;background:#ccc;background:center no-repeat rgba(255,255,255,.25);border-radius:5px;box-shadow:0 0 2px #000;opacity:.5;cursor:pointer}.dd-empty,.dd-handle,.dd-placeholder{-moz-box-sizing:border-box;margin:5px 0}.blueimp-gallery>.indicator>.active,.blueimp-gallery>.indicator>li:hover{background-color:#fff;border-color:#fff;opacity:1}.blueimp-gallery-controls>.indicator{display:block;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.blueimp-gallery-single>.indicator,.blueimp-gallery>.slides>.slide>.video-content>video,.blueimp-gallery>.slides>.slide>.video-playing>a,.blueimp-gallery>.slides>.slide>.video-playing>img{display:none}.blueimp-gallery>.slides>.slide>.video-content>img{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;width:auto;height:auto;max-width:100%;max-height:100%;-moz-backface-visibility:hidden}.blueimp-gallery>.slides>.slide>.video-content>video{position:absolute;top:0;left:0;width:100%;height:100%}.blueimp-gallery>.slides>.slide>.video-content>iframe{position:absolute;top:100%;left:0;width:100%;height:100%;border:none}.blueimp-gallery>.slides>.slide>.video-playing>iframe{top:0}.blueimp-gallery>.slides>.slide>.video-content>a{position:absolute;top:50%;right:0;left:0;margin:-64px auto 0;width:128px;height:128px;background:url(../img/video-play.png) center no-repeat;opacity:.8;cursor:pointer}.dd,.dd-item>button,.dd-list{position:relative}.blueimp-gallery>.slides>.slide>.video-content>a:hover{opacity:1}.blueimp-gallery>.slides>.slide>.video-playing>video,.dd,.dd-list{display:block}.blueimp-gallery>.slides>.slide>.video-loading>a{background:url(../img/loading.gif) center no-repeat;background-size:64px 64px}body:last-child .blueimp-gallery>.slides>.slide>.video-content:not(.video-loading)>a{background-image:url(../img/video-play.svg)}.dd{font-size:13px;line-height:20px;margin:15px 0 0}.dd-list{margin:0}.dd-list .dd-list{padding-left:30px}.dd-collapsed .dd-list{display:none}.dd-empty,.dd-item,.dd-placeholder{font-size:13px;line-height:20px;position:relative;display:block;min-height:20px;margin:0;padding:0}.dd-handle{display:block;box-sizing:border-box;height:30px;padding:5px 10px;text-decoration:none;color:#333;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;background:#fafafa}.dd-handle:hover{background:#fff}.dd-item>button{font-size:12px;line-height:1;display:block;float:left;overflow:hidden;width:25px;height:20px;margin:5px 0;padding:0;cursor:pointer;text-align:center;white-space:nowrap;text-indent:100%;border:0;background:0 0}.dd-item>button:before{position:absolute;display:block;width:100%;content:'+';text-align:center;text-indent:0}.dd-item>button[data-action=collapse]:before{content:'-'}.dd-empty,.dd-placeholder{box-sizing:border-box;min-height:30px;padding:0;border:1px dashed #b6bcbf;background:#f2fbff}.dd-empty{min-height:100px;border:1px dashed #bbb;background-color:#dfe8f1;background-image:-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:-moz-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-moz-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-position:0 0,30px 30px;background-size:60px 60px}.dd-dragel{position:absolute;z-index:9999}.dd-dragel>.dd-item .dd-handle{margin-top:0}.dd-dragel .dd-handle{-webkit-box-shadow:2px 4px 6px 0 rgba(0,0,0,.1);box-shadow:2px 4px 6px 0 rgba(0,0,0,.1)}#nestable-menu{margin:0 0 15px;padding:0}#nestable-output,#nestable2-output{-moz-box-sizing:border-box;box-sizing:border-box;width:100%;height:7em}#nestable2 .dd-handle{color:#fff;border:1px solid #999;background:#bbb}#nestable2 .dd-handle:hover{background:#bbb}#nestable2 .dd-item>button:before{color:#fff}.dd-hover>.dd-handle{background:#2ea8e5!important}.dd3-content{display:block;-moz-box-sizing:border-box;box-sizing:border-box;height:30px;margin:5px 0;padding:5px 10px 5px 40px;text-decoration:none;color:#333;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;background:#fafafa}.dd3-content:hover{color:#2ea8e5;background:#fff}.dd3-handle,.dd3-handle:hover{background:#ddd}.dd-dragel>.dd3-item>.dd3-content{margin:0}.dd3-item>button{margin-left:30px}.dd3-handle{position:absolute;top:0;left:0;overflow:hidden;width:30px;margin:0;cursor:pointer;white-space:nowrap;text-indent:100%;border:1px solid #aaa;border-top-right-radius:0;border-bottom-right-radius:0}.dd3-handle:before{font-size:20px;font-weight:400;position:absolute;top:3px;left:0;display:block;width:100%;content:'≡';text-align:center;text-indent:0;color:#fff}.popover,.popover-title:empty{display:none}.datepicker-dropdown:after,.datepicker-dropdown:before,.form-wizard>ul>li a:before,.popover .arrow:after{content:''}.noty-wrapper{font-size:14px;font-weight:700;position:fixed;z-index:10000;left:0;width:100%;margin:0;padding:0;list-style:none;opacity:95;-moz-opacity:95;filter:alpha(opacity: 95)}.noty-wrapper:hover{opacity:1;-moz-opacity:1;filter:alpha(opacity: 100)}.noty_message{line-height:20px;padding:15px 10px;text-align:center}#noty_bottom{bottom:0}#noty_top{top:0}#noty_center{top:50%;left:50%}#noty_center li{margin:10px 0;border:0}.popover{z-index:1049;top:0;left:0;min-width:250px;margin:0;padding:0}.popover .popover-content{padding:15px}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{font-size:12px;font-weight:700;margin:0;padding:10px 15px;text-transform:uppercase;border-bottom-width:1px;border-bottom-style:solid}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-style:solid;border-color:transparent}.popover .arrow,.popover .arrow:after{border-width:10px}.popover.top .arrow{bottom:-22px;left:50%;margin-left:-11px}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:rgba(0,0,0,.2);border-bottom-width:0}.popover.right .arrow{top:50%;left:-22px;margin-top:-11px}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:rgba(0,0,0,.2);border-left-width:0}.popover.bottom .arrow{top:-22px;left:50%;margin-left:-11px}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:rgba(0,0,0,.2)}.popover.left .arrow{top:50%;right:-22px;margin-top:-11px}.popover.left .arrow:after{right:1px;bottom:-10px;border-right-width:0;border-left-color:rgba(0,0,0,.2)}.popover .dropdown-menu,.popover .nav-list{margin:0;border:0}.display-block.popover{box-shadow:0 0 0 transparent;float:none;width:auto;margin:15px}.fixed-header .popover{position:fixed;-webkit-transform:translate3d(0,0,0)}div.pp_default .pp_bottom,div.pp_default .pp_bottom .pp_left,div.pp_default .pp_bottom .pp_middle,div.pp_default .pp_bottom .pp_right,div.pp_default .pp_top,div.pp_default .pp_top .pp_left,div.pp_default .pp_top .pp_middle,div.pp_default .pp_top .pp_right{height:13px}div.pp_default .pp_top .pp_left{background:url(images/default/sprite.png) -78px -93px no-repeat}div.pp_default .pp_top .pp_middle{background:url(images/default/sprite_x.png) top left repeat-x}div.pp_default .pp_top .pp_right{background:url(images/default/sprite.png) -112px -93px no-repeat}div.pp_default .pp_content .ppt{color:#f8f8f8}div.pp_default .pp_content_container .pp_left{padding-left:13px;background:url(images/default/sprite_y.png) -7px 0 repeat-y}div.pp_default .pp_content_container .pp_right{padding-right:13px;background:url(images/default/sprite_y.png) top right repeat-y}div.pp_default .pp_content{background-color:#fff}div.pp_default .pp_next:hover{cursor:pointer;background:url(images/default/sprite_next.png) center right no-repeat}div.pp_default .pp_previous:hover{cursor:pointer;background:url(images/default/sprite_prev.png) center left no-repeat}div.pp_default .pp_expand{width:28px;height:28px;cursor:pointer;background:url(images/default/sprite.png) 0 -29px no-repeat}div.pp_default .pp_expand:hover{cursor:pointer;background:url(images/default/sprite.png) 0 -56px no-repeat}div.pp_default .pp_contract{width:28px;height:28px;cursor:pointer;background:url(images/default/sprite.png) 0 -84px no-repeat}div.pp_default .pp_contract:hover{cursor:pointer;background:url(images/default/sprite.png) 0 -113px no-repeat}div.pp_default .pp_close{width:30px;height:30px;cursor:pointer;background:url(images/default/sprite.png) 2px 1px no-repeat}div.pp_default #pp_full_res .pp_inline{color:#000}div.pp_default .pp_gallery ul li a{border:1px solid #aaa;background:url(images/default/default_thumb.png) center center #f8f8f8}div.pp_default .pp_gallery ul li a:hover,div.pp_default .pp_gallery ul li.selected a{border-color:#fff}div.pp_default .pp_social{margin-top:7px}div.pp_default .pp_gallery a.pp_arrow_next,div.pp_default .pp_gallery a.pp_arrow_previous{position:static;left:auto}div.pp_default .pp_nav .pp_pause,div.pp_default .pp_nav .pp_play{width:30px;height:30px;background:url(images/default/sprite.png) -51px 1px no-repeat}div.pp_default .pp_nav .pp_pause{background-position:-51px -29px}div.pp_default .pp_details{position:relative}div.pp_default a.pp_arrow_next,div.pp_default a.pp_arrow_previous{width:20px;height:20px;margin:4px 0 0;background:url(images/default/sprite.png) -31px -3px no-repeat}div.pp_default a.pp_arrow_next{left:52px;background-position:-82px -3px}div.pp_default .pp_content_container .pp_details{margin-top:5px}div.pp_default .pp_nav{position:relative;clear:none;width:110px;height:30px}div.pp_default .pp_nav .currentTextHolder{font-family:Georgia;font-size:11px;font-style:italic;line-height:25px;position:absolute;top:2px;left:75px;margin:0;padding:0 0 0 10px;color:#999}.progress-bar,.sb-slidebar .chat-box li a.chat-wrapper:hover,div.ppt{color:#fff}div.pp_default .pp_arrow_next:hover,div.pp_default .pp_arrow_previous:hover,div.pp_default .pp_close:hover,div.pp_default .pp_nav .pp_pause:hover,div.pp_default .pp_nav .pp_play:hover{opacity:.7}div.pp_default .pp_description{font-size:11px;font-weight:700;line-height:14px;margin:5px 50px 5px 0}div.pp_default .pp_bottom .pp_left{background:url(images/default/sprite.png) -78px -127px no-repeat}div.pp_default .pp_bottom .pp_middle{background:url(images/default/sprite_x.png) bottom left repeat-x}div.pp_default .pp_bottom .pp_right{background:url(images/default/sprite.png) -112px -127px no-repeat}div.pp_default .pp_loaderIcon{background:url(images/default/loader.gif) center center no-repeat}div.pp_overlay{position:absolute;z-index:9500;top:0;left:0;display:none;width:100%;background:#000}div.pp_pic_holder{position:absolute;z-index:10000;display:none;width:100px}.pp_top{position:relative;height:20px}* html .pp_top{padding:0 20px}.pp_top .pp_left{position:absolute;left:0;width:20px;height:20px}.pp_top .pp_middle{position:absolute;right:20px;left:20px;height:20px}* html .pp_top .pp_middle{position:static;left:0}.pp_top .pp_right{position:absolute;top:0;right:0;left:auto;width:20px;height:20px}.pp_content{min-width:40px;height:40px}* html .pp_content{width:40px}.pp_fade{display:none}.pp_content_container{position:relative;width:100%;text-align:left}.pp_content_container .pp_left{padding-left:20px}.pp_content_container .pp_right{padding-right:20px}.pp_content_container .pp_details{float:left;margin:10px 0 2px}.pp_description{display:none;margin:0}.pp_social{float:left;margin:0}.pp_social .facebook{float:left;overflow:hidden;width:55px;margin-left:5px}.pp_social .twitter{float:left}.pp_nav{float:left;clear:right;margin:3px 10px 0 0}.pp_nav p{float:left;margin:2px 4px;white-space:nowrap}.pp_nav .pp_pause,.pp_nav .pp_play{float:left;margin-right:4px;text-indent:-10000px}a.pp_arrow_next,a.pp_arrow_previous{display:block;float:left;overflow:hidden;width:14px;height:15px;margin-top:3px;text-indent:-10000px}.pp_hoverContainer{position:absolute;z-index:2000;top:0;width:100%}.pp_gallery{position:absolute;z-index:10000;left:50%;display:none;margin-top:-50px}.pp_gallery div{position:relative;float:left;overflow:hidden}.pp_gallery ul{position:relative;float:left;height:35px;margin:0 0 0 5px;padding:0;white-space:nowrap}a.pp_close,a.pp_contract,a.pp_expand{position:absolute;text-indent:-10000px}.pp_gallery ul a{display:block;float:left;overflow:hidden;height:33px;border:1px solid #000;border:1px solid rgba(0,0,0,.5)}.pp_gallery li.selected a,.pp_gallery ul a:hover{border-color:#fff}.pp_gallery ul a img{border:0}.pp_gallery li{display:block;float:left;margin:0 5px 0 0;padding:0}.pp_gallery li.default a{display:block;width:50px;height:33px;background:url(images/facebook/default_thumbnail.gif) no-repeat}.pp_gallery li.default a img{display:none}.pp_gallery .pp_arrow_next,.pp_gallery .pp_arrow_previous{margin-top:7px!important}a.pp_contract,a.pp_expand{z-index:20000;top:10px;right:30px;display:none;width:20px;height:20px;cursor:pointer}a.pp_close{line-height:22px;top:0;right:0;display:block}.pp_bottom{position:relative;height:20px}* html .pp_bottom{padding:0 20px}.pp_bottom .pp_left{position:absolute;left:0;width:20px;height:20px}.pp_bottom .pp_middle{position:absolute;right:20px;left:20px;height:20px}* html .pp_bottom .pp_middle{position:static;left:0}.pp_bottom .pp_right{position:absolute;top:0;right:0;left:auto;width:20px;height:20px}.pp_loaderIcon{position:absolute;top:50%;left:50%;display:block;width:24px;height:24px;margin:-12px 0 0 -12px}#pp_full_res{line-height:1!important}#pp_full_res .pp_inline{text-align:left}#pp_full_res .pp_inline p{margin:0 0 15px}div.ppt{font-size:17px;z-index:9999;display:none;margin:0 0 5px 15px}.progress,.progress-bar,.progress-label,.progress-overlay,.progressbar,.progressbar-value{font-weight:700;line-height:20px;height:20px;border-radius:4px}.progress,.progressbar{position:relative;text-align:center;background:rgba(0,0,0,.05);box-shadow:inset 1px 1px 3px rgba(0,0,0,.2)}.progress-bar,.progress-label,.progress-overlay,.progressbar-value{position:absolute;z-index:4;top:0;left:0;overflow:hidden}.progress .progress-bar{position:relative!important;border-radius:0}.progressbar-value.ui-state-default,.progressbar-value.ui-state-default .progress-label{line-height:18px;height:18px}.progress-label{z-index:6;width:100%}.progress-overlay{z-index:5;width:100%;opacity:.15;background:url(../../images/animated-overlay.gif);filter:alpha(opacity=15)}.progressbar-small .progress-label,.progressbar-small .progress-overlay,.progressbar-small .progressbar-value,.progressbar-small.progressbar{height:10px}.progressbar-small .progressbar-value.ui-state-default{height:8px}.progressbar-smaller .progress-label,.progressbar-smaller .progress-overlay,.progressbar-smaller .progressbar-value,.progressbar-smaller.progressbar{height:4px}.progressbar-smaller .progressbar-value.ui-state-default{height:2px}.bg-black .progress-overlay{opacity:1;filter:alpha(opacity=100)}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;border-radius:4px;background-color:#f5f5f5;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{font-size:12px;line-height:20px;float:left;width:0;height:100%;-webkit-transition:width .6s ease;transition:width .6s ease;text-align:center;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15)}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.ui-rangeSlider{height:50px;padding-top:30px}.ui-rangeSlider-withArrows .ui-rangeSlider-container{margin:0 15px}.ui-rangeSlider-disabled.ui-rangeSlider-noArrow .ui-rangeSlider-container{border-color:#8490a3}.ui-rangeSlider-arrow,.ui-rangeSlider-container{height:20px}.ui-rangeSlider-arrow{width:14px;cursor:pointer}.ui-rangeSlider-leftArrow{border-radius:4px 0 0 4px}.ui-rangeSlider-rightArrow{border-radius:0 4px 4px 0}.ui-rangeSlider-arrow-inner{position:absolute;top:50%;width:0;height:0;margin-top:-5px;border:5px solid transparent}.ui-rangeSlider-leftArrow .ui-rangeSlider-arrow-inner{left:0;margin-left:-1px;border-right:5px solid #666}.ui-rangeSlider-leftArrow:hover .ui-rangeSlider-arrow-inner{border-right:5px solid #333}.ui-rangeSlider-rightArrow .ui-rangeSlider-arrow-inner{right:0;margin-right:-1px;border-left:5px solid #666}.ui-rangeSlider-rightArrow:hover .ui-rangeSlider-arrow-inner{border-left:5px solid #333}.ui-rangeSlider-innerBar{left:-10px;overflow:hidden;width:110%;height:100%}.ui-rangeSlider-bar{height:18px;margin:1px 0;cursor:move;cursor:grab;cursor:-moz-grab}.ui-rangeSlider-disabled .ui-rangeSlider-bar{background:#93aeca}.ui-rangeSlider-handle{width:10px;height:30px;cursor:col-resize;background:0 0}.ui-rangeSlider-label{font-size:15px;bottom:27px;padding:5px 10px;cursor:col-resize;color:#fff;background-color:rgba(0,0,0,.7)}.ui-rangeSlider-label:active,.ui-rangeSlider-label:hover{background:#000}.ui-rangeSlider-label-inner{position:absolute;z-index:99;top:100%;left:50%;display:block;margin-left:-5px;border-top:5px solid rgba(0,0,0,.7);border-right:5px solid transparent;border-left:5px solid transparent}.sb-left,.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-rangeSlider-label:active .ui-rangeSlider-label-inner,.ui-rangeSlider-label:hover .ui-rangeSlider-label-inner{border-top:5px solid #000}.ui-editRangeSlider-inputValue{font-size:15px;width:2em;text-align:center;border:0}#sb-site,.sb-site-container,.sb-slidebar,body,html{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}html.sb-scroll-lock.sb-active:not(.sb-static){overflow:hidden}#sb-site .sb-overlay{display:none}.sb-active #sb-site .sb-overlay{display:block}#sb-site,.sb-site-container{position:relative;width:100%}.sb-slidebar{position:fixed;z-index:0;top:0;display:none;overflow-y:auto;height:100%;overflow-x:hidden;-webkit-transform:translate(0);width:30%}.sb-slidebar.sb-right.sb-active{right:-3px}.sb-right{right:0}.sb-slidebar .scrollable-content{height:100%}.sb-slidebar.sb-static,html.sb-static .sb-slidebar{position:absolute}.sb-slidebar.sb-active{display:block}.sb-style-overlay{z-index:9999}.sb-momentum-scrolling{-webkit-overflow-scrolling:touch}.sb-width-thin{width:15%}.sb-width-wide{width:45%}@media (max-width:480px){.sb-slidebar{width:70%}.sb-width-thin{width:55%}.sb-width-wide{width:85%}}@media (min-width:481px){.sb-slidebar{width:55%}.sb-width-thin{width:40%}.sb-width-wide{width:70%}}@media (min-width:768px){.sb-slidebar{width:40%}.sb-width-thin{width:25%}.sb-width-wide{width:55%}}@media (min-width:992px){.sb-slidebar{width:30%}.sb-width-thin{width:15%}.sb-width-wide{width:45%}}@media (min-width:1200px){.sb-slidebar{width:350px}.sb-width-thin{width:5%}.sb-width-wide{width:35%}}#sb-site,.sb-site-container,.sb-slide,.sb-slidebar{-webkit-transition:-webkit-transform .4s ease;-moz-transition:-moz-transform .4s ease;-o-transition:-o-transform .4s ease;transition:transform .4s ease;-webkit-transition-property:-webkit-transform,left,right;-webkit-backface-visibility:hidden}.sb-hide{display:none}.sb-slidebar .popover-title{font-size:13px;font-size:11px;line-height:36px;display:block;height:36px;margin:2px 0;padding:0 15px;border-width:0}.sb-slidebar .divider{background:rgba(255,255,255,.1)}.sb-slidebar.sb-left .divider-header{font-size:14px;opacity:.4}.sb-slidebar .popover-title .caret{float:right;margin-top:17px}.sb-slidebar .progress-box li a{display:block;padding:0}.sb-slidebar .files-box{padding:10px 0}.sb-slidebar .files-box li.divider{margin:5px 0;padding:0}.sb-slidebar .notifications-box li,.sb-slidebar .progress-box li{padding:15px;border-color:rgba(255,255,255,.1)}.sb-slidebar .notifications-box li:last-child,.sb-slidebar .progress-box li:last-child{padding-bottom:20px}.sb-slidebar .notifications-box-alt li:first-child{padding-top:15px}.sb-slidebar ul.chat-box{margin:0;padding:0;list-style:none}.sb-slidebar .chat-box li{position:relative;margin:15px;padding:0}.sb-slidebar .chat-box li a.chat-wrapper{display:block;padding:10px}.sb-slidebar .chat-box li a.btn-md{position:absolute;top:50%;right:0;margin-top:-17px;padding:0 10px}.sb-slidebar .chat-box li a.btn-md .glyph-icon{opacity:.5}.sb-slidebar .chat-box li .status-badge{float:left;margin:0 10px 0 0}.sb-slidebar .chat-box li b{font-size:12px;display:block;padding:4px 0 0}.sb-slidebar .chat-box li p{font-size:11px;opacity:.6}.popover-title:hover{text-decoration:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle,.ui-slider .ui-slider-range,.ui-slider-horizontal,.ui-slider-vertical{-webkit-border-radius:100px;-moz-border-radius:100px;border-radius:100px}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:8px;height:8px;border:6px solid #FFF;box-sizing:initial;cursor:pointer;box-shadow:1px 1px 3px rgba(0,0,0,.3)}.ui-slider .ui-slider-handle:active,.ui-slider .ui-slider-handle:hover{border-color:#fff}.ui-slider .ui-slider-range{position:absolute;z-index:1;display:block;border:0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:7px;background:#ddd;-webkit-box-shadow:inset 0 1px 6px #717171;-moz-box-shadow:inset 0 1px 6px #717171;box-shadow:inset 0 1px 6px #717171}.ui-slider-horizontal .ui-slider-handle{top:-7px;margin-left:-7px}.ui-slider-horizontal .ui-slider-range{top:0;height:100%;opacity:.6;-moz-opacity:.6;filter:alpha(opacity: 60)}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:7px;height:100px;background:#ddd;-webkit-box-shadow:inset 1px 0 6px #717171;-moz-box-shadow:inset 1px 0 6px #717171;box-shadow:inset 1px 0 6px #717171}.ui-slider-vertical .ui-slider-handle{left:-7px;margin-bottom:-8px;margin-left:0}.ui-slider-vertical .ui-slider-range{left:0;width:100%;opacity:.6;-moz-opacity:.6;filter:alpha(opacity: 60)}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.note-editor{border:1px solid #bfc8d1}.note-editor .note-dropzone{position:absolute;z-index:1;display:none;opacity:.95;color:#87cefa;border:2px dashed #87cefa;background-color:#fff;pointer-event:none}.note-editor .note-dropzone .note-dropzone-message{font-size:28px;font-weight:700;display:table-cell;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf;border:2px dashed #098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-toolbar{border-bottom:1px solid #bfc8d1;background-color:#FEFEFF}.note-editor.fullscreen{position:fixed;z-index:1050;top:0;left:0;width:100%}.note-editor.fullscreen .note-editable{background-color:#fff}.note-editor.codeview .note-editable,.note-editor.fullscreen .note-resizebar{display:none}.note-editor.codeview .note-codable{display:block}.note-editor .note-statusbar{background-color:#FEFEFF}.note-editor .note-statusbar .note-resizebar{width:100%;height:8px;cursor:s-resize;border-top:1px solid #bfc8d1}.note-editor .note-statusbar .note-resizebar .note-icon-bar{width:20px;margin:1px auto;border-top:1px solid #bfc8d1}.note-editor .note-editable{overflow:auto;padding:10px;outline:0}.note-editor .note-editable[contenteditable=false]{background-color:#dfe8f1}.note-editor .note-codable{font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;display:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-bottom:0;padding:10px;resize:none;color:#ccc;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background-color:#222;box-shadow:none;-ms-box-sizing:border-box}.note-popover .popover{max-width:none}.note-popover .popover .popover-content a{display:inline-block;overflow:hidden;max-width:200px;vertical-align:middle;white-space:nowrap;text-overflow:ellipsis}.editable-buttons,.editable-input,.note-dialog .note-help-dialog .note-shortcut-layout td{vertical-align:top}.note-popover .popover .arrow{left:20px}.note-popover .popover .popover-content,.note-toolbar{margin:0;padding:0 0 5px 5px}.note-popover .popover .popover-content>.btn-group,.note-toolbar>.btn-group{margin-top:5px;margin-right:5px;margin-left:0}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group,.note-popover .popover .popover-content .note-style blockquote,.note-popover .popover .popover-content .note-style h1,.note-popover .popover .popover-content .note-style h2,.note-popover .popover .popover-content .note-style h3,.note-popover .popover .popover-content .note-style h4,.note-popover .popover .popover-content .note-style h5,.note-popover .popover .popover-content .note-style h6,.note-toolbar .note-color .dropdown-menu .btn-group,.note-toolbar .note-style blockquote,.note-toolbar .note-style h1,.note-toolbar .note-style h2,.note-toolbar .note-style h3,.note-toolbar .note-style h4,.note-toolbar .note-style h5,.note-toolbar .note-style h6{margin:0}.note-popover .popover .popover-content .note-table .dropdown-menu,.note-toolbar .note-table .dropdown-menu{min-width:0;padding:5px}.note-popover .popover .popover-content .note-table .dropdown-menu .note-dimension-picker,.note-toolbar .note-table .dropdown-menu .note-dimension-picker{font-size:18px}.note-popover .popover .popover-content .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-mousecatcher,.note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute!important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover .popover-content .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-unhighlighted,.note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative!important;z-index:1;width:5em;height:5em;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC)}.note-popover .popover .popover-content .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-highlighted,.note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-highlighted{position:absolute!important;z-index:2;width:1em;height:1em;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC)}.note-popover .popover .popover-content .note-color .dropdown-toggle,.note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover .popover-content .note-color .dropdown-menu,.note-toolbar .note-color .dropdown-menu{min-width:290px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group:first-child,.note-toolbar .note-color .dropdown-menu .btn-group:first-child{margin:0 5px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-palette-title,.note-toolbar .note-color .dropdown-menu .btn-group .note-palette-title{font-size:12px;margin:2px 7px;text-align:center;border-bottom:1px solid #eee}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset,.note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset{font-size:12px;margin:5px;padding:0 3px;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset:hover,.note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset:hover{background:#eee}.note-popover .popover .popover-content .note-para .dropdown-menu,.note-toolbar .note-para .dropdown-menu{min-width:216px;padding:5px}.note-popover .popover .popover-content .note-para .dropdown-menu>div:first-child,.note-toolbar .note-para .dropdown-menu>div:first-child{margin-right:5px}.note-popover .popover .popover-content .dropdown-menu,.note-toolbar .dropdown-menu{min-width:90px}.note-popover .popover .popover-content .dropdown-menu.right,.note-toolbar .dropdown-menu.right{right:0;left:auto}.note-popover .popover .popover-content .dropdown-menu.right::before,.note-toolbar .dropdown-menu.right::before{right:9px;left:auto!important}.note-popover .popover .popover-content .dropdown-menu.right::after,.note-toolbar .dropdown-menu.right::after{right:10px;left:auto!important}.note-popover .popover .popover-content .dropdown-menu li a i,.note-toolbar .dropdown-menu li a i{visibility:hidden;color:#00bfff}.note-popover .popover .popover-content .dropdown-menu li a.checked i,.note-toolbar .dropdown-menu li a.checked i,.tooltip{visibility:visible}.note-popover .popover .popover-content .note-fontsize-10,.note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover .popover-content .note-color-palette,.note-toolbar .note-color-palette{line-height:1}.note-popover .popover .popover-content .note-color-palette div .note-color-btn,.note-toolbar .note-color-palette div .note-color-btn{width:17px;height:17px;margin:0;padding:0;border:1px solid #fff}.note-popover .popover .popover-content .note-color-palette div .note-color-btn:hover,.note-toolbar .note-color-palette div .note-color-btn:hover{border:1px solid #000}.note-dialog>div{display:none}.note-dialog .note-image-dialog .note-dropzone{font-size:30px;line-height:4;min-height:100px;margin-bottom:10px;text-align:center;color:#d3d3d3;border:4px dashed #d3d3d3}.note-dialog .note-help-dialog{font-size:12px;opacity:.9;color:#ccc;border:0;background:0 0;background-color:#222!important;-webkit-opacity:.9;-khtml-opacity:.9;-moz-opacity:.9;-ms-filter:alpha(opacity=90);filter:alpha(opacity=90)}.note-dialog .note-help-dialog .modal-content{border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:0 0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.note-dialog .note-help-dialog a{font-size:12px;color:#fff}.note-dialog .note-help-dialog .title{font-size:14px;font-weight:700;padding-bottom:5px;color:#fff;border-bottom:#fff 1px solid}.note-dialog .note-help-dialog .modal-close{font-size:14px;cursor:pointer;color:#dd0}.note-dialog .note-help-dialog .note-shortcut-layout{width:100%}.note-dialog .note-help-dialog .note-shortcut{margin-top:8px}.note-dialog .note-help-dialog .note-shortcut th{font-size:13px;text-align:left;color:#dd0}.note-dialog .note-help-dialog .note-shortcut td:first-child{font-family:'Courier New';min-width:110px;padding-right:10px;text-align:right;color:#dd0}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid #000}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;opacity:.3;background-color:#000;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;-ms-filter:alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle,.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid #000}.note-handle .note-control-selection .note-control-sizing{width:7px;height:7px;border:1px solid #000;background-color:#fff}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:0;border-bottom:0}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:0;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:0;border-right:0}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-selection-info{font-size:12px;right:0;bottom:0;margin:5px;padding:5px;opacity:.7;color:#fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background-color:#000;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;-ms-filter:alpha(opacity=70);filter:alpha(opacity=70)}.ui-tabs-nav{margin:0;padding:0;list-style:none;border-bottom:1px solid transparent}.ui-tabs-nav li>a{line-height:32px;height:32px;margin-right:5px;padding:0 20px;border-bottom:0}.ui-tabs-nav li{margin-bottom:-1px}.ui-tabs-panel{display:block;padding:15px;background:0 0}.ui-tabs-panel:last-child{border-bottom:0!important}.ui-tabs-nav>li,.ui-tabs-nav>li>a{position:relative;float:left}.ui-tabs-nav>li>a .float-left.glyph-icon{float:none!important;margin-right:5px}.ui-tabs-nav>li>a .float-right.glyph-icon{float:none!important;margin-right:0;margin-left:5px}.tabs-navigation>ul{margin:0;padding:0;border-width:1px;border-style:solid;border-radius:0;background:#fff}.tabs-navigation>ul li{margin:0}.tabs-navigation>ul li>a{font-size:20px;line-height:64px;height:64px;margin:0!important;padding:0 35px;border-right-width:1px;border-right-style:solid;border-radius:0;background:0 0}.tabs-navigation>ul li.ui-tabs-active a{line-height:64px;height:64px;margin:0!important;padding-bottom:0;color:#000!important;background:#eff4f6}.tabs-navigation>ul li.ui-tabs-active a:hover,.tabs-navigation>ul li>a:hover{background:#eff4f6}#theme-options{position:fixed;top:110px;right:-300px;z-index:9999;width:300px;-webkit-transition:transform .5s ease;-o-transition:transform .5s ease;transition:transform .5s ease}.btn.theme-switcher,.theme-switcher .glyph-icon{width:54px;height:50px;line-height:50px;display:block}#theme-options.active{transform:translateX(-300px);-ms-transform:translateX(-300px);-o-transform:translateX(-300px);-webkit-transform:translateX(-300px)}.btn.theme-switcher{font-size:27px;border-width:1px;border-style:solid;border-right:0;border-radius:3px 0 0 3px;text-align:center;position:absolute;left:-54px;top:25px;z-index:55;padding:0}#theme-switcher-wrapper,#theme-switcher-wrapper .header:first-child{border-top-left-radius:3px}#theme-switcher-wrapper{background:#fff;width:300px;padding:0;border-bottom-left-radius:3px;position:relative;z-index:60;-webkit-transition:transform .5s ease;-o-transition:transform .5s ease;transition:transform .5s ease;max-height:580px}#theme-options.active #theme-switcher-wrapper{box-shadow:0 4px 5px rgba(0,0,0,.3)}#theme-switcher-wrapper .header{background:#FEFEFF;border-top:#dfe8f1 solid 1px;border-bottom:#dfe8f1 solid 1px;text-transform:uppercase;padding:13px 15px 10px;font-size:12px}#theme-switcher-wrapper .header a{font-weight:700;text-transform:capitalize;float:right}#theme-switcher-wrapper ul+.header{border-radius:0}#theme-switcher-wrapper ul li{height:34px;line-height:28px;margin:5px 0;padding:0 15px;border-bottom:#dfe8f1 solid 1px}#theme-switcher-wrapper ul li:last-child{border-bottom:0;margin-bottom:0}#theme-switcher-wrapper ul li label{font-size:13px}.tocify-subheader li,.tooltip{font-size:12px}#theme-switcher-wrapper ul li .switch-toggle{float:right;margin-top:3px}.theme-color-wrapper h5{text-transform:capitalize;font-weight:700;font-size:12px;margin:0 5px 5px}.theme-color-wrapper{padding:10px}.theme-color-wrapper a{height:24px;width:24px;display:block;overflow:hidden;text-indent:-999em;float:left;margin:2px;border-radius:50px;border:2px solid #fff!important;box-shadow:1px 2px 3px rgba(0,0,0,.1);opacity:.8}.theme-color-wrapper a.active,.theme-color-wrapper a:hover{opacity:1;border-color:red!important}.bootstrap-timepicker{position:relative}.dropdown.bootstrap-timepicker{float:none}.bootstrap-timepicker-widget.dropdown-menu.open{display:inline-block;padding:10px}.bootstrap-timepicker-widget table{width:100%;margin:0}.bootstrap-timepicker-widget table td{line-height:32px;width:42px;height:32px}.bootstrap-timepicker-widget table td.separator{width:auto;padding:0 5px}.bootstrap-timepicker-widget table td a{display:block;text-align:center}.bootstrap-timepicker-widget table td a i{margin:0 auto}.bootstrap-timepicker-widget table td input{width:100%;min-width:32px;margin:0;padding:0 5px;text-align:center}.bootstrap-timepicker-widget table td input.bootstrap-timepicker-meridian{font-weight:700}.tocify{margin-top:20px}.tocify li,.tocify ul{list-style:none;margin:0;padding:0;border:none;line-height:30px}.tocify-header{text-indent:10px}.tocify-item{margin-bottom:5px!important}.tocify-subheader{text-indent:20px;display:none}.tocify-subheader .tocify-subheader{text-indent:30px}.tocify-subheader .tocify-subheader .tocify-subheader{text-indent:40px}.nav-list .nav-header,.nav-list>li>a{margin:0}.nav-list>li>a{padding:5px}.tooltip{line-height:1.4;position:absolute;z-index:1030;display:block;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:8px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-8px;padding:0 5px}.tooltip-inner{max-width:200px;padding:10px 15px;text-align:center;text-decoration:none;color:#fff;background-color:rgba(0,0,0,.9)}.tooltip-arrow{position:absolute;width:0;height:0;border-style:solid;border-color:transparent}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,.9)}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:rgba(0,0,0,.9)}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:rgba(0,0,0,.9)}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,.9)}.bootstrap-touchspin .input-group-btn-vertical{position:relative;white-space:nowrap;width:1%;vertical-align:middle;display:table-cell}.bootstrap-touchspin .input-group-btn-vertical>.btn{display:block;float:none;width:100%;max-width:100%;padding:8px 10px;margin-left:-1px;height:auto;position:relative;overflow:hidden}.bootstrap-touchspin .input-group-btn-vertical .bootstrap-touchspin-up{border-radius:0 4px 0 0}.bootstrap-touchspin .input-group-btn-vertical .bootstrap-touchspin-down{margin-top:-2px;border-radius:0 0 4px}.bootstrap-touchspin .input-group-btn-vertical i{position:absolute;top:-8px;left:11px;font-size:9px;font-weight:400}div[id^=uniform-],div[id^=uniform-] input,div[id^=uniform-] span{line-height:18px;display:block;float:left;width:auto;width:20px;height:auto;height:20px;margin:0 3px 0 0;padding:0;cursor:pointer}div[id^=uniform-]{margin-right:10px;opacity:.9;filter:alpha(opacity=90);-moz-opacity:90}div[id^=uniform-] span{position:relative;display:-moz-inline-box;display:inline-block;zoom:1;margin-top:-1px;text-align:center;border-width:1px;border-style:solid}div.radio[id^=uniform-]>span{margin-top:-7px}.input-group-addon div[id^=uniform-] span i,div[id^=uniform-] span i{display:none}div[id^=uniform-] span.checked i{font-size:14px;line-height:18px;display:block;height:18px}div.radio[id^=uniform-] span.checked i{font-size:9px}div.radio[id^=uniform-] span{border-radius:50px}div[id^=uniform-] input{position:absolute;top:0;left:0;display:-moz-inline-box;display:inline-block;zoom:1;opacity:0;border:none;background:0 0;filter:alpha(opacity=0);-moz-opacity:0}div.checker[id^=uniform-] label{line-height:19px}div.selector{line-height:38px;position:relative;display:block;overflow:hidden;width:auto!important;height:38px;margin:0;padding:0 10px!important;cursor:pointer;white-space:nowrap;text-decoration:none;border-width:1px;border-style:solid}.selector i,div.selector span{line-height:38px;display:block;height:38px;padding:0!important}.selector i{position:absolute;z-index:4;top:50%;right:0;width:38px;margin-top:-19px;text-align:center;border-left:1px solid transparent}div.selector select{position:absolute;z-index:5;top:0;left:0;width:100%;height:38px;opacity:0;border:none;background:0 0;filter:alpha(opacity=0);-moz-opacity:0}div.selector span{width:auto!important}.form-wizard>ul{position:relative;display:table;width:100%;margin:0 0 20px;list-style:none}.form-wizard>ul>li{display:table-cell;width:1%;text-align:center}.form-wizard>ul>li a,.form-wizard>ul>li a:hover{position:relative;display:block;opacity:1;color:#666;-moz-opacity:1;filter:alpha(opacity: 100)}.form-wizard>ul>li a:before{position:absolute;z-index:4;top:20px;left:0;width:100%;height:4px;background:#ccc}.form-wizard>ul>li:first-child a:before{left:50%}.form-wizard>ul>li:last-child a:before{right:50%;left:auto;width:50%}.form-wizard>ul>li a .wizard-step{font-size:16px;line-height:42px;position:relative;z-index:5;display:block;width:40px;height:40px;margin:0 auto 5px;cursor:pointer;text-align:center;color:#fafafa;border-radius:100px;background:#ccc}.form-wizard>ul>li a .wizard-description{font-size:13px;font-weight:700;opacity:.6;-moz-opacity:.6;filter:alpha(opacity: 60)}.form-wizard>ul>li a .wizard-description small{font-size:12px;font-weight:400;display:block;padding:3px 0 0;opacity:.7;-moz-opacity:.7;filter:alpha(opacity: 70)}.form-wizard>ul>li a .wizard-description:hover,.form-wizard>ul>li.active a .wizard-description{opacity:1;-moz-opacity:1;filter:alpha(opacity: 100)}.form-wizard>ul>li a.disabled .wizard-step{background:#ccc}.loader,.msgBox{display:none}.actionBar{margin-top:20px;margin-bottom:20px;padding:20px 0 0;border-top:#ddd solid 1px}.actionBar a.btn{float:right;margin-left:10px}/*! X-editable - v1.5.1 * In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery * http://github.com/vitalets/x-editable * Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */.editableform{margin-bottom:0}.editableform .control-group{margin-bottom:0;white-space:nowrap;line-height:20px}.editableform .form-control{width:auto}.editable-buttons{display:inline-block;margin-left:7px;zoom:1}.editable-buttons.editable-buttons-bottom{display:block;margin-top:7px;margin-left:0}.editable-input{display:inline-block;width:auto;white-space:normal;zoom:1}.editable-buttons .editable-cancel{margin-left:7px}.editable-buttons button.ui-button-icon-only{height:24px;width:30px}.editableform-loading{background:url(../img/loading.gif) center center no-repeat;height:25px;width:auto;min-width:25px}.editable-inline .editableform-loading{background-position:left 5px}.editable-error-block{max-width:300px;margin:5px 0 0;width:auto;white-space:normal}.editable-error-block.ui-state-error{padding:3px}.editable-error{color:red}.editableform .editable-date{padding:0;margin:0;float:left}.editable-inline .add-on .icon-th{margin-top:3px;margin-left:1px}.editable-checklist label input[type=checkbox],.editable-checklist label span{vertical-align:middle;margin:0}.editable-checklist label{white-space:nowrap}.editable-wysihtml5{width:566px;height:250px}.editable-clear{clear:both;font-size:.9em;text-decoration:none;text-align:right}.editable-clear-x{background:url(../img/clear.png) center center no-repeat;display:block;width:13px;height:13px;position:absolute;opacity:.6;z-index:100;top:50%;right:6px;margin-top:-6px}.editable-clear-x:hover{opacity:1}.editable-pre-wrapped{white-space:pre-wrap}.editable-container.editable-popup{max-width:none!important}.editable-container.popover{width:auto}.editable-container.editable-inline{display:inline-block;vertical-align:middle;width:auto;zoom:1}.editable-container.ui-widget{font-size:inherit;z-index:9990}.editable-click,a.editable-click,a.editable-click:hover{text-decoration:none;border-bottom:dashed 1px #08c}.editable-click.editable-disabled,a.editable-click.editable-disabled,a.editable-click.editable-disabled:hover{color:#585858;cursor:default;border-bottom:none}.editable-empty,.editable-empty:focus,.editable-empty:hover{font-style:italic;color:#D14;text-decoration:none}.editable-unsaved{font-weight:700}.editable-bg-transition{-webkit-transition:background-color 1.4s ease-out;-moz-transition:background-color 1.4s ease-out;-o-transition:background-color 1.4s ease-out;-ms-transition:background-color 1.4s ease-out;transition:background-color 1.4s ease-out}.form-horizontal .editable{padding-top:5px;display:inline-block}/*! diff --git a/public/static/baseTemplate/assets/mobile-responsive.css b/public/static/baseTemplate/assets/mobile-responsive.css index 470cab7d7..35e2674e5 100644 --- a/public/static/baseTemplate/assets/mobile-responsive.css +++ b/public/static/baseTemplate/assets/mobile-responsive.css @@ -270,7 +270,7 @@ p { padding-left: 15px; padding-right: 15px; } - + .table-responsive { border: none; margin-bottom: 20px; @@ -284,19 +284,19 @@ p { max-width: 100%; margin-bottom: 20px; } - + /* Adjust sidebar for tablets */ #page-sidebar { width: 100%; position: static; height: auto; } - + /* Make tables horizontally scrollable */ .table-responsive { overflow-x: auto; } - + .table { min-width: 600px; } @@ -307,17 +307,17 @@ p { html { font-size: 14px; } - + body { font-size: 14px; padding: 0; } - + .container, .container-fluid { padding-left: 10px; padding-right: 10px; } - + /* Stack all columns on mobile */ .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-6, .col-sm-8, .col-sm-9, .col-sm-12, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-6, .col-md-8, .col-md-9, .col-md-12 { @@ -325,24 +325,24 @@ p { max-width: 100%; margin-bottom: 15px; } - + /* Adjust headings for mobile */ h1 { font-size: 2rem !important; /* 32px */ } - + h2 { font-size: 1.75rem !important; /* 28px */ } - + h3 { font-size: 1.5rem !important; /* 24px */ } - + h4 { font-size: 1.25rem !important; /* 20px */ } - + /* Button adjustments for mobile */ .btn { font-size: 16px !important; @@ -350,50 +350,50 @@ p { width: 100%; margin-bottom: 10px; } - + .btn-group .btn { width: auto; margin-bottom: 0; } - + /* Form adjustments for mobile */ .form-control, input, textarea, select { font-size: 16px !important; /* Prevents zoom on iOS */ padding: 14px 16px !important; width: 100%; } - + /* Table adjustments for mobile */ .table { font-size: 14px !important; } - + .table th, .table td { padding: 8px 6px !important; font-size: 13px !important; } - + /* Hide less important columns on mobile */ .table .d-none-mobile { display: none !important; } - + /* Modal adjustments for mobile */ .modal-dialog { margin: 10px; width: calc(100% - 20px); } - + .modal-content { padding: 20px 15px; } - + /* Content box adjustments */ .content-box, .panel, .card { padding: 15px; margin-bottom: 15px; } - + /* Sidebar adjustments for mobile */ #page-sidebar { position: fixed; @@ -406,20 +406,20 @@ p { background-color: #ffffff; box-shadow: 2px 0 10px rgba(0,0,0,0.1); } - + #page-sidebar.show { left: 0; } - + /* Main content adjustments when sidebar is open */ #main-content { transition: margin-left 0.3s ease; } - + #main-content.sidebar-open { margin-left: 280px; } - + /* Mobile menu toggle */ .mobile-menu-toggle { display: block; @@ -442,29 +442,29 @@ p { html { font-size: 14px; } - + .container, .container-fluid { padding-left: 8px; padding-right: 8px; } - + /* Even smaller buttons and forms for very small screens */ .btn { font-size: 14px !important; padding: 12px 16px !important; } - + .form-control, input, textarea, select { font-size: 16px !important; /* Still 16px to prevent zoom */ padding: 12px 14px !important; } - + /* Compact table for very small screens */ .table th, .table td { padding: 6px 4px !important; font-size: 12px !important; } - + /* Hide even more columns on very small screens */ .table .d-none-mobile-sm { display: none !important; @@ -577,12 +577,12 @@ span, div, p, label, td, th { color: #000000 !important; background: #ffffff !important; } - + .table th, .table td { font-size: 10pt !important; color: #000000 !important; } - + .btn, .alert, .modal { display: none !important; } diff --git a/public/static/baseTemplate/assets/readability-fixes.css b/public/static/baseTemplate/assets/readability-fixes.css index eaf2957fa..1911482b7 100644 --- a/public/static/baseTemplate/assets/readability-fixes.css +++ b/public/static/baseTemplate/assets/readability-fixes.css @@ -216,7 +216,7 @@ span, div, p, label, td, th, a, li { .container-fluid { color: var(--text-primary) !important; } - + /* Fix mobile menu text */ .mobile-menu .menu-item, .mobile-menu .menu-item span { @@ -233,7 +233,7 @@ span, div, p, label, td, th, a, li { color: #000000 !important; background: #ffffff !important; } - + .text-muted, .text-secondary { color: #000000 !important; @@ -247,7 +247,7 @@ span, div, p, label, td, th, a, li { --text-secondary: #000000; --text-heading: #000000; } - + [data-theme="dark"] { --text-primary: #ffffff; --text-secondary: #ffffff; diff --git a/public/static/baseTemplate/custom-js/system-status.js b/public/static/baseTemplate/custom-js/system-status.js index 37720ec3e..b4cf11a11 100644 --- a/public/static/baseTemplate/custom-js/system-status.js +++ b/public/static/baseTemplate/custom-js/system-status.js @@ -830,7 +830,7 @@ app.controller('OnboardingCP', function ($scope, $http, $timeout, $window) { $scope.ExecutionStatus = true; $scope.ReportStatus = true; $scope.OnboardineDone = true; - + var statusTimer = null; function statusFunc() { @@ -988,7 +988,7 @@ app.controller('OnboardingCP', function ($scope, $http, $timeout, $window) { // Single implementation registered under both names for compatibility (some templates/caches use newDashboardStat) var dashboardStatsControllerFn = function ($scope, $http, $timeout) { console.log('dashboardStatsController initialized'); - + // Card values $scope.totalUsers = 0; $scope.totalSites = 0; @@ -996,7 +996,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.totalDBs = 0; $scope.totalEmails = 0; $scope.totalFTPUsers = 0; - + // Hide system charts for non-admin users $scope.hideSystemCharts = false; @@ -1022,63 +1022,199 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { // SSH Logins $scope.sshLogins = []; + $scope.sshLoginsPaginated = []; + $scope.sshLoginsCurrentPage = 1; + $scope.sshLoginsPerPage = 10; + $scope.sshLoginsGoToPage = 1; $scope.loadingSSHLogins = true; $scope.errorSSHLogins = ''; + + $scope.getSSHLoginsTotalPages = function() { + return Math.ceil($scope.sshLogins.length / $scope.sshLoginsPerPage); + }; + + $scope.getSSHLoginsStart = function() { + if (!$scope.sshLogins || $scope.sshLogins.length === 0) { + return 0; + } + return ($scope.sshLoginsCurrentPage - 1) * $scope.sshLoginsPerPage + 1; + }; + + $scope.getSSHLoginsEnd = function() { + if (!$scope.sshLogins || $scope.sshLogins.length === 0) { + return 0; + } + var end = $scope.sshLoginsCurrentPage * $scope.sshLoginsPerPage; + return Math.min(end, $scope.sshLogins.length); + }; + + $scope.updateSSHLoginsPaginated = function() { + if (!$scope.sshLogins || $scope.sshLogins.length === 0) { + $scope.sshLoginsPaginated = []; + console.log('updateSSHLoginsPaginated: No data, cleared paginated array'); + return; + } + var start = ($scope.sshLoginsCurrentPage - 1) * $scope.sshLoginsPerPage; + var end = start + $scope.sshLoginsPerPage; + $scope.sshLoginsPaginated = $scope.sshLogins.slice(start, end); + console.log('updateSSHLoginsPaginated: start=', start, 'end=', end, 'total=', $scope.sshLogins.length, 'paginated=', $scope.sshLoginsPaginated.length); + }; + + $scope.sshLoginsPrevPage = function() { + if ($scope.sshLoginsCurrentPage > 1) { + $scope.sshLoginsCurrentPage--; + $scope.updateSSHLoginsPaginated(); + } + }; + + $scope.sshLoginsNextPage = function() { + if ($scope.sshLoginsCurrentPage < $scope.getSSHLoginsTotalPages()) { + $scope.sshLoginsCurrentPage++; + $scope.updateSSHLoginsPaginated(); + } + }; + + $scope.sshLoginsGoToPageNumber = function() { + var page = parseInt($scope.sshLoginsGoToPage); + var totalPages = $scope.getSSHLoginsTotalPages(); + if (page >= 1 && page <= totalPages) { + $scope.sshLoginsCurrentPage = page; + $scope.updateSSHLoginsPaginated(); + } else { + $scope.sshLoginsGoToPage = $scope.sshLoginsCurrentPage; + } + }; + $scope.refreshSSHLogins = function() { $scope.loadingSSHLogins = true; var h = { headers: { 'X-CSRFToken': (typeof getCookie === 'function') ? getCookie('csrftoken') : '' } }; $http.get('/base/getRecentSSHLogins', h).then(function (response) { $scope.loadingSSHLogins = false; - if (response.data && response.data.logins) { + console.log('SSH Logins response:', response.data); + if (response.data && response.data.logins && Array.isArray(response.data.logins)) { $scope.sshLogins = response.data.logins; - // Debug: Log first login to see structure - if ($scope.sshLogins.length > 0) { - console.log('First SSH login object:', $scope.sshLogins[0]); - console.log('IP field:', $scope.sshLogins[0].ip); - console.log('All keys:', Object.keys($scope.sshLogins[0])); - } + $scope.sshLoginsCurrentPage = 1; + $scope.sshLoginsGoToPage = 1; + $scope.updateSSHLoginsPaginated(); } else { + console.warn('SSH Logins: No data or invalid format', response.data); $scope.sshLogins = []; + $scope.sshLoginsPaginated = []; } }, function (err) { $scope.loadingSSHLogins = false; + console.error('SSH Logins error:', err); $scope.errorSSHLogins = 'Failed to load SSH logins.'; console.error('Failed to load SSH logins:', err); + $scope.sshLogins = []; + $scope.sshLoginsPaginated = []; }); }; // SSH Logs $scope.sshLogs = []; + $scope.sshLogsPaginated = []; + $scope.sshLogsCurrentPage = 1; + $scope.sshLogsPerPage = 10; + $scope.sshLogsGoToPage = 1; $scope.loadingSSHLogs = true; $scope.errorSSHLogs = ''; $scope.securityAlerts = []; $scope.loadingSecurityAnalysis = false; + + $scope.getSSHLogsTotalPages = function() { + return Math.ceil($scope.sshLogs.length / $scope.sshLogsPerPage); + }; + + $scope.getSSHLogsStart = function() { + if (!$scope.sshLogs || $scope.sshLogs.length === 0) { + return 0; + } + return ($scope.sshLogsCurrentPage - 1) * $scope.sshLogsPerPage + 1; + }; + + $scope.getSSHLogsEnd = function() { + if (!$scope.sshLogs || $scope.sshLogs.length === 0) { + return 0; + } + var end = $scope.sshLogsCurrentPage * $scope.sshLogsPerPage; + return Math.min(end, $scope.sshLogs.length); + }; + + $scope.updateSSHLogsPaginated = function() { + if (!$scope.sshLogs || $scope.sshLogs.length === 0) { + $scope.sshLogsPaginated = []; + console.log('updateSSHLogsPaginated: No data, cleared paginated array'); + return; + } + var start = ($scope.sshLogsCurrentPage - 1) * $scope.sshLogsPerPage; + var end = start + $scope.sshLogsPerPage; + $scope.sshLogsPaginated = $scope.sshLogs.slice(start, end); + console.log('updateSSHLogsPaginated: start=', start, 'end=', end, 'total=', $scope.sshLogs.length, 'paginated=', $scope.sshLogsPaginated.length); + }; + + $scope.sshLogsPrevPage = function() { + if ($scope.sshLogsCurrentPage > 1) { + $scope.sshLogsCurrentPage--; + $scope.updateSSHLogsPaginated(); + } + }; + + $scope.sshLogsNextPage = function() { + if ($scope.sshLogsCurrentPage < $scope.getSSHLogsTotalPages()) { + $scope.sshLogsCurrentPage++; + $scope.updateSSHLogsPaginated(); + } + }; + + $scope.sshLogsGoToPageNumber = function() { + var page = parseInt($scope.sshLogsGoToPage); + var totalPages = $scope.getSSHLogsTotalPages(); + if (page >= 1 && page <= totalPages) { + $scope.sshLogsCurrentPage = page; + $scope.updateSSHLogsPaginated(); + } else { + $scope.sshLogsGoToPage = $scope.sshLogsCurrentPage; + } + }; + $scope.refreshSSHLogs = function() { $scope.loadingSSHLogs = true; var h = { headers: { 'X-CSRFToken': (typeof getCookie === 'function') ? getCookie('csrftoken') : '' } }; $http.get('/base/getRecentSSHLogs', h).then(function (response) { $scope.loadingSSHLogs = false; - if (response.data && response.data.logs) { + console.log('SSH Logs response:', response.data); + if (response.data && response.data.logs && Array.isArray(response.data.logs)) { $scope.sshLogs = response.data.logs; + $scope.sshLogsCurrentPage = 1; + $scope.sshLogsGoToPage = 1; + console.log('SSH Logs loaded:', $scope.sshLogs.length, 'items'); + $scope.updateSSHLogsPaginated(); + console.log('SSH Logs paginated:', $scope.sshLogsPaginated.length, 'items'); // Analyze logs for security issues $scope.analyzeSSHSecurity(); } else { + console.warn('SSH Logs: No data or invalid format', response.data); $scope.sshLogs = []; + $scope.sshLogsPaginated = []; } }, function (err) { $scope.loadingSSHLogs = false; + console.error('SSH Logs error:', err); $scope.errorSSHLogs = 'Failed to load SSH logs.'; + $scope.sshLogs = []; + $scope.sshLogsPaginated = []; }); }; - + // Security Analysis $scope.showAddonRequired = false; $scope.addonInfo = {}; - + // IP Blocking functionality $scope.blockingIP = null; $scope.blockedIPs = {}; - + $scope.analyzeSSHSecurity = function() { $scope.loadingSecurityAnalysis = true; $scope.showAddonRequired = false; @@ -1098,7 +1234,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.loadingSecurityAnalysis = false; }); }; - + $scope.blockIPAddress = function(ipAddress) { try { console.log('========================================'); @@ -1109,7 +1245,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { console.log('ipAddress value:', ipAddress); console.log('$scope:', $scope); console.log('$scope.blockIPAddress:', typeof $scope.blockIPAddress); - + // Validate IP address parameter if (!ipAddress) { console.error('No IP address provided:', ipAddress); @@ -1123,10 +1259,10 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } return; } - + // Ensure it's a string and trim it ipAddress = String(ipAddress).trim(); - + // Validate after trimming if (!ipAddress || ipAddress === '' || ipAddress === 'undefined' || ipAddress === 'null') { console.error('IP address is empty or invalid after trim:', ipAddress); @@ -1140,7 +1276,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } return; } - + // Basic IP format validation var ipPattern = /^(\d{1,3}\.){3}\d{1,3}(\/\d{1,2})?$/; if (!ipPattern.test(ipAddress)) { @@ -1155,51 +1291,51 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } return; } - + // Prevent duplicate requests if ($scope.blockingIP === ipAddress) { console.log('Already processing IP:', ipAddress); return; // Already processing this IP } - + // Do not early-return when IP is already in blockedIPs: still call the API so the // backend can close any active connections from this IP (already-banned path). - + // Set blocking flag to prevent duplicate requests $scope.blockingIP = ipAddress; - + // Use the new Banned IPs system instead of the old blockIPAddress var data = { ip: ipAddress, reason: 'Brute force attack detected from SSH Security Analysis', duration: 'permanent' }; - + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; - + console.log('Sending ban IP request:', data); console.log('CSRF Token:', getCookie('csrftoken')); console.log('Config:', config); - + $http.post('/firewall/addBannedIP', data, config).then(function (response) { console.log('=== addBannedIP SUCCESS ==='); console.log('Full response:', response); console.log('response.data:', response.data); console.log('response.data type:', typeof response.data); console.log('response.status:', response.status); - + // Reset blocking flag $scope.blockingIP = null; - + // Apply scope changes if (!$scope.$$phase && !$scope.$root.$$phase) { $scope.$apply(); } - + // Handle both JSON string and object responses var responseData = response.data; if (typeof responseData === 'string') { @@ -1216,12 +1352,12 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { return; } } - + console.log('Final responseData:', responseData); console.log('responseData.status:', responseData ? responseData.status : 'undefined'); console.log('responseData.message:', responseData ? responseData.message : 'undefined'); console.log('responseData.error_message:', responseData ? responseData.error_message : 'undefined'); - + // Check for success (status === 1 or status === '1') if (responseData && (responseData.status === 1 || responseData.status === '1')) { // Mark IP as blocked @@ -1229,7 +1365,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.blockedIPs = {}; } $scope.blockedIPs[ipAddress] = true; - + // Show success notification (use server message when present, e.g. already-banned + connections closed) if (typeof PNotify !== 'undefined') { var successText = (responseData.message && responseData.message.length) ? responseData.message : `IP address ${ipAddress} has been permanently banned and added to the firewall. You can manage it in the Firewall > Banned IPs section.`; @@ -1240,12 +1376,12 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { delay: 5000 }); } - + // Refresh security analysis to update alerts if ($scope.analyzeSSHSecurity) { $scope.analyzeSSHSecurity(); } - + // Apply scope changes if (!$scope.$$phase && !$scope.$root.$$phase) { $scope.$apply(); @@ -1278,16 +1414,16 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { console.error('Error status:', err.status); console.error('Error statusText:', err.statusText); console.error('Error data:', err.data); - + // Prevent showing duplicate error notifications if ($scope.lastErrorIP === ipAddress && $scope.lastErrorTime && (Date.now() - $scope.lastErrorTime) < 2000) { console.log('Skipping duplicate error notification for IP:', ipAddress); return; } - + $scope.lastErrorIP = ipAddress; $scope.lastErrorTime = Date.now(); - + var errorMessage = 'Failed to block IP address'; var errData = err.data; if (typeof errData === 'string') { @@ -1304,9 +1440,9 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } else if (err.status) { errorMessage = 'HTTP ' + err.status + ': ' + (errorMessage); } - + console.error('Final error message:', errorMessage); - + if (typeof PNotify !== 'undefined') { new PNotify({ title: 'Error', @@ -1334,7 +1470,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } } }; - + // Ban IP from SSH Logs $scope.banIPFromSSHLog = function(ipAddress) { if (!ipAddress) { @@ -1346,37 +1482,37 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }); return; } - + if ($scope.blockingIP === ipAddress) { return; // Already processing } - + // Still call API when already in blockedIPs so backend can close active connections if (!$scope.blockedIPs) { $scope.blockedIPs = {}; } - + $scope.blockingIP = ipAddress; - + // Use the Banned IPs system var data = { ip: ipAddress, reason: 'Suspicious activity detected from SSH logs', duration: 'permanent' }; - + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; - + $http.post('/firewall/addBannedIP', data, config).then(function (response) { $scope.blockingIP = null; if (response.data && response.data.status === 1) { // Mark IP as blocked $scope.blockedIPs[ipAddress] = true; - + // Show success notification new PNotify({ title: 'IP Address Banned', @@ -1384,7 +1520,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { type: 'success', delay: 5000 }); - + // Refresh SSH logs to update the UI $scope.refreshSSHLogs(); } else { @@ -1395,7 +1531,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } else if (response.data && response.data.error) { errorMsg = response.data.error; } - + new PNotify({ title: 'Error', text: errorMsg, @@ -1413,7 +1549,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } else if (err.data && err.data.message) { errorMessage = err.data.message; } - + new PNotify({ title: 'Error', text: errorMessage, @@ -1422,7 +1558,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }); }); }; - + // Ban IP from SSH Logs $scope.banIPFromSSHLog = function(ipAddress) { if (!ipAddress) { @@ -1434,37 +1570,37 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }); return; } - + if ($scope.blockingIP === ipAddress) { return; // Already processing } - + // Still call API when already in blockedIPs so backend can close active connections if (!$scope.blockedIPs) { $scope.blockedIPs = {}; } - + $scope.blockingIP = ipAddress; - + // Use the Banned IPs system var data = { ip: ipAddress, reason: 'Suspicious activity detected from SSH logs', duration: 'permanent' }; - + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; - + $http.post('/firewall/addBannedIP', data, config).then(function (response) { $scope.blockingIP = null; if (response.data && response.data.status === 1) { // Mark IP as blocked $scope.blockedIPs[ipAddress] = true; - + // Show success notification new PNotify({ title: 'IP Address Banned', @@ -1472,7 +1608,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { type: 'success', delay: 5000 }); - + // Refresh SSH logs to update the UI $scope.refreshSSHLogs(); } else { @@ -1483,7 +1619,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } else if (response.data && response.data.error) { errorMsg = response.data.error; } - + new PNotify({ title: 'Error', text: errorMsg, @@ -1501,7 +1637,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } else if (err.data && err.data.message) { errorMessage = err.data.message; } - + new PNotify({ title: 'Error', text: errorMessage, @@ -1767,31 +1903,31 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { data: { labels: [], datasets: [ - { - label: 'Download', - data: [], - borderColor: '#5b5fcf', - backgroundColor: 'rgba(91,95,207,0.1)', + { + label: 'Download', + data: [], + borderColor: '#5b5fcf', + backgroundColor: 'rgba(91,95,207,0.1)', pointBackgroundColor: '#5b5fcf', pointBorderColor: '#5b5fcf', pointRadius: 3, pointHoverRadius: 5, borderWidth: 2, - tension: 0.4, - fill: true + tension: 0.4, + fill: true }, - { - label: 'Upload', - data: [], - borderColor: '#4a90e2', - backgroundColor: 'rgba(74,144,226,0.1)', + { + label: 'Upload', + data: [], + borderColor: '#4a90e2', + backgroundColor: 'rgba(74,144,226,0.1)', pointBackgroundColor: '#4a90e2', pointBorderColor: '#4a90e2', pointRadius: 3, pointHoverRadius: 5, borderWidth: 2, - tension: 0.4, - fill: true + tension: 0.4, + fill: true } ] }, @@ -1800,20 +1936,20 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { maintainAspectRatio: false, animation: { duration: 0 }, plugins: { - legend: { - display: true, + legend: { + display: true, position: 'top', - labels: { + labels: { font: { size: 12, weight: '600' }, color: '#64748b', usePointStyle: true, padding: 20 - } + } }, title: { display: false }, - tooltip: { - enabled: true, - mode: 'index', + tooltip: { + enabled: true, + mode: 'index', intersect: false, backgroundColor: 'rgba(255,255,255,0.95)', titleColor: '#2f3640', @@ -1826,18 +1962,18 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }, interaction: { mode: 'nearest', axis: 'x', intersect: false }, scales: { - x: { - grid: { color: '#f0f0ff', drawBorder: false }, - ticks: { + x: { + grid: { color: '#f0f0ff', drawBorder: false }, + ticks: { font: { size: 11 }, color: '#94a3b8', maxTicksLimit: 8 } }, - y: { - beginAtZero: true, - grid: { color: '#f0f0ff', drawBorder: false }, - ticks: { + y: { + beginAtZero: true, + grid: { color: '#f0f0ff', drawBorder: false }, + ticks: { font: { size: 11 }, color: '#94a3b8' } @@ -1862,31 +1998,31 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { data: { labels: [], datasets: [ - { - label: 'Read', - data: [], - borderColor: '#5b5fcf', - backgroundColor: 'rgba(91,95,207,0.1)', + { + label: 'Read', + data: [], + borderColor: '#5b5fcf', + backgroundColor: 'rgba(91,95,207,0.1)', pointBackgroundColor: '#5b5fcf', pointBorderColor: '#5b5fcf', pointRadius: 3, pointHoverRadius: 5, borderWidth: 2, - tension: 0.4, - fill: true + tension: 0.4, + fill: true }, - { - label: 'Write', - data: [], - borderColor: '#e74c3c', - backgroundColor: 'rgba(231,76,60,0.1)', + { + label: 'Write', + data: [], + borderColor: '#e74c3c', + backgroundColor: 'rgba(231,76,60,0.1)', pointBackgroundColor: '#e74c3c', pointBorderColor: '#e74c3c', pointRadius: 3, pointHoverRadius: 5, borderWidth: 2, - tension: 0.4, - fill: true + tension: 0.4, + fill: true } ] }, @@ -1895,20 +2031,20 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { maintainAspectRatio: false, animation: { duration: 0 }, plugins: { - legend: { - display: true, + legend: { + display: true, position: 'top', - labels: { + labels: { font: { size: 12, weight: '600' }, color: '#64748b', usePointStyle: true, padding: 20 - } + } }, title: { display: false }, - tooltip: { - enabled: true, - mode: 'index', + tooltip: { + enabled: true, + mode: 'index', intersect: false, backgroundColor: 'rgba(255,255,255,0.95)', titleColor: '#2f3640', @@ -1921,18 +2057,18 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }, interaction: { mode: 'nearest', axis: 'x', intersect: false }, scales: { - x: { - grid: { color: '#f0f0ff', drawBorder: false }, - ticks: { + x: { + grid: { color: '#f0f0ff', drawBorder: false }, + ticks: { font: { size: 11 }, color: '#94a3b8', maxTicksLimit: 8 } }, - y: { - beginAtZero: true, - grid: { color: '#f0f0ff', drawBorder: false }, - ticks: { + y: { + beginAtZero: true, + grid: { color: '#f0f0ff', drawBorder: false }, + ticks: { font: { size: 11 }, color: '#94a3b8' } @@ -1950,18 +2086,18 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { data: { labels: [], datasets: [ - { - label: 'CPU Usage (%)', - data: [], - borderColor: '#5b5fcf', - backgroundColor: 'rgba(91,95,207,0.1)', + { + label: 'CPU Usage (%)', + data: [], + borderColor: '#5b5fcf', + backgroundColor: 'rgba(91,95,207,0.1)', pointBackgroundColor: '#5b5fcf', pointBorderColor: '#5b5fcf', pointRadius: 3, pointHoverRadius: 5, borderWidth: 2, - tension: 0.4, - fill: true + tension: 0.4, + fill: true } ] }, @@ -1970,20 +2106,20 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { maintainAspectRatio: false, animation: { duration: 0 }, plugins: { - legend: { - display: true, + legend: { + display: true, position: 'top', - labels: { + labels: { font: { size: 12, weight: '600' }, color: '#64748b', usePointStyle: true, padding: 20 - } + } }, title: { display: false }, - tooltip: { - enabled: true, - mode: 'index', + tooltip: { + enabled: true, + mode: 'index', intersect: false, backgroundColor: 'rgba(255,255,255,0.95)', titleColor: '#2f3640', @@ -1996,19 +2132,19 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }, interaction: { mode: 'nearest', axis: 'x', intersect: false }, scales: { - x: { - grid: { color: '#f0f0ff', drawBorder: false }, - ticks: { + x: { + grid: { color: '#f0f0ff', drawBorder: false }, + ticks: { font: { size: 11 }, color: '#94a3b8', maxTicksLimit: 8 } }, - y: { - beginAtZero: true, - max: 100, - grid: { color: '#f0f0ff', drawBorder: false }, - ticks: { + y: { + beginAtZero: true, + max: 100, + grid: { color: '#f0f0ff', drawBorder: false }, + ticks: { font: { size: 11 }, color: '#94a3b8' } @@ -2030,7 +2166,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { if (cpuChart) cpuChart.resize(); }, 100); }); - + // Also handle custom tab switching document.addEventListener('DOMContentLoaded', function() { var tabs = document.querySelectorAll('a[data-toggle="tab"]'); @@ -2051,7 +2187,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.refreshTopProcesses(); $scope.refreshSSHLogins(); $scope.refreshSSHLogs(); - + $timeout(function() { // Always create charts so Traffic/Disk IO/CPU tabs have something to show; admin check only affects hideSystemCharts setupCharts(); @@ -2065,7 +2201,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { console.warn('getAdminStatus failed:', err); $scope.hideSystemCharts = true; }); - + // Start polling for all stats (data feeds charts) function pollAll() { pollDashboardStats(); @@ -2084,29 +2220,29 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.sshActivityUser = ''; $scope.loadingSSHActivity = false; $scope.errorSSHActivity = ''; - + $scope.viewSSHActivity = function(login, event) { $scope.showSSHActivityModal = true; $scope.sshActivity = { processes: [], w: [] }; $scope.sshActivityUser = login.user; - + // Extract IP from multiple sources - comprehensive extraction for IPv4 and IPv6 var extractedIP = ''; - + // Method 1: Direct property access (highest priority - from backend) if (login && login.ip) { extractedIP = login.ip.toString().trim(); } else if (login && login['ip']) { extractedIP = login['ip'].toString().trim(); } - + // Method 2: Alternative field names if (!extractedIP && login) { if (login.ipAddress) extractedIP = login.ipAddress.toString().trim(); else if (login['IP Address']) extractedIP = login['IP Address'].toString().trim(); else if (login['IP']) extractedIP = login['IP'].toString().trim(); } - + // Method 3: Extract from raw line using regex (IPv4 and IPv6) if (!extractedIP && login && login.raw) { // Try IPv4 first (most common) @@ -2117,7 +2253,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { extractedIP = ipv4; } } - + // If no valid IPv4, try IPv6 if (!extractedIP) { // IPv6 pattern: matches full IPv6 addresses and compressed forms @@ -2131,13 +2267,13 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } } } - + // Method 4: Try to get from event target data attribute as fallback if (!extractedIP && event && event.currentTarget) { var dataIP = event.currentTarget.getAttribute('data-ip'); if (dataIP) extractedIP = dataIP.toString().trim(); } - + // Final fallback: search entire raw line for any IP if (!extractedIP && login && login.raw) { // Try all IPv4 addresses @@ -2165,13 +2301,13 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } } } - + // Final cleanup $scope.sshActivityIP = (extractedIP || '').toString().trim(); $scope.sshActivityTTY = ''; // Store TTY for kill session // Check both 'session' and 'activity' fields for status $scope.sshActivityStatus = login.session || login.activity || ''; - + // Use backend is_active field if available (most reliable) // Fallback to checking session text if is_active is not set // IMPORTANT: Check for both boolean true and string 'true' (JSON might serialize differently) @@ -2185,7 +2321,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.isActiveSession = (sessionStatus.indexOf('still logged in') !== -1); console.log('Using fallback session text check:', sessionStatus, '-> isActiveSession:', $scope.isActiveSession); } - + // If IP is still empty, try one more time with more aggressive extraction if (!$scope.sshActivityIP && login) { console.log('IP still empty, trying aggressive extraction...'); @@ -2227,7 +2363,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } } } - + // Debug logging - detailed inspection console.log('View SSH Activity - Login object:', login); console.log('Login keys:', Object.keys(login)); @@ -2250,7 +2386,6 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.sshActivityTTY = tty; } } - // Also try to extract from session field or raw line if (!tty && login.session) { var sessionMatch = login.session.match(/(pts\/[0-9]+)/); if (sessionMatch) { @@ -2258,36 +2393,27 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.sshActivityTTY = tty; } } - // Also check raw line for TTY - if (!tty && login.raw) { - var rawMatch = login.raw.match(/(pts\/[0-9]+)/); - if (rawMatch) { - tty = rawMatch[1]; - $scope.sshActivityTTY = tty; - } - } - // Make API call with IP included - reduced timeout for faster response - var requestData = { - user: login.user, + var reqIp = (login.ip || $scope.sshActivityIP || '').toString().trim(); + var requestData = { + user: login.user, tty: tty, - ip: $scope.sshActivityIP + ip: reqIp }; - - // Set shorter timeout for faster feedback + var timeoutPromise = $timeout(function() { $scope.loadingSSHActivity = false; - $scope.errorSSHActivity = 'Request timed out. The user may not have any active processes.'; - $scope.sshActivity = { processes: [], w: [] }; - }, 5000); // 5 second timeout (reduced from 10) - - $http.post('/base/getSSHUserActivity', requestData, { timeout: 3000 }).then(function(response) { + $scope.errorSSHActivity = 'Request timed out. The server took too long to respond.'; + $scope.sshActivity = { processes: [], w: [], shell_history: [], geoip: {}, disk_usage: '' }; + }, 30000); + + $http.post('/base/getSSHUserActivity', requestData, { timeout: 30000 }).then(function(response) { $timeout.cancel(timeoutPromise); // Cancel timeout on success $scope.loadingSSHActivity = false; if (response.data) { // Check if response has error field if (response.data.error) { $scope.errorSSHActivity = response.data.error; - $scope.sshActivity = { processes: [], w: [] }; + $scope.sshActivity = { processes: [], w: [], shell_history: [], geoip: {}, disk_usage: '' }; } else { $scope.sshActivity = response.data; // Ensure all expected fields exist @@ -2295,7 +2421,11 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { if (!$scope.sshActivity.w) $scope.sshActivity.w = []; if (!$scope.sshActivity.process_tree) $scope.sshActivity.process_tree = []; if (!$scope.sshActivity.shell_history) $scope.sshActivity.shell_history = []; - + if (!$scope.sshActivity.geoip) $scope.sshActivity.geoip = {}; + if ($scope.sshActivity.disk_usage === undefined || $scope.sshActivity.disk_usage === null) { + $scope.sshActivity.disk_usage = ''; + } + // Try to extract TTY from processes if not already set if (!$scope.sshActivityTTY && response.data.processes && response.data.processes.length > 0) { var firstProcess = response.data.processes[0]; @@ -2308,7 +2438,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { // Only update if we have additional evidence (processes/w output) var hasProcesses = response.data.processes && response.data.processes.length > 0; var hasActiveW = response.data.w && response.data.w.length > 0; - + // If backend says it's active, keep it active (don't override) // If backend says inactive but we find processes/w, mark as active if ($scope.isActiveSession === true) { @@ -2319,7 +2449,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.isActiveSession = true; } // If backend said inactive and no processes found, keep as inactive - + // Debug logging console.log('SSH Activity loaded:', { processes: response.data.processes ? response.data.processes.length : 0, @@ -2332,14 +2462,14 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }); } } else { - $scope.sshActivity = { processes: [], w: [] }; + $scope.sshActivity = { processes: [], w: [], shell_history: [], geoip: {}, disk_usage: '' }; $scope.errorSSHActivity = 'No data returned from server.'; } }, function(err) { $timeout.cancel(timeoutPromise); // Cancel timeout on error $scope.loadingSSHActivity = false; var errorMsg = 'Failed to fetch activity.'; - + // Handle different error scenarios if (err.data) { // Server returned error data @@ -2365,42 +2495,42 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } else if (err.message) { errorMsg = err.message; } - + $scope.errorSSHActivity = errorMsg; // Set empty activity data so modal can still display - $scope.sshActivity = { - processes: [], + $scope.sshActivity = { + processes: [], w: [], process_tree: [], shell_history: [], disk_usage: '', geoip: {} }; - + // Log error for debugging console.error('SSH Activity fetch error:', err); }); }; - + // Kill individual process $scope.killProcess = function(pid, user) { if (!confirm('Are you sure you want to force kill process ' + pid + '? This action cannot be undone.')) { return; } - + $scope.killingProcess = pid; - + var data = { pid: pid, user: user }; - + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; - + $http.post('/base/killSSHProcess', data, config).then(function(response) { $scope.killingProcess = null; if (response.data && response.data.success) { @@ -2436,7 +2566,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }); }); }; - + // Kill entire SSH session $scope.killSSHSession = function(user, tty) { var confirmMsg = 'Are you sure you want to kill all processes for user ' + user; @@ -2444,24 +2574,24 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { confirmMsg += ' on terminal ' + tty; } confirmMsg += '? This will terminate their SSH session.'; - + if (!confirm(confirmMsg)) { return; } - + $scope.killingSession = true; - + var data = { user: user, tty: tty || '' }; - + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; - + $http.post('/base/killSSHSession', data, config).then(function(response) { $scope.killingSession = false; if (response.data && response.data.success) { @@ -2500,7 +2630,11 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }); }); }; - + + $scope.killSession = function(user, tty) { + $scope.killSSHSession(user, tty || $scope.sshActivityTTY || ''); + }; + $scope.closeSSHActivityModal = function() { $scope.showSSHActivityModal = false; $scope.sshActivity = { processes: [], w: [] }; @@ -2524,4 +2658,4 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }; }; app.controller('dashboardStatsController', dashboardStatsControllerFn); -app.controller('newDashboardStat', dashboardStatsControllerFn); \ No newline at end of file +app.controller('newDashboardStat', dashboardStatsControllerFn); diff --git a/public/static/firewall/firewall.js b/public/static/firewall/firewall.js index 9a489d2da..3e11e504c 100644 --- a/public/static/firewall/firewall.js +++ b/public/static/firewall/firewall.js @@ -2032,10 +2032,18 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { var comodoInstalled = false; var counterOWASP = 0; var counterComodo = 0; + var updatingOWASPStatus = false; + var updatingComodoStatus = false; $('#owaspInstalled').change(function () { + // Prevent triggering installation when status check updates the toggle + if (updatingOWASPStatus) { + counterOWASP = counterOWASP + 1; // Still increment counter + return; + } + owaspInstalled = $(this).prop('checked'); $scope.ruleFiles = true; @@ -2052,6 +2060,12 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { $('#comodoInstalled').change(function () { + // Prevent triggering installation when status check updates the toggle + if (updatingComodoStatus) { + counterComodo = counterComodo + 1; // Still increment counter + return; + } + $scope.ruleFiles = true; comodoInstalled = $(this).prop('checked'); @@ -2070,9 +2084,12 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { getOWASPAndComodoStatus(true); - function getOWASPAndComodoStatus(updateToggle) { + function getOWASPAndComodoStatus(updateToggle, showLoader) { - $scope.modsecLoading = false; + // Only show loader if explicitly requested (during installations) + if (showLoader === true) { + $scope.modsecLoading = false; + } url = "/firewall/getOWASPAndComodoStatus"; @@ -2097,6 +2114,10 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { if (updateToggle === true) { + // Set flags to prevent change event from triggering installation + updatingOWASPStatus = true; + updatingComodoStatus = true; + if (response.data.owaspInstalled === 1) { $('#owaspInstalled').prop('checked', true); $scope.owaspDisable = false; @@ -2115,6 +2136,7 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { $scope.comodoDisable = true; comodoInstalled = false; } + } else { if (response.data.owaspInstalled === 1) { @@ -2135,10 +2157,19 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { } + // Always reset flags after status check completes + $timeout(function() { + updatingOWASPStatus = false; + updatingComodoStatus = false; + }, 100); + } function cantLoadInitialDatas(response) { $scope.modsecLoading = true; + // Reset flags even on error + updatingOWASPStatus = false; + updatingComodoStatus = false; } } @@ -2180,7 +2211,10 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { $scope.installationFailed = true; $scope.installationSuccess = false; - getOWASPAndComodoStatus(false); + // Update toggle state after a short delay to reflect installation result + $timeout(function() { + getOWASPAndComodoStatus(true); + }, 500); } else { $scope.modsecLoading = true; @@ -2193,6 +2227,11 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { $scope.installationSuccess = true; $scope.errorMessage = response.data.error_message; + + // Update toggle to reflect failed installation (will show OFF) + $timeout(function() { + getOWASPAndComodoStatus(true); + }, 500); } } diff --git a/serverStatus/serverStatusUtil.py b/serverStatus/serverStatusUtil.py index 87bf99edd..19e09b929 100644 --- a/serverStatus/serverStatusUtil.py +++ b/serverStatus/serverStatusUtil.py @@ -118,8 +118,8 @@ class ServerStatusUtil(multi.Thread): if ServerStatusUtil.executioner(command, statusFile) == 0: return 0 - if os.path.exists('/usr/local/CyberCP/lsws-6.0/'): - shutil.rmtree('/usr/local/CyberCP/lsws-6.0') + if os.path.exists('/usr/local/CyberCP/lsws-6.3.4/'): + shutil.rmtree('/usr/local/CyberCP/lsws-6.3.4') if os.path.exists(f'/usr/local/CyberCP/lsws-{lsws_version}/'): shutil.rmtree(f'/usr/local/CyberCP/lsws-{lsws_version}/') diff --git a/static/baseTemplate/custom-js/system-status.js b/static/baseTemplate/custom-js/system-status.js index 37720ec3e..b4cf11a11 100644 --- a/static/baseTemplate/custom-js/system-status.js +++ b/static/baseTemplate/custom-js/system-status.js @@ -830,7 +830,7 @@ app.controller('OnboardingCP', function ($scope, $http, $timeout, $window) { $scope.ExecutionStatus = true; $scope.ReportStatus = true; $scope.OnboardineDone = true; - + var statusTimer = null; function statusFunc() { @@ -988,7 +988,7 @@ app.controller('OnboardingCP', function ($scope, $http, $timeout, $window) { // Single implementation registered under both names for compatibility (some templates/caches use newDashboardStat) var dashboardStatsControllerFn = function ($scope, $http, $timeout) { console.log('dashboardStatsController initialized'); - + // Card values $scope.totalUsers = 0; $scope.totalSites = 0; @@ -996,7 +996,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.totalDBs = 0; $scope.totalEmails = 0; $scope.totalFTPUsers = 0; - + // Hide system charts for non-admin users $scope.hideSystemCharts = false; @@ -1022,63 +1022,199 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { // SSH Logins $scope.sshLogins = []; + $scope.sshLoginsPaginated = []; + $scope.sshLoginsCurrentPage = 1; + $scope.sshLoginsPerPage = 10; + $scope.sshLoginsGoToPage = 1; $scope.loadingSSHLogins = true; $scope.errorSSHLogins = ''; + + $scope.getSSHLoginsTotalPages = function() { + return Math.ceil($scope.sshLogins.length / $scope.sshLoginsPerPage); + }; + + $scope.getSSHLoginsStart = function() { + if (!$scope.sshLogins || $scope.sshLogins.length === 0) { + return 0; + } + return ($scope.sshLoginsCurrentPage - 1) * $scope.sshLoginsPerPage + 1; + }; + + $scope.getSSHLoginsEnd = function() { + if (!$scope.sshLogins || $scope.sshLogins.length === 0) { + return 0; + } + var end = $scope.sshLoginsCurrentPage * $scope.sshLoginsPerPage; + return Math.min(end, $scope.sshLogins.length); + }; + + $scope.updateSSHLoginsPaginated = function() { + if (!$scope.sshLogins || $scope.sshLogins.length === 0) { + $scope.sshLoginsPaginated = []; + console.log('updateSSHLoginsPaginated: No data, cleared paginated array'); + return; + } + var start = ($scope.sshLoginsCurrentPage - 1) * $scope.sshLoginsPerPage; + var end = start + $scope.sshLoginsPerPage; + $scope.sshLoginsPaginated = $scope.sshLogins.slice(start, end); + console.log('updateSSHLoginsPaginated: start=', start, 'end=', end, 'total=', $scope.sshLogins.length, 'paginated=', $scope.sshLoginsPaginated.length); + }; + + $scope.sshLoginsPrevPage = function() { + if ($scope.sshLoginsCurrentPage > 1) { + $scope.sshLoginsCurrentPage--; + $scope.updateSSHLoginsPaginated(); + } + }; + + $scope.sshLoginsNextPage = function() { + if ($scope.sshLoginsCurrentPage < $scope.getSSHLoginsTotalPages()) { + $scope.sshLoginsCurrentPage++; + $scope.updateSSHLoginsPaginated(); + } + }; + + $scope.sshLoginsGoToPageNumber = function() { + var page = parseInt($scope.sshLoginsGoToPage); + var totalPages = $scope.getSSHLoginsTotalPages(); + if (page >= 1 && page <= totalPages) { + $scope.sshLoginsCurrentPage = page; + $scope.updateSSHLoginsPaginated(); + } else { + $scope.sshLoginsGoToPage = $scope.sshLoginsCurrentPage; + } + }; + $scope.refreshSSHLogins = function() { $scope.loadingSSHLogins = true; var h = { headers: { 'X-CSRFToken': (typeof getCookie === 'function') ? getCookie('csrftoken') : '' } }; $http.get('/base/getRecentSSHLogins', h).then(function (response) { $scope.loadingSSHLogins = false; - if (response.data && response.data.logins) { + console.log('SSH Logins response:', response.data); + if (response.data && response.data.logins && Array.isArray(response.data.logins)) { $scope.sshLogins = response.data.logins; - // Debug: Log first login to see structure - if ($scope.sshLogins.length > 0) { - console.log('First SSH login object:', $scope.sshLogins[0]); - console.log('IP field:', $scope.sshLogins[0].ip); - console.log('All keys:', Object.keys($scope.sshLogins[0])); - } + $scope.sshLoginsCurrentPage = 1; + $scope.sshLoginsGoToPage = 1; + $scope.updateSSHLoginsPaginated(); } else { + console.warn('SSH Logins: No data or invalid format', response.data); $scope.sshLogins = []; + $scope.sshLoginsPaginated = []; } }, function (err) { $scope.loadingSSHLogins = false; + console.error('SSH Logins error:', err); $scope.errorSSHLogins = 'Failed to load SSH logins.'; console.error('Failed to load SSH logins:', err); + $scope.sshLogins = []; + $scope.sshLoginsPaginated = []; }); }; // SSH Logs $scope.sshLogs = []; + $scope.sshLogsPaginated = []; + $scope.sshLogsCurrentPage = 1; + $scope.sshLogsPerPage = 10; + $scope.sshLogsGoToPage = 1; $scope.loadingSSHLogs = true; $scope.errorSSHLogs = ''; $scope.securityAlerts = []; $scope.loadingSecurityAnalysis = false; + + $scope.getSSHLogsTotalPages = function() { + return Math.ceil($scope.sshLogs.length / $scope.sshLogsPerPage); + }; + + $scope.getSSHLogsStart = function() { + if (!$scope.sshLogs || $scope.sshLogs.length === 0) { + return 0; + } + return ($scope.sshLogsCurrentPage - 1) * $scope.sshLogsPerPage + 1; + }; + + $scope.getSSHLogsEnd = function() { + if (!$scope.sshLogs || $scope.sshLogs.length === 0) { + return 0; + } + var end = $scope.sshLogsCurrentPage * $scope.sshLogsPerPage; + return Math.min(end, $scope.sshLogs.length); + }; + + $scope.updateSSHLogsPaginated = function() { + if (!$scope.sshLogs || $scope.sshLogs.length === 0) { + $scope.sshLogsPaginated = []; + console.log('updateSSHLogsPaginated: No data, cleared paginated array'); + return; + } + var start = ($scope.sshLogsCurrentPage - 1) * $scope.sshLogsPerPage; + var end = start + $scope.sshLogsPerPage; + $scope.sshLogsPaginated = $scope.sshLogs.slice(start, end); + console.log('updateSSHLogsPaginated: start=', start, 'end=', end, 'total=', $scope.sshLogs.length, 'paginated=', $scope.sshLogsPaginated.length); + }; + + $scope.sshLogsPrevPage = function() { + if ($scope.sshLogsCurrentPage > 1) { + $scope.sshLogsCurrentPage--; + $scope.updateSSHLogsPaginated(); + } + }; + + $scope.sshLogsNextPage = function() { + if ($scope.sshLogsCurrentPage < $scope.getSSHLogsTotalPages()) { + $scope.sshLogsCurrentPage++; + $scope.updateSSHLogsPaginated(); + } + }; + + $scope.sshLogsGoToPageNumber = function() { + var page = parseInt($scope.sshLogsGoToPage); + var totalPages = $scope.getSSHLogsTotalPages(); + if (page >= 1 && page <= totalPages) { + $scope.sshLogsCurrentPage = page; + $scope.updateSSHLogsPaginated(); + } else { + $scope.sshLogsGoToPage = $scope.sshLogsCurrentPage; + } + }; + $scope.refreshSSHLogs = function() { $scope.loadingSSHLogs = true; var h = { headers: { 'X-CSRFToken': (typeof getCookie === 'function') ? getCookie('csrftoken') : '' } }; $http.get('/base/getRecentSSHLogs', h).then(function (response) { $scope.loadingSSHLogs = false; - if (response.data && response.data.logs) { + console.log('SSH Logs response:', response.data); + if (response.data && response.data.logs && Array.isArray(response.data.logs)) { $scope.sshLogs = response.data.logs; + $scope.sshLogsCurrentPage = 1; + $scope.sshLogsGoToPage = 1; + console.log('SSH Logs loaded:', $scope.sshLogs.length, 'items'); + $scope.updateSSHLogsPaginated(); + console.log('SSH Logs paginated:', $scope.sshLogsPaginated.length, 'items'); // Analyze logs for security issues $scope.analyzeSSHSecurity(); } else { + console.warn('SSH Logs: No data or invalid format', response.data); $scope.sshLogs = []; + $scope.sshLogsPaginated = []; } }, function (err) { $scope.loadingSSHLogs = false; + console.error('SSH Logs error:', err); $scope.errorSSHLogs = 'Failed to load SSH logs.'; + $scope.sshLogs = []; + $scope.sshLogsPaginated = []; }); }; - + // Security Analysis $scope.showAddonRequired = false; $scope.addonInfo = {}; - + // IP Blocking functionality $scope.blockingIP = null; $scope.blockedIPs = {}; - + $scope.analyzeSSHSecurity = function() { $scope.loadingSecurityAnalysis = true; $scope.showAddonRequired = false; @@ -1098,7 +1234,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.loadingSecurityAnalysis = false; }); }; - + $scope.blockIPAddress = function(ipAddress) { try { console.log('========================================'); @@ -1109,7 +1245,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { console.log('ipAddress value:', ipAddress); console.log('$scope:', $scope); console.log('$scope.blockIPAddress:', typeof $scope.blockIPAddress); - + // Validate IP address parameter if (!ipAddress) { console.error('No IP address provided:', ipAddress); @@ -1123,10 +1259,10 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } return; } - + // Ensure it's a string and trim it ipAddress = String(ipAddress).trim(); - + // Validate after trimming if (!ipAddress || ipAddress === '' || ipAddress === 'undefined' || ipAddress === 'null') { console.error('IP address is empty or invalid after trim:', ipAddress); @@ -1140,7 +1276,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } return; } - + // Basic IP format validation var ipPattern = /^(\d{1,3}\.){3}\d{1,3}(\/\d{1,2})?$/; if (!ipPattern.test(ipAddress)) { @@ -1155,51 +1291,51 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } return; } - + // Prevent duplicate requests if ($scope.blockingIP === ipAddress) { console.log('Already processing IP:', ipAddress); return; // Already processing this IP } - + // Do not early-return when IP is already in blockedIPs: still call the API so the // backend can close any active connections from this IP (already-banned path). - + // Set blocking flag to prevent duplicate requests $scope.blockingIP = ipAddress; - + // Use the new Banned IPs system instead of the old blockIPAddress var data = { ip: ipAddress, reason: 'Brute force attack detected from SSH Security Analysis', duration: 'permanent' }; - + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; - + console.log('Sending ban IP request:', data); console.log('CSRF Token:', getCookie('csrftoken')); console.log('Config:', config); - + $http.post('/firewall/addBannedIP', data, config).then(function (response) { console.log('=== addBannedIP SUCCESS ==='); console.log('Full response:', response); console.log('response.data:', response.data); console.log('response.data type:', typeof response.data); console.log('response.status:', response.status); - + // Reset blocking flag $scope.blockingIP = null; - + // Apply scope changes if (!$scope.$$phase && !$scope.$root.$$phase) { $scope.$apply(); } - + // Handle both JSON string and object responses var responseData = response.data; if (typeof responseData === 'string') { @@ -1216,12 +1352,12 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { return; } } - + console.log('Final responseData:', responseData); console.log('responseData.status:', responseData ? responseData.status : 'undefined'); console.log('responseData.message:', responseData ? responseData.message : 'undefined'); console.log('responseData.error_message:', responseData ? responseData.error_message : 'undefined'); - + // Check for success (status === 1 or status === '1') if (responseData && (responseData.status === 1 || responseData.status === '1')) { // Mark IP as blocked @@ -1229,7 +1365,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.blockedIPs = {}; } $scope.blockedIPs[ipAddress] = true; - + // Show success notification (use server message when present, e.g. already-banned + connections closed) if (typeof PNotify !== 'undefined') { var successText = (responseData.message && responseData.message.length) ? responseData.message : `IP address ${ipAddress} has been permanently banned and added to the firewall. You can manage it in the Firewall > Banned IPs section.`; @@ -1240,12 +1376,12 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { delay: 5000 }); } - + // Refresh security analysis to update alerts if ($scope.analyzeSSHSecurity) { $scope.analyzeSSHSecurity(); } - + // Apply scope changes if (!$scope.$$phase && !$scope.$root.$$phase) { $scope.$apply(); @@ -1278,16 +1414,16 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { console.error('Error status:', err.status); console.error('Error statusText:', err.statusText); console.error('Error data:', err.data); - + // Prevent showing duplicate error notifications if ($scope.lastErrorIP === ipAddress && $scope.lastErrorTime && (Date.now() - $scope.lastErrorTime) < 2000) { console.log('Skipping duplicate error notification for IP:', ipAddress); return; } - + $scope.lastErrorIP = ipAddress; $scope.lastErrorTime = Date.now(); - + var errorMessage = 'Failed to block IP address'; var errData = err.data; if (typeof errData === 'string') { @@ -1304,9 +1440,9 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } else if (err.status) { errorMessage = 'HTTP ' + err.status + ': ' + (errorMessage); } - + console.error('Final error message:', errorMessage); - + if (typeof PNotify !== 'undefined') { new PNotify({ title: 'Error', @@ -1334,7 +1470,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } } }; - + // Ban IP from SSH Logs $scope.banIPFromSSHLog = function(ipAddress) { if (!ipAddress) { @@ -1346,37 +1482,37 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }); return; } - + if ($scope.blockingIP === ipAddress) { return; // Already processing } - + // Still call API when already in blockedIPs so backend can close active connections if (!$scope.blockedIPs) { $scope.blockedIPs = {}; } - + $scope.blockingIP = ipAddress; - + // Use the Banned IPs system var data = { ip: ipAddress, reason: 'Suspicious activity detected from SSH logs', duration: 'permanent' }; - + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; - + $http.post('/firewall/addBannedIP', data, config).then(function (response) { $scope.blockingIP = null; if (response.data && response.data.status === 1) { // Mark IP as blocked $scope.blockedIPs[ipAddress] = true; - + // Show success notification new PNotify({ title: 'IP Address Banned', @@ -1384,7 +1520,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { type: 'success', delay: 5000 }); - + // Refresh SSH logs to update the UI $scope.refreshSSHLogs(); } else { @@ -1395,7 +1531,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } else if (response.data && response.data.error) { errorMsg = response.data.error; } - + new PNotify({ title: 'Error', text: errorMsg, @@ -1413,7 +1549,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } else if (err.data && err.data.message) { errorMessage = err.data.message; } - + new PNotify({ title: 'Error', text: errorMessage, @@ -1422,7 +1558,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }); }); }; - + // Ban IP from SSH Logs $scope.banIPFromSSHLog = function(ipAddress) { if (!ipAddress) { @@ -1434,37 +1570,37 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }); return; } - + if ($scope.blockingIP === ipAddress) { return; // Already processing } - + // Still call API when already in blockedIPs so backend can close active connections if (!$scope.blockedIPs) { $scope.blockedIPs = {}; } - + $scope.blockingIP = ipAddress; - + // Use the Banned IPs system var data = { ip: ipAddress, reason: 'Suspicious activity detected from SSH logs', duration: 'permanent' }; - + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; - + $http.post('/firewall/addBannedIP', data, config).then(function (response) { $scope.blockingIP = null; if (response.data && response.data.status === 1) { // Mark IP as blocked $scope.blockedIPs[ipAddress] = true; - + // Show success notification new PNotify({ title: 'IP Address Banned', @@ -1472,7 +1608,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { type: 'success', delay: 5000 }); - + // Refresh SSH logs to update the UI $scope.refreshSSHLogs(); } else { @@ -1483,7 +1619,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } else if (response.data && response.data.error) { errorMsg = response.data.error; } - + new PNotify({ title: 'Error', text: errorMsg, @@ -1501,7 +1637,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } else if (err.data && err.data.message) { errorMessage = err.data.message; } - + new PNotify({ title: 'Error', text: errorMessage, @@ -1767,31 +1903,31 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { data: { labels: [], datasets: [ - { - label: 'Download', - data: [], - borderColor: '#5b5fcf', - backgroundColor: 'rgba(91,95,207,0.1)', + { + label: 'Download', + data: [], + borderColor: '#5b5fcf', + backgroundColor: 'rgba(91,95,207,0.1)', pointBackgroundColor: '#5b5fcf', pointBorderColor: '#5b5fcf', pointRadius: 3, pointHoverRadius: 5, borderWidth: 2, - tension: 0.4, - fill: true + tension: 0.4, + fill: true }, - { - label: 'Upload', - data: [], - borderColor: '#4a90e2', - backgroundColor: 'rgba(74,144,226,0.1)', + { + label: 'Upload', + data: [], + borderColor: '#4a90e2', + backgroundColor: 'rgba(74,144,226,0.1)', pointBackgroundColor: '#4a90e2', pointBorderColor: '#4a90e2', pointRadius: 3, pointHoverRadius: 5, borderWidth: 2, - tension: 0.4, - fill: true + tension: 0.4, + fill: true } ] }, @@ -1800,20 +1936,20 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { maintainAspectRatio: false, animation: { duration: 0 }, plugins: { - legend: { - display: true, + legend: { + display: true, position: 'top', - labels: { + labels: { font: { size: 12, weight: '600' }, color: '#64748b', usePointStyle: true, padding: 20 - } + } }, title: { display: false }, - tooltip: { - enabled: true, - mode: 'index', + tooltip: { + enabled: true, + mode: 'index', intersect: false, backgroundColor: 'rgba(255,255,255,0.95)', titleColor: '#2f3640', @@ -1826,18 +1962,18 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }, interaction: { mode: 'nearest', axis: 'x', intersect: false }, scales: { - x: { - grid: { color: '#f0f0ff', drawBorder: false }, - ticks: { + x: { + grid: { color: '#f0f0ff', drawBorder: false }, + ticks: { font: { size: 11 }, color: '#94a3b8', maxTicksLimit: 8 } }, - y: { - beginAtZero: true, - grid: { color: '#f0f0ff', drawBorder: false }, - ticks: { + y: { + beginAtZero: true, + grid: { color: '#f0f0ff', drawBorder: false }, + ticks: { font: { size: 11 }, color: '#94a3b8' } @@ -1862,31 +1998,31 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { data: { labels: [], datasets: [ - { - label: 'Read', - data: [], - borderColor: '#5b5fcf', - backgroundColor: 'rgba(91,95,207,0.1)', + { + label: 'Read', + data: [], + borderColor: '#5b5fcf', + backgroundColor: 'rgba(91,95,207,0.1)', pointBackgroundColor: '#5b5fcf', pointBorderColor: '#5b5fcf', pointRadius: 3, pointHoverRadius: 5, borderWidth: 2, - tension: 0.4, - fill: true + tension: 0.4, + fill: true }, - { - label: 'Write', - data: [], - borderColor: '#e74c3c', - backgroundColor: 'rgba(231,76,60,0.1)', + { + label: 'Write', + data: [], + borderColor: '#e74c3c', + backgroundColor: 'rgba(231,76,60,0.1)', pointBackgroundColor: '#e74c3c', pointBorderColor: '#e74c3c', pointRadius: 3, pointHoverRadius: 5, borderWidth: 2, - tension: 0.4, - fill: true + tension: 0.4, + fill: true } ] }, @@ -1895,20 +2031,20 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { maintainAspectRatio: false, animation: { duration: 0 }, plugins: { - legend: { - display: true, + legend: { + display: true, position: 'top', - labels: { + labels: { font: { size: 12, weight: '600' }, color: '#64748b', usePointStyle: true, padding: 20 - } + } }, title: { display: false }, - tooltip: { - enabled: true, - mode: 'index', + tooltip: { + enabled: true, + mode: 'index', intersect: false, backgroundColor: 'rgba(255,255,255,0.95)', titleColor: '#2f3640', @@ -1921,18 +2057,18 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }, interaction: { mode: 'nearest', axis: 'x', intersect: false }, scales: { - x: { - grid: { color: '#f0f0ff', drawBorder: false }, - ticks: { + x: { + grid: { color: '#f0f0ff', drawBorder: false }, + ticks: { font: { size: 11 }, color: '#94a3b8', maxTicksLimit: 8 } }, - y: { - beginAtZero: true, - grid: { color: '#f0f0ff', drawBorder: false }, - ticks: { + y: { + beginAtZero: true, + grid: { color: '#f0f0ff', drawBorder: false }, + ticks: { font: { size: 11 }, color: '#94a3b8' } @@ -1950,18 +2086,18 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { data: { labels: [], datasets: [ - { - label: 'CPU Usage (%)', - data: [], - borderColor: '#5b5fcf', - backgroundColor: 'rgba(91,95,207,0.1)', + { + label: 'CPU Usage (%)', + data: [], + borderColor: '#5b5fcf', + backgroundColor: 'rgba(91,95,207,0.1)', pointBackgroundColor: '#5b5fcf', pointBorderColor: '#5b5fcf', pointRadius: 3, pointHoverRadius: 5, borderWidth: 2, - tension: 0.4, - fill: true + tension: 0.4, + fill: true } ] }, @@ -1970,20 +2106,20 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { maintainAspectRatio: false, animation: { duration: 0 }, plugins: { - legend: { - display: true, + legend: { + display: true, position: 'top', - labels: { + labels: { font: { size: 12, weight: '600' }, color: '#64748b', usePointStyle: true, padding: 20 - } + } }, title: { display: false }, - tooltip: { - enabled: true, - mode: 'index', + tooltip: { + enabled: true, + mode: 'index', intersect: false, backgroundColor: 'rgba(255,255,255,0.95)', titleColor: '#2f3640', @@ -1996,19 +2132,19 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }, interaction: { mode: 'nearest', axis: 'x', intersect: false }, scales: { - x: { - grid: { color: '#f0f0ff', drawBorder: false }, - ticks: { + x: { + grid: { color: '#f0f0ff', drawBorder: false }, + ticks: { font: { size: 11 }, color: '#94a3b8', maxTicksLimit: 8 } }, - y: { - beginAtZero: true, - max: 100, - grid: { color: '#f0f0ff', drawBorder: false }, - ticks: { + y: { + beginAtZero: true, + max: 100, + grid: { color: '#f0f0ff', drawBorder: false }, + ticks: { font: { size: 11 }, color: '#94a3b8' } @@ -2030,7 +2166,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { if (cpuChart) cpuChart.resize(); }, 100); }); - + // Also handle custom tab switching document.addEventListener('DOMContentLoaded', function() { var tabs = document.querySelectorAll('a[data-toggle="tab"]'); @@ -2051,7 +2187,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.refreshTopProcesses(); $scope.refreshSSHLogins(); $scope.refreshSSHLogs(); - + $timeout(function() { // Always create charts so Traffic/Disk IO/CPU tabs have something to show; admin check only affects hideSystemCharts setupCharts(); @@ -2065,7 +2201,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { console.warn('getAdminStatus failed:', err); $scope.hideSystemCharts = true; }); - + // Start polling for all stats (data feeds charts) function pollAll() { pollDashboardStats(); @@ -2084,29 +2220,29 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.sshActivityUser = ''; $scope.loadingSSHActivity = false; $scope.errorSSHActivity = ''; - + $scope.viewSSHActivity = function(login, event) { $scope.showSSHActivityModal = true; $scope.sshActivity = { processes: [], w: [] }; $scope.sshActivityUser = login.user; - + // Extract IP from multiple sources - comprehensive extraction for IPv4 and IPv6 var extractedIP = ''; - + // Method 1: Direct property access (highest priority - from backend) if (login && login.ip) { extractedIP = login.ip.toString().trim(); } else if (login && login['ip']) { extractedIP = login['ip'].toString().trim(); } - + // Method 2: Alternative field names if (!extractedIP && login) { if (login.ipAddress) extractedIP = login.ipAddress.toString().trim(); else if (login['IP Address']) extractedIP = login['IP Address'].toString().trim(); else if (login['IP']) extractedIP = login['IP'].toString().trim(); } - + // Method 3: Extract from raw line using regex (IPv4 and IPv6) if (!extractedIP && login && login.raw) { // Try IPv4 first (most common) @@ -2117,7 +2253,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { extractedIP = ipv4; } } - + // If no valid IPv4, try IPv6 if (!extractedIP) { // IPv6 pattern: matches full IPv6 addresses and compressed forms @@ -2131,13 +2267,13 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } } } - + // Method 4: Try to get from event target data attribute as fallback if (!extractedIP && event && event.currentTarget) { var dataIP = event.currentTarget.getAttribute('data-ip'); if (dataIP) extractedIP = dataIP.toString().trim(); } - + // Final fallback: search entire raw line for any IP if (!extractedIP && login && login.raw) { // Try all IPv4 addresses @@ -2165,13 +2301,13 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } } } - + // Final cleanup $scope.sshActivityIP = (extractedIP || '').toString().trim(); $scope.sshActivityTTY = ''; // Store TTY for kill session // Check both 'session' and 'activity' fields for status $scope.sshActivityStatus = login.session || login.activity || ''; - + // Use backend is_active field if available (most reliable) // Fallback to checking session text if is_active is not set // IMPORTANT: Check for both boolean true and string 'true' (JSON might serialize differently) @@ -2185,7 +2321,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.isActiveSession = (sessionStatus.indexOf('still logged in') !== -1); console.log('Using fallback session text check:', sessionStatus, '-> isActiveSession:', $scope.isActiveSession); } - + // If IP is still empty, try one more time with more aggressive extraction if (!$scope.sshActivityIP && login) { console.log('IP still empty, trying aggressive extraction...'); @@ -2227,7 +2363,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } } } - + // Debug logging - detailed inspection console.log('View SSH Activity - Login object:', login); console.log('Login keys:', Object.keys(login)); @@ -2250,7 +2386,6 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.sshActivityTTY = tty; } } - // Also try to extract from session field or raw line if (!tty && login.session) { var sessionMatch = login.session.match(/(pts\/[0-9]+)/); if (sessionMatch) { @@ -2258,36 +2393,27 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.sshActivityTTY = tty; } } - // Also check raw line for TTY - if (!tty && login.raw) { - var rawMatch = login.raw.match(/(pts\/[0-9]+)/); - if (rawMatch) { - tty = rawMatch[1]; - $scope.sshActivityTTY = tty; - } - } - // Make API call with IP included - reduced timeout for faster response - var requestData = { - user: login.user, + var reqIp = (login.ip || $scope.sshActivityIP || '').toString().trim(); + var requestData = { + user: login.user, tty: tty, - ip: $scope.sshActivityIP + ip: reqIp }; - - // Set shorter timeout for faster feedback + var timeoutPromise = $timeout(function() { $scope.loadingSSHActivity = false; - $scope.errorSSHActivity = 'Request timed out. The user may not have any active processes.'; - $scope.sshActivity = { processes: [], w: [] }; - }, 5000); // 5 second timeout (reduced from 10) - - $http.post('/base/getSSHUserActivity', requestData, { timeout: 3000 }).then(function(response) { + $scope.errorSSHActivity = 'Request timed out. The server took too long to respond.'; + $scope.sshActivity = { processes: [], w: [], shell_history: [], geoip: {}, disk_usage: '' }; + }, 30000); + + $http.post('/base/getSSHUserActivity', requestData, { timeout: 30000 }).then(function(response) { $timeout.cancel(timeoutPromise); // Cancel timeout on success $scope.loadingSSHActivity = false; if (response.data) { // Check if response has error field if (response.data.error) { $scope.errorSSHActivity = response.data.error; - $scope.sshActivity = { processes: [], w: [] }; + $scope.sshActivity = { processes: [], w: [], shell_history: [], geoip: {}, disk_usage: '' }; } else { $scope.sshActivity = response.data; // Ensure all expected fields exist @@ -2295,7 +2421,11 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { if (!$scope.sshActivity.w) $scope.sshActivity.w = []; if (!$scope.sshActivity.process_tree) $scope.sshActivity.process_tree = []; if (!$scope.sshActivity.shell_history) $scope.sshActivity.shell_history = []; - + if (!$scope.sshActivity.geoip) $scope.sshActivity.geoip = {}; + if ($scope.sshActivity.disk_usage === undefined || $scope.sshActivity.disk_usage === null) { + $scope.sshActivity.disk_usage = ''; + } + // Try to extract TTY from processes if not already set if (!$scope.sshActivityTTY && response.data.processes && response.data.processes.length > 0) { var firstProcess = response.data.processes[0]; @@ -2308,7 +2438,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { // Only update if we have additional evidence (processes/w output) var hasProcesses = response.data.processes && response.data.processes.length > 0; var hasActiveW = response.data.w && response.data.w.length > 0; - + // If backend says it's active, keep it active (don't override) // If backend says inactive but we find processes/w, mark as active if ($scope.isActiveSession === true) { @@ -2319,7 +2449,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { $scope.isActiveSession = true; } // If backend said inactive and no processes found, keep as inactive - + // Debug logging console.log('SSH Activity loaded:', { processes: response.data.processes ? response.data.processes.length : 0, @@ -2332,14 +2462,14 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }); } } else { - $scope.sshActivity = { processes: [], w: [] }; + $scope.sshActivity = { processes: [], w: [], shell_history: [], geoip: {}, disk_usage: '' }; $scope.errorSSHActivity = 'No data returned from server.'; } }, function(err) { $timeout.cancel(timeoutPromise); // Cancel timeout on error $scope.loadingSSHActivity = false; var errorMsg = 'Failed to fetch activity.'; - + // Handle different error scenarios if (err.data) { // Server returned error data @@ -2365,42 +2495,42 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { } else if (err.message) { errorMsg = err.message; } - + $scope.errorSSHActivity = errorMsg; // Set empty activity data so modal can still display - $scope.sshActivity = { - processes: [], + $scope.sshActivity = { + processes: [], w: [], process_tree: [], shell_history: [], disk_usage: '', geoip: {} }; - + // Log error for debugging console.error('SSH Activity fetch error:', err); }); }; - + // Kill individual process $scope.killProcess = function(pid, user) { if (!confirm('Are you sure you want to force kill process ' + pid + '? This action cannot be undone.')) { return; } - + $scope.killingProcess = pid; - + var data = { pid: pid, user: user }; - + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; - + $http.post('/base/killSSHProcess', data, config).then(function(response) { $scope.killingProcess = null; if (response.data && response.data.success) { @@ -2436,7 +2566,7 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }); }); }; - + // Kill entire SSH session $scope.killSSHSession = function(user, tty) { var confirmMsg = 'Are you sure you want to kill all processes for user ' + user; @@ -2444,24 +2574,24 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { confirmMsg += ' on terminal ' + tty; } confirmMsg += '? This will terminate their SSH session.'; - + if (!confirm(confirmMsg)) { return; } - + $scope.killingSession = true; - + var data = { user: user, tty: tty || '' }; - + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; - + $http.post('/base/killSSHSession', data, config).then(function(response) { $scope.killingSession = false; if (response.data && response.data.success) { @@ -2500,7 +2630,11 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }); }); }; - + + $scope.killSession = function(user, tty) { + $scope.killSSHSession(user, tty || $scope.sshActivityTTY || ''); + }; + $scope.closeSSHActivityModal = function() { $scope.showSSHActivityModal = false; $scope.sshActivity = { processes: [], w: [] }; @@ -2524,4 +2658,4 @@ var dashboardStatsControllerFn = function ($scope, $http, $timeout) { }; }; app.controller('dashboardStatsController', dashboardStatsControllerFn); -app.controller('newDashboardStat', dashboardStatsControllerFn); \ No newline at end of file +app.controller('newDashboardStat', dashboardStatsControllerFn); diff --git a/static/dockerManager/dockerManager.js b/static/dockerManager/dockerManager.js index ed03f297d..ba9569bef 100644 --- a/static/dockerManager/dockerManager.js +++ b/static/dockerManager/dockerManager.js @@ -2713,4 +2713,3 @@ app.controller('manageImages', function ($scope, $http) { }) } }); - diff --git a/static/firewall/firewall.js b/static/firewall/firewall.js index 9a489d2da..3e11e504c 100644 --- a/static/firewall/firewall.js +++ b/static/firewall/firewall.js @@ -2032,10 +2032,18 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { var comodoInstalled = false; var counterOWASP = 0; var counterComodo = 0; + var updatingOWASPStatus = false; + var updatingComodoStatus = false; $('#owaspInstalled').change(function () { + // Prevent triggering installation when status check updates the toggle + if (updatingOWASPStatus) { + counterOWASP = counterOWASP + 1; // Still increment counter + return; + } + owaspInstalled = $(this).prop('checked'); $scope.ruleFiles = true; @@ -2052,6 +2060,12 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { $('#comodoInstalled').change(function () { + // Prevent triggering installation when status check updates the toggle + if (updatingComodoStatus) { + counterComodo = counterComodo + 1; // Still increment counter + return; + } + $scope.ruleFiles = true; comodoInstalled = $(this).prop('checked'); @@ -2070,9 +2084,12 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { getOWASPAndComodoStatus(true); - function getOWASPAndComodoStatus(updateToggle) { + function getOWASPAndComodoStatus(updateToggle, showLoader) { - $scope.modsecLoading = false; + // Only show loader if explicitly requested (during installations) + if (showLoader === true) { + $scope.modsecLoading = false; + } url = "/firewall/getOWASPAndComodoStatus"; @@ -2097,6 +2114,10 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { if (updateToggle === true) { + // Set flags to prevent change event from triggering installation + updatingOWASPStatus = true; + updatingComodoStatus = true; + if (response.data.owaspInstalled === 1) { $('#owaspInstalled').prop('checked', true); $scope.owaspDisable = false; @@ -2115,6 +2136,7 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { $scope.comodoDisable = true; comodoInstalled = false; } + } else { if (response.data.owaspInstalled === 1) { @@ -2135,10 +2157,19 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { } + // Always reset flags after status check completes + $timeout(function() { + updatingOWASPStatus = false; + updatingComodoStatus = false; + }, 100); + } function cantLoadInitialDatas(response) { $scope.modsecLoading = true; + // Reset flags even on error + updatingOWASPStatus = false; + updatingComodoStatus = false; } } @@ -2180,7 +2211,10 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { $scope.installationFailed = true; $scope.installationSuccess = false; - getOWASPAndComodoStatus(false); + // Update toggle state after a short delay to reflect installation result + $timeout(function() { + getOWASPAndComodoStatus(true); + }, 500); } else { $scope.modsecLoading = true; @@ -2193,6 +2227,11 @@ app.controller('modSecRulesPack', function ($scope, $http, $timeout, $window) { $scope.installationSuccess = true; $scope.errorMessage = response.data.error_message; + + // Update toggle to reflect failed installation (will show OFF) + $timeout(function() { + getOWASPAndComodoStatus(true); + }, 500); } } diff --git a/static/loginSystem/webauthn.js b/static/loginSystem/webauthn.js index a9d4eddc5..9cc4ea5a4 100644 --- a/static/loginSystem/webauthn.js +++ b/static/loginSystem/webauthn.js @@ -10,6 +10,7 @@ class CyberPanelWebAuthn { this.apiEndpoints = { registrationStart: '/webauthn/registration/start/', registrationComplete: '/webauthn/registration/complete/', + authenticationOptions: '/webauthn/authentication/options/', authenticationStart: '/webauthn/authentication/start/', authenticationComplete: '/webauthn/authentication/complete/', credentialsList: '/webauthn/credentials/', @@ -60,18 +61,10 @@ class CyberPanelWebAuthn { addLoginButtons() { const loginForm = document.querySelector('#loginForm'); if (!loginForm) return; - - // Add WebAuthn login button - const webauthnButton = document.createElement('button'); - webauthnButton.type = 'button'; - webauthnButton.className = 'btn btn-primary btn-block'; - webauthnButton.innerHTML = ' Login with Passkey'; - webauthnButton.onclick = () => this.startPasswordlessLogin(); - - // Insert after password field - const passwordField = loginForm.querySelector('input[type="password"]'); - if (passwordField) { - passwordField.parentNode.insertBefore(webauthnButton, passwordField.parentNode.nextSibling); + const existingBtn = document.getElementById('webauthn-login-btn'); + if (existingBtn && !existingBtn.dataset.bound) { + existingBtn.dataset.bound = '1'; + existingBtn.onclick = () => this.startPasskeyFirstLogin(); } } @@ -80,6 +73,76 @@ class CyberPanelWebAuthn { // Implementation depends on the specific UI structure } + arrayBufferToBase64url(buffer) { + const bytes = new Uint8Array(buffer); + let binary = ''; + for (let i = 0; i < bytes.byteLength; i++) binary += String.fromCharCode(bytes[i]); + return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); + } + + base64urlToArrayBuffer(str) { + let base64 = str.replace(/-/g, '+').replace(/_/g, '/'); + const pad = (4 - (base64.length % 4)) % 4; + for (let i = 0; i < pad; i++) base64 += '='; + const binary = atob(base64); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i); + return bytes.buffer; + } + + async startPasskeyFirstLogin() { + try { + this.showLoading('Signing in with passkey...'); + const optsUrl = this.apiEndpoints.authenticationOptions + '?return=' + encodeURIComponent(window.location.pathname || '/'); + const optsResponse = await fetch(optsUrl, { method: 'GET', credentials: 'same-origin' }); + const optsData = await optsResponse.json(); + if (!optsData.publicKey) { + throw new Error(optsData.error || 'Failed to get options'); + } + const publicKey = optsData.publicKey; + publicKey.challenge = this.base64urlToArrayBuffer(publicKey.challenge); + if (publicKey.allowCredentials && publicKey.allowCredentials.length) { + publicKey.allowCredentials = publicKey.allowCredentials.map(function(c) { + return { + type: c.type || 'public-key', + id: typeof c.id === 'string' ? this.base64urlToArrayBuffer(c.id) : c.id, + transports: c.transports + }; + }.bind(this)); + } + const credential = await navigator.credentials.get({ publicKey }); + if (!credential) throw new Error('No credential'); + const credentialJson = { + id: credential.id, + rawId: this.arrayBufferToBase64url(credential.rawId), + type: credential.type, + response: { + clientDataJSON: this.arrayBufferToBase64url(credential.response.clientDataJSON), + authenticatorData: this.arrayBufferToBase64url(credential.response.authenticatorData), + signature: this.arrayBufferToBase64url(credential.response.signature), + userHandle: credential.response.userHandle ? this.arrayBufferToBase64url(credential.response.userHandle) : null + } + }; + const authResponse = await this.makeRequest('POST', this.apiEndpoints.authenticationComplete, { + credential: credentialJson + }); + if (authResponse.success && authResponse.redirect) { + window.location.href = authResponse.redirect; + return; + } + throw new Error(authResponse.error || 'Verification failed'); + } catch (error) { + if (error.name === 'NotAllowedError' || (error.message && (error.message.indexOf('cancel') !== -1 || error.message.indexOf('timed out') !== -1))) { + this.hideLoading(); + return; + } + console.error('WebAuthn passkey-first error:', error); + this.showError(error.message || 'Passkey sign-in failed'); + } finally { + this.hideLoading(); + } + } + async startPasswordlessLogin() { try { const username = document.querySelector('input[name="username"]').value; @@ -87,27 +150,13 @@ class CyberPanelWebAuthn { this.showError('Please enter your username first'); return; } - this.showLoading('Starting passkey authentication...'); - - // Get authentication challenge - const challengeResponse = await this.makeRequest('POST', this.apiEndpoints.authenticationStart, { - username: username - }); - + const challengeResponse = await this.makeRequest('POST', this.apiEndpoints.authenticationStart, { username: username }); if (!challengeResponse.success) { throw new Error(challengeResponse.error || 'Failed to start authentication'); } - - // Convert challenge to proper format const challenge = this.convertChallenge(challengeResponse.challenge); - - // Get credential - const credential = await navigator.credentials.get({ - publicKey: challenge - }); - - // Complete authentication + const credential = await navigator.credentials.get({ publicKey: challenge }); const authResponse = await this.makeRequest('POST', this.apiEndpoints.authenticationComplete, { challenge_id: challengeResponse.challenge_id, credential: { @@ -117,19 +166,14 @@ class CyberPanelWebAuthn { client_data_json: this.arrayBufferToBase64(credential.response.clientDataJSON), authenticator_data: this.arrayBufferToBase64(credential.response.authenticatorData), signature: this.arrayBufferToBase64(credential.response.signature), - user_handle: credential.response.userHandle ? - this.arrayBufferToBase64(credential.response.userHandle) : null + user_handle: credential.response.userHandle ? this.arrayBufferToBase64(credential.response.userHandle) : null }); - if (authResponse.success) { this.showSuccess('Authentication successful! Redirecting...'); - setTimeout(() => { - window.location.href = '/'; - }, 1000); + setTimeout(() => { window.location.href = authResponse.redirect || '/'; }, 1000); } else { throw new Error(authResponse.error || 'Authentication failed'); } - } catch (error) { console.error('WebAuthn authentication error:', error); this.showError(error.message || 'Authentication failed'); @@ -138,9 +182,10 @@ class CyberPanelWebAuthn { } } - async registerPasskey(username, credentialName = '') { + async registerPasskey(username, credentialName = '', options = {}) { + const silent = options && options.silent === true; try { - this.showLoading('Starting passkey registration...'); + if (!silent) this.showLoading('Starting passkey registration...'); // Get registration challenge const challengeResponse = await this.makeRequest('POST', this.apiEndpoints.registrationStart, { @@ -172,7 +217,7 @@ class CyberPanelWebAuthn { }); if (regResponse.success) { - this.showSuccess('Passkey registered successfully!'); + if (!silent) this.showSuccess('Passkey registered successfully!'); return regResponse; } else { throw new Error(regResponse.error || 'Registration failed'); @@ -180,10 +225,10 @@ class CyberPanelWebAuthn { } catch (error) { console.error('WebAuthn registration error:', error); - this.showError(error.message || 'Registration failed'); + if (!silent) this.showError(error.message || 'Registration failed'); throw error; } finally { - this.hideLoading(); + if (!silent) this.hideLoading(); } } @@ -265,23 +310,25 @@ class CyberPanelWebAuthn { } convertChallenge(challenge) { - // Convert base64 challenge to ArrayBuffer - const challengeBytes = this.base64ToArrayBuffer(challenge.challenge); - + const ch = challenge.challenge; + const challengeBytes = (typeof ch === 'string' && (ch.indexOf('-') !== -1 || ch.indexOf('_') !== -1)) + ? this.base64urlToArrayBuffer(ch) : this.base64ToArrayBuffer(ch); + const userId = challenge.user && challenge.user.id; + const userIdBuf = !userId ? undefined : (typeof userId === 'string' && (userId.indexOf('-') !== -1 || userId.indexOf('_') !== -1) + ? this.base64urlToArrayBuffer(userId) : this.base64ToArrayBuffer(userId)); return { ...challenge, challenge: challengeBytes, - user: { - ...challenge.user, - id: this.base64ToArrayBuffer(challenge.user.id) - }, + user: challenge.user ? { ...challenge.user, id: userIdBuf } : undefined, excludeCredentials: challenge.excludeCredentials?.map(cred => ({ ...cred, - id: this.base64ToArrayBuffer(cred.id) + id: typeof cred.id === 'string' && (cred.id.indexOf('-') !== -1 || cred.id.indexOf('_') !== -1) + ? this.base64urlToArrayBuffer(cred.id) : this.base64ToArrayBuffer(cred.id) })) || [], allowCredentials: challenge.allowCredentials?.map(cred => ({ ...cred, - id: this.base64ToArrayBuffer(cred.id) + id: typeof cred.id === 'string' && (cred.id.indexOf('-') !== -1 || cred.id.indexOf('_') !== -1) + ? this.base64urlToArrayBuffer(cred.id) : this.base64ToArrayBuffer(cred.id) })) || [] }; } @@ -383,12 +430,17 @@ class CyberPanelWebAuthn { } } -// Initialize WebAuthn when DOM is loaded -document.addEventListener('DOMContentLoaded', function() { +// Initialize WebAuthn - run now if DOM ready, else on DOMContentLoaded (script often loads after DOM is ready) +function initCyberPanelWebAuthn() { if (CyberPanelWebAuthn.isSupported()) { window.cyberPanelWebAuthn = new CyberPanelWebAuthn(); } -}); +} +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initCyberPanelWebAuthn); +} else { + initCyberPanelWebAuthn(); +} // Export for use in other scripts if (typeof module !== 'undefined' && module.exports) { diff --git a/static/mailServer/mailServer.js b/static/mailServer/mailServer.js index a546a8cec..86ce0b55b 100644 --- a/static/mailServer/mailServer.js +++ b/static/mailServer/mailServer.js @@ -1619,3 +1619,341 @@ app.controller('EmailLimitsNew', function ($scope, $http) { }); /* Java script for EmailLimitsNew */ + +/* Catch-All Email Controller */ +app.controller('catchAllEmail', function ($scope, $http) { + + $scope.configBox = true; + $scope.loading = false; + $scope.errorBox = true; + $scope.successBox = true; + $scope.couldNotConnect = true; + $scope.notifyBox = true; + $scope.currentConfigured = false; + $scope.enabled = true; + + $scope.fetchConfig = function () { + if (!$scope.selectedDomain) { + $scope.configBox = true; + return; + } + + $scope.loading = true; + $scope.configBox = true; + $scope.notifyBox = true; + + var url = "/email/fetchCatchAllConfig"; + var data = { domain: $scope.selectedDomain }; + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; + + $http.post(url, data, config).then(function (response) { + $scope.loading = false; + if (response.data.fetchStatus === 1) { + $scope.configBox = false; + if (response.data.configured === 1) { + $scope.currentConfigured = true; + $scope.currentDestination = response.data.destination; + $scope.currentEnabled = response.data.enabled; + $scope.destination = response.data.destination; + $scope.enabled = response.data.enabled; + } else { + $scope.currentConfigured = false; + $scope.destination = ''; + $scope.enabled = true; + } + } else { + $scope.errorBox = false; + $scope.notifyBox = false; + $scope.errorMessage = response.data.error_message; + } + }, function (response) { + $scope.loading = false; + $scope.couldNotConnect = false; + $scope.notifyBox = false; + }); + }; + + $scope.saveConfig = function () { + if (!$scope.destination) { + $scope.errorBox = false; + $scope.notifyBox = false; + $scope.errorMessage = 'Please enter a destination email address'; + return; + } + + $scope.loading = true; + $scope.notifyBox = true; + + var url = "/email/saveCatchAllConfig"; + var data = { + domain: $scope.selectedDomain, + destination: $scope.destination, + enabled: $scope.enabled + }; + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; + + $http.post(url, data, config).then(function (response) { + $scope.loading = false; + if (response.data.saveStatus === 1) { + $scope.successBox = false; + $scope.notifyBox = false; + $scope.successMessage = response.data.message; + $scope.currentConfigured = true; + $scope.currentDestination = $scope.destination; + $scope.currentEnabled = $scope.enabled; + } else { + $scope.errorBox = false; + $scope.notifyBox = false; + $scope.errorMessage = response.data.error_message; + } + }, function (response) { + $scope.loading = false; + $scope.couldNotConnect = false; + $scope.notifyBox = false; + }); + }; + + $scope.deleteConfig = function () { + if (!confirm('Are you sure you want to remove the catch-all configuration?')) { + return; + } + + $scope.loading = true; + $scope.notifyBox = true; + + var url = "/email/deleteCatchAllConfig"; + var data = { domain: $scope.selectedDomain }; + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; + + $http.post(url, data, config).then(function (response) { + $scope.loading = false; + if (response.data.deleteStatus === 1) { + $scope.successBox = false; + $scope.notifyBox = false; + $scope.successMessage = response.data.message; + $scope.currentConfigured = false; + $scope.destination = ''; + $scope.enabled = true; + } else { + $scope.errorBox = false; + $scope.notifyBox = false; + $scope.errorMessage = response.data.error_message; + } + }, function (response) { + $scope.loading = false; + $scope.couldNotConnect = false; + $scope.notifyBox = false; + }); + }; + +}); + +/* Plus-Addressing Controller */ +app.controller('plusAddressing', function ($scope, $http) { + + $scope.loading = true; + $scope.globalEnabled = false; + $scope.delimiter = '+'; + $scope.domainEnabled = true; + $scope.globalNotifyBox = true; + $scope.globalErrorBox = true; + $scope.globalSuccessBox = true; + $scope.domainNotifyBox = true; + $scope.domainErrorBox = true; + $scope.domainSuccessBox = true; + + // Fetch global settings on load + var url = "/email/fetchPlusAddressingConfig"; + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; + + $http.post(url, {}, config).then(function (response) { + $scope.loading = false; + if (response.data.fetchStatus === 1) { + $scope.globalEnabled = response.data.globalEnabled; + $scope.delimiter = response.data.delimiter || '+'; + } + }, function (response) { + $scope.loading = false; + }); + + $scope.saveGlobalSettings = function () { + $scope.loading = true; + $scope.globalNotifyBox = true; + + var url = "/email/savePlusAddressingGlobal"; + var data = { + enabled: $scope.globalEnabled, + delimiter: $scope.delimiter + }; + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; + + $http.post(url, data, config).then(function (response) { + $scope.loading = false; + if (response.data.saveStatus === 1) { + $scope.globalSuccessBox = false; + $scope.globalNotifyBox = false; + $scope.globalSuccessMessage = response.data.message; + } else { + $scope.globalErrorBox = false; + $scope.globalNotifyBox = false; + $scope.globalErrorMessage = response.data.error_message; + } + }, function (response) { + $scope.loading = false; + $scope.globalErrorBox = false; + $scope.globalNotifyBox = false; + $scope.globalErrorMessage = 'Could not connect to server'; + }); + }; + + $scope.saveDomainSettings = function () { + if (!$scope.selectedDomain) { + return; + } + + $scope.domainNotifyBox = true; + + var url = "/email/savePlusAddressingDomain"; + var data = { + domain: $scope.selectedDomain, + enabled: $scope.domainEnabled + }; + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; + + $http.post(url, data, config).then(function (response) { + if (response.data.saveStatus === 1) { + $scope.domainSuccessBox = false; + $scope.domainNotifyBox = false; + $scope.domainSuccessMessage = response.data.message; + } else { + $scope.domainErrorBox = false; + $scope.domainNotifyBox = false; + $scope.domainErrorMessage = response.data.error_message; + } + }, function (response) { + $scope.domainErrorBox = false; + $scope.domainNotifyBox = false; + $scope.domainErrorMessage = 'Could not connect to server'; + }); + }; + +}); + +/* Pattern Forwarding Controller */ +app.controller('patternForwarding', function ($scope, $http) { + + $scope.configBox = true; + $scope.loading = false; + $scope.errorBox = true; + $scope.successBox = true; + $scope.couldNotConnect = true; + $scope.notifyBox = true; + $scope.rules = []; + $scope.patternType = 'wildcard'; + $scope.priority = 100; + + $scope.fetchRules = function () { + if (!$scope.selectedDomain) { + $scope.configBox = true; + return; + } + + $scope.loading = true; + $scope.configBox = true; + $scope.notifyBox = true; + + var url = "/email/fetchPatternRules"; + var data = { domain: $scope.selectedDomain }; + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; + + $http.post(url, data, config).then(function (response) { + $scope.loading = false; + if (response.data.fetchStatus === 1) { + $scope.configBox = false; + $scope.rules = response.data.rules; + } else { + $scope.errorBox = false; + $scope.notifyBox = false; + $scope.errorMessage = response.data.error_message; + } + }, function (response) { + $scope.loading = false; + $scope.couldNotConnect = false; + $scope.notifyBox = false; + }); + }; + + $scope.createRule = function () { + if (!$scope.pattern || !$scope.destination) { + $scope.errorBox = false; + $scope.notifyBox = false; + $scope.errorMessage = 'Please enter both pattern and destination'; + return; + } + + $scope.loading = true; + $scope.notifyBox = true; + + var url = "/email/createPatternRule"; + var data = { + domain: $scope.selectedDomain, + pattern: $scope.pattern, + destination: $scope.destination, + pattern_type: $scope.patternType, + priority: $scope.priority + }; + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; + + $http.post(url, data, config).then(function (response) { + $scope.loading = false; + if (response.data.createStatus === 1) { + $scope.successBox = false; + $scope.notifyBox = false; + $scope.successMessage = response.data.message; + $scope.pattern = ''; + $scope.destination = ''; + $scope.fetchRules(); + } else { + $scope.errorBox = false; + $scope.notifyBox = false; + $scope.errorMessage = response.data.error_message; + } + }, function (response) { + $scope.loading = false; + $scope.couldNotConnect = false; + $scope.notifyBox = false; + }); + }; + + $scope.deleteRule = function (ruleId) { + if (!confirm('Are you sure you want to delete this forwarding rule?')) { + return; + } + + $scope.loading = true; + $scope.notifyBox = true; + + var url = "/email/deletePatternRule"; + var data = { ruleId: ruleId }; + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') } }; + + $http.post(url, data, config).then(function (response) { + $scope.loading = false; + if (response.data.deleteStatus === 1) { + $scope.successBox = false; + $scope.notifyBox = false; + $scope.successMessage = response.data.message; + $scope.fetchRules(); + } else { + $scope.errorBox = false; + $scope.notifyBox = false; + $scope.errorMessage = response.data.error_message; + } + }, function (response) { + $scope.loading = false; + $scope.couldNotConnect = false; + $scope.notifyBox = false; + }); + }; + +}); diff --git a/static/packages/packages.js b/static/packages/packages.js index b07b7d4eb..dd182307d 100644 --- a/static/packages/packages.js +++ b/static/packages/packages.js @@ -64,7 +64,15 @@ app.controller('createPackage', function ($scope, $http) { dataBases: dataBases, emails: emails, allowedDomains: $scope.allowedDomains, - enforceDiskLimits: $scope.enforceDiskLimits + enforceDiskLimits: $scope.enforceDiskLimits, + // Resource Limits + memoryLimitMB: $scope.memoryLimitMB || 1024, + cpuCores: $scope.cpuCores || 1, + ioLimitMBPS: $scope.ioLimitMBPS || 10, + inodeLimit: $scope.inodeLimit || 400000, + maxConnections: $scope.maxConnections || 10, + procSoftLimit: $scope.procSoftLimit || 400, + procHardLimit: $scope.procHardLimit || 500 }; var config = { @@ -236,6 +244,15 @@ app.controller('modifyPackages', function ($scope, $http) { $scope.allowFullDomain = response.data.allowFullDomain === 1; $scope.enforceDiskLimits = response.data.enforceDiskLimits === 1; + // Load resource limits + $scope.memoryLimitMB = response.data.memoryLimitMB || 1024; + $scope.cpuCores = response.data.cpuCores || 1; + $scope.ioLimitMBPS = response.data.ioLimitMBPS || 10; + $scope.inodeLimit = response.data.inodeLimit || 400000; + $scope.maxConnections = response.data.maxConnections || 10; + $scope.procSoftLimit = response.data.procSoftLimit || 400; + $scope.procHardLimit = response.data.procHardLimit || 500; + $scope.modifyButton = "Save Details"; $("#packageDetailsToBeModified").fadeIn(); @@ -283,6 +300,14 @@ app.controller('modifyPackages', function ($scope, $http) { allowedDomains: $scope.allowedDomains, allowFullDomain: $scope.allowFullDomain, enforceDiskLimits: $scope.enforceDiskLimits, + // Resource Limits + memoryLimitMB: $scope.memoryLimitMB || 1024, + cpuCores: $scope.cpuCores || 1, + ioLimitMBPS: $scope.ioLimitMBPS || 10, + inodeLimit: $scope.inodeLimit || 400000, + maxConnections: $scope.maxConnections || 10, + procSoftLimit: $scope.procSoftLimit || 400, + procHardLimit: $scope.procHardLimit || 500 }; var config = { diff --git a/webmail/static/webmail/webmail.js b/webmail/static/webmail/webmail.js index b1d3bb9a5..40deb69df 100644 --- a/webmail/static/webmail/webmail.js +++ b/webmail/static/webmail/webmail.js @@ -215,6 +215,58 @@ app.controller('webmailCtrl', ['$scope', '$http', '$sce', '$timeout', function($ apiCall('/webmail/api/listFolders', {}, function(data) { if (data.status === 1) { $scope.folders = data.folders; + // Pick a sane default folder. + // Some Dovecot setups may not expose a real "INBOX" mailbox (messages live under "INBOX.*"). + // The UI previously hardcoded currentFolder='INBOX', which caused "No messages" even when mail exists. + var chooseDefaultFolder = function(folders) { + if (!folders || folders.length === 0) return 'INBOX'; + + // 1) Prefer exact INBOX if it has messages; otherwise some servers store mail only under INBOX.*. + var inbox = null; + for (var i = 0; i < folders.length; i++) { + if (folders[i] && folders[i].name === 'INBOX') { + inbox = folders[i]; + break; + } + } + if (inbox) { + var inboxUnread = parseInt((inbox.unread_count) ? inbox.unread_count : 0, 10); + var inboxTotal = parseInt((inbox.total_count) ? inbox.total_count : 0, 10); + if (inboxUnread > 0 || inboxTotal > 0) { + return inbox.name; + } + } + + // 2) Prefer the folder with most unread messages. + var best = null; + var bestUnread = -1; + for (var j = 0; j < folders.length; j++) { + var u = parseInt((folders[j] && folders[j].unread_count) ? folders[j].unread_count : 0, 10); + if (u > bestUnread) { + bestUnread = u; + best = folders[j]; + } + } + if (best && bestUnread > 0) { + return best.name; + } + + // 3) Otherwise, pick the folder with most total messages. + best = null; + var bestTotal = -1; + for (var k = 0; k < folders.length; k++) { + var t = parseInt((folders[k] && folders[k].total_count) ? folders[k].total_count : 0, 10); + if (t > bestTotal) { + bestTotal = t; + best = folders[k]; + } + } + + return (best && best.name) ? best.name : (folders[0].name || 'INBOX'); + }; + + $scope.currentFolder = chooseDefaultFolder($scope.folders); + $scope.currentPage = 1; $scope.loadMessages(); } else { notify(data.error_message || 'Failed to load folders.', 'error');