├── .ruby-version
├── .gitignore
├── .travis.yml
├── config.ru
├── public
├── bg.png
├── favicon.ico
├── json-xml-eg.png
├── runscope-eye.png
├── services-eg.png
├── github-config-eg.png
├── runscope-eye-tiny.png
├── services-config-eg.png
├── respondtoit-home-eg.png
├── view.css
├── home.css
├── js
│ └── codemirror
│ │ ├── codemirror.css
│ │ ├── modes
│ │ ├── xml.js
│ │ └── javascript.js
│ │ └── formatting.js
└── css
│ └── bootstrap.no-icons.min.css
├── rakefile
├── Gemfile
├── app.json
├── views
├── tracking.slim
├── index.slim
└── view.slim
├── CONTRIBUTORS.md
├── Gemfile.lock
├── LICENSE
├── README.md
└── app.rb
/.ruby-version:
--------------------------------------------------------------------------------
1 | 2.1.1
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .sass-cache/*
2 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: ruby
2 | services:
3 | - redis-server
--------------------------------------------------------------------------------
/config.ru:
--------------------------------------------------------------------------------
1 | require './app'
2 |
3 | run Sinatra::Application
4 |
--------------------------------------------------------------------------------
/public/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aaronlerch/respond-to-it/HEAD/public/bg.png
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aaronlerch/respond-to-it/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/rakefile:
--------------------------------------------------------------------------------
1 | task :default do
2 | puts "I am a horrible person for not having tests yet."
3 | end
--------------------------------------------------------------------------------
/public/json-xml-eg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aaronlerch/respond-to-it/HEAD/public/json-xml-eg.png
--------------------------------------------------------------------------------
/public/runscope-eye.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aaronlerch/respond-to-it/HEAD/public/runscope-eye.png
--------------------------------------------------------------------------------
/public/services-eg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aaronlerch/respond-to-it/HEAD/public/services-eg.png
--------------------------------------------------------------------------------
/public/github-config-eg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aaronlerch/respond-to-it/HEAD/public/github-config-eg.png
--------------------------------------------------------------------------------
/public/runscope-eye-tiny.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aaronlerch/respond-to-it/HEAD/public/runscope-eye-tiny.png
--------------------------------------------------------------------------------
/public/services-config-eg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aaronlerch/respond-to-it/HEAD/public/services-config-eg.png
--------------------------------------------------------------------------------
/public/respondtoit-home-eg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aaronlerch/respond-to-it/HEAD/public/respondtoit-home-eg.png
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source 'http://rubygems.org'
2 |
3 | ruby '2.1.1'
4 |
5 | gem 'rake'
6 | gem 'rack'
7 | gem 'sinatra'
8 | gem 'slim'
9 | gem 'redis'
10 | gem 'json'
11 | gem 'sinatra-flash'
12 | gem 'rest-client'
13 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "respond-to-it",
3 | "description": "Debug and respond to web hooks like a pro",
4 | "logo": "http://httpresponder.com/favicon.ico",
5 | "repository": "https://github.com/aaronlerch/respond-to-it",
6 | "keywords": ["webhook", "test"],
7 | "success_url": "/",
8 | "addons": [
9 | "redistogo:nano"
10 | ]
11 | }
12 |
--------------------------------------------------------------------------------
/views/tracking.slim:
--------------------------------------------------------------------------------
1 | javascript:
2 | var _gaq = _gaq || [];
3 | _gaq.push(['_setAccount', 'UA-361923-6']);
4 | _gaq.push(['_trackPageview']);
5 | (function() {
6 | var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
7 | ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
8 | var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
9 | })();
10 |
--------------------------------------------------------------------------------
/public/view.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding-top: 20px;
3 | }
4 |
5 | .page-header {
6 | border: none;
7 | margin: 0;
8 | }
9 |
10 | .request {
11 | border-bottom: 1px solid #ddd;
12 | }
13 |
14 | p.metadata {
15 | text-align: right;
16 | color: #666;
17 | }
18 |
19 | .form-actions {
20 | padding-left: 30px;
21 | }
22 |
23 | input[type="submit"] {
24 | width: auto;
25 | }
26 |
27 | .form-actions span#destroy-note {
28 | margin-top: 9px;
29 | font-size: 20px;
30 | margin-right: 20px;
31 | }
32 |
33 | .CodeMirror {
34 | border: 1px solid #ddd;
35 | }
36 |
--------------------------------------------------------------------------------
/CONTRIBUTORS.md:
--------------------------------------------------------------------------------
1 | # Contributors to `respond-to-it`
2 |
3 | Created and maintained by [Aaron Lerch](https://github.com/aaronlerch).
4 |
5 | Additional contributions by:
6 |
7 | * [Andrew Dunkman](https://github.com/adunkman): UX help at
8 | [Codemash](http://codemash.org) and general moral support.
9 | * [Brian Cantoni](https://github.com/bcantoni): added support for
10 | catching the PUT method
11 | * [Owen Mockler](https://github.com/omockler): fixing some modal display
12 | issues in Chrome
13 | * [Benjamin Wohlwend](https://github.com/piquadrat): hooking up the
14 | super-sweet auto-deploy-to-heroku-like-a-boss button!
15 | * [Jackson Owens](https://github.com/jbowens): adding the 'Clear now'
16 | capability for advanced high-volume users like himself.
17 |
18 | You folks rock! Thank you!
19 |
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: http://rubygems.org/
3 | specs:
4 | json (1.8.1)
5 | mime-types (2.4.3)
6 | netrc (0.8.0)
7 | rack (1.5.2)
8 | rack-protection (1.5.3)
9 | rack
10 | rake (10.3.2)
11 | redis (3.1.0)
12 | rest-client (1.7.2)
13 | mime-types (>= 1.16, < 3.0)
14 | netrc (~> 0.7)
15 | sinatra (1.4.5)
16 | rack (~> 1.4)
17 | rack-protection (~> 1.4)
18 | tilt (~> 1.3, >= 1.3.4)
19 | sinatra-flash (0.3.0)
20 | sinatra (>= 1.0.0)
21 | slim (2.1.0)
22 | temple (~> 0.6.9)
23 | tilt (>= 1.3.3, < 2.1)
24 | temple (0.6.9)
25 | tilt (1.4.1)
26 |
27 | PLATFORMS
28 | ruby
29 |
30 | DEPENDENCIES
31 | json
32 | rack
33 | rake
34 | redis
35 | rest-client
36 | sinatra
37 | sinatra-flash
38 | slim
39 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (C) 2012 Aaron Lerch
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of
4 | this software and associated documentation files (the "Software"), to deal in
5 | the Software without restriction, including without limitation the rights to
6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7 | of the Software, and to permit persons to whom the Software is furnished to do
8 | so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in all
11 | copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | SOFTWARE.
20 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | > **Warning**
2 | >
3 | > A note from @aaronlerch: This project has been running for years on a free heroku app tier. The dependencies are out of date and security holes have been discovered in those dependencies over time. The entire project needs a refresh, which I won't be doing. If you are seeking to catch and analyze http traffic for webhooks, I recommend https://ngrok.com/ and running a simple local server.
4 | >
5 | > If anybody is still using http://httpresponder.com/ then I wish you the best and thank you for using this simple little tool!
6 |
7 | # HTTP Responder
8 |
9 | http://httpresponder.com/ is a web hook debugging and stubbing tool. It logs web hook requests, but unlike other tools it also allows the configuration of a default response for JSON and XML requests.
10 |
11 | ## Web Hooks
12 |
13 | Web hooks have traditionally been (and continue to be) one-way notifications over HTTP. Tools like http://httpresponder.com/ or http://requestb.in/ exist to make it easier to analyze web hook behavior when implementing a service to process the hook's request. (Think "glorified `puts` statement.")
14 |
15 | ## Web Hooks as Workflow
16 |
17 | Increasingly, web hooks are not only used for push notifications, but can also be used in a workflow scenario: the response to a web hook request can instruct the calling server on what behavior to execute next. A good example of this is [Twilio](http://twilio.com/). An entire call flow is implemented through a series of web hooks that respond with XML defining the next set of actions to take.
18 |
19 | ## Contributions
20 |
21 | Written by [Aaron Lerch](https://github.com/aaronlerch). For additional
22 | contributors, who are awesome, see [CONTRIBUTORS](CONTRIBUTORS.md).
23 |
--------------------------------------------------------------------------------
/public/home.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding-top: 60px;
3 | background-image: url(/bg.png);
4 | }
5 |
6 | form {
7 | margin: 0px;
8 | }
9 |
10 | table {
11 | margin-bottom: 0px;
12 | }
13 |
14 | table tbody {
15 | margin: 0;
16 | padding: 0;
17 | border: 0;
18 | font-weight: normal;
19 | font-style: normal;
20 | font-size: 100%;
21 | line-height: 1;
22 | font-family: inherit;
23 | }
24 |
25 | table td {
26 | vertical-align: middle;
27 | border: none;
28 | white-space: nowrap;
29 | text-align: center;
30 | }
31 |
32 | td + td {
33 | width: 100%;
34 | }
35 |
36 | table h1 {
37 | margin: 0;
38 | }
39 |
40 | #path {
41 | font-size: 40px;
42 | width: 230px;
43 | height: auto;
44 | color: black;
45 | margin: 0;
46 | }
47 |
48 | #gotopath {
49 | padding: 20px;
50 | font-size: 40px;
51 | }
52 |
53 | .hero-unit {
54 | background: rgba(0, 0, 0, 0.1);
55 | padding: 20px;
56 | }
57 |
58 | h1, h2, h3, h4, h5, h6 {
59 | text-shadow: #fff 1px 1px 1px;
60 | }
61 |
62 | .title {
63 | text-align: center;
64 | }
65 |
66 | .title h1 {
67 | text-shadow: #fff 1px 1px 3px;
68 | padding-top: 60px;
69 | font-size: 400%;
70 | }
71 |
72 | .title p {
73 | font-size: 18px;
74 | font-weight: 200;
75 | padding-bottom: 40px;
76 | line-height: 27px;
77 | }
78 |
79 | div#explain {
80 | margin-top: 60px;
81 | background: rgba(0, 0, 0, 0.6);
82 | color: white;
83 | text-shadow: none;
84 | }
85 |
86 | div#explain .container {
87 | padding-top: 40px;
88 | padding-bottom: 60px;
89 | }
90 |
91 | div#explain .title h1 {
92 | padding-bottom: 50px;
93 | }
94 |
95 | div#explain h1 {
96 | text-shadow: none;
97 | color: white;
98 | }
99 |
100 | div#explain p.heading {
101 | font-size: 200%;
102 | line-height: 30px;
103 | }
104 |
105 | div#explain a {
106 | color: #ffffff;
107 | text-decoration: underline;
108 | }
109 |
110 | .steps .row {
111 | padding-top: 20px;
112 | }
113 |
114 | div#solve {
115 | background: rgba(0, 0, 0, 0.3);
116 | }
117 |
118 | div#solve .container {
119 | padding-top: 40px;
120 | padding-bottom: 60px;
121 | }
122 |
123 | div#solve p.heading {
124 | font-size: 200%;
125 | line-height: 30px;
126 | }
127 |
128 | div#solve .title h1 {
129 | padding-bottom: 50px;
130 | }
131 |
132 | #get-started .container {
133 | padding-bottom: 150px;
134 | }
135 |
136 | .rotated {
137 | -moz-transform: rotate(-90deg);
138 | -webkit-transform: rotate(-90deg);
139 | transform: rotate(-90deg);
140 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1)
141 | }
142 |
143 | .right {
144 | text-align: right;
145 | }
146 |
147 | footer {
148 | margin-top: 30px;
149 | padding-bottom: 10px;
150 | border: none;
151 | }
152 |
153 | footer p {
154 | text-align: center;
155 | }
156 |
157 | footer a {
158 | color: #000;
159 | }
160 |
161 | footer a:hover {
162 | color: #000;
163 | }
164 |
--------------------------------------------------------------------------------
/public/js/codemirror/codemirror.css:
--------------------------------------------------------------------------------
1 | .CodeMirror {
2 | line-height: 1em;
3 | font-family: monospace;
4 | }
5 |
6 | .CodeMirror-scroll {
7 | overflow: auto;
8 | height: 300px;
9 | /* This is needed to prevent an IE[67] bug where the scrolled content
10 | is visible outside of the scrolling box. */
11 | position: relative;
12 | }
13 |
14 | .CodeMirror-gutter {
15 | position: absolute; left: 0; top: 0;
16 | z-index: 10;
17 | background-color: #f7f7f7;
18 | border-right: 1px solid #eee;
19 | min-width: 2em;
20 | height: 100%;
21 | }
22 | .CodeMirror-gutter-text {
23 | color: #aaa;
24 | text-align: right;
25 | padding: .4em .2em .4em .4em;
26 | white-space: pre !important;
27 | }
28 | .CodeMirror-lines {
29 | padding: .4em;
30 | }
31 |
32 | .CodeMirror pre {
33 | -moz-border-radius: 0;
34 | -webkit-border-radius: 0;
35 | -o-border-radius: 0;
36 | border-radius: 0;
37 | border-width: 0; margin: 0; padding: 0; background: transparent;
38 | font-family: inherit;
39 | font-size: inherit;
40 | padding: 0; margin: 0;
41 | white-space: pre;
42 | word-wrap: normal;
43 | }
44 |
45 | .CodeMirror-wrap pre {
46 | word-wrap: break-word;
47 | white-space: pre-wrap;
48 | }
49 | .CodeMirror-wrap .CodeMirror-scroll {
50 | overflow-x: hidden;
51 | }
52 |
53 | .CodeMirror textarea {
54 | outline: none !important;
55 | }
56 |
57 | .CodeMirror pre.CodeMirror-cursor {
58 | z-index: 10;
59 | position: absolute;
60 | visibility: hidden;
61 | border-left: 1px solid black;
62 | }
63 | .CodeMirror-focused pre.CodeMirror-cursor {
64 | visibility: visible;
65 | }
66 |
67 | span.CodeMirror-selected { background: #d9d9d9; }
68 | .CodeMirror-focused span.CodeMirror-selected { background: #d2dcf8; }
69 |
70 | .CodeMirror-searching {background: #ffa;}
71 |
72 | /* Default theme */
73 |
74 | .cm-s-default span.cm-keyword {color: #708;}
75 | .cm-s-default span.cm-atom {color: #219;}
76 | .cm-s-default span.cm-number {color: #164;}
77 | .cm-s-default span.cm-def {color: #00f;}
78 | .cm-s-default span.cm-variable {color: black;}
79 | .cm-s-default span.cm-variable-2 {color: #05a;}
80 | .cm-s-default span.cm-variable-3 {color: #085;}
81 | .cm-s-default span.cm-property {color: black;}
82 | .cm-s-default span.cm-operator {color: black;}
83 | .cm-s-default span.cm-comment {color: #a50;}
84 | .cm-s-default span.cm-string {color: #a11;}
85 | .cm-s-default span.cm-string-2 {color: #f50;}
86 | .cm-s-default span.cm-meta {color: #555;}
87 | .cm-s-default span.cm-error {color: #f00;}
88 | .cm-s-default span.cm-qualifier {color: #555;}
89 | .cm-s-default span.cm-builtin {color: #30a;}
90 | .cm-s-default span.cm-bracket {color: #cc7;}
91 | .cm-s-default span.cm-tag {color: #170;}
92 | .cm-s-default span.cm-attribute {color: #00c;}
93 | .cm-s-default span.cm-header {color: #a0a;}
94 | .cm-s-default span.cm-quote {color: #090;}
95 | .cm-s-default span.cm-hr {color: #999;}
96 | .cm-s-default span.cm-link {color: #00c;}
97 |
98 | span.cm-header, span.cm-strong {font-weight: bold;}
99 | span.cm-em {font-style: italic;}
100 | span.cm-emstrong {font-style: italic; font-weight: bold;}
101 | span.cm-link {text-decoration: underline;}
102 |
103 | div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
104 | div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
105 |
--------------------------------------------------------------------------------
/views/index.slim:
--------------------------------------------------------------------------------
1 | doctype html
2 | html
3 | head
4 | title HTTP Responder: debug and stub webhooks like a pro.
5 | link href=url("/css/bootstrap.no-icons.min.css") rel="stylesheet"
6 | link href="//netdna.bootstrapcdn.com/font-awesome/2.0/css/font-awesome.css" rel="stylesheet"
7 | link rel="stylesheet" href=url("/home.css")
8 | script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" type="text/javascript"
9 | javascript:
10 | function goToPath() {
11 | $p = escape($.trim($('#path').val()));
12 | if ($p === '') { return false; }
13 | document.location.href='/' + $p + '?view';
14 | return false;
15 | };
16 |
17 | $(document).ready(function() {
18 | $('a#gotopath').click(goToPath);
19 | $('form#go-path').submit(goToPath);
20 | $('a#goto-top').click(function() {
21 | $('body').animate({scrollTop: 0}, {
22 | duration: 1000,
23 | complete: function() { $('#path').focus(); }
24 | });
25 | return false;
26 | });
27 | });
28 |
29 | javascript:
30 | var _gaq = _gaq || [];
31 | _gaq.push(['_setAccount', 'UA-361923-6']);
32 | _gaq.push(['_trackPageview']);
33 | (function() {
34 | var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
35 | ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
36 | var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
37 | })();
38 |
39 | body
40 | a#top
41 | .container
42 | .row
43 | .title.span12
44 | h1 Debug web hooks like a pro.
45 | .row
46 | .title.span8.offset2
47 | p Create an endpoint to collect and respond to web hooks. View the last several requests, and configure canned responses in both JSON and XML.
48 | .hero-unit
49 | table
50 | tr
51 | td
52 | h1
53 | | httpresponder.com/
54 | td
55 | form#go-path
56 | input type="text" name="path" id="path"
57 | td
58 | a#gotopath.btn.btn-primary.btn-large GO
59 | .row
60 | .span4
61 | h3 Vanity URLs
62 | p
63 | span style='text-decoration: underline;' http://httpresponder.com/my-special-endpoint
64 | br
65 | | You choose your own URL, nothing auto-generated here.
66 | .span4
67 | h3 Custom Responses
68 | p Configure JSON or XML responses for requests that specify an Accept header with application/json or application/xml. Useful for stubbing out a web hook that participates in a workflow.
69 | .span4
70 | h3 Analyze and Debug
71 | p View and debug the last several requests made to your URL. See headers and parameters/body information.
72 |
73 | #explain
74 | .container
75 | .row
76 | .span12.title
77 | h1 What is HTTP Responder?
78 | .steps
79 | .row
80 | .span12
81 | p.heading
82 | | Some services expose
83 | a href="https://www.google.com/search?q=web+hook" web hooks
84 | | .
85 | .row
86 | .span12
87 | img src=url("/services-eg.png")
88 | .row
89 | .offset4
90 | p.heading You know, where you give them a URL to hit.
91 | .row
92 | .span12.right
93 | img src=url("/services-config-eg.png")
94 | .row
95 | .span7
96 | p.heading Sometimes you want to inspect the POST before you point the hook to your app,
97 | .row
98 | .offset4
99 | p.heading or you want to test out what happens if you respond with {something},
100 | .row
101 | .span8
102 | p.heading
103 | | but making a website just to test a response is work you
104 | em shouldn't have to do.
105 | #solve
106 | .container
107 | .row
108 | .span12.title
109 | h1 That's where we come in.
110 | .steps
111 | .row
112 | .span12
113 | p.heading Create a new endpoint,
114 | .row
115 | .span12
116 | img src=url("/respondtoit-home-eg.png")
117 | .row
118 | .offset5.span7
119 | p.heading (optionally) configure some canned JSON or XML to be returned,
120 | .row
121 | .span12.right
122 | img src=url("/json-xml-eg.png")
123 | .row
124 | .span5
125 | p.heading and then point your service to us and inspect the requests.
126 | .row
127 | .span12
128 | img src=url("/github-config-eg.png")
129 | #get-started
130 | .container
131 | .row
132 | .span12.title
133 | h1
134 | | Okay, got it?
135 | a#goto-top href='#top' Let's get started!
136 | br
137 | br
138 | /span.rotated style='display: inline-block;' ➲
139 | i.icon-chevron-up
140 |
141 | footer
142 | p
143 | | © Aaron Lerch 2012
144 | | |
145 | a href='http://twitter.com/aaronlerch' twitter
146 | | |
147 | a href='http://github.com/aaronlerch' github
148 |
149 | a href="http://github.com/aaronlerch/respond-to-it"
150 | img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub"
--------------------------------------------------------------------------------
/public/js/codemirror/modes/xml.js:
--------------------------------------------------------------------------------
1 | CodeMirror.defineMode("xml", function(config, parserConfig) {
2 | var indentUnit = config.indentUnit;
3 | var Kludges = parserConfig.htmlMode ? {
4 | autoSelfClosers: {"br": true, "img": true, "hr": true, "link": true, "input": true,
5 | "meta": true, "col": true, "frame": true, "base": true, "area": true},
6 | doNotIndent: {"pre": true},
7 | allowUnquoted: true
8 | } : {autoSelfClosers: {}, doNotIndent: {}, allowUnquoted: false};
9 | var alignCDATA = parserConfig.alignCDATA;
10 |
11 | // Return variables for tokenizers
12 | var tagName, type;
13 |
14 | function inText(stream, state) {
15 | function chain(parser) {
16 | state.tokenize = parser;
17 | return parser(stream, state);
18 | }
19 |
20 | var ch = stream.next();
21 | if (ch == "<") {
22 | if (stream.eat("!")) {
23 | if (stream.eat("[")) {
24 | if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>"));
25 | else return null;
26 | }
27 | else if (stream.match("--")) return chain(inBlock("comment", "-->"));
28 | else if (stream.match("DOCTYPE", true, true)) {
29 | stream.eatWhile(/[\w\._\-]/);
30 | return chain(doctype(1));
31 | }
32 | else return null;
33 | }
34 | else if (stream.eat("?")) {
35 | stream.eatWhile(/[\w\._\-]/);
36 | state.tokenize = inBlock("meta", "?>");
37 | return "meta";
38 | }
39 | else {
40 | type = stream.eat("/") ? "closeTag" : "openTag";
41 | stream.eatSpace();
42 | tagName = "";
43 | var c;
44 | while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c;
45 | state.tokenize = inTag;
46 | return "tag";
47 | }
48 | }
49 | else if (ch == "&") {
50 | stream.eatWhile(/[^;]/);
51 | stream.eat(";");
52 | return "atom";
53 | }
54 | else {
55 | stream.eatWhile(/[^&<]/);
56 | return null;
57 | }
58 | }
59 |
60 | function inTag(stream, state) {
61 | var ch = stream.next();
62 | if (ch == ">" || (ch == "/" && stream.eat(">"))) {
63 | state.tokenize = inText;
64 | type = ch == ">" ? "endTag" : "selfcloseTag";
65 | return "tag";
66 | }
67 | else if (ch == "=") {
68 | type = "equals";
69 | return null;
70 | }
71 | else if (/[\'\"]/.test(ch)) {
72 | state.tokenize = inAttribute(ch);
73 | return state.tokenize(stream, state);
74 | }
75 | else {
76 | stream.eatWhile(/[^\s\u00a0=<>\"\'\/?]/);
77 | return "word";
78 | }
79 | }
80 |
81 | function inAttribute(quote) {
82 | return function(stream, state) {
83 | while (!stream.eol()) {
84 | if (stream.next() == quote) {
85 | state.tokenize = inTag;
86 | break;
87 | }
88 | }
89 | return "string";
90 | };
91 | }
92 |
93 | function inBlock(style, terminator) {
94 | return function(stream, state) {
95 | while (!stream.eol()) {
96 | if (stream.match(terminator)) {
97 | state.tokenize = inText;
98 | break;
99 | }
100 | stream.next();
101 | }
102 | return style;
103 | };
104 | }
105 | function doctype(depth) {
106 | return function(stream, state) {
107 | var ch;
108 | while ((ch = stream.next()) != null) {
109 | if (ch == "<") {
110 | state.tokenize = doctype(depth + 1);
111 | return state.tokenize(stream, state);
112 | } else if (ch == ">") {
113 | if (depth == 1) {
114 | state.tokenize = inText;
115 | break;
116 | } else {
117 | state.tokenize = doctype(depth - 1);
118 | return state.tokenize(stream, state);
119 | }
120 | }
121 | }
122 | return "meta";
123 | };
124 | }
125 |
126 | var curState, setStyle;
127 | function pass() {
128 | for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);
129 | }
130 | function cont() {
131 | pass.apply(null, arguments);
132 | return true;
133 | }
134 |
135 | function pushContext(tagName, startOfLine) {
136 | var noIndent = Kludges.doNotIndent.hasOwnProperty(tagName) || (curState.context && curState.context.noIndent);
137 | curState.context = {
138 | prev: curState.context,
139 | tagName: tagName,
140 | indent: curState.indented,
141 | startOfLine: startOfLine,
142 | noIndent: noIndent
143 | };
144 | }
145 | function popContext() {
146 | if (curState.context) curState.context = curState.context.prev;
147 | }
148 |
149 | function element(type) {
150 | if (type == "openTag") {
151 | curState.tagName = tagName;
152 | return cont(attributes, endtag(curState.startOfLine));
153 | } else if (type == "closeTag") {
154 | var err = false;
155 | if (curState.context) {
156 | err = curState.context.tagName != tagName;
157 | } else {
158 | err = true;
159 | }
160 | if (err) setStyle = "error";
161 | return cont(endclosetag(err));
162 | }
163 | return cont();
164 | }
165 | function endtag(startOfLine) {
166 | return function(type) {
167 | if (type == "selfcloseTag" ||
168 | (type == "endTag" && Kludges.autoSelfClosers.hasOwnProperty(curState.tagName.toLowerCase())))
169 | return cont();
170 | if (type == "endTag") {pushContext(curState.tagName, startOfLine); return cont();}
171 | return cont();
172 | };
173 | }
174 | function endclosetag(err) {
175 | return function(type) {
176 | if (err) setStyle = "error";
177 | if (type == "endTag") { popContext(); return cont(); }
178 | setStyle = "error";
179 | return cont(arguments.callee);
180 | }
181 | }
182 |
183 | function attributes(type) {
184 | if (type == "word") {setStyle = "attribute"; return cont(attributes);}
185 | if (type == "equals") return cont(attvalue, attributes);
186 | if (type == "string") {setStyle = "error"; return cont(attributes);}
187 | return pass();
188 | }
189 | function attvalue(type) {
190 | if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return cont();}
191 | if (type == "string") return cont(attvaluemaybe);
192 | return pass();
193 | }
194 | function attvaluemaybe(type) {
195 | if (type == "string") return cont(attvaluemaybe);
196 | else return pass();
197 | }
198 |
199 | return {
200 | startState: function() {
201 | return {tokenize: inText, cc: [], indented: 0, startOfLine: true, tagName: null, context: null};
202 | },
203 |
204 | token: function(stream, state) {
205 | if (stream.sol()) {
206 | state.startOfLine = true;
207 | state.indented = stream.indentation();
208 | }
209 | if (stream.eatSpace()) return null;
210 |
211 | setStyle = type = tagName = null;
212 | var style = state.tokenize(stream, state);
213 | state.type = type;
214 | if ((style || type) && style != "comment") {
215 | curState = state;
216 | while (true) {
217 | var comb = state.cc.pop() || element;
218 | if (comb(type || style)) break;
219 | }
220 | }
221 | state.startOfLine = false;
222 | return setStyle || style;
223 | },
224 |
225 | indent: function(state, textAfter, fullLine) {
226 | var context = state.context;
227 | if ((state.tokenize != inTag && state.tokenize != inText) ||
228 | context && context.noIndent)
229 | return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0;
230 | if (alignCDATA && /View it here.' });
101 | $this.popover('show');
102 | setTimeout(function() { $this.popover('hide'); }, 5000);
103 | }
104 |
105 | javascript:
106 | var _gaq = _gaq || [];
107 | _gaq.push(['_setAccount', 'UA-361923-6']);
108 | _gaq.push(['_trackPageview']);
109 | (function() {
110 | var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
111 | ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
112 | var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
113 | })();
114 |
115 | body
116 | .container
117 | - if supports_runscope?
118 | .pull-right
119 | - if !runscope_authenticated?
120 | a href="https://www.runscope.com/signin/oauth/authorize?response_type=code&client_id=#{RUNSCOPE_ID}&redirect_uri=#{url("/runscope/oauth")}&scope=api:read%20message:write%20bucket:auth_token&state=#{runscope_state}"
121 | img title="Log in to Runscope" src=url("/runscope-eye.png")
122 | - else
123 | i.icon-ok
124 | |
125 | a href="https://www.runscope.com/"
126 | img title="Authenticated with Runscope" src=url("/runscope-eye-tiny.png")
127 | .page-header
128 | h2
129 | a href=url("/") = url("/").chomp("/")
130 | = request.path_info
131 |
132 | - if flash[:notice]
133 | .row
134 | .span12
135 | .alert.alert-success.fade.in
136 | a.close data-dismiss="alert" href="#" x
137 | == flash[:notice]
138 |
139 | - if flash[:warning]
140 | .row
141 | .span12
142 | .alert.alert-error.fade.in
143 | a.close data-dismiss="alert" href="#" x
144 | == flash[:warning]
145 |
146 | - if known?
147 | ul.nav.nav-tabs
148 | li[class=active_if_known]
149 | a data-toggle="tab" href='#requests'
150 | h4 Requests
151 | li[class=active_if_unknown]
152 | a data-toggle="tab" href='#response'
153 | h4 Response
154 | - else
155 | .row
156 | .span12
157 | .alert.alert-block
158 | a.close data-dismiss="alert" href='#' x
159 | p
160 | strong You must first create this endpoint
161 | | , even if you're not going to provide a response. Otherwise we will respond with a
162 | strong< 404
163 | | , like, forever.
164 | p
165 | a#create.btn.btn-small href='#' Create it Empty
166 | span ...or fill out the content below and create it.
167 |
168 | .tab-content
169 | - if known?
170 | #requests.tab-pane[class=active_if_known]
171 | .alert
172 | strong
173 | | Requests are only stored for 2 days and then deleted.
174 | a.clear href='?clear' Clear now
175 | - requests.each do |req|
176 | .row
177 | .span2
178 | p.metadata
179 | | #{req['time'].strftime('%m/%d/%Y %H:%M:%S.%L UTC')}
180 | br
181 | | #{req['ip']}
182 | br
183 | - if runscope_authenticated?
184 | a.runscope-export rel="clickover" href=url("/runscope/export?code=#{code}&id=#{req['id']}") data-placement="bottom" data-trigger="manual" data-html="true"
185 | img title="Export to your default Runscope bucket" src=url("/runscope-eye-tiny.png")
186 | .span10.request
187 | h3 #{req['method']} #{req['path']}
188 | h4
189 | em Headers
190 | - if !req['headers'].nil? and !req['headers'].empty?
191 | p.request-headers
192 | - req['headers'].sort.each do |name,value|
193 | strong #{name}:
194 | | #{value}
195 | br
196 | - if !req['params'].nil? and !req['params'].empty?
197 | h4
198 | em Parameters
199 | p
200 | - req['params'].each do |name,value|
201 | strong #{name}:
202 | | #{value}
203 | br
204 | - elsif !req['body'].nil?
205 | h4
206 | em Body
207 | p
208 | | #{req['body']}
209 |
210 | #response.tab-pane[class=active_if_unknown]
211 | form#response-form method="POST" action=url("/#{code}?view")
212 | .row
213 | .span6
214 | h2
215 | | { JSON }
216 | textarea.span8#json name="json" rows="15"
217 | = config["json"] if known?
218 | .span6
219 | h2 < XML >
220 | textarea.span8#xml name="xml" rows="15"
221 | = config["xml"] if known?
222 | .form-actions
223 | input.btn.btn-large.btn-primary type="submit" value="#{unknown? ? 'Create' : 'Update'}"
224 | - if known?
225 | a#destroy-prompt.btn.btn-large.btn-danger.pull-right role="button" data-toggle="modal" href='#prompt-for-destroy' Destroy
226 | span#destroy-note.pull-right be tidy! clean up after yourself
227 |
228 | #prompt-for-destroy.modal.hide.fade aria-labelledby="destroy-modal-label" aria-hidden="true"
229 | .modal-header
230 | button.close type="button" data-dismiss="modal" aria-hidden="true" x
231 | h3#destroy-modal-label Destroy Endpoint?
232 | .modal-body
233 | p Destroying the endpoint will purge the response JSON and XML, as well as all stored requests.
234 | .modal-footer
235 | a#destroy.btn.btn-danger href='#' Destroy
236 | a#cancel-destroy.btn href='#' Cancel
237 |
--------------------------------------------------------------------------------
/public/js/codemirror/formatting.js:
--------------------------------------------------------------------------------
1 | // ============== Formatting extensions ============================
2 | // A common storage for all mode-specific formatting features
3 | if (!CodeMirror.modeExtensions) CodeMirror.modeExtensions = {};
4 |
5 | // Returns the extension of the editor's current mode
6 | CodeMirror.defineExtension("getModeExt", function () {
7 | return CodeMirror.modeExtensions[this.getOption("mode")];
8 | });
9 |
10 | // If the current mode is 'htmlmixed', returns the extension of a mode located at
11 | // the specified position (can be htmlmixed, css or javascript). Otherwise, simply
12 | // returns the extension of the editor's current mode.
13 | CodeMirror.defineExtension("getModeExtAtPos", function (pos) {
14 | var token = this.getTokenAt(pos);
15 | if (token && token.state && token.state.mode)
16 | return CodeMirror.modeExtensions[token.state.mode == "html" ? "htmlmixed" : token.state.mode];
17 | else
18 | return this.getModeExt();
19 | });
20 |
21 | // Comment/uncomment the specified range
22 | CodeMirror.defineExtension("commentRange", function (isComment, from, to) {
23 | var curMode = this.getModeExtAtPos(this.getCursor());
24 | if (isComment) { // Comment range
25 | var commentedText = this.getRange(from, to);
26 | this.replaceRange(curMode.commentStart + this.getRange(from, to) + curMode.commentEnd
27 | , from, to);
28 | if (from.line == to.line && from.ch == to.ch) { // An empty comment inserted - put cursor inside
29 | this.setCursor(from.line, from.ch + curMode.commentStart.length);
30 | }
31 | }
32 | else { // Uncomment range
33 | var selText = this.getRange(from, to);
34 | var startIndex = selText.indexOf(curMode.commentStart);
35 | var endIndex = selText.lastIndexOf(curMode.commentEnd);
36 | if (startIndex > -1 && endIndex > -1 && endIndex > startIndex) {
37 | // Take string till comment start
38 | selText = selText.substr(0, startIndex)
39 | // From comment start till comment end
40 | + selText.substring(startIndex + curMode.commentStart.length, endIndex)
41 | // From comment end till string end
42 | + selText.substr(endIndex + curMode.commentEnd.length);
43 | }
44 | this.replaceRange(selText, from, to);
45 | }
46 | });
47 |
48 | // Applies automatic mode-aware indentation to the specified range
49 | CodeMirror.defineExtension("autoIndentRange", function (from, to) {
50 | var cmInstance = this;
51 | this.operation(function () {
52 | for (var i = from.line; i <= to.line; i++) {
53 | cmInstance.indentLine(i);
54 | }
55 | });
56 | });
57 |
58 | // Applies automatic formatting to the specified range
59 | CodeMirror.defineExtension("autoFormatRange", function (from, to) {
60 | var absStart = this.indexFromPos(from);
61 | var absEnd = this.indexFromPos(to);
62 | // Insert additional line breaks where necessary according to the
63 | // mode's syntax
64 | var res = this.getModeExt().autoFormatLineBreaks(this.getValue(), absStart, absEnd);
65 | var cmInstance = this;
66 |
67 | // Replace and auto-indent the range
68 | this.operation(function () {
69 | cmInstance.replaceRange(res, from, to);
70 | var startLine = cmInstance.posFromIndex(absStart).line;
71 | var endLine = cmInstance.posFromIndex(absStart + res.length).line;
72 | for (var i = startLine; i <= endLine; i++) {
73 | cmInstance.indentLine(i);
74 | }
75 | });
76 | });
77 |
78 | // Define extensions for a few modes
79 |
80 | CodeMirror.modeExtensions["css"] = {
81 | commentStart: "/*",
82 | commentEnd: "*/",
83 | wordWrapChars: [";", "\\{", "\\}"],
84 | autoFormatLineBreaks: function (text) {
85 | return text.replace(new RegExp("(;|\\{|\\})([^\r\n])", "g"), "$1\n$2");
86 | }
87 | };
88 |
89 | CodeMirror.modeExtensions["javascript"] = {
90 | commentStart: "/*",
91 | commentEnd: "*/",
92 | wordWrapChars: [";", "\\{", "\\}"],
93 |
94 | getNonBreakableBlocks: function (text) {
95 | var nonBreakableRegexes = [
96 | new RegExp("for\\s*?\\(([\\s\\S]*?)\\)"),
97 | new RegExp("'([\\s\\S]*?)('|$)"),
98 | new RegExp("\"([\\s\\S]*?)(\"|$)"),
99 | new RegExp("//.*([\r\n]|$)")
100 | ];
101 | var nonBreakableBlocks = new Array();
102 | for (var i = 0; i < nonBreakableRegexes.length; i++) {
103 | var curPos = 0;
104 | while (curPos < text.length) {
105 | var m = text.substr(curPos).match(nonBreakableRegexes[i]);
106 | if (m != null) {
107 | nonBreakableBlocks.push({
108 | start: curPos + m.index,
109 | end: curPos + m.index + m[0].length
110 | });
111 | curPos += m.index + Math.max(1, m[0].length);
112 | }
113 | else { // No more matches
114 | break;
115 | }
116 | }
117 | }
118 | nonBreakableBlocks.sort(function (a, b) {
119 | return a.start - b.start;
120 | });
121 |
122 | return nonBreakableBlocks;
123 | },
124 |
125 | autoFormatLineBreaks: function (text) {
126 | var curPos = 0;
127 | var reLinesSplitter = new RegExp("(;|\\{|\\})([^\r\n])", "g");
128 | var nonBreakableBlocks = this.getNonBreakableBlocks(text);
129 | if (nonBreakableBlocks != null) {
130 | var res = "";
131 | for (var i = 0; i < nonBreakableBlocks.length; i++) {
132 | if (nonBreakableBlocks[i].start > curPos) { // Break lines till the block
133 | res += text.substring(curPos, nonBreakableBlocks[i].start).replace(reLinesSplitter, "$1\n$2");
134 | curPos = nonBreakableBlocks[i].start;
135 | }
136 | if (nonBreakableBlocks[i].start <= curPos
137 | && nonBreakableBlocks[i].end >= curPos) { // Skip non-breakable block
138 | res += text.substring(curPos, nonBreakableBlocks[i].end);
139 | curPos = nonBreakableBlocks[i].end;
140 | }
141 | }
142 | if (curPos < text.length - 1) {
143 | res += text.substr(curPos).replace(reLinesSplitter, "$1\n$2");
144 | }
145 | return res;
146 | }
147 | else {
148 | return text.replace(reLinesSplitter, "$1\n$2");
149 | }
150 | }
151 | };
152 |
153 | CodeMirror.modeExtensions["xml"] = {
154 | commentStart: "",
156 | wordWrapChars: [">"],
157 |
158 | autoFormatLineBreaks: function (text) {
159 | var lines = text.split("\n");
160 | var reProcessedPortion = new RegExp("(^\\s*?<|^[^<]*?)(.+)(>\\s*?$|[^>]*?$)");
161 | var reOpenBrackets = new RegExp("<", "g");
162 | var reCloseBrackets = new RegExp("(>)([^\r\n])", "g");
163 | for (var i = 0; i < lines.length; i++) {
164 | var mToProcess = lines[i].match(reProcessedPortion);
165 | if (mToProcess != null && mToProcess.length > 3) { // The line starts with whitespaces and ends with whitespaces
166 | lines[i] = mToProcess[1]
167 | + mToProcess[2].replace(reOpenBrackets, "\n$&").replace(reCloseBrackets, "$1\n$2")
168 | + mToProcess[3];
169 | continue;
170 | }
171 | }
172 |
173 | return lines.join("\n");
174 | }
175 | };
176 |
177 | CodeMirror.modeExtensions["htmlmixed"] = {
178 | commentStart: "",
180 | wordWrapChars: [">", ";", "\\{", "\\}"],
181 |
182 | getModeInfos: function (text, absPos) {
183 | var modeInfos = new Array();
184 | modeInfos[0] =
185 | {
186 | pos: 0,
187 | modeExt: CodeMirror.modeExtensions["xml"],
188 | modeName: "xml"
189 | };
190 |
191 | var modeMatchers = new Array();
192 | modeMatchers[0] =
193 | {
194 | regex: new RegExp("]*>|$)", "i"),
195 | modeExt: CodeMirror.modeExtensions["css"],
196 | modeName: "css"
197 | };
198 | modeMatchers[1] =
199 | {
200 | regex: new RegExp("]*>|$)", "i"),
201 | modeExt: CodeMirror.modeExtensions["javascript"],
202 | modeName: "javascript"
203 | };
204 |
205 | var lastCharPos = (typeof (absPos) !== "undefined" ? absPos : text.length - 1);
206 | // Detect modes for the entire text
207 | for (var i = 0; i < modeMatchers.length; i++) {
208 | var curPos = 0;
209 | while (curPos <= lastCharPos) {
210 | var m = text.substr(curPos).match(modeMatchers[i].regex);
211 | if (m != null) {
212 | if (m.length > 1 && m[1].length > 0) {
213 | // Push block begin pos
214 | var blockBegin = curPos + m.index + m[0].indexOf(m[1]);
215 | modeInfos.push(
216 | {
217 | pos: blockBegin,
218 | modeExt: modeMatchers[i].modeExt,
219 | modeName: modeMatchers[i].modeName
220 | });
221 | // Push block end pos
222 | modeInfos.push(
223 | {
224 | pos: blockBegin + m[1].length,
225 | modeExt: modeInfos[0].modeExt,
226 | modeName: modeInfos[0].modeName
227 | });
228 | curPos += m.index + m[0].length;
229 | continue;
230 | }
231 | else {
232 | curPos += m.index + Math.max(m[0].length, 1);
233 | }
234 | }
235 | else { // No more matches
236 | break;
237 | }
238 | }
239 | }
240 | // Sort mode infos
241 | modeInfos.sort(function sortModeInfo(a, b) {
242 | return a.pos - b.pos;
243 | });
244 |
245 | return modeInfos;
246 | },
247 |
248 | autoFormatLineBreaks: function (text, startPos, endPos) {
249 | var modeInfos = this.getModeInfos(text);
250 | var reBlockStartsWithNewline = new RegExp("^\\s*?\n");
251 | var reBlockEndsWithNewline = new RegExp("\n\\s*?$");
252 | var res = "";
253 | // Use modes info to break lines correspondingly
254 | if (modeInfos.length > 1) { // Deal with multi-mode text
255 | for (var i = 1; i <= modeInfos.length; i++) {
256 | var selStart = modeInfos[i - 1].pos;
257 | var selEnd = (i < modeInfos.length ? modeInfos[i].pos : endPos);
258 |
259 | if (selStart >= endPos) { // The block starts later than the needed fragment
260 | break;
261 | }
262 | if (selStart < startPos) {
263 | if (selEnd <= startPos) { // The block starts earlier than the needed fragment
264 | continue;
265 | }
266 | selStart = startPos;
267 | }
268 | if (selEnd > endPos) {
269 | selEnd = endPos;
270 | }
271 | var textPortion = text.substring(selStart, selEnd);
272 | if (modeInfos[i - 1].modeName != "xml") { // Starting a CSS or JavaScript block
273 | if (!reBlockStartsWithNewline.test(textPortion)
274 | && selStart > 0) { // The block does not start with a line break
275 | textPortion = "\n" + textPortion;
276 | }
277 | if (!reBlockEndsWithNewline.test(textPortion)
278 | && selEnd < text.length - 1) { // The block does not end with a line break
279 | textPortion += "\n";
280 | }
281 | }
282 | res += modeInfos[i - 1].modeExt.autoFormatLineBreaks(textPortion);
283 | }
284 | }
285 | else { // Single-mode text
286 | res = modeInfos[0].modeExt.autoFormatLineBreaks(text.substring(startPos, endPos));
287 | }
288 |
289 | return res;
290 | }
291 | };
292 |
--------------------------------------------------------------------------------
/app.rb:
--------------------------------------------------------------------------------
1 | require 'sinatra'
2 | require 'slim'
3 | require 'slim/include'
4 | require 'redis'
5 | require 'json'
6 | require 'sinatra/flash'
7 | require 'securerandom'
8 | require 'rest_client'
9 |
10 | class String
11 | def titlecase
12 | tr('_', ' ').
13 | gsub(/\s+/, ' ').
14 | gsub(/\b\w/){ $`[-1,1] == "'" ? $& : $&.upcase }
15 | end
16 | end
17 |
18 | EXCLUDED_HEADERS = [
19 | 'HTTP_X_FORWARDED_FOR',
20 | 'HTTP_X_REAL_IP',
21 | 'HTTP_X_REQUEST_START',
22 | 'HTTP_X_VARNISH'
23 | ]
24 |
25 | configure :development do
26 | redis_url = (ENV["BOXEN_REDIS_URL"] || "redis://localhost:6379").chomp('/')
27 | uri = URI.parse(redis_url)
28 | REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
29 | end
30 |
31 | configure :production do
32 | uri = URI.parse(ENV["REDISTOGO_URL"])
33 | REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
34 | end
35 |
36 | configure do
37 | enable :sessions
38 | disable :protection
39 | RESERVED_CODES = %w{/runscope/export /runscope/oauth /runscope/logout}
40 | RUNSCOPE_ID = ENV["RESPONDTOIT_RUNSCOPE_ID"]
41 | RUNSCOPE_SECRET = ENV["RESPONDTOIT_RUNSCOPE_SECRET"]
42 | end
43 |
44 | helpers do
45 | def supports_runscope?
46 | RUNSCOPE_ID && RUNSCOPE_SECRET
47 | end
48 |
49 | def runscope_authenticated?
50 | !session[:runscope_access_token].nil?
51 | end
52 |
53 | def requires_runscope
54 | halt(404, "Runscope not supported") if !supports_runscope?
55 | end
56 |
57 | def requires_authenticated_runscope
58 | requires_runscope
59 | halt(404, "Not authenticated with Runscope") if !runscope_authenticated?
60 | end
61 |
62 | def runscope_buckets
63 | session[:runscope_buckets] ||= fill_runscope_buckets
64 | end
65 |
66 | def fill_runscope_buckets
67 | return nil if !session[:runscope_access_token]
68 | response = RestClient.get "https://api.runscope.com/buckets", authorization: "Bearer #{session[:runscope_access_token]}"
69 | if response.code == 200
70 | result = JSON.parse(response)
71 | session[:runscope_buckets] = result["data"].map { |e| { "default" => e["default"], "key" => e["key"], "name" => e["name"] } }
72 | end
73 |
74 | session[:runscope_buckets]
75 | end
76 |
77 | def default_runscope_bucket_key
78 | default_bucket = runscope_buckets.find { |b| b["default"] }
79 | default_bucket["key"] if default_bucket
80 | end
81 |
82 | def runscope_state
83 | session[:runscope_state] ||= SecureRandom.uuid
84 | end
85 |
86 | def block_route_if_restricted
87 | halt(404, "Sorry, this is reserved") if RESERVED_CODES.include? request.path_info
88 | end
89 |
90 | def code
91 | params[:code] || params[:splat][0]
92 | end
93 |
94 | def config_key
95 | "code:#{code}:config"
96 | end
97 |
98 | def requests_key
99 | "code:#{code}:requests"
100 | end
101 |
102 | def analytics_key
103 | "code:#{code}:hits"
104 | end
105 |
106 | def view?
107 | request.query_string =~ /^view$/i
108 | end
109 |
110 | def destroy?
111 | request.query_string =~ /^destroy$/i
112 | end
113 |
114 | def clear?
115 | request.query_string =~ /^clear$/i
116 | end
117 |
118 | def json?
119 | request.accept.first.to_s == "application/json" || params[:format] =~ /json/i
120 | end
121 |
122 | def json
123 | content_type :json
124 | config["json"]
125 | end
126 |
127 | def xml?
128 | request.accept.first.to_s == "application/xml" || params[:format] =~ /xml/i
129 | end
130 |
131 | def xml
132 | content_type :xml
133 | config["xml"]
134 | end
135 |
136 | def known?
137 | config[:known]
138 | end
139 |
140 | def unknown?
141 | !known?
142 | end
143 |
144 | def active_if_unknown
145 | 'active' if unknown?
146 | end
147 |
148 | def active_if_known
149 | 'active' if known?
150 | end
151 |
152 | def config
153 | @config ||= begin
154 | data = REDIS.get config_key
155 | if data.nil?
156 | data = { :known => false }
157 | else
158 | data = JSON.parse(data)
159 | data[:known] = true
160 | end
161 | data
162 | end
163 | end
164 |
165 | def requests
166 | @requests ||= begin
167 | data = REDIS.lrange requests_key, 0, 9
168 | data.map! { |req| JSON.parse(req) }
169 | data.each { |req| req["time"] = Time.at(req["time"].to_f).utc }
170 | end
171 | end
172 |
173 | def store_request
174 | REDIS.multi do
175 | REDIS.lpush requests_key, package_request # append the request to the end
176 | REDIS.ltrim requests_key, 0, 9 # restrict to 10 items (but trim the first part of the list, keeping the last 10)
177 | REDIS.expire requests_key, 172800 # delete all requests after 2 days: 2 * 24 * 60 * 60
178 | end
179 | end
180 |
181 | def clear_requests
182 | REDIS.DEL requests_key
183 | end
184 |
185 | def package_request
186 | {
187 | :id => SecureRandom.uuid,
188 | :time => Time.now.utc.to_f,
189 | :ip => request.ip,
190 | :method => request.request_method.upcase,
191 | :path => request.path,
192 | :headers => package_headers,
193 | :content_type => request.content_type,
194 | :content_length => request.content_length,
195 | :params => request.params,
196 | :body => package_body
197 | }.to_json
198 | end
199 |
200 | def package_headers
201 | pretty = {}
202 | # Select out all HTTP_* headers
203 | allowed_headers = request.env.select { |k,v| k =~ /^HTTP_/ }
204 | # Remove heroku headers
205 | allowed_headers.delete_if { |k,v| k =~ /heroku/i || EXCLUDED_HEADERS.include?(k) }
206 | # Add back CONTENT_LENGTH and CONTENT_TYPE
207 | allowed_headers['CONTENT_LENGTH'] = request.content_length unless request.content_length.nil?
208 | allowed_headers['CONTENT_TYPE'] = request.content_type unless request.content_type.nil?
209 | allowed_headers.each do |k,v|
210 | header = k.dup
211 | header.gsub!(/^HTTP_/, '')
212 | header = header.downcase.titlecase.tr(' ', '-')
213 | pretty[header] = v
214 | end
215 | return pretty
216 | end
217 |
218 | def package_body
219 | request.body.read if ((request.request_method == 'POST' || request.request_method == 'PUT') && !request.form_data?)
220 | end
221 |
222 | def update_analytics
223 | request_method_field = request.request_method.downcase
224 | daily_hit_field = "#{Date.today.to_s}:#{request.request_method.downcase}"
225 | REDIS.multi do
226 | REDIS.hincrby "hits", request_method_field, 1 # Global
227 | REDIS.hincrby "hits", daily_hit_field, 1 # Global, daily
228 | REDIS.hincrby analytics_key, request_method_field, 1 # Per-endpoint
229 | REDIS.hincrby analytics_key, daily_hit_field, 1 # Per-endpoint, daily
230 | end
231 | end
232 | end
233 |
234 | get '/' do
235 | slim :index
236 | end
237 |
238 | # Ensure that all of the following routes are included in RESERVED_CODES
239 |
240 | get '/runscope/oauth' do
241 | requires_runscope
242 | halt(400) if !params[:code]
243 | halt(400) if params[:state] != runscope_state
244 |
245 | response = RestClient.post("https://www.runscope.com/signin/oauth/access_token",
246 | {
247 | client_id: RUNSCOPE_ID,
248 | client_secret: RUNSCOPE_SECRET,
249 | code: params[:code],
250 | grant_type: 'authorization_code',
251 | redirect_uri: url('/runscope/oauth')
252 | })
253 |
254 | if response.code == 200
255 | result = JSON.parse(response)
256 | session[:runscope_access_token] = result["access_token"]
257 | end
258 |
259 | redirect to(session[:last_view] || "/")
260 | end
261 |
262 | get '/runscope/logout' do
263 | session[:runscope_access_token] = session[:runscope_buckets] = nil
264 | redirect to(session[:last_view] || "/")
265 | end
266 |
267 | post '/runscope/export' do
268 | requires_authenticated_runscope
269 |
270 | halt(404, "Unknown request") if !code
271 | bucket_key = params[:bucket_key] || default_runscope_bucket_key
272 | halt(404, "Unable to determine destination bucket") if !bucket_key
273 | req = requests.find { |r| params[:id] && r['id'] == params[:id] }
274 | halt(404, "Unable to find the specified request") if req.nil?
275 |
276 | data = {
277 | request: {
278 | method: req['method'],
279 | url: url(req['path']),
280 | headers: req['headers'] || {},
281 | form: req['params'] || {},
282 | body: req['body'] || '',
283 | timestamp: req['time'].to_f
284 | }
285 | }.to_json
286 |
287 | resp = RestClient.post "https://api.runscope.com/buckets/#{bucket_key}/messages",
288 | data,
289 | { content_type: :json, authorization: "Bearer #{session[:runscope_access_token]}" }
290 |
291 | if resp.code == 200
292 | respData = JSON.parse(resp)
293 | if respData['meta']['error_count'].to_i > 0
294 | puts "Error exporting a request to runscope: #{resp}"
295 | halt(500, "Error exporting the request to Runscope")
296 | end
297 |
298 | # Success! Build the link
299 | "https://www.runscope.com/stream/#{bucket_key}"
300 | end
301 | end
302 |
303 | ['/*.:format?', '/*'].each do |path|
304 | get path do
305 | block_route_if_restricted
306 |
307 | if clear?
308 | clear_requests
309 | return redirect to("/#{code}?view")
310 | end
311 |
312 | if view?
313 | session[:last_view] = request.fullpath
314 | return slim(:view)
315 | end
316 |
317 | return [404, "Um, guess again?"] if unknown?
318 |
319 | store_request
320 | update_analytics
321 | request.session_options[:skip] = true
322 |
323 | if json?
324 | json
325 | elsif xml?
326 | xml
327 | else
328 | "Howdy"
329 | end
330 | end
331 |
332 | post path do
333 | block_route_if_restricted
334 |
335 | if view?
336 | msg = "The response was #{known? ? 'updated' : 'created'} successfully."
337 | if !params[:json].to_s.empty? or !params[:xml].to_s.empty?
338 | msg << " Check out the JSON or XML"
339 | end
340 | config_hash = {:json => params[:json].to_s, :xml => params[:xml].to_s, :updated_at => Time.now.utc.to_i}
341 | REDIS.set config_key, config_hash.to_json
342 | flash[:notice] = msg
343 | redirect to("/#{code}?view")
344 | return
345 | elsif destroy?
346 | REDIS.multi do
347 | REDIS.del config_key
348 | REDIS.del requests_key
349 | REDIS.del analytics_key
350 | end
351 | flash[:warning] = "The endpoint was destroyed."
352 | redirect to("/#{code}?view")
353 | return
354 | end
355 |
356 | return 404 if unknown?
357 |
358 | store_request
359 | update_analytics
360 | request.session_options[:skip] = true
361 |
362 | if json?
363 | json
364 | elsif xml?
365 | xml
366 | else
367 | "Howdy"
368 | end
369 | end
370 |
371 | put path do
372 | block_route_if_restricted
373 | return 404 if unknown?
374 |
375 | store_request
376 | update_analytics
377 | request.session_options[:skip] = true
378 |
379 | if json?
380 | json
381 | elsif xml?
382 | xml
383 | else
384 | "Howdy"
385 | end
386 | end
387 |
388 | end
389 |
--------------------------------------------------------------------------------
/public/js/codemirror/modes/javascript.js:
--------------------------------------------------------------------------------
1 | CodeMirror.defineMode("javascript", function(config, parserConfig) {
2 | var indentUnit = config.indentUnit;
3 | var jsonMode = parserConfig.json;
4 |
5 | // Tokenizer
6 |
7 | var keywords = function(){
8 | function kw(type) {return {type: type, style: "keyword"};}
9 | var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
10 | var operator = kw("operator"), atom = {type: "atom", style: "atom"};
11 | return {
12 | "if": A, "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
13 | "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C,
14 | "var": kw("var"), "const": kw("var"), "let": kw("var"),
15 | "function": kw("function"), "catch": kw("catch"),
16 | "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
17 | "in": operator, "typeof": operator, "instanceof": operator,
18 | "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom
19 | };
20 | }();
21 |
22 | var isOperatorChar = /[+\-*&%=<>!?|]/;
23 |
24 | function chain(stream, state, f) {
25 | state.tokenize = f;
26 | return f(stream, state);
27 | }
28 |
29 | function nextUntilUnescaped(stream, end) {
30 | var escaped = false, next;
31 | while ((next = stream.next()) != null) {
32 | if (next == end && !escaped)
33 | return false;
34 | escaped = !escaped && next == "\\";
35 | }
36 | return escaped;
37 | }
38 |
39 | // Used as scratch variables to communicate multiple values without
40 | // consing up tons of objects.
41 | var type, content;
42 | function ret(tp, style, cont) {
43 | type = tp; content = cont;
44 | return style;
45 | }
46 |
47 | function jsTokenBase(stream, state) {
48 | var ch = stream.next();
49 | if (ch == '"' || ch == "'")
50 | return chain(stream, state, jsTokenString(ch));
51 | else if (/[\[\]{}\(\),;\:\.]/.test(ch))
52 | return ret(ch);
53 | else if (ch == "0" && stream.eat(/x/i)) {
54 | stream.eatWhile(/[\da-f]/i);
55 | return ret("number", "number");
56 | }
57 | else if (/\d/.test(ch)) {
58 | stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
59 | return ret("number", "number");
60 | }
61 | else if (ch == "/") {
62 | if (stream.eat("*")) {
63 | return chain(stream, state, jsTokenComment);
64 | }
65 | else if (stream.eat("/")) {
66 | stream.skipToEnd();
67 | return ret("comment", "comment");
68 | }
69 | else if (state.reAllowed) {
70 | nextUntilUnescaped(stream, "/");
71 | stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla
72 | return ret("regexp", "string");
73 | }
74 | else {
75 | stream.eatWhile(isOperatorChar);
76 | return ret("operator", null, stream.current());
77 | }
78 | }
79 | else if (ch == "#") {
80 | stream.skipToEnd();
81 | return ret("error", "error");
82 | }
83 | else if (isOperatorChar.test(ch)) {
84 | stream.eatWhile(isOperatorChar);
85 | return ret("operator", null, stream.current());
86 | }
87 | else {
88 | stream.eatWhile(/[\w\$_]/);
89 | var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
90 | return (known && state.kwAllowed) ? ret(known.type, known.style, word) :
91 | ret("variable", "variable", word);
92 | }
93 | }
94 |
95 | function jsTokenString(quote) {
96 | return function(stream, state) {
97 | if (!nextUntilUnescaped(stream, quote))
98 | state.tokenize = jsTokenBase;
99 | return ret("string", "string");
100 | };
101 | }
102 |
103 | function jsTokenComment(stream, state) {
104 | var maybeEnd = false, ch;
105 | while (ch = stream.next()) {
106 | if (ch == "/" && maybeEnd) {
107 | state.tokenize = jsTokenBase;
108 | break;
109 | }
110 | maybeEnd = (ch == "*");
111 | }
112 | return ret("comment", "comment");
113 | }
114 |
115 | // Parser
116 |
117 | var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true};
118 |
119 | function JSLexical(indented, column, type, align, prev, info) {
120 | this.indented = indented;
121 | this.column = column;
122 | this.type = type;
123 | this.prev = prev;
124 | this.info = info;
125 | if (align != null) this.align = align;
126 | }
127 |
128 | function inScope(state, varname) {
129 | for (var v = state.localVars; v; v = v.next)
130 | if (v.name == varname) return true;
131 | }
132 |
133 | function parseJS(state, style, type, content, stream) {
134 | var cc = state.cc;
135 | // Communicate our context to the combinators.
136 | // (Less wasteful than consing up a hundred closures on every call.)
137 | cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
138 |
139 | if (!state.lexical.hasOwnProperty("align"))
140 | state.lexical.align = true;
141 |
142 | while(true) {
143 | var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
144 | if (combinator(type, content)) {
145 | while(cc.length && cc[cc.length - 1].lex)
146 | cc.pop()();
147 | if (cx.marked) return cx.marked;
148 | if (type == "variable" && inScope(state, content)) return "variable-2";
149 | return style;
150 | }
151 | }
152 | }
153 |
154 | // Combinator utils
155 |
156 | var cx = {state: null, column: null, marked: null, cc: null};
157 | function pass() {
158 | for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
159 | }
160 | function cont() {
161 | pass.apply(null, arguments);
162 | return true;
163 | }
164 | function register(varname) {
165 | var state = cx.state;
166 | if (state.context) {
167 | cx.marked = "def";
168 | for (var v = state.localVars; v; v = v.next)
169 | if (v.name == varname) return;
170 | state.localVars = {name: varname, next: state.localVars};
171 | }
172 | }
173 |
174 | // Combinators
175 |
176 | var defaultVars = {name: "this", next: {name: "arguments"}};
177 | function pushcontext() {
178 | if (!cx.state.context) cx.state.localVars = defaultVars;
179 | cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
180 | }
181 | function popcontext() {
182 | cx.state.localVars = cx.state.context.vars;
183 | cx.state.context = cx.state.context.prev;
184 | }
185 | function pushlex(type, info) {
186 | var result = function() {
187 | var state = cx.state;
188 | state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info)
189 | };
190 | result.lex = true;
191 | return result;
192 | }
193 | function poplex() {
194 | var state = cx.state;
195 | if (state.lexical.prev) {
196 | if (state.lexical.type == ")")
197 | state.indented = state.lexical.indented;
198 | state.lexical = state.lexical.prev;
199 | }
200 | }
201 | poplex.lex = true;
202 |
203 | function expect(wanted) {
204 | return function expecting(type) {
205 | if (type == wanted) return cont();
206 | else if (wanted == ";") return pass();
207 | else return cont(arguments.callee);
208 | };
209 | }
210 |
211 | function statement(type) {
212 | if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex);
213 | if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
214 | if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
215 | if (type == "{") return cont(pushlex("}"), block, poplex);
216 | if (type == ";") return cont();
217 | if (type == "function") return cont(functiondef);
218 | if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
219 | poplex, statement, poplex);
220 | if (type == "variable") return cont(pushlex("stat"), maybelabel);
221 | if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
222 | block, poplex, poplex);
223 | if (type == "case") return cont(expression, expect(":"));
224 | if (type == "default") return cont(expect(":"));
225 | if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
226 | statement, poplex, popcontext);
227 | return pass(pushlex("stat"), expression, expect(";"), poplex);
228 | }
229 | function expression(type) {
230 | if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);
231 | if (type == "function") return cont(functiondef);
232 | if (type == "keyword c") return cont(maybeexpression);
233 | if (type == "(") return cont(pushlex(")"), expression, expect(")"), poplex, maybeoperator);
234 | if (type == "operator") return cont(expression);
235 | if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator);
236 | if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator);
237 | return cont();
238 | }
239 | function maybeexpression(type) {
240 | if (type.match(/[;\}\)\],]/)) return pass();
241 | return pass(expression);
242 | }
243 |
244 | function maybeoperator(type, value) {
245 | if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
246 | if (type == "operator") return cont(expression);
247 | if (type == ";") return;
248 | if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
249 | if (type == ".") return cont(property, maybeoperator);
250 | if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator);
251 | }
252 | function maybelabel(type) {
253 | if (type == ":") return cont(poplex, statement);
254 | return pass(maybeoperator, expect(";"), poplex);
255 | }
256 | function property(type) {
257 | if (type == "variable") {cx.marked = "property"; return cont();}
258 | }
259 | function objprop(type) {
260 | if (type == "variable") cx.marked = "property";
261 | if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression);
262 | }
263 | function commasep(what, end) {
264 | function proceed(type) {
265 | if (type == ",") return cont(what, proceed);
266 | if (type == end) return cont();
267 | return cont(expect(end));
268 | }
269 | return function commaSeparated(type) {
270 | if (type == end) return cont();
271 | else return pass(what, proceed);
272 | };
273 | }
274 | function block(type) {
275 | if (type == "}") return cont();
276 | return pass(statement, block);
277 | }
278 | function vardef1(type, value) {
279 | if (type == "variable"){register(value); return cont(vardef2);}
280 | return cont();
281 | }
282 | function vardef2(type, value) {
283 | if (value == "=") return cont(expression, vardef2);
284 | if (type == ",") return cont(vardef1);
285 | }
286 | function forspec1(type) {
287 | if (type == "var") return cont(vardef1, forspec2);
288 | if (type == ";") return pass(forspec2);
289 | if (type == "variable") return cont(formaybein);
290 | return pass(forspec2);
291 | }
292 | function formaybein(type, value) {
293 | if (value == "in") return cont(expression);
294 | return cont(maybeoperator, forspec2);
295 | }
296 | function forspec2(type, value) {
297 | if (type == ";") return cont(forspec3);
298 | if (value == "in") return cont(expression);
299 | return cont(expression, expect(";"), forspec3);
300 | }
301 | function forspec3(type) {
302 | if (type != ")") cont(expression);
303 | }
304 | function functiondef(type, value) {
305 | if (type == "variable") {register(value); return cont(functiondef);}
306 | if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext);
307 | }
308 | function funarg(type, value) {
309 | if (type == "variable") {register(value); return cont();}
310 | }
311 |
312 | // Interface
313 |
314 | return {
315 | startState: function(basecolumn) {
316 | return {
317 | tokenize: jsTokenBase,
318 | reAllowed: true,
319 | kwAllowed: true,
320 | cc: [],
321 | lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
322 | localVars: null,
323 | context: null,
324 | indented: 0
325 | };
326 | },
327 |
328 | token: function(stream, state) {
329 | if (stream.sol()) {
330 | if (!state.lexical.hasOwnProperty("align"))
331 | state.lexical.align = false;
332 | state.indented = stream.indentation();
333 | }
334 | if (stream.eatSpace()) return null;
335 | var style = state.tokenize(stream, state);
336 | if (type == "comment") return style;
337 | state.reAllowed = type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/);
338 | state.kwAllowed = type != '.';
339 | return parseJS(state, style, type, content, stream);
340 | },
341 |
342 | indent: function(state, textAfter) {
343 | if (state.tokenize != jsTokenBase) return 0;
344 | var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical,
345 | type = lexical.type, closing = firstChar == type;
346 | if (type == "vardef") return lexical.indented + 4;
347 | else if (type == "form" && firstChar == "{") return lexical.indented;
348 | else if (type == "stat" || type == "form") return lexical.indented + indentUnit;
349 | else if (lexical.info == "switch" && !closing)
350 | return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
351 | else if (lexical.align) return lexical.column + (closing ? 0 : 1);
352 | else return lexical.indented + (closing ? 0 : indentUnit);
353 | },
354 |
355 | electricChars: ":{}"
356 | };
357 | });
358 |
359 | CodeMirror.defineMIME("text/javascript", "javascript");
360 | CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
361 |
--------------------------------------------------------------------------------
/public/css/bootstrap.no-icons.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v2.2.2
3 | *
4 | * Copyright 2012 Twitter, Inc
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 | */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover{color:#808080}.text-warning{color:#c09853}a.text-warning:hover{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover{color:#2d6987}.text-success{color:#468847}a.text-success:hover{color:#356635}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.warning td{background-color:#fcf8e3}.table tbody tr.info td{background-color:#d9edf7}.table-hover tbody tr.success:hover td{background-color:#d0e9c6}.table-hover tbody tr.error:hover td{background-color:#ebcccc}.table-hover tbody tr.warning:hover td{background-color:#faf2cc}.table-hover tbody tr.info:hover td{background-color:#c4e3f3}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret{border-top-color:#555;border-bottom-color:#555}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media .pull-left{margin-right:10px}.media .pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
--------------------------------------------------------------------------------