From f1d7df548a8ed2148ac1c010445587af5a12482a Mon Sep 17 00:00:00 2001 From: matt Date: Tue, 30 Mar 2021 15:03:34 -0400 Subject: [PATCH 1/5] KasmVNC changes merged manually --- app/error-handler.js | 4 +- app/images/download.gif | Bin 0 -> 123 bytes .../icons/368_kasm_logo_only_120x120.png | Bin 0 -> 9362 bytes .../icons/368_kasm_logo_only_144x144.png | Bin 0 -> 12038 bytes .../icons/368_kasm_logo_only_152x152.png | Bin 0 -> 13316 bytes app/images/icons/368_kasm_logo_only_16x16.png | Bin 0 -> 2033 bytes .../icons/368_kasm_logo_only_192x192.png | Bin 0 -> 15041 bytes app/images/icons/368_kasm_logo_only_24x24.png | Bin 0 -> 2415 bytes app/images/icons/368_kasm_logo_only_32x32.png | Bin 0 -> 2762 bytes app/images/icons/368_kasm_logo_only_48x48.png | Bin 0 -> 3610 bytes app/images/icons/368_kasm_logo_only_60x60.png | Bin 0 -> 4334 bytes app/images/icons/368_kasm_logo_only_64x64.png | Bin 0 -> 4515 bytes app/images/icons/368_kasm_logo_only_72x72.png | Bin 0 -> 4978 bytes app/images/icons/368_kasm_logo_only_76x76.png | Bin 0 -> 5267 bytes app/images/icons/368_kasm_logo_only_96x96.png | Bin 0 -> 6311 bytes app/images/icons/Makefile | 36 +- app/images/icons/kasm_logo.png | Bin 0 -> 2067 bytes app/images/refresh.gif | Bin 0 -> 137 bytes app/locale/cs.json | 2 +- app/locale/de.json | 2 +- app/locale/el.json | 2 +- app/locale/es.json | 2 +- app/locale/ja.json | 2 +- app/locale/ko.json | 2 +- app/locale/nl.json | 2 +- app/locale/pl.json | 2 +- app/locale/pt_BR.json | 2 +- app/locale/ru.json | 2 +- app/locale/sv.json | 2 +- app/locale/tr.json | 2 +- app/locale/zh_CN.json | 2 +- app/locale/zh_TW.json | 2 +- app/styles/base.css | 55 ++- app/styles/bootstrap.min.css | 6 + app/ui.js | 296 +++++++++++++- app/webutil.js | 10 + core/decoders/tight.js | 14 + core/encodings.js | 26 ++ core/rfb.js | 236 ++++++++++- load.html | 370 ++++++++++++++++++ vnc.html | 97 +++-- vnc_lite.html | 2 +- webpack.config.js | 138 +++++++ 43 files changed, 1224 insertions(+), 94 deletions(-) create mode 100644 app/images/download.gif create mode 100644 app/images/icons/368_kasm_logo_only_120x120.png create mode 100644 app/images/icons/368_kasm_logo_only_144x144.png create mode 100644 app/images/icons/368_kasm_logo_only_152x152.png create mode 100644 app/images/icons/368_kasm_logo_only_16x16.png create mode 100644 app/images/icons/368_kasm_logo_only_192x192.png create mode 100644 app/images/icons/368_kasm_logo_only_24x24.png create mode 100644 app/images/icons/368_kasm_logo_only_32x32.png create mode 100644 app/images/icons/368_kasm_logo_only_48x48.png create mode 100644 app/images/icons/368_kasm_logo_only_60x60.png create mode 100644 app/images/icons/368_kasm_logo_only_64x64.png create mode 100644 app/images/icons/368_kasm_logo_only_72x72.png create mode 100644 app/images/icons/368_kasm_logo_only_76x76.png create mode 100644 app/images/icons/368_kasm_logo_only_96x96.png create mode 100644 app/images/icons/kasm_logo.png create mode 100644 app/images/refresh.gif create mode 100644 app/styles/bootstrap.min.css create mode 100644 load.html create mode 100644 webpack.config.js diff --git a/app/error-handler.js b/app/error-handler.js index 81a6cba8..c65dcd1a 100644 --- a/app/error-handler.js +++ b/app/error-handler.js @@ -16,7 +16,7 @@ (function _scope() { "use strict"; - // Fallback for all uncought errors + // Fallback for all uncaught errors function handleError(event, err) { try { const msg = document.getElementById('noVNC_fallback_errormsg'); @@ -55,7 +55,7 @@ document.getElementById('noVNC_fallback_error') .classList.add("noVNC_open"); } catch (exc) { - document.write("noVNC encountered an error."); + document.write("Kasm encountered an error."); } // Don't return true since this would prevent the error // from being printed to the browser console. diff --git a/app/images/download.gif b/app/images/download.gif new file mode 100644 index 0000000000000000000000000000000000000000..3a524069f5cafa07610cc5ac6df466d7b304b7f4 GIT binary patch literal 123 zcmZ?wbhEHblw=TNXkcLY4+e_=1f7dg6H8K46v{J8G8EiBeFGR2f3h%gF)%XdFaQBa zIRlezPyT|gx7(Gf{iANJITlbIP@AOI7yEK<#;i%%A_vxs=zl$P;?2D6HaEO(gm6e4 WJEEC4sgK*(q|&VYlICUx25SJxxGx?6 literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_120x120.png b/app/images/icons/368_kasm_logo_only_120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..1252383ebde7044a605f90b1e2a957cc759c8d63 GIT binary patch literal 9362 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 literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_152x152.png b/app/images/icons/368_kasm_logo_only_152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..d6251e72bd8814c5a1be30b6a35f3732d06741fc GIT binary patch literal 13316 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 Xj8M)8%3Gp8e`k5EsICB&GY$EF1K8cj literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_16x16.png b/app/images/icons/368_kasm_logo_only_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..db8d3e8d251b5b276b772a35baef7d85e6ed2296 GIT binary patch literal 2033 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-BQX@Rm ze0>?TfNTy1c19rvW+00Z2pJfq7(gn3EQTaTX*fHJQ3I-m2`FjE03;dsfw+j#2+S4% zvYXm78CZZcNbfWt1_2Ks2JyjkKxRd1PHtjJevyK)o+Sf=k%5tcm4PJ?DHvFQ7?wam z<^_xh*DPRyn<%h=8Nmh_?fGE!HXy}W;1OBOz`!jG!i)^F=12hjtCSfMQ4-E(HYzo1&C7s~{IQsCFRFRw<*Tq`*pFzr4I$uiRKKzbIYb(9+UU z-@r)U$VeBcLbtdwuOzWTH?LS3VhGF}m(=3qqRfJl%=|nBkhzIT`K2YcN=hJ$-~i&z zlw`O)1*JtfU|Uj>^;2_Fb5rw5iuDck4E3?;1Ns)OF|QaJ8o+STuShHaYBIp8DYYUK z;Vl$hAQ_z6N;1=MXamVWw1EQ=;y0U=WUJ!Rq^#8B5+qTe95{@FQw#Nxgl+V(s`iAz=kpAK{V- zjDuoeB-$C8+2~`Hz^XA4mqsKBbdApWIr&Aw1&PV2c7{;9kc5y_gM!@3IX}0cD76^u zHUk@d3^8=|5kaZN`8lPa1Zih(1l52nh^_&lJ~S`0#15tfO&DF5e^Dkd(I$ee0r~>$ zEMzfs^^pkk5Y9ptgle$S2jwE9Tm{LpU{PS6wc`TDC@lZmaWS*i9bjN!n(67{7-At< z8yxKs5-1Y;{7mh+o_-bHMRiKelN5p$t=}~Nz=kG;<_U*1UMpA62)p1O6d$%Mf@P-s zRHbY|F9RFSjJ~_#{!i(*g znw7$ltdg{~OYYbhXZ^Tk;k=MH=Uk4&KNrO~R{mKFnz}XKeb{j0__hO&Ui?Z*D)}Sk z^PkV4MX+H*>EbDdQR&f_A1T-ysg^xCA!xb0@9u}sVXxZOIhXm5=e!D? zqNZCjmshY&J$xc-($(7wt0y0HxMZOir>#Aou~W#P%weAJC(lC@)YRHTk1T!STE4%p zU3hMV!N16BUjqcTZu%Nn)x&#PDBwbI!@SQHd!M-|iY*W?;^>^Izp>jVbTeP?6P>sT zXWjS@FMPX3;{3YrVzCJVf2X$Q=igBLx})9l_0JhA5~A;xp7T?X)tcrz_p?cH(YuYk z6_+kWR|FbY^oojdx~9snWx3^cZJODYjk~T`rI$Wf=H1w_b&qydh-jTj9(RUXyX<0j zm5lQT7v1|Pa&~L6xwUMj+==TRDSD6O*lN9Wm~QU8b#K#B{l%M)zN<`Q&z!h!A5-oj pv#0NQLM1<656|J+mH%J=4_m}!_T0DIoPU8TE>BlKmvv4FO#n)$w7viU literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_192x192.png b/app/images/icons/368_kasm_logo_only_192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..c21124de506100a66e5825a12d1e325e7ebe32f3 GIT binary patch literal 15041 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 literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_24x24.png b/app/images/icons/368_kasm_logo_only_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e12aea18d87157764c3da258b74388717b6ce7 GIT binary patch literal 2415 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 PFEUpr4{H9(Eph(?Yo8eC literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_48x48.png b/app/images/icons/368_kasm_logo_only_48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..32f62e647d2a5f074ecb9c57cbbc2531be2467eb GIT binary patch literal 3610 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 literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_60x60.png b/app/images/icons/368_kasm_logo_only_60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..46c1af0e1dfddbd477a394865efb2eb95a1c53d2 GIT binary patch literal 4334 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 MCRWCU2i<7@2h%u^>Hq)$ literal 0 HcmV?d00001 diff --git a/app/images/icons/368_kasm_logo_only_72x72.png b/app/images/icons/368_kasm_logo_only_72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..13dfd6bdc2e4dbb44655fcbefd80c475186c0050 GIT binary patch literal 4978 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 literal 0 HcmV?d00001 diff --git a/app/images/refresh.gif b/app/images/refresh.gif new file mode 100644 index 0000000000000000000000000000000000000000..cfa80ce0e0434e9a3d2f38fb4420a84fd3c6838d GIT binary patch literal 137 zcmZ?wbhEHblw^=%XkcLY4+e_=1f7dg6H8K46v{J8G8EiBeFGR2f3h%gF)%XdFaQBa zIRle-Pyfo*58nHwFy0Dh+%2QmSJLSks~k2-XxGfuZbxsbY%j6R*2zn-e!rVh**+#f lLA$;@lEosGP`?eo#ZQ6MG=_UpSYXC`2Hs}BV literal 0 HcmV?d00001 diff --git a/app/locale/cs.json b/app/locale/cs.json index 589145ef..6d324719 100644 --- a/app/locale/cs.json +++ b/app/locale/cs.json @@ -12,7 +12,7 @@ "New connection has been rejected with reason: ": "Nové připojení bylo odmítnuto s odůvodněním: ", "New connection has been rejected": "Nové připojení bylo odmítnuto", "Password is required": "Je vyžadováno heslo", - "noVNC encountered an error:": "noVNC narazilo na chybu:", + "Kasm encountered an error:": "Kasm narazilo na chybu:", "Hide/Show the control bar": "Skrýt/zobrazit ovládací panel", "Move/Drag Viewport": "Přesunout/přetáhnout výřez", "viewport drag": "přesun výřezu", diff --git a/app/locale/de.json b/app/locale/de.json index 62e73360..60cbcdd5 100644 --- a/app/locale/de.json +++ b/app/locale/de.json @@ -11,7 +11,7 @@ "New connection has been rejected with reason: ": "Verbindung wurde aus folgendem Grund abgelehnt: ", "New connection has been rejected": "Verbindung wurde abgelehnt", "Password is required": "Passwort ist erforderlich", - "noVNC encountered an error:": "Ein Fehler ist aufgetreten:", + "Kasm encountered an error:": "Ein Fehler ist aufgetreten:", "Hide/Show the control bar": "Kontrollleiste verstecken/anzeigen", "Move/Drag Viewport": "Ansichtsfenster verschieben/ziehen", "viewport drag": "Ansichtsfenster ziehen", diff --git a/app/locale/el.json b/app/locale/el.json index f801251c..8f3b1800 100644 --- a/app/locale/el.json +++ b/app/locale/el.json @@ -11,7 +11,7 @@ "New connection has been rejected with reason: ": "Η νέα σύνδεση απορρίφθηκε διότι: ", "New connection has been rejected": "Η νέα σύνδεση απορρίφθηκε ", "Password is required": "Απαιτείται ο κωδικός πρόσβασης", - "noVNC encountered an error:": "το noVNC αντιμετώπισε ένα σφάλμα:", + "Kasm encountered an error:": "το Kasm αντιμετώπισε ένα σφάλμα:", "Hide/Show the control bar": "Απόκρυψη/Εμφάνιση γραμμής ελέγχου", "Move/Drag Viewport": "Μετακίνηση/Σύρσιμο Θεατού πεδίου", "viewport drag": "σύρσιμο θεατού πεδίου", diff --git a/app/locale/es.json b/app/locale/es.json index 23f23f49..147b317f 100644 --- a/app/locale/es.json +++ b/app/locale/es.json @@ -8,7 +8,7 @@ "Reconnecting...": "Reconectando...", "Password is required": "Contraseña es obligatoria", "Disconnect timeout": "Tiempo de desconexión agotado", - "noVNC encountered an error:": "noVNC ha encontrado un error:", + "Kasm encountered an error:": "Kasm ha encontrado un error:", "Hide/Show the control bar": "Ocultar/Mostrar la barra de control", "Move/Drag Viewport": "Mover/Arrastrar la ventana", "viewport drag": "Arrastrar la ventana", diff --git a/app/locale/ja.json b/app/locale/ja.json index 43fc5bf3..c6a4abc8 100644 --- a/app/locale/ja.json +++ b/app/locale/ja.json @@ -12,7 +12,7 @@ "New connection has been rejected with reason: ": "新規接続は次の理由で拒否されました: ", "New connection has been rejected": "新規接続は拒否されました", "Credentials are required": "資格情報が必要です", - "noVNC encountered an error:": "noVNC でエラーが発生しました:", + "Kasm encountered an error:": "Kasm でエラーが発生しました:", "Hide/Show the control bar": "コントロールバーを隠す/表示する", "Drag": "ドラッグ", "Move/Drag Viewport": "ビューポートを移動/ドラッグ", diff --git a/app/locale/ko.json b/app/locale/ko.json index e4ecddcf..11da19d9 100644 --- a/app/locale/ko.json +++ b/app/locale/ko.json @@ -12,7 +12,7 @@ "New connection has been rejected with reason: ": "새 연결이 다음 이유로 거부되었습니다:", "New connection has been rejected": "새 연결이 거부되었습니다.", "Password is required": "비밀번호가 필요합니다.", - "noVNC encountered an error:": "noVNC에 오류가 발생했습니다:", + "Kasm encountered an error:": "Kasm에 오류가 발생했습니다:", "Hide/Show the control bar": "컨트롤 바 숨기기/보이기", "Move/Drag Viewport": "움직이기/드래그 뷰포트", "viewport drag": "뷰포트 드래그", diff --git a/app/locale/nl.json b/app/locale/nl.json index 0cdcc92a..758daf7a 100644 --- a/app/locale/nl.json +++ b/app/locale/nl.json @@ -12,7 +12,7 @@ "New connection has been rejected with reason: ": "Nieuwe verbinding is geweigerd omwille van de volgende reden: ", "New connection has been rejected": "Nieuwe verbinding is geweigerd", "Password is required": "Wachtwoord is vereist", - "noVNC encountered an error:": "noVNC heeft een fout bemerkt:", + "Kasm encountered an error:": "Kasm heeft een fout bemerkt:", "Hide/Show the control bar": "Verberg/Toon de bedieningsbalk", "Move/Drag Viewport": "Verplaats/Versleep Kijkvenster", "viewport drag": "kijkvenster slepen", diff --git a/app/locale/pl.json b/app/locale/pl.json index 006ac7a5..27a2721d 100644 --- a/app/locale/pl.json +++ b/app/locale/pl.json @@ -11,7 +11,7 @@ "New connection has been rejected with reason: ": "Nowe połączenie zostało odrzucone z powodu: ", "New connection has been rejected": "Nowe połączenie zostało odrzucone", "Password is required": "Hasło jest wymagane", - "noVNC encountered an error:": "noVNC napotkało błąd:", + "Kasm encountered an error:": "Kasm napotkało błąd:", "Hide/Show the control bar": "Pokaż/Ukryj pasek ustawień", "Move/Drag Viewport": "Ruszaj/Przeciągaj Viewport", "viewport drag": "przeciągnij viewport", diff --git a/app/locale/pt_BR.json b/app/locale/pt_BR.json index aa130f76..ceb204af 100644 --- a/app/locale/pt_BR.json +++ b/app/locale/pt_BR.json @@ -12,7 +12,7 @@ "New connection has been rejected with reason: ": "A nova conexão foi rejeitada pelo motivo: ", "New connection has been rejected": "A nova conexão foi rejeitada", "Credentials are required": "Credenciais são obrigatórias", - "noVNC encountered an error:": "O noVNC encontrou um erro:", + "Kasm encountered an error:": "O Kasm encontrou um erro:", "Hide/Show the control bar": "Esconder/mostrar a barra de controles", "Drag": "Arrastar", "Move/Drag Viewport": "Mover/arrastar a janela", diff --git a/app/locale/ru.json b/app/locale/ru.json index 52e57f37..8644a3bf 100644 --- a/app/locale/ru.json +++ b/app/locale/ru.json @@ -12,7 +12,7 @@ "New connection has been rejected with reason: ": "Подключиться не удалось: ", "New connection has been rejected": "Подключиться не удалось", "Password is required": "Требуется пароль", - "noVNC encountered an error:": "Ошибка noVNC: ", + "Kasm encountered an error:": "Ошибка Kasm: ", "Hide/Show the control bar": "Скрыть/Показать контрольную панель", "Move/Drag Viewport": "Переместить окно", "viewport drag": "Переместить окно", diff --git a/app/locale/sv.json b/app/locale/sv.json index e46df45b..193393a7 100644 --- a/app/locale/sv.json +++ b/app/locale/sv.json @@ -12,7 +12,7 @@ "New connection has been rejected with reason: ": "Ny anslutning har blivit nekad med följande skäl: ", "New connection has been rejected": "Ny anslutning har blivit nekad", "Credentials are required": "Användaruppgifter krävs", - "noVNC encountered an error:": "noVNC stötte på ett problem:", + "Kasm encountered an error:": "Kasm stötte på ett problem:", "Hide/Show the control bar": "Göm/Visa kontrollbaren", "Drag": "Dra", "Move/Drag Viewport": "Flytta/Dra Vyn", diff --git a/app/locale/tr.json b/app/locale/tr.json index 451c1b8a..fe5e2dea 100644 --- a/app/locale/tr.json +++ b/app/locale/tr.json @@ -11,7 +11,7 @@ "New connection has been rejected with reason: ": "Bağlantı aşağıdaki nedenlerden dolayı reddedildi: ", "New connection has been rejected": "Bağlantı reddedildi", "Password is required": "Şifre gerekli", - "noVNC encountered an error:": "Bir hata oluştu:", + "Kasm encountered an error:": "Bir hata oluştu:", "Hide/Show the control bar": "Denetim masasını Gizle/Göster", "Move/Drag Viewport": "Görünümü Taşı/Sürükle", "viewport drag": "Görüntü penceresini sürükle", diff --git a/app/locale/zh_CN.json b/app/locale/zh_CN.json index f0aea9af..5590c9f0 100644 --- a/app/locale/zh_CN.json +++ b/app/locale/zh_CN.json @@ -12,7 +12,7 @@ "New connection has been rejected with reason: ": "连接被拒绝,原因:", "New connection has been rejected": "连接被拒绝", "Password is required": "请提供密码", - "noVNC encountered an error:": "noVNC 遇到一个错误:", + "Kasm encountered an error:": "Kasm 遇到一个错误:", "Hide/Show the control bar": "显示/隐藏控制栏", "Move/Drag Viewport": "拖放显示范围", "viewport drag": "显示范围拖放", diff --git a/app/locale/zh_TW.json b/app/locale/zh_TW.json index 8ddf813f..330d91dd 100644 --- a/app/locale/zh_TW.json +++ b/app/locale/zh_TW.json @@ -12,7 +12,7 @@ "New connection has been rejected with reason: ": "連線被拒絕,原因:", "New connection has been rejected": "連線被拒絕", "Password is required": "請提供密碼", - "noVNC encountered an error:": "noVNC 遇到一個錯誤:", + "Kasm encountered an error:": "Kasm 遇到一個錯誤:", "Hide/Show the control bar": "顯示/隱藏控制列", "Move/Drag Viewport": "拖放顯示範圍", "viewport drag": "顯示範圍拖放", diff --git a/app/styles/base.css b/app/styles/base.css index fd78b79c..a18e673c 100644 --- a/app/styles/base.css +++ b/app/styles/base.css @@ -23,10 +23,7 @@ body { margin:0; padding:0; font-family: Helvetica; - /*Background image with light grey curve.*/ - background-color:#494949; - background-repeat:no-repeat; - background-position:right bottom; + background: white url('../images/icons/kasm_logo.png') no-repeat fixed center; height:100%; touch-action: none; } @@ -55,7 +52,7 @@ html { width: 10px; height: 10px; border-radius: 2px; - box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); + box-shadow: -60px 10px 0 white; animation: noVNC_spinner 1.0s linear infinite; } .noVNC_spinner::before { @@ -73,9 +70,9 @@ html { animation-delay: 0.1s; } @keyframes noVNC_spinner { - 0% { box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); width: 20px; } - 25% { box-shadow: 20px 10px 0 rgba(255, 255, 255, 1); width: 10px; } - 50% { box-shadow: 60px 10px 0 rgba(255, 255, 255, 0); width: 10px; } + 0% { box-shadow: -60px 10px 0 rgba(0, 135, 200, 0); width: 20px; } + 25% { box-shadow: 20px 10px 0 rgba(0, 135, 200, 1); width: 10px; } + 50% { box-shadow: 60px 10px 0 rgba(0, 135, 200, 0); width: 10px; } } /* ---------------------------------------- @@ -290,9 +287,8 @@ select:active { font-weight: bold; color: #fff; - border-radius: 10px; box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); - background: rgba(200,55,55,0.8); + background: rgba(33, 130, 177, 0.8); } #noVNC_fallback_error.noVNC_open > div { transform: translateY(0); @@ -329,6 +325,20 @@ select:active { overflow: auto; } +/* ---------------------------------------- + * Connection Stats + * ---------------------------------------- + */ + #noVNC_connection_stats { + top: 0; + left: auto; + right: 0; + position: fixed; + background: #9fa5a2d4; + color: #00ffa2d4; + visibility: hidden; +} + /* ---------------------------------------- * Control Bar * ---------------------------------------- @@ -358,7 +368,7 @@ select:active { transition: 0.5s ease-in-out; - background-color: rgb(110, 132, 163); + background-color: rgb(80, 89, 101); border-radius: 0 10px 10px 0; } @@ -620,6 +630,7 @@ select:active { #noVNC_control_bar .noVNC_logo { font-size: 13px; + text-align: center; } :root:not(.noVNC_connected) #noVNC_view_drag_button { @@ -805,17 +816,19 @@ select:active { } #noVNC_connect_button { cursor: pointer; - + + /* padding: 10px; color: white; background-color: rgb(110, 132, 163); border-radius: 12px; + box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); + */ text-align: center; font-size: 20px; - - box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); + margin-top: 130px; } #noVNC_connect_button div { margin: 2px; @@ -827,6 +840,7 @@ select:active { /* This avoids it jumping around when :active */ vertical-align: middle; + color: white; } #noVNC_connect_button div:active { border-bottom-width: 1px; @@ -879,14 +893,20 @@ select:active { bottom: 0; right: 0; - color: white; - background: rgba(0, 0, 0, 0.5); + color: #0084C2; + background: white url('../images/icons/kasm_logo.png') no-repeat fixed center; z-index: 50; /*display: flex;*/ align-items: center; justify-content: center; flex-direction: column; + + -webkit-transition: opacity 1s ease-in-out; + -moz-transition: opacity 1s ease-in-out; + -ms-transition: opacity 1s ease-in-out; + -o-transition: opacity 1s ease-in-out; + opacity: 1; } :root.noVNC_loading #noVNC_transition, :root.noVNC_connecting #noVNC_transition, @@ -899,13 +919,14 @@ select:active { } #noVNC_transition_text { font-size: 1.5em; + margin-top: 125px; } /* Main container */ #noVNC_container { width: 100%; height: 100%; - background-color: #313131; + background-color: rgb(74, 144, 217, 0.5); border-bottom-right-radius: 800px 600px; /*border-top-left-radius: 800px 600px;*/ } diff --git a/app/styles/bootstrap.min.css b/app/styles/bootstrap.min.css new file mode 100644 index 00000000..ed3905e0 --- /dev/null +++ b/app/styles/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-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{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-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{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.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:-o-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);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{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:-o-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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{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:-o-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)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{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:-o-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)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{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:-o-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)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-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%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@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}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.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:1000px;perspective:1000px}.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{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.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%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.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%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/app/ui.js b/app/ui.js index 0b5bfd01..8f95c2c2 100644 --- a/app/ui.js +++ b/app/ui.js @@ -5,6 +5,20 @@ * * See README.md for usage and integration instructions. */ +window._noVNC_has_module_support = true; +window.addEventListener("load", function() { + if (window._noVNC_has_module_support) return; + var loader = document.createElement("script"); + loader.src = "vendor/browser-es-module-loader/dist/browser-es-module-loader.js"; + document.head.appendChild(loader); +}); +window.addEventListener("load", function() { + var connect_btn_el = document.getElementById("noVNC_connect_button"); + if (typeof(connect_btn_el) != 'undefined' && connect_btn_el != null) + { + connect_btn_el.click(); + } +}); import * as Log from '../core/util/logging.js'; import _, { l10n } from './localization.js'; @@ -17,7 +31,12 @@ import Keyboard from "../core/input/keyboard.js"; import RFB from "../core/rfb.js"; import * as WebUtil from "./webutil.js"; -const PAGE_TITLE = "noVNC"; +const PAGE_TITLE = "KasmVNC"; + +var delta = 500; +var lastKeypressTime = 0; +var currentEventCount = -1; +var idleCounter = 0; const UI = { @@ -36,6 +55,7 @@ const UI = { lastKeyboardinput: null, defaultKeyboardinputLen: 100, + needToCheckClipboardChange: false, inhibitReconnect: true, reconnectCallback: null, @@ -166,7 +186,7 @@ const UI = { UI.initSetting('port', port); UI.initSetting('encrypt', (window.location.protocol === "https:")); UI.initSetting('view_clip', false); - UI.initSetting('resize', 'off'); + /* UI.initSetting('resize', 'off'); */ UI.initSetting('quality', 6); UI.initSetting('compression', 2); UI.initSetting('shared', true); @@ -176,6 +196,26 @@ const UI = { UI.initSetting('repeaterID', ''); UI.initSetting('reconnect', false); UI.initSetting('reconnect_delay', 5000); + UI.initSetting('idle_disconnect', 20); + UI.initSetting('prefer_local_cursor', true); + UI.initSetting('toggle_control_panel', false); + UI.initSetting('enable_perf_stats', false); + + if (WebUtil.isInsideKasmVDI()) { + UI.initSetting('video_quality', 1); + UI.initSetting('clipboard_up', false); + UI.initSetting('clipboard_down', false); + UI.initSetting('clipboard_seamless', false); + UI.initSetting('enable_webp', false); + UI.initSetting('resize', 'off'); + } else { + UI.initSetting('video_quality', 3); + UI.initSetting('clipboard_up', true); + UI.initSetting('clipboard_down', true); + UI.initSetting('clipboard_seamless', true); + UI.initSetting('enable_webp', true); + UI.initSetting('resize', 'remote'); + } UI.setupSettingLabels(); }, @@ -343,6 +383,8 @@ const UI = { document.getElementById("noVNC_settings_button") .addEventListener('click', UI.toggleSettingsPanel); + document.getElementById("noVNC_setting_enable_perf_stats").addEventListener('click', UI.showStats); + UI.addSettingChangeHandler('encrypt'); UI.addSettingChangeHandler('resize'); UI.addSettingChangeHandler('resize', UI.applyResizeMode); @@ -366,6 +408,10 @@ const UI = { UI.addSettingChangeHandler('logging', UI.updateLogging); UI.addSettingChangeHandler('reconnect'); UI.addSettingChangeHandler('reconnect_delay'); + UI.addSettingChangeHandler('enable_webp'); + UI.addSettingChangeHandler('clipboard_seamless'); + UI.addSettingChangeHandler('clipboard_up'); + UI.addSettingChangeHandler('clipboard_down'); }, addFullscreenHandlers() { @@ -393,6 +439,11 @@ const UI = { document.documentElement.classList.remove("noVNC_reconnecting"); const transitionElem = document.getElementById("noVNC_transition_text"); + if (WebUtil.isInsideKasmVDI()) + { + parent.postMessage({ action: 'connection_state', value: state}, '*' ); + } + switch (state) { case 'init': break; @@ -449,6 +500,24 @@ const UI = { .classList.remove('noVNC_open'); }, + showStats() { + UI.saveSetting('enable_perf_stats'); + + let enable_stats = UI.getSetting('enable_perf_stats'); + if (enable_stats === true && UI.statsInterval == undefined) { + document.getElementById("noVNC_connection_stats").style.visibility = "visible"; + UI.statsInterval = setInterval(function() { + if (UI.rfb !== undefined) { + UI.rfb.requestBottleneckStats(); + } + } , 5000); + } else { + document.getElementById("noVNC_connection_stats").style.visibility = "hidden"; + UI.statsInterval = null; + } + + }, + showStatus(text, statusType, time) { const statusElem = document.getElementById('noVNC_status'); @@ -948,10 +1017,104 @@ const UI = { } }, + readClipboard: function readClipboard(callback) { + if (navigator.clipboard && navigator.clipboard.readText) { + navigator.clipboard.readText().then(function (text) { + return callback(text); + }).catch(function () { + return Log.Debug("Failed to read system clipboard"); + }); + } + }, + clipboardReceive(e) { - Log.Debug(">> UI.clipboardReceive: " + e.detail.text.substr(0, 40) + "..."); - document.getElementById('noVNC_clipboard_text').value = e.detail.text; - Log.Debug("<< UI.clipboardReceive"); + if (UI.rfb.clipboardDown && UI.rfb.clipboardSeamless ) { + var curvalue = document.getElementById('noVNC_clipboard_text').value; + if (curvalue != e.detail.text) { + Log.Debug(">> UI.clipboardReceive: " + e.detail.text.substr(0, 40) + "..."); + document.getElementById('noVNC_clipboard_text').value = e.detail.text; + Log.Debug("<< UI.clipboardReceive"); + if (navigator.clipboard && navigator.clipboard.writeText){ + navigator.clipboard.writeText(e.detail.text) + .then(function () { + //UI.popupMessage("Selection Copied"); + }, function () { + console.error("Failed to write system clipboard (trying to copy from NoVNC clipboard)") + }); + } + } + } + }, + + //recieved bottleneck stats + bottleneckStatsRecieve(e) { + var obj = JSON.parse(e.detail.text); + document.getElementById("noVNC_connection_stats").innerHTML = "CPU: " + obj[0] + "/" + obj[1] + " | Network: " + obj[2] + "/" + obj[3]; + console.log(e.detail.text); + }, + + popupMessage: function(msg, secs) { + if (!secs){ + secs = 500; + } + // Quick popup to give feedback that selection was copied + setTimeout(UI.showOverlay.bind(this, msg, secs), 200); + }, + + // Enter and focus events come when we return to NoVNC. + // In both cases, check the local clipboard to see if it changed. + focusVNC: function() { + UI.copyFromLocalClipboard(); + }, + enterVNC: function() { + UI.copyFromLocalClipboard(); + }, + copyFromLocalClipboard: function copyFromLocalClipboard() { + if (UI.rfb && UI.rfb.clipboardUp && UI.rfb.clipboardSeamless) { + UI.readClipboard(function (text) { + var maximumBufferSize = 10000; + var clipVal = document.getElementById('noVNC_clipboard_text').value; + + if (clipVal != text) { + document.getElementById('noVNC_clipboard_text').value = text; // The websocket has a maximum buffer array size + + if (text.length > maximumBufferSize) { + UI.popupMessage("Clipboard contents too large. Data truncated", 2000); + UI.rfb.clipboardPasteFrom(text.slice(0, maximumBufferSize)); + } else { + //UI.popupMessage("Copied from Local Clipboard"); + UI.rfb.clipboardPasteFrom(text); + } + } // Reset flag to prevent checking too often + + + UI.needToCheckClipboardChange = false; + }); + } + }, + + // These 3 events indicate the focus has gone outside the NoVNC. + // When outside the NoVNC, the system clipboard could change. + leaveVNC: function() { + UI.needToCheckClipboardChange = true; + }, + blurVNC: function() { + UI.needToCheckClipboardChange = true; + }, + focusoutVNC: function() { + UI.needToCheckClipboardChange = true; + }, + + // On these 2 events, check if we need to look at clipboard. + mouseMoveVNC: function() { + if ( UI.needToCheckClipboardChange ) { + UI.copyFromLocalClipboard(); + } + }, + mouseDownVNC: function() { + if ( UI.needToCheckClipboardChange ) { + UI.copyFromLocalClipboard(); + } }, clipboardClear() { @@ -1034,6 +1197,14 @@ const UI = { UI.rfb.addEventListener("securityfailure", UI.securityFailed); UI.rfb.addEventListener("capabilities", UI.updatePowerButton); UI.rfb.addEventListener("clipboard", UI.clipboardReceive); + UI.rfb.addEventListener("bottleneck_stats", UI.bottleneckStatsRecieve); + document.addEventListener('mouseenter', UI.enterVNC); + document.addEventListener('mouseleave', UI.leaveVNC); + document.addEventListener('blur', UI.blurVNC); + document.addEventListener('focus', UI.focusVNC); + document.addEventListener('focusout', UI.focusoutVNC); + document.addEventListener('mousemove', UI.mouseMoveVNC); + document.addEventListener('mousedown', UI.mouseDownVNC); UI.rfb.addEventListener("bell", UI.bell); UI.rfb.addEventListener("desktopname", UI.updateDesktopName); UI.rfb.clipViewport = UI.getSetting('view_clip'); @@ -1042,8 +1213,80 @@ const UI = { UI.rfb.qualityLevel = parseInt(UI.getSetting('quality')); UI.rfb.compressionLevel = parseInt(UI.getSetting('compression')); UI.rfb.showDotCursor = UI.getSetting('show_dot'); - + UI.rfb.idleDisconnect = UI.getSetting('idle_disconnect'); + UI.rfb.videoQuality = UI.getSetting('video_quality'); + UI.rfb.clipboardUp = UI.getSetting('clipboard_up'); + UI.rfb.clipboardDown = UI.getSetting('clipboard_down'); + UI.rfb.clipboardSeamless = UI.getSetting('clipboard_seamless'); + // KASM-960 workaround, disable seamless on Safari + if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) + { + UI.rfb.clipboardSeamless = false; + } + UI.rfb.preferLocalCursor = UI.getSetting('prefer_local_cursor'); + UI.rfb.enableWebP = UI.getSetting('enable_webp'); UI.updateViewOnly(); // requires UI.rfb + + /**** + * Kasm VDI specific + *****/ + if (WebUtil.isInsideKasmVDI()) + { + if (window.addEventListener) { // Mozilla, Netscape, Firefox + //window.addEventListener('load', WindowLoad, false); + window.addEventListener('message', UI.receiveMessage, false); + } else if (window.attachEvent) { //IE + window.attachEvent('onload', WindowLoad); + window.attachEvent('message', UI.receiveMessage); + } + if (UI.rfb.clipboardDown){ + UI.rfb.addEventListener("clipboard", UI.clipboardRx); + } + UI.rfb.addEventListener("disconnect", UI.disconnectedRx); + document.getElementById('noVNC_control_bar_anchor').setAttribute('style', 'display: none'); + document.getElementById('noVNC_connect_dlg').innerHTML = ''; + + //keep alive for websocket connection to stay open, since we may not control reverse proxies + //send a keep alive within a window that we control + setInterval(function() { + if (currentEventCount!=UI.rfb.sentEventsCounter) { + idleCounter=0; + currentEventCount=UI.rfb.sentEventsCounter; + } else { + idleCounter+=1; + var idleDisconnect = parseFloat(UI.rfb.idleDisconnect); + if ((idleCounter / 2) >= idleDisconnect) { + //idle for longer than the limit, disconnect + currentEventCount = -1; + idleCounter = 0; + parent.postMessage({ action: 'idle_session_timeout', value: 'Idle session timeout exceeded'}, '*' ); + //UI.rfb.disconnect(); + } else { + //send a keep alive + UI.rfb.sendKey(1, null, false); + currentEventCount=UI.rfb.sentEventsCounter; + } + } + }, 30000); + } + + // Send an event to the parent document (kasm app) to toggle the control panel when ctl is double clicked + if (UI.getSetting('toggle_control_panel', false)) { + + document.addEventListener('keyup', function (event) { + // CTRL and the various implementations of the mac command key + if ([17, 224, 91, 93].indexOf(event.keyCode) > -1) { + var thisKeypressTime = new Date(); + + if (thisKeypressTime - lastKeypressTime <= delta) { + UI.toggleNav(); + thisKeypressTime = 0; + } + + lastKeypressTime = thisKeypressTime; + } + }, true); + } }, disconnect() { @@ -1093,6 +1336,7 @@ const UI = { msg = _("Connected (unencrypted) to ") + UI.desktopName; } UI.showStatus(msg); + UI.showStats(); UI.updateVisualState('connected'); // Do this last because it can only be used on rendered elements @@ -1149,6 +1393,40 @@ const UI = { UI.showStatus(msg, 'error'); }, + /* + Menu.js Additions + */ + receiveMessage(event) { + //TODO: UNCOMMENT FOR PRODUCTION + //if (event.origin !== "https://kasmweb.com") + // return; + + if (event.data && event.data.action) { + switch (event.data.action) { + case 'clipboardsnd': + if (UI.rfb.clipboardUp) { + UI.rfb.clipboardPasteFrom(event.data.value); + } + break; + case 'setvideoquality': + UI.rfb.videoQuality = event.data.value; + break; + } + } + }, + + disconnectedRx(event) { + parent.postMessage({ action: 'disconnectrx', value: event.detail.reason}, '*' ); + }, + + toggleNav(){ + parent.postMessage({ action: 'togglenav', value: null}, '*' ); + }, + + clipboardRx(event) { + parent.postMessage({ action: 'clipboardrx', value: event.detail.text}, '*' ); //TODO fix star + }, + /* ------^------- * /CONNECTION * ============== @@ -1259,6 +1537,9 @@ const UI = { UI.rfb.scaleViewport = UI.getSetting('resize') === 'scale'; UI.rfb.resizeSession = UI.getSetting('resize') === 'remote'; + UI.rfb.idleDisconnect = UI.getSetting('idle_disconnect'); + UI.rfb.videoQuality = UI.getSetting('video_quality'); + UI.rfb.enableWebP = UI.getSetting('enable_webp'); }, /* ------^------- @@ -1416,6 +1697,9 @@ const UI = { keepVirtualKeyboard(event) { const input = document.getElementById('noVNC_keyboardinput'); + if ( UI.needToCheckClipboardChange ) { + UI.copyFromLocalClipboard(); + } // Only prevent focus change if the virtual keyboard is active if (document.activeElement != input) { diff --git a/app/webutil.js b/app/webutil.js index a9fee322..a6737072 100644 --- a/app/webutil.js +++ b/app/webutil.js @@ -175,3 +175,13 @@ export function eraseSetting(name) { localStorage.removeItem(name); } } + +//Are we running inside the Kasm VDI Framework +export function isInsideKasmVDI() { + //TODO: We should use a more explicit way to detect we are running inside KasmVDI + try { + return window.self !== window.top; + } catch (e) { + return true; + } +} \ No newline at end of file diff --git a/core/decoders/tight.js b/core/decoders/tight.js index 7952707c..873ac9a6 100644 --- a/core/decoders/tight.js +++ b/core/decoders/tight.js @@ -59,6 +59,9 @@ export default class TightDecoder { } else if ((this._ctl & 0x08) == 0) { ret = this._basicRect(this._ctl, x, y, width, height, sock, display, depth); + } else if (this._ctl === 0x0B) { + ret = this._webpRect(x, y, width, height, + sock, display, depth); } else { throw new Error("Illegal tight compression received (ctl: " + this._ctl + ")"); @@ -97,6 +100,17 @@ export default class TightDecoder { return true; } + _webpRect(x, y, width, height, sock, display, depth) { + let data = this._readData(sock); + if (data === null) { + return false; + } + + display.imageRect(x, y, width, height, "image/webp", data); + + return true; + } + _pngRect(x, y, width, height, sock, display, depth) { throw new Error("PNG received in standard Tight rect"); } diff --git a/core/encodings.js b/core/encodings.js index 51c09929..b1bb12b2 100644 --- a/core/encodings.js +++ b/core/encodings.js @@ -27,6 +27,32 @@ export const encodings = { pseudoEncodingContinuousUpdates: -313, pseudoEncodingCompressLevel9: -247, pseudoEncodingCompressLevel0: -256, + + pseudoEncodingWEBP: -1024, + pseudoEncodingJpegVideoQualityLevel0: -1023, + pseudoEncodingJpegVideoQualityLevel9: -1014, + pseudoEncodingWebpVideoQualityLevel0: -1013, + pseudoEncodingWebpVideoQualityLevel9: -1004, + pseudoEncodingTreatLosslessLevel0: -1003, + pseudoEncodingTreatLosslessLevel10: -993, + pseudoEncodingPreferBandwidth: -992, + pseudoEncodingDynamicQualityMinLevel0: -991, + pseudoEncodingDynamicQualityMinLevel9: -982, + pseudoEncodingDynamicQualityMaxLevel0: -981, + pseudoEncodingDynamicQualityMaxLevel9: -972, + pseudoEncodingVideoAreaLevel1: -971, + pseudoEncodingVideoAreaLevel100: -871, + pseudoEncodingVideoTimeLevel0: -870, + pseudoEncodingVideoTimeLevel100: -770, + + pseudoEncodingFrameRateLevel10: -2048, + pseudoEncodingFrameRateLevel60: -1998, + pseudoEncodingMaxVideoResolution: -1997, + pseudoEncodingVideoScalingLevel0: -1996, + pseudoEncodingVideoScalingLevel9: -1987, + pseudoEncodingVideoOutTimeLevel1: -1986, + pseudoEncodingVideoOutTimeLevel100: -1887, + pseudoEncodingVMwareCursor: 0x574d5664, pseudoEncodingExtendedClipboard: 0xc0a1e5ce }; diff --git a/core/rfb.js b/core/rfb.js index 876255ba..d73bcdbf 100644 --- a/core/rfb.js +++ b/core/rfb.js @@ -37,6 +37,9 @@ import TightPNGDecoder from "./decoders/tightpng.js"; const DISCONNECT_TIMEOUT = 3; const DEFAULT_BACKGROUND = 'rgb(40, 40, 40)'; +var _videoQuality = 2; +var _enableWebP = false; + // Minimum wait (ms) between two mouse moves const MOUSE_MOVE_DELAY = 17; @@ -124,6 +127,21 @@ export default class RFB extends EventTargetMixin { this._qemuExtKeyEventSupported = false; + // kasm defaults + this._jpegVideoQuality = 5; + this._webpVideoQuality = 5; + this._treatLossless = 7; + this._preferBandwidth = true; + this._dynamicQualityMin = 3; + this._dynamicQualityMax = 9; + this._videoArea = 65; + this._videoTime = 5; + this._videoOutTime = 3; + this._videoScaling = 2; + this._frameRate = 30; + this._maxVideoResolutionX = 960; + this._maxVideoResolutionY = 540; + this._clipboardText = null; this._clipboardServerCapabilitiesActions = {}; this._clipboardServerCapabilitiesFormats = {}; @@ -293,8 +311,11 @@ export default class RFB extends EventTargetMixin { // ===== PROPERTIES ===== + + this.dragViewport = false; this.focusOnClick = true; + this.sentEventsCounter = 0; this._viewOnly = false; this._clipViewport = false; @@ -313,6 +334,51 @@ export default class RFB extends EventTargetMixin { // ===== PROPERTIES ===== + get videoQuality() { return this._videoQuality; } + set videoQuality(quality) { this._videoQuality = quality; } + + get enableWebP() { return this._enableWebP; } + set enableWebP(enabled) { this._enableWebP = enabled; } + + get jpegVideoQuality() { return this._jpegVideoQuality; } + set jpegVideoQuality(val) { this._jpegVideoQuality = val; } + + get webpVideoQuality() { return this._webpVideoQuality; } + set webpVideoQuality(val) { this._webpVideoQuality = val; } + + get treatLossless() { return this._treatLossless; } + set treatLossless(val) { this._treatLossless = val; } + + get preferBandwidth() { return this._preferBandwidth; } + set preferBandwidth(val) { this._preferBandwidth = val; } + + get dynamicQualityMin() { return this._dynamicQualityMin; } + set dynamicQualityMin(val) { this._dynamicQualityMin = val; } + + get dynamicQualityMax() { return this._dynamicQualityMax; } + set dynamicQualityMax(val) { this._dynamicQualityMax = val; } + + get videoArea() { return this._videoArea; } + set videoArea(val) { this._videoArea = val; } + + get videoTime() { return this._videoTime; } + set videoTime(val) { this._videoTime = val; } + + get videoOutTime() { return this._videoOutTime; } + set videoOutTime(val) { this._videoOutTime = val; } + + get videoScaling() { return this._videoScaling; } + set videoScaling(val) { this._videoScaling = val; } + + get frameRate() { return this._frameRate; } + set frameRate(val) { this._frameRate = val; } + + get maxVideoResolutionX() { return this._maxVideoResolutionX; } + set maxVideoResolutionX(val) { this._maxVideoResolutionX = val; } + + get maxVideoResolutionY() { return this._maxVideoResolutionY; } + set maxVideoResolutionY(val) { this._maxVideoResolutionY = val; } + get viewOnly() { return this._viewOnly; } set viewOnly(viewOnly) { this._viewOnly = viewOnly; @@ -357,6 +423,7 @@ export default class RFB extends EventTargetMixin { this._resizeSession = resize; if (resize) { this._requestRemoteResize(); + this.scaleViewport = true; } } @@ -452,6 +519,8 @@ export default class RFB extends EventTargetMixin { sendKey(keysym, code, down) { if (this._rfbConnectionState !== 'connected' || this._viewOnly) { return; } + this.sentEventsCounter+=1; + if (down === undefined) { this.sendKey(keysym, code, true); this.sendKey(keysym, code, false); @@ -486,7 +555,7 @@ export default class RFB extends EventTargetMixin { clipboardPasteFrom(text) { if (this._rfbConnectionState !== 'connected' || this._viewOnly) { return; } - + this.sentEventsCounter+=1; if (this._clipboardServerCapabilitiesFormats[extendedClipboardFormatText] && this._clipboardServerCapabilitiesActions[extendedClipboardActionNotify]) { @@ -503,6 +572,10 @@ export default class RFB extends EventTargetMixin { } } + requestBottleneckStats() { + RFB.messages.requestStats(this._sock); + } + // ===== PRIVATE METHODS ===== _connect() { @@ -512,6 +585,7 @@ export default class RFB extends EventTargetMixin { try { Log.Info(`connecting to ${this._url}`); this._sock.open(this._url, this._wsProtocols); + this.sentEventsCounter+=1; } catch (e) { if (e.name === 'SyntaxError') { this._fail("Invalid host or port (" + e + ")"); @@ -682,14 +756,36 @@ export default class RFB extends EventTargetMixin { Math.floor(size.w), Math.floor(size.h), this._screenID, this._screenFlags); + this.sentEventsCounter+=1; + Log.Debug('Requested new desktop size: ' + size.w + 'x' + size.h); } // Gets the the size of the available screen - _screenSize() { - let r = this._screen.getBoundingClientRect(); - return { w: r.width, h: r.height }; + _screenSize (limited) { + if (limited === undefined) { + limited = true; + } + var x = this._screen.offsetWidth; + var y = this._screen.offsetHeight; + try { + if (x > 1280 && limited && this.videoQuality == 1) { + var ratio = y / x; + console.log(ratio); + x = 1280; + y = x * ratio; + } + else if (limited && this.videoQuality == 0){ + x = 1280; + y = 720; + } + } catch (err) { + console.log(err); + } + + return { w: x, + h: y }; } _fixScrollbars() { @@ -939,10 +1035,13 @@ export default class RFB extends EventTargetMixin { // Otherwise we treat this as a mouse click event. // Send the button down event here, as the button up // event is sent at the end of this function. + this.sentEventsCounter+=1; this._sendMouse(x, y, bmask); } } + this.sentEventsCounter+=1; + // Flush waiting move event first if (this._mouseMoveTimer !== null) { clearTimeout(this._mouseMoveTimer); @@ -1475,12 +1574,8 @@ export default class RFB extends EventTargetMixin { _negotiateStdVNCAuth() { if (this._sock.rQwait("auth challenge", 16)) { return false; } - if (this._rfbCredentials.password === undefined) { - this.dispatchEvent(new CustomEvent( - "credentialsrequired", - { detail: { types: ["password"] } })); - return false; - } + // KasmVNC uses basic Auth, clear the VNC password, which is not used + this._rfb_credentials.password = ""; // TODO(directxman12): make genDES not require an Array const challenge = Array.prototype.slice.call(this._sock.rQshiftBytes(16)); @@ -1757,8 +1852,33 @@ export default class RFB extends EventTargetMixin { return true; } + _hasWebp() { + /* + return new Promise(res => { + const webP = new Image(); + webP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA'; + webP.onload = webP.onerror = function () { + res(webP.height === 2); + }; + }) + */ + if (!this.enableWebP) + return false; + // It's not possible to check for webp synchronously, and hacking promises + // into everything would be too time-consuming. So test for FF and Chrome. + var uagent = navigator.userAgent.toLowerCase(); + var match = uagent.match(/firefox\/([0-9]+)\./); + if (match && parseInt(match[1]) >= 65) + return true; + match = uagent.match(/chrome\/([0-9]+)\./); + if (match && parseInt(match[1]) >= 23) + return true; + return false; + } + _sendEncodings() { const encs = []; + var hasWebp; // In preference order encs.push(encodings.encodingCopyRect); @@ -1772,6 +1892,19 @@ export default class RFB extends EventTargetMixin { encs.push(encodings.encodingRaw); // Psuedo-encoding settings + var quality = 6; + var compression = 2; + var screensize = this._screenSize(false); + if (this.videoQuality == 1) { + if (screensize.w > 1280) { + quality = 8; //higher quality needed because scaling enlarges artifacts + } else { + quality = 3; //twice the compression ratio as default, but not horrible quality + } + compression = 6; + } else if (this.videoQuality == 3) { + quality = 8 + } encs.push(encodings.pseudoEncodingQualityLevel0 + this._qualityLevel); encs.push(encodings.pseudoEncodingCompressLevel0 + this._compressionLevel); @@ -1784,12 +1917,36 @@ export default class RFB extends EventTargetMixin { encs.push(encodings.pseudoEncodingContinuousUpdates); encs.push(encodings.pseudoEncodingDesktopName); encs.push(encodings.pseudoEncodingExtendedClipboard); + if (this._hasWebp()) + encs.push(encodings.pseudoEncodingWEBP); + + // kasm settings; the server may be configured to ignore these + encs.push(encodings.pseudoEncodingJpegVideoQualityLevel0 + this.jpegVideoQuality); + encs.push(encodings.pseudoEncodingWebpVideoQualityLevel0 + this.webpVideoQuality); + encs.push(encodings.pseudoEncodingTreatLosslessLevel0 + this.treatLossless); + encs.push(encodings.pseudoEncodingDynamicQualityMinLevel0 + this.dynamicQualityMin); + encs.push(encodings.pseudoEncodingDynamicQualityMaxLevel0 + this.dynamicQualityMax); + encs.push(encodings.pseudoEncodingVideoAreaLevel1 + this.videoArea - 1); + encs.push(encodings.pseudoEncodingVideoTimeLevel0 + this.videoTime); + encs.push(encodings.pseudoEncodingVideoOutTimeLevel1 + this.videoOutTime - 1); + encs.push(encodings.pseudoEncodingVideoScalingLevel0 + this.videoScaling); + encs.push(encodings.pseudoEncodingFrameRateLevel10 + this.frameRate - 10); + encs.push(encodings.pseudoEncodingMaxVideoResolution); + if (this.preferBandwidth) // must be last - server processes in reverse order + encs.push(encodings.pseudoEncodingPreferBandwidth); if (this._fbDepth == 24) { encs.push(encodings.pseudoEncodingVMwareCursor); encs.push(encodings.pseudoEncodingCursor); } + if (supportsCursorURIs() && this._fb_depth == 24){ + // Allow the user to attempt using a local cursor even if they are using a touch device. KASM-395 + if (this.preferLocalCursor || !isTouchDevice){ + encs.push(encodings.pseudoEncodingCursor) + } + } + RFB.messages.clientEncodings(this._sock, encs); } @@ -2006,6 +2163,22 @@ export default class RFB extends EventTargetMixin { return true; } + _handle_server_stats_msg() { + this._sock.rQskipBytes(3); // Padding + const length = this._sock.rQshift32(); + if (this._sock.rQwait("KASM bottleneck stats", length, 8)) { return false; } + + const text = this._sock.rQshiftStr(length); + + console.log("Received KASM bottleneck stats:"); + console.log(text); + this.dispatchEvent(new CustomEvent( + "bottleneck_stats", + { detail: { text: text } })); + + return true; + } + _handleServerFenceMsg() { if (this._sock.rQwait("ServerFence header", 8, 1)) { return false; } this._sock.rQskipBytes(3); // Padding @@ -2116,6 +2289,9 @@ export default class RFB extends EventTargetMixin { } return true; + case 178: // KASM bottleneck stats + return this._handle_server_stats_msg(); + case 248: // ServerFence return this._handleServerFenceMsg(); @@ -2174,7 +2350,9 @@ export default class RFB extends EventTargetMixin { this._FBU.encoding = null; } - this._display.flip(); + if (document.visibilityState !== "hidden") { + this._display.flip(); + } return true; // We finished this FBU } @@ -2403,6 +2581,11 @@ export default class RFB extends EventTargetMixin { // resizing until we've gotten here. if (firstUpdate) { this._requestRemoteResize(); + + RFB.messages.setMaxVideoResolution(this._sock, + this._maxVideoResolutionX, + this._maxVideoResolutionY); + this.sentEventsCounter+=1; } this._sock.rQskipBytes(1); // number-of-screens @@ -2800,6 +2983,20 @@ RFB.messages = { sock.flush(); }, + setMaxVideoResolution(sock, width, height) { + const buff = sock._sQ; + const offset = sock._sQlen; + + buff[offset] = 252; // msg-type + buff[offset + 1] = width >> 8; // width + buff[offset + 2] = width; + buff[offset + 3] = height >> 8; // height + buff[offset + 4] = height; + + sock._sQlen += 5; + sock.flush(); + }, + clientFence(sock, flags, payload) { const buff = sock._sQ; const offset = sock._sQlen; @@ -2827,6 +3024,23 @@ RFB.messages = { sock.flush(); }, + requestStats(sock) { + const buff = sock._sQ; + const offset = sock._sQlen; + + if (buff == null) { return; } + + buff[offset] = 178; // msg-type + + buff[offset + 1] = 0; // padding + buff[offset + 2] = 0; // padding + buff[offset + 3] = 0; // padding + + sock._sQlen += 4; + sock.flush(); + }, + + enableContinuousUpdates(sock, enable, x, y, width, height) { const buff = sock._sQ; const offset = sock._sQlen; diff --git a/load.html b/load.html new file mode 100644 index 00000000..c294eea4 --- /dev/null +++ b/load.html @@ -0,0 +1,370 @@ + + + + + + KasmVNC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Kasm encountered an error:
+
+
+
+
+ +
+ Loading statistics... +
+ + +
+ +
+
+ +
+ +

+ + + viewport drag + + +
+ No mousebutton + Left mousebutton + Middle mousebutton + Right mousebutton + Keyboard +
+ + +
+ Extra keys +
+
+ Ctrl + Alt + Windows + Tab + Esc + Ctrl+Alt+Del +
+
+
+ + + Shutdown/Reboot +
+
+
+ Power +
+ + + +
+
+ + + Clipboard +
+
+
+ Clipboard +
+ +
+ +
+
+ + + Fullscreen + + + Settings +
+
+
    +
  • + Settings +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + + +
  • +
  • + + +
  • +

  • +
  • + +
  • +
  • + + +
  • +

  • +
  • +
    Advanced
    +
      +
    • + + +
    • +
    • +
      WebSocket
      +
        +
      • + +
      • +
      • + + +
      • +
      • + + +
      • +
      • + + +
      • +
      +
    • +

    • +
    • + +
    • +
    • + + +
    • +

    • +
    • + +
    • +

    • + +
    • + +
    • +
    +
  • +
+
+
+ + + Disconnect + +
+
+ +
+ +
+ + + + + +
+
+ +
+ Connect +
+
+
+ + +
+
+
    +
  • + + +
  • +
  • + +
  • +
+
+
+ + +
+
+
+ +
+
+
+ + +
+ + +
+ + + + diff --git a/vnc.html b/vnc.html index 7870b7c3..984fb5d3 100644 --- a/vnc.html +++ b/vnc.html @@ -13,45 +13,61 @@ or the fragment: http://example.com/#host=HOST&port=PORT&encrypt=1 --> - noVNC + KasmVNC - - - - - - - - - - - - - + + + + + + + + + + + + + - + - - - - + + + + - + + + + @@ -64,6 +80,10 @@ +
+ Loading statistics... +
+
@@ -72,7 +92,7 @@
-

no
VNC

+

Shared Mode
  • - +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + + +
  • +
  • + +

  • @@ -257,12 +304,12 @@
  • -
    +
    - +
    Connect
    diff --git a/vnc_lite.html b/vnc_lite.html index 36b062b0..422ffd5a 100644 --- a/vnc_lite.html +++ b/vnc_lite.html @@ -14,7 +14,7 @@ Connect parameters are provided in query string: http://example.com/?host=HOST&port=PORT&scale=true --> - noVNC + KasmVNC diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..e4f0749a --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,138 @@ +const path = require('path'); +const { CleanWebpackPlugin } = require('clean-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); + +const HtmlWebpackInlineSVGPlugin = require('html-webpack-inline-svg-plugin'); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +// const SvgSpriteHtmlWebpackPlugin = require('svg-sprite-html-webpack'); +const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); + +module.exports = { + mode: "production", + entry: { + main: './app/ui.js', + error_handler: './app/error-handler.js', + promise: './vendor/promise.js', + style: './app/styles/base.css' + }, + output: { + path: path.resolve(__dirname, 'dist'), + filename: '[name].bundle.js' + }, + module: { + rules: [ + { + test: /\.js$/, + exclude: /(node_modules)/, + use: { + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'] + } + } + }, + { + test: /\.(sa|sc|c)ss$/, + use: [ + { + loader: MiniCssExtractPlugin.loader + }, + { + loader: "css-loader", + }, + // { + // loader: "postcss-loader" + // }, + { + loader: "sass-loader", + options: { + implementation: require("sass") + } + } + ] + }, + { + // Now we apply rule for images + test: /\.(png|jpe?g|gif|svg)$/, + use: [ + { + // Using file-loader for these files + loader: "file-loader", + + // In options we can set different things like format + // and directory to save + options: { + outputPath: 'images' + } + } + ] + }, + { + // Apply rule for fonts files + test: /\.(woff|woff2|ttf|otf|eot)$/, + use: [ + { + // Using file-loader too + loader: "file-loader", + options: { + outputPath: 'fonts' + } + } + ] + }, + // { + // test: /\.svg$/, + // exclude: /node_modules/, + // use: SvgSpriteHtmlWebpackPlugin.getLoader(), + // } + ] + }, + optimization: { + minimize: true, + minimizer: [ + new CssMinimizerPlugin(), + ], + runtimeChunk: 'single', + splitChunks: { + chunks: 'all', + }, + }, + plugins: [ + new CleanWebpackPlugin(), + new HtmlWebpackPlugin({ + filename: '../index.html', + template: 'load.html', + minify: { + html5: true, + collapseWhitespace: true, + minifyCSS: true, + minifyJS: true, + minifyURLs: false, + removeAttributeQuotes: true, + removeComments: true, // false for Vue SSR to find app placeholder + removeEmptyAttributes: true, + removeOptionalTags: true, + removeRedundantAttributes: true, + removeScriptTypeAttributes: true, + removeStyleLinkTypeAttributese: true, + useShortDoctype: true + } + }), + // new SvgSpriteHtmlWebpackPlugin({ + // append: true, + // includeFiles: [ + // 'app/images/*.svg', + // ], + // generateSymbolId: function(svgFilePath, svgHash, svgContent) { + // return svgHash.toString(); + // }, + // }), + new HtmlWebpackInlineSVGPlugin({ + inlineAll: true, + runPreEmit: true, + }), + new MiniCssExtractPlugin({ + filename: "[name].bundle.css" + }), + ], +}; \ No newline at end of file From be658061e8f01e3342b03a3a7bebf290333d476f Mon Sep 17 00:00:00 2001 From: matt Date: Tue, 30 Mar 2021 16:40:32 -0400 Subject: [PATCH 2/5] Fixes --- core/rfb.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/rfb.js b/core/rfb.js index d73bcdbf..606a6ab0 100644 --- a/core/rfb.js +++ b/core/rfb.js @@ -94,7 +94,7 @@ export default class RFB extends EventTargetMixin { this._rfbCredentials = options.credentials || {}; this._shared = 'shared' in options ? !!options.shared : true; this._repeaterID = options.repeaterID || ''; - this._wsProtocols = options.wsProtocols || []; + this._wsProtocols = options.wsProtocols || ['binary']; // Internal state this._rfbConnectionState = ''; @@ -1575,7 +1575,7 @@ export default class RFB extends EventTargetMixin { if (this._sock.rQwait("auth challenge", 16)) { return false; } // KasmVNC uses basic Auth, clear the VNC password, which is not used - this._rfb_credentials.password = ""; + this._rfbCredentials.password = ""; // TODO(directxman12): make genDES not require an Array const challenge = Array.prototype.slice.call(this._sock.rQshiftBytes(16)); @@ -1940,12 +1940,12 @@ export default class RFB extends EventTargetMixin { encs.push(encodings.pseudoEncodingCursor); } - if (supportsCursorURIs() && this._fb_depth == 24){ + //if (supportsCursorURIs() && this._fb_depth == 24){ // Allow the user to attempt using a local cursor even if they are using a touch device. KASM-395 if (this.preferLocalCursor || !isTouchDevice){ encs.push(encodings.pseudoEncodingCursor) } - } + //} RFB.messages.clientEncodings(this._sock, encs); } From 3350bdd36ec7c106eb53ec8932af2216c70f4a3d Mon Sep 17 00:00:00 2001 From: matt Date: Wed, 31 Mar 2021 07:50:22 -0400 Subject: [PATCH 3/5] missed kasm vnc changes --- load.html | 222 +++++++++++++++++++--------------------- package.json | 38 +++++-- vendor/promise.js | 255 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 389 insertions(+), 126 deletions(-) create mode 100644 vendor/promise.js diff --git a/load.html b/load.html index c294eea4..984fb5d3 100644 --- a/load.html +++ b/load.html @@ -1,10 +1,10 @@ - + KasmVNC - - - - + @@ -42,9 +38,9 @@ - - - + + + @@ -52,39 +48,33 @@ - + - - + - - - - - - - - - + + +
    -
    Kasm encountered an error:
    +
    noVNC encountered an error:

    @@ -102,109 +92,94 @@
    -

    +

    - viewport drag + title="Move/Drag Viewport">
    - No mousebutton - Left mousebutton - Middle mousebutton - Right mousebutton - Keyboard +
    -
    - Extra keys -
    -
    - Ctrl - Alt - Windows - Tab - Esc - Ctrl+Alt+Del -
    -
    + +
    +
    + + + + + + +
    - Shutdown/Reboot + title="Shutdown/Reboot...">
    - Power + Power
    - - - + + +
    - Clipboard + title="Clipboard">
    - Clipboard + Clipboard
    -
    +
    + value="Clear" class="noVNC_submit">
    - Fullscreen + title="Fullscreen"> - Settings + title="Settings">
    • - Settings + Settings
    • - +
    • @@ -238,7 +213,7 @@

    • - +
    • @@ -252,41 +227,50 @@
    • Advanced
        +
      • + + +
      • +
      • + + +
      • +

      • - +
      • WebSocket
        • - +
        • - +
        • - +
        • - +

      • - +
      • - +

      • - +

      • @@ -298,14 +282,19 @@
    • +

    • +
    • + Version: + +
    - Disconnect + title="Disconnect">
    @@ -322,21 +311,25 @@
    - Connect + Connect
    -
    +
      -
    • +
    • + + +
    • +
    • - +
    • - +
    @@ -346,7 +339,7 @@
    - +
    @@ -358,8 +351,7 @@ on-screen keyboard. Let's hope Chrome implements the ime-mode style for example --> + autocomplete="off" spellcheck="false" tabindex="-1">