首页 > 代码库 > 用C写一个web服务器(二) I/O多路复用之epoll

用C写一个web服务器(二) I/O多路复用之epoll

<style>.container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .container::before,.container::after { content: " "; display: table } .container::after { clear: both } .container::before,.container::after { content: " "; display: table } .container::after { clear: both } .row { margin-left: -15px; margin-right: -15px } .row::before,.row::after { content: " "; display: table } .row::after { clear: both } .row::before,.row::after { content: " "; display: table } .row::after { clear: both } .col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12 { position: relative; min-height: 1px; padding-left: 15px; padding-right: 15px } .col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12 { 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: 0 } .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: 0 } .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 } table { max-width: 100%; background-color: transparent } th { text-align: left } .table { width: 100%; margin-bottom: 21px } .table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td { padding: 8px; line-height: 1.45; 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>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td { border-top: 0 } .table>tbody+tbody { border-top: 2px solid #ddd } .table .table { background-color: none } .table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td { padding: 5px } .table-bordered { border: 1px solid #ddd } .table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td { border: 1px solid #ddd } .table-bordered>thead>tr>th,.table-bordered>thead>tr>td { border-bottom-width: 2px } .table-striped>tbody>tr:nth-child(2n+1)>td,.table-striped>tbody>tr:nth-child(2n+1)>th { background-color: #f9f9f9 } .table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th { background-color: #f5f5f5 } table col[class*="col-"] { position: static; float: none; display: table-column } table td[class*="col-"],table th[class*="col-"] { float: none; display: table-cell } .table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th { background-color: #f5f5f5 } .table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th { background-color: #e8e8e8 } .table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th { background-color: #dff0d8 } .table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th { background-color: #d0e9c6 } .table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th { background-color: rgba(232,76,61,0.1) } .table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th { background-color: rgba(229,55,38,0.1) } .table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th { background-color: rgba(255,209,0,0.12) } .table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th { background-color: rgba(230,188,0,0.12) } fieldset { padding: 0; margin: 0; border: 0 } legend { display: block; width: 100%; padding: 0; margin-bottom: 21px; font-size: 22.5px; line-height: inherit; color: #333; border: 0; border-bottom: 1px solid #e5e5e5 } label { display: inline-block; margin-bottom: 5px; font-weight: bold } input[type="search"] { } input[type="radio"],input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px ; line-height: normal } input[type="file"] { display: block } select[multiple],select[size] { height: auto } select optgroup { font-size: inherit; font-style: inherit; font-family: inherit } input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus { outline: 5px auto -webkit-focus-ring-color } input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button { height: auto } output { display: block; padding-top: 7px; font-size: 15px; line-height: 1.45; color: #2c3f51; vertical-align: middle } .form-control { display: block; width: 100%; height: 42px; padding: 6px 12px; font-size: 15px; line-height: 1.45; color: #2c3f51; vertical-align: middle; background-color: #fff; background-image: none; border: 1px solid #dee6ed } .form-control:focus { border-color: #66afe9; outline: 0 } .form-control:focus { border-color: #dee6ed; outline: 0 } .form-control:focus { border-color: rgba(25,128,230,0.5); outline: 0 } .form-control:-moz-placeholder { color: #d5dfe9 } .form-control::-moz-placeholder { color: #d5dfe9; opacity: 1 } .form-control:-ms-input-placeholder { color: #d5dfe9 } .form-control::-webkit-input-placeholder { color: #d5dfe9 } .form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control { cursor: not-allowed; background-color: none } textarea.form-control { height: auto } .form-group { margin-bottom: 15px } .radio,.checkbox { display: block; min-height: 21px; margin-top: 10px; margin-bottom: 10px; padding-left: 20px; vertical-align: middle } .radio label,.checkbox label { display: inline; margin-bottom: 0; font-weight: normal; cursor: pointer } .radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"] { float: left; margin-left: -20px } .radio+.radio,.checkbox+.checkbox { margin-top: -5px } .radio-inline,.checkbox-inline { display: inline-block; padding-left: 20px; margin-bottom: 0; vertical-align: middle; font-weight: normal; cursor: pointer } .radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline { margin-top: 0; margin-left: 10px } input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline { cursor: not-allowed } .input-sm { height: 31px; padding: 5px 10px; font-size: 13px; line-height: 1.5 } select.input-sm { height: 31px; line-height: 31px } textarea.input-sm { height: auto } .input-lg { height: 48px; padding: 10px 16px; font-size: 19px; line-height: 1.33 } select.input-lg { height: 48px; line-height: 48px } textarea.input-lg { height: auto } .has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline { color: #b89600 } .has-warning .form-control { border-color: #b89600 } .has-warning .form-control:focus { border-color: #856d00 } .has-warning .input-group-addon { color: #b89600; border-color: #b89600; background-color: rgba(255,209,0,0.12) } .has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline { color: #d82a1a } .has-error .form-control { border-color: #d82a1a } .has-error .form-control:focus { border-color: #ab2114 } .has-error .input-group-addon { color: #d82a1a; border-color: #d82a1a; background-color: rgba(232,76,61,0.1) } .has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline { color: #3c763d } .has-success .form-control { border-color: #3c763d } .has-success .form-control:focus { border-color: #2b542c } .has-success .input-group-addon { color: #3c763d; border-color: #3c763d; background-color: #dff0d8 } .form-control-static { margin-bottom: 0 } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #587ea4 } .form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline { margin-top: 0; margin-bottom: 0; padding-top: 7px } .form-horizontal .radio,.form-horizontal .checkbox { min-height: 28px } .form-horizontal .form-group { margin-left: -15px; margin-right: -15px } .form-horizontal .form-group::before,.form-horizontal .form-group::after { content: " "; display: table } .form-horizontal .form-group::after { clear: both } .form-horizontal .form-group::before,.form-horizontal .form-group::after { content: " "; display: table } .form-horizontal .form-group::after { clear: both } .form-horizontal .form-control-static { padding-top: 7px } .btn { display: inline-block; margin-bottom: 0; font-weight: normal; text-align: center; vertical-align: middle; cursor: pointer; background-image: none; border: 1px solid transparent; white-space: nowrap; padding: 6px 12px; font-size: 15px; line-height: 1.45 } .btn:focus { outline: 5px auto -webkit-focus-ring-color } .btn:hover,.btn:focus { color: #425e7b; text-decoration: none } .btn:active,.btn.active { outline: 0; background-image: none } .btn.disabled,.btn[disabled],fieldset[disabled] .btn { cursor: not-allowed; opacity: .65 } .btn-default { color: #425e7b; background-color: rgba(0,0,0,0); border-color: rgba(0,0,0,0) } .btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default { color: #425e7b; background-color: rgba(0,0,0,0); border-color: rgba(0,0,0,0) } .btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default { background-image: none } .btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active { background-color: rgba(0,0,0,0); border-color: rgba(0,0,0,0) } .btn-default .badge { color: rgba(0,0,0,0); background-color: #fff } .btn-primary { color: #425e7b; background-color: #e4ebf1; border-color: rgba(0,128,255,0.05) } .btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary { color: #425e7b; background-color: #cad6e2; border-color: rgba(0,97,194,0.05) } .btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary { background-image: none } .btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active { background-color: #e4ebf1; border-color: rgba(0,128,255,0.05) } .btn-primary .badge { color: #e4ebf1; background-color: #fff } .btn-warning { color: #fff; background-color: #f0ad4e; border-color: #eea236 } .btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning { color: #fff; background-color: #ed9c28; border-color: #d58512 } .btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning { background-image: none } .btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active { 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:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger { color: #fff; background-color: #d2322d; border-color: #ac2925 } .btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger { background-image: none } .btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active { background-color: #d9534f; border-color: #d43f3a } .btn-danger .badge { color: #d9534f; background-color: #fff } .btn-success { color: #364d63; background-color: rgba(0,0,0,0); border-color: rgba(0,0,0,0) } .btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success { color: #364d63; background-color: rgba(0,0,0,0); border-color: rgba(0,0,0,0) } .btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success { background-image: none } .btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active { background-color: rgba(0,0,0,0); border-color: rgba(0,0,0,0) } .btn-success .badge { color: rgba(0,0,0,0); background-color: #fff } .btn-info { color: rgba(102,128,153,0.35); background-color: rgba(0,0,0,0); border-color: rgba(0,0,0,0) } .btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info { color: rgba(102,128,153,0.35); background-color: rgba(0,0,0,0); border-color: rgba(0,0,0,0) } .btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info { background-image: none } .btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active { background-color: rgba(0,0,0,0); border-color: rgba(0,0,0,0) } .btn-info .badge { color: rgba(0,0,0,0); background-color: #fff } .btn-link { color: #1980e6; font-weight: normal; cursor: pointer } .btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link { background-color: transparent } .btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active { border-color: transparent } .btn-link:hover,.btn-link:focus { color: #0f4d8a; text-decoration: underline; background-color: transparent } .btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus { color: #999; text-decoration: none } .btn-lg { padding: 10px 16px; font-size: 19px; line-height: 1.33 } .btn-sm { padding: 5px 10px; font-size: 13px; line-height: 1.5 } .btn-xs { padding: 1px 5px; font-size: 13px; line-height: 1.5 } .btn-block { display: block; width: 100%; padding-left: 0; padding-right: 0 } .btn-block+.btn-block { margin-top: 5px } input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block { width: 100% } .fade { opacity: 0 } .fade.in { opacity: 1 } .collapse { display: none } .collapse.in { display: block } .collapsing { position: relative; height: 0; overflow: hidden } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: "Glyphicons Halflings"; font-style: normal; font-weight: normal; line-height: 1 } .glyphicon:empty { width: 1em } .glyphicon-asterisk::before { content: "*" } .glyphicon-plus::before { content: "+" } .glyphicon-euro::before { content: "€" } .glyphicon-minus::before { content: "?" } .glyphicon-cloud::before { content: "?" } .glyphicon-envelope::before { content: "?" } .glyphicon-pencil::before { content: "?" } .glyphicon-glass::before { content: "" } .glyphicon-music::before { content: "" } .glyphicon-search::before { content: "" } .glyphicon-heart::before { content: "" } .glyphicon-star::before { content: "" } .glyphicon-star-empty::before { content: "" } .glyphicon-user::before { content: "" } .glyphicon-film::before { content: "" } .glyphicon-th-large::before { content: "" } .glyphicon-th::before { content: "" } .glyphicon-th-list::before { content: "" } .glyphicon-ok::before { content: "" } .glyphicon-remove::before { content: "" } .glyphicon-zoom-in::before { content: "" } .glyphicon-zoom-out::before { content: "" } .glyphicon-off::before { content: "" } .glyphicon-signal::before { content: "" } .glyphicon-cog::before { content: "" } .glyphicon-trash::before { content: "" } .glyphicon-home::before { content: "" } .glyphicon-file::before { content: "" } .glyphicon-time::before { content: "" } .glyphicon-road::before { content: "" } .glyphicon-download-alt::before { content: "" } .glyphicon-download::before { content: "" } .glyphicon-upload::before { content: "" } .glyphicon-inbox::before { content: "" } .glyphicon-play-circle::before { content: "" } .glyphicon-repeat::before { content: "" } .glyphicon-refresh::before { content: "" } .glyphicon-list-alt::before { content: "" } .glyphicon-lock::before { content: "" } .glyphicon-flag::before { content: "" } .glyphicon-headphones::before { content: "" } .glyphicon-volume-off::before { content: "" } .glyphicon-volume-down::before { content: "" } .glyphicon-volume-up::before { content: "" } .glyphicon-qrcode::before { content: "" } .glyphicon-barcode::before { content: "" } .glyphicon-tag::before { content: "" } .glyphicon-tags::before { content: "" } .glyphicon-book::before { content: "" } .glyphicon-bookmark::before { content: "" } .glyphicon-print::before { content: "" } .glyphicon-camera::before { content: "" } .glyphicon-font::before { content: "" } .glyphicon-bold::before { content: "" } .glyphicon-italic::before { content: "" } .glyphicon-text-height::before { content: "" } .glyphicon-text-width::before { content: "" } .glyphicon-align-left::before { content: "" } .glyphicon-align-center::before { content: "" } .glyphicon-align-right::before { content: "" } .glyphicon-align-justify::before { content: "" } .glyphicon-list::before { content: "" } .glyphicon-indent-left::before { content: "" } .glyphicon-indent-right::before { content: "" } .glyphicon-facetime-video::before { content: "" } .glyphicon-picture::before { content: "" } .glyphicon-map-marker::before { content: "" } .glyphicon-adjust::before { content: "" } .glyphicon-tint::before { content: "" } .glyphicon-edit::before { content: "" } .glyphicon-share::before { content: "" } .glyphicon-check::before { content: "" } .glyphicon-move::before { content: "" } .glyphicon-step-backward::before { content: "" } .glyphicon-fast-backward::before { content: "" } .glyphicon-backward::before { content: "" } .glyphicon-play::before { content: "" } .glyphicon-pause::before { content: "" } .glyphicon-stop::before { content: "" } .glyphicon-forward::before { content: "" } .glyphicon-fast-forward::before { content: "" } .glyphicon-step-forward::before { content: "" } .glyphicon-eject::before { content: "" } .glyphicon-chevron-left::before { content: "" } .glyphicon-chevron-right::before { content: "" } .glyphicon-plus-sign::before { content: "" } .glyphicon-minus-sign::before { content: "" } .glyphicon-remove-sign::before { content: "" } .glyphicon-ok-sign::before { content: "" } .glyphicon-question-sign::before { content: "" } .glyphicon-info-sign::before { content: "" } .glyphicon-screenshot::before { content: "" } .glyphicon-remove-circle::before { content: "" } .glyphicon-ok-circle::before { content: "" } .glyphicon-ban-circle::before { content: "" } .glyphicon-arrow-left::before { content: "" } .glyphicon-arrow-right::before { content: "" } .glyphicon-arrow-up::before { content: "" } .glyphicon-arrow-down::before { content: "" } .glyphicon-share-alt::before { content: "" } .glyphicon-resize-full::before { content: "" } .glyphicon-resize-small::before { content: "" } .glyphicon-exclamation-sign::before { content: "" } .glyphicon-gift::before { content: "" } .glyphicon-leaf::before { content: "" } .glyphicon-fire::before { content: "" } .glyphicon-eye-open::before { content: "" } .glyphicon-eye-close::before { content: "" } .glyphicon-warning-sign::before { content: "" } .glyphicon-plane::before { content: "" } .glyphicon-calendar::before { content: "" } .glyphicon-random::before { content: "" } .glyphicon-comment::before { content: "" } .glyphicon-magnet::before { content: "" } .glyphicon-chevron-up::before { content: "" } .glyphicon-chevron-down::before { content: "" } .glyphicon-retweet::before { content: "" } .glyphicon-shopping-cart::before { content: "" } .glyphicon-folder-close::before { content: "" } .glyphicon-folder-open::before { content: "" } .glyphicon-resize-vertical::before { content: "" } .glyphicon-resize-horizontal::before { content: "" } .glyphicon-hdd::before { content: "" } .glyphicon-bullhorn::before { content: "" } .glyphicon-bell::before { content: "" } .glyphicon-certificate::before { content: "" } .glyphicon-thumbs-up::before { content: "" } .glyphicon-thumbs-down::before { content: "" } .glyphicon-hand-right::before { content: "" } .glyphicon-hand-left::before { content: "" } .glyphicon-hand-up::before { content: "" } .glyphicon-hand-down::before { content: "" } .glyphicon-circle-arrow-right::before { content: "" } .glyphicon-circle-arrow-left::before { content: "" } .glyphicon-circle-arrow-up::before { content: "" } .glyphicon-circle-arrow-down::before { content: "" } .glyphicon-globe::before { content: "" } .glyphicon-wrench::before { content: "" } .glyphicon-tasks::before { content: "" } .glyphicon-filter::before { content: "" } .glyphicon-briefcase::before { content: "" } .glyphicon-fullscreen::before { content: "" } .glyphicon-dashboard::before { content: "" } .glyphicon-paperclip::before { content: "" } .glyphicon-heart-empty::before { content: "" } .glyphicon-link::before { content: "" } .glyphicon-phone::before { content: "" } .glyphicon-pushpin::before { content: "" } .glyphicon-usd::before { content: "" } .glyphicon-gbp::before { content: "" } .glyphicon-sort::before { content: "" } .glyphicon-sort-by-alphabet::before { content: "" } .glyphicon-sort-by-alphabet-alt::before { content: "" } .glyphicon-sort-by-order::before { content: "" } .glyphicon-sort-by-order-alt::before { content: "" } .glyphicon-sort-by-attributes::before { content: "" } .glyphicon-sort-by-attributes-alt::before { content: "" } .glyphicon-unchecked::before { content: "" } .glyphicon-expand::before { content: "" } .glyphicon-collapse-down::before { content: "" } .glyphicon-collapse-up::before { content: "" } .glyphicon-log-in::before { content: "" } .glyphicon-flash::before { content: "" } .glyphicon-log-out::before { content: "" } .glyphicon-new-window::before { content: "" } .glyphicon-record::before { content: "" } .glyphicon-save::before { content: "" } .glyphicon-open::before { content: "" } .glyphicon-saved::before { content: "" } .glyphicon-import::before { content: "" } .glyphicon-export::before { content: "" } .glyphicon-send::before { content: "" } .glyphicon-floppy-disk::before { content: "" } .glyphicon-floppy-saved::before { content: "" } .glyphicon-floppy-remove::before { content: "" } .glyphicon-floppy-save::before { content: "" } .glyphicon-floppy-open::before { content: "" } .glyphicon-credit-card::before { content: "" } .glyphicon-transfer::before { content: "" } .glyphicon-cutlery::before { content: "" } .glyphicon-header::before { content: "" } .glyphicon-compressed::before { content: "" } .glyphicon-earphone::before { content: "" } .glyphicon-phone-alt::before { content: "" } .glyphicon-tower::before { content: "" } .glyphicon-stats::before { content: "" } .glyphicon-sd-video::before { content: "" } .glyphicon-hd-video::before { content: "" } .glyphicon-subtitles::before { content: "" } .glyphicon-sound-stereo::before { content: "" } .glyphicon-sound-dolby::before { content: "" } .glyphicon-sound-5-1::before { content: "" } .glyphicon-sound-6-1::before { content: "" } .glyphicon-sound-7-1::before { content: "" } .glyphicon-copyright-mark::before { content: "" } .glyphicon-registration-mark::before { content: "" } .glyphicon-cloud-download::before { content: "" } .glyphicon-cloud-upload::before { content: "" } .glyphicon-tree-conifer::before { content: "" } .glyphicon-tree-deciduous::before { content: "" } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px solid; border-right: 4px solid transparent; border-left: 4px solid transparent } .dropdown { 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; list-style: none; font-size: 15px; background-color: #fff; border: 1px solid #dee6ed } .dropdown-menu.pull-right { right: 0; left: auto } .dropdown-menu .divider { height: 1px; margin: 9.5px 0; overflow: hidden; background-color: #dee6ed } .dropdown-menu>li>a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.45; color: #2c3f51; white-space: nowrap } .dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus { text-decoration: none; color: #2d4053; background-color: rgba(102,128,153,0.04) } .dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus { color: #fff; text-decoration: none; outline: 0; background-color: #428bca } .dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus { color: #d5dfe9 } .dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus { text-decoration: none; background-color: transparent; background-image: none; cursor: not-allowed } .open>.dropdown-menu { display: block } .open>a { outline: 0 } .dropdown-header { display: block; padding: 3px 20px; font-size: 13px; line-height: 1.45; color: rgba(129,158,187,0.6) } .dropdown-backdrop { position: fixed; left: 0; right: 0; bottom: 0; top: 0; z-index: 990 } .pull-right>.dropdown-menu { right: 0; left: auto } .dropup .caret,.navbar-fixed-bottom .dropdown .caret { border-top: 0; border-bottom: 4px solid; content: "" } .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px } .btn-group,.btn-group-vertical { position: relative; display: inline-block; vertical-align: middle } .btn-group>.btn,.btn-group-vertical>.btn { position: relative; float: left } .btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active { z-index: 2 } .btn-group>.btn:focus,.btn-group-vertical>.btn:focus { outline: none } .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::before,.btn-toolbar::after { content: " "; display: table } .btn-toolbar::after { clear: both } .btn-toolbar::before,.btn-toolbar::after { content: " "; display: table } .btn-toolbar::after { clear: both } .btn-toolbar .btn-group { float: left } .btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group { margin-left: 5px } .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { } .btn-group>.btn:first-child { margin-left: 0 } .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle) { } .btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child) { } .btn-group>.btn-group { float: left } .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn { } .btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle { } .btn-group>.btn-group:last-child>.btn:first-child { } .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle { outline: 0 } .btn-group-xs>.btn { padding: 1px 5px; font-size: 13px; line-height: 1.5 } .btn-group-sm>.btn { padding: 5px 10px; font-size: 13px; line-height: 1.5 } .btn-group-lg>.btn { padding: 10px 16px; font-size: 19px; line-height: 1.33 } .btn-group>.btn+.dropdown-toggle { padding-left: 8px; padding-right: 8px } .btn-group>.btn-lg+.dropdown-toggle { padding-left: 12px; padding-right: 12px } .btn-group.open .dropdown-toggle { } .btn-group.open .dropdown-toggle.btn-link { } .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::before,.btn-group-vertical>.btn-group::after { content: " "; display: table } .btn-group-vertical>.btn-group::after { clear: both } .btn-group-vertical>.btn-group::before,.btn-group-vertical>.btn-group::after { content: " "; display: table } .btn-group-vertical>.btn-group::after { clear: both } .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) { } .btn-group-vertical>.btn:first-child:not(:last-child) { } .btn-group-vertical>.btn:last-child:not(:first-child) { } .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn { } .btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle { } .btn-group-vertical>.btn-group:last-child>.btn:first-child { } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate } .btn-group-justified>.btn,.btn-group-justified>.btn-group { float: none; display: table-cell; width: 1% } .btn-group-justified>.btn-group .btn { width: 100% } [data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"] { display: none } .input-group { position: relative; display: table; border-collapse: separate } .input-group[class*="col-"] { float: none; padding-left: 0; padding-right: 0 } .input-group .form-control { width: 100%; margin-bottom: 0 } .input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn { height: 48px; padding: 10px 16px; font-size: 19px; line-height: 1.33 } select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn { height: 48px; line-height: 48px } 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: 31px; padding: 5px 10px; font-size: 13px; line-height: 1.5 } select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn { height: 31px; line-height: 31px } 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-addon,.input-group-btn,.input-group .form-control { display: table-cell } .input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child) { } .input-group-addon,.input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle } .input-group-addon { padding: 6px 12px; font-size: 15px; font-weight: normal; line-height: 1; color: #2c3f51; text-align: center; background-color: none; border: 1px solid #dee6ed } .input-group-addon.input-sm { padding: 5px 10px; font-size: 13px } .input-group-addon.input-lg { padding: 10px 16px; font-size: 19px } .input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"] { 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>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle) { } .input-group-addon:first-child { border-right: 0 } .input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child) { } .input-group-addon:last-child { border-left: 0 } .input-group-btn { position: relative; white-space: nowrap } .input-group-btn:first-child>.btn { margin-right: -1px } .input-group-btn:last-child>.btn { margin-left: -1px } .input-group-btn>.btn { position: relative } .input-group-btn>.btn+.btn { margin-left: -4px } .input-group-btn>.btn:hover,.input-group-btn>.btn:active { z-index: 2 } .nav { margin-bottom: 0; padding-left: 0; list-style: none } .nav::before,.nav::after { content: " "; display: table } .nav::after { clear: both } .nav::before,.nav::after { content: " "; display: table } .nav::after { clear: both } .nav>li { position: relative; display: block } .nav>li>a { position: relative; display: block; padding: 10px 15px } .nav>li>a:hover,.nav>li>a:focus { text-decoration: none; background-color: rgba(102,128,153,0.04) } .nav>li.disabled>a { color: #d5dfe9 } .nav>li.disabled>a:hover,.nav>li.disabled>a:focus { color: #d5dfe9; text-decoration: none; background-color: transparent; cursor: not-allowed } .nav .open>a,.nav .open>a:hover,.nav .open>a:focus { background-color: rgba(102,128,153,0.04); border-color: #1980e6 } .nav .nav-divider { height: 1px; margin: 9.5px 0; overflow: hidden; background-color: #e5e5e5 } .nav>li>a>img { max-width: none } .nav-tabs { border-bottom: 1px solid rgba(0,0,0,0) } .nav-tabs>li { float: left; margin-bottom: -1px } .nav-tabs>li>a { margin-right: 2px; line-height: 1.45; border: 1px solid transparent } .nav-tabs>li>a:hover { border-color: rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) } .nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus { color: #555; background-color: none; border: 1px solid #ddd; border-bottom-color: transparent; cursor: default } .nav-tabs.nav-justified { width: 100%; border-bottom: 0 } .nav-tabs.nav-justified>li { float: none } .nav-tabs.nav-justified>li>a { text-align: center; margin-bottom: 5px } .nav-tabs.nav-justified>.dropdown .dropdown-menu { top: auto; left: auto } .nav-tabs.nav-justified>li>a { margin-right: 0 } .nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus { border: 1px solid #ddd } .nav-pills>li { float: left } .nav-pills>li>a { } .nav-pills>li+li { margin-left: 2px } .nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus { color: #fff; background-color: #428bca } .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 { text-align: center; margin-bottom: 5px } .nav-justified>.dropdown .dropdown-menu { top: auto; left: auto } .nav-tabs-justified { border-bottom: 0 } .nav-tabs-justified>li>a { margin-right: 0 } .nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus { border: 1px solid #ddd } .tab-content>.tab-pane { display: none } .tab-content>.active { display: block } .nav-tabs .dropdown-menu { margin-top: -1px } .navbar { position: relative; min-height: 50px; margin-bottom: 21px; border: 1px solid transparent } .navbar::before,.navbar::after { content: " "; display: table } .navbar::after { clear: both } .navbar::before,.navbar::after { content: " "; display: table } .navbar::after { clear: both } .navbar-header::before,.navbar-header::after { content: " "; display: table } .navbar-header::after { clear: both } .navbar-header::before,.navbar-header::after { content: " "; display: table } .navbar-header::after { clear: both } .navbar-collapse { max-height: 340px; padding-right: 15px; padding-left: 15px; border-top: 1px solid transparent } .navbar-collapse::before,.navbar-collapse::after { content: " "; display: table } .navbar-collapse::after { clear: both } .navbar-collapse::before,.navbar-collapse::after { content: " "; display: table } .navbar-collapse::after { clear: both } .navbar-collapse.in { } .container>.navbar-header,.container>.navbar-collapse { margin-right: -15px; margin-left: -15px } .navbar-static-top { z-index: 1000; border-width: 0 0 1px } .navbar-fixed-top,.navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030 } .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; padding: 14.5px 15px; font-size: 19px; line-height: 21px } .navbar-brand:hover,.navbar-brand:focus { text-decoration: none } .navbar-toggle { position: relative; float: right; margin-right: 15px; padding: 9px 10px; margin-top: 8px; margin-bottom: 8px; background-color: transparent; background-image: none; border: 1px solid transparent } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px } .navbar-toggle .icon-bar+.icon-bar { margin-top: 4px } .navbar-nav { margin: 7.25px -15px } .navbar-nav>li>a { padding-top: 10px; padding-bottom: 10px; line-height: 21px } .navbar-form { margin-left: -15px; margin-right: -15px; padding: 10px 15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; margin-top: 4px; margin-bottom: 4px } .navbar-form * { float: none } .navbar-nav>li>.dropdown-menu { margin-top: 0 } .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu { } .navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right { left: auto; right: 0 } .navbar-btn { margin-top: 4px; margin-bottom: 4px } .navbar-btn.btn-sm { margin-top: 9.5px; margin-bottom: 9.5px } .navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px } .navbar-text { margin-top: 14.5px; margin-bottom: 14.5px } .navbar-default { background-color: #e4ebf1; border-color: #cfdae5 } .navbar-default .navbar-brand { color: #777 } .navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus { 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:hover,.navbar-default .navbar-nav>li>a:focus { color: #333; background-color: transparent } .navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus { color: #555; background-color: #cfdae5 } .navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus { color: #ccc; background-color: transparent } .navbar-default .navbar-toggle { border-color: #ddd } .navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus { background-color: #ddd } .navbar-default .navbar-toggle .icon-bar { background-color: #ccc } .navbar-default .navbar-collapse,.navbar-default .navbar-form { border-color: #cfdae5 } .navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus { background-color: #cfdae5; color: #555 } .navbar-default .navbar-link { color: #777 } .navbar-default .navbar-link:hover { color: #333 } .navbar-inverse { background-color: #222; border-color: #080808 } .navbar-inverse .navbar-brand { color: #999 } .navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus { color: #fff; background-color: transparent } .navbar-inverse .navbar-text { color: #999 } .navbar-inverse .navbar-nav>li>a { color: #999 } .navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus { color: #fff; background-color: transparent } .navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus { color: #fff; background-color: #080808 } .navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus { color: #444; background-color: transparent } .navbar-inverse .navbar-toggle { border-color: #333 } .navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus { 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:hover,.navbar-inverse .navbar-nav>.open>a:focus { background-color: #080808; color: #fff } .navbar-inverse .navbar-link { color: #999 } .navbar-inverse .navbar-link:hover { color: #fff } .breadcrumb { padding: 8px 15px; margin-bottom: 21px; list-style: none; background-color: #f5f5f5 } .breadcrumb>li { display: inline-block } .breadcrumb>li+li::before { content: "/?"; padding: 0 5px; color: #ccc } .breadcrumb>.active { color: #999 } .pagination { display: inline-block; padding-left: 0; margin: 21px 0 } .pagination>li { display: inline } .pagination>li>a,.pagination>li>span { position: relative; float: left; padding: 6px 12px; line-height: 1.45; text-decoration: none; background-color: #fff; border: 1px solid #ddd; margin-left: -1px } .pagination>li:first-child>a,.pagination>li:first-child>span { margin-left: 0 } .pagination>li:last-child>a,.pagination>li:last-child>span { } .pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus { background-color: none } .pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus { z-index: 2; color: #fff; background-color: #428bca; border-color: #428bca; cursor: default } .pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus { color: #999; background-color: #fff; border-color: #ddd; cursor: not-allowed } .pagination-lg>li>a,.pagination-lg>li>span { padding: 10px 16px; font-size: 19px } .pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span { } .pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span { } .pagination-sm>li>a,.pagination-sm>li>span { padding: 5px 10px; font-size: 13px } .pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span { } .pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span { } .pager { padding-left: 0; margin: 21px 0; list-style: none; text-align: center } .pager::before,.pager::after { content: " "; display: table } .pager::after { clear: both } .pager::before,.pager::after { content: " "; display: table } .pager::after { clear: both } .pager li { display: inline } .pager li>a,.pager li>span { display: inline-block; padding: 5px 14px; background-color: #fff; border: 1px solid #ddd } .pager li>a:hover,.pager li>a:focus { text-decoration: none; background-color: none } .pager .next>a,.pager .next>span { float: right } .pager .previous>a,.pager .previous>span { float: left } .pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span { color: #999; background-color: #fff; cursor: not-allowed } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline } .label[href]:hover,.label[href]:focus { color: #fff; text-decoration: none; cursor: pointer } .label:empty { display: none } .btn .label { position: relative; top: -1px } .label-default { background-color: #999 } .label-default[href]:hover,.label-default[href]:focus { background-color: #808080 } .label-primary { background-color: #428bca } .label-primary[href]:hover,.label-primary[href]:focus { background-color: #3071a9 } .label-success { background-color: #5cb85c } .label-success[href]:hover,.label-success[href]:focus { background-color: #449d44 } .label-info { background-color: #5bc0de } .label-info[href]:hover,.label-info[href]:focus { background-color: #31b0d5 } .label-warning { background-color: #ebc000 } .label-warning[href]:hover,.label-warning[href]:focus { background-color: #b89600 } .label-danger { background-color: #e63b2b } .label-danger[href]:hover,.label-danger[href]:focus { background-color: #c62717 } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 13px; font-weight: bold; color: #fff; line-height: 1; vertical-align: baseline; white-space: nowrap; text-align: center; background-color: #999 } .badge:empty { display: none } .btn .badge { position: relative; top: -1px } a.badge:hover,a.badge:focus { color: #fff; text-decoration: none; cursor: pointer } a.list-group-item.active>.badge,.nav-pills>.active>a>.badge { color: #1980e6; background-color: #fff } .nav-pills>li>a>.badge { margin-left: 3px } .jumbotron { padding: 30px; margin-bottom: 30px; font-size: 23px; font-weight: 200; line-height: 2.175; color: inherit; background-color: none } .jumbotron h1,.jumbotron .h1 { line-height: 1; color: inherit } .jumbotron p { line-height: 1.4 } .container .jumbotron { } .jumbotron .container { max-width: 100% } .thumbnail { display: block; padding: 4px; margin-bottom: 21px; line-height: 1.45; background-color: none; border: 1px solid #ddd } .thumbnail>img,.thumbnail a>img { display: block; max-width: 100%; height: auto; margin-left: auto; margin-right: auto } a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active { border-color: #1980e6 } .thumbnail .caption { padding: 9px; color: #2c3f51 } .alert { padding: 15px; margin-bottom: 21px; border: 1px solid transparent } .alert h4 { margin-top: 0; color: inherit } .alert .alert-link { font-weight: bold } .alert>p,.alert>ul { margin-bottom: 0 } .alert>p+p { margin-top: 5px } .alert-dismissable { padding-right: 35px } .alert-dismissable .close { position: relative; top: -2px; right: -21px; color: inherit } .alert-success { background-color: #dff0d8; border-color: #d6e9c6; color: #3c763d } .alert-success hr { border-top-color: #c9e2b3 } .alert-success .alert-link { color: #2b542c } .alert-info { background-color: #d9edf7; border-color: #bce8f1; color: #31708f } .alert-info hr { border-top-color: #a6e1ec } .alert-info .alert-link { color: #245269 } .alert-warning { background-color: rgba(255,209,0,0.12); border-color: rgba(255,209,0,0.24); color: #b89600 } .alert-warning hr { border-top-color: rgba(230,188,0,0.24) } .alert-warning .alert-link { color: #856d00 } .alert-danger { background-color: rgba(232,76,61,0.1); border-color: rgba(232,76,61,0.15); color: #d82a1a } .alert-danger hr { border-top-color: rgba(229,55,38,0.15) } .alert-danger .alert-link { color: #ab2114 } .progress { overflow: hidden; height: 21px; margin-bottom: 21px; background-color: #f5f5f5 } .progress-bar { float: left; width: 0; height: 100%; font-size: 13px; line-height: 21px; color: #fff; text-align: center; background-color: #428bca } .progress-striped .progress-bar { background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent) } .progress.active .progress-bar { } .progress-bar-success { background-color: #5cb85c } .progress-striped .progress-bar-success { background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent) } .progress-bar-info { background-color: #5bc0de } .progress-striped .progress-bar-info { background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent) } .progress-bar-warning { background-color: #f0ad4e } .progress-striped .progress-bar-warning { background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent) } .progress-bar-danger { background-color: #d9534f } .progress-striped .progress-bar-danger { background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent) } .media,.media-body { overflow: hidden } .media,.media .media { margin-top: 15px } .media:first-child { margin-top: 0 } .media-object { display: block } .media-heading { margin: 0 0 5px } .media>.pull-left { margin-right: 10px } .media>.pull-right { margin-left: 10px } .media-list { padding-left: 0; list-style: none } .list-group { margin-bottom: 20px; padding-left: 0 } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #f6f7f9; border: 1px solid rgba(0,0,0,0) } .list-group-item:first-child { } .list-group-item:last-child { margin-bottom: 0 } .list-group-item>.badge { float: right } .list-group-item>.badge+.badge { margin-right: 5px } a.list-group-item { color: #eee } a.list-group-item .list-group-item-heading { color: #333 } a.list-group-item:hover,a.list-group-item:focus { text-decoration: none; background-color: #4b5666 } a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus { z-index: 2; color: #2d4053; background-color: #e4ebf1; border-color: rgba(0,128,255,0.05) } a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading { color: inherit } a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text { color: #fff } .list-group-item-heading { margin-top: 0; margin-bottom: 5px } .list-group-item-text { margin-bottom: 0; line-height: 1.3 } .panel { margin-bottom: 21px; background-color: #fff; border: 1px solid transparent } .panel-body { padding: 15px } .panel-body::before,.panel-body::after { content: " "; display: table } .panel-body::after { clear: both } .panel-body::before,.panel-body::after { content: " "; display: table } .panel-body::after { clear: both } .panel>.list-group { margin-bottom: 0 } .panel>.list-group .list-group-item { border-width: 1px 0 } .panel>.list-group .list-group-item:first-child { } .panel>.list-group .list-group-item:last-child { border-bottom: 0 } .panel-heading+.list-group .list-group-item:first-child { border-top-width: 0 } .panel>.table,.panel>.table-responsive>.table { margin-bottom: 0 } .panel>.panel-body+.table,.panel>.panel-body+.table-responsive { border-top: 1px solid #ddd } .panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td { border-top: 0 } .panel>.table-bordered,.panel>.table-responsive>.table-bordered { border: 0 } .panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child { border-left: 0 } .panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child { border-right: 0 } .panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td { border-bottom: 0 } .panel>.table-responsive { border: 0; margin-bottom: 0 } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent } .panel-heading>.dropdown .dropdown-toggle { color: inherit } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 17px; color: inherit } .panel-title>a { color: inherit } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #ddd } .panel-group .panel { margin-bottom: 0; overflow: hidden } .panel-group .panel+.panel { margin-top: 5px } .panel-group .panel-heading { border-bottom: 0 } .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-footer+.panel-collapse .panel-body { border-bottom-color: #ddd } .panel-primary { border-color: #428bca } .panel-primary>.panel-heading { color: #fff; background-color: #428bca; border-color: #428bca } .panel-primary>.panel-heading+.panel-collapse .panel-body { border-top-color: #428bca } .panel-primary>.panel-footer+.panel-collapse .panel-body { border-bottom-color: #428bca } .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-footer+.panel-collapse .panel-body { border-bottom-color: #d6e9c6 } .panel-warning { border-color: rgba(255,209,0,0.24) } .panel-warning>.panel-heading { color: #b89600; background-color: rgba(255,209,0,0.12); border-color: rgba(255,209,0,0.24) } .panel-warning>.panel-heading+.panel-collapse .panel-body { border-top-color: rgba(255,209,0,0.24) } .panel-warning>.panel-footer+.panel-collapse .panel-body { border-bottom-color: rgba(255,209,0,0.24) } .panel-danger { border-color: rgba(232,76,61,0.15) } .panel-danger>.panel-heading { color: #d82a1a; background-color: rgba(232,76,61,0.1); border-color: rgba(232,76,61,0.15) } .panel-danger>.panel-heading+.panel-collapse .panel-body { border-top-color: rgba(232,76,61,0.15) } .panel-danger>.panel-footer+.panel-collapse .panel-body { border-bottom-color: rgba(232,76,61,0.15) } .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-footer+.panel-collapse .panel-body { border-bottom-color: #bce8f1 } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3 } .well blockquote { border-color: rgba(0,0,0,0.15) } .well-lg { padding: 24px } .well-sm { padding: 9px } .close { float: right; font-size: 22.5px; font-weight: bold; line-height: 1; color: #2c3f51; opacity: .2 } .close:hover,.close:focus { color: #2c3f51; text-decoration: none; cursor: pointer; opacity: .5 } button.close { padding: 0; cursor: pointer; background: transparent; border: 0 } .modal-open { overflow: hidden } .modal { display: none; overflow: auto; position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040 } .modal.fade .modal-dialog { } .modal.in .modal-dialog { } .modal-dialog { position: relative; width: auto; margin: 10px; z-index: 1050 } .modal-content { position: relative; background-color: #fff; border: 1px solid #dee6ed; outline: none } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1030; background-color: #73808c } .modal-backdrop.fade { opacity: 0 } .modal-backdrop.in { opacity: .5 } .modal-header { padding: 15px; border-bottom: 1px solid #ebf0f4; min-height: 16.45px } .modal-header .close { margin-top: -2px } .modal-title { margin: 0; line-height: 1.45 } .modal-body { position: relative; padding: 20px } .modal-footer { margin-top: 15px; padding: 19px 20px 20px; text-align: right; border-top: 1px solid #ebf0f4 } .modal-footer::before,.modal-footer::after { content: " "; display: table } .modal-footer::after { clear: both } .modal-footer::before,.modal-footer::after { content: " "; display: table } .modal-footer::after { clear: both } .modal-footer .btn+.btn { margin-left: 5px; margin-bottom: 0 } .modal-footer .btn-group .btn+.btn { margin-left: -1px } .modal-footer .btn-block+.btn-block { margin-left: 0 } .tooltip { position: absolute; z-index: 1030; display: block; visibility: visible; font-size: 13px; line-height: 1.4; opacity: 0 } .tooltip.in { opacity: .9 } .tooltip.top { margin-top: -3px; padding: 5px 0 } .tooltip.right { margin-left: 3px; padding: 0 5px } .tooltip.bottom { margin-top: 3px; padding: 5px 0 } .tooltip.left { margin-left: -3px; padding: 0 5px } .tooltip-inner { max-width: 250px; padding: 3px 8px; color: #fff; text-align: center; text-decoration: none; background-color: #000 } .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 { bottom: 0; left: 5px; border-width: 5px 5px 0; border-top-color: #000 } .tooltip.top-right .tooltip-arrow { bottom: 0; right: 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; left: 5px; border-width: 0 5px 5px; border-bottom-color: #000 } .tooltip.bottom-right .tooltip-arrow { top: 0; right: 5px; border-width: 0 5px 5px; border-bottom-color: #000 } .popover { position: absolute; top: 0; left: 0; z-index: 1010; display: none; max-width: 276px; padding: 1px; text-align: left; background-color: #475160; border: 1px solid #dee6ed; white-space: normal } .popover.top { margin-top: -10px } .popover.right { margin-left: 10px } .popover.bottom { margin-top: 10px } .popover.left { margin-left: -10px } .popover-title { margin: 0; padding: 8px 14px; font-size: 15px; font-weight: normal; line-height: 18px; background-color: rgba(0,0,0,0); border-bottom: 1px solid rgba(0,0,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 { border-width: 10px; content: "" } .popover.top .arrow { left: 50%; margin-left: -11px; border-bottom-width: 0; border-top-color: #dee6ed; bottom: -11px } .popover.top .arrow::after { content: " "; bottom: 1px; margin-left: -10px; border-bottom-width: 0; border-top-color: #475160 } .popover.right .arrow { top: 50%; left: -11px; margin-top: -11px; border-left-width: 0; border-right-color: #dee6ed } .popover.right .arrow::after { content: " "; left: 1px; bottom: -10px; border-left-width: 0; border-right-color: #475160 } .popover.bottom .arrow { left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #dee6ed; top: -11px } .popover.bottom .arrow::after { content: " "; top: 1px; margin-left: -10px; border-top-width: 0; border-bottom-color: #475160 } .popover.left .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #dee6ed } .popover.left .arrow::after { content: " "; right: 1px; border-right-width: 0; border-left-color: #475160; bottom: -10px } .clearfix::before,.clearfix::after { content: " "; display: table } .clearfix::after { clear: both } .center-block { display: block; margin-left: auto; margin-right: 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; background-color: transparent; border: 0 } .hidden { display: none !important; visibility: hidden !important } .affix { position: fixed } [class^="icon-"]::before,[class*=" icon-"]::before { font-family: "fontello"; font-style: normal; font-weight: normal; display: inline-block; text-decoration: inherit; width: 1em; margin-right: .2em; text-align: center; font-variant: normal; text-transform: none; line-height: 1em; margin-left: .2em } .icon-glass::before { content: "" } .icon-resize-full-1::before { content: "" } .icon-search::before { content: "" } .icon-mail::before { content: "" } .icon-mail-alt::before { content: "" } .icon-heart::before { content: "" } .icon-heart-empty::before { content: "" } .icon-star::before { content: "" } .icon-star-empty::before { content: "" } .icon-star-half::before { content: "" } .icon-star-half-alt::before { content: "" } .icon-user::before { content: "" } .icon-users::before { content: "" } .icon-male::before { content: "" } .icon-female::before { content: "" } .icon-video::before { content: "" } .icon-videocam::before { content: "" } .icon-picture::before { content: "" } .icon-camera::before { content: "" } .icon-camera-alt::before { content: "" } .icon-th-large::before { content: "" } .icon-th::before { content: "" } .icon-th-list::before { content: "" } .icon-ok::before { content: "" } .icon-ok-circled::before { content: "" } .icon-ok-circled2::before { content: "" } .icon-ok-squared::before { content: "" } .icon-cancel::before { content: "" } .icon-cancel-circled::before { content: "" } .icon-cancel-circled2::before { content: "" } .icon-plus::before { content: "" } .icon-plus-circled::before { content: "" } .icon-plus-squared::before { content: "" } .icon-plus-squared-small::before { content: "" } .icon-minus::before { content: "" } .icon-minus-circled::before { content: "" } .icon-minus-squared::before { content: "" } .icon-minus-squared-alt::before { content: "" } .icon-minus-squared-small::before { content: "" } .icon-help::before { content: "" } .icon-help-circled::before { content: "" } .icon-info-circled::before { content: "" } .icon-info::before { content: "" } .icon-home::before { content: "" } .icon-link::before { content: "" } .icon-unlink::before { content: "" } .icon-link-ext::before { content: "" } .icon-link-ext-alt::before { content: "" } .icon-attach::before { content: "" } .icon-lock::before { content: "" } .icon-lock-open::before { content: "" } .icon-lock-open-alt::before { content: "" } .icon-pin::before { content: "" } .icon-eye::before { content: "" } .icon-eye-off::before { content: "" } .icon-tag::before { content: "" } .icon-tags::before { content: "" } .icon-bookmark::before { content: "" } .icon-bookmark-empty::before { content: "" } .icon-flag::before { content: "" } .icon-flag-empty::before { content: "" } .icon-flag-checkered::before { content: "" } .icon-thumbs-up::before { content: "" } .icon-thumbs-down::before { content: "" } .icon-thumbs-up-alt::before { content: "" } .icon-thumbs-down-alt::before { content: "" } .icon-download::before { content: "" } .icon-upload::before { content: "" } .icon-download-cloud::before { content: "" } .icon-upload-cloud::before { content: "" } .icon-reply::before { content: "" } .icon-reply-all::before { content: "" } .icon-forward::before { content: "" } .icon-quote-left::before { content: "" } .icon-quote-right::before { content: "" } .icon-export-alt::before { content: "" } .icon-pencil::before { content: "" } .icon-pencil-squared::before { content: "" } .icon-edit::before { content: "" } .icon-print::before { content: "" } .icon-retweet::before { content: "" } .icon-keyboard::before { content: "" } .icon-gamepad::before { content: "" } .icon-comment::before { content: "" } .icon-chat::before { content: "" } .icon-comment-empty::before { content: "" } .icon-chat-empty::before { content: "" } .icon-bell::before { content: "" } .icon-bell-alt::before { content: "" } .icon-attention-alt::before { content: "" } .icon-attention::before { content: "" } .icon-attention-circled::before { content: "" } .icon-location::before { content: "" } .icon-direction::before { content: "" } .icon-compass::before { content: "" } .icon-doc::before { content: "" } .icon-docs::before { content: "" } .icon-doc-text::before { content: "" } .icon-file::before { content: "" } .icon-doc-text-inv::before { content: "" } .icon-folder-empty::before { content: "" } .icon-folder-open-empty::before { content: "?" } .icon-box::before { content: "?" } .icon-rss::before { content: "?" } .icon-rss-squared::before { content: "?" } .icon-phone::before { content: "?" } .icon-phone-squared::before { content: "?" } .icon-menu::before { content: "?" } .icon-cog::before { content: "?" } .icon-cog-alt::before { content: "?" } .icon-wrench::before { content: "?" } .icon-basket::before { content: "?" } .icon-calendar::before { content: "?" } .icon-calendar-empty::before { content: "?" } .icon-login::before { content: "?" } .icon-logout::before { content: "?" } .icon-mic::before { content: "?" } .icon-mute::before { content: "?" } .icon-volume-off::before { content: "?" } .icon-volume-down::before { content: "?" } .icon-volume-up::before { content: "?" } .icon-headphones::before { content: "?" } .icon-clock::before { content: "?" } .icon-lightbulb::before { content: "?" } .icon-block::before { content: "?" } .icon-resize-full-alt::before { content: "?" } .icon-resize-small::before { content: "?" } .icon-resize-vertical::before { content: "?" } .icon-resize-horizontal::before { content: "?" } .icon-move::before { content: "?" } .icon-zoom-in::before { content: "?" } .icon-zoom-out::before { content: "?" } .icon-down-circled2::before { content: "?" } .icon-up-circled2::before { content: "?" } .icon-down-dir::before { content: "?" } .icon-up-dir::before { content: "?" } .icon-left-dir::before { content: "?" } .icon-right-dir::before { content: "?" } .icon-down-open::before { content: "?" } .icon-left-open::before { content: "?" } .icon-right-open::before { content: "?" } .icon-up-open::before { content: "?" } .icon-angle-left::before { content: "?" } .icon-angle-right::before { content: "?" } .icon-angle-up::before { content: "?" } .icon-angle-down::before { content: "?" } .icon-angle-circled-left::before { content: "?" } .icon-angle-circled-right::before { content: "?" } .icon-angle-circled-up::before { content: "?" } .icon-angle-circled-down::before { content: "?" } .icon-angle-double-left::before { content: "?" } .icon-angle-double-right::before { content: "?" } .icon-angle-double-up::before { content: "?" } .icon-angle-double-down::before { content: "?" } .icon-down::before { content: "?" } .icon-left::before { content: "?" } .icon-right::before { content: "?" } .icon-up::before { content: "?" } .icon-down-big::before { content: "?" } .icon-music::before { content: "?" } .icon-archive::before { content: "?" } .icon-up-big::before { content: "?" } .icon-right-hand::before { content: "?" } .icon-resize-small-1::before { content: "?" } .icon-cancel-squared::before { content: "?" } .icon-down-hand::before { content: "?" } .icon-left-circled::before { content: "?" } .icon-right-circled::before { content: "?" } .icon-up-circled::before { content: "?" } .icon-down-circled::before { content: "?" } .icon-cw::before { content: "?" } .icon-ccw::before { content: "?" } .icon-refresh::before { content: "?" } .icon-level-up::before { content: "?" } .icon-level-down::before { content: "?" } .icon-shuffle::before { content: "?" } .icon-exchange::before { content: "?" } .icon-collapse::before { content: "?" } .icon-collapse-top::before { content: "?" } .icon-expand::before { content: "?" } .icon-play::before { content: "?" } .icon-play-circled::before { content: "?" } .icon-play-circled2::before { content: "?" } .icon-stop::before { content: "?" } .icon-pause::before { content: "?" } .icon-to-end::before { content: "?" } .icon-to-end-alt::before { content: "?" } .icon-to-start::before { content: "?" } .icon-to-start-alt::before { content: "?" } .icon-fast-fw::before { content: "?" } .icon-fast-bw::before { content: "?" } .icon-eject::before { content: "?" } .icon-signal::before { content: "?" } .icon-award::before { content: "?" } .icon-desktop::before { content: "?" } .icon-laptop::before { content: "?" } .icon-tablet::before { content: "?" } .icon-mobile::before { content: "?" } .icon-inbox::before { content: "?" } .icon-globe::before { content: "?" } .icon-sun::before { content: "?" } .icon-cloud::before { content: "?" } .icon-flash::before { content: "?" } .icon-moon::before { content: "?" } .icon-umbrella::before { content: "?" } .icon-flight::before { content: "?" } .icon-fighter-jet::before { content: "?" } .icon-leaf::before { content: "?" } .icon-font::before { content: "?" } .icon-bold::before { content: "?" } .icon-italic::before { content: "?" } .icon-text-height::before { content: "?" } .icon-text-width::before { content: "?" } .icon-align-left::before { content: "?" } .icon-align-center::before { content: "?" } .icon-align-right::before { content: "?" } .icon-align-justify::before { content: "?" } .icon-list::before { content: "?" } .icon-indent-left::before { content: "?" } .icon-indent-right::before { content: "?" } .icon-list-bullet::before { content: "?" } .icon-list-numbered::before { content: "?" } .icon-strike::before { content: "?" } .icon-underline::before { content: "?" } .icon-superscript::before { content: "?" } .icon-subscript::before { content: "?" } .icon-table::before { content: "?" } .icon-columns::before { content: "?" } .icon-crop::before { content: "?" } .icon-scissors::before { content: "?" } .icon-paste::before { content: "?" } .icon-briefcase::before { content: "?" } .icon-suitcase::before { content: "?" } .icon-ellipsis::before { content: "?" } .icon-ellipsis-vert::before { content: "?" } .icon-off::before { content: "?" } .icon-road::before { content: "?" } .icon-list-alt::before { content: "?" } .icon-qrcode::before { content: "?" } .icon-barcode::before { content: "?" } .icon-book::before { content: "?" } .icon-ajust::before { content: "?" } .icon-tint::before { content: "?" } .icon-check::before { content: "?" } .icon-check-empty::before { content: "?" } .icon-circle::before { content: "?" } .icon-circle-empty::before { content: "?" } .icon-asterisk::before { content: "?" } .icon-gift::before { content: "?" } .icon-fire::before { content: "?" } .icon-magnet::before { content: "?" } .icon-ticket::before { content: "?" } .icon-credit-card::before { content: "?" } .icon-floppy::before { content: "?" } .icon-megaphone::before { content: "?" } .icon-key::before { content: "?" } .icon-fork::before { content: "?" } .icon-rocket::before { content: "?" } .icon-bug::before { content: "?" } .icon-certificate::before { content: "?" } .icon-tasks::before { content: "?" } .icon-filter::before { content: "?" } .icon-beaker::before { content: "?" } .icon-magic::before { content: "?" } .icon-truck::before { content: "?" } .icon-money::before { content: "?" } .icon-euro::before { content: "?" } .icon-pound::before { content: "?" } .icon-dollar::before { content: "?" } .icon-rupee::before { content: "?" } .icon-yen::before { content: "?" } .icon-renminbi::before { content: "?" } .icon-won::before { content: "?" } .icon-bitcoin::before { content: "?" } .icon-sort::before { content: "?" } .icon-sort-down::before { content: "?" } .icon-sort-up::before { content: "?" } .icon-sort-alt-up::before { content: "?" } .icon-sort-alt-down::before { content: "?" } .icon-sort-name-up::before { content: "?" } .icon-sort-name-down::before { content: "?" } .icon-sort-number-up::before { content: "?" } .icon-sort-number-down::before { content: "?" } .icon-hammer::before { content: "?" } .icon-gauge::before { content: "?" } .icon-sitemap::before { content: "?" } .icon-spinner::before { content: "?" } .icon-coffee::before { content: "?" } .icon-food::before { content: "?" } .icon-beer::before { content: "?" } .icon-user-md::before { content: "?" } .icon-stethoscope::before { content: "?" } .icon-ambulance::before { content: "?" } .icon-medkit::before { content: "?" } .icon-h-sigh::before { content: "?" } .icon-hospital::before { content: "?" } .icon-building::before { content: "?" } .icon-smile::before { content: "?" } .icon-frown::before { content: "?" } .icon-meh::before { content: "?" } .icon-anchor::before { content: "?" } .icon-terminal::before { content: "?" } .icon-eraser::before { content: "?" } .icon-puzzle::before { content: "?" } .icon-shield::before { content: "?" } .icon-extinguisher::before { content: "?" } .icon-bullseye::before { content: "?" } .icon-resize-full::before { content: "?" } .icon-target::before { content: "?" } .icon-layers::before { content: "?" } .icon-chart-bar::before { content: "?" } .icon-share::before { content: "?" } .icon-hdd::before { content: "?" } .icon-trash::before { content: "?" } .icon-folder::before { content: "?" } .icon-code::before { content: "?" } .icon-folder-open::before { content: "?" } .icon-left-big::before { content: "?" } .icon-evernote::before { content: "?" } .icon-right-big::before { content: "?" } .icon-spin3::before { content: "?" } .icon-spin4::before { content: "?" } .icon-spin6::before { content: "?" } .icon-arrows-cw::before { content: "?" } .icon-resize-normal::before { content: "?" } .icon-left-hand::before { content: "?" } .icon-evernote-1::before { content: "?" } .icon-up-hand::before { content: "?" } .icon-file-pdf::before { content: "?" } .icon-doc-text-1::before { content: "?" } .icon-file-word::before { content: "?" } .icon-file-excel::before { content: "?" } .icon-file-powerpoint::before { content: "?" } .icon-file-image::before { content: "?" } .icon-file-archive::before { content: "?" } .icon-file-audio::before { content: "?" } .icon-file-video::before { content: "?" } .icon-file-code::before { content: "?" } .icon-doc-1::before { content: "?" } .icon-share-1::before { content: "?" } .icon-users-1::before { content: "?" } article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary { display: block } audio,canvas,video { display: inline-block } audio:not([controls]) { display: none; height: 0 } [hidden],template { display: none } html { font-family: sans-serif } body { margin: 0 } a { background: transparent } a:focus { outline: thin dotted } a:active,a:hover { outline: 0 } h1 { font-size: 2em; margin: .67em 0 } abbr[title] { border-bottom: 1px dotted } b,strong { font-weight: bold } dfn { font-style: italic } hr { height: 0 } mark { background: #ff0; color: #000 } code,kbd,pre,samp { font-family: monospace, serif; font-size: 1em } pre { white-space: pre-wrap } q { quotes: "“" "”" "‘" "’" } small { font-size: 80% } sub,sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline } sup { top: -0.5em } sub { bottom: -0.25em } img { border: 0 } svg:not(:root) { overflow: hidden } figure { margin: 0 } fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: .35em .625em .75em } legend { border: 0; padding: 0 } button,input,select,textarea { font-family: inherit; font-size: 100%; margin: 0 } button,input { line-height: normal } button,select { text-transform: none } button,html input[type="button"],input[type="reset"],input[type="submit"] { cursor: pointer } button[disabled],html input[disabled] { cursor: default } input[type="checkbox"],input[type="radio"] { padding: 0 } input[type="search"] { } input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration { } button::-moz-focus-inner,input::-moz-focus-inner { border: 0; padding: 0 } textarea { overflow: auto; vertical-align: top } table { border-collapse: collapse; border-spacing: 0 } *,*::before,*::after { } html { font-size: 62.5% } body { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, Song, sans-serif; font-size: 15px; line-height: 1.45; color: #2c3f51; background-color: none } input,button,select,textarea { font-family: inherit; font-size: inherit; line-height: inherit } a { color: #1980e6; text-decoration: none } a:hover,a:focus { color: #0f4d8a; text-decoration: underline } a:focus { outline: 5px auto -webkit-focus-ring-color } img { vertical-align: middle } .img-responsive { display: block; max-width: 100%; height: auto } .img-rounded { } .img-thumbnail { padding: 4px; line-height: 1.45; background-color: none; border: 1px solid #ddd; display: inline-block; max-width: 100%; height: auto } .img-circle { } hr { margin-top: 21px; margin-bottom: 21px; border: 0; border-top: 1px solid rgba(102,128,153,0.1) } .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0 } h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6 { font-family: inherit; font-weight: 300; line-height: 1.1; color: inherit } h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small { font-weight: normal; line-height: 1; color: #999 } h1,h2,h3 { margin-top: 21px; margin-bottom: 10.5px } h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small { font-size: 65% } h4,h5,h6 { margin-top: 10.5px; margin-bottom: 10.5px } h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small { font-size: 75% } h1,.h1 { font-size: 39px } h2,.h2 { font-size: 32px } h3,.h3 { font-size: 26px } h4,.h4 { font-size: 19px } h5,.h5 { font-size: 15px } h6,.h6 { font-size: 13px } p { margin: 0 0 10.5px } .lead { margin-bottom: 21px; font-size: 17px; font-weight: 200; line-height: 1.4 } small,.small { font-size: 85% } cite { font-style: normal } .text-muted { color: #999 } .text-primary { color: #428bca } .text-primary:hover { color: #3071a9 } .text-warning { color: #b89600 } .text-warning:hover { color: #856d00 } .text-danger { color: #d82a1a } .text-danger:hover { color: #ab2114 } .text-success { color: #3c763d } .text-success:hover { color: #2b542c } .text-info { color: #31708f } .text-info:hover { color: #245269 } .text-left { text-align: left } .text-right { text-align: right } .text-center { text-align: center } .page-header { padding-bottom: 9.5px; margin: 42px 0 21px; border-bottom: 1px solid none } ul,ol { margin-top: 0; margin-bottom: 10.5px } ul ul,ol ul,ul ol,ol ol { margin-bottom: 0 } .list-unstyled { padding-left: 0; list-style: none } .list-inline { padding-left: 0; list-style: none } .list-inline>li { display: inline-block; padding-left: 5px; padding-right: 5px } .list-inline>li:first-child { padding-left: 0 } dl { margin-top: 0; margin-bottom: 21px } dt,dd { line-height: 1.45 } dt { font-weight: bold } dd { margin-left: 0 } abbr[title],abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #999 } .initialism { font-size: 90%; text-transform: uppercase } blockquote { padding: 10.5px 21px; margin: 0 0 21px; border-left: 5px solid rgba(102,128,153,0.075) } blockquote p { font-size: 18.75px; font-weight: 300; line-height: 1.25 } blockquote p:last-child { margin-bottom: 0 } blockquote small,blockquote .small { display: block; line-height: 1.45; color: #999 } blockquote small::before,blockquote .small::before { content: "—?" } blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid rgba(102,128,153,0.075); border-left: 0 } blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small { text-align: right } blockquote.pull-right small::before,blockquote.pull-right .small::before { content: "" } blockquote.pull-right small::after,blockquote.pull-right .small::after { content: "?—" } blockquote::before,blockquote::after { content: "" } address { margin-bottom: 21px; font-style: normal; line-height: 1.45 } code,kbd,pre,samp { font-family: "Source Code Pro", monospace } code { padding: 2px 4px; font-size: 90%; color: #2c3f51; background-color: rgba(102,128,153,0.075); white-space: nowrap } pre { display: block; padding: 10px; margin: 0 0 10.5px; font-size: 14px; line-height: 1.45; color: #333; background-color: rgba(102,128,153,0.05); border: 1px solid rgba(102,128,153,0.075) } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent } .pre-scrollable { max-height: 340px } .pln { color: #000 } .str { color: #080 } .kwd { color: #008 } .com { color: #800 } .typ { color: #606 } .lit { color: #066 } .pun,.opn,.clo { color: #660 } .tag { color: #008 } .atn { color: #606 } .atv { color: #080 } .dec,.var { color: #606 } .fun { color: #f00 } pre.prettyprint { padding: 0; border: 0 } ol.linenums { margin-top: 0; margin-bottom: 0 } li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none } li.L1,li.L3,li.L5,li.L7,li.L9 { background: #eee } .container { margin-bottom: 180px; text-align: justify } a code { color: inherit } h1 { font-size: 2.6em } h2 { font-size: 2.15em } h3 { font-size: 1.7em } h4 { font-size: 1.25em } h5 { font-size: 1em } h6 { font-size: .85em } h1,h2,h3,h4,h5,h6 { margin: 1.8em 0; text-align: start } pre { } p,pre,pre.prettyprint,blockquote { margin: 0 0 1.1em } hr { margin: 2em 0 } img { max-width: 100% } .sequence-diagram,.flow-chart { text-align: center; margin-bottom: 1.1em } .sequence-diagram text,.flow-chart text { font-size: 15px !important; font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, Song, sans-serif !important } .sequence-diagram [stroke="#000000"],.flow-chart [stroke="#000000"] { } .sequence-diagram text[stroke="#000000"],.flow-chart text[stroke="#000000"] { } .sequence-diagram [fill="#000"],.flow-chart [fill="#000"],.sequence-diagram [fill="#000000"],.flow-chart [fill="#000000"],.sequence-diagram [fill="black"],.flow-chart [fill="black"] { } code,pre { font-family: "Source Code Pro", monospace; font-size: .9em } code { white-space: normal } pre,pre.prettyprint { text-align: start; border: 0 } pre code,pre.prettyprint code { padding: 1.3em 2em !important } pre.prettyprint.with-line-number { position: relative } pre.prettyprint.with-line-number code { padding-left: 3.3em !important } pre.prettyprint.with-line-number .hljs-comment.line-number { min-width: 2.2em; display: inline-block; text-align: right; opacity: .8; position: absolute; left: .3em } .hljs-comment.line-number { display: none } dt,dd { margin-top: 5px; margin-bottom: 5px } dd { margin-left: 40px } table { margin-bottom: 20px } table th,table td { padding: 8px; line-height: 20px; vertical-align: top; border-top: 1px solid #ddd } table th { font-weight: bold } table thead th { vertical-align: bottom } table caption+thead tr:first-child th,table caption+thead tr:first-child td,table colgroup+thead tr:first-child th,table colgroup+thead tr:first-child td,table thead:first-child tr:first-child th,table thead:first-child tr:first-child td { border-top: 0 } table tbody+tbody { border-top: 2px solid #ddd } blockquote { border-left-width: 10px; background-color: rgba(102,128,153,0.05); padding: 15px 20px } blockquote p { margin-bottom: 1.1em; font-size: 1em; line-height: 1.45 } blockquote ul:last-child,blockquote ol:last-child { margin-bottom: 0 } ul,ol { margin-bottom: 1.1em } ul ul,ol ul,ul ol,ol ol { margin-bottom: 1.1em } kbd { padding: .1em .6em; border: 1px solid rgba(44,63,81,0.25); font-size: .7em; font-family: sans-serif; background-color: #fff; color: #333; display: inline-block; margin: 0 .1em; white-space: nowrap } .toc ul { list-style-type: none; margin-bottom: 15px } .footnote { vertical-align: top; position: relative; top: -0.5em; font-size: .8em } li.checklist-item { list-style: none; margin-left: -1.2em } .checklist { margin-bottom: 1.1em } .checklist-item>.checklist { margin-left: 1.4em } li>p:last-child { margin-bottom: 0 } [class^="icon-"],[class*=" icon-"] { display: inline-block; line-height: 1.35em; vertical-align: middle; background-repeat: no-repeat } .icon-code { font-size: 83%; line-height: 1.65em } .icon-code::before { margin-left: .1em; margin-right: .6em } .icon-trash { line-height: 1.5em } .icon-folder-open { font-size: 80% } .icon-folder-open::before { margin-right: .6em } .icon-chart-bar { font-size: 95% } .icon-chart-bar::before { margin-left: .3em; margin-right: .3em } .icon-comment-alt,.icon-chat { font-size: 92% } .icon-comment-alt::before,.icon-chat::before { margin-left: .1em; margin-right: .4em } .icon-file { font-size: 104%; margin-left: 0; margin-right: 0 } .icon-link { font-size: 104% } [class^="icon-provider-"],[class*=" icon-provider-"] { background-image: url("../img/icons.png"); width: 18px; height: 16px; margin-top: -2px; margin-left: 2px } .icon-provider-stackedit { background-position: 0 0 } .icon-provider-gdrive,.icon-provider-gdrivesec,.icon-provider-gdriveter { background-position: -18px 0 } .icon-provider-dropbox { background-position: -37px 0 } .icon-provider-github,.icon-provider-gist { background-position: -54px 0 } .icon-provider-blogger,.icon-provider-bloggerpage { background-position: -72px 0 } .icon-provider-tumblr { background-position: -90px 0 } .icon-provider-wordpress { background-position: -108px 0 } .icon-provider-ssh { background-position: -126px 0 } .icon-provider-gplus { background-position: -144px 0 } .icon-provider-couchdb { background-position: -162px 0 } body.rtl #wmd-input,body.rtl #preview-contents,body.rtl .input-file-title,body.rtl .search-bar input,body.rtl .modal-document-manager input,body.rtl .comments-popover,body.rtl .container { direction: rtl } .MathJax_SVG_Display { text-align: center; margin: 1em 0; position: relative; display: block !important; text-indent: 0; max-width: none; max-height: none; min-width: 0; min-height: 0; width: 100% } .MathJax_SVG { display: inline; font-style: normal; font-weight: normal; line-height: normal; font-size: 100%; text-indent: 0; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0; min-height: 0; border: 0; padding: 0; margin: 0; vertical-align: middle } .hljs-light .hljs { display: block; padding: .5em; background-color: #f0f0f0 } .hljs-light .hljs,.hljs-light .hljs-subst,.hljs-light .hljs-tag .hljs-title,.hljs-light .lisp .hljs-title,.hljs-light .clojure .hljs-built_in,.hljs-light .nginx .hljs-title { color: #000 } .hljs-light .hljs-string,.hljs-light .hljs-title,.hljs-light .hljs-constant,.hljs-light .hljs-parent,.hljs-light .hljs-tag .hljs-value,.hljs-light .hljs-rules .hljs-value,.hljs-light .hljs-rules .hljs-value .hljs-number,.hljs-light .hljs-preprocessor,.hljs-light .hljs-pragma,.hljs-light .haml .hljs-symbol,.hljs-light .ruby .hljs-symbol,.hljs-light .ruby .hljs-symbol .hljs-string,.hljs-light .hljs-aggregate,.hljs-light .hljs-template_tag,.hljs-light .django .hljs-variable,.hljs-light .smalltalk .hljs-class,.hljs-light .hljs-addition,.hljs-light .hljs-flow,.hljs-light .hljs-stream,.hljs-light .bash .hljs-variable,.hljs-light .apache .hljs-tag,.hljs-light .apache .hljs-cbracket,.hljs-light .tex .hljs-command,.hljs-light .tex .hljs-special,.hljs-light .erlang_repl .hljs-function_or_atom,.hljs-light .asciidoc .hljs-header,.hljs-light .markdown .hljs-header,.hljs-light .coffeescript .hljs-attribute { color: #800 } .hljs-light .smartquote,.hljs-light .hljs-comment,.hljs-light .hljs-annotation,.hljs-light .hljs-template_comment,.hljs-light .diff .hljs-header,.hljs-light .hljs-chunk,.hljs-light .asciidoc .hljs-blockquote,.hljs-light .markdown .hljs-blockquote { color: #888 } .hljs-light .hljs-number,.hljs-light .hljs-date,.hljs-light .hljs-regexp,.hljs-light .hljs-literal,.hljs-light .hljs-hexcolor,.hljs-light .smalltalk .hljs-symbol,.hljs-light .smalltalk .hljs-char,.hljs-light .go .hljs-constant,.hljs-light .hljs-change,.hljs-light .lasso .hljs-variable,.hljs-light .makefile .hljs-variable,.hljs-light .asciidoc .hljs-bullet,.hljs-light .markdown .hljs-bullet,.hljs-light .asciidoc .hljs-link_url,.hljs-light .markdown .hljs-link_url { color: #080 } .hljs-light .hljs-label,.hljs-light .hljs-javadoc,.hljs-light .ruby .hljs-string,.hljs-light .hljs-decorator,.hljs-light .hljs-filter .hljs-argument,.hljs-light .hljs-localvars,.hljs-light .hljs-array,.hljs-light .hljs-attr_selector,.hljs-light .hljs-important,.hljs-light .hljs-pseudo,.hljs-light .hljs-pi,.hljs-light .haml .hljs-bullet,.hljs-light .hljs-doctype,.hljs-light .hljs-deletion,.hljs-light .hljs-envvar,.hljs-light .hljs-shebang,.hljs-light .apache .hljs-sqbracket,.hljs-light .nginx .hljs-built_in,.hljs-light .tex .hljs-formula,.hljs-light .erlang_repl .hljs-reserved,.hljs-light .hljs-prompt,.hljs-light .asciidoc .hljs-link_label,.hljs-light .markdown .hljs-link_label,.hljs-light .vhdl .hljs-attribute,.hljs-light .clojure .hljs-attribute,.hljs-light .asciidoc .hljs-attribute,.hljs-light .lasso .hljs-attribute,.hljs-light .coffeescript .hljs-property,.hljs-light .hljs-phony { color: #88f } .hljs-light .hljs-keyword,.hljs-light .hljs-id,.hljs-light .hljs-title,.hljs-light .hljs-built_in,.hljs-light .hljs-aggregate,.hljs-light .css .hljs-tag,.hljs-light .hljs-javadoctag,.hljs-light .hljs-phpdoc,.hljs-light .hljs-yardoctag,.hljs-light .smalltalk .hljs-class,.hljs-light .hljs-winutils,.hljs-light .bash .hljs-variable,.hljs-light .apache .hljs-tag,.hljs-light .go .hljs-typename,.hljs-light .tex .hljs-command,.hljs-light .asciidoc .hljs-strong,.hljs-light .markdown .hljs-strong,.hljs-light .hljs-request,.hljs-light .hljs-status { font-weight: bold } .hljs-light .asciidoc .hljs-emphasis,.hljs-light .markdown .hljs-emphasis { font-style: italic } .hljs-light .nginx .hljs-built_in { font-weight: normal } .hljs-light .coffeescript .javascript,.hljs-light .javascript .xml,.hljs-light .lasso .markup,.hljs-light .tex .hljs-formula,.hljs-light .xml .javascript,.hljs-light .xml .vbscript,.hljs-light .xml .css,.hljs-light .xml .hljs-cdata { opacity: .5 } .hljs-dark { background: #f6f6f6 } .hljs-dark .hljs { display: block; padding: .5em; background: #23241f } .hljs-dark .hljs,.hljs-dark .hljs-tag,.hljs-dark .css .hljs-rules,.hljs-dark .css .hljs-value,.hljs-dark .css .hljs-function .hljs-preprocessor,.hljs-dark .hljs-pragma { color: #f8f8f2 } .hljs-dark .hljs-strongemphasis,.hljs-dark .hljs-strong,.hljs-dark .hljs-emphasis { color: #a8a8a2 } .hljs-dark .hljs-bullet,.hljs-dark .hljs-blockquote,.hljs-dark .hljs-horizontal_rule,.hljs-dark .hljs-number,.hljs-dark .hljs-regexp,.hljs-dark .alias .hljs-keyword,.hljs-dark .hljs-literal,.hljs-dark .hljs-hexcolor { color: #ae81ff } .hljs-dark .hljs-tag .hljs-value,.hljs-dark .hljs-code,.hljs-dark .hljs-title,.hljs-dark .css .hljs-class,.hljs-dark .hljs-class .hljs-title:last-child { color: #a6e22e } .hljs-dark .hljs-link_url { font-size: 80% } .hljs-dark .hljs-strong,.hljs-dark .hljs-strongemphasis { font-weight: bold } .hljs-dark .hljs-emphasis,.hljs-dark .hljs-strongemphasis,.hljs-dark .hljs-class .hljs-title:last-child { font-style: italic } .hljs-dark .hljs-keyword,.hljs-dark .hljs-function,.hljs-dark .hljs-change,.hljs-dark .hljs-winutils,.hljs-dark .hljs-flow,.hljs-dark .lisp .hljs-title,.hljs-dark .clojure .hljs-built_in,.hljs-dark .nginx .hljs-title,.hljs-dark .tex .hljs-special,.hljs-dark .hljs-header,.hljs-dark .hljs-attribute,.hljs-dark .hljs-symbol,.hljs-dark .hljs-symbol .hljs-string,.hljs-dark .hljs-tag .hljs-title,.hljs-dark .hljs-value,.hljs-dark .alias .hljs-keyword:first-child,.hljs-dark .css .hljs-tag,.hljs-dark .css .unit,.hljs-dark .css .hljs-important { color: #f92672 } .hljs-dark .hljs-function .hljs-keyword,.hljs-dark .hljs-class .hljs-keyword:first-child,.hljs-dark .hljs-constant,.hljs-dark .css .hljs-attribute { color: #66d9ef } .hljs-dark .hljs-variable,.hljs-dark .hljs-params,.hljs-dark .hljs-class .hljs-title { color: #f8f8f2 } .hljs-dark .hljs-string,.hljs-dark .css .hljs-id,.hljs-dark .hljs-subst,.hljs-dark .haskell .hljs-type,.hljs-dark .ruby .hljs-class .hljs-parent,.hljs-dark .hljs-built_in,.hljs-dark .sql .hljs-aggregate,.hljs-dark .django .hljs-template_tag,.hljs-dark .django .hljs-variable,.hljs-dark .smalltalk .hljs-class,.hljs-dark .django .hljs-filter .hljs-argument,.hljs-dark .smalltalk .hljs-localvars,.hljs-dark .smalltalk .hljs-array,.hljs-dark .hljs-attr_selector,.hljs-dark .hljs-pseudo,.hljs-dark .hljs-addition,.hljs-dark .hljs-stream,.hljs-dark .hljs-envvar,.hljs-dark .apache .hljs-tag,.hljs-dark .apache .hljs-cbracket,.hljs-dark .tex .hljs-command,.hljs-dark .hljs-prompt,.hljs-dark .hljs-link_label,.hljs-dark .hljs-link_url { color: #e6db74 } .hljs-dark .hljs-comment,.hljs-dark .hljs-javadoc,.hljs-dark .java .hljs-annotation,.hljs-dark .python .hljs-decorator,.hljs-dark .hljs-template_comment,.hljs-dark .hljs-pi,.hljs-dark .hljs-doctype,.hljs-dark .hljs-deletion,.hljs-dark .hljs-shebang,.hljs-dark .apache .hljs-sqbracket,.hljs-dark .tex .hljs-formula { color: #75715e } .hljs-dark .coffeescript .javascript,.hljs-dark .javascript .xml,.hljs-dark .tex .hljs-formula,.hljs-dark .xml .javascript,.hljs-dark .xml .vbscript,.hljs-dark .xml .css,.hljs-dark .xml .hljs-cdata,.hljs-dark .xml .php,.hljs-dark .php .xml { opacity: .5 } code { color: #c7254e; background-color: #f9f2f4 } h1,h2,h3,h4,h5,h6 { font-weight: bold; margin: 1.2em 0 .6em 0 } blockquote h1,blockquote h2,blockquote h3,blockquote h4,blockquote h5,blockquote h6 { font-weight: bold; margin: .6em 0 } .note-tags { color: rgba(44,63,81,0.3) } .note-tags code { color: rgba(44,63,81,0.5); background: rgba(102,128,153,0.075); padding: 2px 5px } .note-tags code:empty { display: none } .note-tags .notebook { background: rgba(44,63,81,0.3); color: #fff; margin-right: 6px } table th,table td,table thead:first-child tr:first-child th { padding: .5em; border: 1px solid #ddd; line-height: 1.5 } .note-content { line-height: 1.5; color: #2c3f51 } .note-content div,.note-content dl,.note-content dt,.note-content em,.note-content font,.note-content h3,.note-content h4,.note-content h5,.note-content h6,.note-content hr,.note-content i,.note-content ins,.note-content kbd,.note-content li,.note-content map,.note-content ol,.note-content p,.note-content pre,.note-content q,.note-content s,.note-content samp,.note-content small,.note-content span,.note-content strike,.note-content strong,.note-content sub,.note-content sup,.note-content table,.note-content tbody,.note-content td,.note-content tfoot,.note-content th,.note-content thead,.note-content tr,.note-content tt,.note-content u,.note-content ul { line-height: 1.6 } .image-broken-replacement { text-align: center; font-style: italic; padding: 8px; color: rgba(102,128,153,0.6); background-color: rgba(102,128,153,0.075) } th[align="center"] { text-align: center } th[align="right"] { text-align: right } .image-caption { font-size: .86em; margin-top: .6em; margin-bottom: 0 } .alertify,.alertify-show,.alertify-log { } .alertify-hide { } .alertify-log-hide { } .alertify-cover { position: fixed; z-index: 99999; top: 0; right: 0; bottom: 0; left: 0; background-color: #fff; opacity: 0 } .alertify-cover-hidden { display: none } .alertify { position: fixed; z-index: 99999; top: 50px; left: 50%; width: 550px; margin-left: -275px; opacity: 1 } .alertify-hidden { opacity: 0; display: none } :root *>.alertify-hidden { display: block; visibility: hidden } .alertify-logs { position: fixed; z-index: 5000; bottom: 10px; right: 10px; width: 300px } .alertify-logs-hidden { display: none } .alertify-log { display: block; margin-top: 10px; position: relative; right: -300px; opacity: 0 } .alertify-log-show { right: 0; opacity: 1 } .alertify-log-hide { opacity: 0 } .alertify-dialog { padding: 25px } .alertify-resetFocus { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px } .alertify-inner { text-align: center } .alertify-text { margin-bottom: 15px; width: 100%; font-size: 100% } .alertify-isHidden { display: none } .alertify,.alertify-log { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, Song, sans-serif } .alertify { background: #fff; border: 1px solid #dee6ed; width: 398px; margin-left: -200px } .alertify-dialog { padding: 0 } .alertify-inner { text-align: left } .alertify-message { padding: 15px; margin: 0 } .alertify-text-wrapper { padding: 0 15px } .alertify-text { display: block; width: 100%; height: 42px; padding: 6px 12px; font-size: 15px; line-height: 1.45; color: #2c3f51; vertical-align: middle; background-color: #fff; background-image: none; border: 1px solid #dee6ed } .alertify-text:focus:focus { border-color: #66afe9; outline: 0 } .alertify-text:focus:focus { border-color: #dee6ed; outline: 0 } .alertify-text:focus:focus { border-color: rgba(25,128,230,0.5); outline: 0 } .alertify-buttons { padding: 14px 15px 15px; background: #f6f7f9; border-top: 1px solid #ebf0f4; text-align: right } .alertify-button { margin-left: 10px } .alertify-button-cancel,.alertify-button-ok { display: inline-block; margin-bottom: 0; font-weight: normal; text-align: center; vertical-align: middle; cursor: pointer; background-image: none; border: 1px solid transparent; white-space: nowrap; padding: 6px 12px; font-size: 15px; line-height: 1.45 } .alertify-button-cancel:focus,.alertify-button-ok:focus { outline: 5px auto -webkit-focus-ring-color } .alertify-button-cancel:hover,.alertify-button-ok:hover,.alertify-button-cancel:focus,.alertify-button-ok:focus { color: #425e7b; text-decoration: none } .alertify-button-cancel:active,.alertify-button-ok:active,.alertify-button-cancel.active,.alertify-button-ok.active { outline: 0; background-image: none } .alertify-button-cancel { color: #425e7b; background-color: rgba(0,0,0,0); border-color: rgba(0,0,0,0) } .alertify-button-cancel:hover,.alertify-button-cancel:focus,.alertify-button-cancel:active,.alertify-button-cancel.active,.open .dropdown-toggle.alertify-button-cancel { color: #425e7b; background-color: rgba(0,0,0,0); border-color: rgba(0,0,0,0) } .alertify-button-cancel:active,.alertify-button-cancel.active,.open .dropdown-toggle.alertify-button-cancel { background-image: none } .alertify-button-cancel.disabled,.alertify-button-cancel[disabled],fieldset[disabled] .alertify-button-cancel,.alertify-button-cancel.disabled:hover,.alertify-button-cancel[disabled]:hover,fieldset[disabled] .alertify-button-cancel:hover,.alertify-button-cancel.disabled:focus,.alertify-button-cancel[disabled]:focus,fieldset[disabled] .alertify-button-cancel:focus,.alertify-button-cancel.disabled:active,.alertify-button-cancel[disabled]:active,fieldset[disabled] .alertify-button-cancel:active,.alertify-button-cancel.disabled.active,.alertify-button-cancel[disabled].active,fieldset[disabled] .alertify-button-cancel.active { background-color: rgba(0,0,0,0); border-color: rgba(0,0,0,0) } .alertify-button-cancel .badge { color: rgba(0,0,0,0); background-color: #fff } .alertify-button-ok { color: #425e7b; background-color: #e4ebf1; border-color: rgba(0,128,255,0.05) } .alertify-button-ok:hover,.alertify-button-ok:focus,.alertify-button-ok:active,.alertify-button-ok.active,.open .dropdown-toggle.alertify-button-ok { color: #425e7b; background-color: #cad6e2; border-color: rgba(0,97,194,0.05) } .alertify-button-ok:active,.alertify-button-ok.active,.open .dropdown-toggle.alertify-button-ok { background-image: none } .alertify-button-ok.disabled,.alertify-button-ok[disabled],fieldset[disabled] .alertify-button-ok,.alertify-button-ok.disabled:hover,.alertify-button-ok[disabled]:hover,fieldset[disabled] .alertify-button-ok:hover,.alertify-button-ok.disabled:focus,.alertify-button-ok[disabled]:focus,fieldset[disabled] .alertify-button-ok:focus,.alertify-button-ok.disabled:active,.alertify-button-ok[disabled]:active,fieldset[disabled] .alertify-button-ok:active,.alertify-button-ok.disabled.active,.alertify-button-ok[disabled].active,fieldset[disabled] .alertify-button-ok.active { background-color: #e4ebf1; border-color: rgba(0,128,255,0.05) } .alertify-button-ok .badge { color: #e4ebf1; background-color: #fff } .alertify-log { background: #d9edf7; padding: 8px 14px; color: #3a8abf; border: 1px solid #bce8f1 } .alertify-log-error { color: #b94a48; background: #f2dede; border: 1px solid #eed3d7 } .alertify-log-success { color: #468847; background: #dff0d8; border: 1px solid #d6e9c6 } .tour-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1030; background-color: #000; opacity: .8 } .tour-step-backdrop { position: relative; z-index: 1031; background: inherit } .tour-step-background { position: absolute; z-index: 1030; background: inherit } .popover[class*="tour-"] { z-index: 1030 } .popover[class*="tour-"] .popover-navigation { padding: 9px 14px } .popover[class*="tour-"] .popover-navigation *[data-role="end"] { float: right } .popover[class*="tour-"] .popover-navigation *[data-role="prev"],.popover[class*="tour-"] .popover-navigation *[data-role="next"],.popover[class*="tour-"] .popover-navigation *[data-role="end"] { cursor: pointer } .popover[class*="tour-"] .popover-navigation *[data-role="prev"].disabled,.popover[class*="tour-"] .popover-navigation *[data-role="next"].disabled,.popover[class*="tour-"] .popover-navigation *[data-role="end"].disabled { cursor: default } .popover[class*="tour-"].orphan { position: fixed; margin-top: 0 } .popover[class*="tour-"].orphan .arrow { display: none } div.jGrowl { z-index: 9999; color: #fff; font-size: 12px } div.jGrowl { position: absolute } body>div.jGrowl { position: fixed } div.jGrowl.top-left { left: 0; top: 0 } div.jGrowl.top-right { right: 0; top: 0 } div.jGrowl.bottom-left { left: 0; bottom: 0 } div.jGrowl.bottom-right { right: 0; bottom: 0 } div.jGrowl.center { top: 0; width: 50%; left: 25% } div.center div.jGrowl-notification,div.center div.jGrowl-closer { margin-left: auto; margin-right: auto } div.jGrowl div.jGrowl-notification,div.jGrowl div.jGrowl-closer { background-color: #000; width: 235px; padding: 10px; margin-top: 5px; margin-bottom: 5px; font-family: Tahoma, Arial, Helvetica, sans-serif; font-size: 1em; text-align: left; display: none } div.jGrowl div.jGrowl-notification { min-height: 40px } div.jGrowl div.jGrowl-notification,div.jGrowl div.jGrowl-closer { margin: 10px } div.jGrowl div.jGrowl-notification div.jGrowl-header { font-weight: bold; font-size: .85em } div.jGrowl div.jGrowl-notification div.jGrowl-close { z-index: 99; float: right; font-weight: bold; font-size: 1em; cursor: pointer } div.jGrowl div.jGrowl-closer { padding-top: 4px; padding-bottom: 4px; cursor: pointer; font-size: .9em; font-weight: bold; text-align: center } .animate-spin { display: inline-block } .toast-title { font-weight: bold } .toast-message { } .toast-message a,.toast-message label { color: #fff } .toast-message a:hover { color: #ccc; text-decoration: none } .toast-close-button { position: relative; right: -0.3em; top: -0.3em; float: right; font-size: 20px; font-weight: bold; color: #fff; opacity: .8 } .toast-close-button:hover,.toast-close-button:focus { color: #000; text-decoration: none; cursor: pointer; opacity: .4 } button.toast-close-button { padding: 0; cursor: pointer; background: transparent; border: 0 } .toast-top-full-width { top: 0; right: 0; width: 100% } .toast-bottom-full-width { bottom: 0; right: 0; width: 100% } .toast-top-left { top: 12px; left: 12px } .toast-top-right { top: 12px; right: 12px } .toast-bottom-right { right: 30px; bottom: 10px } .toast-bottom-left { bottom: 12px; left: 12px } #toast-container { position: fixed; z-index: 999999 } #toast-container.toast-top-full-width>div,#toast-container.toast-bottom-full-width>div { width: 96%; margin: auto } .toast { margin: 0 0 6px; padding: 8px; padding-left: 50px; min-width: 200px } .toast { background-image: none !important } .toast::before { position: fixed; font-family: fontello; font-size: 24px; line-height: 22px; float: left; padding-right: .5em; margin: auto .5em auto -1.5em } .toast-warning::before { content: "" } .toast-error::before { content: "" } .toast-info::before { content: "" } .toast-success::before { content: "" } .toast-wait::before { content: "?" } .toast { border: 2px solid #000; color: #030303; background-color: rgba(120,120,120,0.9) } .toast-success { border: 2px solid #499249; color: #51a351; background-color: rgba(234,245,234,0.9) } .toast-error { border: 2px solid #a9302a; color: #bd362f; background-color: rgba(247,225,223,0.9) } .toast-info { border: 2px solid #2a85a0; color: #2f96b4; background-color: rgba(217,239,245,0.9) } .toast-warning { border: 2px solid #b9751d; color: #cf8321; background-color: rgba(250,239,224,0.9) } .toast-wait { border: none; padding: 3px 16px; color: #fff; font-size: 12px; background: none; margin: 0; width: auto; min-width: auto; position: relative } .toast-wait .toast-message { position: relative } .toast-wait::before { content: ""; background: #ed1d70; display: block; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto } body { text-align: start } * { outline: none !important } .working { cursor: progress } .dragging { cursor: move !important } .btn,.dropdown-menu { } .dropdown-menu,.modal-content,.panel-content,.search-bar,.popover,.find-replace,.alertify { } .dropdown-menu>li>a { padding: 5px 20px; border-top: 1px solid transparent; border-bottom: 1px solid transparent } .dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus { border-color: #475160 } .dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus { border-color: transparent } .collapsed>.icon-up-dir::before { content: "?" } .modal.fade .modal-dialog { } .modal-content { background-color: #f6f7f9 } .modal-body { background-color: #fff; padding-bottom: 30px } .modal-footer { margin-top: 0 } .modal-iframe { display: block; margin: 30px auto 0; z-index: 1040 } a { } .nav-pills>li>a { border: 1px solid rgba(0,0,0,0) } .nav-pills>li>a:hover,.nav-pills>li>a:focus { color: #036; border-color: #475160 } .nav-pills>li.open>a .caret,.nav-pills>li>a:hover .caret,.nav-pills>li>a:focus .caret { border-top-color: #036; border-bottom-color: #036 } .nav-pills>li.disabled>a:hover,.nav-pills>li.disabled>a:focus { border-color: rgba(0,0,0,0) } .nav-pills>li.open>a,.nav-pills>li.open>a:hover,.nav-pills>li.open>a:focus { color: #036; border-color: #475160 } .list-group-item { padding: 10px 15px; border-left-width: 0; border-right-width: 0; margin-bottom: 0 } .list-group .list-group-item { } a.list-group-item:hover,a.list-group-item:focus { color: #036; border-color: #475160 } .list-group-item .checkbox { float: right; margin: 0; padding: 0; cursor: pointer } .list-group-item .checkbox input { cursor: pointer; margin: 0 16px; height: 38px } .form-group { margin-bottom: 1px; padding: 5px } .text-danger:hover { color: #d82a1a } .bring-to-front { z-index: 1050 !important } .dialog-header-message { position: absolute; top: 12px; right: 55px; font-weight: bold } .btn { padding: 8px 11px } .btn-default:hover,.alertify-button-cancel:hover,.btn-default:focus,.alertify-button-cancel:focus,.btn-default:active,.alertify-button-cancel:active,.open .btn-default.dropdown-toggle,.open .alertify-button-cancel.dropdown-toggle { color: #036; border-color: rgba(0,128,255,0.1); background-color: rgba(102,128,153,0.04) !important } .btn-primary:hover,.alertify-button-ok:hover,.btn-primary:focus,.alertify-button-ok:focus,.btn-primary:active,.alertify-button-ok:active,.open .btn-primary.dropdown-toggle,.open .alertify-button-ok.dropdown-toggle { color: #036; border-color: rgba(0,128,255,0.1); background-color: #dae3eb !important } .btn-success:hover,.btn-success:focus,.btn-success:active,.open .btn-success.dropdown-toggle { color: #036 !important; border-color: rgba(0,128,255,0.1); background-color: rgba(89,128,166,0.05) !important } .btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.info-tooltip,.info-tooltip .btn-info,.open .btn-info.dropdown-toggle { color: #036; border-color: rgba(0,128,255,0.08); background-color: #f0f2f5 !important } .btn-link:hover { text-decoration: none } .btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group { margin-left: 0 } .btn-group>.btn+.dropdown-toggle { padding-right: 11px; padding-left: 11px } .form-control { } .form-inline * { float: none } .form-control.error { border-color: #e84c3d } .help-block { font-size: 12px } .input-group-addon { } a.input-group-addon { color: #1980e6 } .input-group-btn .btn i { font-size: 110% } .input-group-btn:first-child .btn { margin-right: 6px } .input-group-btn:last-child .btn { margin-left: 6px } .navbar { position: absolute; top: 0; left: 0; width: 100%; padding: 0; border: 0; border-top: 1px solid rgba(0,128,255,0.1); border-bottom: 1px solid rgba(0,128,255,0.1); z-index: 20 } .navbar .left-space,.navbar .right-space { width: 25px; height: 38px } .navbar .nav { float: left; margin: 5px 9px; height: 38px } .navbar .nav>li { display: inline-block } .navbar .nav.pull-right { float: right } .navbar .nav.pull-right>li>.dropdown-menu { right: 0; left: auto } .navbar .nav.pull-right>li>.dropdown-menu .dropdown-menu { right: 100%; left: auto; margin-right: -1px; margin-left: 0 } .navbar .btn { height: 38px; padding: 6px 8px } .navbar .btn-group>.btn.disabled *,.navbar .btn-group>.btn.blocked *,.navbar .btn-group>.btn[disabled] * { color: rgba(54,77,99,0.3) } .navbar .button-open-discussion.some { color: #e0b800 !important } .navbar .button-open-discussion.replied { color: #e74434 !important } .navbar .file-title-navbar { display: inline-block; vertical-align: middle; padding: 1px 15px; font-size: 1.5em; line-height: 1.45em; font-weight: 200; overflow: hidden; white-space: nowrap } .navbar .file-title-navbar a i { } .navbar .file-title-navbar a .icon-link-ext-alt { color: transparent; position: relative; font-size: 12px; top: -12px; right: 6px; width: 0 } .navbar .file-title-navbar a:hover [class^="icon-provider-"],.navbar .file-title-navbar a:hover [class*=" icon-provider-"] { opacity: .5 } .navbar .file-title-navbar a:hover .icon-link-ext-alt { color: #036 } .navbar .input-file-title-container { display: inline-block; vertical-align: middle } .navbar .input-file-title-container .input-file-title { width: 400px; font-size: 16px; height: 38px } .navbar .working-indicator { display: inline-block; vertical-align: middle; overflow: hidden; height: 38px; width: 60px; padding-top: 8px } .navbar .working-indicator .bar { display: inline-block; width: 14px; height: 6px; margin: 0 2px; opacity: .25; background-color: rgba(54,77,99,0.75) } .navbar .offline-status>div { display: inline-block; vertical-align: middle; height: 38px; padding: 9px 10px } .navbar .buttons-dropdown>.nav { margin-left: 0; margin-right: 0 } .navbar div.dropdown-menu { top: initial; padding: 5px; margin: 10px } .menu-panel,.document-panel { height: 100%; z-index: 30; overflow: initial } .menu-panel .toggle-button,.document-panel .toggle-button { background-color: #fff; height: 38px; position: absolute; margin-top: 6px } .menu-panel .toggle-button:active,.document-panel .toggle-button:active { } .menu-panel .toggle-button i,.document-panel .toggle-button i { color: #737373; font-size: 14px } .menu-panel .toggle-button:hover,.document-panel .toggle-button:hover,.menu-panel.panel-open>.toggle-button,.document-panel.panel-open>.toggle-button { border-width: 1px } .menu-panel .panel-content,.document-panel .panel-content { overflow: auto; padding-bottom: 30px; height: 100% } .menu-panel .panel-content a>i,.document-panel .panel-content a>i { color: inherit } .menu-panel { position: absolute; top: 0; right: 0; width: 320px } .menu-panel i { margin-right: 8px } .menu-panel small { color: rgba(129,158,187,0.6); padding-left: 30px } .menu-panel .nav { margin: 10px 0 20px } .menu-panel .nav>li>a:hover,.menu-panel .nav>li>a:focus { background-color: rgba(0,0,0,0) } .menu-panel .alert { padding: 10px; margin-left: -10px; margin-right: -10px } .menu-panel .toggle-button { border-top: 4px solid rgba(255,230,0,0.9); border-right: 5px solid rgba(117,183,253,0.9); border-bottom: 4px solid rgba(255,138,0,0.9); right: -37px; z-index: -1; padding: 0 10px 0 50px } .menu-panel .toggle-button:hover,.menu-panel.panel-open>.toggle-button { right: -45px } .menu-panel .panel-content { background-color: #f6f7f9; padding-top: 6px; border-right: 1px solid #ebf0f4 } .document-panel { position: absolute; top: 0; left: 0; width: 380px } .document-panel .toggle-button { border-top: 4px solid rgba(255,230,0,0.9); border-left: 5px solid rgba(187,213,0,0.9); border-bottom: 4px solid rgba(255,138,0,0.9); left: -37px; padding: 0 50px 0 3px; z-index: -1 } .document-panel .toggle-button i.icon-folder-open { font-size: 19px; padding-bottom: 1px } .document-panel .toggle-button:hover,.document-panel.panel-open>.toggle-button { left: -45px } .document-panel .panel-content { background-color: #f6f7f9; padding-top: 210px; border-left: 1px solid #ebf0f4 } .viewer .document-panel .panel-content { padding-top: 75px } .document-panel .panel-content .icon-layers { font-size: 135% } .document-panel .search-bar { position: absolute; background-color: #475160; margin: -10px 25px 0; padding: 15px 20px; z-index: 3; border: 1px solid #dee6ed } .document-panel .search-bar .nav { margin-bottom: 10px } .document-panel .search-bar .nav>li>a { padding: 8px 15px } .document-panel .search-bar .nav>li>a:hover,.document-panel .search-bar .nav>li>a:focus { background-color: rgba(0,0,0,0) } .document-panel .list-group-item { margin: 0 } .document-panel .folder { font-weight: bold; color: #425e7b; border-top-color: #f2f5f8 } .document-panel .list-group { margin: 0 } .document-panel .list-group .nav { border: 0; margin: 0 } .document-panel .list-group .nav .file { padding-left: 30px; padding-right: 30px } .dropdown-file-selector { top: 6px; right: 45px; left: auto; margin: 0; min-width: 280px; max-width: 400px; max-height: 400px } .modal-document-manager { margin-bottom: 0 } .modal-document-manager .nav-pills { margin-bottom: 15px } .modal-document-manager .list-group .nav { margin-bottom: 30px; border: 0; margin: 0 } .modal-document-manager .list-group .nav .file { padding-left: 20px } .modal-document-manager .file-list .list-group-item { background-color: rgba(0,0,0,0); padding: 0 3px } .modal-document-manager .input-rename { width: 220px; height: 38px } .modal .list-group .list-group-item { } .modal .list-group-item { padding: 3px; margin: 0; border-left-width: 1px; border-right-width: 1px } .modal .list-group-item i { margin-right: 3px } .modal .list-group-item .btn { float: right; margin-right: 3px } .modal .list-group-item .btn i { margin: 0; font-size: 105% } .modal .list-group-item .btn i.icon-pencil { font-size: 115% } .modal .folder,.modal .document { font-weight: bold; color: #425e7b; font-size: 15px; background-color: rgba(0,0,0,0) } .modal .name,.modal .date,.modal .file-count { padding: 9px 20px 9px 15px } .modal .name i.icon-file,.modal .name i.icon-folder { margin-right: 8px; font-size: 20px; line-height: 15px; margin-top: -2px } .modal .date { font-weight: normal } .extension-buttons>.btn-group>.btn,.extension-preview-buttons>.btn-group>.btn,.extension-buttons>.btn-group>.btn,.extension-preview-buttons>.btn-group>.btn { } .extension-buttons>.btn-group:first-child>.btn,.extension-preview-buttons>.btn-group:first-child>.btn,.extension-buttons>.btn-group:first-child>.btn,.extension-preview-buttons>.btn-group:first-child>.btn { } .extension-buttons>.btn-group:last-child>.btn,.extension-preview-buttons>.btn-group:last-child>.btn,.extension-buttons>.btn-group:last-child>.btn,.extension-preview-buttons>.btn-group:last-child>.btn { } .extension-preview-buttons { position: absolute; right: 0; bottom: 0; z-index: 40; background-color: #e4ebf1; border: 1px solid #cfdae5; cursor: move } .extension-preview-buttons.animate { } .extension-preview-buttons .btn-group .btn { position: initial; border: 0 } .extension-preview-buttons .dropdown-menu { margin-top: 6px; margin-bottom: 6px; padding-bottom: 20px } .extension-preview-buttons hr { margin: 0 } .extension-preview-buttons .markdown-syntax,.extension-preview-buttons .table-of-contents { padding-right: 20px; margin-right: -20px; width: 330px } .extension-preview-buttons .markdown-syntax { white-space: normal } .extension-preview-buttons .table-of-contents { padding: 20px 0 15px; margin-left: -10px } .extension-preview-buttons .table-of-contents ul { margin-left: 10px; padding-left: 10px } .extension-preview-buttons .stat-button .value { vertical-align: text-top } .extension-preview-buttons .drag-me { color: #364d63 } .extension-preview-buttons .drag-me i::before { width: 5px } .modal-settings .modal-header { padding-bottom: 0 } .modal-settings textarea { max-width: 100%; min-height: 100px } .modal-settings .panel { border: 0; background: #fff; border-bottom: 1px solid #f2f5f8 } .modal-settings .accordion-heading { padding: 12px 15px } .modal-settings .accordion-heading .checkbox { margin-top: 0; margin-bottom: 0 } .modal-settings .accordion-inner { border: 0; padding: 10px 40px 20px } .modal-settings .accordion-inner .form-horizontal .control-label { text-align: left } .modal-settings .accordion-inner .form-horizontal .form-inline .label-text { margin-left: 15px } .modal-settings .tab-pane-button-container { width: 220px; margin: 10px auto 20px } .modal-settings .tab-pane-button-container .btn { text-align: start; padding-left: 15px } .modal-settings .nav-tabs { margin: 15px 0 0 } .modal-settings .nav-tabs>li>a:hover,.modal-settings .nav-tabs>li>a:focus { color: #036; border-color: rgba(0,128,255,0.1); background-color: rgba(102,128,153,0.04); border-bottom-color: rgba(0,0,0,0) } .modal-settings .nav-tabs>li.active>a,.modal-settings .nav-tabs>li.active>a:hover,.modal-settings .nav-tabs>li.active>a:focus { color: #2c3f51; background-color: #fff; border-color: #ebf0f4; border-bottom-color: rgba(0,0,0,0); margin-bottom: -1px; padding: 10px 15px 11px } .modal-manage-sync .sync-list,.modal-manage-publish .publish-list,.modal-manage-sharing .share-editor-list,.modal-manage-sharing .share-viewer-list { margin-bottom: 20px } .modal-manage-sync .sync-list .entry,.modal-manage-publish .publish-list .entry,.modal-manage-sharing .share-editor-list .entry,.modal-manage-sharing .share-viewer-list .entry { margin-bottom: 10px } .publish-custom-template-collapse { margin-bottom: 0 } .publish-custom-template-collapse textarea { max-width: 100%; min-height: 100px } .layout-wrapper-l1,.layout-wrapper-l2,.layout-wrapper-l3 { position: absolute; top: 0; left: 0; overflow: hidden } .layout-animate { } .layout-resizer { position: absolute; top: 0; left: 0; width: 32px; height: 32px } .layout-resizer.open { cursor: e-resize } .layout-vertical .layout-resizer.open { cursor: s-resize } .layout-toggler { position: absolute; top: 0; left: 0; padding: 0; margin: 0; width: 32px; height: 32px } .layout-toggler i { font-size: 22px } .layout-toggler.layout-toggler-preview { line-height: 55px } .layout-animate .layout-toggler.layout-toggler-preview { } .layout-toggler.layout-toggler-preview i::before { content: "?" } .layout-toggler.layout-toggler-preview.open>i::before { content: "?" } .layout-vertical .layout-toggler.layout-toggler-preview { line-height: 1.45 } .layout-vertical .layout-toggler.layout-toggler-preview i::before { content: "?" } .layout-vertical .layout-toggler.layout-toggler-preview.open>i::before { content: "?" } .layout-toggler.layout-toggler-navbar { line-height: 0 } .layout-toggler.layout-toggler-navbar i { font-size: 16px; height: 12px; overflow: hidden } #wmd-input { position: absolute; top: 0; left: 0; font-family: "PT Sans", sans-serif; line-height: 1.65; letter-spacing: normal; border: none; padding: 0; overflow: auto; white-space: pre-wrap } #wmd-input>.editor-content { padding-bottom: 230px } #wmd-input>.editor-margin { position: absolute; top: 0; left: 0 } #wmd-input>.editor-margin .discussion { font-size: 17px; position: absolute; cursor: pointer } #wmd-input>.editor-margin .discussion.new { display: none } #wmd-input>.editor-margin .discussion.new:hover,#wmd-input>.editor-margin .discussion.new.active,#wmd-input>.editor-margin .discussion.new.active:hover { display: inline-block; color: rgba(102,128,153,0.35) !important } #wmd-input>.editor-margin .discussion.added { color: rgba(235,192,0,0.7) } #wmd-input>.editor-margin .discussion.added:hover,#wmd-input>.editor-margin .discussion.added.active,#wmd-input>.editor-margin .discussion.added.active:hover { color: #ebc000 !important } #wmd-input>.editor-margin .discussion.replied { color: rgba(230,59,43,0.7) } #wmd-input>.editor-margin .discussion.replied:hover,#wmd-input>.editor-margin .discussion.replied.active,#wmd-input>.editor-margin .discussion.replied.active:hover { color: rgba(230,59,43,0.8) !important } #wmd-input>.editor-margin .discussion.icon-split { font-size: 22px } #wmd-input>.editor-margin .discussion.icon-split::before { margin-right: 0 } #wmd-input>.editor-margin .discussion:hover,#wmd-input>.editor-margin .discussion.active { text-decoration: none } #wmd-input.has-selection>.editor-margin .discussion.new { display: inline-block; color: rgba(102,128,153,0.25) } #wmd-input.font-monospaced * { font-family: "Source Code Pro", monospace !important; line-height: 1.65 !important; font-size: 1em !important } #wmd-input.ace_editor { font-family: "Source Code Pro", monospace !important } #wmd-input .comment-highlight,#wmd-input .find-replace-highlight { background-color: rgba(255,230,0,0.5) } #wmd-input .find-replace-select { background-color: #b5d5ff } #wmd-input .conflict { font-weight: bold; color: #e63b2b } #wmd-input .ace_print-margin { margin-left: -20px; background: none !important } .editor .md,.editor .hr { color: rgba(102,128,153,0.6); font-style: normal; font-weight: normal } .editor .code,.editor .pre { color: #29333d; font: normal .9em "Source Code Pro", monospace } .editor .tag { color: #29333d; font: bold .9em "Source Code Pro", monospace } .editor .tag .punctuation,.editor .tag .attr-value,.editor .tag .attr-name { font-weight: normal } .editor .latex,.editor .math { color: #668099 } .editor .entity { font: italic .9em "Source Code Pro", monospace; color: #668099 } .editor .table { font: normal .9em "Source Code Pro", monospace } .editor .table * { font-size: 1em } .editor .comment { font-size: .9em; color: rgba(102,128,153,0.6) } .editor .keyword { color: #47596b; font-weight: bold } .editor .code,.editor .img,.editor .imgref,.editor .md-toc { background-color: rgba(102,128,153,0.075); padding: .15em 0 } .editor .md-toc { font-size: 2.5em; padding: .2em } .editor .md-underlined-text { color: inherit } .editor .blockquote { color: #668099 } .editor .h1,.editor .h2,.editor .h3,.editor .h4,.editor .h5,.editor .h6 { font-weight: 600 } .editor .h1 .md-hash,.editor .h2 .md-hash,.editor .h3 .md-hash,.editor .h4 .md-hash,.editor .h5 .md-hash,.editor .h6 .md-hash { color: rgba(102,128,153,0.4) } .editor .h1,.editor .h11 { font-size: 1.7em } .editor .h2,.editor .h22 { font-size: 1.4em } .editor .h3 { font-size: 1.2em } .editor .h4 { font-size: 1.1em } .editor .h5 { font-size: 1em } .editor .h6 { font-size: .9em } .editor .em,.editor .em .md { font-style: italic } .editor .strong,.editor .strong .md { font-weight: bold } .editor .md-strike-text { text-decoration: line-through } .editor .url,.editor .email,.editor .md-underlined-text { text-decoration: underline } .editor .linkdef .url { color: rgba(102,128,153,0.6) } .editor .img,.editor .imgref { padding: .2em .4em; padding-right: 0 } .editor .md-bang,.editor .md-alt,.editor .md-title { color: #587ea4 } .editor .md-checkbox { display: inline-block; font-size: 0 } .editor .md-checkbox::before { content: "?"; font-size: 26px; vertical-align: -1px; line-height: 0; cursor: pointer } .editor .md-checkbox.checked::before { content: "?" } .editor .md-checkbox.checked+.md-checkbox-content { text-decoration: line-through } .ace_dark .md,.ace_dark .hr { color: rgba(139,158,177,0.8) } .ace_dark .code,.ace_dark .img,.ace_dark .imgref,.ace_dark .md-toc { background-color: rgba(0,0,0,0.33) } .ace_dark .tag { color: #868686 } .ace_dark .code,.ace_dark .pre { color: #868686 } .find-replace { position: absolute; bottom: 0; width: 410px; background-color: #f6f7f9; padding: 15px 20px; border-top: 1px solid #dee6ed; border-right: 1px solid #dee6ed } .find-replace .form-group { width: 180px; padding: 0 5px } .find-replace .close { position: absolute; right: 20px; top: 10px } .preview-panel { position: absolute; top: 0; left: 0; overflow: hidden; z-index: 9 } .layout-animate .preview-panel { } .layout-vertical .preview-panel { } .preview-container { position: absolute; overflow: auto } .wmd-prompt-background { display: none } div.dropdown-menu { padding: 5px 20px; background-color: #475160 } div.dropdown-menu p,div.dropdown-menu blockquote { margin: 10px 0 } div.dropdown-menu .stat { margin: 20px 0 10px } div.dropdown-menu i { margin-right: 0 } div.dropdown-menu textarea { width: 250px; height: 150px } div.dropdown-menu a:hover,div.dropdown-menu a:focus { color: #0f4d8a } div.dropdown-menu h1,div.dropdown-menu h2,div.dropdown-menu h3 { margin: 1em 0 } .title-icon-category { display: inline-block; opacity: .15; margin-top: -2px; margin-left: -2px; margin-right: 3px; font-size: 1em; vertical-align: top } .file-title-navbar .title-icon-category { font-size: 16px } .picker-dialog { z-index: 1050 !important } .picker-dialog-bg { z-index: 1040 !important } .tooltip-inner { text-align: left } .tooltip li { line-height: 1.4 } input[type="file"] { line-height: inherit; height: inherit; border: none !important } .drop-zone { border: 2px dashed #bbb; padding: 40px; text-align: center; font-size: 24px; color: #bbb } .modal-import-harddrive-html textarea { width: 530px; max-width: 530px; height: 120px } .label.comment { white-space: inherit } .sharing-tweet { float: left; margin: 5px 10px 0 0 } .popover { max-width: 350px; padding: 15px } .popover .popover-title { font-weight: 300; font-size: 24px; padding: 10px 15px } .popover .disabled { display: none } .popover iframe { position: absolute } .comments-popover .popover { max-width: 230px; padding: 10px 20px 0 } .comments-popover .popover .popover-title { padding: 5px 0 15px; border-bottom: 1px solid rgba(102,128,153,0.1); line-height: 1.1; overflow: hidden } .comments-popover .popover .popover-title .action-remove-discussion { font-size: 16px; line-height: 22px } .comments-popover .popover .popover-content { margin: 0; padding: 0 } .comments-popover .popover .popover-content .scrollport { overflow: auto; max-height: 230px; padding: 10px 20px 0; margin: 0 -20px } .comments-popover .popover .popover-content .btn { padding: 6px 11px } .comments-popover .popover .popover-content .comment-block { margin-bottom: 5px } .comments-popover .popover .popover-content .form-group,.comments-popover .popover .popover-content blockquote { margin-bottom: 10px; padding: 0 } .comments-popover .popover .popover-content .comment-author { font-weight: bold; color: #2c3f51 } .comments-popover .popover .popover-content .icon-comment { font-size: 15px; color: rgba(235,192,0,0.6) } .comments-popover .popover .popover-content .reply .icon-comment { color: rgba(230,59,43,0.7) } .comments-popover .popover .popover-content .new-comment-block .icon-comment { color: rgba(102,128,153,0.35) } .comments-popover .popover .popover-content .input-comment-author { border: none; background: none; font-weight: bold; height: 28px; padding: 0 0 5px; width: 140px; display: inline-block } .comments-popover .popover .popover-content hr { margin: 0 0 10px } .comments-popover .popover.top .arrow,.comments-popover .popover.bottom .arrow { margin-right: 1px; border-right-width: 0 } .comments-popover .popover.top .arrow::after,.comments-popover .popover.bottom .arrow::after { margin-left: -11px; border-right-width: 0 } .comments-popover .popover.top .arrow::after { bottom: 2px } .comments-popover .popover.bottom .arrow::after { top: 2px } div.jGrowl { z-index: 1040; font-size: 14px } div.jGrowl.bottom-right { right: 35px } div.jGrowl div.jGrowl-notification,div.jGrowl div.jGrowl-closer { background-color: rgba(115,128,140,0.9); width: 240px; margin: 6px 0; padding: 10px 12px; font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, Song, sans-serif } div.jGrowl div.jGrowl-notification { min-height: 65px } .viewer .document-panel .search-bar { padding: 20px 20px 10px } .viewer .document-panel .search-bar .input-group-btn { display: none } .viewer .navbar .file-title-navbar { cursor: initial } .layout-toggler { display: none } .editor-navbar { position: absolute; z-index: 10; right: 50%; background: none !important; margin-top: 6px; margin-right: 20px } .editor-navbar .editor-navbar-bg { width: 100%; height: 100%; position: absolute; left: 0; top: 0; opacity: .8 } .editor-navbar .btn { color: inherit; opacity: .5 } .editor-navbar .btn:hover { opacity: .9 } .editor-navbar .btn:active,.editor-navbar .btn:focus { color: inherit !important } .editor-navbar .btn-success:hover,.editor-navbar .btn-success:focus,.editor-navbar .btn-success:active,.editor-navbar .btn-success.active,.editor-navbar .open .dropdown-toggle.btn-success { color: inherit !important } .preview-buttons-container .btn { color: rgba(102,128,153,0.35) } .preview-buttons-container .btn:hover,.preview-buttons-container .btn:active,.preview-buttons-container .btn:focus { color: #036 } .preview-buttons-container .btn,.editor-navbar-buttons .btn { font-size: 16px } .editor-navbar-buttons>.btn-group { display: inline-block } .wmd-buttons-group { display: inline-block } .wmd-buttons-group .wmd-button-group1 { opacity: 0 } .wmd-buttons-group .wmd-button-group1 li { display: none } .wmd-buttons-group:hover .wmd-button-group1 { opacity: 1; visibility: visible } .wmd-buttons-group:hover .wmd-button-group1 li { display: block } .shrink-editor-btn { display: none } .file-status-lock { display: none } .resize-editor-btn { position: fixed; right: 50%; bottom: 10px; margin-right: 20px } .open-folder-btn { background: none; border: 2px solid; padding: 1px 4px; left: -5px; top: 6px; position: absolute; border-color: currentColor; opacity: .5; z-index: 10; color: inherit } .open-folder-btn:hover { color: inherit; opacity: .9 } .profile-btn { top: 10px; background: none; padding: 3px; border: 2px solid rgba(102,128,153,0.35); border-color: currentColor; margin-left: 10px } .profile-btn:hover { border-color: currentColor } .preview-buttons-container { position: absolute; z-index: 100; margin-top: 6px; right: 20px } .ui-layout-resizer-south-closed .preview-buttons-container { display: none !important } .preview-buttons-container .btn-group .btn { position: initial } .preview-buttons-container .dropdown-menu { padding-bottom: 20px } .preview-buttons-container .markdown-syntax,.preview-buttons-container .table-of-contents { padding-right: 20px; margin-right: -20px; width: 330px } .preview-buttons-container .markdown-syntax { white-space: normal; max-height: 350px } .preview-buttons-container .table-of-contents { margin-left: -10px; max-height: 400px } .preview-buttons-container .table-of-contents ul { margin-left: 10px; padding-left: 10px } #theme-list { max-height: 500px } .editor-hosted-buttons { display: inline-block } #app_wrap.no-preview .preview-buttons { display: inline-block } .preview-buttons { padding-right: 10px } .full-editor-btn.open .icon-resize-full { display: inline-block } .full-editor-btn.open .icon-resize-small-1 { display: none } .full-editor-btn .icon-resize-full { display: none } .full-editor-btn .icon-resize-small-1 { display: inline-block } #app_wrap.no-preview .editor-navbar { right: 20px; margin-right: 0 } .dropdown-menu { background-color: #546072; border-color: #3e4755 } .dropdown-menu>li>a { color: #eee; padding: 5px 20px; border-top: 1px solid transparent; border-bottom: 1px solid transparent } .dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus { color: #eee; background-color: #4b5666; border-color: #475160 } .dropdown-menu>li>a.selected { background: #74b936 !important; color: #fff !important } .dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus { border-color: transparent } .menu-panel .panel-content,.document-panel .panel-content { background-color: #546072 } .modal-content,.panel-content { } .document-panel .panel-content { border-left: none } .menu-panel .panel-content { border-right: none } .list-group .nav { border-left: 10px solid #e4ebf1; margin-left: 15px } .list-group .nav>li>a { border-top: 1px solid rgba(0,0,0,0); border-bottom: 1px solid rgba(0,0,0,0) } .list-group .nav>li>a:hover,.list-group .nav>li>a:focus { border-top-color: #475160; border-bottom-color: #475160 } .list-group .nav>li>a.active { border-top-color: rgba(0,128,255,0.05); border-bottom-color: rgba(0,128,255,0.05) } .list-group .nav>li:focus { outline: none } .list-group .nav>li.active>a { background: #4b5666; border-top-color: rgba(0,128,255,0.05); border-bottom-color: rgba(0,128,255,0.05) } .nav-pills>li>a { border: 1px solid rgba(0,0,0,0) } .nav-pills>li>a:hover,.nav-pills>li>a:focus { border-color: #475160 } .nav-pills>li.disabled>a:hover,.nav-pills>li.disabled>a:focus { border-color: rgba(0,0,0,0) } .nav-pills>li.open>a,.nav-pills>li.open>a:hover,.nav-pills>li.open>a:focus { border-color: #475160 } .list-group-item { padding: 10px 15px; margin-bottom: 0 } .list-group .list-group-item { background: #546072 } .list-group-item:hover { border-top-color: #475160; border-bottom-color: #475160; background: #4b5666 !important } .list-group-item:focus,.active>.list-group-item { border-top-color: #475160; border-bottom-color: #475160; background: #3a424f !important } a.list-group-item { } a.list-group-item:hover,a.list-group-item:focus { color: #eee } .username { padding: 10px 20px; background: #454f5d; color: #fff; margin-top: -6px } .vip-status { float: right; background: #74b936; color: #fff; padding: 2px; cursor: pointer } .vip-status .renew { padding: 0 6px; display: none } .vip-status:hover .renew { display: inline } .vip-status.expired { background: #ccc } .vip-status .icon { margin-right: 0 } .menu-panel i { margin-right: 2px } .menu-panel .sub-menu,.document-panel .sub-menu { background: #4b5666 } .menu-panel .sub-menu a,.document-panel .sub-menu a { color: #eee } .menu-panel .sub-menu .nav,.document-panel .sub-menu .nav { margin-left: 0; border-left: none; margin: 0 } .menu-panel .sub-menu .nav li:hover,.document-panel .sub-menu .nav li:hover { background: #454f5d } .document-panel.panel-open { width: 385px } .document-panel .panel-content { background-color: #546072; padding-top: 60px } .document-panel .panel-content .icon-layers { font-size: 135% } .document-panel .search-bar { position: absolute; background-color: #475160; z-index: 3; border: 1px solid #3e4755; border-top: 0; width: 100%; margin: 0; padding: 10px 10px } .document-panel .search-bar .input-group-addon { color: #eee; background-color: #546072; border-color: #3e4755; border-left: 1px solid #3e4755 } .document-panel .search-bar input[type="text"] { border-color: #3e4755 } .document-panel .dropdown-header { padding-top: 10px } #search-and-sync input { width: calc(100% - 30px) } #search-and-sync .input-group-addon,#search-and-sync input { } .file-action { float: right; display: none } .file-action i { padding-top: 2px } .folder-wrapper .icon-folder-open-empty { display: none } .folder-wrapper.active .icon-folder-open-empty { display: inline-block } .folder-wrapper.active .icon-folder-empty { display: none } .folder-wrapper.active a.collapsed .icon-folder-open-empty { display: none } .folder-wrapper.active a.collapsed .icon-folder-empty { display: inline-block } .folder-wrapper .file-notebook { display: none !important } .folder-wrapper.active>.list-group-item { border-top-color: #3a424f; border-bottom-color: #3a424f } .folder-wrapper>.list-group-item .shared-icon { float: right } .file-item:hover .file-action,li.active>.file-item .file-action { display: block } .file-item:hover .file-notebook,li.active>.file-item .file-notebook { display: none } .file-item .file-notebook { float: right; opacity: .8 } .file-item .file-notebook .label { display: inline-block; max-width: 130px; overflow: hidden; vertical-align: middle } .file-item .file-notebook .icon-star-empty { color: rgba(255,255,255,0.66) } .file-item .file-notebook .label { padding: .4em .6em } .file-item.synced { color: #bbb } .file-status-label { color: #aaa } .archive-splitter:last-child { display: none } .document-list { height: 100%; overflow: auto; position: relative } .document-list .sub-menu .file-item { background: none } .document-list .sub-menu .file-item:hover,.document-list .sub-menu .file-item:focus { background: none !important } .document-list ul>li.active .file-item,.document-list .file-wrapper.active .file-item { background: #74b936 !important; color: #fff } .document-list ul>li.active .file-status-label,.document-list .file-wrapper.active .file-status-label { color: #fff } .document-list ul>li.active .label-success,.document-list .file-wrapper.active .label-success { background: #2a4313 } .folder-top { position: absolute; display: none; z-index: 10000; width: 100% } .footer-left-btn { float: left; position: relative } .extension-preview-buttons { background-color: #546072; border-color: #3e4755 } .extension-preview-buttons .drag-me { color: #eee } .extension-preview-buttons .btn-success { color: #eee } .extension-preview-buttons .btn-success:hover,.extension-preview-buttons .btn-success:active { color: #eee !important; background-color: #454f5d !important } .extension-preview-buttons .open .btn-success { color: #eee !important; background-color: #454f5d !important } .extension-preview-buttons .dropdown-menu { background-color: #fff; border-color: #dee6ed } .extension-preview-buttons.closed { opacity: .25 } .extension-preview-buttons.closed.info-tooltip-container { opacity: 1 } .atwho-view-ul { max-height: 300px; overflow: scroll; position: relative } .atwho-view-ul li[shared="1"]::before { content: "?"; margin-right: .4em; margin-left: 0 } #app_wrap.readonly .editor-navbar-buttons,#app_wrap.readonly .save-file { display: none } #app_wrap.readonly .file-status-lock { display: inline-block } .markdown-syntax pre { margin: 0; background: none; font-size: 12px } .markdown-syntax table td { border: 2px solid #fff } .markdown-syntax table tr td:first-child { background: #91b82d; color: #fff; font-weight: bold } .markdown-syntax table tr td { background: #eee } .markdown-syntax table tr td i { font-size: 12px; color: #aaa; font-style: initial } .markdown-syntax table tr td:last-child { background: #fff } .markdown-syntax kbd { padding: .1em .6em; border: 1px solid #ccc; font-size: 11px; background-color: #f7f7f7; color: #333; display: inline-block; margin: 0 .2em; line-height: 1.4; white-space: nowrap } .modal-help .modal-dialog { width: 870px } .modal-help .modal-dialog .markdown-table { float: left } .modal-help .modal-dialog .key-table { width: 260px; float: right } .modal-changelog .modal-dialog .modal-body { text-align: left } #toggle-preview { display: none } .full-preview { padding: 0; background: #fff } .full-preview .layout-wrapper-l3 { } .full-preview #wmd-input,.full-preview #ace-input,.full-preview .extension-preview-buttons,.full-preview .editor-navbar,.full-preview .modal-backdrop,.full-preview .preview-buttons,.full-preview .open-folder-btn { display: none } .full-preview .preview-container { width: auto !important; position: relative; height: auto !important } .full-preview .preview-panel { position: relative; max-width: 960px; margin: auto; left: 0; width: auto !important; height: auto !important; overflow: visible; display: block !important; min-height: 100% } .full-preview .preview-panel::before { background: inherit; content: " "; position: absolute; width: 100%; height: 100%; top: 0; left: -100% } .full-preview .preview-panel::after { background: inherit; content: " "; position: absolute; width: 100%; height: 100%; top: 0; right: -100% } .full-preview #toggle-preview { display: block; font-size: 24px; position: absolute; right: 10px; top: 10px; cursor: pointer; color: rgba(102,128,153,0.35); z-index: 10 } .full-preview #toggle-preview:hover,.full-preview #toggle-preview:active,.full-preview #toggle-preview:focus { color: #036 } #readme,#images_area { display: none } #titlebar { height: 20px; line-height: 18px; z-index: 1000000 } #titlebar~.layout-wrapper-l1 { top: 20px } #titlebar~.layout-wrapper-l1 .open-folder-btn { top: 22px } #titlebar [class^="icon"]::before { margin: 0 .1em } #titlebar i { opacity: .8; cursor: pointer } #titlebar i:hover { opacity: .9 } #titlebar .window-file { position: absolute; left: 1px } #titlebar-bg { position: absolute; width: 100%; height: 100% } #dragbar { height: 100%; overflow: hidden; margin: 0 20px } #dragbar.disabled { } .window_resizer { float: right; margin-top: 1px } .editor-hosted-buttons { display: inline-block } .window-fullscreen { position: absolute; right: 4px; top: -1px } body.app { overflow: hidden } body.app .open-folder-btn { display: none } body.app .for-mac { display: none } body.app.mac .window_resizer { display: none } body.app.mac .window_resizer.for-mac { float: left; display: flex; margin-left: 4px; margin-top: 0 } body.app.mac #titlebar .window-file { position: static; margin-left: 15px } body.app.mac #titlebar i { margin: 1px } body.app.mac .window-close { } body.app.mac .window-min { } body.app.mac .window-max { } body.app img[src^="http"] { } body.app .preview-container { } #settings .col-lg-4 { float: left; text-align: right; width: 33.33333333% } #settings .col-lg-7 { float: left; width: 58.33333333% } #settings .form-inline .col-lg-7 { width: 58.33333333% } #settings .form-inline .form-control { display: inline-block } #settings .form-inline * { float: none } #settings .help-block { font-size: 12px } #settings .form-control { height: 34px } #settings textarea.form-control { width: 100% } .toast-warning::before { content: "" } .toast-error::before { content: "" } .toast-info::before { content: "" } .toast-success::before { content: "" } .modal.slim .modal-dialog { width: 400px } .modal.slim .modal-title { text-align: inherit } .modal.slim .modal-content { background: #fff; text-align: center } .modal.slim .modal-content p { color: #777 } .modal.slim .modal-body { padding-top: 0; padding-bottom: 0 } .modal.slim .modal-footer { border: none; text-align: center } .modal.slim .modal-header { border: none; color: #546072 } .modal.slim .btn-primary { background: #74b936; color: #fff } .modal.slim .btn-primary:hover,.modal.slim .btn-primary:active,.modal.slim .btn-primary:focus { background: #68a530 !important } .modal-dialog.slim .modal-header { padding: 10px 15px } .modal-dialog.slim .modal-body { padding: 10px 20px } .modal-dialog.slim .modal-footer { padding: 10px; background-color: #fff } .modal.error .modal-header { color: #b90b0b } #ace-input { display: none } .layout-wrapper-l2::before { position: absolute; content: ""; width: 100%; height: 100%; background: #f9fafb } #preview-contents { margin-top: 30px; padding-left: 10px; padding-right: 10px } .ace_dark .ace_gutter { color: #aaa !important; background: rgba(0,0,0,0.2) !important } .ace_gutter-cell { padding-left: 0 !important } .attachment-wrapper { overflow: hidden } .attachment-placeholder { float: left; display: block } .attachment-placeholder:hover { text-decoration: none } .attachment-placeholder i { font-size: 3em; float: left } .attachment-placeholder .file-name { vertical-align: -0.6em; font-weight: bold; line-height: 1.8em } .attachment-placeholder .file-size { display: flex; opacity: .6; font-size: 80%; white-space: nowrap } .attachment-placeholder img { display: none } #edit-conflict-container { left: 50%; bottom: 6px; right: 1em; margin-left: 1em; position: fixed; z-index: 11111111; display: none } #edit-conflict-container .toast { margin-bottom: 0 } #edit-conflict-container .message-content { background-color: #f9f0e3; color: #cf8321; padding: 4px 4px; float: left; padding-right: 10px } .no-preview #edit-conflict-container { left: 0 } #loading { position: fixed; top: 0; left: 0; bottom: 0; right: 0; z-index: 10000000; background: #fff; color: #74b936; text-align: center } #loading .loading-container { position: absolute; margin: auto; left: 0; right: 0; top: 30%; bottom: 0 } #loading b { color: #fff; background: #74b936; font-weight: normal; padding: 5px 5px; margin: 10px; font-size: 50px } #loading h1,#loading h2,#loading h3,#loading h4 { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif; text-align: center } #loading .reverse { color: #fff !important; background: #74b936 !important; padding: 4px } #loading #loading-app-name { text-align: center; font-size: 54px; margin-top: 0; margin-bottom: .8em } #loading #loading-slogan { font-weight: normal } #loading #loading-text { margin: 80px auto; text-align: center; margin-bottom: 40px } #loading #loading-view-doc { font-size: 16px; margin: 10px auto } #loading #loading-view-doc a { padding: 10px; border: 1px solid #74b936 } #loading #loading-view-doc a:link,#loading #loading-view-doc a:hover,#loading #loading-view-doc a:active,#loading #loading-view-doc a:visited { color: #74b936; text-decoration: none } .slim-scroll ::-webkit-scrollbar { height: 10px; width: 7px; background: transparent } .slim-scroll ::-webkit-scrollbar:hover { background: rgba(128,128,128,0.1) } .slim-scroll ::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.3) } .slim-scroll ::-webkit-scrollbar-thumb:hover { background: rgba(0,0,0,0.6) } .slim-scroll ::-webkit-scrollbar-corner { background: #000 } .slim-scroll .ace_dark .ace_scrollbar::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.3) } .slim-scroll .ace_dark .ace_scrollbar::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.6) } .slim-scroll .ace_scroller { right: 4px !important } .slim-scroll .ace_scrollbar-v { right: 4px !important } .slim-scroll #preview { right: 2px } .atwho-view { position: absolute; top: 0; left: 0; display: none; margin-top: 18px; background: #fff; color: #000; border: 1px solid #ddd; min-width: 120px; z-index: 11110 !important } .atwho-view .cur { background: #36f; color: #fff } .atwho-view .cur small { color: #fff } .atwho-view strong { color: #36f } .atwho-view .cur strong { color: #fff; font: bold } .atwho-view ul { list-style: none; padding: 0; margin: auto } .atwho-view ul li { display: block; padding: 5px 10px; border-bottom: 1px solid #ddd; cursor: pointer } .atwho-view small { font-size: smaller; color: #777; font-weight: normal }</style> <style>code[class*="language-"],pre[class*="language-"] { color: black; background: none; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; text-align: left; white-space: pre; word-spacing: normal; line-height: 1.5 } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { background: #b3d4fc } pre[class*="language-"]::selection,pre[class*="language-"] ::selection,code[class*="language-"]::selection,code[class*="language-"] ::selection { background: #b3d4fc } pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto } :not(pre)>code[class*="language-"],pre[class*="language-"] { background: #f5f2f0 } :not(pre)>code[class*="language-"] { padding: .1em; white-space: normal } .token.comment,.token.prolog,.token.doctype,.token.cdata { color: slategray } .token.punctuation { color: #999 } .namespace { opacity: .7 } .token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted { color: #905 } .token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted { color: #690 } .token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string { color: #a67f59; background: hsla(0, 0%, 100%, .5) } .token.atrule,.token.attr-value,.token.keyword { color: #07a } .token.function { color: #DD4A68 } .token.regex,.token.important,.token.variable { color: #e90 } .token.important,.token.bold { font-weight: bold } .token.italic { font-style: italic } .token.entity { cursor: help }</style>

前言

继续更新“用 C 写一个 web 服务器”项目(上期链接:用C写一个web服务器(一) 基础功能),本次更新选择了 I/O 模型的优化,因为它是服务器的基础,这个先完成的话,后面的优化就可以选择各个模块来进行,不必进行全局化的改动了。

I/O模型

接触过 socket 编程的同学应该都知道一些 I/O 模型的概念,linux 中有阻塞 I/O、非阻塞 I/O、I/O 多路复用、信号驱动 I/O 和 异步 I/O 五种模型。

其他模型的具体概念这里不多介绍,只简单地提一下自己理解的 I/O 多路复用:简单的说就是由一个进程来管理多个 socket,即将多个 socket 放入一个表中,在其中有 socket 可操作时,通知进程来处理, I/O 多路复用的实现方式有 select、poll 和 epoll。

select/poll/epoll

在 linux下,通过文件描述符(file descriptor, 下 fd)来进行 socket 的操作,所以下文均是对 fd 操作。

首先说最开始实现的 select 的问题:

  • select 打开的 fd 最大数目有限制,一般为1024,在当前计算系统的并发量前显然有点不适用了。
  • select 在收到有 fd 可操作的通知时,是无法得知具体是哪个 fd 的,需要线性扫描 fd 表,效率较低。
  • 当有 fd 可操作时,fd 会将 fd 表复制到内核来遍历,消耗也较大。

随着网络技术的发展,出现了 poll:poll 相对于 select,使用 pollfd 表(链表实现) 来代替 fd,它没有上限,但受系统内存的限制,它同样使用 fd 遍历的方式,在并发高时效率仍然是一个问题。

最终,epoll 在 Linux 2.6 的内核面世,它使用事件机制,在每一个 fd 上添加事件,当fd 的事件被触发时,会调用回调函数来处理对应的事件,epoll 的优势总之如下:

  • 只关心活跃的 fd,精确定位,改变了poll的时间效率 O(n) 到 O(1);
  • fd 数量限制是系统能打开的最大文件数,会受系统内存和每个 fd 消耗内存的影响,以当前的系统硬件配置,并发数量绝对不是问题。
  • 内核使用内存映射,大量 fd 向内核态的传输不再是问题。

为了一步到位,也是为了学习最先进的I/O多路复用模型,直接使用了 epoll 机制,接下来介绍一下 epoll 相关基础和自己服务器的实现过程。


epoll介绍

epoll 需要引入<sys/epoll.h>文件,首先介绍一下 epoll 系列函数:

epoll_create

int epoll_create(int size);

创建一个 epoll 实例,返回一个指向此 epoll 实例的文件描述符,当 epoll 实例不再使用时,需要使用close()方法来关闭它。

在最初的实现中, size 作为期望打开的最大 fd 数传入,以便系统分配足够大的空间。在最新版本的内核中,系统内核动态分配内存,已不再需要此参数了,但为了避免程序运行在旧内核中会有问题,还是要求此值必须大于0;

epoll_ctl

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

  • epfd 是通过 epoll_create 返回的文件描述符

  • op 则是文件描述符监听事件的操作方式,EPOLL_CTL_ADD/EPOLL_CTL_MOD/EPOLL_CTL_DEL 分别表示添加、修改和删除一个监听事件。

  • fd 为要监听的文件描述符。

  • event 为要监听的事件,可选事件和行为会在下面描述,它的结构如下:

typedef union epoll_data {
               void        *ptr;
               int          fd;
               uint32_t     u32;
               uint64_t     u64;
           } epoll_data_t;

           struct epoll_event {
               uint32_t     events;      /* epoll事件 */
               epoll_data_t data;        /* 事件相关数据 */
           };

epoll_wait

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); 监听 epoll 事件:

  • events 是 epoll 事件数组,epoll 事件的结构上面已经介绍过。
  • maxevents 是一次监听获取到的最大事件数目。
  • timeout 是一次监听中获取不到事件的最长等待时间,设置成 -1 会一直阻塞等待,0 则会立即返回。

epoll行为

在 epoll_ctl 的 event 参数中,事件 events 有如下可选项:

EPOLLIN(可读)、EPOLLOUT(可写)、EPOLLRDHUP(连接关闭)、EPOLLPRI(紧急数据可读),此外 EPOLLERR(错误),EPOLLHUP(连接挂断)事件会被 epoll 默认一直监听。

除了设置事件外,还可以对监听的行为设置:

  • level trigger:此行为被 epoll 默认支持,不必设置。在 epoll_wait 得到一个事件时,如果应用程序不处理此事件,在 level trigger 模式下,epoll_wait 会持续触发此事件,直到事件被程序处理;
  • EPOLLET(edge trigger):在 edge trigger 模式下,事件只会被 epoll_wait 触发一次,如果用户不处理此事件,不会在下次 epoll_wait 再次触发。在处理得当的情况下,此模式无疑是高效的。需要注意的是此模式需求 socket 处理非阻塞模式,下面会实现此模式。
  • EPOLLONESHOT:在单次命中模式下,对同一个文件描述符来说,同类型的事件只会被触发一次,若想重复触发,需要重新给文件描述符注册事件。
  • EPOLLWAKEUP:3.5版本加入,如果设置了单次命中和ET模式,而且进程有休眠唤醒能力,当事件被挂起和处理时,此选项确保系统不进入暂停或休眠状态。 事件被 epoll_wait 调起后,直到下次 epoll_wait 再次调起此事件、文件描述符被关闭,事件被注销或修改,都会被认为是处于处理中状态。
  • EPOLLEXCLUSIVE:4.5版本加入,为一个关联到目标文件描述符的 epoll 句柄设置独占唤醒模式。如果目标文件描述符被关联到多个 epoll 句柄,当有唤醒事件发生时,默认所有 epoll 句柄都会被唤醒。而都设置此标识后,epoll 句柄之一被唤醒,以避免“惊群”现象。

当监听事件和行为需求同时设置时,使用运算符 |即可。


代码实现

整体处理逻辑

使用 epoll 时的服务器受理客户端请求逻辑如下:

  1. 创建服务器 socket,注册服务器 socket 读事件;
  2. 客户端连接服务器,触发服务器 socket 可读,服务器创建客户端 socket,注册客户端socket 读事件;
  3. 客户端发送数据,触发客户端 socket 可读,服务器读取客户端信息,将响应写入 socket;
  4. 客户端关闭连接,触发客户端 socket 可读,服务器读取客户端信息为空,注销客户端 socket 读事件;

代码实现如下(详细处理方式见 GitHub:我是地址):

erver_fd = server_start();
    epoll_fd = epoll_create(FD_SIZE);
    epoll_register(epoll_fd, server_fd, EPOLLIN|EPOLLET);// 这里注册socketEPOLL事件为ET模式

    while (1) {
        event_num = epoll_wait(epoll_fd, events, MAX_EVENTS, 0);
        for (i = 0; i < event_num; i++) {
            fd = events[i].data.fd;
            // 如果是服务器socket可读,则处理连接请求
            if ((fd == server_fd) && (events[i].events == EPOLLIN)){
                accept_client(server_fd, epoll_fd);
            // 如果是客户端socket可读,则获取请求信息,响应客户端
            } else if (events[i].events == EPOLLIN){
                deal_client(fd, epoll_fd);
            } else if (events[i].events == EPOLLOUT)
                // todo 数据过大,缓冲区不足的情况待处理
                continue;
        }
    }

需要注意的是,客户端socket在可读之后也是立刻可写的,我这里直接读取一次请求,然后将响应信息 write 进去,没有考虑读数据时缓冲区满的问题。

这里提出的解决方案为:

  1. 设置一个客户端 socket 和 buffer 的哈希表;
  2. 在读入一次信息缓冲区满时 recv 会返回 EAGIN 错误,这时将数据放入 buffer,暂时不响应。
  3. 后续读事件中读取到数据尾后,再注册 socket 可写事件。
  4. 在处理可写事件时,读取 buffer 内的全部请求内容,处理完毕后响应给客户端。
  5. 最后注销 socket 写事件。

设置epoll ET(edge trigger)模式

上文说过,ET模式是 epoll 的高效模式,事件只会通知一次,但处理良好的情况下会更适用于高并发。它需要 socket 在非阻塞模式下才可用,这里我们实现它。

sock_fd = socket(AF_INET, SOCK_STREAM, 0);

    // 获取服务器socket的设置,并添加"不阻塞"选项
    flags = fcntl(sock_fd, F_GETFL, 0);
    fcntl(sock_fd, F_SETFL, flags|O_NONBLOCK);
    
    .....
    // 这里注册服务器socket EPOLL事件为ET模式
    epoll_register(epoll_fd, server_fd, EPOLLIN|EPOLLET);

我将处理事件注掉后使用一次客户端连接请求进行了测试,很清晰地说明了 ET模式下,事件只触发一次的现象,前后对比图如下:

技术分享

技术分享


小结

Mac OS X 操作系统的某些部分是基于 FreeBSD 的,FreeBSD 不支持,MAC 也不支持(不过有相似的 kqueue),跑到开发机上开发的,作为一个最基础的 C learner, 靠着printf()fflush()两个函数来调试的,不过搞了很久总算是完成了,有用 C 的前辈推荐一下调试方式就最好了。。

另外 epoll 在最新的内核中也更新了些内容,旧的很多博客都没有提到,话说照这样的发展速度,我这篇也会在一段时间后“过时”吧,哈哈~

如果您觉得本文对您有帮助,可以点击下面的 推荐 支持一下我。博客一直在更新,欢迎 关注

参考:

IO多路复用之epoll总结

epoll精髓

epoll interface detail (很不错的英文文档,推荐)

用C写一个web服务器(二) I/O多路复用之epoll