Fossil SCM
Fix typo in auto.def Merge trunk
Commit
10c7e0fcea6db1043a15d1f118cfa0638bd60735abd010e0e62fc91444c3eee9
Parent
1eab060a84f24fa…
18 files changed
+1
-1
+1
-1
+11
+3
+37
+73
+3
-1
+3
-2
+2
-1
+66
+4
+73
-27
+1
+20
-6
+20
-8
+4
+4
+7
-1
~
auto.def
~
auto.def
~
skins/bootstrap/css.txt
~
skins/bootstrap/details.txt
~
skins/bootstrap/footer.txt
~
skins/bootstrap/header.txt
~
src/cgi.c
~
src/finfo.c
~
src/graph.c
~
src/info.c
~
src/main.mk
~
src/setup.c
~
src/skins.c
~
src/stat.c
~
src/timeline.c
~
win/Makefile.mingw
~
win/Makefile.msc
~
www/server.wiki
M
auto.def
+1
-1
| --- auto.def | ||
| +++ auto.def | ||
| @@ -93,11 +93,11 @@ | ||
| 93 | 93 | # if sqlite3_trace_v2() can be found as well. If we can find open() but |
| 94 | 94 | # not trace_v2(), then the system SQLite is too old to link against |
| 95 | 95 | # fossil. |
| 96 | 96 | # |
| 97 | 97 | if {[check-function-in-lib sqlite3_open sqlite3 $extralibs]} { |
| 98 | - if {![check-function-in-lib sqlite3_trace_v3 sqlite3 $extralibs]} { | |
| 98 | + if {![check-function-in-lib sqlite3_trace_v2 sqlite3 $extralibs]} { | |
| 99 | 99 | user-error "system sqlite3 too old (require >= 3.14.0)" |
| 100 | 100 | } |
| 101 | 101 | |
| 102 | 102 | # Success. Update symbols and return. |
| 103 | 103 | # |
| 104 | 104 | |
| 105 | 105 | ADDED skins/bootstrap/css.txt |
| 106 | 106 | ADDED skins/bootstrap/details.txt |
| 107 | 107 | ADDED skins/bootstrap/footer.txt |
| 108 | 108 | ADDED skins/bootstrap/header.txt |
| --- auto.def | |
| +++ auto.def | |
| @@ -93,11 +93,11 @@ | |
| 93 | # if sqlite3_trace_v2() can be found as well. If we can find open() but |
| 94 | # not trace_v2(), then the system SQLite is too old to link against |
| 95 | # fossil. |
| 96 | # |
| 97 | if {[check-function-in-lib sqlite3_open sqlite3 $extralibs]} { |
| 98 | if {![check-function-in-lib sqlite3_trace_v3 sqlite3 $extralibs]} { |
| 99 | user-error "system sqlite3 too old (require >= 3.14.0)" |
| 100 | } |
| 101 | |
| 102 | # Success. Update symbols and return. |
| 103 | # |
| 104 | |
| 105 | DDED skins/bootstrap/css.txt |
| 106 | DDED skins/bootstrap/details.txt |
| 107 | DDED skins/bootstrap/footer.txt |
| 108 | DDED skins/bootstrap/header.txt |
| --- auto.def | |
| +++ auto.def | |
| @@ -93,11 +93,11 @@ | |
| 93 | # if sqlite3_trace_v2() can be found as well. If we can find open() but |
| 94 | # not trace_v2(), then the system SQLite is too old to link against |
| 95 | # fossil. |
| 96 | # |
| 97 | if {[check-function-in-lib sqlite3_open sqlite3 $extralibs]} { |
| 98 | if {![check-function-in-lib sqlite3_trace_v2 sqlite3 $extralibs]} { |
| 99 | user-error "system sqlite3 too old (require >= 3.14.0)" |
| 100 | } |
| 101 | |
| 102 | # Success. Update symbols and return. |
| 103 | # |
| 104 | |
| 105 | DDED skins/bootstrap/css.txt |
| 106 | DDED skins/bootstrap/details.txt |
| 107 | DDED skins/bootstrap/footer.txt |
| 108 | DDED skins/bootstrap/header.txt |
M
auto.def
+1
-1
| --- auto.def | ||
| +++ auto.def | ||
| @@ -93,11 +93,11 @@ | ||
| 93 | 93 | # if sqlite3_trace_v2() can be found as well. If we can find open() but |
| 94 | 94 | # not trace_v2(), then the system SQLite is too old to link against |
| 95 | 95 | # fossil. |
| 96 | 96 | # |
| 97 | 97 | if {[check-function-in-lib sqlite3_open sqlite3 $extralibs]} { |
| 98 | - if {![check-function-in-lib sqlite3_trace_v3 sqlite3 $extralibs]} { | |
| 98 | + if {![check-function-in-lib sqlite3_trace_v2 sqlite3 $extralibs]} { | |
| 99 | 99 | user-error "system sqlite3 too old (require >= 3.14.0)" |
| 100 | 100 | } |
| 101 | 101 | |
| 102 | 102 | # Success. Update symbols and return. |
| 103 | 103 | # |
| 104 | 104 | |
| 105 | 105 | ADDED skins/bootstrap/css.txt |
| 106 | 106 | ADDED skins/bootstrap/details.txt |
| 107 | 107 | ADDED skins/bootstrap/footer.txt |
| 108 | 108 | ADDED skins/bootstrap/header.txt |
| --- auto.def | |
| +++ auto.def | |
| @@ -93,11 +93,11 @@ | |
| 93 | # if sqlite3_trace_v2() can be found as well. If we can find open() but |
| 94 | # not trace_v2(), then the system SQLite is too old to link against |
| 95 | # fossil. |
| 96 | # |
| 97 | if {[check-function-in-lib sqlite3_open sqlite3 $extralibs]} { |
| 98 | if {![check-function-in-lib sqlite3_trace_v3 sqlite3 $extralibs]} { |
| 99 | user-error "system sqlite3 too old (require >= 3.14.0)" |
| 100 | } |
| 101 | |
| 102 | # Success. Update symbols and return. |
| 103 | # |
| 104 | |
| 105 | DDED skins/bootstrap/css.txt |
| 106 | DDED skins/bootstrap/details.txt |
| 107 | DDED skins/bootstrap/footer.txt |
| 108 | DDED skins/bootstrap/header.txt |
| --- auto.def | |
| +++ auto.def | |
| @@ -93,11 +93,11 @@ | |
| 93 | # if sqlite3_trace_v2() can be found as well. If we can find open() but |
| 94 | # not trace_v2(), then the system SQLite is too old to link against |
| 95 | # fossil. |
| 96 | # |
| 97 | if {[check-function-in-lib sqlite3_open sqlite3 $extralibs]} { |
| 98 | if {![check-function-in-lib sqlite3_trace_v2 sqlite3 $extralibs]} { |
| 99 | user-error "system sqlite3 too old (require >= 3.14.0)" |
| 100 | } |
| 101 | |
| 102 | # Success. Update symbols and return. |
| 103 | # |
| 104 | |
| 105 | DDED skins/bootstrap/css.txt |
| 106 | DDED skins/bootstrap/details.txt |
| 107 | DDED skins/bootstrap/footer.txt |
| 108 | DDED skins/bootstrap/header.txt |
+11
| --- a/skins/bootstrap/css.txt | ||
| +++ b/skins/bootstrap/css.txt | ||
| @@ -0,0 +1,11 @@ | ||
| 1 | +/*! | |
| 2 | +* Bootstrap v3.3.2 (http://getbootstrap.com) | |
| 3 | +* Copyright 2011-2015 Twitter, Inc. | |
| 4 | +* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) | |
| 5 | +*/ | |
| 6 | + | |
| 7 | +/*! | |
| 8 | +* Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=fe63ebfc82d223781373) | |
| 9 | +* Config saved to config.json and https://gist.github.com/fe63ebfc82d223781373 | |
| 10 | +*//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure, Bootstrap v3.3.2 (http:/*! | |
| 11 | +* Bootstrablock}S@6f,L@7RW,N@H~f,1:}M@7w,M:display:none;height:0}I@8k,F:display:none}a{S@GWl,d:}a:active,a:hover{outline:0}abbr[title]{O@25z,2f:}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;I@7Jl,N@H~f,1e:}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{S@Vz,V@WT,M@W~,j:;height:0}pre{overflow:auto}code,kbd,pre,samp{X@JN,E:font-size:1em}b@KB,1A:color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{J@ME,1:}1A@M_,J@Yz,M:button;cursor:pointer}b@OV,F:cursor:default}m@PP,P:border:0;padding:0}input{I@Qj,1:}M@7WW,1:,J@CKW,1:{J@WT,F:border-box;-mozN@6fW,M@Sl,A:padding:0}1W@TL,C:height:auto}L@75~,T@VU,S@Vz,V@WT,M@W~,1:}K@75~,H@YV,z@Xy,N@Yz,A:}fieldset{I@E0l,K:c0c0c0;margin:0 2px;T@_G,1I:}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{G@CPW,f:collapse;border-spacing:0}td,th{padding:0}1L@cQ,D:@media print{J@e0,Y@eO,M@e~,N@EIW,1F: !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{G@Hkl,O:underline}a[href]:after{R@i8,l:}abbr[title]:after{content:" (" attr(title) ")"}l@j_,Q:content:""}pre,blockquote{I@E0l,4:999;N@mk,e:}thead{display:table-header-group}tr,img{N@mk,10:}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{M@oh,t:}select{background:#fff !important}.navbar{display:none}W@qM,W@qw,8:}.label{I@E0l,B:000}.table{G@CPW,K:collapse !important}K@t0,L@AQl,C: !important}b@u0,L@E0l,F: !important}}*{J@WT,F:border-box;-mozN@6fW,L@Sl,I:}*:before,*:after{J@WT,F:border-box;-mozN@6fW,L@Sl,L:}html{font-size:10px;e@yo,6:}body{t@zc,F:font-size:14px;N@DV~,B:color:#333;L@AQl,1:}T@10p,b:font-family:inherit;font-size:inherit;J@120,H:}a{color:#337ab7;K@Hkl,V:}a:hover,a:focus{color:#23527c;G@Hkl,I:underline}a:focus{K@14E,f@6mE,J@9JU,L:}figure{margin:0}img{L@7SW,1:}l@16S,r:display:block;max-width:100%;height:auto}.img-rounded{H@NsG,S:}.img-thumbnail{padding:4px;N@DV~,M@9R0,L@E0l,1:;I@6sG,J@Itk,K@1C0,Y@1BG,V@1Aj,L@7RW,1C:max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;J@Jw~,9:border:0;L@EDl,1B:#eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;G@ImW,M@CNw,9:border:0}o@1HO,1B:position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}f@1Jf,12:font-family:inherit;font-weight:500;line-height:1.1;color:inherit}3l@1L_,J@AxF,P:line-height:1;color:#777}L@1QB,G:margin-top:20px;I@8hV,1:}1t@1RB,o:font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;I@8hV,1:}1t@1UM,2f:font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{J@Jw~,V:font-size:16px;font-weight:300;C@795,4:1.4}P@1_l,x:.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{J@Kil,2O:cf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{I@DC~,H:}.text-lowercase{O@1f9,H:}.text-uppercase{O@26z,1V:}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}L@1h~,1b:color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}I@1kE,1d:color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}K@1mS,a:color:#843534}.bg-primary{color:#fff;O@1nW,K:}a.bg-primary:hover{I@NPG,J:286090}.bg-success{J@NPG,P:ff0d8}a.bg-success:hover{I@NPG,G:c1e2b3}.bg-info{O@NPG,H:}a.bg-info:hover{J@KsW,I:fd9ee}.bg-warning{J@Kil,P:cf8e3}a.bg-warning:hover{J@Kil,H:7ecb5}.bg-danger{J@Kil,6:2dede}I@1tW,J@HcG,J:4b9b9}.page-header{J@1uW,J:margin:40px 0 20px;I@25z,U:solid #eee}ul,ol{margin-top:0;I@8hV,1:}O@1wP,2B:margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{L@7RW,H@1zk,Y:padding-right:5px}dl{margin-top:0;I@MzF,7:}dt,dd{M@DV~,b:}dt{font-weight:bold}dd{margin-left:0}P@1_l,I@21k,o:float:left;width:160px;clear:left;text-align:right;G@ImW,N:text-overflow:ellipsis;I@DC~,b:}.dl-horizontal dd{margin-left:180px}}b@256,C:cursor:help;T@25z,R:}.initialism{font-size:90%;O@26z,j:}blockquote{padding:10px 20px;margin:0 0 20px;H@28F,R:border-left:5px solid #eee}1A@290,G:margin-bottom:0}H@2CW,_@2Al,S:display:block;font-size:80%;N@DV~,B:color:#777}1A@2CW,L@2Di,1:}J@2Jy,M@2LW,Z:{padding-right:15px;padding-left:0;S@2FQ,V:border-left:0;text-align:right}3G@2GT,B:content:''}3A@2Jy,U:content:'\00A0 \2014'}address{J@Jw~,I:font-style:normal;M@DV~,J:}code,kbd,pre,samp{u@2P6,n:}code{padding:2px 4px;font-size:90%;color:#c7254e;J@Kil,6:9f2f4;H@Dp0,j:}kbd{padding:2px 4px;font-size:90%;color:#fff;K@1nW,2:3;H@Ns~,1:;R@F6l,N@2UV,1:;J@8NW,N@2UV,o:}kbd kbd{padding:0;font-size:100%;font-weight:bold;O@EIW,1F:box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;N@DV~,L@2YC,W:word-wrap:break-word;color:#333;J@Kil,6:5f5f5;I@E0l,4:ccc;H@Dp0,19:}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;S@GWl,X:;border-radius:0}.pre-scrollable{H@2bk,10:overflow-y:scroll}.container{margin-right:auto;margin-left:auto;I@2dE,J:padding-right:15px}P@1_l,O:.container{width:750px}}O@OgG,P:{.container{width:970px}}I@OgG,X:1200px){.container{width:1170px}}G@O90,_:{margin-right:auto;margin-left:auto;I@2dE,y:padding-right:15px}.row{margin-left:-15px;margin-right:-15px}8R@2jD,I@7Jl,F:min-height:1px;I@2dE,J:padding-right:15px}26@2sx,h:float:left}.col-xs-12{width:100%}.col-xs-11{I@3R0,C:}.col-xs-10{I@2wU,V:}.col-xs-9{width:75%}.col-xs-8{I@3Sl,x:}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{I@3UV,x:}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{I@3WE,38:}.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{I@33G,2d:}.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{H@4nG,31:}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{H@3iG,d:}.col-xs-push-6{left:50%}.col-xs-push-5{H@3BW,G:}.col-xs-push-4{H@3tk,d:}.col-xs-push-3{left:25%}.col-xs-push-2{H@3vG,G:}.col-xs-push-1{G@3MW,Q:}.col-xs-push-0{left:auto}I@3EW,H:margin-left:100%}G@3EW,2:1{O@3FT,1:}G@3EW,2:0{O@3GD,o:}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{O@3qT,P:}.col-xs-offset-7{margin-H@3iG,v:}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-H@3BW,I:}.col-xs-offset-4{O@3td,1:}H@3Kl,X:margin-left:25%}.col-xs-offset-2{C@8xy,D:16.66666667%}G@3EW,1:{N@3vz,W:}.col-xs-offset-0{margin-left:0}P@1_l,26@3No,h:float:left}.col-sm-12{width:100%}.col-sm-11{I@3R0,C:}.col-sm-10{I@2wU,V:}.col-sm-9{width:75%}.col-sm-8{I@3Sl,x:}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{I@3UV,x:}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{I@3WE,38:}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{I@33G,2d:}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{H@4nG,1N:}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}G@3g0,1Q:left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{H@3iG,d:}.col-sm-push-6{left:50%}.col-sm-push-5{H@3BW,G:}.col-sm-push-4{H@3tk,d:}.col-sm-push-3{left:25%}.col-sm-push-2{H@3vG,G:}.col-sm-push-1{G@3MW,y:}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}I@3nk,O@3FT,J:}.col-sm-offset-10{O@3GD,o:}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{O@3qT,P:}.col-sm-offset-7{margin-H@3iG,v:}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-H@3BW,I:}.col-sm-offset-4{O@3td,o:}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{C@8xy,U:16.66666667%}.col-sm-offset-1{N@3vz,X:}.col-sm-offset-0{margin-left:0}}O@OgG,1:{26@3xY,h:float:left}.col-md-12{width:100%}.col-md-11{I@3R0,C:}.col-md-10{I@2wU,V:}.col-md-9{width:75%}.col-md-8{I@3Sl,x:}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{I@3UV,x:}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{I@3WE,38:}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{I@33G,2d:}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{H@4nG,31:}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{H@3iG,d:}.col-md-push-6{left:50%}.col-md-push-5{H@3BW,G:}.col-md-push-4{H@3tk,d:}.col-md-push-3{left:25%}.col-md-push-2{H@3vG,G:}.col-md-push-1{G@3MW,Q:}.col-md-push-0{left:auto}I@4Ml,H:margin-left:100%}G@4Ml,2:1{O@3FT,1:}G@4Ml,2:0{O@3GD,o:}.col-md-offset-9{margin-left:75%}.col-md-offset-8{O@3qT,P:}.col-md-offset-7{margin-H@3iG,1:}H@4RW,d:margin-left:50%}.col-md-offset-5{margin-H@3BW,I:}.col-md-offset-4{O@3td,o:}.col-md-offset-3{margin-left:25%}.col-md-offset-2{C@8xy,D:16.66666667%}G@4Ml,1:{N@3vz,X:}.col-md-offset-0{margin-left:0}}I@OgG,8:1200px){26@4XI,h:float:left}.col-lg-12{width:100%}.col-lg-11{I@3R0,C:}.col-lg-10{I@2wU,V:}.col-lg-9{width:75%}.col-lg-8{I@3Sl,x:}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{I@3UV,x:}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{I@3WE,38:}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{I@33G,2d:}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{H@4nG,31:}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{H@3iG,d:}.col-lg-push-6{left:50%}.col-lg-push-5{H@3BW,G:}.col-lg-push-4{H@3tk,d:}.col-lg-push-3{left:25%}.col-lg-push-2{H@3vG,G:}.col-lg-push-1{G@3MW,Q:}.col-lg-push-0{left:auto}I@4wW,H:margin-left:100%}G@4wW,2:1{O@3FT,1:}G@4wW,2:0{O@3GD,o:}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{O@3qT,P:}.col-lg-offset-7{margin-H@3iG,1:}H@50G,d:margin-left:50%}.col-lg-offset-5{margin-H@3BW,I:}.col-lg-offset-4{O@3td,o:}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{C@8xy,D:16.66666667%}G@4wW,1:{N@3vz,c:}.col-lg-offset-0{margin-left:0}}table{S@GWl,1w:}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;I@MzF,1:}I@5nl,I@63G,1:hJ@5oV,v@59l,C@5Ai,N@DV~,I@JtW,1:;L@EDl,5:#ddd}I@5nl,1:{L@Juk,1:;S@5Cs,1:}a@5FG,3F@5Dw,18:border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{L@AQl,1:}R@5KE,K@5Jk,I@6HV,K@5LF,K@5Jk,15@5KW,S:padding:5px}.table-bordered{L@E0l,1:}R@MQG,R@5OG,1:hI@5OG,1V@5Nf,L@E0l,1:}R@MQG,I@5OG,B:head>tr>td{N@5QV,1:}e@5Qu,J@Kil,6:9f9f9}S@5S0,J@Kil,6:5f5f5}P@5Sv,l:position:static;float:none;display:table-column}l@5UE,R:position:static;float:none;I@P5l,1:}H@5nl,4c@5W8,J@Kil,6:5f5f5}N@5jl,1:dZ@5bB,21@5b8,J@HcG,6:8e8e8}H@5nl,1:dH@5g0,4X@5eA,J@NPG,6:ff0d8}N@5jl,2f@5jW,J@NPG,6:0e9c6}H@5nl,6:d.infoK@63G,M@5oR,6:d.infoI@59l,6:h.infoI@63G,2k@5oP,O@NPG,1:}N@5jl,2R@5ry,I@NPG,7:c4e3f3}H@5nl,1:dH@5xF,4X@5vP,J@Kil,6:cf8e3}N@5jl,2f@5~k,O@Kil,1:}H@5nl,4c@638,J@Kil,6:2dede}N@5jl,1:dZ@69B,21@698,J@HcG,6:bcccc}H@M_l,k:{overflow-x:auto;min-height:0.01%}@media screenG@O~W,7:767px){H@M_l,C:{width:100%;J@6Dl,I:overflow-y:hidden;h@6EV,L@E0l,1:}O@M_l,H:{margin-bottom:0}3U@6GW,I@DC~,1:}X@M_l,A:{border:0}j@M_l,4j@6M0,E:border-left:0}v@M_l,N@LJ0,K@Mh0,1:hk@6UV,N@Mdk,N@LJ0,I@MnG,G@Mi0,N@LJ0,Y@Mh0,N@LJ0,K@5NV,S:d:last-child{border-right:0}f@6S0,n@6YQ,K@Mtz,1:hg@6R~,B::last-childS@6Il,V@MxF,1j:d{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;J@Jw~,F:font-size:21px;J@120,L:;color:#333;border:0;I@25z,K:solid #e5e5e5}label{L@7RW,F:max-width:100%;H@Kt~,I:;font-weight:bold}L@75~,J@WT,F:border-box;-mozN@6fW,L@Sl,1:}g@6gl,F:margin:4px 0 0;I@6hl,I@Qj,Y:}input[type="file"]{display:block}K@6j0,P:display:block;width:100%}G@ClG,Q:,select[size]{height:auto}1G@6k_,K@14E,f@6mE,J@9JU,q:}output{display:block;padding-top:7px;font-size:14px;N@DV~,1U:color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;N@DV~,B:color:#555;M@9R0,L@A10,1:;I@E0l,4:ccc;I@6sG,V@F6l,M:1px rgba(0,0,0,0.075);i@8Ml,J@Itk,13@6uW,3:-o-H@IL~,q@6vv,H@IL~,p@6vv,1:}K@8OS,V:border-color:#66afe9;outline:0;V@F6l,r@6~b,1:;b@8NW,c@6~q,1:}G@72G,a:moz-placeholder{color:#999;opacity:1}_@71S,B:color:#999}e@72G,B:color:#999}1H@739,J@9OT,L@HcG,i:;opacity:1}textarea.form-control{height:auto}L@75~,N@Yz,1:}q@76m,1N@77e,H:line-height:34px}4I@79S,H:line-height:30px}P@79S,2:lgQ@79s,3T@7E~,U:line-height:46px}}.form-group{I@6Dl,I:}.radio,.checkbox{I@7Jl,U:display:block;margin-top:10px;I@8hV,1:}T@7Kz,G@Nn0,Y:padding-left:20px;margin-bottom:0;J@AxF,F:cursor:pointer}26@7N0,I:position:absolute;I@7PU,I:margin-top:4px \9}Y@7Q7,G:margin-top:-5px}V@7Qz,L@7RW,Y:padding-left:20px;margin-bottom:0;M@7SW,J@AxF,F:cursor:pointer}z@7TW,U:margin-top:0;margin-left:10px}J@CKW,2v@7VN,J:cursor:not-allowed}1r@7Ye,J:cursor:not-allowed}1n@7_s,J:cursor:not-allowed}L@8ly,o:padding-top:7px;padding-bottom:7px;margin-bottom:0}K@8ly,d@7dd,q:padding-left:0;padding-right:0}.input-sm{height:30px;H@B7V,V:font-size:12px;line-height:1.5;H@Ns~,1:}G@7gW,T:height:30px;line-height:30px}h@7hL,C:height:auto}S@7lU,D:{height:30px;H@B7V,V:font-size:12px;line-height:1.5;H@Ns~,1:}Z@7kE,T:height:30px;line-height:30px}1I@7lM,C:height:auto}S@7lU,K:-static{height:30px;H@B7V,q:font-size:12px;line-height:1.5}.input-lg{height:46px;I@CxG,F@Efv,M@7tV,H@NsG,j:}select.input-lg{height:46px;line-height:46px}h@7rC,C:height:auto}S@7vS,D:{height:46px;I@CxG,F@Efv,M@7tV,H@NsG,1:}I@7kE,j:lg .form-control{height:46px;line-height:46px}1I@7vK,C:height:auto}S@7vS,K:-static{height:46px;I@CxG,F@Efv,L@7tV,F:}.has-feedback{H@7Jl,1:}R@8yU,1:{K@7zl,1:}N@82E,1n:position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;J@81j,1:}X@824,d:width:46px;height:46px;line-height:46px}X@83O,d:width:30px;height:30px;line-height:30px}4H@84h,E:color:#3c763d}R@89G,L@89j,V@F6l,M:1px rgba(0,0,0,0.075);h@8NW,1:}Q@89G,S::focus{border-color:#2b542c;V@F6l,V@8Qf,7:67b168;h@8NW,H:,0 0 6px #67b168}W@8El,E:color:#3c763d;L@89j,J@NPG,6:ff0d8}Q@89G,O:-feedback{color:#3c763d}4H@8HE,E:color:#8a6d3b}Q@8OF,1:{L@8MG,V@F6l,M:1px rgba(0,0,0,0.075);h@8NW,1:}X@8OF,L:border-color:#66512c;V@F6l,b@8Pf,h@8NW,T:,0 0 6px #c0a16b}.has-warningJ@8oW,F:{color:#8a6d3b;L@8MG,J@Kil,6:cf8e3}Q@8OF,O:-feedback{color:#8a6d3b}3y@8Tl,E:color:#a94442}P@8Y0,L@8dE,V@F6l,M:1px rgba(0,0,0,0.075);h@8NW,1:}O@8Y0,7::focus{L@8_y,V@F6l,W@8Qf,6:e8483;h@8NW,H:,0 0 6px #ce8483}U@8cS,E:color:#a94442;L@8dE,J@Kil,6:2dede}O@8Y0,O:-feedback{color:#a94442}J@8fk,1:~N@82E,9:top:25px}o@8fk,k:top:0}.help-block{display:block;margin-top:5px;J@8hV,E:color:#737373}P@1_l,J@8ll,6:group{L@7RW,G:margin-bottom:0;L@7SW,1:}Q@8ll,1:{L@7RW,B:width:auto;L@7SW,1:}Y@8ll,K@FEG,1:}P@8pV,M:{display:inline-table;L@7SW,1:}R@8pV,H@8RW,S@8pU,t@8pF,B:width:auto}P@8pV,Q:>.form-control{width:100%}S@8rR,G:margin-bottom:0;L@7SW,1:}g@8si,L@7RW,T:margin-top:0;margin-bottom:0;L@7SW,1:}J@8si,_@8vD,F:padding-left:0}J@8si,L@CKV,j@8wo,I@7Jl,E:margin-left:0}n@8yH,7:top:0}}n@910,1:,N@910,f@8~U,i:margin-top:0;margin-bottom:0;padding-top:7px}o@910,G:min-height:27px}I@910,l:form-group{margin-left:-15px;margin-right:-15px}P@1_l,I@910,10:control-label{text-align:right;margin-bottom:0;padding-top:7px}}I@910,_@8yV,B:right:15px}P@1_l,I@910,T@978,N@97f,2:}}P@1_l,I@910,T@98r,M:padding-top:6px}}.btn{L@7RW,G:margin-bottom:0;J@AxF,I:text-align:center;M@7SW,U@9Ba,Q@9Be,F:cursor:pointer;L@A10,1:;H@E0l,C:transparent;I@DC~,X:;padding:6px 12px;font-size:14px;N@DV~,I@6sG,P@9FP,4:-mozI@9FW,L@9GE,H:user-select:none}1U@9Gu,K@14E,f@6mE,J@9JU,1:}X@9Jp,7@C~,4:333;K@Hkl,1:}O@9Ky,A:outline:0;L@A10,1:;R@F6l,Q@9MP,J@8NW,P@9N9,1:}q@9Na,J@9OT,J@81j,1:;8@71G,4:.65;L@NvR,4:65);O@EIW,d:box-shadow:none}.btn-default{color:#333;M@9R0,I:border-color:#ccc}24@9Ri,B:color:#333;J@HcG,6:6e6e6;K@9UU,1:}1B@9Sb,L@A10,1:}8j@9WR,M@9R0,m:border-color:#ccc}.btn-default .badge{color:#fff;K@1nW,Q:3}.btn-primary{color:#fff;O@1nW,1:;K@9gl,1:}V@9oE,1a@9hb,B:color:#fff;I@NPG,S:286090;border-color:#204d74}1B@9i0,L@A10,1:}L@9q0,N@9tT,P@AoW,7e@9mv,O@1nW,1:;K@9gl,Z:}.btn-primary .badge{color:#337ab7;L@AQl,P:}.btn-success{color:#fff;I@NPG,S:5cb85c;border-color:#4cae4c}24@9xf,B:color:#fff;I@NPG,S:449d44;border-color:#398439}X@A8G,Y@AjG,8:success{L@A10,1:}8j@A1O,I@NPG,S:5cb85c;border-color:#4cae4c}K@AAx,E:color:#5cb85c;L@AQl,M:}.btn-info{color:#fff;I@NPG,S:5bc0de;border-color:#46b8da}1n@ADA,B:color:#fff;J@1nW,R:1b0d5;border-color:#269abc}12@AG0,L@A10,1:}7t@AHT,I@NPG,w:5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;L@AQl,P:}.btn-warning{color:#fff;J@Kil,R:0ad4e;border-color:#eea236}V@AZW,1a@ASt,B:color:#fff;J@HcG,R:c971f;border-color:#d58512}X@Ac~,Y@AjG,8:warning{L@A10,1:}8j@AX7,J@Kil,y:0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;L@AQl,O:}.btn-danger{color:#fff;K@NPG,Q:534f;border-color:#d43f3a}1z@Ahw,B:color:#fff;I@NPG,S:c9302c;border-color:#ac2925}18@Aky,L@A10,1:}8S@AmW,K@NPG,w:534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;L@AQl,P:}.btn-link{color:#337ab7;J@AxF,G:border-radius:0}1T@Axs,S@GWl,1:;O@EIW,G:box-shadow:none}w@A~_,P:border-color:transparent}V@A~j,F:{color:#23527c;G@Hkl,A:underline;S@GWl,1:}K@Gxz,U@AJE,18@B3V,B:color:#777;K@Hkl,1:}R@B5F,I@CxG,F@Efv,M@7tV,H@NsG,S:}.btn-sm,.btn-group-sm>.btn{H@B7V,V:font-size:12px;line-height:1.5;H@Ns~,1:}R@B8h,k:padding:1px 5px;font-size:12px;line-height:1.5;H@Ns~,1A:}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}1S@BBh,R:width:100%}.fade{opacity:0;J@Itk,N:opacity .15s linear;-o-U@BEy,1:;U@BEy,1O:}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;I@EKG,G:}tr.collapse.in{H@Oil,J:}tbody.collapse.in{H@Oil,J:-group}.collapsing{I@7Jl,9:height:0;G@ImW,I@Itk,T@BLU,2:-od@BJx,c@BJy,I@Itk,14:-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;I@Itk,M@BNk,3:-o-V@BOj,1:;V@BOj,1:}V@BPG,I@7Jl,L@7RW,L@7SW,1:}e@BQs,I@7Jl,B:float:left}3O@BS5,A:z-index:2}1h@BVh,x:margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar G@BPG,L@BYj,B:float:left}14@BZJ,G:margin-left:5px}19@B_h,G:border-radius:0}S@BbA,E:margin-left:0}R@BbA,H@CBG,N@BaU,T@Bc~,O@LCG,2:0}1R@Bdw,Q@M7~,2:0;N@LOG,2:0}L@BjF,C:{float:left}M@BjF,H@C6G,N@BhW,G:border-radius:0}p@BjF,1J@Bj0,T@Bc~,O@LCG,2:0}M@BjF,S@BeB,I@CDk,Q@M7~,2:0;N@LOG,D:0}.btn-group G@D1W,e@Bnj,A:outline:0}X@Bob,Z:padding-left:8px;padding-right:8px}_@Bpn,I:padding-left:12px;I@Bqj,1:}W@BtE,1:{R@F6l,Q@9MP,J@8NW,P@9N9,1:}f@BtE,O@EIW,u:box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{N@BvP,K@5QV,2:0}N@BwB,N:border-width:0 5px 5px}O@BTG,V@C0G,V@C0G,u:>.btn{display:block;float:none;width:100%;max-width:100%}O@BTG,N:-group>.btn{float:none}O@BTG,U@C0k,M@BWG,K@CAl,l@C0k,U:margin-top:-1px;margin-left:0}P@BTG,H@C6G,H@CBG,H:{border-radius:0}Q@BTG,S@C3l,O@LCG,4:4px;T@Bc~,Q@M7~,2:0}P@BTG,S@BeB,1:{Q@M7~,4:4px;O@LCG,2:0;N@LOG,2:0}O@BTG,O@D9w,N@BhW,G:border-radius:0}O@BTG,a@CAz,P@Bj0,13@CAl,T@Bc~,Q@M7~,2:0}O@BTG,q@CDC,O@LCG,2:0;N@LOG,2:0}K@CIG,i:{display:table;width:100%;table-layout:fixed;O@CPW,1:}P@CIG,1:,V@CIG,C:{float:none;I@P5l,A:;width:1%}a@CIG,B:width:100%}X@CIG,O:dropdown-menu{left:auto}e@CLl,2s@CKh,I:position:absolute;M@CNw,J@81j,E:}.input-group{I@7Jl,8@OnC,6:table;O@CPW,1:}S@CPw,f:float:none;padding-left:0;padding-right:0}Q@Czj,1:{I@7Jl,l:z-index:2;float:left;width:100%;margin-bottom:0}U@CYi,T@CZz,6:addon,a@CZz,D:{height:46px;I@CxG,F@Efv,M@7tV,H@NsG,1:}J@CgV,2:lgL@CkE,T@CZz,n@CXE,T:height:46px;line-height:46px}L@Chl,41@CYv,C:height:auto}H@ClW,1M@CcT,C:height:30px;H@B7V,V:font-size:12px;line-height:1.5;H@Ns~,1:}N@CgV,J@CkG,T@ClW,P@CXE,P@Cli,T:height:30px;line-height:30px}4M@Chl,C:height:auto}I@8RV,H@D1l,1:,Q@Czj,1:{I@P5l,1:}I@8RV,2M@Co0,G:border-radius:0}I@8RV,H@D1l,A:{width:1%;I@DC~,1:;L@7SW,1:}J@8RV,W:padding:6px 12px;font-size:14px;J@AxF,g:line-height:1;color:#555;text-align:center;L@HcG,1:;I@E0l,4:ccc;H@Dp0,1:}I@8RV,A:.input-sm{H@B7V,F:font-size:12px;H@Ns~,1:}I@8RV,A:.input-lg{I@CxG,F:font-size:18px;H@NsG,1:}I@8RV,L@CKV,I@8RV,1: M@7WW,E:{margin-top:0}58@Czj,T@Bc~,O@LCG,2:0}I@8RV,S::first-child{border-right:0}R@Czj,2:laS@C~C,2:laM@C~C,J@D1z,X@D1l,2h@D7i,Q@M7~,2:0;N@LOG,2:0}I@8RV,Q::last-child{border-left:0}G@Cll,1:{I@7Jl,C:font-size:0;I@DC~,1:}M@Cll,H@7Jl,1:}L@Cll,N:+.btn{margin-left:-1px}L@Cll,6::hoverH@D1l,e@DFU,A:z-index:2}G@Cll,4::firV@D6~,3:firJ@D7W,J:{margin-right:-1px}G@Cll,s@D6x,1E:{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{I@7Jl,O:display:block}.nav>li>a{I@7Jl,E:display:block;H@JyW,1:}W@DMB,L@Hkl,L@HcG,1:}J@DNU,B:color:#777}I@DNU,7::hover,I@DNU,I::focus{color:#777;L@Hkl,S@GWl,K:;cursor:not-allowed}o@DQH,L@HcG,1:;K@DRW,g:}.nav .nav-divider{height:1px;margin:9px 0;G@ImW,J@HcG,i:5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{I@25z,1M:solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;N@DV~,H@E0l,C:transparent;H@Dp0,U: 4px 0 0}.nav-tabs>li>a:hover{R@DXi,1:}L@DYy,u@DYW,B:color:#555;M@9R0,L@E0l,1:;K@Dnl,R:transparent;cursor:default}O@DaG,R:width:100%;border-bottom:0}N@DaG,F:>li{float:none}N@DaG,O:>li>a{text-align:center;H@Kt~,1:}N@DaG,Q@DvU,J:top:auto;left:auto}P@1_l,N@DaG,4:>li{I@P5l,A:;width:1%}N@DaG,N:>li>a{margin-bottom:0}}N@DaG,L:>li>a{margin-right:0;H@Dp0,1:}N@DaG,1R@DmG,L@E0l,1:}P@1_l,N@DaG,6:>li>a{I@25z,B:solid #ddd;H@Dp0,9: 4px 0 0}N@DaG,1R@DmG,O@Dnl,g:}}.nav-pills>li{float:left}.nav-pills>li>a{H@Dp0,Y:}.nav-pills>li+li{margin-left:2px}M@Dqj,w@DqG,B:color:#fff;O@1nW,1b:}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}I@Del,B:float:none}K@DuG,I:text-align:center;H@Kt~,1:}d@DvG,J:top:auto;left:auto}P@1_l,I@Del,I@P5l,A:;width:1%}K@DuG,H:margin-bottom:0}}K@DyS,t:border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;H@Dp0,1:}T@E09,V@E08,f@E40,L@E0l,1:}P@1_l,P:.nav-tabs-justified>li>a{I@25z,B:solid #ddd;H@Dp0,9: 4px 0 0}T@E09,V@E08,f@E40,O@Dnl,2:}}N@E5E,V:display:none;visibility:hidden}L@E6C,E:display:block;I@EKG,1:}P@E7A,G:margin-top:-1px;O@LCG,2:0;N@LOG,A:0}.navbar{I@7Jl,G:min-height:50px;J@Jw~,H@E0l,C:transparent}P@1_l,8:.navbar{H@Dp0,2:}}P@1_l,R:.navbar-header{float:left}}H@EY0,J@ECk,J:padding-right:15px;I@2dE,X@EDl,r@F6l,1:;N@8NW,N@F8V,1:;W@EG0,1:}G@EY0,K:.in{overflow-y:auto}P@1_l,H@EY0,O:width:auto;border-top:0;O@EIW,G:box-shadow:none}G@EY0,A:.collapse{O@P7l,1:;U@EKG,N:height:auto !important;H@ELF,R@ELa,1:}G@EY0,4:.in{I@EMW,1:}1i@EMu,W:padding-left:0;padding-right:0}}g@EMu,U@EQ0,H:max-height:340px}x@EQp,g@EMu,U@EQ0,I:max-height:200px}}1t@EWP,a:margin-right:-15px;margin-left:-15px}P@1_l,1t@EWP,U:margin-right:0;margin-left:0}}J@EYz,Y:z-index:1000;border-width:0 0 1px}P@1_l,J@EYz,H:border-radius:0}}c@Ea5,g:position:fixed;right:0;left:0;z-index:1030}P@1_l,c@Ea5,z:border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}K@EO0,Q:{bottom:0;margin-bottom:0;K@Eek,h:}.navbar-brand{float:left;padding:15px 15px;F@Efv,T:line-height:20px;height:50px}d@Egj,K@Hkl,1:}I@Ehl,E:display:block}P@1_l,18@Eim,Y:margin-left:-15px}}.navbar-toggle{I@7Jl,1G:float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;S@GWl,1:;L@A10,1:;H@E0l,C:transparent;H@Dp0,1:}L@FxB,A:outline:0}P@Eoi,r:display:block;width:22px;height:2px;border-radius:1px}O@Eoi,Q:+.icon-bar{margin-top:4px}P@1_l,x:.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}H@GPF,H:padding-top:10px;K@EtG,H:line-height:20px}I@QHW,7:767px){W@GmG,p:{position:static;float:none;width:auto;margin-top:0;S@GWl,A:;border:0;O@EIW,G:box-shadow:none}X@GmG,4:li>aX@F0G,h: .dropdown-header{padding:5px 15px 5px 25px}X@GmG,M:li>a{line-height:20px}X@GmG,J@FoW,O@Gg0,C:>li>a:focus{L@A10,2:}}P@1_l,v:.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}H@GPF,H:padding-top:15px;G@EtG,s:5px}}.navbar-form{margin-left:-15px;margin-right:-15px;I@JyW,X@EDl,I@25z,I@EnW,1L@F6l,N@8NW,r@F8V,X:margin-top:8px;margin-bottom:8px}P@1_l,O@FSV,1:{L@7RW,G:margin-bottom:0;L@7SW,1:}J@FSV,8:control{L@7RW,B:width:auto;L@7SW,1:}J@FSV,F:control-static{K@FEG,1:}P@FG0,M:{display:inline-table;L@7SW,1:}20@FG0,B:width:auto}P@FG0,Q:>.form-control{width:100%}S@FJK,G:margin-bottom:0;L@7SW,1:}g@FKb,L@7RW,T:margin-top:0;margin-bottom:0;L@7SW,1:}s@FMo,F:padding-left:0}1M@FO4,I@7Jl,E:margin-left:0}n@FQA,7:top:0}}I@QHW,7:767px){O@FSV,1:{H@Kt~,1:}_@FSV,H:margin-bottom:0}}P@1_l,1C:.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;H@ELF,O@EIW,H:box-shadow:none}}U@FWi,D:margin-top:0;O@LCG,2:0;N@LOG,2:0}T@EO0,b:nav>li>.dropdown-menu{margin-bottom:0;O@LCG,4:4px;N@LOG,4:4px;T@Bc~,Q@M7~,k:0}.navbar-btn{margin-top:8px;margin-bottom:8px}J@FbF,G:margin-top:10px;I@8hV,1:}J@FcD,10:margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;I@6Dl,1:}P@1_l,x:.navbar-text{float:left;margin-left:15px;margin-right:15px}}P@1_l,D:.navbar-left{L@FgT,F:}.navbar-right{N@FhC,1F:margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{J@Kil,6:8f8f8;K@F~0,1:}O@FzW,H:brand{color:#777}O@FzW,K@GMk,G@Fql,Q:brand:focus{color:#5e5e5e;S@GWl,1:}P@FvW,F:ext{color:#777}O@FzW,K:nav>li>a{color:#777}O@FzW,r@FoS,B:color:#333;S@GWl,1:}O@FzW,1b@FqQ,B:color:#555;J@HcG,6:7e7e7}O@FzW,1h@Ft4,B:color:#ccc;S@GWl,1:}V@FvW,H@Nq~,1:}U@FvW,O@GIk,K@FxC,J@NPG,3:dd}U@FvW,B: .icon-bar{I@NPG,4:888}O@FzW,H@EPk,G@Fql,5:form{K@F~0,1:}O@FzW,1W@F~k,J@HcG,H:7e7e7;color:#555}I@QHW,7:767px){O@FzW,O@Gg0,H:>li>a{color:#777}O@FzW,O@Gg0,c@FoV,R@Gil,H:focus{color:#333;S@GWl,1:}O@FzW,O@Gg0,b@FqT,V@GlW,O@GIk,l@G8W,B:color:#555;J@HcG,6:7e7e7}O@FzW,O@Gg0,d@Ft7,N@GlW,P@GVW,J@Fql,N@GlW,H@FuV,B:color:#ccc;S@GWl,2:}}O@FzW,G:link{color:#777}O@FzW,B:link:hover{8@KRR,3:33}H@FzW,K:btn-link{color:#777}H@FzW,N@GxV,I@GIU,6:focus{8@KRR,3:33}H@FzW,J@Gx~,Q@AJE,O@GFW,1_@GIk,R:color:#ccc}.navbar-inverse{I@NPG,4:222;K@GLF,1:}O@Gm0,K:brand{color:#9d9d9d}O@Gm0,l@GMk,B:color:#fff;S@GWl,1:}O@Gm0,J:text{color:#9d9d9d}R@Gm0,K:>li>a{color:#9d9d9d}R@Gm0,K@FoV,J@Gfl,N:>li>a:focus{color:#fff;S@GWl,1:}R@Gm0,J@FqT,J@Gfl,h@Gml,H@G8~,B:color:#fff;O@GU0,1:}R@Gm0,1e@GUr,B:color:#444;S@GWl,1:}O@Gm0,7:toggle{G@DRW,2:3}O@Gm0,L@Fwj,G@Gfl,D:toggle:focus{K@1nW,2:3}O@Gm0,H:toggle .icon-bar{L@AQl,1:}O@Gm0,H@EPk,G@Gfl,5:form{K@Gak,1:}R@Gm0,6:>.openW@GV0,4:open_@Gqi,F:>.open>a:focus{O@GU0,C:;color:#fff}I@QHW,7:767px){n@Gm0,G:dropdown-header{K@GLF,1:}l@Gm0,A: .divider{O@GU0,1:}m@Gm0,J:li>a{color:#9d9d9d}m@Gm0,J@FoW,d@Gfl,N:>li>a:focus{color:#fff;S@GWl,1:}v@Gm0,x@Gn0,t@Gql,Q:active>a:focus{color:#fff;O@GU0,1:}n@Gm0,2H@Gpd,B:color:#444;S@GWl,2:}}O@Gm0,J:link{color:#9d9d9d}O@Gm0,M:link:hover{color:#fff}H@Gm0,N:btn-link{color:#9d9d9d}H@Gm0,d@GxV,I::focus{color:#fff}H@Gm0,J@Gx~,Q@AJE,G@GaG,1h@GxV,d:color:#444}.breadcrumb{padding:8px 15px;J@Jw~,G:list-style:none;J@Kil,6:5f5f5;H@Dp0,G:}.breadcrumb>li{K@FEG,1:}P@H10,f:content:"/\00a0";padding:0 5px;color:#ccc}K@H2E,N:color:#777}.pagination{L@7RW,T:padding-left:0;margin:20px 0;H@Dp0,V:}.pagination>li{display:inline}a@H4o,I@7Jl,S:float:left;padding:6px 12px;N@DV~,L@Hkl,E:color:#337ab7;M@9R0,L@E0l,I:;margin-left:-1px}y@H8Q,E:margin-left:0;Q@M7~,4:4px;N@LOG,4:4px}w@HAe,R@Lxk,4:4px;O@LCG,4:4px}1Y@HCc,E:color:#23527c;L@HcG,1:;H@Nq~,1:}K@HHG,2H@HFU,L:z-index:2;color:#fff;O@1nW,1:;K@DRW,G:;cursor:default}M@HKk,4:spanN@HKj,N@HDD,1e@HKQ,B:color:#777;M@9R0,I@Nq~,J:cursor:not-allowed}H@HQk,3:>a,H@HQk,6:>span{I@CxG,F:font-size:18px}I@HQk,m@HOy,Q@M7~,4:6px;N@LOG,4:6px}11@HQk,R@Lxk,4:6px;O@LCG,4:6px}g@HSo,H@B7V,F:font-size:12px}13@HU6,T@M7~,1:;Q@LOG,1:}11@HWA,V@Lrk,R@LCG,1W:}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}R@H_0,L@7RW,H:padding:5px 14px;M@9R0,L@E0l,K:;border-radius:15px}_@HbH,L@Hkl,L@HcG,1:}X@Hcd,C:float:right}e@HdQ,B:float:left}I@He~,K@Hez,q@Heu,B:color:#777;M@9R0,e:cursor:not-allowed}.label{display:inline;N@Hh9,1A:font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;I@DC~,1:;O@H~f,J@Hji,d:}a.label:hover,a.label:focus{color:#fff;L@Hkl,q:cursor:pointer}.label:empty{display:none}.btn .label{I@7Jl,O:top:-1px}.label-default{L@I0l,1:}L@Hnh,X@Hnb,I@NPG,M:5e5e5e}.label-primary{O@1nW,1:}L@Hpi,X@Hpc,I@NPG,M:286090}.label-success{I@NPG,7:5cb85c}L@Hrj,X@Hrd,I@NPG,J:449d44}.label-info{I@NPG,I:5bc0de}.label-infoK@HpW,H@Htl,J@1nW,L:1b0d5}.label-warning{J@Kil,6:0ad4e}r@HvC,J@HcG,K:c971f}.label-danger{K@NPG,5:534f}p@HxC,I@NPG,E:c9302c}.badge{L@7RW,1O:min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;O@H~f,I@DC~,J:;text-align:center;M@I0l,u:border-radius:10px}.badge:empty{display:none}.btn .badge{I@7Jl,j:top:-1px}.btn-xs .badge{top:0;padding:1px 5px}S@I3P,B:color:#fff;L@Hkl,F:cursor:pointer}N@KGl,_@I56,E:color:#337ab7;L@AQl,1:}G@LBW,K:>.badge{float:right}G@LBW,1I:>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{I@I8j,X:margin-bottom:30px;color:inherit;L@HcG,1:}T@IHE,R:color:inherit}.jumbotron p{J@6Dl,i:font-size:21px;font-weight:200}.jumbotron>hr{O@ICD,1:}n@ICd,H@NsG,b:}.jumbotron .container{max-width:100%}_@IER,Q:.jumbotron{padding:48px 0}n@ICd,I@IGU,J:padding-right:60px}T@IHE,q:font-size:63px}}.thumbnail{display:block;padding:4px;J@Jw~,N@DV~,M@9R0,L@E0l,1:;I@6sG,J@Itk,N@IKy,3:-o-X@IL~,1:;X@IL~,1:}W@16h,Z:margin-left:auto;margin-right:auto}s@INj,K@DRW,1:}K@IO~,g:padding:9px;color:#333}.alert{padding:15px;J@Jw~,H@E0l,C:transparent;H@Dp0,27:}.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}b@ITo,J:padding-right:35px}p@IUm,I@7Jl,n:top:-2px;right:-21px;color:inherit}.alert-success{J@NPG,6:ff0d8;K@NJU,F:;color:#3c763d}I@IXz,P:border-top-color:#c9e2b3}R@IYj,Q:color:#2b542c}.alert-info{P@NPG,K@NPh,s:;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}O@IaS,T:color:#245269}.alert-warning{J@Kil,1K:cf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}R@IdD,S:color:#66512c}.alert-danger{J@Kil,e:2dede;border-color:#ebccd1;color:#a94442}H@IfG,P:border-top-color:#e4b9c0}Q@If~,E:color:#843534}d@Igh,5:from{Q@IlC,4:}to{K@IlC,9:0 0}}@-o-V@IkW,5:from{Q@IlC,4:}to{K@IlC,5:0 0}}W@IkV,5:from{Q@IlC,4:}to{K@IlC,F:0 0}}.progress{G@ImW,C:height:20px;J@Jw~,J@Kil,6:5f5f5;I@6sG,V@F6l,K:2px rgba(0,0,0,0.1);N@8NW,1~:2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;O@1nW,1:;R@F6l,K@2UV,4:15);J@8NW,K@2UV,4:15);Y@Itk,T@IuK,P@IuN,1:}r@IvG,I@IzG,2n@JfD,2~@IzG,2w@JaW,1:;Y@J4H,P@J4P,1:}p@J5I,v@J69,2:-oo@J6G,m@J7z,N:}.progress-bar-success{I@NPG,7:5cb85c}V@IvG,9:-success{I@IzG,2n@JfD,2~@IzG,2w@JaW,K:}.progress-bar-info{I@NPG,7:5bc0de}V@IvG,6:-info{I@IzG,2n@JfD,2~@IzG,2w@JaW,1:}M@JUz,J@Kil,6:0ad4e}V@IvG,9:-warning{I@IzG,2n@JfD,2~@IzG,2w@JaW,1:}L@JdU,K@NPG,5:534f}V@IvG,8:-danger{I@IzG,2n@JfD,2~@IzG,2w@JaW,O:}.media{margin-top:15px}J@JoU,1i:margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}J@Jsj,V:>.pull-right{padding-left:10px}U@Jrh,J:padding-right:10px}a@JsY,I@P5l,1:;I@JtW,F:}.media-middle{L@7SW,F:}.media-bottom{L@Juk,T:}.media-heading{margin-top:0;H@Kt~,t:}.media-list{padding-left:0;list-style:none}.list-group{J@Jw~,F:padding-left:0}G@LBW,1:{I@7Jl,E:display:block;I@JyW,J:margin-bottom:-1px;M@9R0,L@E0l,1:}T@LBW,O@LCG,4:4px;N@LOG,4:4px}H@LBW,R:last-child{margin-bottom:0;R@Lxk,4:4px;Q@M7~,5:4px}aG@LBW,D:{color:#555}aG@LBW,Q@Kgk,C:color:#333}aH@LBW,N@KpF,7::focus{L@Hkl,B:color:#555;J@Kil,6:5f5f5}H@KGl,19@K5j,L@HcG,V:;color:#777;cursor:not-allowed}H@KGl,Q@KA~,P@KHV,W@KBk,P@KHV,8:disabledO@KQF,M:heading{color:inherit}H@KGl,2B@KA~,B:color:#777}N@KGl,U@KGk,V@KEF,L:z-index:2;color:#fff;O@1nW,1:;K@DRW,1:}N@KGl,g@K8F,a@KMO,U@KEF,g@K8F,W@KLW,4p@KJF,E:color:inherit}N@KGl,I@Kgk,1i@KO~,E:color:#c7ddef}H@Kgl,M:success{color:#3c763d;J@NPG,7:ff0d8}aH@Kgl,N:success{color:#3c763d}aH@Kgl,6:succesR@KA0,F:color:inherit}aH@Kgl,j@KUC,E:color:#3c763d;J@NPG,7:0e9c6}aH@Kgl,1T@KVw,B:color:#fff;J@1nW,6:c763d;K@89j,1:}H@Kgl,J:info{color:#31708f;O@NPG,2:}aH@Kgl,K:info{color:#31708f}aH@Kgl,U@K_T,F:color:inherit}aH@Kgl,d@KaW,E:color:#31708f;I@NPG,8:c4e3f3}aH@Kgl,1K@Kc9,B:color:#fff;J@1nW,R:1708f;border-color:#31708f}H@Kgl,M:warning{color:#8a6d3b;J@Kil,7:cf8e3}aH@Kgl,N:warning{color:#8a6d3b}aH@Kgl,X@Kgd,F:color:inherit}aH@Kgl,j@Khj,E:color:#8a6d3b;O@Kil,2:}aH@Kgl,1T@KjT,B:color:#fff;I@NPG,7:8a6d3b;K@8MG,1:}H@Kgl,L:danger{color:#a94442;J@Kil,7:2dede}aH@Kgl,M:danger{color:#a94442}aH@Kgl,4:dangR@KJl,G:{color:inherit}aH@Kgl,h@Kp8,E:color:#a94442;J@HcG,7:bcccc}aH@Kgl,6:dangerQ@KcD,v@KrL,B:color:#fff;P@KsW,K@8dE,1:}P@Kgl,D:margin-top:0;H@Kt~,1:}H@Kgl,h:text{margin-bottom:0;line-height:1.3}.panel{J@Jw~,M@9R0,H@E0l,C:transparent;I@6sG,J@F6l,L@6~W,6:0.05);a@Kxl,e:}.panel-body{padding:15px}.panel-heading{I@JyW,I@25z,I@EnW,S@LCG,Q@LOG,1:}f@L00,1L:color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}1X@L2I,S:color:inherit}.panel-footer{I@JyW,J@Kil,6:5f5f5;L@EDl,5:#ddd;V@Lrk,T@M7~,1:}r@L6c,M:margin-bottom:0}.panelT@L8h,Z@LAl,H@LBV,1:{I@Eek,H:;border-radius:0}28@L9q,D:border-top:0;S@LCG,Q@LOG,1:}24@LDC,G:border-bottom:0;V@Lrk,T@M7~,1:}t@LGd,J:border-top-width:0}Q@LHt,J:border-top-width:0}1C@LIf,G:margin-bottom:0}1_@LKB,I@2dE,J:padding-right:15px}P@LOi,P@MgW,V@LQ0,1:{S@LCG,Q@LOG,1:}4d@LOi,Q@LOG,1:;R@LCG,1:}v@LOi,19@LY0,x@LUk,m@LjW,1_@LRl,T@LY0,m@LmG,15@LRl,X@LUk,R@M3V,m@Lp0,1_@LRl,G: th:first-child{Q@LOG,1:}v@LOi,d@MB~,U@LNF,X@LQV,S@MB~,19@LjW,h@LaF,6E@Ljj,R@LCG,1:}O@LyG,P@MgW,T@M6l,1:{V@Lrk,T@M7~,1:}s@LyG,P@MgW,V@M6l,2g@LuW,T@M7~,1:;U@Lxk,1:}Ah@LyG,T@M7~,1:}w@LyG,O@MGF,f@M1F,V@M30,R@LkF,g@M5V,Q@LkF,1B@M1F,a@MGF,X@M30,O@MGF,f@M1F,X@M30,2p@MGF,U@Lxk,1:}1z@MJc,L@EDl,5:#ddd}l@MMr,p@MMp,D:border-top:0}M@MZw,f@MOG,9:border:0}Z@MZw,_@LRl,G@MO0,99@MQV,E:border-left:0}AK@MZw,F:border-right:0}V@MZw,H@5GF,e@MiG,O@5FW,N@MZx,a@Mmh,4J@MmG,G:border-bottom:0}O@MZw,6W@MrG,G:border-bottom:0}O@Mwl,c:{border:0;margin-bottom:0}.panel-group{I@MzF,1:}J@N3z,H:{margin-bottom:0;H@Dp0,1:}J@N3z,N:+.panel{margin-top:5px}K@N3z,O:heading{border-bottom:0}K@N3z,P@N2E,13@N1k,L@EDl,5:#ddd}Q@N3z,E:{border-top:0}s@N3z,I@25z,Q:solid #ddd}.panel-default{H@Nq~,1:}U@N5y,B:color:#333;J@Kil,6:5f5f5;H@Nq~,1:}T@N5y,1:+H@LLG,B:panel-body{J@ICD,3:dd}T@N5y,M: .badge{color:#f5f5f5;K@1nW,2:3}M@N5y,Z@NZG,L@Dnl,J:ddd}.panel-primary{K@DRW,1:}M@NGD,J:heading{color:#fff;O@1nW,1:;K@DRW,1:}M@NGD,P@N2E,_:panel-body{border-top-color:#337ab7}M@NGD,T:heading .badge{color:#337ab7;L@AQl,1:}u@NGD,L@Dnl,M:337ab7}.panel-success{K@NJU,1:}U@NIG,E:color:#3c763d;J@NPG,6:ff0d8;K@NJU,1:}T@NIG,1:+H@LLG,B:panel-body{J@ICD,6:6e9c6}T@NIG,M: .badge{color:#dff0d8;J@1nW,6:c763d}M@NIG,Z@NZG,L@Dnl,J:d6e9c6}.panel-info{K@NPh,1:}Q@NRO,F:{color:#31708f;P@NPG,K@NPh,1:}Q@NRO,1:+H@LLG,B:panel-body{O@NQy,1:}Y@NRO,E:color:#d9edf7;J@1nW,6:1708f}r@NSe,L@Dnl,g:bce8f1}.panel-warning{border-color:#faebcc}T@NWE,F:{color:#8a6d3b;J@Kil,R:cf8e3;border-color:#faebcc}v@NWE,O@NXB,1:}T@NWE,M: .badge{color:#fcf8e3;I@NPG,7:8a6d3b}M@NWE,Z@NZG,M@Dnl,e:aebcc}.panel-danger{border-color:#ebccd1}S@NbW,F:{color:#a94442;J@Kil,R:2dede;border-color:#ebccd1}u@NbW,O@NcS,1:}S@NbW,M: .badge{color:#f2dede;O@KsW,1:}L@NbW,Z@NZG,L@Dnl,P:ebccd1}.embed-responsive{I@7Jl,m:display:block;height:0;padding:0;overflow:hidden}2B@Nh9,18:position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}Z@Nls,6:16by9{L@NlV,1:}d@Nls,P:padding-bottom:75%}.well{G@Nn0,D:padding:19px;J@Jw~,J@Kil,6:5f5f5;I@E0l,7:e3e3e3;I@6sG,V@F6l,L:1px rgba(0,0,0,0.05);e@8NW,K:5)}.well blockquote{I@Nq~,T@NrK,N:}.well-lg{padding:24px;H@NsG,M:}.well-sm{padding:9px;H@Ns~,1m:}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;O@NvR,1:}Q@Nvr,B:color:#000;L@Hkl,Q:cursor:pointer;opacity:.5;L@NvR,1A:50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;N@Yz,1:}92@NzZ,Q:content:" ";display:table}4Q@O87,1M:clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{M@FhC,C:}.pull-left{L@FgT,7:}.hide{N@PD0,7:}.show{O@P7l,p:}.invisible{visibility:hidden}.text-hide{font:0/0 a;I@OHE,H:text-shadow:none;S@GWl,I:;border:0}.hidden{N@PD0,1:;S@OJ8,t:}.affix{position:fixed}@-ms-viewport{width:device-width}l@OKd,N@PD0,1:}3t@OLq,N@PD0,1:}I@QHW,J:767px){.visible-xs{O@P7l,I:}table.visible-xs{D@OSJ,F:}tr.visible-xs{S@Oil,1:}S@OSr,T@P5l,2:}}I@QHW,P:767px){.visible-xs-block{O@P7l,2:}}I@QHW,Q:767px){.visible-xs-inline{P@P9i,2:}}I@QHW,7:767px){P@OWy,K@FEG,D: !important}}k@Ocl,C:.visible-sm{O@P7l,j:}table.visible-sm{display:table}tr.visible-sm{S@Oil,T:}th.visible-sm,td.visible-sm{T@P5l,2:}}k@Ocl,I:.visible-sm-block{O@P7l,2:}}k@Ocl,J:.visible-sm-inline{P@P9i,2:}}k@Ocl,P@OfC,K@FEG,D: !important}}l@OgG,C:.visible-md{O@P7l,j:}table.visible-md{display:table}tr.visible-md{S@Oil,T:}th.visible-md,td.visible-md{T@P5l,2:}}l@OgG,I:.visible-md-block{O@P7l,2:}}l@OgG,I@OoV,1:{P@P9i,2:}}l@OgG,P@OoV,K@FEG,D: !important}}I@OgG,K:1200px){.visible-lg{O@P7l,1:}H@Oql,S:display:table}tr.visible-lg{S@Oil,1:}S@OsG,T@P5l,2:}}I@OgG,8:1200px){H@OOk,1:{O@P7l,2:}}I@OgG,R:1200px){.visible-lg-inline{P@P9i,2:}}I@OgG,8:1200px){P@OwQ,K@FEG,D: !important}}I@QHW,I:767px){.hidden-xs{N@PD0,2:}}k@Ocl,B:.hidden-sm{N@PD0,2:}}l@OgG,B:.hidden-md{N@PD0,2:}}I@OgG,J:1200px){.hidden-lg{N@PD0,H:}}.visible-print{N@PD0,T:}@media print{.visible-print{O@P7l,Z:}table.visible-print{display:table}H@P4G,S@Oil,1:}Y@P59,T@P5l,N:}}.visible-print-block{N@PD0,Z:}@media print{.visible-print-block{O@P7l,2:}}M@P8F,N@PD0,E:}@media print{M@P8F,P@P9i,2:}}L@P8F,7:-block{N@PD0,E:}@media print{L@P8F,7:-block{K@FEG,d: !important}}@media print{.hidden-print{N@PD0,1:}1Sr@PDS,2hOHxq; |
| --- a/skins/bootstrap/css.txt | |
| +++ b/skins/bootstrap/css.txt | |
| @@ -0,0 +1,11 @@ | |
| --- a/skins/bootstrap/css.txt | |
| +++ b/skins/bootstrap/css.txt | |
| @@ -0,0 +1,11 @@ | |
| 1 | /*! |
| 2 | * Bootstrap v3.3.2 (http://getbootstrap.com) |
| 3 | * Copyright 2011-2015 Twitter, Inc. |
| 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
| 5 | */ |
| 6 | |
| 7 | /*! |
| 8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=fe63ebfc82d223781373) |
| 9 | * Config saved to config.json and https://gist.github.com/fe63ebfc82d223781373 |
| 10 | *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure, Bootstrap v3.3.2 (http:/*! |
| 11 | * Bootstrablock}S@6f,L@7RW,N@H~f,1:}M@7w,M:display:none;height:0}I@8k,F:display:none}a{S@GWl,d:}a:active,a:hover{outline:0}abbr[title]{O@25z,2f:}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;I@7Jl,N@H~f,1e:}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{S@Vz,V@WT,M@W~,j:;height:0}pre{overflow:auto}code,kbd,pre,samp{X@JN,E:font-size:1em}b@KB,1A:color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{J@ME,1:}1A@M_,J@Yz,M:button;cursor:pointer}b@OV,F:cursor:default}m@PP,P:border:0;padding:0}input{I@Qj,1:}M@7WW,1:,J@CKW,1:{J@WT,F:border-box;-mozN@6fW,M@Sl,A:padding:0}1W@TL,C:height:auto}L@75~,T@VU,S@Vz,V@WT,M@W~,1:}K@75~,H@YV,z@Xy,N@Yz,A:}fieldset{I@E0l,K:c0c0c0;margin:0 2px;T@_G,1I:}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{G@CPW,f:collapse;border-spacing:0}td,th{padding:0}1L@cQ,D:@media print{J@e0,Y@eO,M@e~,N@EIW,1F: !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{G@Hkl,O:underline}a[href]:after{R@i8,l:}abbr[title]:after{content:" (" attr(title) ")"}l@j_,Q:content:""}pre,blockquote{I@E0l,4:999;N@mk,e:}thead{display:table-header-group}tr,img{N@mk,10:}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{M@oh,t:}select{background:#fff !important}.navbar{display:none}W@qM,W@qw,8:}.label{I@E0l,B:000}.table{G@CPW,K:collapse !important}K@t0,L@AQl,C: !important}b@u0,L@E0l,F: !important}}*{J@WT,F:border-box;-mozN@6fW,L@Sl,I:}*:before,*:after{J@WT,F:border-box;-mozN@6fW,L@Sl,L:}html{font-size:10px;e@yo,6:}body{t@zc,F:font-size:14px;N@DV~,B:color:#333;L@AQl,1:}T@10p,b:font-family:inherit;font-size:inherit;J@120,H:}a{color:#337ab7;K@Hkl,V:}a:hover,a:focus{color:#23527c;G@Hkl,I:underline}a:focus{K@14E,f@6mE,J@9JU,L:}figure{margin:0}img{L@7SW,1:}l@16S,r:display:block;max-width:100%;height:auto}.img-rounded{H@NsG,S:}.img-thumbnail{padding:4px;N@DV~,M@9R0,L@E0l,1:;I@6sG,J@Itk,K@1C0,Y@1BG,V@1Aj,L@7RW,1C:max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;J@Jw~,9:border:0;L@EDl,1B:#eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;G@ImW,M@CNw,9:border:0}o@1HO,1B:position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}f@1Jf,12:font-family:inherit;font-weight:500;line-height:1.1;color:inherit}3l@1L_,J@AxF,P:line-height:1;color:#777}L@1QB,G:margin-top:20px;I@8hV,1:}1t@1RB,o:font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;I@8hV,1:}1t@1UM,2f:font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{J@Jw~,V:font-size:16px;font-weight:300;C@795,4:1.4}P@1_l,x:.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{J@Kil,2O:cf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{I@DC~,H:}.text-lowercase{O@1f9,H:}.text-uppercase{O@26z,1V:}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}L@1h~,1b:color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}I@1kE,1d:color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}K@1mS,a:color:#843534}.bg-primary{color:#fff;O@1nW,K:}a.bg-primary:hover{I@NPG,J:286090}.bg-success{J@NPG,P:ff0d8}a.bg-success:hover{I@NPG,G:c1e2b3}.bg-info{O@NPG,H:}a.bg-info:hover{J@KsW,I:fd9ee}.bg-warning{J@Kil,P:cf8e3}a.bg-warning:hover{J@Kil,H:7ecb5}.bg-danger{J@Kil,6:2dede}I@1tW,J@HcG,J:4b9b9}.page-header{J@1uW,J:margin:40px 0 20px;I@25z,U:solid #eee}ul,ol{margin-top:0;I@8hV,1:}O@1wP,2B:margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{L@7RW,H@1zk,Y:padding-right:5px}dl{margin-top:0;I@MzF,7:}dt,dd{M@DV~,b:}dt{font-weight:bold}dd{margin-left:0}P@1_l,I@21k,o:float:left;width:160px;clear:left;text-align:right;G@ImW,N:text-overflow:ellipsis;I@DC~,b:}.dl-horizontal dd{margin-left:180px}}b@256,C:cursor:help;T@25z,R:}.initialism{font-size:90%;O@26z,j:}blockquote{padding:10px 20px;margin:0 0 20px;H@28F,R:border-left:5px solid #eee}1A@290,G:margin-bottom:0}H@2CW,_@2Al,S:display:block;font-size:80%;N@DV~,B:color:#777}1A@2CW,L@2Di,1:}J@2Jy,M@2LW,Z:{padding-right:15px;padding-left:0;S@2FQ,V:border-left:0;text-align:right}3G@2GT,B:content:''}3A@2Jy,U:content:'\00A0 \2014'}address{J@Jw~,I:font-style:normal;M@DV~,J:}code,kbd,pre,samp{u@2P6,n:}code{padding:2px 4px;font-size:90%;color:#c7254e;J@Kil,6:9f2f4;H@Dp0,j:}kbd{padding:2px 4px;font-size:90%;color:#fff;K@1nW,2:3;H@Ns~,1:;R@F6l,N@2UV,1:;J@8NW,N@2UV,o:}kbd kbd{padding:0;font-size:100%;font-weight:bold;O@EIW,1F:box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;N@DV~,L@2YC,W:word-wrap:break-word;color:#333;J@Kil,6:5f5f5;I@E0l,4:ccc;H@Dp0,19:}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;S@GWl,X:;border-radius:0}.pre-scrollable{H@2bk,10:overflow-y:scroll}.container{margin-right:auto;margin-left:auto;I@2dE,J:padding-right:15px}P@1_l,O:.container{width:750px}}O@OgG,P:{.container{width:970px}}I@OgG,X:1200px){.container{width:1170px}}G@O90,_:{margin-right:auto;margin-left:auto;I@2dE,y:padding-right:15px}.row{margin-left:-15px;margin-right:-15px}8R@2jD,I@7Jl,F:min-height:1px;I@2dE,J:padding-right:15px}26@2sx,h:float:left}.col-xs-12{width:100%}.col-xs-11{I@3R0,C:}.col-xs-10{I@2wU,V:}.col-xs-9{width:75%}.col-xs-8{I@3Sl,x:}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{I@3UV,x:}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{I@3WE,38:}.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{I@33G,2d:}.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{H@4nG,31:}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{H@3iG,d:}.col-xs-push-6{left:50%}.col-xs-push-5{H@3BW,G:}.col-xs-push-4{H@3tk,d:}.col-xs-push-3{left:25%}.col-xs-push-2{H@3vG,G:}.col-xs-push-1{G@3MW,Q:}.col-xs-push-0{left:auto}I@3EW,H:margin-left:100%}G@3EW,2:1{O@3FT,1:}G@3EW,2:0{O@3GD,o:}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{O@3qT,P:}.col-xs-offset-7{margin-H@3iG,v:}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-H@3BW,I:}.col-xs-offset-4{O@3td,1:}H@3Kl,X:margin-left:25%}.col-xs-offset-2{C@8xy,D:16.66666667%}G@3EW,1:{N@3vz,W:}.col-xs-offset-0{margin-left:0}P@1_l,26@3No,h:float:left}.col-sm-12{width:100%}.col-sm-11{I@3R0,C:}.col-sm-10{I@2wU,V:}.col-sm-9{width:75%}.col-sm-8{I@3Sl,x:}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{I@3UV,x:}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{I@3WE,38:}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{I@33G,2d:}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{H@4nG,1N:}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}G@3g0,1Q:left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{H@3iG,d:}.col-sm-push-6{left:50%}.col-sm-push-5{H@3BW,G:}.col-sm-push-4{H@3tk,d:}.col-sm-push-3{left:25%}.col-sm-push-2{H@3vG,G:}.col-sm-push-1{G@3MW,y:}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}I@3nk,O@3FT,J:}.col-sm-offset-10{O@3GD,o:}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{O@3qT,P:}.col-sm-offset-7{margin-H@3iG,v:}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-H@3BW,I:}.col-sm-offset-4{O@3td,o:}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{C@8xy,U:16.66666667%}.col-sm-offset-1{N@3vz,X:}.col-sm-offset-0{margin-left:0}}O@OgG,1:{26@3xY,h:float:left}.col-md-12{width:100%}.col-md-11{I@3R0,C:}.col-md-10{I@2wU,V:}.col-md-9{width:75%}.col-md-8{I@3Sl,x:}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{I@3UV,x:}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{I@3WE,38:}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{I@33G,2d:}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{H@4nG,31:}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{H@3iG,d:}.col-md-push-6{left:50%}.col-md-push-5{H@3BW,G:}.col-md-push-4{H@3tk,d:}.col-md-push-3{left:25%}.col-md-push-2{H@3vG,G:}.col-md-push-1{G@3MW,Q:}.col-md-push-0{left:auto}I@4Ml,H:margin-left:100%}G@4Ml,2:1{O@3FT,1:}G@4Ml,2:0{O@3GD,o:}.col-md-offset-9{margin-left:75%}.col-md-offset-8{O@3qT,P:}.col-md-offset-7{margin-H@3iG,1:}H@4RW,d:margin-left:50%}.col-md-offset-5{margin-H@3BW,I:}.col-md-offset-4{O@3td,o:}.col-md-offset-3{margin-left:25%}.col-md-offset-2{C@8xy,D:16.66666667%}G@4Ml,1:{N@3vz,X:}.col-md-offset-0{margin-left:0}}I@OgG,8:1200px){26@4XI,h:float:left}.col-lg-12{width:100%}.col-lg-11{I@3R0,C:}.col-lg-10{I@2wU,V:}.col-lg-9{width:75%}.col-lg-8{I@3Sl,x:}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{I@3UV,x:}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{I@3WE,38:}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{I@33G,2d:}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{H@4nG,31:}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{H@3iG,d:}.col-lg-push-6{left:50%}.col-lg-push-5{H@3BW,G:}.col-lg-push-4{H@3tk,d:}.col-lg-push-3{left:25%}.col-lg-push-2{H@3vG,G:}.col-lg-push-1{G@3MW,Q:}.col-lg-push-0{left:auto}I@4wW,H:margin-left:100%}G@4wW,2:1{O@3FT,1:}G@4wW,2:0{O@3GD,o:}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{O@3qT,P:}.col-lg-offset-7{margin-H@3iG,1:}H@50G,d:margin-left:50%}.col-lg-offset-5{margin-H@3BW,I:}.col-lg-offset-4{O@3td,o:}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{C@8xy,D:16.66666667%}G@4wW,1:{N@3vz,c:}.col-lg-offset-0{margin-left:0}}table{S@GWl,1w:}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;I@MzF,1:}I@5nl,I@63G,1:hJ@5oV,v@59l,C@5Ai,N@DV~,I@JtW,1:;L@EDl,5:#ddd}I@5nl,1:{L@Juk,1:;S@5Cs,1:}a@5FG,3F@5Dw,18:border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{L@AQl,1:}R@5KE,K@5Jk,I@6HV,K@5LF,K@5Jk,15@5KW,S:padding:5px}.table-bordered{L@E0l,1:}R@MQG,R@5OG,1:hI@5OG,1V@5Nf,L@E0l,1:}R@MQG,I@5OG,B:head>tr>td{N@5QV,1:}e@5Qu,J@Kil,6:9f9f9}S@5S0,J@Kil,6:5f5f5}P@5Sv,l:position:static;float:none;display:table-column}l@5UE,R:position:static;float:none;I@P5l,1:}H@5nl,4c@5W8,J@Kil,6:5f5f5}N@5jl,1:dZ@5bB,21@5b8,J@HcG,6:8e8e8}H@5nl,1:dH@5g0,4X@5eA,J@NPG,6:ff0d8}N@5jl,2f@5jW,J@NPG,6:0e9c6}H@5nl,6:d.infoK@63G,M@5oR,6:d.infoI@59l,6:h.infoI@63G,2k@5oP,O@NPG,1:}N@5jl,2R@5ry,I@NPG,7:c4e3f3}H@5nl,1:dH@5xF,4X@5vP,J@Kil,6:cf8e3}N@5jl,2f@5~k,O@Kil,1:}H@5nl,4c@638,J@Kil,6:2dede}N@5jl,1:dZ@69B,21@698,J@HcG,6:bcccc}H@M_l,k:{overflow-x:auto;min-height:0.01%}@media screenG@O~W,7:767px){H@M_l,C:{width:100%;J@6Dl,I:overflow-y:hidden;h@6EV,L@E0l,1:}O@M_l,H:{margin-bottom:0}3U@6GW,I@DC~,1:}X@M_l,A:{border:0}j@M_l,4j@6M0,E:border-left:0}v@M_l,N@LJ0,K@Mh0,1:hk@6UV,N@Mdk,N@LJ0,I@MnG,G@Mi0,N@LJ0,Y@Mh0,N@LJ0,K@5NV,S:d:last-child{border-right:0}f@6S0,n@6YQ,K@Mtz,1:hg@6R~,B::last-childS@6Il,V@MxF,1j:d{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;J@Jw~,F:font-size:21px;J@120,L:;color:#333;border:0;I@25z,K:solid #e5e5e5}label{L@7RW,F:max-width:100%;H@Kt~,I:;font-weight:bold}L@75~,J@WT,F:border-box;-mozN@6fW,L@Sl,1:}g@6gl,F:margin:4px 0 0;I@6hl,I@Qj,Y:}input[type="file"]{display:block}K@6j0,P:display:block;width:100%}G@ClG,Q:,select[size]{height:auto}1G@6k_,K@14E,f@6mE,J@9JU,q:}output{display:block;padding-top:7px;font-size:14px;N@DV~,1U:color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;N@DV~,B:color:#555;M@9R0,L@A10,1:;I@E0l,4:ccc;I@6sG,V@F6l,M:1px rgba(0,0,0,0.075);i@8Ml,J@Itk,13@6uW,3:-o-H@IL~,q@6vv,H@IL~,p@6vv,1:}K@8OS,V:border-color:#66afe9;outline:0;V@F6l,r@6~b,1:;b@8NW,c@6~q,1:}G@72G,a:moz-placeholder{color:#999;opacity:1}_@71S,B:color:#999}e@72G,B:color:#999}1H@739,J@9OT,L@HcG,i:;opacity:1}textarea.form-control{height:auto}L@75~,N@Yz,1:}q@76m,1N@77e,H:line-height:34px}4I@79S,H:line-height:30px}P@79S,2:lgQ@79s,3T@7E~,U:line-height:46px}}.form-group{I@6Dl,I:}.radio,.checkbox{I@7Jl,U:display:block;margin-top:10px;I@8hV,1:}T@7Kz,G@Nn0,Y:padding-left:20px;margin-bottom:0;J@AxF,F:cursor:pointer}26@7N0,I:position:absolute;I@7PU,I:margin-top:4px \9}Y@7Q7,G:margin-top:-5px}V@7Qz,L@7RW,Y:padding-left:20px;margin-bottom:0;M@7SW,J@AxF,F:cursor:pointer}z@7TW,U:margin-top:0;margin-left:10px}J@CKW,2v@7VN,J:cursor:not-allowed}1r@7Ye,J:cursor:not-allowed}1n@7_s,J:cursor:not-allowed}L@8ly,o:padding-top:7px;padding-bottom:7px;margin-bottom:0}K@8ly,d@7dd,q:padding-left:0;padding-right:0}.input-sm{height:30px;H@B7V,V:font-size:12px;line-height:1.5;H@Ns~,1:}G@7gW,T:height:30px;line-height:30px}h@7hL,C:height:auto}S@7lU,D:{height:30px;H@B7V,V:font-size:12px;line-height:1.5;H@Ns~,1:}Z@7kE,T:height:30px;line-height:30px}1I@7lM,C:height:auto}S@7lU,K:-static{height:30px;H@B7V,q:font-size:12px;line-height:1.5}.input-lg{height:46px;I@CxG,F@Efv,M@7tV,H@NsG,j:}select.input-lg{height:46px;line-height:46px}h@7rC,C:height:auto}S@7vS,D:{height:46px;I@CxG,F@Efv,M@7tV,H@NsG,1:}I@7kE,j:lg .form-control{height:46px;line-height:46px}1I@7vK,C:height:auto}S@7vS,K:-static{height:46px;I@CxG,F@Efv,L@7tV,F:}.has-feedback{H@7Jl,1:}R@8yU,1:{K@7zl,1:}N@82E,1n:position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;J@81j,1:}X@824,d:width:46px;height:46px;line-height:46px}X@83O,d:width:30px;height:30px;line-height:30px}4H@84h,E:color:#3c763d}R@89G,L@89j,V@F6l,M:1px rgba(0,0,0,0.075);h@8NW,1:}Q@89G,S::focus{border-color:#2b542c;V@F6l,V@8Qf,7:67b168;h@8NW,H:,0 0 6px #67b168}W@8El,E:color:#3c763d;L@89j,J@NPG,6:ff0d8}Q@89G,O:-feedback{color:#3c763d}4H@8HE,E:color:#8a6d3b}Q@8OF,1:{L@8MG,V@F6l,M:1px rgba(0,0,0,0.075);h@8NW,1:}X@8OF,L:border-color:#66512c;V@F6l,b@8Pf,h@8NW,T:,0 0 6px #c0a16b}.has-warningJ@8oW,F:{color:#8a6d3b;L@8MG,J@Kil,6:cf8e3}Q@8OF,O:-feedback{color:#8a6d3b}3y@8Tl,E:color:#a94442}P@8Y0,L@8dE,V@F6l,M:1px rgba(0,0,0,0.075);h@8NW,1:}O@8Y0,7::focus{L@8_y,V@F6l,W@8Qf,6:e8483;h@8NW,H:,0 0 6px #ce8483}U@8cS,E:color:#a94442;L@8dE,J@Kil,6:2dede}O@8Y0,O:-feedback{color:#a94442}J@8fk,1:~N@82E,9:top:25px}o@8fk,k:top:0}.help-block{display:block;margin-top:5px;J@8hV,E:color:#737373}P@1_l,J@8ll,6:group{L@7RW,G:margin-bottom:0;L@7SW,1:}Q@8ll,1:{L@7RW,B:width:auto;L@7SW,1:}Y@8ll,K@FEG,1:}P@8pV,M:{display:inline-table;L@7SW,1:}R@8pV,H@8RW,S@8pU,t@8pF,B:width:auto}P@8pV,Q:>.form-control{width:100%}S@8rR,G:margin-bottom:0;L@7SW,1:}g@8si,L@7RW,T:margin-top:0;margin-bottom:0;L@7SW,1:}J@8si,_@8vD,F:padding-left:0}J@8si,L@CKV,j@8wo,I@7Jl,E:margin-left:0}n@8yH,7:top:0}}n@910,1:,N@910,f@8~U,i:margin-top:0;margin-bottom:0;padding-top:7px}o@910,G:min-height:27px}I@910,l:form-group{margin-left:-15px;margin-right:-15px}P@1_l,I@910,10:control-label{text-align:right;margin-bottom:0;padding-top:7px}}I@910,_@8yV,B:right:15px}P@1_l,I@910,T@978,N@97f,2:}}P@1_l,I@910,T@98r,M:padding-top:6px}}.btn{L@7RW,G:margin-bottom:0;J@AxF,I:text-align:center;M@7SW,U@9Ba,Q@9Be,F:cursor:pointer;L@A10,1:;H@E0l,C:transparent;I@DC~,X:;padding:6px 12px;font-size:14px;N@DV~,I@6sG,P@9FP,4:-mozI@9FW,L@9GE,H:user-select:none}1U@9Gu,K@14E,f@6mE,J@9JU,1:}X@9Jp,7@C~,4:333;K@Hkl,1:}O@9Ky,A:outline:0;L@A10,1:;R@F6l,Q@9MP,J@8NW,P@9N9,1:}q@9Na,J@9OT,J@81j,1:;8@71G,4:.65;L@NvR,4:65);O@EIW,d:box-shadow:none}.btn-default{color:#333;M@9R0,I:border-color:#ccc}24@9Ri,B:color:#333;J@HcG,6:6e6e6;K@9UU,1:}1B@9Sb,L@A10,1:}8j@9WR,M@9R0,m:border-color:#ccc}.btn-default .badge{color:#fff;K@1nW,Q:3}.btn-primary{color:#fff;O@1nW,1:;K@9gl,1:}V@9oE,1a@9hb,B:color:#fff;I@NPG,S:286090;border-color:#204d74}1B@9i0,L@A10,1:}L@9q0,N@9tT,P@AoW,7e@9mv,O@1nW,1:;K@9gl,Z:}.btn-primary .badge{color:#337ab7;L@AQl,P:}.btn-success{color:#fff;I@NPG,S:5cb85c;border-color:#4cae4c}24@9xf,B:color:#fff;I@NPG,S:449d44;border-color:#398439}X@A8G,Y@AjG,8:success{L@A10,1:}8j@A1O,I@NPG,S:5cb85c;border-color:#4cae4c}K@AAx,E:color:#5cb85c;L@AQl,M:}.btn-info{color:#fff;I@NPG,S:5bc0de;border-color:#46b8da}1n@ADA,B:color:#fff;J@1nW,R:1b0d5;border-color:#269abc}12@AG0,L@A10,1:}7t@AHT,I@NPG,w:5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;L@AQl,P:}.btn-warning{color:#fff;J@Kil,R:0ad4e;border-color:#eea236}V@AZW,1a@ASt,B:color:#fff;J@HcG,R:c971f;border-color:#d58512}X@Ac~,Y@AjG,8:warning{L@A10,1:}8j@AX7,J@Kil,y:0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;L@AQl,O:}.btn-danger{color:#fff;K@NPG,Q:534f;border-color:#d43f3a}1z@Ahw,B:color:#fff;I@NPG,S:c9302c;border-color:#ac2925}18@Aky,L@A10,1:}8S@AmW,K@NPG,w:534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;L@AQl,P:}.btn-link{color:#337ab7;J@AxF,G:border-radius:0}1T@Axs,S@GWl,1:;O@EIW,G:box-shadow:none}w@A~_,P:border-color:transparent}V@A~j,F:{color:#23527c;G@Hkl,A:underline;S@GWl,1:}K@Gxz,U@AJE,18@B3V,B:color:#777;K@Hkl,1:}R@B5F,I@CxG,F@Efv,M@7tV,H@NsG,S:}.btn-sm,.btn-group-sm>.btn{H@B7V,V:font-size:12px;line-height:1.5;H@Ns~,1:}R@B8h,k:padding:1px 5px;font-size:12px;line-height:1.5;H@Ns~,1A:}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}1S@BBh,R:width:100%}.fade{opacity:0;J@Itk,N:opacity .15s linear;-o-U@BEy,1:;U@BEy,1O:}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;I@EKG,G:}tr.collapse.in{H@Oil,J:}tbody.collapse.in{H@Oil,J:-group}.collapsing{I@7Jl,9:height:0;G@ImW,I@Itk,T@BLU,2:-od@BJx,c@BJy,I@Itk,14:-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;I@Itk,M@BNk,3:-o-V@BOj,1:;V@BOj,1:}V@BPG,I@7Jl,L@7RW,L@7SW,1:}e@BQs,I@7Jl,B:float:left}3O@BS5,A:z-index:2}1h@BVh,x:margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar G@BPG,L@BYj,B:float:left}14@BZJ,G:margin-left:5px}19@B_h,G:border-radius:0}S@BbA,E:margin-left:0}R@BbA,H@CBG,N@BaU,T@Bc~,O@LCG,2:0}1R@Bdw,Q@M7~,2:0;N@LOG,2:0}L@BjF,C:{float:left}M@BjF,H@C6G,N@BhW,G:border-radius:0}p@BjF,1J@Bj0,T@Bc~,O@LCG,2:0}M@BjF,S@BeB,I@CDk,Q@M7~,2:0;N@LOG,D:0}.btn-group G@D1W,e@Bnj,A:outline:0}X@Bob,Z:padding-left:8px;padding-right:8px}_@Bpn,I:padding-left:12px;I@Bqj,1:}W@BtE,1:{R@F6l,Q@9MP,J@8NW,P@9N9,1:}f@BtE,O@EIW,u:box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{N@BvP,K@5QV,2:0}N@BwB,N:border-width:0 5px 5px}O@BTG,V@C0G,V@C0G,u:>.btn{display:block;float:none;width:100%;max-width:100%}O@BTG,N:-group>.btn{float:none}O@BTG,U@C0k,M@BWG,K@CAl,l@C0k,U:margin-top:-1px;margin-left:0}P@BTG,H@C6G,H@CBG,H:{border-radius:0}Q@BTG,S@C3l,O@LCG,4:4px;T@Bc~,Q@M7~,2:0}P@BTG,S@BeB,1:{Q@M7~,4:4px;O@LCG,2:0;N@LOG,2:0}O@BTG,O@D9w,N@BhW,G:border-radius:0}O@BTG,a@CAz,P@Bj0,13@CAl,T@Bc~,Q@M7~,2:0}O@BTG,q@CDC,O@LCG,2:0;N@LOG,2:0}K@CIG,i:{display:table;width:100%;table-layout:fixed;O@CPW,1:}P@CIG,1:,V@CIG,C:{float:none;I@P5l,A:;width:1%}a@CIG,B:width:100%}X@CIG,O:dropdown-menu{left:auto}e@CLl,2s@CKh,I:position:absolute;M@CNw,J@81j,E:}.input-group{I@7Jl,8@OnC,6:table;O@CPW,1:}S@CPw,f:float:none;padding-left:0;padding-right:0}Q@Czj,1:{I@7Jl,l:z-index:2;float:left;width:100%;margin-bottom:0}U@CYi,T@CZz,6:addon,a@CZz,D:{height:46px;I@CxG,F@Efv,M@7tV,H@NsG,1:}J@CgV,2:lgL@CkE,T@CZz,n@CXE,T:height:46px;line-height:46px}L@Chl,41@CYv,C:height:auto}H@ClW,1M@CcT,C:height:30px;H@B7V,V:font-size:12px;line-height:1.5;H@Ns~,1:}N@CgV,J@CkG,T@ClW,P@CXE,P@Cli,T:height:30px;line-height:30px}4M@Chl,C:height:auto}I@8RV,H@D1l,1:,Q@Czj,1:{I@P5l,1:}I@8RV,2M@Co0,G:border-radius:0}I@8RV,H@D1l,A:{width:1%;I@DC~,1:;L@7SW,1:}J@8RV,W:padding:6px 12px;font-size:14px;J@AxF,g:line-height:1;color:#555;text-align:center;L@HcG,1:;I@E0l,4:ccc;H@Dp0,1:}I@8RV,A:.input-sm{H@B7V,F:font-size:12px;H@Ns~,1:}I@8RV,A:.input-lg{I@CxG,F:font-size:18px;H@NsG,1:}I@8RV,L@CKV,I@8RV,1: M@7WW,E:{margin-top:0}58@Czj,T@Bc~,O@LCG,2:0}I@8RV,S::first-child{border-right:0}R@Czj,2:laS@C~C,2:laM@C~C,J@D1z,X@D1l,2h@D7i,Q@M7~,2:0;N@LOG,2:0}I@8RV,Q::last-child{border-left:0}G@Cll,1:{I@7Jl,C:font-size:0;I@DC~,1:}M@Cll,H@7Jl,1:}L@Cll,N:+.btn{margin-left:-1px}L@Cll,6::hoverH@D1l,e@DFU,A:z-index:2}G@Cll,4::firV@D6~,3:firJ@D7W,J:{margin-right:-1px}G@Cll,s@D6x,1E:{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{I@7Jl,O:display:block}.nav>li>a{I@7Jl,E:display:block;H@JyW,1:}W@DMB,L@Hkl,L@HcG,1:}J@DNU,B:color:#777}I@DNU,7::hover,I@DNU,I::focus{color:#777;L@Hkl,S@GWl,K:;cursor:not-allowed}o@DQH,L@HcG,1:;K@DRW,g:}.nav .nav-divider{height:1px;margin:9px 0;G@ImW,J@HcG,i:5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{I@25z,1M:solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;N@DV~,H@E0l,C:transparent;H@Dp0,U: 4px 0 0}.nav-tabs>li>a:hover{R@DXi,1:}L@DYy,u@DYW,B:color:#555;M@9R0,L@E0l,1:;K@Dnl,R:transparent;cursor:default}O@DaG,R:width:100%;border-bottom:0}N@DaG,F:>li{float:none}N@DaG,O:>li>a{text-align:center;H@Kt~,1:}N@DaG,Q@DvU,J:top:auto;left:auto}P@1_l,N@DaG,4:>li{I@P5l,A:;width:1%}N@DaG,N:>li>a{margin-bottom:0}}N@DaG,L:>li>a{margin-right:0;H@Dp0,1:}N@DaG,1R@DmG,L@E0l,1:}P@1_l,N@DaG,6:>li>a{I@25z,B:solid #ddd;H@Dp0,9: 4px 0 0}N@DaG,1R@DmG,O@Dnl,g:}}.nav-pills>li{float:left}.nav-pills>li>a{H@Dp0,Y:}.nav-pills>li+li{margin-left:2px}M@Dqj,w@DqG,B:color:#fff;O@1nW,1b:}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}I@Del,B:float:none}K@DuG,I:text-align:center;H@Kt~,1:}d@DvG,J:top:auto;left:auto}P@1_l,I@Del,I@P5l,A:;width:1%}K@DuG,H:margin-bottom:0}}K@DyS,t:border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;H@Dp0,1:}T@E09,V@E08,f@E40,L@E0l,1:}P@1_l,P:.nav-tabs-justified>li>a{I@25z,B:solid #ddd;H@Dp0,9: 4px 0 0}T@E09,V@E08,f@E40,O@Dnl,2:}}N@E5E,V:display:none;visibility:hidden}L@E6C,E:display:block;I@EKG,1:}P@E7A,G:margin-top:-1px;O@LCG,2:0;N@LOG,A:0}.navbar{I@7Jl,G:min-height:50px;J@Jw~,H@E0l,C:transparent}P@1_l,8:.navbar{H@Dp0,2:}}P@1_l,R:.navbar-header{float:left}}H@EY0,J@ECk,J:padding-right:15px;I@2dE,X@EDl,r@F6l,1:;N@8NW,N@F8V,1:;W@EG0,1:}G@EY0,K:.in{overflow-y:auto}P@1_l,H@EY0,O:width:auto;border-top:0;O@EIW,G:box-shadow:none}G@EY0,A:.collapse{O@P7l,1:;U@EKG,N:height:auto !important;H@ELF,R@ELa,1:}G@EY0,4:.in{I@EMW,1:}1i@EMu,W:padding-left:0;padding-right:0}}g@EMu,U@EQ0,H:max-height:340px}x@EQp,g@EMu,U@EQ0,I:max-height:200px}}1t@EWP,a:margin-right:-15px;margin-left:-15px}P@1_l,1t@EWP,U:margin-right:0;margin-left:0}}J@EYz,Y:z-index:1000;border-width:0 0 1px}P@1_l,J@EYz,H:border-radius:0}}c@Ea5,g:position:fixed;right:0;left:0;z-index:1030}P@1_l,c@Ea5,z:border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}K@EO0,Q:{bottom:0;margin-bottom:0;K@Eek,h:}.navbar-brand{float:left;padding:15px 15px;F@Efv,T:line-height:20px;height:50px}d@Egj,K@Hkl,1:}I@Ehl,E:display:block}P@1_l,18@Eim,Y:margin-left:-15px}}.navbar-toggle{I@7Jl,1G:float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;S@GWl,1:;L@A10,1:;H@E0l,C:transparent;H@Dp0,1:}L@FxB,A:outline:0}P@Eoi,r:display:block;width:22px;height:2px;border-radius:1px}O@Eoi,Q:+.icon-bar{margin-top:4px}P@1_l,x:.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}H@GPF,H:padding-top:10px;K@EtG,H:line-height:20px}I@QHW,7:767px){W@GmG,p:{position:static;float:none;width:auto;margin-top:0;S@GWl,A:;border:0;O@EIW,G:box-shadow:none}X@GmG,4:li>aX@F0G,h: .dropdown-header{padding:5px 15px 5px 25px}X@GmG,M:li>a{line-height:20px}X@GmG,J@FoW,O@Gg0,C:>li>a:focus{L@A10,2:}}P@1_l,v:.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}H@GPF,H:padding-top:15px;G@EtG,s:5px}}.navbar-form{margin-left:-15px;margin-right:-15px;I@JyW,X@EDl,I@25z,I@EnW,1L@F6l,N@8NW,r@F8V,X:margin-top:8px;margin-bottom:8px}P@1_l,O@FSV,1:{L@7RW,G:margin-bottom:0;L@7SW,1:}J@FSV,8:control{L@7RW,B:width:auto;L@7SW,1:}J@FSV,F:control-static{K@FEG,1:}P@FG0,M:{display:inline-table;L@7SW,1:}20@FG0,B:width:auto}P@FG0,Q:>.form-control{width:100%}S@FJK,G:margin-bottom:0;L@7SW,1:}g@FKb,L@7RW,T:margin-top:0;margin-bottom:0;L@7SW,1:}s@FMo,F:padding-left:0}1M@FO4,I@7Jl,E:margin-left:0}n@FQA,7:top:0}}I@QHW,7:767px){O@FSV,1:{H@Kt~,1:}_@FSV,H:margin-bottom:0}}P@1_l,1C:.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;H@ELF,O@EIW,H:box-shadow:none}}U@FWi,D:margin-top:0;O@LCG,2:0;N@LOG,2:0}T@EO0,b:nav>li>.dropdown-menu{margin-bottom:0;O@LCG,4:4px;N@LOG,4:4px;T@Bc~,Q@M7~,k:0}.navbar-btn{margin-top:8px;margin-bottom:8px}J@FbF,G:margin-top:10px;I@8hV,1:}J@FcD,10:margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;I@6Dl,1:}P@1_l,x:.navbar-text{float:left;margin-left:15px;margin-right:15px}}P@1_l,D:.navbar-left{L@FgT,F:}.navbar-right{N@FhC,1F:margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{J@Kil,6:8f8f8;K@F~0,1:}O@FzW,H:brand{color:#777}O@FzW,K@GMk,G@Fql,Q:brand:focus{color:#5e5e5e;S@GWl,1:}P@FvW,F:ext{color:#777}O@FzW,K:nav>li>a{color:#777}O@FzW,r@FoS,B:color:#333;S@GWl,1:}O@FzW,1b@FqQ,B:color:#555;J@HcG,6:7e7e7}O@FzW,1h@Ft4,B:color:#ccc;S@GWl,1:}V@FvW,H@Nq~,1:}U@FvW,O@GIk,K@FxC,J@NPG,3:dd}U@FvW,B: .icon-bar{I@NPG,4:888}O@FzW,H@EPk,G@Fql,5:form{K@F~0,1:}O@FzW,1W@F~k,J@HcG,H:7e7e7;color:#555}I@QHW,7:767px){O@FzW,O@Gg0,H:>li>a{color:#777}O@FzW,O@Gg0,c@FoV,R@Gil,H:focus{color:#333;S@GWl,1:}O@FzW,O@Gg0,b@FqT,V@GlW,O@GIk,l@G8W,B:color:#555;J@HcG,6:7e7e7}O@FzW,O@Gg0,d@Ft7,N@GlW,P@GVW,J@Fql,N@GlW,H@FuV,B:color:#ccc;S@GWl,2:}}O@FzW,G:link{color:#777}O@FzW,B:link:hover{8@KRR,3:33}H@FzW,K:btn-link{color:#777}H@FzW,N@GxV,I@GIU,6:focus{8@KRR,3:33}H@FzW,J@Gx~,Q@AJE,O@GFW,1_@GIk,R:color:#ccc}.navbar-inverse{I@NPG,4:222;K@GLF,1:}O@Gm0,K:brand{color:#9d9d9d}O@Gm0,l@GMk,B:color:#fff;S@GWl,1:}O@Gm0,J:text{color:#9d9d9d}R@Gm0,K:>li>a{color:#9d9d9d}R@Gm0,K@FoV,J@Gfl,N:>li>a:focus{color:#fff;S@GWl,1:}R@Gm0,J@FqT,J@Gfl,h@Gml,H@G8~,B:color:#fff;O@GU0,1:}R@Gm0,1e@GUr,B:color:#444;S@GWl,1:}O@Gm0,7:toggle{G@DRW,2:3}O@Gm0,L@Fwj,G@Gfl,D:toggle:focus{K@1nW,2:3}O@Gm0,H:toggle .icon-bar{L@AQl,1:}O@Gm0,H@EPk,G@Gfl,5:form{K@Gak,1:}R@Gm0,6:>.openW@GV0,4:open_@Gqi,F:>.open>a:focus{O@GU0,C:;color:#fff}I@QHW,7:767px){n@Gm0,G:dropdown-header{K@GLF,1:}l@Gm0,A: .divider{O@GU0,1:}m@Gm0,J:li>a{color:#9d9d9d}m@Gm0,J@FoW,d@Gfl,N:>li>a:focus{color:#fff;S@GWl,1:}v@Gm0,x@Gn0,t@Gql,Q:active>a:focus{color:#fff;O@GU0,1:}n@Gm0,2H@Gpd,B:color:#444;S@GWl,2:}}O@Gm0,J:link{color:#9d9d9d}O@Gm0,M:link:hover{color:#fff}H@Gm0,N:btn-link{color:#9d9d9d}H@Gm0,d@GxV,I::focus{color:#fff}H@Gm0,J@Gx~,Q@AJE,G@GaG,1h@GxV,d:color:#444}.breadcrumb{padding:8px 15px;J@Jw~,G:list-style:none;J@Kil,6:5f5f5;H@Dp0,G:}.breadcrumb>li{K@FEG,1:}P@H10,f:content:"/\00a0";padding:0 5px;color:#ccc}K@H2E,N:color:#777}.pagination{L@7RW,T:padding-left:0;margin:20px 0;H@Dp0,V:}.pagination>li{display:inline}a@H4o,I@7Jl,S:float:left;padding:6px 12px;N@DV~,L@Hkl,E:color:#337ab7;M@9R0,L@E0l,I:;margin-left:-1px}y@H8Q,E:margin-left:0;Q@M7~,4:4px;N@LOG,4:4px}w@HAe,R@Lxk,4:4px;O@LCG,4:4px}1Y@HCc,E:color:#23527c;L@HcG,1:;H@Nq~,1:}K@HHG,2H@HFU,L:z-index:2;color:#fff;O@1nW,1:;K@DRW,G:;cursor:default}M@HKk,4:spanN@HKj,N@HDD,1e@HKQ,B:color:#777;M@9R0,I@Nq~,J:cursor:not-allowed}H@HQk,3:>a,H@HQk,6:>span{I@CxG,F:font-size:18px}I@HQk,m@HOy,Q@M7~,4:6px;N@LOG,4:6px}11@HQk,R@Lxk,4:6px;O@LCG,4:6px}g@HSo,H@B7V,F:font-size:12px}13@HU6,T@M7~,1:;Q@LOG,1:}11@HWA,V@Lrk,R@LCG,1W:}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}R@H_0,L@7RW,H:padding:5px 14px;M@9R0,L@E0l,K:;border-radius:15px}_@HbH,L@Hkl,L@HcG,1:}X@Hcd,C:float:right}e@HdQ,B:float:left}I@He~,K@Hez,q@Heu,B:color:#777;M@9R0,e:cursor:not-allowed}.label{display:inline;N@Hh9,1A:font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;I@DC~,1:;O@H~f,J@Hji,d:}a.label:hover,a.label:focus{color:#fff;L@Hkl,q:cursor:pointer}.label:empty{display:none}.btn .label{I@7Jl,O:top:-1px}.label-default{L@I0l,1:}L@Hnh,X@Hnb,I@NPG,M:5e5e5e}.label-primary{O@1nW,1:}L@Hpi,X@Hpc,I@NPG,M:286090}.label-success{I@NPG,7:5cb85c}L@Hrj,X@Hrd,I@NPG,J:449d44}.label-info{I@NPG,I:5bc0de}.label-infoK@HpW,H@Htl,J@1nW,L:1b0d5}.label-warning{J@Kil,6:0ad4e}r@HvC,J@HcG,K:c971f}.label-danger{K@NPG,5:534f}p@HxC,I@NPG,E:c9302c}.badge{L@7RW,1O:min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;O@H~f,I@DC~,J:;text-align:center;M@I0l,u:border-radius:10px}.badge:empty{display:none}.btn .badge{I@7Jl,j:top:-1px}.btn-xs .badge{top:0;padding:1px 5px}S@I3P,B:color:#fff;L@Hkl,F:cursor:pointer}N@KGl,_@I56,E:color:#337ab7;L@AQl,1:}G@LBW,K:>.badge{float:right}G@LBW,1I:>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{I@I8j,X:margin-bottom:30px;color:inherit;L@HcG,1:}T@IHE,R:color:inherit}.jumbotron p{J@6Dl,i:font-size:21px;font-weight:200}.jumbotron>hr{O@ICD,1:}n@ICd,H@NsG,b:}.jumbotron .container{max-width:100%}_@IER,Q:.jumbotron{padding:48px 0}n@ICd,I@IGU,J:padding-right:60px}T@IHE,q:font-size:63px}}.thumbnail{display:block;padding:4px;J@Jw~,N@DV~,M@9R0,L@E0l,1:;I@6sG,J@Itk,N@IKy,3:-o-X@IL~,1:;X@IL~,1:}W@16h,Z:margin-left:auto;margin-right:auto}s@INj,K@DRW,1:}K@IO~,g:padding:9px;color:#333}.alert{padding:15px;J@Jw~,H@E0l,C:transparent;H@Dp0,27:}.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}b@ITo,J:padding-right:35px}p@IUm,I@7Jl,n:top:-2px;right:-21px;color:inherit}.alert-success{J@NPG,6:ff0d8;K@NJU,F:;color:#3c763d}I@IXz,P:border-top-color:#c9e2b3}R@IYj,Q:color:#2b542c}.alert-info{P@NPG,K@NPh,s:;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}O@IaS,T:color:#245269}.alert-warning{J@Kil,1K:cf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}R@IdD,S:color:#66512c}.alert-danger{J@Kil,e:2dede;border-color:#ebccd1;color:#a94442}H@IfG,P:border-top-color:#e4b9c0}Q@If~,E:color:#843534}d@Igh,5:from{Q@IlC,4:}to{K@IlC,9:0 0}}@-o-V@IkW,5:from{Q@IlC,4:}to{K@IlC,5:0 0}}W@IkV,5:from{Q@IlC,4:}to{K@IlC,F:0 0}}.progress{G@ImW,C:height:20px;J@Jw~,J@Kil,6:5f5f5;I@6sG,V@F6l,K:2px rgba(0,0,0,0.1);N@8NW,1~:2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;O@1nW,1:;R@F6l,K@2UV,4:15);J@8NW,K@2UV,4:15);Y@Itk,T@IuK,P@IuN,1:}r@IvG,I@IzG,2n@JfD,2~@IzG,2w@JaW,1:;Y@J4H,P@J4P,1:}p@J5I,v@J69,2:-oo@J6G,m@J7z,N:}.progress-bar-success{I@NPG,7:5cb85c}V@IvG,9:-success{I@IzG,2n@JfD,2~@IzG,2w@JaW,K:}.progress-bar-info{I@NPG,7:5bc0de}V@IvG,6:-info{I@IzG,2n@JfD,2~@IzG,2w@JaW,1:}M@JUz,J@Kil,6:0ad4e}V@IvG,9:-warning{I@IzG,2n@JfD,2~@IzG,2w@JaW,1:}L@JdU,K@NPG,5:534f}V@IvG,8:-danger{I@IzG,2n@JfD,2~@IzG,2w@JaW,O:}.media{margin-top:15px}J@JoU,1i:margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}J@Jsj,V:>.pull-right{padding-left:10px}U@Jrh,J:padding-right:10px}a@JsY,I@P5l,1:;I@JtW,F:}.media-middle{L@7SW,F:}.media-bottom{L@Juk,T:}.media-heading{margin-top:0;H@Kt~,t:}.media-list{padding-left:0;list-style:none}.list-group{J@Jw~,F:padding-left:0}G@LBW,1:{I@7Jl,E:display:block;I@JyW,J:margin-bottom:-1px;M@9R0,L@E0l,1:}T@LBW,O@LCG,4:4px;N@LOG,4:4px}H@LBW,R:last-child{margin-bottom:0;R@Lxk,4:4px;Q@M7~,5:4px}aG@LBW,D:{color:#555}aG@LBW,Q@Kgk,C:color:#333}aH@LBW,N@KpF,7::focus{L@Hkl,B:color:#555;J@Kil,6:5f5f5}H@KGl,19@K5j,L@HcG,V:;color:#777;cursor:not-allowed}H@KGl,Q@KA~,P@KHV,W@KBk,P@KHV,8:disabledO@KQF,M:heading{color:inherit}H@KGl,2B@KA~,B:color:#777}N@KGl,U@KGk,V@KEF,L:z-index:2;color:#fff;O@1nW,1:;K@DRW,1:}N@KGl,g@K8F,a@KMO,U@KEF,g@K8F,W@KLW,4p@KJF,E:color:inherit}N@KGl,I@Kgk,1i@KO~,E:color:#c7ddef}H@Kgl,M:success{color:#3c763d;J@NPG,7:ff0d8}aH@Kgl,N:success{color:#3c763d}aH@Kgl,6:succesR@KA0,F:color:inherit}aH@Kgl,j@KUC,E:color:#3c763d;J@NPG,7:0e9c6}aH@Kgl,1T@KVw,B:color:#fff;J@1nW,6:c763d;K@89j,1:}H@Kgl,J:info{color:#31708f;O@NPG,2:}aH@Kgl,K:info{color:#31708f}aH@Kgl,U@K_T,F:color:inherit}aH@Kgl,d@KaW,E:color:#31708f;I@NPG,8:c4e3f3}aH@Kgl,1K@Kc9,B:color:#fff;J@1nW,R:1708f;border-color:#31708f}H@Kgl,M:warning{color:#8a6d3b;J@Kil,7:cf8e3}aH@Kgl,N:warning{color:#8a6d3b}aH@Kgl,X@Kgd,F:color:inherit}aH@Kgl,j@Khj,E:color:#8a6d3b;O@Kil,2:}aH@Kgl,1T@KjT,B:color:#fff;I@NPG,7:8a6d3b;K@8MG,1:}H@Kgl,L:danger{color:#a94442;J@Kil,7:2dede}aH@Kgl,M:danger{color:#a94442}aH@Kgl,4:dangR@KJl,G:{color:inherit}aH@Kgl,h@Kp8,E:color:#a94442;J@HcG,7:bcccc}aH@Kgl,6:dangerQ@KcD,v@KrL,B:color:#fff;P@KsW,K@8dE,1:}P@Kgl,D:margin-top:0;H@Kt~,1:}H@Kgl,h:text{margin-bottom:0;line-height:1.3}.panel{J@Jw~,M@9R0,H@E0l,C:transparent;I@6sG,J@F6l,L@6~W,6:0.05);a@Kxl,e:}.panel-body{padding:15px}.panel-heading{I@JyW,I@25z,I@EnW,S@LCG,Q@LOG,1:}f@L00,1L:color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}1X@L2I,S:color:inherit}.panel-footer{I@JyW,J@Kil,6:5f5f5;L@EDl,5:#ddd;V@Lrk,T@M7~,1:}r@L6c,M:margin-bottom:0}.panelT@L8h,Z@LAl,H@LBV,1:{I@Eek,H:;border-radius:0}28@L9q,D:border-top:0;S@LCG,Q@LOG,1:}24@LDC,G:border-bottom:0;V@Lrk,T@M7~,1:}t@LGd,J:border-top-width:0}Q@LHt,J:border-top-width:0}1C@LIf,G:margin-bottom:0}1_@LKB,I@2dE,J:padding-right:15px}P@LOi,P@MgW,V@LQ0,1:{S@LCG,Q@LOG,1:}4d@LOi,Q@LOG,1:;R@LCG,1:}v@LOi,19@LY0,x@LUk,m@LjW,1_@LRl,T@LY0,m@LmG,15@LRl,X@LUk,R@M3V,m@Lp0,1_@LRl,G: th:first-child{Q@LOG,1:}v@LOi,d@MB~,U@LNF,X@LQV,S@MB~,19@LjW,h@LaF,6E@Ljj,R@LCG,1:}O@LyG,P@MgW,T@M6l,1:{V@Lrk,T@M7~,1:}s@LyG,P@MgW,V@M6l,2g@LuW,T@M7~,1:;U@Lxk,1:}Ah@LyG,T@M7~,1:}w@LyG,O@MGF,f@M1F,V@M30,R@LkF,g@M5V,Q@LkF,1B@M1F,a@MGF,X@M30,O@MGF,f@M1F,X@M30,2p@MGF,U@Lxk,1:}1z@MJc,L@EDl,5:#ddd}l@MMr,p@MMp,D:border-top:0}M@MZw,f@MOG,9:border:0}Z@MZw,_@LRl,G@MO0,99@MQV,E:border-left:0}AK@MZw,F:border-right:0}V@MZw,H@5GF,e@MiG,O@5FW,N@MZx,a@Mmh,4J@MmG,G:border-bottom:0}O@MZw,6W@MrG,G:border-bottom:0}O@Mwl,c:{border:0;margin-bottom:0}.panel-group{I@MzF,1:}J@N3z,H:{margin-bottom:0;H@Dp0,1:}J@N3z,N:+.panel{margin-top:5px}K@N3z,O:heading{border-bottom:0}K@N3z,P@N2E,13@N1k,L@EDl,5:#ddd}Q@N3z,E:{border-top:0}s@N3z,I@25z,Q:solid #ddd}.panel-default{H@Nq~,1:}U@N5y,B:color:#333;J@Kil,6:5f5f5;H@Nq~,1:}T@N5y,1:+H@LLG,B:panel-body{J@ICD,3:dd}T@N5y,M: .badge{color:#f5f5f5;K@1nW,2:3}M@N5y,Z@NZG,L@Dnl,J:ddd}.panel-primary{K@DRW,1:}M@NGD,J:heading{color:#fff;O@1nW,1:;K@DRW,1:}M@NGD,P@N2E,_:panel-body{border-top-color:#337ab7}M@NGD,T:heading .badge{color:#337ab7;L@AQl,1:}u@NGD,L@Dnl,M:337ab7}.panel-success{K@NJU,1:}U@NIG,E:color:#3c763d;J@NPG,6:ff0d8;K@NJU,1:}T@NIG,1:+H@LLG,B:panel-body{J@ICD,6:6e9c6}T@NIG,M: .badge{color:#dff0d8;J@1nW,6:c763d}M@NIG,Z@NZG,L@Dnl,J:d6e9c6}.panel-info{K@NPh,1:}Q@NRO,F:{color:#31708f;P@NPG,K@NPh,1:}Q@NRO,1:+H@LLG,B:panel-body{O@NQy,1:}Y@NRO,E:color:#d9edf7;J@1nW,6:1708f}r@NSe,L@Dnl,g:bce8f1}.panel-warning{border-color:#faebcc}T@NWE,F:{color:#8a6d3b;J@Kil,R:cf8e3;border-color:#faebcc}v@NWE,O@NXB,1:}T@NWE,M: .badge{color:#fcf8e3;I@NPG,7:8a6d3b}M@NWE,Z@NZG,M@Dnl,e:aebcc}.panel-danger{border-color:#ebccd1}S@NbW,F:{color:#a94442;J@Kil,R:2dede;border-color:#ebccd1}u@NbW,O@NcS,1:}S@NbW,M: .badge{color:#f2dede;O@KsW,1:}L@NbW,Z@NZG,L@Dnl,P:ebccd1}.embed-responsive{I@7Jl,m:display:block;height:0;padding:0;overflow:hidden}2B@Nh9,18:position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}Z@Nls,6:16by9{L@NlV,1:}d@Nls,P:padding-bottom:75%}.well{G@Nn0,D:padding:19px;J@Jw~,J@Kil,6:5f5f5;I@E0l,7:e3e3e3;I@6sG,V@F6l,L:1px rgba(0,0,0,0.05);e@8NW,K:5)}.well blockquote{I@Nq~,T@NrK,N:}.well-lg{padding:24px;H@NsG,M:}.well-sm{padding:9px;H@Ns~,1m:}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;O@NvR,1:}Q@Nvr,B:color:#000;L@Hkl,Q:cursor:pointer;opacity:.5;L@NvR,1A:50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;N@Yz,1:}92@NzZ,Q:content:" ";display:table}4Q@O87,1M:clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{M@FhC,C:}.pull-left{L@FgT,7:}.hide{N@PD0,7:}.show{O@P7l,p:}.invisible{visibility:hidden}.text-hide{font:0/0 a;I@OHE,H:text-shadow:none;S@GWl,I:;border:0}.hidden{N@PD0,1:;S@OJ8,t:}.affix{position:fixed}@-ms-viewport{width:device-width}l@OKd,N@PD0,1:}3t@OLq,N@PD0,1:}I@QHW,J:767px){.visible-xs{O@P7l,I:}table.visible-xs{D@OSJ,F:}tr.visible-xs{S@Oil,1:}S@OSr,T@P5l,2:}}I@QHW,P:767px){.visible-xs-block{O@P7l,2:}}I@QHW,Q:767px){.visible-xs-inline{P@P9i,2:}}I@QHW,7:767px){P@OWy,K@FEG,D: !important}}k@Ocl,C:.visible-sm{O@P7l,j:}table.visible-sm{display:table}tr.visible-sm{S@Oil,T:}th.visible-sm,td.visible-sm{T@P5l,2:}}k@Ocl,I:.visible-sm-block{O@P7l,2:}}k@Ocl,J:.visible-sm-inline{P@P9i,2:}}k@Ocl,P@OfC,K@FEG,D: !important}}l@OgG,C:.visible-md{O@P7l,j:}table.visible-md{display:table}tr.visible-md{S@Oil,T:}th.visible-md,td.visible-md{T@P5l,2:}}l@OgG,I:.visible-md-block{O@P7l,2:}}l@OgG,I@OoV,1:{P@P9i,2:}}l@OgG,P@OoV,K@FEG,D: !important}}I@OgG,K:1200px){.visible-lg{O@P7l,1:}H@Oql,S:display:table}tr.visible-lg{S@Oil,1:}S@OsG,T@P5l,2:}}I@OgG,8:1200px){H@OOk,1:{O@P7l,2:}}I@OgG,R:1200px){.visible-lg-inline{P@P9i,2:}}I@OgG,8:1200px){P@OwQ,K@FEG,D: !important}}I@QHW,I:767px){.hidden-xs{N@PD0,2:}}k@Ocl,B:.hidden-sm{N@PD0,2:}}l@OgG,B:.hidden-md{N@PD0,2:}}I@OgG,J:1200px){.hidden-lg{N@PD0,H:}}.visible-print{N@PD0,T:}@media print{.visible-print{O@P7l,Z:}table.visible-print{display:table}H@P4G,S@Oil,1:}Y@P59,T@P5l,N:}}.visible-print-block{N@PD0,Z:}@media print{.visible-print-block{O@P7l,2:}}M@P8F,N@PD0,E:}@media print{M@P8F,P@P9i,2:}}L@P8F,7:-block{N@PD0,E:}@media print{L@P8F,7:-block{K@FEG,d: !important}}@media print{.hidden-print{N@PD0,1:}1Sr@PDS,2hOHxq; |
| --- a/skins/bootstrap/details.txt | ||
| +++ b/skins/bootstrap/details.txt | ||
| @@ -0,0 +1,3 @@ | ||
| 1 | +timeline-arrowheads: 1 | |
| 2 | +t1 | |
| 3 | +timeline-color-graph-lines: 1 |
| --- a/skins/bootstrap/details.txt | |
| +++ b/skins/bootstrap/details.txt | |
| @@ -0,0 +1,3 @@ | |
| --- a/skins/bootstrap/details.txt | |
| +++ b/skins/bootstrap/details.txt | |
| @@ -0,0 +1,3 @@ | |
| 1 | timeline-arrowheads: 1 |
| 2 | t1 |
| 3 | timeline-color-graph-lines: 1 |
| --- a/skins/bootstrap/footer.txt | ||
| +++ b/skins/bootstrap/footer.txt | ||
| @@ -0,0 +1,37 @@ | ||
| 1 | +<th1> | |
| 2 | + if {! $is_index && ! $is_home} { | |
| 3 | + html "</div>" | |
| 4 | + } | |
| 5 | +</th1> | |
| 6 | +</div> | |
| 7 | +<div id="push"></div> | |
| 8 | +</div> | |
| 9 | +<footer id="footer"> | |
| 10 | + <p>© Copyright $<project_name>. All right reserved. Fossil $release_version · <a href="$home/timeline.rss">RSS</a></p> | |
| 11 | +</footer>var tabl> | |
| 12 | + if {! $is_index && ! $is_home} { | |
| 13 | + html "</div>" | |
| 14 | + } | |
| 15 | +</th1> | |
| 16 | +</div> | |
| 17 | +<div id="push"></div> | |
| 18 | +</div> | |
| 19 | +<footer id="footer"> | |
| 20 | + <p>© Copyright $<project_name>. All right reserved. Fossil $release_version · <a href="$home/timeline.rss">RSS</a></p> | |
| 21 | +</footer>var tables = document.que (var i = 0; i < tables.length; i++) { | |
| 22 | + if (tables[i].id !== "timelineTable") | |
| 23 | +}; | |
| 24 | +var submenus = document.quefor (var i = 0; i < submenus.length; i++) { | |
| 25 | + submenus[i].classList.add('btn-group'); | |
| 26 | + var labels = submenus[i].querySelvar j = 0; j < labels.length; j++) { | |
| 27 | + labels[j].classList.remove('label'); | |
| 28 | + labels[j].classList.add('btn'); | |
| 29 | + labels[j].classList.add('btn-default'); | |
| 30 | + labels[j].classList.add('btn-sm'); | |
| 31 | + } | |
| 32 | +}; | |
| 33 | +//Handle the collapsible navbar | |
| 34 | +var collapse = document.querySelector('[data-toggle="collapse"]'); | |
| 35 | +collapse.onclick = function(){ | |
| 36 | + var <th1> | |
| 37 | + if {! $is_index && </body></html> |
| --- a/skins/bootstrap/footer.txt | |
| +++ b/skins/bootstrap/footer.txt | |
| @@ -0,0 +1,37 @@ | |
| --- a/skins/bootstrap/footer.txt | |
| +++ b/skins/bootstrap/footer.txt | |
| @@ -0,0 +1,37 @@ | |
| 1 | <th1> |
| 2 | if {! $is_index && ! $is_home} { |
| 3 | html "</div>" |
| 4 | } |
| 5 | </th1> |
| 6 | </div> |
| 7 | <div id="push"></div> |
| 8 | </div> |
| 9 | <footer id="footer"> |
| 10 | <p>© Copyright $<project_name>. All right reserved. Fossil $release_version · <a href="$home/timeline.rss">RSS</a></p> |
| 11 | </footer>var tabl> |
| 12 | if {! $is_index && ! $is_home} { |
| 13 | html "</div>" |
| 14 | } |
| 15 | </th1> |
| 16 | </div> |
| 17 | <div id="push"></div> |
| 18 | </div> |
| 19 | <footer id="footer"> |
| 20 | <p>© Copyright $<project_name>. All right reserved. Fossil $release_version · <a href="$home/timeline.rss">RSS</a></p> |
| 21 | </footer>var tables = document.que (var i = 0; i < tables.length; i++) { |
| 22 | if (tables[i].id !== "timelineTable") |
| 23 | }; |
| 24 | var submenus = document.quefor (var i = 0; i < submenus.length; i++) { |
| 25 | submenus[i].classList.add('btn-group'); |
| 26 | var labels = submenus[i].querySelvar j = 0; j < labels.length; j++) { |
| 27 | labels[j].classList.remove('label'); |
| 28 | labels[j].classList.add('btn'); |
| 29 | labels[j].classList.add('btn-default'); |
| 30 | labels[j].classList.add('btn-sm'); |
| 31 | } |
| 32 | }; |
| 33 | //Handle the collapsible navbar |
| 34 | var collapse = document.querySelector('[data-toggle="collapse"]'); |
| 35 | collapse.onclick = function(){ |
| 36 | var <th1> |
| 37 | if {! $is_index && </body></html> |
| --- a/skins/bootstrap/header.txt | ||
| +++ b/skins/bootstrap/header.txt | ||
| @@ -0,0 +1,73 @@ | ||
| 1 | +<html lang="en"> | |
| 2 | +<head> | |
| 3 | + <meta charset="utf-8"> | |
| 4 | + <base href="$baseurl/$current_page" /> | |
| 5 | + <title>$<project_name>: $<title></title> | |
| 6 | + <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| 7 | + <f' 'unsafe-inline'"/> | |
| 8 | + <link rel="alternate" type="application/rss+xml" title="RSS Feed" href="$home/timeline.rss" /> | |
| 9 | + <link rel="stylesheet" href="$home/style.css?defaultheet" href="$stylesh <script nonce="$<nonce>"> | |
| 10 | + function gebi(x){ | |
| 11 | + if(/^#/.test(x)) x = x.substr(1); | |
| 12 | + var e = document.getElementById(x); | |
| 13 | + if(!e) throw new Error("Expecting element with ID "+x); | |
| 14 | + else return e; | |
| 15 | + } | |
| 16 | + </script> | |
| 17 | + </head> | |
| 18 | + <body data-spy="scr> | |
| 19 | + <div id="wrap"> | |
| 20 | + <div class="navbar navbar-inverse navbar-fixed-top" role="navigation"> | |
| 21 | + <div class="container"> | |
| 22 | + <div class="navbar-header"> | |
| 23 | + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> | |
| 24 | + <span class="sr-only">Toggle navigation</span> | |
| 25 | + <span class="icon-bar"></span> | |
| 26 | + <span class="icon-bar"></span> | |
| 27 | + <span class="icon-bar"></span> | |
| 28 | + </button> | |
| 29 | + <th1>html "<a class='navbar-brand' href='$home$index_page'>$project_name</a>"</th1> | |
| 30 | + </div> | |
| 31 | + <div class="collapse navbar-collapse"> | |
| 32 | + <p class="navbar-text pull-right"><th1> | |
| 33 | + if {[info exists login]} { | |
| 34 | + puts "Logged in as $login" | |
| 35 | + html " · <a href='$home/login'>Logout</a>" | |
| 36 | + } else { | |
| 37 | + puts "Not logged in" | |
| 38 | + html " · <a href='$home/login'>Login</a>" | |
| 39 | + } | |
| 40 | + </th1></p> | |
| 41 | + <ul class="nav navbar-nav"> | |
| 42 | + <th1> | |
| 43 | + > | |
| 44 | +set once 1 | |
| 45 | +set sitemap 0 | |
| 46 | +set is_index [expr [string compare [string range $curr set is_home [expr [string compare [string range $current_page 0 [expr [string length $index_piv class="n html "<li</span>'active'ollapse" data-\ puts "Not } else { | |
| 47 | + | |
| 48 | +<head> | |
| 49 | + <meta charset="u<html lang="en"> | |
| 50 | +<head> | |
| 51 | + \ puts "Not } | |
| 52 | + div class= ifn>'active'><a href='$ puts "Not } else { | |
| 53 | + | |
| 54 | +<head> | |
| 55 | + <meta charset="ut<html lang="en"> | |
| 56 | +<head puts "Not } | |
| 57 | + } elseif {[hascap a]} { | |
| 58 | + div class= if {[string compare [stringsetup"] == 0} { | |
| 59 | + html "<li</span>'active'><a href='$home/s puts "Not } else { | |
| 60 | + | |
| 61 | +<head> | |
| 62 | + <meta charset="ut<html lang="en"> | |
| 63 | +<head> | |
| 64 | + <m puts "Not } | |
| 65 | + ogin'>Login</a>" | |
| 66 | + </th1> | |
| 67 | +ome/login' </ulixed-top" "wrap"> | |
| 68 | + <div class="navbar navbar-inverse navbar-fixed-top" role="navigation"> | |
| 69 | + <div class="container"> | |
| 70 | + <div class="navbar-header"> | |
| 71 | + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> | |
| 72 | + <span class="sr-only">Toggle navigation</span> | |
| 73 | + $title |
| --- a/skins/bootstrap/header.txt | |
| +++ b/skins/bootstrap/header.txt | |
| @@ -0,0 +1,73 @@ | |
| --- a/skins/bootstrap/header.txt | |
| +++ b/skins/bootstrap/header.txt | |
| @@ -0,0 +1,73 @@ | |
| 1 | <html lang="en"> |
| 2 | <head> |
| 3 | <meta charset="utf-8"> |
| 4 | <base href="$baseurl/$current_page" /> |
| 5 | <title>$<project_name>: $<title></title> |
| 6 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| 7 | <f' 'unsafe-inline'"/> |
| 8 | <link rel="alternate" type="application/rss+xml" title="RSS Feed" href="$home/timeline.rss" /> |
| 9 | <link rel="stylesheet" href="$home/style.css?defaultheet" href="$stylesh <script nonce="$<nonce>"> |
| 10 | function gebi(x){ |
| 11 | if(/^#/.test(x)) x = x.substr(1); |
| 12 | var e = document.getElementById(x); |
| 13 | if(!e) throw new Error("Expecting element with ID "+x); |
| 14 | else return e; |
| 15 | } |
| 16 | </script> |
| 17 | </head> |
| 18 | <body data-spy="scr> |
| 19 | <div id="wrap"> |
| 20 | <div class="navbar navbar-inverse navbar-fixed-top" role="navigation"> |
| 21 | <div class="container"> |
| 22 | <div class="navbar-header"> |
| 23 | <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> |
| 24 | <span class="sr-only">Toggle navigation</span> |
| 25 | <span class="icon-bar"></span> |
| 26 | <span class="icon-bar"></span> |
| 27 | <span class="icon-bar"></span> |
| 28 | </button> |
| 29 | <th1>html "<a class='navbar-brand' href='$home$index_page'>$project_name</a>"</th1> |
| 30 | </div> |
| 31 | <div class="collapse navbar-collapse"> |
| 32 | <p class="navbar-text pull-right"><th1> |
| 33 | if {[info exists login]} { |
| 34 | puts "Logged in as $login" |
| 35 | html " · <a href='$home/login'>Logout</a>" |
| 36 | } else { |
| 37 | puts "Not logged in" |
| 38 | html " · <a href='$home/login'>Login</a>" |
| 39 | } |
| 40 | </th1></p> |
| 41 | <ul class="nav navbar-nav"> |
| 42 | <th1> |
| 43 | > |
| 44 | set once 1 |
| 45 | set sitemap 0 |
| 46 | set is_index [expr [string compare [string range $curr set is_home [expr [string compare [string range $current_page 0 [expr [string length $index_piv class="n html "<li</span>'active'ollapse" data-\ puts "Not } else { |
| 47 | |
| 48 | <head> |
| 49 | <meta charset="u<html lang="en"> |
| 50 | <head> |
| 51 | \ puts "Not } |
| 52 | div class= ifn>'active'><a href='$ puts "Not } else { |
| 53 | |
| 54 | <head> |
| 55 | <meta charset="ut<html lang="en"> |
| 56 | <head puts "Not } |
| 57 | } elseif {[hascap a]} { |
| 58 | div class= if {[string compare [stringsetup"] == 0} { |
| 59 | html "<li</span>'active'><a href='$home/s puts "Not } else { |
| 60 | |
| 61 | <head> |
| 62 | <meta charset="ut<html lang="en"> |
| 63 | <head> |
| 64 | <m puts "Not } |
| 65 | ogin'>Login</a>" |
| 66 | </th1> |
| 67 | ome/login' </ulixed-top" "wrap"> |
| 68 | <div class="navbar navbar-inverse navbar-fixed-top" role="navigation"> |
| 69 | <div class="container"> |
| 70 | <div class="navbar-header"> |
| 71 | <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> |
| 72 | <span class="sr-only">Toggle navigation</span> |
| 73 | $title |
+3
-1
| --- src/cgi.c | ||
| +++ src/cgi.c | ||
| @@ -382,11 +382,13 @@ | ||
| 382 | 382 | fprintf(g.httpOut, "Content-Length: %d\r\n", total_size); |
| 383 | 383 | }else{ |
| 384 | 384 | total_size = 0; |
| 385 | 385 | } |
| 386 | 386 | fprintf(g.httpOut, "\r\n"); |
| 387 | - if( total_size>0 && iReplyStatus != 304 ){ | |
| 387 | + if( total_size>0 && iReplyStatus != 304 | |
| 388 | + && fossil_strcmp(P("REQUEST_METHOD"),"HEAD")!=0 | |
| 389 | + ){ | |
| 388 | 390 | int i, size; |
| 389 | 391 | for(i=0; i<2; i++){ |
| 390 | 392 | size = blob_size(&cgiContent[i]); |
| 391 | 393 | if( size>0 ){ |
| 392 | 394 | fwrite(blob_buffer(&cgiContent[i]), 1, size, g.httpOut); |
| 393 | 395 |
| --- src/cgi.c | |
| +++ src/cgi.c | |
| @@ -382,11 +382,13 @@ | |
| 382 | fprintf(g.httpOut, "Content-Length: %d\r\n", total_size); |
| 383 | }else{ |
| 384 | total_size = 0; |
| 385 | } |
| 386 | fprintf(g.httpOut, "\r\n"); |
| 387 | if( total_size>0 && iReplyStatus != 304 ){ |
| 388 | int i, size; |
| 389 | for(i=0; i<2; i++){ |
| 390 | size = blob_size(&cgiContent[i]); |
| 391 | if( size>0 ){ |
| 392 | fwrite(blob_buffer(&cgiContent[i]), 1, size, g.httpOut); |
| 393 |
| --- src/cgi.c | |
| +++ src/cgi.c | |
| @@ -382,11 +382,13 @@ | |
| 382 | fprintf(g.httpOut, "Content-Length: %d\r\n", total_size); |
| 383 | }else{ |
| 384 | total_size = 0; |
| 385 | } |
| 386 | fprintf(g.httpOut, "\r\n"); |
| 387 | if( total_size>0 && iReplyStatus != 304 |
| 388 | && fossil_strcmp(P("REQUEST_METHOD"),"HEAD")!=0 |
| 389 | ){ |
| 390 | int i, size; |
| 391 | for(i=0; i<2; i++){ |
| 392 | size = blob_size(&cgiContent[i]); |
| 393 | if( size>0 ){ |
| 394 | fwrite(blob_buffer(&cgiContent[i]), 1, size, g.httpOut); |
| 395 |
+3
-2
| --- src/finfo.c | ||
| +++ src/finfo.c | ||
| @@ -310,10 +310,11 @@ | ||
| 310 | 310 | int brBg = P("brbg")!=0; |
| 311 | 311 | int uBg = P("ubg")!=0; |
| 312 | 312 | int fDebug = atoi(PD("debug","0")); |
| 313 | 313 | int fShowId = P("showid")!=0; |
| 314 | 314 | Stmt qparent; |
| 315 | + int iTableId = timeline_tableid(); | |
| 315 | 316 | |
| 316 | 317 | login_check_credentials(); |
| 317 | 318 | if( !g.perm.Read ){ login_needed(g.anon.Read); return; } |
| 318 | 319 | style_header("File History"); |
| 319 | 320 | login_anonymous_available(); |
| @@ -415,11 +416,11 @@ | ||
| 415 | 416 | if( fShowId ) blob_appendf(&title, " (%d)", fnid); |
| 416 | 417 | } |
| 417 | 418 | @ <h2>%b(&title)</h2> |
| 418 | 419 | blob_reset(&title); |
| 419 | 420 | pGraph = graph_init(); |
| 420 | - @ <table id="timelineTable" class="timelineTable"> | |
| 421 | + @ <table id="timelineTable%d(iTableId)" class="timelineTable"> | |
| 421 | 422 | if( baseCheckin ){ |
| 422 | 423 | db_prepare(&qparent, |
| 423 | 424 | "SELECT DISTINCT pid FROM mlink" |
| 424 | 425 | " WHERE fid=:fid AND mid=:mid AND pid>0 AND fnid=:fnid" |
| 425 | 426 | " AND pmid IN (SELECT rid FROM ancestor)" |
| @@ -558,11 +559,11 @@ | ||
| 558 | 559 | }else{ |
| 559 | 560 | @ <tr class="timelineBottom"><td></td><td></td><td></td></tr> |
| 560 | 561 | } |
| 561 | 562 | } |
| 562 | 563 | @ </table> |
| 563 | - timeline_output_graph_javascript(pGraph, 0, 1); | |
| 564 | + timeline_output_graph_javascript(pGraph, 0, iTableId, 1); | |
| 564 | 565 | style_footer(); |
| 565 | 566 | } |
| 566 | 567 | |
| 567 | 568 | /* |
| 568 | 569 | ** WEBPAGE: mlink |
| 569 | 570 |
| --- src/finfo.c | |
| +++ src/finfo.c | |
| @@ -310,10 +310,11 @@ | |
| 310 | int brBg = P("brbg")!=0; |
| 311 | int uBg = P("ubg")!=0; |
| 312 | int fDebug = atoi(PD("debug","0")); |
| 313 | int fShowId = P("showid")!=0; |
| 314 | Stmt qparent; |
| 315 | |
| 316 | login_check_credentials(); |
| 317 | if( !g.perm.Read ){ login_needed(g.anon.Read); return; } |
| 318 | style_header("File History"); |
| 319 | login_anonymous_available(); |
| @@ -415,11 +416,11 @@ | |
| 415 | if( fShowId ) blob_appendf(&title, " (%d)", fnid); |
| 416 | } |
| 417 | @ <h2>%b(&title)</h2> |
| 418 | blob_reset(&title); |
| 419 | pGraph = graph_init(); |
| 420 | @ <table id="timelineTable" class="timelineTable"> |
| 421 | if( baseCheckin ){ |
| 422 | db_prepare(&qparent, |
| 423 | "SELECT DISTINCT pid FROM mlink" |
| 424 | " WHERE fid=:fid AND mid=:mid AND pid>0 AND fnid=:fnid" |
| 425 | " AND pmid IN (SELECT rid FROM ancestor)" |
| @@ -558,11 +559,11 @@ | |
| 558 | }else{ |
| 559 | @ <tr class="timelineBottom"><td></td><td></td><td></td></tr> |
| 560 | } |
| 561 | } |
| 562 | @ </table> |
| 563 | timeline_output_graph_javascript(pGraph, 0, 1); |
| 564 | style_footer(); |
| 565 | } |
| 566 | |
| 567 | /* |
| 568 | ** WEBPAGE: mlink |
| 569 |
| --- src/finfo.c | |
| +++ src/finfo.c | |
| @@ -310,10 +310,11 @@ | |
| 310 | int brBg = P("brbg")!=0; |
| 311 | int uBg = P("ubg")!=0; |
| 312 | int fDebug = atoi(PD("debug","0")); |
| 313 | int fShowId = P("showid")!=0; |
| 314 | Stmt qparent; |
| 315 | int iTableId = timeline_tableid(); |
| 316 | |
| 317 | login_check_credentials(); |
| 318 | if( !g.perm.Read ){ login_needed(g.anon.Read); return; } |
| 319 | style_header("File History"); |
| 320 | login_anonymous_available(); |
| @@ -415,11 +416,11 @@ | |
| 416 | if( fShowId ) blob_appendf(&title, " (%d)", fnid); |
| 417 | } |
| 418 | @ <h2>%b(&title)</h2> |
| 419 | blob_reset(&title); |
| 420 | pGraph = graph_init(); |
| 421 | @ <table id="timelineTable%d(iTableId)" class="timelineTable"> |
| 422 | if( baseCheckin ){ |
| 423 | db_prepare(&qparent, |
| 424 | "SELECT DISTINCT pid FROM mlink" |
| 425 | " WHERE fid=:fid AND mid=:mid AND pid>0 AND fnid=:fnid" |
| 426 | " AND pmid IN (SELECT rid FROM ancestor)" |
| @@ -558,11 +559,11 @@ | |
| 559 | }else{ |
| 560 | @ <tr class="timelineBottom"><td></td><td></td><td></td></tr> |
| 561 | } |
| 562 | } |
| 563 | @ </table> |
| 564 | timeline_output_graph_javascript(pGraph, 0, iTableId, 1); |
| 565 | style_footer(); |
| 566 | } |
| 567 | |
| 568 | /* |
| 569 | ** WEBPAGE: mlink |
| 570 |
+2
-1
| --- src/graph.c | ||
| +++ src/graph.c | ||
| @@ -184,10 +184,11 @@ | ||
| 184 | 184 | const char *zUuid, /* hash name of the object being graphed */ |
| 185 | 185 | int isLeaf /* True if this row is a leaf */ |
| 186 | 186 | ){ |
| 187 | 187 | GraphRow *pRow; |
| 188 | 188 | int nByte; |
| 189 | + static int nRow = 0; | |
| 189 | 190 | |
| 190 | 191 | if( p->nErr ) return 0; |
| 191 | 192 | nByte = sizeof(GraphRow); |
| 192 | 193 | nByte += sizeof(pRow->aParent[0])*nParent; |
| 193 | 194 | pRow = (GraphRow*)safeMalloc( nByte ); |
| @@ -207,11 +208,11 @@ | ||
| 207 | 208 | }else{ |
| 208 | 209 | p->pLast->pNext = pRow; |
| 209 | 210 | } |
| 210 | 211 | p->pLast = pRow; |
| 211 | 212 | p->nRow++; |
| 212 | - pRow->idx = pRow->idxTop = p->nRow; | |
| 213 | + pRow->idx = pRow->idxTop = ++nRow; | |
| 213 | 214 | return pRow->idx; |
| 214 | 215 | } |
| 215 | 216 | |
| 216 | 217 | /* |
| 217 | 218 | ** Return the index of a rail currently not in use for any row between |
| 218 | 219 |
| --- src/graph.c | |
| +++ src/graph.c | |
| @@ -184,10 +184,11 @@ | |
| 184 | const char *zUuid, /* hash name of the object being graphed */ |
| 185 | int isLeaf /* True if this row is a leaf */ |
| 186 | ){ |
| 187 | GraphRow *pRow; |
| 188 | int nByte; |
| 189 | |
| 190 | if( p->nErr ) return 0; |
| 191 | nByte = sizeof(GraphRow); |
| 192 | nByte += sizeof(pRow->aParent[0])*nParent; |
| 193 | pRow = (GraphRow*)safeMalloc( nByte ); |
| @@ -207,11 +208,11 @@ | |
| 207 | }else{ |
| 208 | p->pLast->pNext = pRow; |
| 209 | } |
| 210 | p->pLast = pRow; |
| 211 | p->nRow++; |
| 212 | pRow->idx = pRow->idxTop = p->nRow; |
| 213 | return pRow->idx; |
| 214 | } |
| 215 | |
| 216 | /* |
| 217 | ** Return the index of a rail currently not in use for any row between |
| 218 |
| --- src/graph.c | |
| +++ src/graph.c | |
| @@ -184,10 +184,11 @@ | |
| 184 | const char *zUuid, /* hash name of the object being graphed */ |
| 185 | int isLeaf /* True if this row is a leaf */ |
| 186 | ){ |
| 187 | GraphRow *pRow; |
| 188 | int nByte; |
| 189 | static int nRow = 0; |
| 190 | |
| 191 | if( p->nErr ) return 0; |
| 192 | nByte = sizeof(GraphRow); |
| 193 | nByte += sizeof(pRow->aParent[0])*nParent; |
| 194 | pRow = (GraphRow*)safeMalloc( nByte ); |
| @@ -207,11 +208,11 @@ | |
| 208 | }else{ |
| 209 | p->pLast->pNext = pRow; |
| 210 | } |
| 211 | p->pLast = pRow; |
| 212 | p->nRow++; |
| 213 | pRow->idx = pRow->idxTop = ++nRow; |
| 214 | return pRow->idx; |
| 215 | } |
| 216 | |
| 217 | /* |
| 218 | ** Return the index of a rail currently not in use for any row between |
| 219 |
+66
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -134,10 +134,11 @@ | ||
| 134 | 134 | " FROM config" |
| 135 | 135 | " WHERE name GLOB 'ckout:*' ORDER BY mtime DESC"); |
| 136 | 136 | while( db_step(&s)==SQLITE_ROW ){ |
| 137 | 137 | const char *zName; |
| 138 | 138 | const char *zCkout = db_column_text(&s, 0); |
| 139 | + if( !vfile_top_of_checkout(zCkout) ) continue; | |
| 139 | 140 | if( g.localOpen ){ |
| 140 | 141 | if( fossil_strcmp(zCkout, g.zLocalRoot)==0 ) continue; |
| 141 | 142 | zName = "alt-root:"; |
| 142 | 143 | }else{ |
| 143 | 144 | zName = "check-out:"; |
| @@ -315,10 +316,11 @@ | ||
| 315 | 316 | Stmt q; |
| 316 | 317 | blob_zero(&sql); |
| 317 | 318 | blob_append(&sql, timeline_query_for_www(), -1); |
| 318 | 319 | db_multi_exec( |
| 319 | 320 | "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY);" |
| 321 | + "DELETE FROM ok;" | |
| 320 | 322 | "INSERT INTO ok VALUES(%d);" |
| 321 | 323 | "INSERT OR IGNORE INTO ok SELECT pid FROM plink WHERE cid=%d;", |
| 322 | 324 | rid, rid |
| 323 | 325 | ); |
| 324 | 326 | if( !parentsOnly ){ |
| @@ -329,10 +331,73 @@ | ||
| 329 | 331 | blob_append_sql(&sql, " AND event.objid IN ok ORDER BY mtime DESC"); |
| 330 | 332 | db_prepare(&q, "%s", blob_sql_text(&sql)); |
| 331 | 333 | www_print_timeline(&q, TIMELINE_DISJOINT|TIMELINE_GRAPH, 0, 0, rid, 0); |
| 332 | 334 | db_finalize(&q); |
| 333 | 335 | } |
| 336 | + | |
| 337 | +/* | |
| 338 | +** Show a graph all wiki, tickets, and check-ins that refer to object zUuid. | |
| 339 | +** | |
| 340 | +** If zLabel is not NULL and the graph is not empty, then output zLabel as | |
| 341 | +** a prefix to the graph. | |
| 342 | +*/ | |
| 343 | +void render_backlink_graph(const char *zUuid, const char *zLabel){ | |
| 344 | + Blob sql; | |
| 345 | + Stmt q; | |
| 346 | + char *zGlob; | |
| 347 | + zGlob = mprintf("%.5s*", zUuid); | |
| 348 | + db_multi_exec( | |
| 349 | + "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY);" | |
| 350 | + "DELETE FROM ok;" | |
| 351 | + "INSERT OR IGNORE INTO ok" | |
| 352 | + " SELECT srcid FROM backlink" | |
| 353 | + " WHERE target GLOB %Q" | |
| 354 | + " AND %Q GLOB (target || '*');", | |
| 355 | + zGlob, zUuid | |
| 356 | + ); | |
| 357 | + if( !db_exists("SELECT 1 FROM ok") ) return; | |
| 358 | + if( zLabel ) cgi_printf("%s", zLabel); | |
| 359 | + blob_zero(&sql); | |
| 360 | + blob_append(&sql, timeline_query_for_www(), -1); | |
| 361 | + blob_append_sql(&sql, " AND event.objid IN ok ORDER BY mtime DESC"); | |
| 362 | + db_prepare(&q, "%s", blob_sql_text(&sql)); | |
| 363 | + www_print_timeline(&q, TIMELINE_DISJOINT|TIMELINE_GRAPH, 0, 0, 0, 0); | |
| 364 | + db_finalize(&q); | |
| 365 | +} | |
| 366 | + | |
| 367 | +/* | |
| 368 | +** WEBPAGE: test-backlinks | |
| 369 | +** | |
| 370 | +** Show a timeline of all check-ins and other events that have entries | |
| 371 | +** in the backlink table. This is used for testing the rendering | |
| 372 | +** of the "References" section of the /info page. | |
| 373 | +*/ | |
| 374 | +void backlink_timeline_page(void){ | |
| 375 | + Blob sql; | |
| 376 | + Stmt q; | |
| 377 | + | |
| 378 | + login_check_credentials(); | |
| 379 | + if( !g.perm.Read || !g.perm.RdTkt || !g.perm.RdWiki ){ | |
| 380 | + login_needed(g.anon.Read && g.anon.RdTkt && g.anon.RdWiki); | |
| 381 | + return; | |
| 382 | + } | |
| 383 | + style_header("Backlink Timeline (Internal Testing Use)"); | |
| 384 | + db_multi_exec( | |
| 385 | + "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY);" | |
| 386 | + "DELETE FROM ok;" | |
| 387 | + "INSERT OR IGNORE INTO ok" | |
| 388 | + " SELECT blob.rid FROM backlink, blob" | |
| 389 | + " WHERE blob.uuid BETWEEN backlink.target AND (backlink.target||'x')" | |
| 390 | + ); | |
| 391 | + blob_zero(&sql); | |
| 392 | + blob_append(&sql, timeline_query_for_www(), -1); | |
| 393 | + blob_append_sql(&sql, " AND event.objid IN ok ORDER BY mtime DESC"); | |
| 394 | + db_prepare(&q, "%s", blob_sql_text(&sql)); | |
| 395 | + www_print_timeline(&q, TIMELINE_DISJOINT|TIMELINE_GRAPH, 0, 0, 0, 0); | |
| 396 | + db_finalize(&q); | |
| 397 | + style_footer(); | |
| 398 | +} | |
| 334 | 399 | |
| 335 | 400 | |
| 336 | 401 | /* |
| 337 | 402 | ** Append the difference between artifacts to the output |
| 338 | 403 | */ |
| @@ -706,10 +771,11 @@ | ||
| 706 | 771 | }else{ |
| 707 | 772 | style_header("Check-in Information"); |
| 708 | 773 | login_anonymous_available(); |
| 709 | 774 | } |
| 710 | 775 | db_finalize(&q1); |
| 776 | + render_backlink_graph(zUuid, "<div class=\"section\">References</div>\n"); | |
| 711 | 777 | showTags(rid); |
| 712 | 778 | @ <div class="section">Context</div> |
| 713 | 779 | render_checkin_context(rid, 0); |
| 714 | 780 | @ <div class="section">Changes</div> |
| 715 | 781 | @ <div class="sectionmenu"> |
| 716 | 782 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -134,10 +134,11 @@ | |
| 134 | " FROM config" |
| 135 | " WHERE name GLOB 'ckout:*' ORDER BY mtime DESC"); |
| 136 | while( db_step(&s)==SQLITE_ROW ){ |
| 137 | const char *zName; |
| 138 | const char *zCkout = db_column_text(&s, 0); |
| 139 | if( g.localOpen ){ |
| 140 | if( fossil_strcmp(zCkout, g.zLocalRoot)==0 ) continue; |
| 141 | zName = "alt-root:"; |
| 142 | }else{ |
| 143 | zName = "check-out:"; |
| @@ -315,10 +316,11 @@ | |
| 315 | Stmt q; |
| 316 | blob_zero(&sql); |
| 317 | blob_append(&sql, timeline_query_for_www(), -1); |
| 318 | db_multi_exec( |
| 319 | "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY);" |
| 320 | "INSERT INTO ok VALUES(%d);" |
| 321 | "INSERT OR IGNORE INTO ok SELECT pid FROM plink WHERE cid=%d;", |
| 322 | rid, rid |
| 323 | ); |
| 324 | if( !parentsOnly ){ |
| @@ -329,10 +331,73 @@ | |
| 329 | blob_append_sql(&sql, " AND event.objid IN ok ORDER BY mtime DESC"); |
| 330 | db_prepare(&q, "%s", blob_sql_text(&sql)); |
| 331 | www_print_timeline(&q, TIMELINE_DISJOINT|TIMELINE_GRAPH, 0, 0, rid, 0); |
| 332 | db_finalize(&q); |
| 333 | } |
| 334 | |
| 335 | |
| 336 | /* |
| 337 | ** Append the difference between artifacts to the output |
| 338 | */ |
| @@ -706,10 +771,11 @@ | |
| 706 | }else{ |
| 707 | style_header("Check-in Information"); |
| 708 | login_anonymous_available(); |
| 709 | } |
| 710 | db_finalize(&q1); |
| 711 | showTags(rid); |
| 712 | @ <div class="section">Context</div> |
| 713 | render_checkin_context(rid, 0); |
| 714 | @ <div class="section">Changes</div> |
| 715 | @ <div class="sectionmenu"> |
| 716 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -134,10 +134,11 @@ | |
| 134 | " FROM config" |
| 135 | " WHERE name GLOB 'ckout:*' ORDER BY mtime DESC"); |
| 136 | while( db_step(&s)==SQLITE_ROW ){ |
| 137 | const char *zName; |
| 138 | const char *zCkout = db_column_text(&s, 0); |
| 139 | if( !vfile_top_of_checkout(zCkout) ) continue; |
| 140 | if( g.localOpen ){ |
| 141 | if( fossil_strcmp(zCkout, g.zLocalRoot)==0 ) continue; |
| 142 | zName = "alt-root:"; |
| 143 | }else{ |
| 144 | zName = "check-out:"; |
| @@ -315,10 +316,11 @@ | |
| 316 | Stmt q; |
| 317 | blob_zero(&sql); |
| 318 | blob_append(&sql, timeline_query_for_www(), -1); |
| 319 | db_multi_exec( |
| 320 | "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY);" |
| 321 | "DELETE FROM ok;" |
| 322 | "INSERT INTO ok VALUES(%d);" |
| 323 | "INSERT OR IGNORE INTO ok SELECT pid FROM plink WHERE cid=%d;", |
| 324 | rid, rid |
| 325 | ); |
| 326 | if( !parentsOnly ){ |
| @@ -329,10 +331,73 @@ | |
| 331 | blob_append_sql(&sql, " AND event.objid IN ok ORDER BY mtime DESC"); |
| 332 | db_prepare(&q, "%s", blob_sql_text(&sql)); |
| 333 | www_print_timeline(&q, TIMELINE_DISJOINT|TIMELINE_GRAPH, 0, 0, rid, 0); |
| 334 | db_finalize(&q); |
| 335 | } |
| 336 | |
| 337 | /* |
| 338 | ** Show a graph all wiki, tickets, and check-ins that refer to object zUuid. |
| 339 | ** |
| 340 | ** If zLabel is not NULL and the graph is not empty, then output zLabel as |
| 341 | ** a prefix to the graph. |
| 342 | */ |
| 343 | void render_backlink_graph(const char *zUuid, const char *zLabel){ |
| 344 | Blob sql; |
| 345 | Stmt q; |
| 346 | char *zGlob; |
| 347 | zGlob = mprintf("%.5s*", zUuid); |
| 348 | db_multi_exec( |
| 349 | "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY);" |
| 350 | "DELETE FROM ok;" |
| 351 | "INSERT OR IGNORE INTO ok" |
| 352 | " SELECT srcid FROM backlink" |
| 353 | " WHERE target GLOB %Q" |
| 354 | " AND %Q GLOB (target || '*');", |
| 355 | zGlob, zUuid |
| 356 | ); |
| 357 | if( !db_exists("SELECT 1 FROM ok") ) return; |
| 358 | if( zLabel ) cgi_printf("%s", zLabel); |
| 359 | blob_zero(&sql); |
| 360 | blob_append(&sql, timeline_query_for_www(), -1); |
| 361 | blob_append_sql(&sql, " AND event.objid IN ok ORDER BY mtime DESC"); |
| 362 | db_prepare(&q, "%s", blob_sql_text(&sql)); |
| 363 | www_print_timeline(&q, TIMELINE_DISJOINT|TIMELINE_GRAPH, 0, 0, 0, 0); |
| 364 | db_finalize(&q); |
| 365 | } |
| 366 | |
| 367 | /* |
| 368 | ** WEBPAGE: test-backlinks |
| 369 | ** |
| 370 | ** Show a timeline of all check-ins and other events that have entries |
| 371 | ** in the backlink table. This is used for testing the rendering |
| 372 | ** of the "References" section of the /info page. |
| 373 | */ |
| 374 | void backlink_timeline_page(void){ |
| 375 | Blob sql; |
| 376 | Stmt q; |
| 377 | |
| 378 | login_check_credentials(); |
| 379 | if( !g.perm.Read || !g.perm.RdTkt || !g.perm.RdWiki ){ |
| 380 | login_needed(g.anon.Read && g.anon.RdTkt && g.anon.RdWiki); |
| 381 | return; |
| 382 | } |
| 383 | style_header("Backlink Timeline (Internal Testing Use)"); |
| 384 | db_multi_exec( |
| 385 | "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY);" |
| 386 | "DELETE FROM ok;" |
| 387 | "INSERT OR IGNORE INTO ok" |
| 388 | " SELECT blob.rid FROM backlink, blob" |
| 389 | " WHERE blob.uuid BETWEEN backlink.target AND (backlink.target||'x')" |
| 390 | ); |
| 391 | blob_zero(&sql); |
| 392 | blob_append(&sql, timeline_query_for_www(), -1); |
| 393 | blob_append_sql(&sql, " AND event.objid IN ok ORDER BY mtime DESC"); |
| 394 | db_prepare(&q, "%s", blob_sql_text(&sql)); |
| 395 | www_print_timeline(&q, TIMELINE_DISJOINT|TIMELINE_GRAPH, 0, 0, 0, 0); |
| 396 | db_finalize(&q); |
| 397 | style_footer(); |
| 398 | } |
| 399 | |
| 400 | |
| 401 | /* |
| 402 | ** Append the difference between artifacts to the output |
| 403 | */ |
| @@ -706,10 +771,11 @@ | |
| 771 | }else{ |
| 772 | style_header("Check-in Information"); |
| 773 | login_anonymous_available(); |
| 774 | } |
| 775 | db_finalize(&q1); |
| 776 | render_backlink_graph(zUuid, "<div class=\"section\">References</div>\n"); |
| 777 | showTags(rid); |
| 778 | @ <div class="section">Context</div> |
| 779 | render_checkin_context(rid, 0); |
| 780 | @ <div class="section">Changes</div> |
| 781 | @ <div class="sectionmenu"> |
| 782 |
+4
| --- src/main.mk | ||
| +++ src/main.mk | ||
| @@ -156,10 +156,14 @@ | ||
| 156 | 156 | $(SRCDIR)/../skins/blitz_no_logo/css.txt \ |
| 157 | 157 | $(SRCDIR)/../skins/blitz_no_logo/details.txt \ |
| 158 | 158 | $(SRCDIR)/../skins/blitz_no_logo/footer.txt \ |
| 159 | 159 | $(SRCDIR)/../skins/blitz_no_logo/header.txt \ |
| 160 | 160 | $(SRCDIR)/../skins/blitz_no_logo/ticket.txt \ |
| 161 | + $(SRCDIR)/../skins/bootstrap/css.txt \ | |
| 162 | + $(SRCDIR)/../skins/bootstrap/details.txt \ | |
| 163 | + $(SRCDIR)/../skins/bootstrap/footer.txt \ | |
| 164 | + $(SRCDIR)/../skins/bootstrap/header.txt \ | |
| 161 | 165 | $(SRCDIR)/../skins/default/css.txt \ |
| 162 | 166 | $(SRCDIR)/../skins/default/details.txt \ |
| 163 | 167 | $(SRCDIR)/../skins/default/footer.txt \ |
| 164 | 168 | $(SRCDIR)/../skins/default/header.txt \ |
| 165 | 169 | $(SRCDIR)/../skins/eagle/css.txt \ |
| 166 | 170 |
| --- src/main.mk | |
| +++ src/main.mk | |
| @@ -156,10 +156,14 @@ | |
| 156 | $(SRCDIR)/../skins/blitz_no_logo/css.txt \ |
| 157 | $(SRCDIR)/../skins/blitz_no_logo/details.txt \ |
| 158 | $(SRCDIR)/../skins/blitz_no_logo/footer.txt \ |
| 159 | $(SRCDIR)/../skins/blitz_no_logo/header.txt \ |
| 160 | $(SRCDIR)/../skins/blitz_no_logo/ticket.txt \ |
| 161 | $(SRCDIR)/../skins/default/css.txt \ |
| 162 | $(SRCDIR)/../skins/default/details.txt \ |
| 163 | $(SRCDIR)/../skins/default/footer.txt \ |
| 164 | $(SRCDIR)/../skins/default/header.txt \ |
| 165 | $(SRCDIR)/../skins/eagle/css.txt \ |
| 166 |
| --- src/main.mk | |
| +++ src/main.mk | |
| @@ -156,10 +156,14 @@ | |
| 156 | $(SRCDIR)/../skins/blitz_no_logo/css.txt \ |
| 157 | $(SRCDIR)/../skins/blitz_no_logo/details.txt \ |
| 158 | $(SRCDIR)/../skins/blitz_no_logo/footer.txt \ |
| 159 | $(SRCDIR)/../skins/blitz_no_logo/header.txt \ |
| 160 | $(SRCDIR)/../skins/blitz_no_logo/ticket.txt \ |
| 161 | $(SRCDIR)/../skins/bootstrap/css.txt \ |
| 162 | $(SRCDIR)/../skins/bootstrap/details.txt \ |
| 163 | $(SRCDIR)/../skins/bootstrap/footer.txt \ |
| 164 | $(SRCDIR)/../skins/bootstrap/header.txt \ |
| 165 | $(SRCDIR)/../skins/default/css.txt \ |
| 166 | $(SRCDIR)/../skins/default/details.txt \ |
| 167 | $(SRCDIR)/../skins/default/footer.txt \ |
| 168 | $(SRCDIR)/../skins/default/header.txt \ |
| 169 | $(SRCDIR)/../skins/eagle/css.txt \ |
| 170 |
+73
-27
| --- src/setup.c | ||
| +++ src/setup.c | ||
| @@ -1106,18 +1106,20 @@ | ||
| 1106 | 1106 | |
| 1107 | 1107 | style_header("Access Control Settings"); |
| 1108 | 1108 | db_begin_transaction(); |
| 1109 | 1109 | @ <form action="%s(g.zTop)/setup_access" method="post"><div> |
| 1110 | 1110 | login_insert_csrf_secret(); |
| 1111 | + @ <input type="submit" name="submit" value="Apply Changes" /></p> | |
| 1111 | 1112 | @ <hr /> |
| 1112 | 1113 | onoff_attribute("Redirect to HTTPS on the Login page", |
| 1113 | 1114 | "redirect-to-https", "redirhttps", 0, 0); |
| 1114 | 1115 | @ <p>When selected, force the use of HTTPS for the Login page. |
| 1115 | 1116 | @ <p>Details: When enabled, this option causes the $secureurl TH1 |
| 1116 | 1117 | @ variable is set to an "https:" variant of $baseurl. Otherwise, |
| 1117 | 1118 | @ $secureurl is just an alias for $baseurl. Also when enabled, the |
| 1118 | 1119 | @ Login page redirects to https if accessed via http. |
| 1120 | + @ (Property: "redirhttps") | |
| 1119 | 1121 | @ <hr /> |
| 1120 | 1122 | onoff_attribute("Require password for local access", |
| 1121 | 1123 | "localauth", "localauth", 0, 0); |
| 1122 | 1124 | @ <p>When enabled, the password sign-in is always required for |
| 1123 | 1125 | @ web access. When disabled, unrestricted web access from 127.0.0.1 |
| @@ -1138,67 +1140,74 @@ | ||
| 1138 | 1140 | @ <a href="%R/help/server">fossil http</a> commands |
| 1139 | 1141 | @ without the "--localauth" option. |
| 1140 | 1142 | @ <li> The server is started from CGI without the "localauth" keyword |
| 1141 | 1143 | @ in the CGI script. |
| 1142 | 1144 | @ </ol> |
| 1145 | + @ (Property: "localauth") | |
| 1143 | 1146 | @ |
| 1144 | 1147 | @ <hr /> |
| 1145 | 1148 | onoff_attribute("Enable /test_env", |
| 1146 | 1149 | "test_env_enable", "test_env_enable", 0, 0); |
| 1147 | 1150 | @ <p>When enabled, the %h(g.zBaseURL)/test_env URL is available to all |
| 1148 | 1151 | @ users. When disabled (the default) only users Admin and Setup can visit |
| 1149 | 1152 | @ the /test_env page. |
| 1153 | + @ (Property: "test_env_enable") | |
| 1150 | 1154 | @ </p> |
| 1151 | 1155 | @ |
| 1152 | 1156 | @ <hr /> |
| 1153 | 1157 | onoff_attribute("Allow REMOTE_USER authentication", |
| 1154 | 1158 | "remote_user_ok", "remote_user_ok", 0, 0); |
| 1155 | 1159 | @ <p>When enabled, if the REMOTE_USER environment variable is set to the |
| 1156 | 1160 | @ login name of a valid user and no other login credentials are available, |
| 1157 | 1161 | @ then the REMOTE_USER is accepted as an authenticated user. |
| 1162 | + @ (Property: "remote_user_ok") | |
| 1158 | 1163 | @ </p> |
| 1159 | 1164 | @ |
| 1160 | 1165 | @ <hr /> |
| 1161 | 1166 | onoff_attribute("Allow HTTP_AUTHENTICATION authentication", |
| 1162 | 1167 | "http_authentication_ok", "http_authentication_ok", 0, 0); |
| 1163 | 1168 | @ <p>When enabled, allow the use of the HTTP_AUTHENTICATION environment |
| 1164 | 1169 | @ variable or the "Authentication:" HTTP header to find the username and |
| 1165 | 1170 | @ password. This is another way of supporting Basic Authenitication. |
| 1171 | + @ (Property: "http_authentication_ok") | |
| 1166 | 1172 | @ </p> |
| 1167 | 1173 | @ |
| 1168 | 1174 | @ <hr /> |
| 1169 | 1175 | entry_attribute("IP address terms used in login cookie", 3, |
| 1170 | 1176 | "ip-prefix-terms", "ipt", "2", 0); |
| 1171 | 1177 | @ <p>The number of octets of of the IP address used in the login cookie. |
| 1172 | 1178 | @ Set to zero to omit the IP address from the login cookie. A value of |
| 1173 | 1179 | @ 2 is recommended. |
| 1180 | + @ (Property: "ip-prefix-terms") | |
| 1174 | 1181 | @ </p> |
| 1175 | 1182 | @ |
| 1176 | 1183 | @ <hr /> |
| 1177 | 1184 | entry_attribute("Login expiration time", 6, "cookie-expire", "cex", |
| 1178 | 1185 | "8766", 0); |
| 1179 | 1186 | @ <p>The number of hours for which a login is valid. This must be a |
| 1180 | 1187 | @ positive number. The default is 8766 hours which is approximately equal |
| 1181 | - @ to a year.</p> | |
| 1188 | + @ to a year. | |
| 1189 | + @ (Property: "cookie-expire")</p> | |
| 1182 | 1190 | |
| 1183 | 1191 | @ <hr /> |
| 1184 | 1192 | entry_attribute("Download packet limit", 10, "max-download", "mxdwn", |
| 1185 | 1193 | "5000000", 0); |
| 1186 | 1194 | @ <p>Fossil tries to limit out-bound sync, clone, and pull packets |
| 1187 | 1195 | @ to this many bytes, uncompressed. If the client requires more data |
| 1188 | 1196 | @ than this, then the client will issue multiple HTTP requests. |
| 1189 | 1197 | @ Values below 1 million are not recommended. 5 million is a |
| 1190 | - @ reasonable number.</p> | |
| 1198 | + @ reasonable number. (Property: "max-download")</p> | |
| 1191 | 1199 | |
| 1192 | 1200 | @ <hr /> |
| 1193 | 1201 | entry_attribute("Download time limit", 11, "max-download-time", "mxdwnt", |
| 1194 | 1202 | "30", 0); |
| 1195 | 1203 | |
| 1196 | 1204 | @ <p>Fossil tries to spend less than this many seconds gathering |
| 1197 | 1205 | @ the out-bound data of sync, clone, and pull packets. |
| 1198 | 1206 | @ If the client request takes longer, a partial reply is given similar |
| 1199 | - @ to the download packet limit. 30s is a reasonable default.</p> | |
| 1207 | + @ to the download packet limit. 30s is a reasonable default. | |
| 1208 | + @ (Property: "max-download-time")</p> | |
| 1200 | 1209 | |
| 1201 | 1210 | @ <hr /> |
| 1202 | 1211 | entry_attribute("Server Load Average Limit", 11, "max-loadavg", "mxldavg", |
| 1203 | 1212 | "0.0", 0); |
| 1204 | 1213 | @ <p>Some expensive operations (such as computing tarballs, zip archives, |
| @@ -1205,11 +1214,12 @@ | ||
| 1205 | 1214 | @ or annotation/blame pages) are prohibited if the load average on the host |
| 1206 | 1215 | @ computer is too large. Set the threshold for disallowing expensive |
| 1207 | 1216 | @ computations here. Set this to 0.0 to disable the load average limit. |
| 1208 | 1217 | @ This limit is only enforced on Unix servers. On Linux systems, |
| 1209 | 1218 | @ access to the /proc virtual filesystem is required, which means this limit |
| 1210 | - @ might not work inside a chroot() jail.</p> | |
| 1219 | + @ might not work inside a chroot() jail. | |
| 1220 | + @ (Property: "max-loadavg")</p> | |
| 1211 | 1221 | |
| 1212 | 1222 | @ <hr /> |
| 1213 | 1223 | onoff_attribute( |
| 1214 | 1224 | "Enable hyperlinks for \"nobody\" based on User-Agent and Javascript", |
| 1215 | 1225 | "auto-hyperlink", "autohyperlink", 1, 0); |
| @@ -1219,41 +1229,42 @@ | ||
| 1219 | 1229 | @ being and not a robot or spider and (2) the user agent is able to |
| 1220 | 1230 | @ run Javascript in order to set the href= attribute of hyperlinks. Bots |
| 1221 | 1231 | @ and spiders can forge a User-Agent string that makes them seem to be a |
| 1222 | 1232 | @ normal browser and they can run javascript just like browsers. But most |
| 1223 | 1233 | @ bots do not go to that much trouble so this is normally an effective |
| 1224 | - @ defense.</p> | |
| 1234 | + @ defense.<p> | |
| 1225 | 1235 | @ |
| 1226 | 1236 | @ <p>You do not normally want a bot to walk your entire repository because |
| 1227 | 1237 | @ if it does, your server will end up computing diffs and annotations for |
| 1228 | 1238 | @ every historical version of every file and creating ZIPs and tarballs of |
| 1229 | 1239 | @ every historical check-in, which can use a lot of CPU and bandwidth |
| 1230 | 1240 | @ even for relatively small projects.</p> |
| 1231 | 1241 | @ |
| 1232 | 1242 | @ <p>Additional parameters that control this behavior:</p> |
| 1233 | 1243 | @ <blockquote> |
| 1234 | - onoff_attribute("Enable hyperlinks for humans (as deduced from the UserAgent " | |
| 1235 | - " HTTP header string)", | |
| 1236 | - "auto-hyperlink-ishuman", "ahis", 0, 0); | |
| 1244 | + onoff_attribute("Enable hyperlinks for humans as deduced from the UserAgent " | |
| 1245 | + "string", "auto-hyperlink-ishuman", "ahis", 0, 0); | |
| 1237 | 1246 | @ <br /> |
| 1238 | 1247 | onoff_attribute("Require mouse movement before enabling hyperlinks", |
| 1239 | 1248 | "auto-hyperlink-mouseover", "ahmo", 0, 0); |
| 1240 | 1249 | @ <br /> |
| 1241 | - entry_attribute("Delay before enabling hyperlinks (milliseconds)", 5, | |
| 1250 | + entry_attribute("Delay in milliseconds before enabling hyperlinks", 5, | |
| 1242 | 1251 | "auto-hyperlink-delay", "ah-delay", "10", 0); |
| 1243 | 1252 | @ </blockquote> |
| 1244 | 1253 | @ <p>Hyperlinks for user "nobody" are normally enabled as soon as the page |
| 1245 | 1254 | @ finishes loading. But the first check-box below can be set to require mouse |
| 1246 | 1255 | @ movement before enabling the links. One can also set a delay prior to enabling |
| 1247 | 1256 | @ links by enter a positive number of milliseconds in the entry box above.</p> |
| 1257 | + @ (Properties: "auto-hyperlink", "auto-hyperlink-ishuman", | |
| 1258 | + @ "auto-hyperlink-mouseover", and "auto-hyperlink-delay")</p> | |
| 1248 | 1259 | |
| 1249 | 1260 | @ <hr /> |
| 1250 | 1261 | onoff_attribute("Require a CAPTCHA if not logged in", |
| 1251 | 1262 | "require-captcha", "reqcapt", 1, 0); |
| 1252 | 1263 | @ <p>Require a CAPTCHA for edit operations (appending, creating, or |
| 1253 | 1264 | @ editing wiki or tickets or adding attachments to wiki or tickets) |
| 1254 | - @ for users who are not logged in.</p> | |
| 1265 | + @ for users who are not logged in. (Property: "require-captcha")</p> | |
| 1255 | 1266 | |
| 1256 | 1267 | @ <hr /> |
| 1257 | 1268 | entry_attribute("Public pages", 30, "public-pages", |
| 1258 | 1269 | "pubpage", "", 0); |
| 1259 | 1270 | @ <p>A comma-separated list of glob patterns for pages that are accessible |
| @@ -1260,10 +1271,11 @@ | ||
| 1260 | 1271 | @ without needing a login and using the privileges given by the |
| 1261 | 1272 | @ "Default privileges" setting below. Example use case: Set this field |
| 1262 | 1273 | @ to "/doc/trunk/www/*" to give anonymous users read-only permission to the |
| 1263 | 1274 | @ latest version of the embedded documentation in the www/ folder without |
| 1264 | 1275 | @ allowing them to see the rest of the source code. |
| 1276 | + @ (Property: "public-pages") | |
| 1265 | 1277 | @ </p> |
| 1266 | 1278 | |
| 1267 | 1279 | @ <hr /> |
| 1268 | 1280 | onoff_attribute("Allow users to register themselves", |
| 1269 | 1281 | "self-register", "selfregister", 0, 0); |
| @@ -1270,29 +1282,30 @@ | ||
| 1270 | 1282 | @ <p>Allow users to register themselves through the HTTP UI. |
| 1271 | 1283 | @ The registration form always requires filling in a CAPTCHA |
| 1272 | 1284 | @ (<em>auto-captcha</em> setting is ignored). Still, bear in mind that anyone |
| 1273 | 1285 | @ can register under any user name. This option is useful for public projects |
| 1274 | 1286 | @ where you do not want everyone in any ticket discussion to be named |
| 1275 | - @ "Anonymous".</p> | |
| 1287 | + @ "Anonymous". (Property: "self-register")</p> | |
| 1276 | 1288 | |
| 1277 | 1289 | @ <hr /> |
| 1278 | 1290 | entry_attribute("Default privileges", 10, "default-perms", |
| 1279 | 1291 | "defaultperms", "u", 0); |
| 1280 | 1292 | @ <p>Permissions given to users that... <ul><li>register themselves using |
| 1281 | 1293 | @ the self-registration procedure (if enabled), or <li>access "public" |
| 1282 | 1294 | @ pages identified by the public-pages glob pattern above, or <li> |
| 1283 | 1295 | @ are users newly created by the administrator.</ul> |
| 1296 | + @ (Property: "default-perms") | |
| 1284 | 1297 | @ </p> |
| 1285 | 1298 | |
| 1286 | 1299 | @ <hr /> |
| 1287 | 1300 | onoff_attribute("Show javascript button to fill in CAPTCHA", |
| 1288 | 1301 | "auto-captcha", "autocaptcha", 0, 0); |
| 1289 | 1302 | @ <p>When enabled, a button appears on the login screen for user |
| 1290 | 1303 | @ "anonymous" that will automatically fill in the CAPTCHA password. |
| 1291 | 1304 | @ This is less secure than forcing the user to do it manually, but is |
| 1292 | 1305 | @ probably secure enough and it is certainly more convenient for |
| 1293 | - @ anonymous users.</p> | |
| 1306 | + @ anonymous users. (Property: "auto-captcha")</p> | |
| 1294 | 1307 | |
| 1295 | 1308 | @ <hr /> |
| 1296 | 1309 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1297 | 1310 | @ </div></form> |
| 1298 | 1311 | db_end_transaction(0); |
| @@ -1440,28 +1453,31 @@ | ||
| 1440 | 1453 | style_header("Timeline Display Preferences"); |
| 1441 | 1454 | db_begin_transaction(); |
| 1442 | 1455 | @ <form action="%s(g.zTop)/setup_timeline" method="post"><div> |
| 1443 | 1456 | login_insert_csrf_secret(); |
| 1444 | 1457 | |
| 1458 | + @ <p><input type="submit" name="submit" value="Apply Changes" /></p> | |
| 1445 | 1459 | @ <hr /> |
| 1446 | 1460 | onoff_attribute("Allow block-markup in timeline", |
| 1447 | 1461 | "timeline-block-markup", "tbm", 0, 0); |
| 1448 | 1462 | @ <p>In timeline displays, check-in comments can be displayed with or |
| 1449 | - @ without block markup (paragraphs, tables, etc.)</p> | |
| 1463 | + @ without block markup such as paragraphs, tables, etc. | |
| 1464 | + @ (Property: "timeline-block-markup")</p> | |
| 1450 | 1465 | |
| 1451 | 1466 | @ <hr /> |
| 1452 | 1467 | onoff_attribute("Plaintext comments on timelines", |
| 1453 | 1468 | "timeline-plaintext", "tpt", 0, 0); |
| 1454 | 1469 | @ <p>In timeline displays, check-in comments are displayed literally, |
| 1455 | - @ without any wiki or HTML interpretation. (Note: Use CSS to change | |
| 1456 | - @ display formatting features such as fonts and line-wrapping behavior.)</p> | |
| 1470 | + @ without any wiki or HTML interpretation. Use CSS to change | |
| 1471 | + @ display formatting features such as fonts and line-wrapping behavior. | |
| 1472 | + @ (Property: "timeline-plaintext")</p> | |
| 1457 | 1473 | |
| 1458 | 1474 | @ <hr /> |
| 1459 | 1475 | onoff_attribute("Truncate comment at first blank line", |
| 1460 | 1476 | "timeline-truncate-at-blank", "ttb", 0, 0); |
| 1461 | 1477 | @ <p>In timeline displays, check-in comments are displayed only through |
| 1462 | - @ the first blank line.</p> | |
| 1478 | + @ the first blank line. (Property: "timeline-truncate-at-blank")</p> | |
| 1463 | 1479 | |
| 1464 | 1480 | @ <hr /> |
| 1465 | 1481 | onoff_attribute("Use Universal Coordinated Time (UTC)", |
| 1466 | 1482 | "timeline-utc", "utc", 1, 0); |
| 1467 | 1483 | @ <p>Show times as UTC (also sometimes called Greenwich Mean Time (GMT) or |
| @@ -1478,32 +1494,35 @@ | ||
| 1478 | 1494 | sqlite3_snprintf(sizeof(zTmDiff), zTmDiff, "%.1f", -tmDiff); |
| 1479 | 1495 | @ %s(zTmDiff) hours behind UTC.</p> |
| 1480 | 1496 | }else{ |
| 1481 | 1497 | @ %s(zTmDiff) hours ahead of UTC.</p> |
| 1482 | 1498 | } |
| 1483 | - | |
| 1499 | + @ <p>(Property: "timeline-utc") | |
| 1484 | 1500 | @ <hr /> |
| 1485 | 1501 | multiple_choice_attribute("Per-Item Time Format", "timeline-date-format", |
| 1486 | 1502 | "tdf", "0", count(azTimeFormats)/2, azTimeFormats); |
| 1487 | 1503 | @ <p>If the "HH:MM" or "HH:MM:SS" format is selected, then the date is shown |
| 1488 | 1504 | @ in a separate box (using CSS class "timelineDate") whenever the date changes. |
| 1489 | 1505 | @ With the "YYYY-MM-DD HH:MM" and "YYMMDD ..." formats, the complete date |
| 1490 | - @ and time is shown on every timeline entry (using the CSS class "timelineTime").</p> | |
| 1506 | + @ and time is shown on every timeline entry using the CSS class "timelineTime". | |
| 1507 | + @ (Preperty: "timeline-date-format")</p> | |
| 1491 | 1508 | |
| 1492 | 1509 | @ <hr /> |
| 1493 | 1510 | onoff_attribute("Show version differences by default", |
| 1494 | 1511 | "show-version-diffs", "vdiff", 0, 0); |
| 1495 | 1512 | @ <p>The version-information pages linked from the timeline can either |
| 1496 | 1513 | @ show complete diffs of all file changes, or can just list the names of |
| 1497 | 1514 | @ the files that have changed. Users can get to either page by |
| 1498 | - @ clicking. This setting selects the default.</p> | |
| 1515 | + @ clicking. This setting selects the default. | |
| 1516 | + @ (Property: "show-version-diffs")</p> | |
| 1499 | 1517 | |
| 1500 | 1518 | @ <hr /> |
| 1501 | 1519 | entry_attribute("Max timeline comment length", 6, |
| 1502 | 1520 | "timeline-max-comment", "tmc", "0", 0); |
| 1503 | 1521 | @ <p>The maximum length of a comment to be displayed in a timeline. |
| 1504 | - @ "0" there is no length limit.</p> | |
| 1522 | + @ "0" there is no length limit. | |
| 1523 | + @ (Property: "timeline-max-comment")</p> | |
| 1505 | 1524 | |
| 1506 | 1525 | @ <hr /> |
| 1507 | 1526 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1508 | 1527 | @ </div></form> |
| 1509 | 1528 | db_end_transaction(0); |
| @@ -1609,33 +1628,38 @@ | ||
| 1609 | 1628 | |
| 1610 | 1629 | style_header("WWW Configuration"); |
| 1611 | 1630 | db_begin_transaction(); |
| 1612 | 1631 | @ <form action="%s(g.zTop)/setup_config" method="post"><div> |
| 1613 | 1632 | login_insert_csrf_secret(); |
| 1633 | + @ <input type="submit" name="submit" value="Apply Changes" /></p> | |
| 1614 | 1634 | @ <hr /> |
| 1615 | 1635 | entry_attribute("Project Name", 60, "project-name", "pn", "", 0); |
| 1616 | - @ <p>Give your project a name so visitors know what this site is about. | |
| 1636 | + @ <p>A brief project name so visitors know what this site is about. | |
| 1617 | 1637 | @ The project name will also be used as the RSS feed title. |
| 1638 | + @ (Property: "project-name") | |
| 1618 | 1639 | @ </p> |
| 1619 | 1640 | @ <hr /> |
| 1620 | 1641 | textarea_attribute("Project Description", 3, 80, |
| 1621 | 1642 | "project-description", "pd", "", 0); |
| 1622 | 1643 | @ <p>Describe your project. This will be used in page headers for search |
| 1623 | - @ engines as well as a short RSS description.</p> | |
| 1644 | + @ engines as well as a short RSS description. | |
| 1645 | + @ (Property: "project-description")</p> | |
| 1624 | 1646 | @ <hr /> |
| 1625 | 1647 | entry_attribute("Tarball and ZIP-archive Prefix", 20, "short-project-name", "spn", "", 0); |
| 1626 | 1648 | @ <p>This is used as a prefix on the names of generated tarballs and ZIP archive. |
| 1627 | 1649 | @ For best results, keep this prefix brief and avoid special characters such |
| 1628 | 1650 | @ as "/" and "\". |
| 1629 | 1651 | @ If no tarball prefix is specified, then the full Project Name above is used. |
| 1652 | + @ (Property: "short-project-name") | |
| 1630 | 1653 | @ </p> |
| 1631 | 1654 | @ <hr /> |
| 1632 | 1655 | onoff_attribute("Enable WYSIWYG Wiki Editing", |
| 1633 | 1656 | "wysiwyg-wiki", "wysiwyg-wiki", 0, 0); |
| 1634 | 1657 | @ <p>Enable what-you-see-is-what-you-get (WYSIWYG) editing of wiki pages. |
| 1635 | 1658 | @ The WYSIWYG editor generates HTML instead of markup, which makes |
| 1636 | - @ subsequent manual editing more difficult.</p> | |
| 1659 | + @ subsequent manual editing more difficult. | |
| 1660 | + @ (Property: "wysiwyg-wiki")</p> | |
| 1637 | 1661 | @ <hr /> |
| 1638 | 1662 | entry_attribute("Index Page", 60, "index-page", "idxpg", "/home", 0); |
| 1639 | 1663 | @ <p>Enter the pathname of the page to display when the "Home" menu |
| 1640 | 1664 | @ option is selected and when no pathname is |
| 1641 | 1665 | @ specified in the URL. For example, if you visit the url:</p> |
| @@ -1653,10 +1677,11 @@ | ||
| 1653 | 1677 | @ |
| 1654 | 1678 | @ <p>Note: To avoid a redirect loop or other problems, this entry must |
| 1655 | 1679 | @ begin with "/" and it must specify a valid page. For example, |
| 1656 | 1680 | @ "<b>/home</b>" will work but "<b>home</b>" will not, since it omits the |
| 1657 | 1681 | @ leading "/".</p> |
| 1682 | + @ <p>(Property: "index-page") | |
| 1658 | 1683 | @ <hr /> |
| 1659 | 1684 | onoff_attribute("Use HTML as wiki markup language", |
| 1660 | 1685 | "wiki-use-html", "wiki-use-html", 0, 0); |
| 1661 | 1686 | @ <p>Use HTML as the wiki markup language. Wiki links will still be parsed |
| 1662 | 1687 | @ but all other wiki formatting will be ignored. This option is helpful |
| @@ -1667,10 +1692,11 @@ | ||
| 1667 | 1692 | @ No sanitization is done. This means that it is very possible for malicious |
| 1668 | 1693 | @ users to inject dangerous HTML, CSS and JavaScript code into your wiki.</p> |
| 1669 | 1694 | @ <p>This should <strong>only</strong> be enabled when wiki editing is limited |
| 1670 | 1695 | @ to trusted users. It should <strong>not</strong> be used on a publically |
| 1671 | 1696 | @ editable wiki.</p> |
| 1697 | + @ (Property: "wiki-use-html") | |
| 1672 | 1698 | @ <hr /> |
| 1673 | 1699 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1674 | 1700 | @ </div></form> |
| 1675 | 1701 | db_end_transaction(0); |
| 1676 | 1702 | style_footer(); |
| @@ -1699,11 +1725,11 @@ | ||
| 1699 | 1725 | @ by a ticket moderator - a user with the "q" or Mod-Tkt privilege. |
| 1700 | 1726 | @ Ticket changes enter the system and are shown locally, but are not |
| 1701 | 1727 | @ synced until they are approved. The moderator has the option to |
| 1702 | 1728 | @ delete the change rather than approve it. Ticket changes made by |
| 1703 | 1729 | @ a user who has the Mod-Tkt privilege are never subject to |
| 1704 | - @ moderation. | |
| 1730 | + @ moderation. (Property: "modreq-tkt") | |
| 1705 | 1731 | @ |
| 1706 | 1732 | @ <hr /> |
| 1707 | 1733 | onoff_attribute("Moderate wiki changes", |
| 1708 | 1734 | "modreq-wiki", "modreq-wiki", 0, 0); |
| 1709 | 1735 | @ <p>When enabled, any change to wiki is subject to the approval |
| @@ -1710,11 +1736,11 @@ | ||
| 1710 | 1736 | @ by a wiki moderator - a user with the "l" or Mod-Wiki privilege. |
| 1711 | 1737 | @ Wiki changes enter the system and are shown locally, but are not |
| 1712 | 1738 | @ synced until they are approved. The moderator has the option to |
| 1713 | 1739 | @ delete the change rather than approve it. Wiki changes made by |
| 1714 | 1740 | @ a user who has the Mod-Wiki privilege are never subject to |
| 1715 | - @ moderation. | |
| 1741 | + @ moderation. (Property: "modreq-wiki") | |
| 1716 | 1742 | @ </p> |
| 1717 | 1743 | |
| 1718 | 1744 | @ <hr /> |
| 1719 | 1745 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1720 | 1746 | @ </div></form> |
| @@ -1763,10 +1789,12 @@ | ||
| 1763 | 1789 | @ <b>Ad-Unit Notes:</b><ul> |
| 1764 | 1790 | @ <li>Leave both Ad-Units blank to disable all advertising. |
| 1765 | 1791 | @ <li>The "Banner Ad-Unit" is used for wide pages. |
| 1766 | 1792 | @ <li>The "Right-Column Ad-Unit" is used on pages with tall, narrow content. |
| 1767 | 1793 | @ <li>If the "Right-Column Ad-Unit" is blank, the "Banner Ad-Unit" is used on all pages. |
| 1794 | + @ <li>Properties: "adunit", "adunit-right", "adunit-omit-if-admin", and | |
| 1795 | + @ "adunit-omit-if-user". | |
| 1768 | 1796 | @ <li>Suggested <a href="setup_skinedit?w=0">CSS</a> changes: |
| 1769 | 1797 | @ <blockquote><pre> |
| 1770 | 1798 | @ div.adunit_banner { |
| 1771 | 1799 | @ margin: auto; |
| 1772 | 1800 | @ width: 100%%; |
| @@ -1888,10 +1916,11 @@ | ||
| 1888 | 1916 | @ Logo Image file: |
| 1889 | 1917 | @ <input type="file" name="logoim" size="60" accept="image/*" /> |
| 1890 | 1918 | @ <p align="center"> |
| 1891 | 1919 | @ <input type="submit" name="setlogo" value="Change Logo" /> |
| 1892 | 1920 | @ <input type="submit" name="clrlogo" value="Revert To Default" /></p> |
| 1921 | + @ <p>(Properties: "logo-image" and "logo-mimetype") | |
| 1893 | 1922 | @ </div></form> |
| 1894 | 1923 | @ <hr /> |
| 1895 | 1924 | @ |
| 1896 | 1925 | @ <p>The current background image has a MIME-Type of <b>%h(zBgMime)</b> |
| 1897 | 1926 | @ and looks like this:</p> |
| @@ -1911,10 +1940,11 @@ | ||
| 1911 | 1940 | @ <input type="file" name="bgim" size="60" accept="image/*" /> |
| 1912 | 1941 | @ <p align="center"> |
| 1913 | 1942 | @ <input type="submit" name="setbg" value="Change Background" /> |
| 1914 | 1943 | @ <input type="submit" name="clrbg" value="Revert To Default" /></p> |
| 1915 | 1944 | @ </div></form> |
| 1945 | + @ <p>(Properties: "background-image" and "background-mimetype") | |
| 1916 | 1946 | @ <hr /> |
| 1917 | 1947 | @ |
| 1918 | 1948 | @ <p><span class="note">Note:</span> Your browser has probably cached these |
| 1919 | 1949 | @ images, so you may need to press the Reload button before changes will |
| 1920 | 1950 | @ take effect. </p> |
| @@ -1965,10 +1995,11 @@ | ||
| 1965 | 1995 | style_header("Raw SQL Commands"); |
| 1966 | 1996 | @ <p><b>Caution:</b> There are no restrictions on the SQL that can be |
| 1967 | 1997 | @ run by this page. You can do serious and irrepairable damage to the |
| 1968 | 1998 | @ repository. Proceed with extreme caution.</p> |
| 1969 | 1999 | @ |
| 2000 | +#if 0 | |
| 1970 | 2001 | @ <p>Only the first statement in the entry box will be run. |
| 1971 | 2002 | @ Any subsequent statements will be silently ignored.</p> |
| 1972 | 2003 | @ |
| 1973 | 2004 | @ <p>Database names:<ul><li>repository |
| 1974 | 2005 | if( g.zConfigDbName ){ |
| @@ -1976,22 +2007,37 @@ | ||
| 1976 | 2007 | } |
| 1977 | 2008 | if( g.localOpen ){ |
| 1978 | 2009 | @ <li>localdb |
| 1979 | 2010 | } |
| 1980 | 2011 | @ </ul></p> |
| 2012 | +#endif | |
| 2013 | + | |
| 2014 | + if( P("configtab") ){ | |
| 2015 | + /* If the user presses the "CONFIG Table Query" button, populate the | |
| 2016 | + ** query text with a pre-packaged query against the CONFIG table */ | |
| 2017 | + zQ = "SELECT\n" | |
| 2018 | + " CASE WHEN length(name)<50 THEN name ELSE printf('%.50s...',name) END AS name,\n" | |
| 2019 | + " CASE WHEN typeof(value)<>'blob' AND length(value)<80 THEN value\n" | |
| 2020 | + " ELSE '...' END AS value,\n" | |
| 2021 | + " datetime(mtime, 'unixepoch') AS mtime\n" | |
| 2022 | + "FROM config\n" | |
| 2023 | + "-- ORDER BY mtime DESC; -- optional"; | |
| 2024 | + go = 1; | |
| 2025 | + } | |
| 1981 | 2026 | @ |
| 1982 | 2027 | @ <form method="post" action="%s(g.zTop)/admin_sql"> |
| 1983 | 2028 | login_insert_csrf_secret(); |
| 1984 | 2029 | @ SQL:<br /> |
| 1985 | - @ <textarea name="q" rows="5" cols="80">%h(zQ)</textarea><br /> | |
| 2030 | + @ <textarea name="q" rows="8" cols="80">%h(zQ)</textarea><br /> | |
| 1986 | 2031 | @ <input type="submit" name="go" value="Run SQL"> |
| 1987 | 2032 | @ <input type="submit" name="schema" value="Show Schema"> |
| 1988 | 2033 | @ <input type="submit" name="tablelist" value="List Tables"> |
| 2034 | + @ <input type="submit" name="configtab" value="CONFIG Table Query"> | |
| 1989 | 2035 | @ </form> |
| 1990 | 2036 | if( P("schema") ){ |
| 1991 | 2037 | zQ = sqlite3_mprintf( |
| 1992 | - "SELECT sql FROM repository.sqlite_master WHERE sql IS NOT NULL"); | |
| 2038 | + "SELECT sql FROM repository.sqlite_master WHERE sql IS NOT NULL ORDER BY name"); | |
| 1993 | 2039 | go = 1; |
| 1994 | 2040 | }else if( P("tablelist") ){ |
| 1995 | 2041 | zQ = sqlite3_mprintf( |
| 1996 | 2042 | "SELECT name FROM repository.sqlite_master WHERE type='table'" |
| 1997 | 2043 | " ORDER BY name"); |
| 1998 | 2044 |
| --- src/setup.c | |
| +++ src/setup.c | |
| @@ -1106,18 +1106,20 @@ | |
| 1106 | |
| 1107 | style_header("Access Control Settings"); |
| 1108 | db_begin_transaction(); |
| 1109 | @ <form action="%s(g.zTop)/setup_access" method="post"><div> |
| 1110 | login_insert_csrf_secret(); |
| 1111 | @ <hr /> |
| 1112 | onoff_attribute("Redirect to HTTPS on the Login page", |
| 1113 | "redirect-to-https", "redirhttps", 0, 0); |
| 1114 | @ <p>When selected, force the use of HTTPS for the Login page. |
| 1115 | @ <p>Details: When enabled, this option causes the $secureurl TH1 |
| 1116 | @ variable is set to an "https:" variant of $baseurl. Otherwise, |
| 1117 | @ $secureurl is just an alias for $baseurl. Also when enabled, the |
| 1118 | @ Login page redirects to https if accessed via http. |
| 1119 | @ <hr /> |
| 1120 | onoff_attribute("Require password for local access", |
| 1121 | "localauth", "localauth", 0, 0); |
| 1122 | @ <p>When enabled, the password sign-in is always required for |
| 1123 | @ web access. When disabled, unrestricted web access from 127.0.0.1 |
| @@ -1138,67 +1140,74 @@ | |
| 1138 | @ <a href="%R/help/server">fossil http</a> commands |
| 1139 | @ without the "--localauth" option. |
| 1140 | @ <li> The server is started from CGI without the "localauth" keyword |
| 1141 | @ in the CGI script. |
| 1142 | @ </ol> |
| 1143 | @ |
| 1144 | @ <hr /> |
| 1145 | onoff_attribute("Enable /test_env", |
| 1146 | "test_env_enable", "test_env_enable", 0, 0); |
| 1147 | @ <p>When enabled, the %h(g.zBaseURL)/test_env URL is available to all |
| 1148 | @ users. When disabled (the default) only users Admin and Setup can visit |
| 1149 | @ the /test_env page. |
| 1150 | @ </p> |
| 1151 | @ |
| 1152 | @ <hr /> |
| 1153 | onoff_attribute("Allow REMOTE_USER authentication", |
| 1154 | "remote_user_ok", "remote_user_ok", 0, 0); |
| 1155 | @ <p>When enabled, if the REMOTE_USER environment variable is set to the |
| 1156 | @ login name of a valid user and no other login credentials are available, |
| 1157 | @ then the REMOTE_USER is accepted as an authenticated user. |
| 1158 | @ </p> |
| 1159 | @ |
| 1160 | @ <hr /> |
| 1161 | onoff_attribute("Allow HTTP_AUTHENTICATION authentication", |
| 1162 | "http_authentication_ok", "http_authentication_ok", 0, 0); |
| 1163 | @ <p>When enabled, allow the use of the HTTP_AUTHENTICATION environment |
| 1164 | @ variable or the "Authentication:" HTTP header to find the username and |
| 1165 | @ password. This is another way of supporting Basic Authenitication. |
| 1166 | @ </p> |
| 1167 | @ |
| 1168 | @ <hr /> |
| 1169 | entry_attribute("IP address terms used in login cookie", 3, |
| 1170 | "ip-prefix-terms", "ipt", "2", 0); |
| 1171 | @ <p>The number of octets of of the IP address used in the login cookie. |
| 1172 | @ Set to zero to omit the IP address from the login cookie. A value of |
| 1173 | @ 2 is recommended. |
| 1174 | @ </p> |
| 1175 | @ |
| 1176 | @ <hr /> |
| 1177 | entry_attribute("Login expiration time", 6, "cookie-expire", "cex", |
| 1178 | "8766", 0); |
| 1179 | @ <p>The number of hours for which a login is valid. This must be a |
| 1180 | @ positive number. The default is 8766 hours which is approximately equal |
| 1181 | @ to a year.</p> |
| 1182 | |
| 1183 | @ <hr /> |
| 1184 | entry_attribute("Download packet limit", 10, "max-download", "mxdwn", |
| 1185 | "5000000", 0); |
| 1186 | @ <p>Fossil tries to limit out-bound sync, clone, and pull packets |
| 1187 | @ to this many bytes, uncompressed. If the client requires more data |
| 1188 | @ than this, then the client will issue multiple HTTP requests. |
| 1189 | @ Values below 1 million are not recommended. 5 million is a |
| 1190 | @ reasonable number.</p> |
| 1191 | |
| 1192 | @ <hr /> |
| 1193 | entry_attribute("Download time limit", 11, "max-download-time", "mxdwnt", |
| 1194 | "30", 0); |
| 1195 | |
| 1196 | @ <p>Fossil tries to spend less than this many seconds gathering |
| 1197 | @ the out-bound data of sync, clone, and pull packets. |
| 1198 | @ If the client request takes longer, a partial reply is given similar |
| 1199 | @ to the download packet limit. 30s is a reasonable default.</p> |
| 1200 | |
| 1201 | @ <hr /> |
| 1202 | entry_attribute("Server Load Average Limit", 11, "max-loadavg", "mxldavg", |
| 1203 | "0.0", 0); |
| 1204 | @ <p>Some expensive operations (such as computing tarballs, zip archives, |
| @@ -1205,11 +1214,12 @@ | |
| 1205 | @ or annotation/blame pages) are prohibited if the load average on the host |
| 1206 | @ computer is too large. Set the threshold for disallowing expensive |
| 1207 | @ computations here. Set this to 0.0 to disable the load average limit. |
| 1208 | @ This limit is only enforced on Unix servers. On Linux systems, |
| 1209 | @ access to the /proc virtual filesystem is required, which means this limit |
| 1210 | @ might not work inside a chroot() jail.</p> |
| 1211 | |
| 1212 | @ <hr /> |
| 1213 | onoff_attribute( |
| 1214 | "Enable hyperlinks for \"nobody\" based on User-Agent and Javascript", |
| 1215 | "auto-hyperlink", "autohyperlink", 1, 0); |
| @@ -1219,41 +1229,42 @@ | |
| 1219 | @ being and not a robot or spider and (2) the user agent is able to |
| 1220 | @ run Javascript in order to set the href= attribute of hyperlinks. Bots |
| 1221 | @ and spiders can forge a User-Agent string that makes them seem to be a |
| 1222 | @ normal browser and they can run javascript just like browsers. But most |
| 1223 | @ bots do not go to that much trouble so this is normally an effective |
| 1224 | @ defense.</p> |
| 1225 | @ |
| 1226 | @ <p>You do not normally want a bot to walk your entire repository because |
| 1227 | @ if it does, your server will end up computing diffs and annotations for |
| 1228 | @ every historical version of every file and creating ZIPs and tarballs of |
| 1229 | @ every historical check-in, which can use a lot of CPU and bandwidth |
| 1230 | @ even for relatively small projects.</p> |
| 1231 | @ |
| 1232 | @ <p>Additional parameters that control this behavior:</p> |
| 1233 | @ <blockquote> |
| 1234 | onoff_attribute("Enable hyperlinks for humans (as deduced from the UserAgent " |
| 1235 | " HTTP header string)", |
| 1236 | "auto-hyperlink-ishuman", "ahis", 0, 0); |
| 1237 | @ <br /> |
| 1238 | onoff_attribute("Require mouse movement before enabling hyperlinks", |
| 1239 | "auto-hyperlink-mouseover", "ahmo", 0, 0); |
| 1240 | @ <br /> |
| 1241 | entry_attribute("Delay before enabling hyperlinks (milliseconds)", 5, |
| 1242 | "auto-hyperlink-delay", "ah-delay", "10", 0); |
| 1243 | @ </blockquote> |
| 1244 | @ <p>Hyperlinks for user "nobody" are normally enabled as soon as the page |
| 1245 | @ finishes loading. But the first check-box below can be set to require mouse |
| 1246 | @ movement before enabling the links. One can also set a delay prior to enabling |
| 1247 | @ links by enter a positive number of milliseconds in the entry box above.</p> |
| 1248 | |
| 1249 | @ <hr /> |
| 1250 | onoff_attribute("Require a CAPTCHA if not logged in", |
| 1251 | "require-captcha", "reqcapt", 1, 0); |
| 1252 | @ <p>Require a CAPTCHA for edit operations (appending, creating, or |
| 1253 | @ editing wiki or tickets or adding attachments to wiki or tickets) |
| 1254 | @ for users who are not logged in.</p> |
| 1255 | |
| 1256 | @ <hr /> |
| 1257 | entry_attribute("Public pages", 30, "public-pages", |
| 1258 | "pubpage", "", 0); |
| 1259 | @ <p>A comma-separated list of glob patterns for pages that are accessible |
| @@ -1260,10 +1271,11 @@ | |
| 1260 | @ without needing a login and using the privileges given by the |
| 1261 | @ "Default privileges" setting below. Example use case: Set this field |
| 1262 | @ to "/doc/trunk/www/*" to give anonymous users read-only permission to the |
| 1263 | @ latest version of the embedded documentation in the www/ folder without |
| 1264 | @ allowing them to see the rest of the source code. |
| 1265 | @ </p> |
| 1266 | |
| 1267 | @ <hr /> |
| 1268 | onoff_attribute("Allow users to register themselves", |
| 1269 | "self-register", "selfregister", 0, 0); |
| @@ -1270,29 +1282,30 @@ | |
| 1270 | @ <p>Allow users to register themselves through the HTTP UI. |
| 1271 | @ The registration form always requires filling in a CAPTCHA |
| 1272 | @ (<em>auto-captcha</em> setting is ignored). Still, bear in mind that anyone |
| 1273 | @ can register under any user name. This option is useful for public projects |
| 1274 | @ where you do not want everyone in any ticket discussion to be named |
| 1275 | @ "Anonymous".</p> |
| 1276 | |
| 1277 | @ <hr /> |
| 1278 | entry_attribute("Default privileges", 10, "default-perms", |
| 1279 | "defaultperms", "u", 0); |
| 1280 | @ <p>Permissions given to users that... <ul><li>register themselves using |
| 1281 | @ the self-registration procedure (if enabled), or <li>access "public" |
| 1282 | @ pages identified by the public-pages glob pattern above, or <li> |
| 1283 | @ are users newly created by the administrator.</ul> |
| 1284 | @ </p> |
| 1285 | |
| 1286 | @ <hr /> |
| 1287 | onoff_attribute("Show javascript button to fill in CAPTCHA", |
| 1288 | "auto-captcha", "autocaptcha", 0, 0); |
| 1289 | @ <p>When enabled, a button appears on the login screen for user |
| 1290 | @ "anonymous" that will automatically fill in the CAPTCHA password. |
| 1291 | @ This is less secure than forcing the user to do it manually, but is |
| 1292 | @ probably secure enough and it is certainly more convenient for |
| 1293 | @ anonymous users.</p> |
| 1294 | |
| 1295 | @ <hr /> |
| 1296 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1297 | @ </div></form> |
| 1298 | db_end_transaction(0); |
| @@ -1440,28 +1453,31 @@ | |
| 1440 | style_header("Timeline Display Preferences"); |
| 1441 | db_begin_transaction(); |
| 1442 | @ <form action="%s(g.zTop)/setup_timeline" method="post"><div> |
| 1443 | login_insert_csrf_secret(); |
| 1444 | |
| 1445 | @ <hr /> |
| 1446 | onoff_attribute("Allow block-markup in timeline", |
| 1447 | "timeline-block-markup", "tbm", 0, 0); |
| 1448 | @ <p>In timeline displays, check-in comments can be displayed with or |
| 1449 | @ without block markup (paragraphs, tables, etc.)</p> |
| 1450 | |
| 1451 | @ <hr /> |
| 1452 | onoff_attribute("Plaintext comments on timelines", |
| 1453 | "timeline-plaintext", "tpt", 0, 0); |
| 1454 | @ <p>In timeline displays, check-in comments are displayed literally, |
| 1455 | @ without any wiki or HTML interpretation. (Note: Use CSS to change |
| 1456 | @ display formatting features such as fonts and line-wrapping behavior.)</p> |
| 1457 | |
| 1458 | @ <hr /> |
| 1459 | onoff_attribute("Truncate comment at first blank line", |
| 1460 | "timeline-truncate-at-blank", "ttb", 0, 0); |
| 1461 | @ <p>In timeline displays, check-in comments are displayed only through |
| 1462 | @ the first blank line.</p> |
| 1463 | |
| 1464 | @ <hr /> |
| 1465 | onoff_attribute("Use Universal Coordinated Time (UTC)", |
| 1466 | "timeline-utc", "utc", 1, 0); |
| 1467 | @ <p>Show times as UTC (also sometimes called Greenwich Mean Time (GMT) or |
| @@ -1478,32 +1494,35 @@ | |
| 1478 | sqlite3_snprintf(sizeof(zTmDiff), zTmDiff, "%.1f", -tmDiff); |
| 1479 | @ %s(zTmDiff) hours behind UTC.</p> |
| 1480 | }else{ |
| 1481 | @ %s(zTmDiff) hours ahead of UTC.</p> |
| 1482 | } |
| 1483 | |
| 1484 | @ <hr /> |
| 1485 | multiple_choice_attribute("Per-Item Time Format", "timeline-date-format", |
| 1486 | "tdf", "0", count(azTimeFormats)/2, azTimeFormats); |
| 1487 | @ <p>If the "HH:MM" or "HH:MM:SS" format is selected, then the date is shown |
| 1488 | @ in a separate box (using CSS class "timelineDate") whenever the date changes. |
| 1489 | @ With the "YYYY-MM-DD HH:MM" and "YYMMDD ..." formats, the complete date |
| 1490 | @ and time is shown on every timeline entry (using the CSS class "timelineTime").</p> |
| 1491 | |
| 1492 | @ <hr /> |
| 1493 | onoff_attribute("Show version differences by default", |
| 1494 | "show-version-diffs", "vdiff", 0, 0); |
| 1495 | @ <p>The version-information pages linked from the timeline can either |
| 1496 | @ show complete diffs of all file changes, or can just list the names of |
| 1497 | @ the files that have changed. Users can get to either page by |
| 1498 | @ clicking. This setting selects the default.</p> |
| 1499 | |
| 1500 | @ <hr /> |
| 1501 | entry_attribute("Max timeline comment length", 6, |
| 1502 | "timeline-max-comment", "tmc", "0", 0); |
| 1503 | @ <p>The maximum length of a comment to be displayed in a timeline. |
| 1504 | @ "0" there is no length limit.</p> |
| 1505 | |
| 1506 | @ <hr /> |
| 1507 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1508 | @ </div></form> |
| 1509 | db_end_transaction(0); |
| @@ -1609,33 +1628,38 @@ | |
| 1609 | |
| 1610 | style_header("WWW Configuration"); |
| 1611 | db_begin_transaction(); |
| 1612 | @ <form action="%s(g.zTop)/setup_config" method="post"><div> |
| 1613 | login_insert_csrf_secret(); |
| 1614 | @ <hr /> |
| 1615 | entry_attribute("Project Name", 60, "project-name", "pn", "", 0); |
| 1616 | @ <p>Give your project a name so visitors know what this site is about. |
| 1617 | @ The project name will also be used as the RSS feed title. |
| 1618 | @ </p> |
| 1619 | @ <hr /> |
| 1620 | textarea_attribute("Project Description", 3, 80, |
| 1621 | "project-description", "pd", "", 0); |
| 1622 | @ <p>Describe your project. This will be used in page headers for search |
| 1623 | @ engines as well as a short RSS description.</p> |
| 1624 | @ <hr /> |
| 1625 | entry_attribute("Tarball and ZIP-archive Prefix", 20, "short-project-name", "spn", "", 0); |
| 1626 | @ <p>This is used as a prefix on the names of generated tarballs and ZIP archive. |
| 1627 | @ For best results, keep this prefix brief and avoid special characters such |
| 1628 | @ as "/" and "\". |
| 1629 | @ If no tarball prefix is specified, then the full Project Name above is used. |
| 1630 | @ </p> |
| 1631 | @ <hr /> |
| 1632 | onoff_attribute("Enable WYSIWYG Wiki Editing", |
| 1633 | "wysiwyg-wiki", "wysiwyg-wiki", 0, 0); |
| 1634 | @ <p>Enable what-you-see-is-what-you-get (WYSIWYG) editing of wiki pages. |
| 1635 | @ The WYSIWYG editor generates HTML instead of markup, which makes |
| 1636 | @ subsequent manual editing more difficult.</p> |
| 1637 | @ <hr /> |
| 1638 | entry_attribute("Index Page", 60, "index-page", "idxpg", "/home", 0); |
| 1639 | @ <p>Enter the pathname of the page to display when the "Home" menu |
| 1640 | @ option is selected and when no pathname is |
| 1641 | @ specified in the URL. For example, if you visit the url:</p> |
| @@ -1653,10 +1677,11 @@ | |
| 1653 | @ |
| 1654 | @ <p>Note: To avoid a redirect loop or other problems, this entry must |
| 1655 | @ begin with "/" and it must specify a valid page. For example, |
| 1656 | @ "<b>/home</b>" will work but "<b>home</b>" will not, since it omits the |
| 1657 | @ leading "/".</p> |
| 1658 | @ <hr /> |
| 1659 | onoff_attribute("Use HTML as wiki markup language", |
| 1660 | "wiki-use-html", "wiki-use-html", 0, 0); |
| 1661 | @ <p>Use HTML as the wiki markup language. Wiki links will still be parsed |
| 1662 | @ but all other wiki formatting will be ignored. This option is helpful |
| @@ -1667,10 +1692,11 @@ | |
| 1667 | @ No sanitization is done. This means that it is very possible for malicious |
| 1668 | @ users to inject dangerous HTML, CSS and JavaScript code into your wiki.</p> |
| 1669 | @ <p>This should <strong>only</strong> be enabled when wiki editing is limited |
| 1670 | @ to trusted users. It should <strong>not</strong> be used on a publically |
| 1671 | @ editable wiki.</p> |
| 1672 | @ <hr /> |
| 1673 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1674 | @ </div></form> |
| 1675 | db_end_transaction(0); |
| 1676 | style_footer(); |
| @@ -1699,11 +1725,11 @@ | |
| 1699 | @ by a ticket moderator - a user with the "q" or Mod-Tkt privilege. |
| 1700 | @ Ticket changes enter the system and are shown locally, but are not |
| 1701 | @ synced until they are approved. The moderator has the option to |
| 1702 | @ delete the change rather than approve it. Ticket changes made by |
| 1703 | @ a user who has the Mod-Tkt privilege are never subject to |
| 1704 | @ moderation. |
| 1705 | @ |
| 1706 | @ <hr /> |
| 1707 | onoff_attribute("Moderate wiki changes", |
| 1708 | "modreq-wiki", "modreq-wiki", 0, 0); |
| 1709 | @ <p>When enabled, any change to wiki is subject to the approval |
| @@ -1710,11 +1736,11 @@ | |
| 1710 | @ by a wiki moderator - a user with the "l" or Mod-Wiki privilege. |
| 1711 | @ Wiki changes enter the system and are shown locally, but are not |
| 1712 | @ synced until they are approved. The moderator has the option to |
| 1713 | @ delete the change rather than approve it. Wiki changes made by |
| 1714 | @ a user who has the Mod-Wiki privilege are never subject to |
| 1715 | @ moderation. |
| 1716 | @ </p> |
| 1717 | |
| 1718 | @ <hr /> |
| 1719 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1720 | @ </div></form> |
| @@ -1763,10 +1789,12 @@ | |
| 1763 | @ <b>Ad-Unit Notes:</b><ul> |
| 1764 | @ <li>Leave both Ad-Units blank to disable all advertising. |
| 1765 | @ <li>The "Banner Ad-Unit" is used for wide pages. |
| 1766 | @ <li>The "Right-Column Ad-Unit" is used on pages with tall, narrow content. |
| 1767 | @ <li>If the "Right-Column Ad-Unit" is blank, the "Banner Ad-Unit" is used on all pages. |
| 1768 | @ <li>Suggested <a href="setup_skinedit?w=0">CSS</a> changes: |
| 1769 | @ <blockquote><pre> |
| 1770 | @ div.adunit_banner { |
| 1771 | @ margin: auto; |
| 1772 | @ width: 100%%; |
| @@ -1888,10 +1916,11 @@ | |
| 1888 | @ Logo Image file: |
| 1889 | @ <input type="file" name="logoim" size="60" accept="image/*" /> |
| 1890 | @ <p align="center"> |
| 1891 | @ <input type="submit" name="setlogo" value="Change Logo" /> |
| 1892 | @ <input type="submit" name="clrlogo" value="Revert To Default" /></p> |
| 1893 | @ </div></form> |
| 1894 | @ <hr /> |
| 1895 | @ |
| 1896 | @ <p>The current background image has a MIME-Type of <b>%h(zBgMime)</b> |
| 1897 | @ and looks like this:</p> |
| @@ -1911,10 +1940,11 @@ | |
| 1911 | @ <input type="file" name="bgim" size="60" accept="image/*" /> |
| 1912 | @ <p align="center"> |
| 1913 | @ <input type="submit" name="setbg" value="Change Background" /> |
| 1914 | @ <input type="submit" name="clrbg" value="Revert To Default" /></p> |
| 1915 | @ </div></form> |
| 1916 | @ <hr /> |
| 1917 | @ |
| 1918 | @ <p><span class="note">Note:</span> Your browser has probably cached these |
| 1919 | @ images, so you may need to press the Reload button before changes will |
| 1920 | @ take effect. </p> |
| @@ -1965,10 +1995,11 @@ | |
| 1965 | style_header("Raw SQL Commands"); |
| 1966 | @ <p><b>Caution:</b> There are no restrictions on the SQL that can be |
| 1967 | @ run by this page. You can do serious and irrepairable damage to the |
| 1968 | @ repository. Proceed with extreme caution.</p> |
| 1969 | @ |
| 1970 | @ <p>Only the first statement in the entry box will be run. |
| 1971 | @ Any subsequent statements will be silently ignored.</p> |
| 1972 | @ |
| 1973 | @ <p>Database names:<ul><li>repository |
| 1974 | if( g.zConfigDbName ){ |
| @@ -1976,22 +2007,37 @@ | |
| 1976 | } |
| 1977 | if( g.localOpen ){ |
| 1978 | @ <li>localdb |
| 1979 | } |
| 1980 | @ </ul></p> |
| 1981 | @ |
| 1982 | @ <form method="post" action="%s(g.zTop)/admin_sql"> |
| 1983 | login_insert_csrf_secret(); |
| 1984 | @ SQL:<br /> |
| 1985 | @ <textarea name="q" rows="5" cols="80">%h(zQ)</textarea><br /> |
| 1986 | @ <input type="submit" name="go" value="Run SQL"> |
| 1987 | @ <input type="submit" name="schema" value="Show Schema"> |
| 1988 | @ <input type="submit" name="tablelist" value="List Tables"> |
| 1989 | @ </form> |
| 1990 | if( P("schema") ){ |
| 1991 | zQ = sqlite3_mprintf( |
| 1992 | "SELECT sql FROM repository.sqlite_master WHERE sql IS NOT NULL"); |
| 1993 | go = 1; |
| 1994 | }else if( P("tablelist") ){ |
| 1995 | zQ = sqlite3_mprintf( |
| 1996 | "SELECT name FROM repository.sqlite_master WHERE type='table'" |
| 1997 | " ORDER BY name"); |
| 1998 |
| --- src/setup.c | |
| +++ src/setup.c | |
| @@ -1106,18 +1106,20 @@ | |
| 1106 | |
| 1107 | style_header("Access Control Settings"); |
| 1108 | db_begin_transaction(); |
| 1109 | @ <form action="%s(g.zTop)/setup_access" method="post"><div> |
| 1110 | login_insert_csrf_secret(); |
| 1111 | @ <input type="submit" name="submit" value="Apply Changes" /></p> |
| 1112 | @ <hr /> |
| 1113 | onoff_attribute("Redirect to HTTPS on the Login page", |
| 1114 | "redirect-to-https", "redirhttps", 0, 0); |
| 1115 | @ <p>When selected, force the use of HTTPS for the Login page. |
| 1116 | @ <p>Details: When enabled, this option causes the $secureurl TH1 |
| 1117 | @ variable is set to an "https:" variant of $baseurl. Otherwise, |
| 1118 | @ $secureurl is just an alias for $baseurl. Also when enabled, the |
| 1119 | @ Login page redirects to https if accessed via http. |
| 1120 | @ (Property: "redirhttps") |
| 1121 | @ <hr /> |
| 1122 | onoff_attribute("Require password for local access", |
| 1123 | "localauth", "localauth", 0, 0); |
| 1124 | @ <p>When enabled, the password sign-in is always required for |
| 1125 | @ web access. When disabled, unrestricted web access from 127.0.0.1 |
| @@ -1138,67 +1140,74 @@ | |
| 1140 | @ <a href="%R/help/server">fossil http</a> commands |
| 1141 | @ without the "--localauth" option. |
| 1142 | @ <li> The server is started from CGI without the "localauth" keyword |
| 1143 | @ in the CGI script. |
| 1144 | @ </ol> |
| 1145 | @ (Property: "localauth") |
| 1146 | @ |
| 1147 | @ <hr /> |
| 1148 | onoff_attribute("Enable /test_env", |
| 1149 | "test_env_enable", "test_env_enable", 0, 0); |
| 1150 | @ <p>When enabled, the %h(g.zBaseURL)/test_env URL is available to all |
| 1151 | @ users. When disabled (the default) only users Admin and Setup can visit |
| 1152 | @ the /test_env page. |
| 1153 | @ (Property: "test_env_enable") |
| 1154 | @ </p> |
| 1155 | @ |
| 1156 | @ <hr /> |
| 1157 | onoff_attribute("Allow REMOTE_USER authentication", |
| 1158 | "remote_user_ok", "remote_user_ok", 0, 0); |
| 1159 | @ <p>When enabled, if the REMOTE_USER environment variable is set to the |
| 1160 | @ login name of a valid user and no other login credentials are available, |
| 1161 | @ then the REMOTE_USER is accepted as an authenticated user. |
| 1162 | @ (Property: "remote_user_ok") |
| 1163 | @ </p> |
| 1164 | @ |
| 1165 | @ <hr /> |
| 1166 | onoff_attribute("Allow HTTP_AUTHENTICATION authentication", |
| 1167 | "http_authentication_ok", "http_authentication_ok", 0, 0); |
| 1168 | @ <p>When enabled, allow the use of the HTTP_AUTHENTICATION environment |
| 1169 | @ variable or the "Authentication:" HTTP header to find the username and |
| 1170 | @ password. This is another way of supporting Basic Authenitication. |
| 1171 | @ (Property: "http_authentication_ok") |
| 1172 | @ </p> |
| 1173 | @ |
| 1174 | @ <hr /> |
| 1175 | entry_attribute("IP address terms used in login cookie", 3, |
| 1176 | "ip-prefix-terms", "ipt", "2", 0); |
| 1177 | @ <p>The number of octets of of the IP address used in the login cookie. |
| 1178 | @ Set to zero to omit the IP address from the login cookie. A value of |
| 1179 | @ 2 is recommended. |
| 1180 | @ (Property: "ip-prefix-terms") |
| 1181 | @ </p> |
| 1182 | @ |
| 1183 | @ <hr /> |
| 1184 | entry_attribute("Login expiration time", 6, "cookie-expire", "cex", |
| 1185 | "8766", 0); |
| 1186 | @ <p>The number of hours for which a login is valid. This must be a |
| 1187 | @ positive number. The default is 8766 hours which is approximately equal |
| 1188 | @ to a year. |
| 1189 | @ (Property: "cookie-expire")</p> |
| 1190 | |
| 1191 | @ <hr /> |
| 1192 | entry_attribute("Download packet limit", 10, "max-download", "mxdwn", |
| 1193 | "5000000", 0); |
| 1194 | @ <p>Fossil tries to limit out-bound sync, clone, and pull packets |
| 1195 | @ to this many bytes, uncompressed. If the client requires more data |
| 1196 | @ than this, then the client will issue multiple HTTP requests. |
| 1197 | @ Values below 1 million are not recommended. 5 million is a |
| 1198 | @ reasonable number. (Property: "max-download")</p> |
| 1199 | |
| 1200 | @ <hr /> |
| 1201 | entry_attribute("Download time limit", 11, "max-download-time", "mxdwnt", |
| 1202 | "30", 0); |
| 1203 | |
| 1204 | @ <p>Fossil tries to spend less than this many seconds gathering |
| 1205 | @ the out-bound data of sync, clone, and pull packets. |
| 1206 | @ If the client request takes longer, a partial reply is given similar |
| 1207 | @ to the download packet limit. 30s is a reasonable default. |
| 1208 | @ (Property: "max-download-time")</p> |
| 1209 | |
| 1210 | @ <hr /> |
| 1211 | entry_attribute("Server Load Average Limit", 11, "max-loadavg", "mxldavg", |
| 1212 | "0.0", 0); |
| 1213 | @ <p>Some expensive operations (such as computing tarballs, zip archives, |
| @@ -1205,11 +1214,12 @@ | |
| 1214 | @ or annotation/blame pages) are prohibited if the load average on the host |
| 1215 | @ computer is too large. Set the threshold for disallowing expensive |
| 1216 | @ computations here. Set this to 0.0 to disable the load average limit. |
| 1217 | @ This limit is only enforced on Unix servers. On Linux systems, |
| 1218 | @ access to the /proc virtual filesystem is required, which means this limit |
| 1219 | @ might not work inside a chroot() jail. |
| 1220 | @ (Property: "max-loadavg")</p> |
| 1221 | |
| 1222 | @ <hr /> |
| 1223 | onoff_attribute( |
| 1224 | "Enable hyperlinks for \"nobody\" based on User-Agent and Javascript", |
| 1225 | "auto-hyperlink", "autohyperlink", 1, 0); |
| @@ -1219,41 +1229,42 @@ | |
| 1229 | @ being and not a robot or spider and (2) the user agent is able to |
| 1230 | @ run Javascript in order to set the href= attribute of hyperlinks. Bots |
| 1231 | @ and spiders can forge a User-Agent string that makes them seem to be a |
| 1232 | @ normal browser and they can run javascript just like browsers. But most |
| 1233 | @ bots do not go to that much trouble so this is normally an effective |
| 1234 | @ defense.<p> |
| 1235 | @ |
| 1236 | @ <p>You do not normally want a bot to walk your entire repository because |
| 1237 | @ if it does, your server will end up computing diffs and annotations for |
| 1238 | @ every historical version of every file and creating ZIPs and tarballs of |
| 1239 | @ every historical check-in, which can use a lot of CPU and bandwidth |
| 1240 | @ even for relatively small projects.</p> |
| 1241 | @ |
| 1242 | @ <p>Additional parameters that control this behavior:</p> |
| 1243 | @ <blockquote> |
| 1244 | onoff_attribute("Enable hyperlinks for humans as deduced from the UserAgent " |
| 1245 | "string", "auto-hyperlink-ishuman", "ahis", 0, 0); |
| 1246 | @ <br /> |
| 1247 | onoff_attribute("Require mouse movement before enabling hyperlinks", |
| 1248 | "auto-hyperlink-mouseover", "ahmo", 0, 0); |
| 1249 | @ <br /> |
| 1250 | entry_attribute("Delay in milliseconds before enabling hyperlinks", 5, |
| 1251 | "auto-hyperlink-delay", "ah-delay", "10", 0); |
| 1252 | @ </blockquote> |
| 1253 | @ <p>Hyperlinks for user "nobody" are normally enabled as soon as the page |
| 1254 | @ finishes loading. But the first check-box below can be set to require mouse |
| 1255 | @ movement before enabling the links. One can also set a delay prior to enabling |
| 1256 | @ links by enter a positive number of milliseconds in the entry box above.</p> |
| 1257 | @ (Properties: "auto-hyperlink", "auto-hyperlink-ishuman", |
| 1258 | @ "auto-hyperlink-mouseover", and "auto-hyperlink-delay")</p> |
| 1259 | |
| 1260 | @ <hr /> |
| 1261 | onoff_attribute("Require a CAPTCHA if not logged in", |
| 1262 | "require-captcha", "reqcapt", 1, 0); |
| 1263 | @ <p>Require a CAPTCHA for edit operations (appending, creating, or |
| 1264 | @ editing wiki or tickets or adding attachments to wiki or tickets) |
| 1265 | @ for users who are not logged in. (Property: "require-captcha")</p> |
| 1266 | |
| 1267 | @ <hr /> |
| 1268 | entry_attribute("Public pages", 30, "public-pages", |
| 1269 | "pubpage", "", 0); |
| 1270 | @ <p>A comma-separated list of glob patterns for pages that are accessible |
| @@ -1260,10 +1271,11 @@ | |
| 1271 | @ without needing a login and using the privileges given by the |
| 1272 | @ "Default privileges" setting below. Example use case: Set this field |
| 1273 | @ to "/doc/trunk/www/*" to give anonymous users read-only permission to the |
| 1274 | @ latest version of the embedded documentation in the www/ folder without |
| 1275 | @ allowing them to see the rest of the source code. |
| 1276 | @ (Property: "public-pages") |
| 1277 | @ </p> |
| 1278 | |
| 1279 | @ <hr /> |
| 1280 | onoff_attribute("Allow users to register themselves", |
| 1281 | "self-register", "selfregister", 0, 0); |
| @@ -1270,29 +1282,30 @@ | |
| 1282 | @ <p>Allow users to register themselves through the HTTP UI. |
| 1283 | @ The registration form always requires filling in a CAPTCHA |
| 1284 | @ (<em>auto-captcha</em> setting is ignored). Still, bear in mind that anyone |
| 1285 | @ can register under any user name. This option is useful for public projects |
| 1286 | @ where you do not want everyone in any ticket discussion to be named |
| 1287 | @ "Anonymous". (Property: "self-register")</p> |
| 1288 | |
| 1289 | @ <hr /> |
| 1290 | entry_attribute("Default privileges", 10, "default-perms", |
| 1291 | "defaultperms", "u", 0); |
| 1292 | @ <p>Permissions given to users that... <ul><li>register themselves using |
| 1293 | @ the self-registration procedure (if enabled), or <li>access "public" |
| 1294 | @ pages identified by the public-pages glob pattern above, or <li> |
| 1295 | @ are users newly created by the administrator.</ul> |
| 1296 | @ (Property: "default-perms") |
| 1297 | @ </p> |
| 1298 | |
| 1299 | @ <hr /> |
| 1300 | onoff_attribute("Show javascript button to fill in CAPTCHA", |
| 1301 | "auto-captcha", "autocaptcha", 0, 0); |
| 1302 | @ <p>When enabled, a button appears on the login screen for user |
| 1303 | @ "anonymous" that will automatically fill in the CAPTCHA password. |
| 1304 | @ This is less secure than forcing the user to do it manually, but is |
| 1305 | @ probably secure enough and it is certainly more convenient for |
| 1306 | @ anonymous users. (Property: "auto-captcha")</p> |
| 1307 | |
| 1308 | @ <hr /> |
| 1309 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1310 | @ </div></form> |
| 1311 | db_end_transaction(0); |
| @@ -1440,28 +1453,31 @@ | |
| 1453 | style_header("Timeline Display Preferences"); |
| 1454 | db_begin_transaction(); |
| 1455 | @ <form action="%s(g.zTop)/setup_timeline" method="post"><div> |
| 1456 | login_insert_csrf_secret(); |
| 1457 | |
| 1458 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1459 | @ <hr /> |
| 1460 | onoff_attribute("Allow block-markup in timeline", |
| 1461 | "timeline-block-markup", "tbm", 0, 0); |
| 1462 | @ <p>In timeline displays, check-in comments can be displayed with or |
| 1463 | @ without block markup such as paragraphs, tables, etc. |
| 1464 | @ (Property: "timeline-block-markup")</p> |
| 1465 | |
| 1466 | @ <hr /> |
| 1467 | onoff_attribute("Plaintext comments on timelines", |
| 1468 | "timeline-plaintext", "tpt", 0, 0); |
| 1469 | @ <p>In timeline displays, check-in comments are displayed literally, |
| 1470 | @ without any wiki or HTML interpretation. Use CSS to change |
| 1471 | @ display formatting features such as fonts and line-wrapping behavior. |
| 1472 | @ (Property: "timeline-plaintext")</p> |
| 1473 | |
| 1474 | @ <hr /> |
| 1475 | onoff_attribute("Truncate comment at first blank line", |
| 1476 | "timeline-truncate-at-blank", "ttb", 0, 0); |
| 1477 | @ <p>In timeline displays, check-in comments are displayed only through |
| 1478 | @ the first blank line. (Property: "timeline-truncate-at-blank")</p> |
| 1479 | |
| 1480 | @ <hr /> |
| 1481 | onoff_attribute("Use Universal Coordinated Time (UTC)", |
| 1482 | "timeline-utc", "utc", 1, 0); |
| 1483 | @ <p>Show times as UTC (also sometimes called Greenwich Mean Time (GMT) or |
| @@ -1478,32 +1494,35 @@ | |
| 1494 | sqlite3_snprintf(sizeof(zTmDiff), zTmDiff, "%.1f", -tmDiff); |
| 1495 | @ %s(zTmDiff) hours behind UTC.</p> |
| 1496 | }else{ |
| 1497 | @ %s(zTmDiff) hours ahead of UTC.</p> |
| 1498 | } |
| 1499 | @ <p>(Property: "timeline-utc") |
| 1500 | @ <hr /> |
| 1501 | multiple_choice_attribute("Per-Item Time Format", "timeline-date-format", |
| 1502 | "tdf", "0", count(azTimeFormats)/2, azTimeFormats); |
| 1503 | @ <p>If the "HH:MM" or "HH:MM:SS" format is selected, then the date is shown |
| 1504 | @ in a separate box (using CSS class "timelineDate") whenever the date changes. |
| 1505 | @ With the "YYYY-MM-DD HH:MM" and "YYMMDD ..." formats, the complete date |
| 1506 | @ and time is shown on every timeline entry using the CSS class "timelineTime". |
| 1507 | @ (Preperty: "timeline-date-format")</p> |
| 1508 | |
| 1509 | @ <hr /> |
| 1510 | onoff_attribute("Show version differences by default", |
| 1511 | "show-version-diffs", "vdiff", 0, 0); |
| 1512 | @ <p>The version-information pages linked from the timeline can either |
| 1513 | @ show complete diffs of all file changes, or can just list the names of |
| 1514 | @ the files that have changed. Users can get to either page by |
| 1515 | @ clicking. This setting selects the default. |
| 1516 | @ (Property: "show-version-diffs")</p> |
| 1517 | |
| 1518 | @ <hr /> |
| 1519 | entry_attribute("Max timeline comment length", 6, |
| 1520 | "timeline-max-comment", "tmc", "0", 0); |
| 1521 | @ <p>The maximum length of a comment to be displayed in a timeline. |
| 1522 | @ "0" there is no length limit. |
| 1523 | @ (Property: "timeline-max-comment")</p> |
| 1524 | |
| 1525 | @ <hr /> |
| 1526 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1527 | @ </div></form> |
| 1528 | db_end_transaction(0); |
| @@ -1609,33 +1628,38 @@ | |
| 1628 | |
| 1629 | style_header("WWW Configuration"); |
| 1630 | db_begin_transaction(); |
| 1631 | @ <form action="%s(g.zTop)/setup_config" method="post"><div> |
| 1632 | login_insert_csrf_secret(); |
| 1633 | @ <input type="submit" name="submit" value="Apply Changes" /></p> |
| 1634 | @ <hr /> |
| 1635 | entry_attribute("Project Name", 60, "project-name", "pn", "", 0); |
| 1636 | @ <p>A brief project name so visitors know what this site is about. |
| 1637 | @ The project name will also be used as the RSS feed title. |
| 1638 | @ (Property: "project-name") |
| 1639 | @ </p> |
| 1640 | @ <hr /> |
| 1641 | textarea_attribute("Project Description", 3, 80, |
| 1642 | "project-description", "pd", "", 0); |
| 1643 | @ <p>Describe your project. This will be used in page headers for search |
| 1644 | @ engines as well as a short RSS description. |
| 1645 | @ (Property: "project-description")</p> |
| 1646 | @ <hr /> |
| 1647 | entry_attribute("Tarball and ZIP-archive Prefix", 20, "short-project-name", "spn", "", 0); |
| 1648 | @ <p>This is used as a prefix on the names of generated tarballs and ZIP archive. |
| 1649 | @ For best results, keep this prefix brief and avoid special characters such |
| 1650 | @ as "/" and "\". |
| 1651 | @ If no tarball prefix is specified, then the full Project Name above is used. |
| 1652 | @ (Property: "short-project-name") |
| 1653 | @ </p> |
| 1654 | @ <hr /> |
| 1655 | onoff_attribute("Enable WYSIWYG Wiki Editing", |
| 1656 | "wysiwyg-wiki", "wysiwyg-wiki", 0, 0); |
| 1657 | @ <p>Enable what-you-see-is-what-you-get (WYSIWYG) editing of wiki pages. |
| 1658 | @ The WYSIWYG editor generates HTML instead of markup, which makes |
| 1659 | @ subsequent manual editing more difficult. |
| 1660 | @ (Property: "wysiwyg-wiki")</p> |
| 1661 | @ <hr /> |
| 1662 | entry_attribute("Index Page", 60, "index-page", "idxpg", "/home", 0); |
| 1663 | @ <p>Enter the pathname of the page to display when the "Home" menu |
| 1664 | @ option is selected and when no pathname is |
| 1665 | @ specified in the URL. For example, if you visit the url:</p> |
| @@ -1653,10 +1677,11 @@ | |
| 1677 | @ |
| 1678 | @ <p>Note: To avoid a redirect loop or other problems, this entry must |
| 1679 | @ begin with "/" and it must specify a valid page. For example, |
| 1680 | @ "<b>/home</b>" will work but "<b>home</b>" will not, since it omits the |
| 1681 | @ leading "/".</p> |
| 1682 | @ <p>(Property: "index-page") |
| 1683 | @ <hr /> |
| 1684 | onoff_attribute("Use HTML as wiki markup language", |
| 1685 | "wiki-use-html", "wiki-use-html", 0, 0); |
| 1686 | @ <p>Use HTML as the wiki markup language. Wiki links will still be parsed |
| 1687 | @ but all other wiki formatting will be ignored. This option is helpful |
| @@ -1667,10 +1692,11 @@ | |
| 1692 | @ No sanitization is done. This means that it is very possible for malicious |
| 1693 | @ users to inject dangerous HTML, CSS and JavaScript code into your wiki.</p> |
| 1694 | @ <p>This should <strong>only</strong> be enabled when wiki editing is limited |
| 1695 | @ to trusted users. It should <strong>not</strong> be used on a publically |
| 1696 | @ editable wiki.</p> |
| 1697 | @ (Property: "wiki-use-html") |
| 1698 | @ <hr /> |
| 1699 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1700 | @ </div></form> |
| 1701 | db_end_transaction(0); |
| 1702 | style_footer(); |
| @@ -1699,11 +1725,11 @@ | |
| 1725 | @ by a ticket moderator - a user with the "q" or Mod-Tkt privilege. |
| 1726 | @ Ticket changes enter the system and are shown locally, but are not |
| 1727 | @ synced until they are approved. The moderator has the option to |
| 1728 | @ delete the change rather than approve it. Ticket changes made by |
| 1729 | @ a user who has the Mod-Tkt privilege are never subject to |
| 1730 | @ moderation. (Property: "modreq-tkt") |
| 1731 | @ |
| 1732 | @ <hr /> |
| 1733 | onoff_attribute("Moderate wiki changes", |
| 1734 | "modreq-wiki", "modreq-wiki", 0, 0); |
| 1735 | @ <p>When enabled, any change to wiki is subject to the approval |
| @@ -1710,11 +1736,11 @@ | |
| 1736 | @ by a wiki moderator - a user with the "l" or Mod-Wiki privilege. |
| 1737 | @ Wiki changes enter the system and are shown locally, but are not |
| 1738 | @ synced until they are approved. The moderator has the option to |
| 1739 | @ delete the change rather than approve it. Wiki changes made by |
| 1740 | @ a user who has the Mod-Wiki privilege are never subject to |
| 1741 | @ moderation. (Property: "modreq-wiki") |
| 1742 | @ </p> |
| 1743 | |
| 1744 | @ <hr /> |
| 1745 | @ <p><input type="submit" name="submit" value="Apply Changes" /></p> |
| 1746 | @ </div></form> |
| @@ -1763,10 +1789,12 @@ | |
| 1789 | @ <b>Ad-Unit Notes:</b><ul> |
| 1790 | @ <li>Leave both Ad-Units blank to disable all advertising. |
| 1791 | @ <li>The "Banner Ad-Unit" is used for wide pages. |
| 1792 | @ <li>The "Right-Column Ad-Unit" is used on pages with tall, narrow content. |
| 1793 | @ <li>If the "Right-Column Ad-Unit" is blank, the "Banner Ad-Unit" is used on all pages. |
| 1794 | @ <li>Properties: "adunit", "adunit-right", "adunit-omit-if-admin", and |
| 1795 | @ "adunit-omit-if-user". |
| 1796 | @ <li>Suggested <a href="setup_skinedit?w=0">CSS</a> changes: |
| 1797 | @ <blockquote><pre> |
| 1798 | @ div.adunit_banner { |
| 1799 | @ margin: auto; |
| 1800 | @ width: 100%%; |
| @@ -1888,10 +1916,11 @@ | |
| 1916 | @ Logo Image file: |
| 1917 | @ <input type="file" name="logoim" size="60" accept="image/*" /> |
| 1918 | @ <p align="center"> |
| 1919 | @ <input type="submit" name="setlogo" value="Change Logo" /> |
| 1920 | @ <input type="submit" name="clrlogo" value="Revert To Default" /></p> |
| 1921 | @ <p>(Properties: "logo-image" and "logo-mimetype") |
| 1922 | @ </div></form> |
| 1923 | @ <hr /> |
| 1924 | @ |
| 1925 | @ <p>The current background image has a MIME-Type of <b>%h(zBgMime)</b> |
| 1926 | @ and looks like this:</p> |
| @@ -1911,10 +1940,11 @@ | |
| 1940 | @ <input type="file" name="bgim" size="60" accept="image/*" /> |
| 1941 | @ <p align="center"> |
| 1942 | @ <input type="submit" name="setbg" value="Change Background" /> |
| 1943 | @ <input type="submit" name="clrbg" value="Revert To Default" /></p> |
| 1944 | @ </div></form> |
| 1945 | @ <p>(Properties: "background-image" and "background-mimetype") |
| 1946 | @ <hr /> |
| 1947 | @ |
| 1948 | @ <p><span class="note">Note:</span> Your browser has probably cached these |
| 1949 | @ images, so you may need to press the Reload button before changes will |
| 1950 | @ take effect. </p> |
| @@ -1965,10 +1995,11 @@ | |
| 1995 | style_header("Raw SQL Commands"); |
| 1996 | @ <p><b>Caution:</b> There are no restrictions on the SQL that can be |
| 1997 | @ run by this page. You can do serious and irrepairable damage to the |
| 1998 | @ repository. Proceed with extreme caution.</p> |
| 1999 | @ |
| 2000 | #if 0 |
| 2001 | @ <p>Only the first statement in the entry box will be run. |
| 2002 | @ Any subsequent statements will be silently ignored.</p> |
| 2003 | @ |
| 2004 | @ <p>Database names:<ul><li>repository |
| 2005 | if( g.zConfigDbName ){ |
| @@ -1976,22 +2007,37 @@ | |
| 2007 | } |
| 2008 | if( g.localOpen ){ |
| 2009 | @ <li>localdb |
| 2010 | } |
| 2011 | @ </ul></p> |
| 2012 | #endif |
| 2013 | |
| 2014 | if( P("configtab") ){ |
| 2015 | /* If the user presses the "CONFIG Table Query" button, populate the |
| 2016 | ** query text with a pre-packaged query against the CONFIG table */ |
| 2017 | zQ = "SELECT\n" |
| 2018 | " CASE WHEN length(name)<50 THEN name ELSE printf('%.50s...',name) END AS name,\n" |
| 2019 | " CASE WHEN typeof(value)<>'blob' AND length(value)<80 THEN value\n" |
| 2020 | " ELSE '...' END AS value,\n" |
| 2021 | " datetime(mtime, 'unixepoch') AS mtime\n" |
| 2022 | "FROM config\n" |
| 2023 | "-- ORDER BY mtime DESC; -- optional"; |
| 2024 | go = 1; |
| 2025 | } |
| 2026 | @ |
| 2027 | @ <form method="post" action="%s(g.zTop)/admin_sql"> |
| 2028 | login_insert_csrf_secret(); |
| 2029 | @ SQL:<br /> |
| 2030 | @ <textarea name="q" rows="8" cols="80">%h(zQ)</textarea><br /> |
| 2031 | @ <input type="submit" name="go" value="Run SQL"> |
| 2032 | @ <input type="submit" name="schema" value="Show Schema"> |
| 2033 | @ <input type="submit" name="tablelist" value="List Tables"> |
| 2034 | @ <input type="submit" name="configtab" value="CONFIG Table Query"> |
| 2035 | @ </form> |
| 2036 | if( P("schema") ){ |
| 2037 | zQ = sqlite3_mprintf( |
| 2038 | "SELECT sql FROM repository.sqlite_master WHERE sql IS NOT NULL ORDER BY name"); |
| 2039 | go = 1; |
| 2040 | }else if( P("tablelist") ){ |
| 2041 | zQ = sqlite3_mprintf( |
| 2042 | "SELECT name FROM repository.sqlite_master WHERE type='table'" |
| 2043 | " ORDER BY name"); |
| 2044 |
+1
| --- src/skins.c | ||
| +++ src/skins.c | ||
| @@ -42,10 +42,11 @@ | ||
| 42 | 42 | char *zSQL; /* Filled in at run-time with SQL to insert this skin */ |
| 43 | 43 | } aBuiltinSkin[] = { |
| 44 | 44 | { "Default", "default", 0 }, |
| 45 | 45 | { "Blitz", "blitz", 0 }, |
| 46 | 46 | { "Blitz, No Logo", "blitz_no_logo", 0 }, |
| 47 | + { "Bootstrap", "bootstrap", 0 }, | |
| 47 | 48 | { "Xekri", "xekri", 0 }, |
| 48 | 49 | { "Original", "original", 0 }, |
| 49 | 50 | { "Enhanced Original", "enhanced1", 0 }, |
| 50 | 51 | { "Shadow boxes & Rounded Corners", "rounded1", 0 }, |
| 51 | 52 | { "Eagle", "eagle", 0 }, |
| 52 | 53 |
| --- src/skins.c | |
| +++ src/skins.c | |
| @@ -42,10 +42,11 @@ | |
| 42 | char *zSQL; /* Filled in at run-time with SQL to insert this skin */ |
| 43 | } aBuiltinSkin[] = { |
| 44 | { "Default", "default", 0 }, |
| 45 | { "Blitz", "blitz", 0 }, |
| 46 | { "Blitz, No Logo", "blitz_no_logo", 0 }, |
| 47 | { "Xekri", "xekri", 0 }, |
| 48 | { "Original", "original", 0 }, |
| 49 | { "Enhanced Original", "enhanced1", 0 }, |
| 50 | { "Shadow boxes & Rounded Corners", "rounded1", 0 }, |
| 51 | { "Eagle", "eagle", 0 }, |
| 52 |
| --- src/skins.c | |
| +++ src/skins.c | |
| @@ -42,10 +42,11 @@ | |
| 42 | char *zSQL; /* Filled in at run-time with SQL to insert this skin */ |
| 43 | } aBuiltinSkin[] = { |
| 44 | { "Default", "default", 0 }, |
| 45 | { "Blitz", "blitz", 0 }, |
| 46 | { "Blitz, No Logo", "blitz_no_logo", 0 }, |
| 47 | { "Bootstrap", "bootstrap", 0 }, |
| 48 | { "Xekri", "xekri", 0 }, |
| 49 | { "Original", "original", 0 }, |
| 50 | { "Enhanced Original", "enhanced1", 0 }, |
| 51 | { "Shadow boxes & Rounded Corners", "rounded1", 0 }, |
| 52 | { "Eagle", "eagle", 0 }, |
| 53 |
+20
-6
| --- src/stat.c | ||
| +++ src/stat.c | ||
| @@ -341,41 +341,55 @@ | ||
| 341 | 341 | ** Show ways in which this repository has been accessed |
| 342 | 342 | */ |
| 343 | 343 | void urllist_page(void){ |
| 344 | 344 | Stmt q; |
| 345 | 345 | int cnt; |
| 346 | + int showAll = P("all")!=0; | |
| 347 | + int nOmitted; | |
| 348 | + sqlite3_int64 iNow; | |
| 346 | 349 | char *zRemote; |
| 347 | 350 | login_check_credentials(); |
| 348 | 351 | if( !g.perm.Admin ){ login_needed(0); return; } |
| 349 | 352 | |
| 350 | 353 | style_header("URLs and Checkouts"); |
| 351 | 354 | style_adunit_config(ADUNIT_RIGHT_OK); |
| 352 | 355 | style_submenu_element("Stat", "stat"); |
| 353 | 356 | style_submenu_element("Schema", "repo_schema"); |
| 357 | + iNow = db_int64(0, "SELECT strftime('%%s','now')"); | |
| 354 | 358 | @ <div class="section">URLs</div> |
| 355 | 359 | @ <table border="0" width='100%%'> |
| 356 | - db_prepare(&q, "SELECT substr(name,9), datetime(mtime,'unixepoch')" | |
| 357 | - " FROM config WHERE name GLOB 'baseurl:*' ORDER BY 2 DESC"); | |
| 360 | + db_prepare(&q, "SELECT substr(name,9), datetime(mtime,'unixepoch'), mtime" | |
| 361 | + " FROM config WHERE name GLOB 'baseurl:*' ORDER BY 3 DESC"); | |
| 358 | 362 | cnt = 0; |
| 363 | + nOmitted = 0; | |
| 359 | 364 | while( db_step(&q)==SQLITE_ROW ){ |
| 360 | - @ <tr><td width='100%%'>%h(db_column_text(&q,0))</td> | |
| 361 | - @ <td><nobr>%h(db_column_text(&q,1))</nobr></td></tr> | |
| 365 | + if( !showAll && db_column_int64(&q,2)<(iNow - 3600*24*30) && cnt>8 ){ | |
| 366 | + nOmitted++; | |
| 367 | + }else{ | |
| 368 | + @ <tr><td width='100%%'>%h(db_column_text(&q,0))</td> | |
| 369 | + @ <td><nobr>%h(db_column_text(&q,1))</nobr></td></tr> | |
| 370 | + } | |
| 362 | 371 | cnt++; |
| 363 | 372 | } |
| 364 | 373 | db_finalize(&q); |
| 365 | 374 | if( cnt==0 ){ |
| 366 | 375 | @ <tr><td>(none)</td> |
| 376 | + }else if( nOmitted ){ | |
| 377 | + @ <tr><td><a href="urllist?all"><i>Show %d(nOmitted) more...</i></a> | |
| 367 | 378 | } |
| 368 | 379 | @ </table> |
| 369 | 380 | @ <div class="section">Checkouts</div> |
| 370 | 381 | @ <table border="0" width='100%%'> |
| 371 | 382 | db_prepare(&q, "SELECT substr(name,7), datetime(mtime,'unixepoch')" |
| 372 | 383 | " FROM config WHERE name GLOB 'ckout:*' ORDER BY 2 DESC"); |
| 373 | 384 | cnt = 0; |
| 374 | 385 | while( db_step(&q)==SQLITE_ROW ){ |
| 375 | - @ <tr><td width='100%%'>%h(db_column_text(&q,0))</td> | |
| 376 | - @ <td><nobr>%h(db_column_text(&q,1))</nobr></td></tr> | |
| 386 | + const char *zPath = db_column_text(&q,0); | |
| 387 | + if( vfile_top_of_checkout(zPath) ){ | |
| 388 | + @ <tr><td width='100%%'>%h(zPath)</td> | |
| 389 | + @ <td><nobr>%h(db_column_text(&q,1))</nobr></td></tr> | |
| 390 | + } | |
| 377 | 391 | cnt++; |
| 378 | 392 | } |
| 379 | 393 | db_finalize(&q); |
| 380 | 394 | if( cnt==0 ){ |
| 381 | 395 | @ <tr><td>(none)</td> |
| 382 | 396 |
| --- src/stat.c | |
| +++ src/stat.c | |
| @@ -341,41 +341,55 @@ | |
| 341 | ** Show ways in which this repository has been accessed |
| 342 | */ |
| 343 | void urllist_page(void){ |
| 344 | Stmt q; |
| 345 | int cnt; |
| 346 | char *zRemote; |
| 347 | login_check_credentials(); |
| 348 | if( !g.perm.Admin ){ login_needed(0); return; } |
| 349 | |
| 350 | style_header("URLs and Checkouts"); |
| 351 | style_adunit_config(ADUNIT_RIGHT_OK); |
| 352 | style_submenu_element("Stat", "stat"); |
| 353 | style_submenu_element("Schema", "repo_schema"); |
| 354 | @ <div class="section">URLs</div> |
| 355 | @ <table border="0" width='100%%'> |
| 356 | db_prepare(&q, "SELECT substr(name,9), datetime(mtime,'unixepoch')" |
| 357 | " FROM config WHERE name GLOB 'baseurl:*' ORDER BY 2 DESC"); |
| 358 | cnt = 0; |
| 359 | while( db_step(&q)==SQLITE_ROW ){ |
| 360 | @ <tr><td width='100%%'>%h(db_column_text(&q,0))</td> |
| 361 | @ <td><nobr>%h(db_column_text(&q,1))</nobr></td></tr> |
| 362 | cnt++; |
| 363 | } |
| 364 | db_finalize(&q); |
| 365 | if( cnt==0 ){ |
| 366 | @ <tr><td>(none)</td> |
| 367 | } |
| 368 | @ </table> |
| 369 | @ <div class="section">Checkouts</div> |
| 370 | @ <table border="0" width='100%%'> |
| 371 | db_prepare(&q, "SELECT substr(name,7), datetime(mtime,'unixepoch')" |
| 372 | " FROM config WHERE name GLOB 'ckout:*' ORDER BY 2 DESC"); |
| 373 | cnt = 0; |
| 374 | while( db_step(&q)==SQLITE_ROW ){ |
| 375 | @ <tr><td width='100%%'>%h(db_column_text(&q,0))</td> |
| 376 | @ <td><nobr>%h(db_column_text(&q,1))</nobr></td></tr> |
| 377 | cnt++; |
| 378 | } |
| 379 | db_finalize(&q); |
| 380 | if( cnt==0 ){ |
| 381 | @ <tr><td>(none)</td> |
| 382 |
| --- src/stat.c | |
| +++ src/stat.c | |
| @@ -341,41 +341,55 @@ | |
| 341 | ** Show ways in which this repository has been accessed |
| 342 | */ |
| 343 | void urllist_page(void){ |
| 344 | Stmt q; |
| 345 | int cnt; |
| 346 | int showAll = P("all")!=0; |
| 347 | int nOmitted; |
| 348 | sqlite3_int64 iNow; |
| 349 | char *zRemote; |
| 350 | login_check_credentials(); |
| 351 | if( !g.perm.Admin ){ login_needed(0); return; } |
| 352 | |
| 353 | style_header("URLs and Checkouts"); |
| 354 | style_adunit_config(ADUNIT_RIGHT_OK); |
| 355 | style_submenu_element("Stat", "stat"); |
| 356 | style_submenu_element("Schema", "repo_schema"); |
| 357 | iNow = db_int64(0, "SELECT strftime('%%s','now')"); |
| 358 | @ <div class="section">URLs</div> |
| 359 | @ <table border="0" width='100%%'> |
| 360 | db_prepare(&q, "SELECT substr(name,9), datetime(mtime,'unixepoch'), mtime" |
| 361 | " FROM config WHERE name GLOB 'baseurl:*' ORDER BY 3 DESC"); |
| 362 | cnt = 0; |
| 363 | nOmitted = 0; |
| 364 | while( db_step(&q)==SQLITE_ROW ){ |
| 365 | if( !showAll && db_column_int64(&q,2)<(iNow - 3600*24*30) && cnt>8 ){ |
| 366 | nOmitted++; |
| 367 | }else{ |
| 368 | @ <tr><td width='100%%'>%h(db_column_text(&q,0))</td> |
| 369 | @ <td><nobr>%h(db_column_text(&q,1))</nobr></td></tr> |
| 370 | } |
| 371 | cnt++; |
| 372 | } |
| 373 | db_finalize(&q); |
| 374 | if( cnt==0 ){ |
| 375 | @ <tr><td>(none)</td> |
| 376 | }else if( nOmitted ){ |
| 377 | @ <tr><td><a href="urllist?all"><i>Show %d(nOmitted) more...</i></a> |
| 378 | } |
| 379 | @ </table> |
| 380 | @ <div class="section">Checkouts</div> |
| 381 | @ <table border="0" width='100%%'> |
| 382 | db_prepare(&q, "SELECT substr(name,7), datetime(mtime,'unixepoch')" |
| 383 | " FROM config WHERE name GLOB 'ckout:*' ORDER BY 2 DESC"); |
| 384 | cnt = 0; |
| 385 | while( db_step(&q)==SQLITE_ROW ){ |
| 386 | const char *zPath = db_column_text(&q,0); |
| 387 | if( vfile_top_of_checkout(zPath) ){ |
| 388 | @ <tr><td width='100%%'>%h(zPath)</td> |
| 389 | @ <td><nobr>%h(db_column_text(&q,1))</nobr></td></tr> |
| 390 | } |
| 391 | cnt++; |
| 392 | } |
| 393 | db_finalize(&q); |
| 394 | if( cnt==0 ){ |
| 395 | @ <tr><td>(none)</td> |
| 396 |
+20
-8
| --- src/timeline.c | ||
| +++ src/timeline.c | ||
| @@ -201,10 +201,18 @@ | ||
| 201 | 201 | } |
| 202 | 202 | @ <input type="submit"> |
| 203 | 203 | @ </form> |
| 204 | 204 | style_footer(); |
| 205 | 205 | } |
| 206 | + | |
| 207 | +/* | |
| 208 | +** Return a new timelineTable id. | |
| 209 | +*/ | |
| 210 | +int timeline_tableid(void){ | |
| 211 | + static int id = 0; | |
| 212 | + return id++; | |
| 213 | +} | |
| 206 | 214 | |
| 207 | 215 | /* |
| 208 | 216 | ** Output a timeline in the web format given a query. The query |
| 209 | 217 | ** should return these columns: |
| 210 | 218 | ** |
| @@ -241,10 +249,11 @@ | ||
| 241 | 249 | int pendingEndTr = 0; /* True if a </td></tr> is needed */ |
| 242 | 250 | int vid = 0; /* Current checkout version */ |
| 243 | 251 | int dateFormat = 0; /* 0: HH:MM (default) */ |
| 244 | 252 | int bCommentGitStyle = 0; /* Only show comments through first blank line */ |
| 245 | 253 | const char *zDateFmt; |
| 254 | + int iTableId = timeline_tableid(); | |
| 246 | 255 | |
| 247 | 256 | if( fossil_strcmp(g.zIpAddr, "127.0.0.1")==0 && db_open_local(0) ){ |
| 248 | 257 | vid = db_lget_int("checkout", 0); |
| 249 | 258 | } |
| 250 | 259 | zPrevDate[0] = 0; |
| @@ -259,11 +268,11 @@ | ||
| 259 | 268 | db_static_prepare(&qbranch, |
| 260 | 269 | "SELECT value FROM tagxref WHERE tagid=%d AND tagtype>0 AND rid=:rid", |
| 261 | 270 | TAG_BRANCH |
| 262 | 271 | ); |
| 263 | 272 | |
| 264 | - @ <table id="timelineTable" class="timelineTable"> | |
| 273 | + @ <table id="timelineTable%d(iTableId)" class="timelineTable"> | |
| 265 | 274 | blob_zero(&comment); |
| 266 | 275 | while( db_step(pQuery)==SQLITE_ROW ){ |
| 267 | 276 | int rid = db_column_int(pQuery, 0); |
| 268 | 277 | const char *zUuid = db_column_text(pQuery, 1); |
| 269 | 278 | int isLeaf = db_column_int(pQuery, 5); |
| @@ -623,11 +632,11 @@ | ||
| 623 | 632 | @ <tr class="timelineBottom"><td></td><td></td><td></td></tr> |
| 624 | 633 | } |
| 625 | 634 | } |
| 626 | 635 | @ </table> |
| 627 | 636 | if( fchngQueryInit ) db_finalize(&fchngQuery); |
| 628 | - timeline_output_graph_javascript(pGraph, (tmFlags & TIMELINE_DISJOINT)!=0, 0); | |
| 637 | + timeline_output_graph_javascript(pGraph, (tmFlags & TIMELINE_DISJOINT)!=0, iTableId, 0); | |
| 629 | 638 | } |
| 630 | 639 | |
| 631 | 640 | /* |
| 632 | 641 | ** Change the RGB background color given in the argument in a foreground |
| 633 | 642 | ** color with the same hue. |
| @@ -664,10 +673,11 @@ | ||
| 664 | 673 | ** graph. |
| 665 | 674 | */ |
| 666 | 675 | void timeline_output_graph_javascript( |
| 667 | 676 | GraphContext *pGraph, /* The graph to be displayed */ |
| 668 | 677 | int omitDescenders, /* True to omit descenders */ |
| 678 | + int iTableId, /* Identifier for the timelineTable */ | |
| 669 | 679 | int fileDiff /* True for file diff. False for check-in diff */ |
| 670 | 680 | ){ |
| 671 | 681 | if( pGraph && pGraph->nErr==0 && pGraph->nRow>0 ){ |
| 672 | 682 | GraphRow *pRow; |
| 673 | 683 | int i; |
| @@ -674,10 +684,11 @@ | ||
| 674 | 684 | char cSep; |
| 675 | 685 | int iRailPitch; /* Pixels between consecutive rails */ |
| 676 | 686 | int showArrowheads; /* True to draw arrowheads. False to omit. */ |
| 677 | 687 | int circleNodes; /* True for circle nodes. False for square nodes */ |
| 678 | 688 | int colorGraph; /* Use colors for graph lines */ |
| 689 | + int iTopRow; /* Index of the top row of the graph */ | |
| 679 | 690 | |
| 680 | 691 | iRailPitch = atoi(PD("railpitch","0")); |
| 681 | 692 | showArrowheads = skin_detail_boolean("timeline-arrowheads"); |
| 682 | 693 | circleNodes = skin_detail_boolean("timeline-circle-nodes"); |
| 683 | 694 | colorGraph = skin_detail_boolean("timeline-color-graph-lines"); |
| @@ -699,11 +710,11 @@ | ||
| 699 | 710 | /* the rowinfo[] array contains all the information needed to generate |
| 700 | 711 | ** the graph. Each entry contains information for a single row: |
| 701 | 712 | ** |
| 702 | 713 | ** id: The id of the <div> element for the row. This is an integer. |
| 703 | 714 | ** to get an actual id, prepend "m" to the integer. The top node |
| 704 | - ** is 1 and numbers increase moving down the timeline. | |
| 715 | + ** is iTopRow and numbers increase moving down the timeline. | |
| 705 | 716 | ** bg: The background color for this row |
| 706 | 717 | ** r: The "rail" that the node for this row sits on. The left-most |
| 707 | 718 | ** rail is 0 and the number increases to the right. |
| 708 | 719 | ** d: True if there is a "descender" - an arrow coming from the bottom |
| 709 | 720 | ** of the page straight up to this node. |
| @@ -725,10 +736,11 @@ | ||
| 725 | 736 | ** negative, then the rail position is the absolute value of mi[] |
| 726 | 737 | ** and a thin merge-arrow descender is drawn to the bottom of |
| 727 | 738 | ** the screen. |
| 728 | 739 | ** h: The artifact hash of the object being graphed |
| 729 | 740 | */ |
| 741 | + iTopRow = pGraph->pFirst ? pGraph->pFirst->idx : 0; | |
| 730 | 742 | cgi_printf("var rowinfo = [\n"); |
| 731 | 743 | for(pRow=pGraph->pFirst; pRow; pRow=pRow->pNext){ |
| 732 | 744 | cgi_printf("{id:%d,bg:\"%s\",r:%d,d:%d,mo:%d,mu:%d,u:%d,f:%d,au:", |
| 733 | 745 | pRow->idx, /* id */ |
| 734 | 746 | pRow->zBgClr, /* bg */ |
| @@ -772,11 +784,11 @@ | ||
| 772 | 784 | @ var canvasDiv; |
| 773 | 785 | @ var railPitch; |
| 774 | 786 | @ var mergeOffset; |
| 775 | 787 | @ var node, arrow, arrowSmall, line, mArrow, mLine, wArrow, wLine; |
| 776 | 788 | @ function initGraph(){ |
| 777 | - @ var parent = gebi("timelineTable").rows[0].cells[1]; | |
| 789 | + @ var parent = gebi("timelineTable%d(iTableId)").rows[0].cells[1]; | |
| 778 | 790 | @ parent.style.verticalAlign = "top"; |
| 779 | 791 | @ canvasDiv = document.createElement("div"); |
| 780 | 792 | @ canvasDiv.className = "tl-canvas"; |
| 781 | 793 | @ canvasDiv.style.position = "absolute"; |
| 782 | 794 | @ parent.appendChild(canvasDiv); |
| @@ -901,11 +913,11 @@ | ||
| 901 | 913 | @ var x = p.x + (p.r<rail ? node.w : -mArrow.w); |
| 902 | 914 | @ var cls = "arrow merge " + (p.r<rail ? "l" : "r"); |
| 903 | 915 | @ drawBox(cls,null,x,y+(mLine.w-mArrow.h)/2); |
| 904 | 916 | @ } |
| 905 | 917 | @ function drawNode(p, btm){ |
| 906 | - @ if( p.u>0 ) drawUpArrow(p,rowinfo[p.u-1],p.fg); | |
| 918 | + @ if( p.u>0 ) drawUpArrow(p,rowinfo[p.u-%d(iTopRow)],p.fg); | |
| 907 | 919 | @ var cls = node.cls; |
| 908 | 920 | @ if( p.mi.length ) cls += " merge"; |
| 909 | 921 | @ if( p.f&1 ) cls += " leaf"; |
| 910 | 922 | @ var n = drawBox(cls,p.bg,p.x,p.y); |
| 911 | 923 | @ n.id = "tln"+p.id; |
| @@ -916,11 +928,11 @@ | ||
| 916 | 928 | @ if( p.d ) drawUpArrow({x: p.x, y: btm-node.h/2},p,p.fg); |
| 917 | 929 | } |
| 918 | 930 | @ if( p.mo>=0 ){ |
| 919 | 931 | @ var x0 = p.x + node.w/2; |
| 920 | 932 | @ var x1 = p.mo*railPitch + node.w/2; |
| 921 | - @ var u = rowinfo[p.mu-1]; | |
| 933 | + @ var u = rowinfo[p.mu-%d(iTopRow)]; | |
| 922 | 934 | @ var y1 = miLineY(u); |
| 923 | 935 | @ if( p.u<0 || p.mo!=p.r ){ |
| 924 | 936 | @ x1 += mergeLines[p.mo] = -mLine.w/2; |
| 925 | 937 | @ var y0 = p.y+2; |
| 926 | 938 | @ if( p.r!=p.mo ) drawMergeLine(x0,y0,x1+(x0<x1 ? mLine.w : 0),null); |
| @@ -940,11 +952,11 @@ | ||
| 940 | 952 | @ if( x0<x1 ){ |
| 941 | 953 | @ x0 = Math.ceil(x0); |
| 942 | 954 | @ x1 += line.w; |
| 943 | 955 | @ } |
| 944 | 956 | @ var y0 = p.y + (node.h-line.w)/2; |
| 945 | - @ var u = rowinfo[p.au[i+1]-1]; | |
| 957 | + @ var u = rowinfo[p.au[i+1]-%d(iTopRow)]; | |
| 946 | 958 | @ if( u.id<p.id ){ |
| 947 | 959 | @ drawLine(line,u.fg,x0,y0,x1,null); |
| 948 | 960 | @ drawUpArrow(p,u,u.fg); |
| 949 | 961 | @ }else{ |
| 950 | 962 | @ var y1 = u.y + (node.h-line.w)/2; |
| @@ -986,11 +998,11 @@ | ||
| 986 | 998 | @ drawNode(rowinfo[i], btm); |
| 987 | 999 | @ } |
| 988 | 1000 | @ } |
| 989 | 1001 | @ var selRow; |
| 990 | 1002 | @ function clickOnNode(){ |
| 991 | - @ var p = rowinfo[parseInt(this.id.match(/\d+$/)[0], 10)-1]; | |
| 1003 | + @ var p = rowinfo[parseInt(this.id.match(/\d+$/)[0], 10)-%d(iTopRow)]; | |
| 992 | 1004 | @ if( !selRow ){ |
| 993 | 1005 | @ selRow = p; |
| 994 | 1006 | @ this.className += " sel"; |
| 995 | 1007 | @ canvasDiv.className += " sel"; |
| 996 | 1008 | @ }else if( selRow==p ){ |
| 997 | 1009 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -201,10 +201,18 @@ | |
| 201 | } |
| 202 | @ <input type="submit"> |
| 203 | @ </form> |
| 204 | style_footer(); |
| 205 | } |
| 206 | |
| 207 | /* |
| 208 | ** Output a timeline in the web format given a query. The query |
| 209 | ** should return these columns: |
| 210 | ** |
| @@ -241,10 +249,11 @@ | |
| 241 | int pendingEndTr = 0; /* True if a </td></tr> is needed */ |
| 242 | int vid = 0; /* Current checkout version */ |
| 243 | int dateFormat = 0; /* 0: HH:MM (default) */ |
| 244 | int bCommentGitStyle = 0; /* Only show comments through first blank line */ |
| 245 | const char *zDateFmt; |
| 246 | |
| 247 | if( fossil_strcmp(g.zIpAddr, "127.0.0.1")==0 && db_open_local(0) ){ |
| 248 | vid = db_lget_int("checkout", 0); |
| 249 | } |
| 250 | zPrevDate[0] = 0; |
| @@ -259,11 +268,11 @@ | |
| 259 | db_static_prepare(&qbranch, |
| 260 | "SELECT value FROM tagxref WHERE tagid=%d AND tagtype>0 AND rid=:rid", |
| 261 | TAG_BRANCH |
| 262 | ); |
| 263 | |
| 264 | @ <table id="timelineTable" class="timelineTable"> |
| 265 | blob_zero(&comment); |
| 266 | while( db_step(pQuery)==SQLITE_ROW ){ |
| 267 | int rid = db_column_int(pQuery, 0); |
| 268 | const char *zUuid = db_column_text(pQuery, 1); |
| 269 | int isLeaf = db_column_int(pQuery, 5); |
| @@ -623,11 +632,11 @@ | |
| 623 | @ <tr class="timelineBottom"><td></td><td></td><td></td></tr> |
| 624 | } |
| 625 | } |
| 626 | @ </table> |
| 627 | if( fchngQueryInit ) db_finalize(&fchngQuery); |
| 628 | timeline_output_graph_javascript(pGraph, (tmFlags & TIMELINE_DISJOINT)!=0, 0); |
| 629 | } |
| 630 | |
| 631 | /* |
| 632 | ** Change the RGB background color given in the argument in a foreground |
| 633 | ** color with the same hue. |
| @@ -664,10 +673,11 @@ | |
| 664 | ** graph. |
| 665 | */ |
| 666 | void timeline_output_graph_javascript( |
| 667 | GraphContext *pGraph, /* The graph to be displayed */ |
| 668 | int omitDescenders, /* True to omit descenders */ |
| 669 | int fileDiff /* True for file diff. False for check-in diff */ |
| 670 | ){ |
| 671 | if( pGraph && pGraph->nErr==0 && pGraph->nRow>0 ){ |
| 672 | GraphRow *pRow; |
| 673 | int i; |
| @@ -674,10 +684,11 @@ | |
| 674 | char cSep; |
| 675 | int iRailPitch; /* Pixels between consecutive rails */ |
| 676 | int showArrowheads; /* True to draw arrowheads. False to omit. */ |
| 677 | int circleNodes; /* True for circle nodes. False for square nodes */ |
| 678 | int colorGraph; /* Use colors for graph lines */ |
| 679 | |
| 680 | iRailPitch = atoi(PD("railpitch","0")); |
| 681 | showArrowheads = skin_detail_boolean("timeline-arrowheads"); |
| 682 | circleNodes = skin_detail_boolean("timeline-circle-nodes"); |
| 683 | colorGraph = skin_detail_boolean("timeline-color-graph-lines"); |
| @@ -699,11 +710,11 @@ | |
| 699 | /* the rowinfo[] array contains all the information needed to generate |
| 700 | ** the graph. Each entry contains information for a single row: |
| 701 | ** |
| 702 | ** id: The id of the <div> element for the row. This is an integer. |
| 703 | ** to get an actual id, prepend "m" to the integer. The top node |
| 704 | ** is 1 and numbers increase moving down the timeline. |
| 705 | ** bg: The background color for this row |
| 706 | ** r: The "rail" that the node for this row sits on. The left-most |
| 707 | ** rail is 0 and the number increases to the right. |
| 708 | ** d: True if there is a "descender" - an arrow coming from the bottom |
| 709 | ** of the page straight up to this node. |
| @@ -725,10 +736,11 @@ | |
| 725 | ** negative, then the rail position is the absolute value of mi[] |
| 726 | ** and a thin merge-arrow descender is drawn to the bottom of |
| 727 | ** the screen. |
| 728 | ** h: The artifact hash of the object being graphed |
| 729 | */ |
| 730 | cgi_printf("var rowinfo = [\n"); |
| 731 | for(pRow=pGraph->pFirst; pRow; pRow=pRow->pNext){ |
| 732 | cgi_printf("{id:%d,bg:\"%s\",r:%d,d:%d,mo:%d,mu:%d,u:%d,f:%d,au:", |
| 733 | pRow->idx, /* id */ |
| 734 | pRow->zBgClr, /* bg */ |
| @@ -772,11 +784,11 @@ | |
| 772 | @ var canvasDiv; |
| 773 | @ var railPitch; |
| 774 | @ var mergeOffset; |
| 775 | @ var node, arrow, arrowSmall, line, mArrow, mLine, wArrow, wLine; |
| 776 | @ function initGraph(){ |
| 777 | @ var parent = gebi("timelineTable").rows[0].cells[1]; |
| 778 | @ parent.style.verticalAlign = "top"; |
| 779 | @ canvasDiv = document.createElement("div"); |
| 780 | @ canvasDiv.className = "tl-canvas"; |
| 781 | @ canvasDiv.style.position = "absolute"; |
| 782 | @ parent.appendChild(canvasDiv); |
| @@ -901,11 +913,11 @@ | |
| 901 | @ var x = p.x + (p.r<rail ? node.w : -mArrow.w); |
| 902 | @ var cls = "arrow merge " + (p.r<rail ? "l" : "r"); |
| 903 | @ drawBox(cls,null,x,y+(mLine.w-mArrow.h)/2); |
| 904 | @ } |
| 905 | @ function drawNode(p, btm){ |
| 906 | @ if( p.u>0 ) drawUpArrow(p,rowinfo[p.u-1],p.fg); |
| 907 | @ var cls = node.cls; |
| 908 | @ if( p.mi.length ) cls += " merge"; |
| 909 | @ if( p.f&1 ) cls += " leaf"; |
| 910 | @ var n = drawBox(cls,p.bg,p.x,p.y); |
| 911 | @ n.id = "tln"+p.id; |
| @@ -916,11 +928,11 @@ | |
| 916 | @ if( p.d ) drawUpArrow({x: p.x, y: btm-node.h/2},p,p.fg); |
| 917 | } |
| 918 | @ if( p.mo>=0 ){ |
| 919 | @ var x0 = p.x + node.w/2; |
| 920 | @ var x1 = p.mo*railPitch + node.w/2; |
| 921 | @ var u = rowinfo[p.mu-1]; |
| 922 | @ var y1 = miLineY(u); |
| 923 | @ if( p.u<0 || p.mo!=p.r ){ |
| 924 | @ x1 += mergeLines[p.mo] = -mLine.w/2; |
| 925 | @ var y0 = p.y+2; |
| 926 | @ if( p.r!=p.mo ) drawMergeLine(x0,y0,x1+(x0<x1 ? mLine.w : 0),null); |
| @@ -940,11 +952,11 @@ | |
| 940 | @ if( x0<x1 ){ |
| 941 | @ x0 = Math.ceil(x0); |
| 942 | @ x1 += line.w; |
| 943 | @ } |
| 944 | @ var y0 = p.y + (node.h-line.w)/2; |
| 945 | @ var u = rowinfo[p.au[i+1]-1]; |
| 946 | @ if( u.id<p.id ){ |
| 947 | @ drawLine(line,u.fg,x0,y0,x1,null); |
| 948 | @ drawUpArrow(p,u,u.fg); |
| 949 | @ }else{ |
| 950 | @ var y1 = u.y + (node.h-line.w)/2; |
| @@ -986,11 +998,11 @@ | |
| 986 | @ drawNode(rowinfo[i], btm); |
| 987 | @ } |
| 988 | @ } |
| 989 | @ var selRow; |
| 990 | @ function clickOnNode(){ |
| 991 | @ var p = rowinfo[parseInt(this.id.match(/\d+$/)[0], 10)-1]; |
| 992 | @ if( !selRow ){ |
| 993 | @ selRow = p; |
| 994 | @ this.className += " sel"; |
| 995 | @ canvasDiv.className += " sel"; |
| 996 | @ }else if( selRow==p ){ |
| 997 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -201,10 +201,18 @@ | |
| 201 | } |
| 202 | @ <input type="submit"> |
| 203 | @ </form> |
| 204 | style_footer(); |
| 205 | } |
| 206 | |
| 207 | /* |
| 208 | ** Return a new timelineTable id. |
| 209 | */ |
| 210 | int timeline_tableid(void){ |
| 211 | static int id = 0; |
| 212 | return id++; |
| 213 | } |
| 214 | |
| 215 | /* |
| 216 | ** Output a timeline in the web format given a query. The query |
| 217 | ** should return these columns: |
| 218 | ** |
| @@ -241,10 +249,11 @@ | |
| 249 | int pendingEndTr = 0; /* True if a </td></tr> is needed */ |
| 250 | int vid = 0; /* Current checkout version */ |
| 251 | int dateFormat = 0; /* 0: HH:MM (default) */ |
| 252 | int bCommentGitStyle = 0; /* Only show comments through first blank line */ |
| 253 | const char *zDateFmt; |
| 254 | int iTableId = timeline_tableid(); |
| 255 | |
| 256 | if( fossil_strcmp(g.zIpAddr, "127.0.0.1")==0 && db_open_local(0) ){ |
| 257 | vid = db_lget_int("checkout", 0); |
| 258 | } |
| 259 | zPrevDate[0] = 0; |
| @@ -259,11 +268,11 @@ | |
| 268 | db_static_prepare(&qbranch, |
| 269 | "SELECT value FROM tagxref WHERE tagid=%d AND tagtype>0 AND rid=:rid", |
| 270 | TAG_BRANCH |
| 271 | ); |
| 272 | |
| 273 | @ <table id="timelineTable%d(iTableId)" class="timelineTable"> |
| 274 | blob_zero(&comment); |
| 275 | while( db_step(pQuery)==SQLITE_ROW ){ |
| 276 | int rid = db_column_int(pQuery, 0); |
| 277 | const char *zUuid = db_column_text(pQuery, 1); |
| 278 | int isLeaf = db_column_int(pQuery, 5); |
| @@ -623,11 +632,11 @@ | |
| 632 | @ <tr class="timelineBottom"><td></td><td></td><td></td></tr> |
| 633 | } |
| 634 | } |
| 635 | @ </table> |
| 636 | if( fchngQueryInit ) db_finalize(&fchngQuery); |
| 637 | timeline_output_graph_javascript(pGraph, (tmFlags & TIMELINE_DISJOINT)!=0, iTableId, 0); |
| 638 | } |
| 639 | |
| 640 | /* |
| 641 | ** Change the RGB background color given in the argument in a foreground |
| 642 | ** color with the same hue. |
| @@ -664,10 +673,11 @@ | |
| 673 | ** graph. |
| 674 | */ |
| 675 | void timeline_output_graph_javascript( |
| 676 | GraphContext *pGraph, /* The graph to be displayed */ |
| 677 | int omitDescenders, /* True to omit descenders */ |
| 678 | int iTableId, /* Identifier for the timelineTable */ |
| 679 | int fileDiff /* True for file diff. False for check-in diff */ |
| 680 | ){ |
| 681 | if( pGraph && pGraph->nErr==0 && pGraph->nRow>0 ){ |
| 682 | GraphRow *pRow; |
| 683 | int i; |
| @@ -674,10 +684,11 @@ | |
| 684 | char cSep; |
| 685 | int iRailPitch; /* Pixels between consecutive rails */ |
| 686 | int showArrowheads; /* True to draw arrowheads. False to omit. */ |
| 687 | int circleNodes; /* True for circle nodes. False for square nodes */ |
| 688 | int colorGraph; /* Use colors for graph lines */ |
| 689 | int iTopRow; /* Index of the top row of the graph */ |
| 690 | |
| 691 | iRailPitch = atoi(PD("railpitch","0")); |
| 692 | showArrowheads = skin_detail_boolean("timeline-arrowheads"); |
| 693 | circleNodes = skin_detail_boolean("timeline-circle-nodes"); |
| 694 | colorGraph = skin_detail_boolean("timeline-color-graph-lines"); |
| @@ -699,11 +710,11 @@ | |
| 710 | /* the rowinfo[] array contains all the information needed to generate |
| 711 | ** the graph. Each entry contains information for a single row: |
| 712 | ** |
| 713 | ** id: The id of the <div> element for the row. This is an integer. |
| 714 | ** to get an actual id, prepend "m" to the integer. The top node |
| 715 | ** is iTopRow and numbers increase moving down the timeline. |
| 716 | ** bg: The background color for this row |
| 717 | ** r: The "rail" that the node for this row sits on. The left-most |
| 718 | ** rail is 0 and the number increases to the right. |
| 719 | ** d: True if there is a "descender" - an arrow coming from the bottom |
| 720 | ** of the page straight up to this node. |
| @@ -725,10 +736,11 @@ | |
| 736 | ** negative, then the rail position is the absolute value of mi[] |
| 737 | ** and a thin merge-arrow descender is drawn to the bottom of |
| 738 | ** the screen. |
| 739 | ** h: The artifact hash of the object being graphed |
| 740 | */ |
| 741 | iTopRow = pGraph->pFirst ? pGraph->pFirst->idx : 0; |
| 742 | cgi_printf("var rowinfo = [\n"); |
| 743 | for(pRow=pGraph->pFirst; pRow; pRow=pRow->pNext){ |
| 744 | cgi_printf("{id:%d,bg:\"%s\",r:%d,d:%d,mo:%d,mu:%d,u:%d,f:%d,au:", |
| 745 | pRow->idx, /* id */ |
| 746 | pRow->zBgClr, /* bg */ |
| @@ -772,11 +784,11 @@ | |
| 784 | @ var canvasDiv; |
| 785 | @ var railPitch; |
| 786 | @ var mergeOffset; |
| 787 | @ var node, arrow, arrowSmall, line, mArrow, mLine, wArrow, wLine; |
| 788 | @ function initGraph(){ |
| 789 | @ var parent = gebi("timelineTable%d(iTableId)").rows[0].cells[1]; |
| 790 | @ parent.style.verticalAlign = "top"; |
| 791 | @ canvasDiv = document.createElement("div"); |
| 792 | @ canvasDiv.className = "tl-canvas"; |
| 793 | @ canvasDiv.style.position = "absolute"; |
| 794 | @ parent.appendChild(canvasDiv); |
| @@ -901,11 +913,11 @@ | |
| 913 | @ var x = p.x + (p.r<rail ? node.w : -mArrow.w); |
| 914 | @ var cls = "arrow merge " + (p.r<rail ? "l" : "r"); |
| 915 | @ drawBox(cls,null,x,y+(mLine.w-mArrow.h)/2); |
| 916 | @ } |
| 917 | @ function drawNode(p, btm){ |
| 918 | @ if( p.u>0 ) drawUpArrow(p,rowinfo[p.u-%d(iTopRow)],p.fg); |
| 919 | @ var cls = node.cls; |
| 920 | @ if( p.mi.length ) cls += " merge"; |
| 921 | @ if( p.f&1 ) cls += " leaf"; |
| 922 | @ var n = drawBox(cls,p.bg,p.x,p.y); |
| 923 | @ n.id = "tln"+p.id; |
| @@ -916,11 +928,11 @@ | |
| 928 | @ if( p.d ) drawUpArrow({x: p.x, y: btm-node.h/2},p,p.fg); |
| 929 | } |
| 930 | @ if( p.mo>=0 ){ |
| 931 | @ var x0 = p.x + node.w/2; |
| 932 | @ var x1 = p.mo*railPitch + node.w/2; |
| 933 | @ var u = rowinfo[p.mu-%d(iTopRow)]; |
| 934 | @ var y1 = miLineY(u); |
| 935 | @ if( p.u<0 || p.mo!=p.r ){ |
| 936 | @ x1 += mergeLines[p.mo] = -mLine.w/2; |
| 937 | @ var y0 = p.y+2; |
| 938 | @ if( p.r!=p.mo ) drawMergeLine(x0,y0,x1+(x0<x1 ? mLine.w : 0),null); |
| @@ -940,11 +952,11 @@ | |
| 952 | @ if( x0<x1 ){ |
| 953 | @ x0 = Math.ceil(x0); |
| 954 | @ x1 += line.w; |
| 955 | @ } |
| 956 | @ var y0 = p.y + (node.h-line.w)/2; |
| 957 | @ var u = rowinfo[p.au[i+1]-%d(iTopRow)]; |
| 958 | @ if( u.id<p.id ){ |
| 959 | @ drawLine(line,u.fg,x0,y0,x1,null); |
| 960 | @ drawUpArrow(p,u,u.fg); |
| 961 | @ }else{ |
| 962 | @ var y1 = u.y + (node.h-line.w)/2; |
| @@ -986,11 +998,11 @@ | |
| 998 | @ drawNode(rowinfo[i], btm); |
| 999 | @ } |
| 1000 | @ } |
| 1001 | @ var selRow; |
| 1002 | @ function clickOnNode(){ |
| 1003 | @ var p = rowinfo[parseInt(this.id.match(/\d+$/)[0], 10)-%d(iTopRow)]; |
| 1004 | @ if( !selRow ){ |
| 1005 | @ selRow = p; |
| 1006 | @ this.className += " sel"; |
| 1007 | @ canvasDiv.className += " sel"; |
| 1008 | @ }else if( selRow==p ){ |
| 1009 |
+4
| --- win/Makefile.mingw | ||
| +++ win/Makefile.mingw | ||
| @@ -565,10 +565,14 @@ | ||
| 565 | 565 | $(SRCDIR)/../skins/blitz_no_logo/css.txt \ |
| 566 | 566 | $(SRCDIR)/../skins/blitz_no_logo/details.txt \ |
| 567 | 567 | $(SRCDIR)/../skins/blitz_no_logo/footer.txt \ |
| 568 | 568 | $(SRCDIR)/../skins/blitz_no_logo/header.txt \ |
| 569 | 569 | $(SRCDIR)/../skins/blitz_no_logo/ticket.txt \ |
| 570 | + $(SRCDIR)/../skins/bootstrap/css.txt \ | |
| 571 | + $(SRCDIR)/../skins/bootstrap/details.txt \ | |
| 572 | + $(SRCDIR)/../skins/bootstrap/footer.txt \ | |
| 573 | + $(SRCDIR)/../skins/bootstrap/header.txt \ | |
| 570 | 574 | $(SRCDIR)/../skins/default/css.txt \ |
| 571 | 575 | $(SRCDIR)/../skins/default/details.txt \ |
| 572 | 576 | $(SRCDIR)/../skins/default/footer.txt \ |
| 573 | 577 | $(SRCDIR)/../skins/default/header.txt \ |
| 574 | 578 | $(SRCDIR)/../skins/eagle/css.txt \ |
| 575 | 579 |
| --- win/Makefile.mingw | |
| +++ win/Makefile.mingw | |
| @@ -565,10 +565,14 @@ | |
| 565 | $(SRCDIR)/../skins/blitz_no_logo/css.txt \ |
| 566 | $(SRCDIR)/../skins/blitz_no_logo/details.txt \ |
| 567 | $(SRCDIR)/../skins/blitz_no_logo/footer.txt \ |
| 568 | $(SRCDIR)/../skins/blitz_no_logo/header.txt \ |
| 569 | $(SRCDIR)/../skins/blitz_no_logo/ticket.txt \ |
| 570 | $(SRCDIR)/../skins/default/css.txt \ |
| 571 | $(SRCDIR)/../skins/default/details.txt \ |
| 572 | $(SRCDIR)/../skins/default/footer.txt \ |
| 573 | $(SRCDIR)/../skins/default/header.txt \ |
| 574 | $(SRCDIR)/../skins/eagle/css.txt \ |
| 575 |
| --- win/Makefile.mingw | |
| +++ win/Makefile.mingw | |
| @@ -565,10 +565,14 @@ | |
| 565 | $(SRCDIR)/../skins/blitz_no_logo/css.txt \ |
| 566 | $(SRCDIR)/../skins/blitz_no_logo/details.txt \ |
| 567 | $(SRCDIR)/../skins/blitz_no_logo/footer.txt \ |
| 568 | $(SRCDIR)/../skins/blitz_no_logo/header.txt \ |
| 569 | $(SRCDIR)/../skins/blitz_no_logo/ticket.txt \ |
| 570 | $(SRCDIR)/../skins/bootstrap/css.txt \ |
| 571 | $(SRCDIR)/../skins/bootstrap/details.txt \ |
| 572 | $(SRCDIR)/../skins/bootstrap/footer.txt \ |
| 573 | $(SRCDIR)/../skins/bootstrap/header.txt \ |
| 574 | $(SRCDIR)/../skins/default/css.txt \ |
| 575 | $(SRCDIR)/../skins/default/details.txt \ |
| 576 | $(SRCDIR)/../skins/default/footer.txt \ |
| 577 | $(SRCDIR)/../skins/default/header.txt \ |
| 578 | $(SRCDIR)/../skins/eagle/css.txt \ |
| 579 |
+4
| --- win/Makefile.msc | ||
| +++ win/Makefile.msc | ||
| @@ -491,10 +491,14 @@ | ||
| 491 | 491 | $(SRCDIR)\../skins/blitz_no_logo/css.txt \ |
| 492 | 492 | $(SRCDIR)\../skins/blitz_no_logo/details.txt \ |
| 493 | 493 | $(SRCDIR)\../skins/blitz_no_logo/footer.txt \ |
| 494 | 494 | $(SRCDIR)\../skins/blitz_no_logo/header.txt \ |
| 495 | 495 | $(SRCDIR)\../skins/blitz_no_logo/ticket.txt \ |
| 496 | + $(SRCDIR)\../skins/bootstrap/css.txt \ | |
| 497 | + $(SRCDIR)\../skins/bootstrap/details.txt \ | |
| 498 | + $(SRCDIR)\../skins/bootstrap/footer.txt \ | |
| 499 | + $(SRCDIR)\../skins/bootstrap/header.txt \ | |
| 496 | 500 | $(SRCDIR)\../skins/default/css.txt \ |
| 497 | 501 | $(SRCDIR)\../skins/default/details.txt \ |
| 498 | 502 | $(SRCDIR)\../skins/default/footer.txt \ |
| 499 | 503 | $(SRCDIR)\../skins/default/header.txt \ |
| 500 | 504 | $(SRCDIR)\../skins/eagle/css.txt \ |
| 501 | 505 |
| --- win/Makefile.msc | |
| +++ win/Makefile.msc | |
| @@ -491,10 +491,14 @@ | |
| 491 | $(SRCDIR)\../skins/blitz_no_logo/css.txt \ |
| 492 | $(SRCDIR)\../skins/blitz_no_logo/details.txt \ |
| 493 | $(SRCDIR)\../skins/blitz_no_logo/footer.txt \ |
| 494 | $(SRCDIR)\../skins/blitz_no_logo/header.txt \ |
| 495 | $(SRCDIR)\../skins/blitz_no_logo/ticket.txt \ |
| 496 | $(SRCDIR)\../skins/default/css.txt \ |
| 497 | $(SRCDIR)\../skins/default/details.txt \ |
| 498 | $(SRCDIR)\../skins/default/footer.txt \ |
| 499 | $(SRCDIR)\../skins/default/header.txt \ |
| 500 | $(SRCDIR)\../skins/eagle/css.txt \ |
| 501 |
| --- win/Makefile.msc | |
| +++ win/Makefile.msc | |
| @@ -491,10 +491,14 @@ | |
| 491 | $(SRCDIR)\../skins/blitz_no_logo/css.txt \ |
| 492 | $(SRCDIR)\../skins/blitz_no_logo/details.txt \ |
| 493 | $(SRCDIR)\../skins/blitz_no_logo/footer.txt \ |
| 494 | $(SRCDIR)\../skins/blitz_no_logo/header.txt \ |
| 495 | $(SRCDIR)\../skins/blitz_no_logo/ticket.txt \ |
| 496 | $(SRCDIR)\../skins/bootstrap/css.txt \ |
| 497 | $(SRCDIR)\../skins/bootstrap/details.txt \ |
| 498 | $(SRCDIR)\../skins/bootstrap/footer.txt \ |
| 499 | $(SRCDIR)\../skins/bootstrap/header.txt \ |
| 500 | $(SRCDIR)\../skins/default/css.txt \ |
| 501 | $(SRCDIR)\../skins/default/details.txt \ |
| 502 | $(SRCDIR)\../skins/default/footer.txt \ |
| 503 | $(SRCDIR)\../skins/default/header.txt \ |
| 504 | $(SRCDIR)\../skins/eagle/css.txt \ |
| 505 |
+7
-1
| --- www/server.wiki | ||
| +++ www/server.wiki | ||
| @@ -176,11 +176,12 @@ | ||
| 176 | 176 | for your particular web server. In particular, the following permissions are |
| 177 | 177 | <em>normally</em> required (but, again, may be different for a particular |
| 178 | 178 | configuration): |
| 179 | 179 | |
| 180 | 180 | <ul> |
| 181 | -<li>The Fossil binary must be readable/executable, and ALL directories leading up to it | |
| 181 | +<li>The Fossil binary (/usr/bin/fossil in the example above) | |
| 182 | +must be readable/executable, and ALL directories leading up to it | |
| 182 | 183 | must be readable by the process which executes the CGI.</li> |
| 183 | 184 | <li>ALL directories leading to the CGI script must also be readable and the CGI |
| 184 | 185 | script itself must be executable for the user under which it will run (which often differs |
| 185 | 186 | from the one running the web server - consult your site's documentation or administrator).</li> |
| 186 | 187 | <li>The repository file AND the directory containing it must be writable by the same account |
| @@ -213,10 +214,15 @@ | ||
| 213 | 214 | </p> |
| 214 | 215 | <p> |
| 215 | 216 | Once deployed, a URL like: <b>http://mydomain.org/cgi-bin/repo/XYZ</b> |
| 216 | 217 | will serve up the repository "/home/fossil/repos/XYZ.fossil" (if it exists). |
| 217 | 218 | </p> |
| 219 | +<p> | |
| 220 | +Additional options available to the CGI script are documented in the | |
| 221 | +source code. As of 2017-07-02, the available options are described at | |
| 222 | +[/artifact/9a52a07b?ln=1777-1824|main.c lines 1777 through 1824]. | |
| 223 | +</p> | |
| 218 | 224 | </blockquote> |
| 219 | 225 | |
| 220 | 226 | <a name="scgi"></a> |
| 221 | 227 | <h2>Fossil as SCGI</h2><blockquote> |
| 222 | 228 | |
| 223 | 229 |
| --- www/server.wiki | |
| +++ www/server.wiki | |
| @@ -176,11 +176,12 @@ | |
| 176 | for your particular web server. In particular, the following permissions are |
| 177 | <em>normally</em> required (but, again, may be different for a particular |
| 178 | configuration): |
| 179 | |
| 180 | <ul> |
| 181 | <li>The Fossil binary must be readable/executable, and ALL directories leading up to it |
| 182 | must be readable by the process which executes the CGI.</li> |
| 183 | <li>ALL directories leading to the CGI script must also be readable and the CGI |
| 184 | script itself must be executable for the user under which it will run (which often differs |
| 185 | from the one running the web server - consult your site's documentation or administrator).</li> |
| 186 | <li>The repository file AND the directory containing it must be writable by the same account |
| @@ -213,10 +214,15 @@ | |
| 213 | </p> |
| 214 | <p> |
| 215 | Once deployed, a URL like: <b>http://mydomain.org/cgi-bin/repo/XYZ</b> |
| 216 | will serve up the repository "/home/fossil/repos/XYZ.fossil" (if it exists). |
| 217 | </p> |
| 218 | </blockquote> |
| 219 | |
| 220 | <a name="scgi"></a> |
| 221 | <h2>Fossil as SCGI</h2><blockquote> |
| 222 | |
| 223 |
| --- www/server.wiki | |
| +++ www/server.wiki | |
| @@ -176,11 +176,12 @@ | |
| 176 | for your particular web server. In particular, the following permissions are |
| 177 | <em>normally</em> required (but, again, may be different for a particular |
| 178 | configuration): |
| 179 | |
| 180 | <ul> |
| 181 | <li>The Fossil binary (/usr/bin/fossil in the example above) |
| 182 | must be readable/executable, and ALL directories leading up to it |
| 183 | must be readable by the process which executes the CGI.</li> |
| 184 | <li>ALL directories leading to the CGI script must also be readable and the CGI |
| 185 | script itself must be executable for the user under which it will run (which often differs |
| 186 | from the one running the web server - consult your site's documentation or administrator).</li> |
| 187 | <li>The repository file AND the directory containing it must be writable by the same account |
| @@ -213,10 +214,15 @@ | |
| 214 | </p> |
| 215 | <p> |
| 216 | Once deployed, a URL like: <b>http://mydomain.org/cgi-bin/repo/XYZ</b> |
| 217 | will serve up the repository "/home/fossil/repos/XYZ.fossil" (if it exists). |
| 218 | </p> |
| 219 | <p> |
| 220 | Additional options available to the CGI script are documented in the |
| 221 | source code. As of 2017-07-02, the available options are described at |
| 222 | [/artifact/9a52a07b?ln=1777-1824|main.c lines 1777 through 1824]. |
| 223 | </p> |
| 224 | </blockquote> |
| 225 | |
| 226 | <a name="scgi"></a> |
| 227 | <h2>Fossil as SCGI</h2><blockquote> |
| 228 | |
| 229 |