From bb8f8fcccacc8d56ad05afc91e8d9c2a11defa09 Mon Sep 17 00:00:00 2001
From: nopzor1200
Date: Sat, 28 Mar 2015 17:30:36 -0400
Subject: [PATCH 001/181] Update influxdb.md
clarified some language, split into influx 0.9 and influx 0.8 since they are now two separate datasources/queryeditors
---
docs/sources/datasources/influxdb.md | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/docs/sources/datasources/influxdb.md b/docs/sources/datasources/influxdb.md
index 22b28f8729a..7721803d49f 100644
--- a/docs/sources/datasources/influxdb.md
+++ b/docs/sources/datasources/influxdb.md
@@ -7,7 +7,13 @@ page_keywords: grafana, influxdb, metrics, query, documentation
# InfluxDB
-## InfluxDB query editor
+There are currently two separate datasources for InfluxDB in Grafana: InfluxDB 0.8.x and InfluxDB 0.9.x. The API and capabilities of InfluxDB 0.9.x are completely different from InfluxDB 0.8.x. InfluxDB 0.9.x data source support is provided on an experimental basis.
+
+## InfluxDB 0.9 query editor
+
+The InfluxDB 0.9 query editor provides support for building metric queries based on combinations of metric names and tags. It reuses elements of the Graphite query editor to help find the appropriate series.
+
+## InfluxDB 0.8 query editor

@@ -19,7 +25,11 @@ select [[func]]([[column]]) from [[series]] where [[timeFilter]] group by time([
To write the complete query yourself click the cog wheel icon to the right and select ``Raw query mode``.
-## InfluxDB Filters & Templated queries
+## InfluxDB 0.9 Filters & Templates queries
+
+The InfluxDB 0.9 data source does not currently support filters or templates.
+
+## InfluxDB 0.8 Filters & Templated queries

From e8e83bdbce728eff355e29b88c82471687c25c01 Mon Sep 17 00:00:00 2001
From: nopzor1200
Date: Sat, 28 Mar 2015 18:40:25 -0400
Subject: [PATCH 002/181] Update admin.md
---
docs/sources/reference/admin.md | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/docs/sources/reference/admin.md b/docs/sources/reference/admin.md
index cc0548f0ac6..44491d8fdfc 100644
--- a/docs/sources/reference/admin.md
+++ b/docs/sources/reference/admin.md
@@ -4,7 +4,27 @@ page_description: Grafana Admin guide
page_keywords: grafana, admin, administration, documentation
---
-# Grafana Admin
+Grafana has two levels of administrators:
-This documentation page has yet to be written.
+* Organizational administrators: These admins can manage users within specific organizations in a particular Grafana installation
+* Grafana administrators: These super admins can manage users across all organizations in a Grafana installation. They can also change and access system-wide settings.
+# Organizational Administrators
+
+Note: If Grafana is configured with users.allow_org_create = true, any User of any Organization will be able to start their own Organization and become the administrator of that Organization.
+
+As an Organizational administrator, you can manage all Users within your Organization.
+
+# Grafana Administrators
+
+As a Grafana Administrator, you have complete access to any Organization or User in that instance of Grafana.
+
+When performing actions as a Grafana admin, the sidebar will change it's apperance as below to indicate you are performing global server administration.
+
+[screenshot]
+
+From the Grafana Server Admin page, you can access the System Info page which summarizes all of the backend configuration settings of the Grafana server.
+
+# Why would I have multiple Organizations?
+
+In many cases, a Grafana installation will only have one Organization. There's no need to create multiple Organizations if you want all your users to have access to the same set of dashboards and data. In a multitenant deployment, Organizations can be used to provide a full Grafana experience to different sets of users from a single Grafana instance, at the convenience of the Grafana Administrator.
From 8e33c2c4d3268638551d31a53f4bd02f7f12a72d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Sun, 29 Mar 2015 20:47:34 +0200
Subject: [PATCH 003/181] Mini work on InfluxDB 0.9 datasource, still needs a
lot of work
---
public/app/partials/metrics.html | 2 +-
public/app/plugins/datasource/influxdb/queryBuilder.js | 8 +++-----
public/test/specs/influx09-querybuilder-specs.js | 4 ++--
3 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/public/app/partials/metrics.html b/public/app/partials/metrics.html
index 2556466ba17..db304d1c232 100644
--- a/public/app/partials/metrics.html
+++ b/public/app/partials/metrics.html
@@ -7,7 +7,7 @@
Add query
-
+
{{datasource.name}}
diff --git a/public/app/plugins/datasource/influxdb/queryBuilder.js b/public/app/plugins/datasource/influxdb/queryBuilder.js
index af613ad5e43..e8eaefda61a 100644
--- a/public/app/plugins/datasource/influxdb/queryBuilder.js
+++ b/public/app/plugins/datasource/influxdb/queryBuilder.js
@@ -32,12 +32,10 @@ function (_) {
}
query += aggregationFunc + '(value)';
- query += ' FROM ' + measurement + ' WHERE ';
+ query += ' FROM ' + measurement + ' WHERE $timeFilter';
query += _.map(target.tags, function(value, key) {
- return key + ' = ' + "'" + value + "' AND ";
- });
-
- query += '$timeFilter';
+ return ' AND ' + key + '=' + "'" + value + "'";
+ }).join('');
query += ' GROUP BY time($interval)';
diff --git a/public/test/specs/influx09-querybuilder-specs.js b/public/test/specs/influx09-querybuilder-specs.js
index 8082e2b72f3..09fb343171a 100644
--- a/public/test/specs/influx09-querybuilder-specs.js
+++ b/public/test/specs/influx09-querybuilder-specs.js
@@ -27,8 +27,8 @@ define([
var query = builder.build();
it('should generate correct query', function() {
- expect(query).to.be('SELECT mean(value) FROM "cpu" WHERE hostname = \'server1\'' +
- ' AND $timeFilter GROUP BY time($interval) ORDER BY asc');
+ expect(query).to.be('SELECT mean(value) FROM "cpu" WHERE $timeFilter ' +
+ 'AND hostname=\'server1\' GROUP BY time($interval) ORDER BY asc');
});
});
From 472b8c6e8d464aeaa8b6d57de0d005453df35026 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Sun, 29 Mar 2015 21:27:48 +0200
Subject: [PATCH 004/181] Fixed link in docs
---
docs/sources/guides/whats-new-in-v2.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/sources/guides/whats-new-in-v2.md b/docs/sources/guides/whats-new-in-v2.md
index bb5c4c15c7d..ba6c1d0a7ca 100644
--- a/docs/sources/guides/whats-new-in-v2.md
+++ b/docs/sources/guides/whats-new-in-v2.md
@@ -134,6 +134,6 @@ There are currently no permissions on individual dashboards.
## Panel IFrame embedding
You can embed a single panel on another web page using the panel share dialog. Below you should see an iframe
-with a graph panel (taken from dashoard snapshot at [snapshot.raintank.io](snapshot.raintank.io).
+with a graph panel (taken from dashoard snapshot at [snapshot.raintank.io](http://snapshot.raintank.io).
From 2c549371040e1abfede8bf24551f580a73674bd1 Mon Sep 17 00:00:00 2001
From: nopzor1200
Date: Sun, 29 Mar 2015 16:39:08 -0400
Subject: [PATCH 005/181] Update gettingstarted.md
fleshed out 'getting started' text
---
docs/sources/guides/gettingstarted.md | 80 ++++++++++++++++++++-------
1 file changed, 60 insertions(+), 20 deletions(-)
diff --git a/docs/sources/guides/gettingstarted.md b/docs/sources/guides/gettingstarted.md
index 9e0048263f8..a772f566841 100644
--- a/docs/sources/guides/gettingstarted.md
+++ b/docs/sources/guides/gettingstarted.md
@@ -5,49 +5,89 @@ page_keywords: grafana, guide, documentation
---
# Getting started
-This guide will help you get started and acquainted with the Grafana user interface.
+This guide will help you get started and acquainted with the Grafana user interface. It assumes you have a working Grafana 2.0 instance, and have added at least one Grafana data source.
## Interface overview
+The interface is three main areas
+
+1. Dashboard header
+2. Grafana sidebar
+3. Dashboard
+
### Dashboard header
-1. Side menu toggle
-2. Dashboard title & Search dropdown (also includes access to New dashboard, Import & Playlist)
-3. Star/unstar current dashboard
-4. Share current dashboard (Make sure the dashboard is saved before)
-5. Save current dashboard
-6. Settings dropdown (dashboard settings, annotations, templating, etc)
+Every Dashboard-related feature can be accessed from the main Dashboard header.
+
+1. Side menubar toggle: This toggles the side menu, allowing you to focus on the data presented in the dashboard. The side menu provides access to features unrelated to a Dashboard such as Users, Organizations, and Data Sources.
+2. Dashboard dropdown: This dropdown shows you which Dashboard you are currently viewing, and allows you to easily switch to a new Dashboard. From here you can also create a new Dashboard, Import existing Dashboards, and manage Dashboard playlists.
+3. Star Dashboard: Star (or unstar) the current Dashboar. Starred Dashboards will show up on your own Home Dashboard by default, and are a convenient way to mark Dashboards that you're interested in.
+4. Share Dashboard: Share the current dashboard by creating a link or create a static Snapshot of it. Make sure the Dashboard is saved before sharing.
+5. Save dashboard: The current Dashboard will be saved with the current Dashboard name.
+6. Settings: Manage Dashboard settings and features such as Templating and Annotations.
-## New dashboard
+## Dashboards
+
+Dashboards are at the core of what Grafana is all about. Dashboards are composed of individual Panels arranged on a number of Rows. By adjusting the flexible display properties of Panels and Rows, you can customize the perfect Dashboard for your exact needs/
+
+Each panel can interact with data from any configured Grafana Data Source (currently InfluxDB, Graphite, OpenTSDB, and KairosDB). This allows you to create a single dashboard that unifies the data across your organization. Panels use the time range specificed in the main Time Picker in the upper right, but they can also have relative time overrides.
+
+Grafana makes it easy to create, customize, and share Dashboards. Let's create our first one:
+

-## Edit graphs
-Click on a panel's title and then ``Edit`` to open a panel in edit mode.
-
+## Rows
-## Editing Rows
-To the right of each row you have two colored rectangles, hover over these to get access to quick row controls.
+To the right of each row you have two colored rectangles, hover over these to get access to quick Row controls.

-## Drag drop panels
-Click and drag the panel title to start a drag and drop action.
+You can add as many rows as you want, and control the height of each row. Think of Rows as containers for a group of Panels.
+
+## Panels
+
+Panels are where the magic happens. Let's add a Panel to a Row. There are many types of Panels in Grafana (such as graph, singlestat, and text), and more to come. The graph Panel is a particularly powerful way of visualizing time series data.
+
+Add a graph Panel to a Row by clicking the green Row icon and selecting 'graph' from the 'Add panel' option.
+
+## The graph Panel
+
+Click on the Graph Panel's title and then ``Edit`` to open a panel in edit mode.
+
+
+From the graph Panel edit mode, you can control the styling of the graph, which Data Source it will pull data from, and the specific queries that will generate data to visualize. Let's take a quick look at some of the more interesting tabs:
+
+The 'Metrics' tab is where it all comes together. The interface and capabilities for this tab will depend on the Data Source. From here you can build a list of queries that can be visualized, or used as the basis for other queries that are visualized. The Grafana query editor strives to make it easy for you to ask the right questions of yoru Data Source without having to understand the nuances of its query syntax.
+
+Through the 'Axis and Gris' and 'Display' tabs you can control the exact styling and rendering options for that graph Panels. You can configure things like styling, rendering options, units, and axis through these tabs.
+
+Read the graph Panel documentation for more about this panel.
+
+## Drag-and-Drop panels
+
+You can Drag-and-Drop Panels within and between Rows. Click and hold the Panel title, and drag it to its new location.
+

## Tips and shortcuts
* Click the graph title and in the dropdown menu quickly change span or duplicate the panel.
+* Click the Save icon in the menu to save the dashboard with a new name
+* Click the Save icon in the menu and then advanced to export the dashboard to json file, or set it as your default dashboard.
+* Click the colored icon in the legend to select series color
+* Click series name in the legend to hide series
+* Ctrl/Shift/Meta + Click legend name to hide other series
+
+## Grafana loves the keyboard:
+
* Ctrl+S Saves the current dashboard
* Ctrl+F Opens the dashboard finder / search
* Ctrl+H Hides all controls (good for tv displays)
* Hit Escape to exit graph when in fullscreen or edit mode
-* Click the colored icon in the legend to select series color
-* Click series name in the legend to hide series
-* Ctrl/Shift/Meta + Click legend name to hide other series
-* Click the Save icon in the menu to save the dashboard with a new name
-* Click the Save icon in the menu and then advanced to export the dashboard to json file, or set it as your default dashboard.
+
+
From 2d2462fe63eca6c9d8169daf66d741d6d19d429c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Mon, 30 Mar 2015 09:22:58 +0200
Subject: [PATCH 006/181] Updated configuration docs
---
docs/sources/installation/configuration.md | 14 ++++++++++++++
docs/sources/versions.html_fragment | 4 ++--
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/docs/sources/installation/configuration.md b/docs/sources/installation/configuration.md
index a442ee58dc3..d89ed953fa4 100644
--- a/docs/sources/installation/configuration.md
+++ b/docs/sources/installation/configuration.md
@@ -59,6 +59,8 @@ google or github oauth authentication (for the callback url to be correct).
The path to the directory where the frontend files (html & js & css). Default to `public` which is
why the Grafana binary needs to be executed with working directory set to the installation path.
+
+
## [database]
@@ -205,4 +207,16 @@ Set to true if you host Grafana behind HTTPs only. Defaults to `false`.
### session_life_time
How long sessions lasts in seconds. Defaults to `86400` (24 hours).
+## [analytics]
+
+### reporting-enabled
+When enabled Grafana will send anonymous usage statistics to stats.grafana.org.
+No ip addresses are being tracked, only simple counters to track running instances,
+versions, dashboard & error counts. It is very helpful to us, please leave this
+enabled. Counters are sent every 24 hours.
+
+### google_analytics_ua_id
+If you want to track Grafana usage via Google analytics specify *your* Univeral Analytics ID
+here. By defualt this feature is disabled.
+
diff --git a/docs/sources/versions.html_fragment b/docs/sources/versions.html_fragment
index 00ee000a0f0..83e8ba8a4bb 100644
--- a/docs/sources/versions.html_fragment
+++ b/docs/sources/versions.html_fragment
@@ -1,2 +1,2 @@
-Version v2.0
-Version v1.9
+Version v2.0 (beta)
+Version v1.9 (stable)
From 8982dc5ed3a5ccc7dae79643610e18fddd0887a8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Mon, 30 Mar 2015 09:38:40 +0200
Subject: [PATCH 007/181] Update getting started
---
docs/sources/guides/gettingstarted.md | 71 ++++++++-------------------
1 file changed, 21 insertions(+), 50 deletions(-)
diff --git a/docs/sources/guides/gettingstarted.md b/docs/sources/guides/gettingstarted.md
index a772f566841..0edd6ba617e 100644
--- a/docs/sources/guides/gettingstarted.md
+++ b/docs/sources/guides/gettingstarted.md
@@ -5,65 +5,36 @@ page_keywords: grafana, guide, documentation
---
# Getting started
-This guide will help you get started and acquainted with the Grafana user interface. It assumes you have a working Grafana 2.0 instance, and have added at least one Grafana data source.
+This guide will help you get started and acquainted with the Grafana user interface. It assumes you have a working
+Grafana 2.0 instance, and have added at least one Grafana data source.
-## Interface overview
-
-The interface is three main areas
-
-1. Dashboard header
-2. Grafana sidebar
-3. Dashboard
-
-### Dashboard header
+## Top header
-Every Dashboard-related feature can be accessed from the main Dashboard header.
+The image above shows you the top header for a dashboard.
1. Side menubar toggle: This toggles the side menu, allowing you to focus on the data presented in the dashboard. The side menu provides access to features unrelated to a Dashboard such as Users, Organizations, and Data Sources.
-2. Dashboard dropdown: This dropdown shows you which Dashboard you are currently viewing, and allows you to easily switch to a new Dashboard. From here you can also create a new Dashboard, Import existing Dashboards, and manage Dashboard playlists.
+2. Dashboard dropdown: This dropdown shows you which Dashboard you are currently viewing, and allows you to easily switch to a new Dashboard. From here you can also create a new Dashboard, Import existing Dashboards, and manage Dashboard playlists.
3. Star Dashboard: Star (or unstar) the current Dashboar. Starred Dashboards will show up on your own Home Dashboard by default, and are a convenient way to mark Dashboards that you're interested in.
4. Share Dashboard: Share the current dashboard by creating a link or create a static Snapshot of it. Make sure the Dashboard is saved before sharing.
-5. Save dashboard: The current Dashboard will be saved with the current Dashboard name.
-6. Settings: Manage Dashboard settings and features such as Templating and Annotations.
+5. Save dashboard: The current Dashboard will be saved with the current Dashboard name.
+6. Settings: Manage Dashboard settings and features such as Templating and Annotations.
-
+## Dashboard
+Dashboards are at the core of what Grafana is all about. Dashboards are composed of individual Panels arranged on a number of Rows.
+By adjusting the display properties of Panels and Rows, you can customize the perfect Dashboard for your exact needs.
+Each panel can interact with data from any configured Grafana Data Source (currently InfluxDB, Graphite, OpenTSDB, and KairosDB).
+This allows you to create a single dashboard that unifies the data across your organization. Panels use the time range specificed
+in the main Time Picker in the upper right, but they can also have relative time overrides.
-## Dashboards
+
-Dashboards are at the core of what Grafana is all about. Dashboards are composed of individual Panels arranged on a number of Rows. By adjusting the flexible display properties of Panels and Rows, you can customize the perfect Dashboard for your exact needs/
-
-Each panel can interact with data from any configured Grafana Data Source (currently InfluxDB, Graphite, OpenTSDB, and KairosDB). This allows you to create a single dashboard that unifies the data across your organization. Panels use the time range specificed in the main Time Picker in the upper right, but they can also have relative time overrides.
-
-Grafana makes it easy to create, customize, and share Dashboards. Let's create our first one:
-
-
-
-## Rows
-
-To the right of each row you have two colored rectangles, hover over these to get access to quick Row controls.
-
-
-You can add as many rows as you want, and control the height of each row. Think of Rows as containers for a group of Panels.
-
-## Panels
-
-Panels are where the magic happens. Let's add a Panel to a Row. There are many types of Panels in Grafana (such as graph, singlestat, and text), and more to come. The graph Panel is a particularly powerful way of visualizing time series data.
-
-Add a graph Panel to a Row by clicking the green Row icon and selecting 'graph' from the 'Add panel' option.
-
-## The graph Panel
-
-Click on the Graph Panel's title and then ``Edit`` to open a panel in edit mode.
-
-
-From the graph Panel edit mode, you can control the styling of the graph, which Data Source it will pull data from, and the specific queries that will generate data to visualize. Let's take a quick look at some of the more interesting tabs:
-
-The 'Metrics' tab is where it all comes together. The interface and capabilities for this tab will depend on the Data Source. From here you can build a list of queries that can be visualized, or used as the basis for other queries that are visualized. The Grafana query editor strives to make it easy for you to ask the right questions of yoru Data Source without having to understand the nuances of its query syntax.
-
-Through the 'Axis and Gris' and 'Display' tabs you can control the exact styling and rendering options for that graph Panels. You can configure things like styling, rendering options, units, and axis through these tabs.
-
-Read the graph Panel documentation for more about this panel.
+1. Zoom out time range
+2. Time picker dropdown. Here you can access relative time range options, auto refresh options and set custom absolute time ranges.
+3. Manual refresh button. Will cause all panels to refresh (fetch new data).
+4. Row controls menu. Via this menu you can add panels to the row, set row height and more.
+5. Dashboard panel. You edit panels by clicking the panel title.
+6. Graph legend. You can change series colors, y-axis and series visibility directly from the legend.
## Drag-and-Drop panels
@@ -80,7 +51,7 @@ You can Drag-and-Drop Panels within and between Rows. Click and hold the Panel t
* Click series name in the legend to hide series
* Ctrl/Shift/Meta + Click legend name to hide other series
-## Grafana loves the keyboard:
+## Grafana loves the keyboard
* Ctrl+S Saves the current dashboard
* Ctrl+F Opens the dashboard finder / search
From b46f8bad6d585006d99c6520e476d4a81ee7849e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Mon, 30 Mar 2015 10:12:24 +0200
Subject: [PATCH 008/181] Added check for allow_user_org_create, updated admin
docs
---
conf/defaults.ini | 2 +-
docs/mkdocs.yml | 2 +-
docs/sources/reference/admin.md | 28 +++++++++++++++++-----------
pkg/api/org.go | 7 ++++++-
4 files changed, 25 insertions(+), 14 deletions(-)
diff --git a/conf/defaults.ini b/conf/defaults.ini
index d372c825f53..d328733abc9 100644
--- a/conf/defaults.ini
+++ b/conf/defaults.ini
@@ -22,7 +22,7 @@ cert_file =
cert_key =
[analytics]
-# Server reporting, sends usage counters to stats.grafana.org (https).
+# Server reporting, sends usage counters to stats.grafana.org every 24 hours.
# No ip addresses are being tracked, only simple counters to track
# running instances, dashboard and error counts. It is very helpful to us.
# Change this option to false to disable reporting.
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index 5d4ddbf8de6..6976e46d060 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -48,7 +48,7 @@ pages:
- ['reference/scripting.md', 'Reference', 'Scripted dashboards']
- ['reference/playlist.md', 'Reference', 'Playlist']
- ['reference/export_import.md', 'Reference', 'Import & Export']
-- ['reference/admin.md', 'Reference', 'Grafana Admin']
+- ['reference/admin.md', 'Reference', 'Administration']
- ['reference/http_api.md', 'Reference', 'HTTP API']
- ['datasources/graphite.md', 'Data Sources', 'Graphite']
diff --git a/docs/sources/reference/admin.md b/docs/sources/reference/admin.md
index 44491d8fdfc..854147b4240 100644
--- a/docs/sources/reference/admin.md
+++ b/docs/sources/reference/admin.md
@@ -1,30 +1,36 @@
----
-page_title: Grafana Admin
-page_description: Grafana Admin guide
+page_title: Administration
+page_description: Grafana Administration
page_keywords: grafana, admin, administration, documentation
---
+# Administration
+
Grafana has two levels of administrators:
* Organizational administrators: These admins can manage users within specific organizations in a particular Grafana installation
* Grafana administrators: These super admins can manage users across all organizations in a Grafana installation. They can also change and access system-wide settings.
-# Organizational Administrators
+## Organizational Administrators
-Note: If Grafana is configured with users.allow_org_create = true, any User of any Organization will be able to start their own Organization and become the administrator of that Organization.
+As an Organizational administrator, you can add `Data Sources`, add Users to your Organization and
+modify Organization details and options.
-As an Organizational administrator, you can manage all Users within your Organization.
+> *Note*: If Grafana is configured with `users.allow_org_create = true`, any User of any Organization will be able to
+> start their own Organization and become the administrator of that Organization.
-# Grafana Administrators
-As a Grafana Administrator, you have complete access to any Organization or User in that instance of Grafana.
+## Grafana Administrators
+
+As a Grafana Administrator, you have complete access to any Organization or User in that instance of Grafana.
When performing actions as a Grafana admin, the sidebar will change it's apperance as below to indicate you are performing global server administration.
-[screenshot]
-
From the Grafana Server Admin page, you can access the System Info page which summarizes all of the backend configuration settings of the Grafana server.
-# Why would I have multiple Organizations?
+## Why would I have multiple Organizations?
-In many cases, a Grafana installation will only have one Organization. There's no need to create multiple Organizations if you want all your users to have access to the same set of dashboards and data. In a multitenant deployment, Organizations can be used to provide a full Grafana experience to different sets of users from a single Grafana instance, at the convenience of the Grafana Administrator.
+In many cases, a Grafana installation will only have one Organization. There's no need to create multiple Organizations
+if you want all your users to have access to the same set of dashboards and data. In a multitenant deployment,
+Organizations can be used to provide a full Grafana experience to different sets of users from a single Grafana instance,
+at the convenience of the Grafana Administrator.
diff --git a/pkg/api/org.go b/pkg/api/org.go
index ed180b1af77..ac8727c9e49 100644
--- a/pkg/api/org.go
+++ b/pkg/api/org.go
@@ -5,6 +5,7 @@ import (
"github.com/grafana/grafana/pkg/metrics"
"github.com/grafana/grafana/pkg/middleware"
m "github.com/grafana/grafana/pkg/models"
+ "github.com/grafana/grafana/pkg/setting"
)
func GetOrg(c *middleware.Context) {
@@ -29,8 +30,12 @@ func GetOrg(c *middleware.Context) {
}
func CreateOrg(c *middleware.Context, cmd m.CreateOrgCommand) {
- cmd.UserId = c.UserId
+ if !setting.AllowUserOrgCreate && !c.IsGrafanaAdmin {
+ c.JsonApiErr(401, "Access denied", nil)
+ return
+ }
+ cmd.UserId = c.UserId
if err := bus.Dispatch(&cmd); err != nil {
c.JsonApiErr(500, "Failed to create organization", err)
return
From de51aeab7b55ebe96967a7f2531d2ecc56318dd7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Mon, 30 Mar 2015 11:08:46 +0200
Subject: [PATCH 009/181] updates to whats new doc, and building from source,
also small fix for panel snapshot, single panelsnapshot should expand panel
span to 12
---
docs/sources/guides/whats-new-in-v2.md | 43 ++++++++++---------
docs/sources/project/building_from_source.md | 5 +++
.../features/dashboard/shareSnapshotCtrl.js | 1 +
3 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/docs/sources/guides/whats-new-in-v2.md b/docs/sources/guides/whats-new-in-v2.md
index ba6c1d0a7ca..e7054e89cbd 100644
--- a/docs/sources/guides/whats-new-in-v2.md
+++ b/docs/sources/guides/whats-new-in-v2.md
@@ -8,21 +8,6 @@ page_keywords: grafana, new, changes, features, documentation
This is a guide that describes some of changes and new features that can be found in Grafana v2.0.
-## New dashboard top header
-
-
-
-1. Side menu toggle
-2. Dashboard title & Search dropdown (also includes access to New dashboard, Import & Playlist)
-3. Star/unstar current dashboard
-4. Share current dashboard (Make sure the dashboard is saved before)
-5. Save current dashboard
-6. Settings dropdown (dashboard settings, annotations, templating, etc)
-
-> **Note** In Grafana v2.0 when you change the title of a dashboard and then save it it will no
-> longer create a new dashboard. It will just change the name for the current dashboard.
-> To change name and create a new dashboard use the `Save As...` menu option
-
## Dashboard Snapshot sharing
A dashboard snapshot is an instant way to share an interactive dashboard publicly. When created, we strip sensitive data like queries
(metric, template and annotation) and panel links, leaving only the visible metric data and series names embedded into your dashboard. Dashboard
@@ -56,6 +41,28 @@ however is always active, even when the dashboard time is absolute.
The `Hide time override info` option allows you to hide the the override info text that is by default shown in the
upper right of a panel when overriden time range options.
+## Panel IFrame embedding
+
+You can embed a single panel on another web page using the panel share dialog. Below you should see an iframe
+with a graph panel (taken from dashoard snapshot at [snapshot.raintank.io](http://snapshot.raintank.io).
+
+
+
+## New dashboard top header
+
+
+
+1. Side menu toggle
+2. Dashboard title & Search dropdown (also includes access to New dashboard, Import & Playlist)
+3. Star/unstar current dashboard
+4. Share current dashboard (Make sure the dashboard is saved before)
+5. Save current dashboard
+6. Settings dropdown (dashboard settings, annotations, templating, etc)
+
+> **Note** In Grafana v2.0 when you change the title of a dashboard and then save it it will no
+> longer create a new dashboard. It will just change the name for the current dashboard.
+> To change name and create a new dashboard use the `Save As...` menu option
+
## New search view & starring dashboards

@@ -131,9 +138,3 @@ Organizations via a role. That role can be:
There are currently no permissions on individual dashboards.
-## Panel IFrame embedding
-
-You can embed a single panel on another web page using the panel share dialog. Below you should see an iframe
-with a graph panel (taken from dashoard snapshot at [snapshot.raintank.io](http://snapshot.raintank.io).
-
-
diff --git a/docs/sources/project/building_from_source.md b/docs/sources/project/building_from_source.md
index dab57ed6aee..a74759572cd 100644
--- a/docs/sources/project/building_from_source.md
+++ b/docs/sources/project/building_from_source.md
@@ -53,6 +53,11 @@ bra run
Open grafana in your browser (default http://localhost:3000) and login with admin user (default user/pass = admin/admin).
+## Creating optimized release packages
+```
+go run build.go build package
+```
+
## Dev config
Create a custom.ini in the conf directory to override default configuration options.
diff --git a/public/app/features/dashboard/shareSnapshotCtrl.js b/public/app/features/dashboard/shareSnapshotCtrl.js
index ed6536face6..eba1e6e6ac7 100644
--- a/public/app/features/dashboard/shareSnapshotCtrl.js
+++ b/public/app/features/dashboard/shareSnapshotCtrl.js
@@ -99,6 +99,7 @@ function (angular, _) {
// snapshot single panel
if ($scope.modeSharePanel) {
var singlePanel = dash.getPanelById($scope.panel.id);
+ singlePanel.span = 12;
dash.rows = [{ height: '500px', span: 12, panels: [singlePanel] }];
}
From dc03ca8879a2dc605673c116ee73ae9ce74190d4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Mon, 30 Mar 2015 12:25:17 +0200
Subject: [PATCH 010/181] Opening search closes fullscreen edit or fullscreen
view
---
public/app/controllers/search.js | 4 ++++
public/app/features/panel/panelSrv.js | 7 +------
public/app/features/panel/partials/panel.html | 2 +-
public/app/partials/submenu.html | 1 -
public/css/bootstrap.dark.min.css | 2 +-
public/css/bootstrap.light.min.css | 2 +-
public/css/grafana.dark.min.css | 2 +-
public/css/grafana.light.min.css | 2 +-
public/css/less/gfbox.less | 4 +++-
public/css/less/submenu.less | 3 ++-
public/css/less/tightform.less | 2 +-
11 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/public/app/controllers/search.js b/public/app/controllers/search.js
index e031559f3a8..ff171c953a2 100644
--- a/public/app/controllers/search.js
+++ b/public/app/controllers/search.js
@@ -17,6 +17,10 @@ function (angular, _, config) {
$scope.query = { query: '', tag: '', starred: false };
$scope.currentSearchId = 0;
+ if ($scope.dashboardViewState.fullscreen) {
+ $scope.exitFullscreen();
+ }
+
$timeout(function() {
$scope.giveSearchFocus = $scope.giveSearchFocus + 1;
$scope.query.query = '';
diff --git a/public/app/features/panel/panelSrv.js b/public/app/features/panel/panelSrv.js
index b28ef4218ac..d8e2272436a 100644
--- a/public/app/features/panel/panelSrv.js
+++ b/public/app/features/panel/panelSrv.js
@@ -16,12 +16,7 @@ function (angular, _, config) {
$scope.inspector = {};
$scope.editPanel = function() {
- if ($scope.panelMeta.fullscreen) {
- $scope.toggleFullscreen(true);
- }
- else {
- $scope.appEvent('show-dash-editor', { src: 'app/partials/paneleditor.html', scope: $scope });
- }
+ $scope.toggleFullscreen(true);
};
$scope.sharePanel = function() {
diff --git a/public/app/features/panel/partials/panel.html b/public/app/features/panel/partials/panel.html
index 2f393ae9a6b..6fbab9de70a 100644
--- a/public/app/features/panel/partials/panel.html
+++ b/public/app/features/panel/partials/panel.html
@@ -32,7 +32,7 @@
diff --git a/public/app/partials/submenu.html b/public/app/partials/submenu.html
index fcfb71f5d4f..929d2e55bef 100644
--- a/public/app/partials/submenu.html
+++ b/public/app/partials/submenu.html
@@ -27,7 +27,6 @@
-
diff --git a/public/css/bootstrap.dark.min.css b/public/css/bootstrap.dark.min.css
index 1d31ef1cccc..e63b553b7da 100644
--- a/public/css/bootstrap.dark.min.css
+++ b/public/css/bootstrap.dark.min.css
@@ -6,4 +6,4 @@
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world by @mdo and @fat.
- */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.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}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{max-width:100%;width:auto\9;height:auto;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"]{-webkit-appearance:button;cursor:pointer}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{*{text-shadow:none!important;color:#000!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}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#bbbfc2;background-color:#161616}a{color:#e3e3e3;text-decoration:none}a:hover,a:focus{color:#fff;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;content:"";line-height:0}.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;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%}.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;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0}.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:#adafae}a.muted:hover,a.muted:focus{color:#939695}.text-warning{color:#a47e3c}a.text-warning:hover,a.text-warning:focus{color:#7f612e}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#005f81}a.text-info:hover,a.text-info:focus{color:#00394e}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:#fff;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#adafae}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 #bbbfc2}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;*display:inline;*zoom:1;padding-left:5px;padding-right: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;content:"";line-height:0}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #262626;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #adafae}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #bbbfc2}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#adafae}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #bbbfc2;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:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#262626;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap}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:3px;-moz-border-radius:3px;border-radius:3px}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:#262626;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#adafae}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:#000;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;vertical-align:middle}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:#333;border:1px solid #333;-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,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;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;border:1px solid #333;background-color:#333}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:#adafae;background-color:#303030;border-color:#333;-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);cursor:not-allowed}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#788086}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#788086}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#788086}.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;content:"";line-height:0}.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:#555}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:#a47e3c}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#a47e3c}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#a47e3c;-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:#7f612e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#a47e3c;background-color:#f80;border-color:#a47e3c}.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:#bbbfc2;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:#bbbfc2;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#005f81}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#005f81}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#005f81;-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:#00394e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #00aae7;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #00aae7;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #00aae7}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#005f81;background-color:#bbbfc2;border-color:#005f81}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:transparent;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#e3e5e6}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;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,.input-append .popover,.input-prepend .popover{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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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:#bbbfc2;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:#bf3;border-color:#690}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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;*zoom:1;margin-bottom:0;vertical-align:middle}.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;content:"";line-height:0}.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 #262626}.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 #262626}.table .table{background-color:#161616}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #262626;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.table-bordered th,.table-bordered td{border-left:1px solid #262626}.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,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius: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:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.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:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:rgba(100,100,100,0.3)}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#262626}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:#bbbfc2}.table tbody tr.error>td{background-color:#bbbfc2}.table tbody tr.warning>td{background-color:#f80}.table tbody tr.info>td{background-color:#bbbfc2}.table-hover tbody tr.success:hover>td{background-color:#aeb2b6}.table-hover tbody tr.error:hover>td{background-color:#aeb2b6}.table-hover tbody tr.warning:hover>td{background-color:#e67a00}.table-hover tbody tr.info:hover>td{background-color:#aeb2b6}.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:#262626;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:transparent;border-bottom:1px solid #444}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#bbbfc2;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#fff;background-color:#005777;background-image:-moz-linear-gradient(top,#005f81,#004c68);background-image:-webkit-gradient(linear,0 0,0 100%,from(#005f81),to(#004c68));background-image:-webkit-linear-gradient(top,#005f81,#004c68);background-image:-o-linear-gradient(top,#005f81,#004c68);background-image:linear-gradient(to bottom,#005f81,#004c68);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f81',endColorstr='#ff004c68',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#005777;background-image:-moz-linear-gradient(top,#005f81,#004c68);background-image:-webkit-gradient(linear,0 0,0 100%,from(#005f81),to(#004c68));background-image:-webkit-linear-gradient(top,#005f81,#004c68);background-image:-o-linear-gradient(top,#005f81,#004c68);background-image:linear-gradient(to bottom,#005f81,#004c68);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f81',endColorstr='#ff004c68',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#adafae}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #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;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#000;margin-top:5px;margin-right:-10px}.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-left:20px;padding-right:20px}.typeahead{z-index:1051;margin-top:2px;-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,.close:focus{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;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#262626;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#4d4e4d;background-image:-moz-linear-gradient(top,#262626,#868988);background-image:-webkit-gradient(linear,0 0,0 100%,from(#262626),to(#868988));background-image:-webkit-linear-gradient(top,#262626,#868988);background-image:-o-linear-gradient(top,#262626,#868988);background-image:linear-gradient(to bottom,#262626,#868988);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff262626',endColorstr='#ff868988',GradientType=0);border-color:#868988 #868988 #606362;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#868988;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#262626;background-color:#868988;*background-color:#797d7b}.btn:active,.btn.active{background-color:#6d706e \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#262626;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,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(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:4px;-moz-border-radius:4px;border-radius:4px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.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:2px;-moz-border-radius:2px;border-radius:2px}.btn-block{display:block;width:100%;padding-left:0;padding-right: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-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006e95;background-image:-moz-linear-gradient(top,#005f81,#0085b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#005f81),to(#0085b4));background-image:-webkit-linear-gradient(top,#005f81,#0085b4);background-image:-o-linear-gradient(top,#005f81,#0085b4);background-image:linear-gradient(to bottom,#005f81,#0085b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f81',endColorstr='#ff0085b4',GradientType=0);border-color:#0085b4 #0085b4 #004c67;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#0085b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#0085b4;*background-color:#00729b}.btn-primary:active,.btn-primary.active{background-color:#005f81 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f58a0f;background-image:-moz-linear-gradient(top,#ff941a,#e67a00);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff941a),to(#e67a00));background-image:-webkit-linear-gradient(top,#ff941a,#e67a00);background-image:-o-linear-gradient(top,#ff941a,#e67a00);background-image:linear-gradient(to bottom,#ff941a,#e67a00);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff941a',endColorstr='#ffe67a00',GradientType=0);border-color:#e67a00 #e67a00 #995200;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e67a00;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#e67a00;*background-color:#cc6d00}.btn-warning:active,.btn-warning.active{background-color:#b35f00 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#d13a00;background-image:-moz-linear-gradient(top,#e64000,#b33200);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e64000),to(#b33200));background-image:-webkit-linear-gradient(top,#e64000,#b33200);background-image:-o-linear-gradient(top,#e64000,#b33200);background-image:linear-gradient(to bottom,#e64000,#b33200);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe64000',endColorstr='#ffb33200',GradientType=0);border-color:#b33200 #b33200 #661d00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#b33200;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#b33200;*background-color:#992b00}.btn-danger:active,.btn-danger.active{background-color:#802400 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#699e00;background-image:-moz-linear-gradient(top,#77b300,#558000);background-image:-webkit-gradient(linear,0 0,0 100%,from(#77b300),to(#558000));background-image:-webkit-linear-gradient(top,#77b300,#558000);background-image:-o-linear-gradient(top,#77b300,#558000);background-image:linear-gradient(to bottom,#77b300,#558000);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff77b300',endColorstr='#ff558000',GradientType=0);border-color:#558000 #558000 #230;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#558000;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#558000;*background-color:#460}.btn-success:active,.btn-success.active{background-color:#334d00 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#993dc7;background-image:-moz-linear-gradient(top,#a347d1,#8a2eb8);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a347d1),to(#8a2eb8));background-image:-webkit-linear-gradient(top,#a347d1,#8a2eb8);background-image:-o-linear-gradient(top,#a347d1,#8a2eb8);background-image:linear-gradient(to bottom,#a347d1,#8a2eb8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa347d1',endColorstr='#ff8a2eb8',GradientType=0);border-color:#8a2eb8 #8a2eb8 #5c1f7a;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#8a2eb8;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#8a2eb8;*background-color:#7a29a3}.btn-info:active,.btn-info.active{background-color:#6b248f \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#2b2b2b;background-image:-moz-linear-gradient(top,#262626,#333);background-image:-webkit-gradient(linear,0 0,0 100%,from(#262626),to(#333));background-image:-webkit-linear-gradient(top,#262626,#333);background-image:-o-linear-gradient(top,#262626,#333);background-image:linear-gradient(to bottom,#262626,#333);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff262626',endColorstr='#ff333333',GradientType=0);border-color:#333 #333 #0d0d0d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#333;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#333;*background-color:#262626}.btn-inverse:active,.btn-inverse.active{background-color:#191919 \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{border-color:transparent;cursor:pointer;color:#e3e3e3;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#fff;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#262626;text-decoration:none}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#f80;border:1px solid transparent;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.alert,.alert h4{color:#a47e3c}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#bbbfc2;border-color:#aeb4b6;color:#468847}.alert-success h4{color:#468847}.alert-danger,.alert-error{background-color:#bbbfc2;border-color:#b3b9bb;color:#b94a48}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{background-color:#bbbfc2;border-color:#a8afb1;color:#005f81}.alert-info h4{color:#005f81}.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-left:0;margin-bottom:20px;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#bbbfc2}.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:#adafae;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-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,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#e3e3e3}.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;content:"";line-height:0}.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,.nav-tabs>li>a:focus{border-color:#bbbfc2 #bbbfc2 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#bbb;background-color:#161616;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.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,.nav-pills>.active>a:focus{color:#fff;background-color:#e3e3e3}.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;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2}.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{border-top-color:#e3e3e3;border-bottom-color:#e3e3e3;margin-top:6px}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.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:#bbb;border-bottom-color:#bbb}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#adafae;border-color:#adafae}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#adafae}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0}.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,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{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,.tabs-left>.nav-tabs>li>a:focus{border-color:#bbbfc2 #ddd #bbbfc2 #bbbfc2}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{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,.tabs-right>.nav-tabs>li>a:focus{border-color:#bbbfc2 #bbbfc2 #bbbfc2 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#adafae}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default}.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2}.navbar-inner{min-height:52px;padding-left:20px;padding-right:20px;background-color:#1f1f1f;background-image:-moz-linear-gradient(top,#1f1f1f,#1f1f1f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1f1f1f),to(#1f1f1f));background-image:-webkit-linear-gradient(top,#1f1f1f,#1f1f1f);background-image:-o-linear-gradient(top,#1f1f1f,#1f1f1f);background-image:linear-gradient(to bottom,#1f1f1f,#1f1f1f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1f1f1f',endColorstr='#ff1f1f1f',GradientType=0);border:1px solid none;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-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);*zoom:1}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{float:left;display:block;padding:16px 20px 16px;margin-left:-20px;font-size:20px;font-weight:200;color:#e3e3e3;text-shadow:0 1px 0 #1f1f1f}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:52px;color:#adafae}.navbar-link{color:#adafae}.navbar-link:hover,.navbar-link:focus{color:#fff}.navbar .divider-vertical{height:52px;margin:0 9px;border-left:1px solid #1f1f1f;border-right:1px solid #1f1f1f}.navbar .btn,.navbar .btn-group{margin-top:11px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:11px}.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:11px;margin-bottom:0}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;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-left:0;padding-right: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,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(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:16px 15px 16px;color:#adafae;text-decoration:none;text-shadow:0 1px 0 #1f1f1f}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#fff;text-decoration:none}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:#1f1f1f;-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-left:5px;margin-right:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#121212;background-image:-moz-linear-gradient(top,#121212,#121212);background-image:-webkit-gradient(linear,0 0,0 100%,from(#121212),to(#121212));background-image:-webkit-linear-gradient(top,#121212,#121212);background-image:-o-linear-gradient(top,#121212,#121212);background-image:linear-gradient(to bottom,#121212,#121212);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff121212',endColorstr='#ff121212',GradientType=0);border-color:#121212 #121212 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#121212;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#121212;*background-color:#050505}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#000 \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{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:9px}.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #262626;position:absolute;top:-6px;left:10px}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0;bottom:-7px;top:auto}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #262626;border-bottom:0;bottom:-6px;top:auto}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#1f1f1f;color:#fff}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#adafae;border-bottom-color:#adafae}.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:#fff;border-bottom-color:#fff}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-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:#252a30;background-image:-moz-linear-gradient(top,#252a30,#252a30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#252a30),to(#252a30));background-image:-webkit-linear-gradient(top,#252a30,#252a30);background-image:-o-linear-gradient(top,#252a30,#252a30);background-image:linear-gradient(to bottom,#252a30,#252a30);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff252a30',endColorstr='#ff252a30',GradientType=0);border-color:transparent}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#adafae;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#adafae}.navbar-inverse .navbar-text{color:#adafae}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:#242a31;color:#fff}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#242a31}.navbar-inverse .navbar-link{color:#adafae}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-left-color:#252a30;border-right-color:#252a30}.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{background-color:#242a31;color:#fff}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#adafae;border-bottom-color:#adafae}.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:#5d6978;border-color:#252a30;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#262626;text-shadow:0 1px 0 #fff;background-color:#fff;border: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);outline:0}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#1a1d22;background-image:-moz-linear-gradient(top,#1a1d22,#1a1d22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1a1d22),to(#1a1d22));background-image:-webkit-linear-gradient(top,#1a1d22,#1a1d22);background-image:-o-linear-gradient(top,#1a1d22,#1a1d22);background-image:linear-gradient(to bottom,#1a1d22,#1a1d22);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1a1d22',endColorstr='#ff1a1d22',GradientType=0);border-color:#1a1d22 #1a1d22 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#1a1d22;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#1a1d22;*background-color:#0f1113}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#040405 \9}.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:.7;filter:alpha(opacity=70)}.modal{position:fixed;z-index:1050;width:100%;background-color:#fff;-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;outline:0}.modal.fade{-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;top:-25%}.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;overflow-y:auto;padding:15px}.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-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;*zoom:1}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#3a3939;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#3a3939}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#3a3939}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#3a3939}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#3a3939}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#262626;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#262626;border-bottom:1px solid #191919;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#262626}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#262626}.popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#262626}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#262626;bottom:-10px}.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;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#adafae}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{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:#f80}.label-warning[href],.badge-warning[href]{background-color:#cc6d00}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#005f81}.label-info[href],.badge-info[href]{background-color:#00394e}.label-inverse,.badge-inverse{background-color:#262626}.label-inverse[href],.badge-inverse[href]{background-color:#0c0c0c}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}label,input,button,select,textarea,.navbar .search-query:-moz-placeholder,.navbar .search-query::-webkit-input-placeholder{font-family:'Droid Sans',sans-serif;color:#bbb}blockquote{border-left:5px solid #262626}blockquote.pull-right{border-right:5px solid #262626}html{height:100%}body{height:100%;background:#161616}.page-header{border-bottom:1px solid #262626}hr{border-bottom:0}.navbar .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .brand{padding:0 15px;color:#e3e3e3;font-weight:normal;text-shadow:none}.navbar .nav>li>a{padding:15px 15px 14px;border-bottom:1px solid transparent}.navbar .nav>li>a:hover,.navbar .nav>.active>a,.navbar .nav>.active>a:hover{border-bottom:1px solid #33b5e5}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .navbar-text{margin-bottom:1px;padding:15px 15px 14px;line-height:inherit}.navbar .divider-vertical{margin:0;border-left:1px solid #262626;border-right-width:0}.navbar .search-query,.navbar .search-query:focus,.navbar .search-query.focused{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;background-color:#262626;line-height:normal;color:#adafae;text-shadow:none}.navbar .search-query:-moz-placeholder,.navbar .search-query:focus:-moz-placeholder,.navbar .search-query.focused:-moz-placeholder{color:#bbb}.navbar .search-query:-ms-input-placeholder,.navbar .search-query:focus:-ms-input-placeholder,.navbar .search-query.focused:-ms-input-placeholder{color:#bbb}.navbar .search-query::-webkit-input-placeholder,.navbar .search-query:focus::-webkit-input-placeholder,.navbar .search-query.focused::-webkit-input-placeholder{color:#bbb}@media(max-width:979px){.navbar .nav-collapse .nav li>a{border:0;color:#bbbfc2;font-weight:normal;text-shadow:none}.navbar .nav-collapse .nav li>a:hover{border:0;background-color:#33b5e5}.navbar .nav-collapse .nav .active>a{border:0;background-color:#33b5e5}.navbar .nav-collapse .dropdown-menu a:hover{background-color:#33b5e5}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border-top:0;border-bottom:0}.navbar .nav-collapse .nav-header{color:rgba(128,128,128,0.6)}.navbar-inverse .nav-collapse .nav li>a:hover{background-color:#111}.navbar-inverse .nav-collapse .nav .active>a{background-color:#111}.navbar-inverse .nav-collapse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav-collapse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav-collapse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111}}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}div.subnav{margin:0 1px;background-color:#1f1f1f;background-image:none;border:0;border-bottom:1px solid #262626}div.subnav .nav>li>a,div.subnav .nav>li:first-child>a,div.subnav .nav>li:first-child>a:hover{padding:11px 12px;border:0;background-color:#1f1f1f;color:#adafae}div.subnav .nav>li>a:hover,div.subnav .nav>li.active>a,div.subnav .nav>li.active>a:hover,div.subnav .nav>li:first-child>a:hover{padding:11px 12px;background:transparent;border:0;border-bottom:1px solid #33b5e5;color:#fff}div.subnav .nav li.nav-header{text-shadow:none}div.subnav-fixed{top:52px;margin:0}.nav-tabs{border-bottom:0}.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs li>a:hover,.nav-tabs li.active>a,.nav-tabs li.active>a:hover{border-color:transparent;background-color:transparent;border-bottom:2px solid #33b5e5;color:#fff}.nav-tabs li.disabled>a{color:#bbbfc2}.nav-tabs .open .dropdown-toggle{background-color:#060606;border-color:transparent}.nav-pills li>a:hover{background-color:#33b5e5;color:#fff}.nav-pills li.disabled>a{color:#bbbfc2}.nav-pills .open .dropdown-toggle{background-color:#060606}.nav-pills .dropdown-menu li>a:hover{border:0}.nav-list li>a{text-shadow:none}.nav-list li>a:hover{background-color:#33b5e5;color:#fff}.nav-list .nav-header{text-shadow:none}.nav-list .divider{background-color:transparent;border-bottom:1px solid #262626}.nav-stacked li>a{border:1px solid #262626!important}.nav-stacked li>a:hover,.nav-stacked li.active>a{background-color:#33b5e5;color:#fff}.tabbable .nav-tabs,.tabbable .nav-tabs li.active>a{border-color:#262626}.breadcrumb{background-color:transparent;background-image:none;border-width:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;font-size:14px}.breadcrumb li{text-shadow:none}.breadcrumb li>a{color:#33b5e5;text-shadow:none}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span,.pagination ul>.disabled>span:hover{background-color:rgba(0,0,0,0.2)}.pager li>a,.pager li>span{background-color:#161616;border:0}.pager li>a:hover,.pager li>span:hover{background-color:#33b5e5}.pager .disabled a,.pager .disabled a:hover{background-color:#161616}.btn{padding:5px 12px;background-image:none;-webkit-box-shadow:0 0 8px #161616;-moz-box-shadow:0 0 8px #161616;box-shadow:0 0 8px #161616;border:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-shadow:none}.btn.disabled{box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-inverse{border:1px solid #444}.btn-large{padding:14px 23px}.btn-small{padding:2px 10px}.btn-mini{padding:2px 6px}.btn-group>.btn:first-child,.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input,textarea,select{border-width:2px;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}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{color:#adafae}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly],.uneditable-input{border-color:#444}input:focus,textarea:focus,input.focused,textarea.focused{border-color:#52a8ec;outline:0;outline:thin dotted \9}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}legend,label{color:#bbbfc2;border-bottom:0 solid #222}.form-actions{border-top:1px solid #222}.table{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.table tbody tr.success td{background-color:#690;color:#fff}.table tbody tr.error td{background-color:#cc3900;color:#fff}.table tbody tr.info td{background-color:#33b5e5;color:#fff}.alert,.alert .alert-heading,.alert-success,.alert-success .alert-heading,.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading,.alert-info,.alert-info .alert-heading{color:#fff;text-shadow:none;border:0}.label{color:#fff}.badge{border-radius:0;font-weight:200}.label,.alert{background-color:#888}.label:hover{background-color:#6e6e6e}.label-important,.alert-danger,.alert-error{background-color:#cc3900}.label-important:hover{background-color:#992b00}.label-warning{background-color:#cc6d00}.label-warning:hover{background-color:#995200}.label-success,.alert-success{background-color:#5c8a00}.label-success:hover{background-color:#3a5700}.label-info,.alert-info{background-color:#00394e}.label-info:hover{background-color:#00141b}a:hover{text-decoration:none}.well,.hero-unit{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.well,.hero-unit{border-top:solid 1px #333;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.8);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.8);box-shadow:0 2px 4px rgba(0,0,0,0.8)}.thumbnail{border-color:#262626}.progress{background-color:#060606;background-image:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.modal{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;border-top:solid 1px #333;background-color:#1f1f1f}.modal-header{border-bottom:1px solid #1f1f1f}.modal-footer{background-color:#1f1f1f;border-top:1px solid #1f1f1f;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.popover{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.popover-title{border-bottom:0;color:#fff}.footer{border-top:1px solid #262626}.caret{color:#bbbfc2}.dropdown-submenu>a:after{border-left-color:#bbbfc2}@media(max-width:767px){div.panel{width:100%!important;padding:0!important}}.container-fluid{padding-left:0;padding-right:0}.main-view-container{padding:5px 10px;width:100%;box-sizing:border-box}.bgNav{background:#1f1f1f}.bgPrimary{background:#005f81;color:rgba(255,255,255,0.9)}.bgInfo{background:#a347d1;color:rgba(255,255,255,0.9)}.bgSuccess{background:#77b300;color:rgba(255,255,255,0.9)}.bgWarning{background:#ff941a;color:rgba(255,255,255,0.9)}.bgDanger{background:#e64000;color:rgba(255,255,255,0.9)}.bgInverse{background:#262626;color:rgba(255,255,255,0.9)}code,pre{background-color:#bbbfc2}div.editor-row{vertical-align:top}div.editor-row div.section{margin-right:20px;vertical-align:top;display:inline-block}div.editor-option{vertical-align:top;display:inline-block;margin-right:10px}div.editor-option label{display:block}#events{font-size:12px}.version{font-size:85%}.legend{color:#000}div.fake-input{background-color:#333;border:1px solid #333;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;border-radius:3px 3px 3px 3px}hr.small{margin:5px 0}form input.ng-invalid{color:#b94a48}.editor-title{margin-right:10px;font-size:1.7em;font-weight:bold;text-transform:capitalize}.editor-title small{opacity:.5;font-size:.7em;font-weight:normal}.bordered{border:1px solid #262626}.table-unpadded th,.table-unpadded td{padding:0 2px}.spy{position:absolute;right:0;top:0}.navbar-inner{border-width:0}.grafana-row{margin-bottom:5px}.row-tab .dropdown-menu-right{top:0;left:33px}.row-tab-button{padding:0;cursor:pointer;vertical-align:middle;width:30px;height:30px;text-align:center;display:inline-block;line-height:30px}.row-button{width:30px;float:left;cursor:pointer;line-height:31px}.row-text{white-space:nowrap;text-transform:uppercase;font-weight:bold;font-size:.9em;text-align:center;line-height:31px;height:31px}.row-close{padding:0;margin:0;background:#1f1f1f;text-align:center}.row-close-buttons{position:absolute;left:0}.row-open{margin-top:5px;left:-34px;position:absolute;z-index:100;transition:.10s left;transition-delay:.10s;-webkit-transition-delay:.10s}.row-open:hover{left:-12px}.odd{background-color:rgba(100,100,100,0.3)}.nomargin{margin:0}[ng\:cloak],[ng-cloak],.ng-cloak{display:none!important}.table tbody+tbody{border-top:0}.ui-draggable-dragging{display:block;z-index:9999}.link{color:#e3e3e3;cursor:pointer}.link:hover{color:#fff}.pointer{cursor:pointer}.popover{max-width:480px}.tiny{font-size:50%}.smaller{font-size:70%}.small{font-size:85%}.large{font-size:120%}.strong{font-weight:bold}a{cursor:pointer}.normal{font-weight:normal}.light{font-weight:200}.input-smaller{width:75px}.string{color:#c8ccce}.number{color:#00729b}.boolean{color:#b78c43}.key{color:#c05c5a}.btn-active{background-color:#e6e6e6;background-image:none;box-shadow:0 2px 4px rgba(0,0,0,0.15) inset,0 1px 2px rgba(0,0,0,0.05);outline:0 none}.remove:hover{background-color:#b33200}.faded{opacity:.2}div.flot-text{color:#bbbfc2!important}.page-alert-list{z-index:8000;min-width:300px;max-width:300px;position:fixed;right:20px;top:56px}.page-alert-list .alert{color:#fff;padding-bottom:13px;position:relative}.page-alert-list .alert-close{position:absolute;top:-4px;right:-2px;width:19px;height:19px;padding:0;background:#bbbfc2;border-radius:50%;border:0;font-size:1.1rem;color:#1f1f1f}.page-alert-list .alert-title{font-weight:bold;padding-bottom:2px}.alert-warning{background-color:#f80;border-color:transparent;color:#a47e3c}.popover.topLeft{margin-top:-10px}.popover.topLeft .arrow{bottom:-10px;left:25%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#262626}.popover.topLeft .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.topRight{margin-top:-10px}.popover.topRight .arrow{bottom:-10px;left:75%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#262626}.popover.topRight .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.rightTop .arrow{top:10%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightTop .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#262626}.popover.rightBottom .arrow{top:90%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightBottom .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#262626}.popover.bottomLeft .arrow{left:10%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottomLeft .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#262626}.popover.bottomRight .arrow{left:90%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottomRight .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#262626}.popover.leftTop .arrow{top:10%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftTop .arrow:after{right:1px;border-right-width:0;border-left-color:#262626;bottom:-10px}.popover.leftBottom .arrow{top:90%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftBottom .arrow:after{right:1px;border-right-width:0;border-left-color:#262626;bottom:-10px}.popover.topLeft .arrow{left:10%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.topLeft .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#262626}.popover.topRight .arrow{left:90%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.topRight .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#262626}.typeahead{max-height:300px;overflow-y:auto}.label-tag{background-color:#93c;color:#f2f2f2;border-radius:2px;text-shadow:none;font-size:13px;padding:4px 6px}.label-tag .icon-tag{position:relative;top:1px;padding-right:4px}.label-tag:hover{opacity:.85;background-color:#7a29a3}.save-dashboard-dropdown{padding:10px}.save-dashboard-dropdown li>a{padding-left:5px}.save-dashboard-dropdown-save-form{margin-bottom:5px}.inspector-request-table td{padding:5px}.inspector-request-table td:first-child{white-space:nowrap}.modal-body{padding:0}code,pre{background-color:#1f1f1f;color:#bbbfc2}.login-form{width:50%;float:left;margin-left:25%;margin-right:25%;padding-top:50px}.login-box{width:700px;margin:100px auto 0 auto}.login-box-logo{text-align:center;padding-bottom:50px}.login-inner-box{background:#1f1f1f}.login-tab-header{background:#262626;text-align:center}.btn-login-tab{background:transparent;border:0;font-size:15px;padding:10px 10px;font-weight:bold;display:inline-block;width:170px;color:#bbbfc2}.btn-login-tab.active{background:#191919;color:#fff}.btn-login-tab:focus{outline:0}.password-strength{display:block;width:50px;overflow:visible;white-space:nowrap;padding-top:3px;margin-left:97px;color:#858c92;border-top:3px solid #cc3900}.password-strength.password-strength-ok{width:170px;border-top:3px solid #f0c942}.password-strength.password-strength-good{width:254px;border-top:3px solid #8c0}.login-submit-button-row{text-align:center;margin-top:40px}.login-submit-button-row button{padding:9px 7px;font-size:14px;font-weight:bold;width:150px;display:inline-block;border:1px solid #404040}.login-oauth{margin-top:30px;padding:10px;background:#262626}.login-oauth .btn-google{background:#dd4b39;color:white}.login-oauth .btn-github{background:#555;color:white}.submenu-controls-visible .panel-fullscreen{top:88px}.submenu-controls{margin:10px 10px 0 0;font-size:16px}.annotation-disabled,.annotation-disabled a{color:#707070}.annotation-segment label.cr1{margin-left:5px}.graph-canvas-wrapper{position:relative;cursor:crosshair}.graph-legend{margin:0 20px;text-align:center}.graph-legend .popover-content{padding:0}.graph-legend-icon{position:relative;padding-right:4px;top:1px}.graph-legend-icon,.graph-legend-alias,.graph-legend-value{float:left;white-space:nowrap;font-size:85%;text-align:left}.graph-legend-icon.current:before,.graph-legend-alias.current:before,.graph-legend-value.current:before{content:"Current: "}.graph-legend-icon.max:before,.graph-legend-alias.max:before,.graph-legend-value.max:before{content:"Max: "}.graph-legend-icon.min:before,.graph-legend-alias.min:before,.graph-legend-value.min:before{content:"Min: "}.graph-legend-icon.total:before,.graph-legend-alias.total:before,.graph-legend-value.total:before{content:"Total: "}.graph-legend-icon.avg:before,.graph-legend-alias.avg:before,.graph-legend-value.avg:before{content:"Avg: "}.graph-legend-icon .fa{font-size:135%;position:relative;top:1px}.graph-legend-series{float:left;white-space:nowrap;padding-left:10px;padding-top:6px}.graph-legend-value{padding-left:6px}.graph-legend-table{display:table;width:100%;margin:0}.graph-legend-table .graph-legend-series{display:table-row;float:none;padding-left:0}.graph-legend-table .graph-legend-series.pull-right{float:none}.graph-legend-table td,.graph-legend-table .graph-legend-alias,.graph-legend-table .graph-legend-icon,.graph-legend-table .graph-legend-value{float:none;display:table-cell;white-space:nowrap;padding:2px 10px;text-align:right;border-bottom:1px solid #000}.graph-legend-table .graph-legend-icon{width:5px;padding:0;top:0}.graph-legend-table .graph-legend-icon .fa{top:4px}.graph-legend-table .graph-legend-value{padding-left:15px}.graph-legend-table .graph-legend-alias{padding-left:7px;text-align:left;width:95%}.graph-legend-table .graph-legend-series:nth-child(odd){background-color:#242424}.graph-legend-table .graph-legend-value.current:before,.graph-legend-table .graph-legend-value.max:before,.graph-legend-table .graph-legend-value.min:before,.graph-legend-table .graph-legend-value.total:before,.graph-legend-table .graph-legend-value.avg:before{content:''}.graph-legend-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#33b5e5;font-size:85%;white-space:nowrap}.graph-legend-rightside.graph-wrapper{display:table;width:100%}.graph-legend-rightside .graph-canvas-wrapper{display:table-cell;width:100%;position:relative}.graph-legend-rightside .graph-legend-wrapper{display:table-cell;vertical-align:top;position:relative;left:4px}.graph-legend-rightside .graph-legend{margin:0}.graph-legend-rightside .graph-legend-series{display:block;padding-left:0}.graph-legend-rightside .graph-legend-table .graph-legend-series{display:table-row}.graph-legend-series-hidden a{color:#707070}.graph-legend-popover{width:200px}.graph-legend-popover label{display:inline-block}.graph-legend-popover .btn{padding:1px 3px;margin-right:0;line-height:initial}.graph-legend-popover .close{margin-right:5px;color:#e3e3e3;opacity:.7;text-shadow:none}.graph-legend-popover .editor-row{padding:5px}.annotation-tags{color:#93c}.graph-series-override input{float:left;margin-right:10px}.graph-series-override .graph-series-override-option{float:left;padding:2px 6px}.graph-series-override .graph-series-override-selector{float:left}.graph-tooltip{white-space:nowrap}.graph-tooltip .graph-tooltip-time{text-align:center;font-weight:bold;position:relative;top:-3px}.graph-tooltip .graph-tooltip-list-item{display:table-row}.graph-tooltip .graph-tooltip-series-name{display:table-cell}.graph-tooltip .graph-tooltip-value{display:table-cell;font-weight:bold;padding-left:10px;text-align:right}.left-yaxis-label{top:50%;left:-5px;transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);transform-origin:left top;-o-transform-origin:left top;-ms-transform-origin:left top;-moz-transform-origin:left top;-webkit-transform-origin:left top}.right-yaxis-label{top:50%;right:-5px;-webkit-transform:rotate(90deg);-webkit-transform-origin:right top;-moz-transform:rotate(90deg);-moz-transform-origin:right top;-ms-transform:rotate(90deg);-ms-transform-origin:right top;-o-transform:rotate(90deg);-o-transform-origin:right top;transform:rotate(90deg);transform-origin:right top}.axisLabel{color:#bbbfc2;font-size:11.9px;position:absolute;text-align:center;font-size:12px}.bootstrap-tagsinput{display:inline-block;padding:4px 6px;margin-bottom:10px;color:#555;vertical-align:middle;border-radius:4px;max-width:100%;line-height:22px;background-color:#333;border:1px solid #333;-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}.bootstrap-tagsinput input{border:0;box-shadow:none;outline:0;background-color:transparent;padding:0;padding-left:5px;margin:0;width:auto!important;max-width:inherit}.bootstrap-tagsinput input:focus{border:0;box-shadow:none}.bootstrap-tagsinput .tag{margin-right:2px;color:white}.bootstrap-tagsinput .tag [data-role="remove"]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role="remove"]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role="remove"]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.bootstrap-tagsinput .tag [data-role="remove"]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.grafana-options-table{width:100%}.grafana-options-table th{padding:5px 10px;border-bottom:4px solid #1f1f1f}.grafana-options-table tr td{background-color:#262626;padding:5px 10px;white-space:nowrap;border-bottom:4px solid #1f1f1f}.grafana-options-table tr td.nobg{background-color:transparent}.grafana-options-table .max-width-btns{padding-right:0}.grafana-options-table .max-width-btns .btn{box-sizing:border-box;width:100%}.max-width{overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap}.grafana-options-list{list-style:none;margin:0;max-width:450px}.grafana-options-list li:nth-child(odd){background-color:#242424}.grafana-options-list li{float:left;margin:2px;padding:5px 10px;border:1px solid #000}.grafana-options-list li:first-child{border:1px solid #000}.search-container{left:52px;top:33px;margin:15px;z-index:1000;position:absolute;width:700px;box-shadow:0 0 55px 0 black;padding:10px;background-color:#1f1f1f;border:1px solid #333}.search-container .label-tag{margin-left:6px;font-size:11px;padding:2px 6px}.search-field-wrapper{padding-bottom:10px}.search-field-wrapper input{width:100%;padding:18px 8px;box-sizing:border-box}.search-field-wrapper button{margin:0 4px 0 0}.search-field-wrapper>span{display:block;overflow:hidden}.search-results-container{height:450px;overflow:auto;display:block;line-height:28px}.search-results-container .search-result-item:hover,.search-results-container .search-result-item.selected{background-color:#333}.search-results-container .selected .search-result-tag{opacity:.70;color:white}.search-results-container .fa-star,.search-results-container .fa-star-o{padding-left:13px}.search-results-container .fa-star{color:#f80}.search-results-container .search-result-link{color:#bbbfc2}.search-results-container .search-result-link .fa{padding-right:10px}.search-results-container .search-result-item{display:block;padding:3px 10px;white-space:nowrap;background-color:#262626;margin-bottom:4px}.search-results-container .search-result-tags{float:right}.search-results-container .search-result-actions{float:right;padding-left:20px}.search-switches{position:absolute;top:19px;right:21px}.search-button-row{padding-top:20px}.search-button-row button,.search-button-row a{margin-right:10px}.panel{display:inline-block;float:left;vertical-align:top;position:relative}.panel-margin{margin:5px;display:block}.panel-container{background-color:#1f1f1f;position:relative;border:solid 1px #262626}.panel-container:hover .panel-actions{display:block}.panel-container.panel-transparent{background-color:transparent;border:0}.panel-content{padding:0 10px 5px 10px}.panel-title-container{min-height:5px;padding-top:4px;cursor:context-menu}.panel-title{border:0;font-weight:bold;position:relative;cursor:context-menu;width:100%;display:block}.panel-title.has-panel-links .panel-title-text:after{content:"\f08e";font-family:'FontAwesome';font-size:80%;padding-left:10px;position:relative;top:-1px}.panel-loading{position:absolute;top:-3px;right:0;z-index:800}.panel-header{text-align:center}.panel-error{color:#fff;position:absolute;left:0;padding:0 17px 6px 5px;top:0;z-index:10}.panel-error i{position:relative;top:-2px}.panel-error-arrow{width:0;height:0;position:absolute;border-left:31px solid transparent;border-right:30px solid transparent;border-bottom:27px solid #1f1f1f;left:0;bottom:0}.panel-fullscreen{z-index:100;display:block;position:fixed;left:0;right:0;top:60px;padding:0;overflow-y:auto;height:100%}.panel-fullscreen .dropdown-menu{margin-bottom:70px}.panel-fullscreen .panel-container{margin:15px}.panel-fullscreen .panel-menu{top:0}.panel-fullscreen .panel-title-container{padding:8px}.panel-full-edit{margin-top:30px;padding-bottom:130px}.panel-menu{z-index:500;position:absolute;background:#333;border:1px solid black;top:-62px}.panel-menu .panel-menu-row{white-space:nowrap;border-bottom:1px solid black}.panel-menu .panel-menu-row:last-child{border-bottom:0}.panel-menu .panel-menu-link,.panel-menu .panel-menu-icon{padding:5px 10px}.panel-menu .panel-menu-link{display:inline-block;border-right:1px solid black}.panel-menu .panel-menu-link:last-child{border:0}.panel-menu .dropdown-menu{text-align:left}.panel-highlight{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.on-drag-hover .panel-container{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.panel-drop-zone{display:none}.panel-drop-zone .panel-container{border:1px solid #262626}.panel-ghost{width:100%}.panel-ghost .panel-container{border:0;background:transparent}.panel-ghost .panel-ghost-list{margin:10px 0 10px 20px}.panel-ghost button{text-align:left;min-width:135px}.panel-ghost button .fa{position:relative;left:-5px}.panel-time-info{font-weight:bold;float:right;margin-right:15px;color:#33b5e5;font-size:85%;position:absolute;top:0;right:0}input[type=text].input-fluid{width:100%;box-sizing:border-box;padding:10px;font-size:16px;-moz-box-sizing:border-box;height:100%}input[type="checkbox"].cr1{display:none}label.cr1{display:inline-block;height:19px;clear:none;text-indent:2px;margin:0 0 1px 0;padding:0 0 0 20px;vertical-align:middle;background:url('../img/checkbox.png') left top no-repeat;cursor:pointer}input[type="checkbox"]:checked+label{background:url('../img/checkbox.png') 0 -18px no-repeat}.gf-form{padding-bottom:10px}.gf-form .checkbox-label{padding-left:7px;display:inline}.gf-fluid-input{border:0;display:block;overflow:hidden;padding-right:10px}.gf-fluid-input input[type=text]{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.gf-fluid-input textarea{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.singlestat-panel{position:relative;display:table;width:100%}.singlestat-panel-value-container{padding:20px;display:table-cell;vertical-align:middle;text-align:center;position:relative;z-index:1;font-size:3em;font-weight:bold}.singlestat-panel-prefix{padding-right:20px}.singlestat-panel-table{width:100%}.singlestat-panel-table td{padding:5px 10px;white-space:nowrap;text-align:right;border-bottom:1px solid #000}.singlestat-panel-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#33b5e5}.singlestat-panel-table td:first-child{text-align:left}.singlestat-panel-table tr:nth-child(odd) td{background-color:#242424}.singlestat-panel-table tr:last-child td{border:0}.tight-form{border-top:1px solid #000;border-left:1px solid #000;border-right:1px solid #000;background:#262626;width:100%}.tight-form:last-child,.tight-form.last{border-bottom:1px solid #000}.tight-form.borderless{background:transparent;border:0}.tight-form .checkbox-label{display:inline;padding-right:4px;margin-bottom:0}.spaced-form .tight-form{margin:7px 0}.borderless .tight-form-item,.borderless .tight-form-input{border:0}.tight-form-container .tight-form:last-child{border-bottom:0}.tight-form-container:last-child{border-bottom:1px solid #000}.tight-form-btn{padding:8px 12px}.tight-form-list{list-style:none;margin:0}.tight-form-list>li{float:left}.grafana-metric-options{margin-top:35px}.tight-form-item{padding:8px 7px;font-weight:normal;border-right:1px solid #050505;color:#c8c8c8;display:inline-block}.has-open-function .tight-form-item{padding-top:25px}.tight-form-disabled .tight-form-item{color:#888}.tight-form-item:hover,.tight-form-item:focus{text-decoration:none}.tight-form-itema:hover{background:#333}.tight-form-item.template-param-name{border-right:0;padding-right:0;padding-left:18px}.tight-form-item.annotation-segment{padding:8px 10px}.tight-form-item.last{border-right:0}.tight-form-item .fa-caret-down{font-size:75%;position:relative;top:1px}.tight-form-item-icon i{width:15px;text-align:center;display:inline-block}.tight-form-func{background:#333}.tight-form-func>a{color:#c8c8c8}.tight-form-func>a:hover{color:#e3e3e3}.tight-form-func.show-function-controls{padding-top:5px;min-width:100px;text-align:center}input[type=text].tight-form-func-param{background:transparent;border:0;margin:0;padding:0}input[type=text].tight-form-clear-input{padding:8px 7px;border:0;margin:0;background:transparent;float:left;color:#c8c8c8;border-radius:0;border-right:1px solid #050505}[type=text].tight-form-input,[type=email].tight-form-input,[type=number].tight-form-input,[type=password].tight-form-input{border:0;border-right:1px solid #050505;margin:0;border-radius:0;padding:8px 6px;height:100%;box-sizing:border-box}[type=text].tight-form-input.last,[type=email].tight-form-input.last,[type=number].tight-form-input.last,[type=password].tight-form-input.last{border-right:0}input[type=checkbox].tight-form-checkbox{margin:0}select.tight-form-input{border:0;border-right:1px solid #050505;margin:0;border-radius:0;height:36px;padding:8px 3px}select.tight-form-input.last{border-right:0}.tight-form-func-controls{display:none;text-align:center}.tight-form-func-controls .fa-arrow-left{float:left;position:relative;top:2px}.tight-form-func-controls .fa-arrow-right{float:right;position:relative;top:2px}.tight-form-func-controls .fa-remove{margin-left:10px}.tight-form-radio input[type=radio]{margin:0}.tight-form-radio label{display:inline}.sidemenu-canvas{position:relative}.sidemenu-wrapper{position:absolute;display:none;top:0;bottom:0;left:0;width:200px;background:#161616;min-height:100%;z-index:101}.sidemenu-wrapper a:focus{text-decoration:none}.sidemenu-open .sidemenu-wrapper{display:block}.sidemenu-open .search-container{left:200px}.sidemenu-open .main-view{padding-left:200px}.sidemenu-open .panel-fullscreen{left:200px}.sidemenu{font-size:16px;font-weight:400;list-style:none;margin:0;padding:0}.sidemenu>li{margin-bottom:9px}.sidemenu .fa-caret-down{position:relative;top:2px;font-size:90%}.sidemenu.sidemenu-small{font-size:14px}.sidemenu.sidemenu-small .icon-circle{border-radius:50%;background:#000;box-shadow:0 0 14px 2px rgba(255,255,255,0.05);border:1px solid transparent;width:28px;height:28px}.sidemenu.sidemenu-small .icon-circle i{top:1px;left:4px;font-size:110%}.sidemenu.sidemenu-small .sidemenu-item{line-height:28px;padding-left:25px}.sidemenu-item-text{width:110px;display:inline-block;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.sidemenu-top-btn{display:block;padding:8px 0 4px 22px;background-color:#1f1f1f;border-right:3px solid #161616}.sidemenu-top-btn img{border-radius:50%;background:#000;border:1px solid #161616;width:30px;padding:4px}.sidemenu-top-btn i{padding-right:5px;padding-top:5px;font-size:170%;color:#e3e3e3}.icon-circle{width:40px;height:40px;display:inline-block}.icon-circle i{color:#e3e3e3;opacity:.7;position:relative;left:7px;top:5px;font-size:150%}.sidemenu-item{color:#e3e3e3;line-height:40px;padding:0 10px 0 20px;display:block;white-space:nowrap}.sidemenu-item .sidemenu-item-text{padding-left:11px;transition:color 100ms ease-out}.sidemenu-item .sidemenu-item-text.no-icon{padding-left:59px}.sidemenu-item img{border-radius:50%;width:28px;height:28px;box-shadow:0 0 14px 2px rgba(255,255,255,0.05)}.sidemenu-system-section{background-color:#005f81;color:#fff;padding:3px 0;margin-left:10px;margin-right:10px;border-radius:2px}.sidemenu-system-section .sidemenu-system-section-inner{border:2px solid black;border-left:none;border-right:0;padding:4px;overflow:hidden}.sidemenu-system-section .fa{float:left;font-size:120%;line-height:41px;padding:0 15px}.sidemenu-section-tagline{font-style:italic;font-size:75%;line-height:10px}.sidemenu-section-text-wrapper{padding-top:4px}.navbar-inner{padding-left:0}.navbar .nav>li>a{padding:17px 15px 13px}.navbar .nav>li>a .fa{font-size:115%}.top-nav{float:left;font-size:16px}.fa.top-nav-breadcrumb-icon{margin:18px 0 6px 5px;float:left;font-size:120%;color:#bbbfc2}.top-nav-menu-btn{border:1px solid #161616;border-radius:50%;background:#000;display:block;position:relative;float:left;width:30px;height:30px;padding:4px;margin:6px 6px 3px 9px}.top-nav-menu-btn .fa{color:#bbbfc2;width:30px;height:30px;left:9px;top:7px;font-size:150%;opacity:0;position:absolute;transition:opacity .2s ease-in-out}.top-nav-menu-btn img{width:30px;position:absolute;opacity:1;transition:opacity .2s ease-in-out}.top-nav-menu-btn:hover .fa{opacity:.7}.top-nav-menu-btn:hover img{opacity:0}.top-nav-dashboards-btn{display:block;float:left;margin:9px 18px 5px 14px;border-radius:3px;font-size:1.4em;color:#a2a2a2;border:solid 1px #555}.top-nav-dashboards-btn a{display:inline-block;background:#333;padding:5px 15px 5px 10px;border-radius:3px;color:#a2a2a2}.top-nav-dashboards-btn a:hover{background:#444}.top-nav-dashboards-btn a:hover .fa{color:#e3e3e3}.top-nav-dashboards-btn .fa-th-large{position:relative;top:2px}.top-nav-dashboards-btn .fa-caret-down{font-size:60%;position:relative;top:4px}.dashboard-title{padding:0 6px 5px 5px;color:#fff;font-size:17px}.top-nav-icon{margin:5px 0 0 11px;line-height:41px;float:left}.top-nav-section{display:block;float:left;padding:19px 9px 8px 0;font-weight:bold}.top-nav-section i{padding-left:8px}.top-nav-title{display:block;float:left;font-size:17px;padding:18px 10px 10px 13px;color:#e3e3e3}.top-nav-snapshot-title{display:block;float:left;font-size:1.4em;margin:9px 18px 5px 14px;color:#e3e3e3}.top-nav-snapshot-title .gf-icon{position:relative;top:3px;font-size:27px}.top-nav-snapshot-title a{display:inline-block;padding:0 15px 5px 10px}.gf-box{margin:15px;background-color:#1f1f1f;position:relative;border:1px solid #333}.gf-box-no-margin{margin:0}.gf-box-header-close-btn{float:right;padding:0;margin:0;background-color:transparent;border:0;padding:8px;font-size:120%;color:#bbbfc2}.gf-box-header-close-btn:hover{color:#fff}.gf-box-body{padding:20px;min-height:150px}.gf-box-footer{overflow:hidden}.gf-box-header{border-bottom:1px solid #333;overflow:hidden;background-color:#262626}.gf-box-header .tabs{float:left}.gf-box-header .nav{margin:0}.gf-box-title{padding-right:20px;padding-left:10px;float:left;color:#e3e3e3;font-size:18px;font-weight:normal;line-height:38px;margin:0}.gf-box-title .fa{padding:0 8px 0 5px;color:#bbbfc2}.page-container{margin:15px;background:#1f1f1f;position:relative;border:1px solid #262626;padding:20px 20px 60px 49px}.page-container h2{color:#bbbfc2;font-weight:normal;font-size:22px}.page{max-width:653px}.admin-page{max-width:800px;margin-left:10px}.admin-page .gf-box{margin-top:0}.admin-page .gf-box-body{min-height:0}.admin-page h2{margin-left:15px;margin-bottom:0;font-size:17.5px;color:#bbbfc2}.admin-page h2 i{padding-right:6px}.dashlist-link{display:block;margin:5px;padding:7px;background-color:#262626;border:1px solid #000}.dashlist-link .fa{float:right;padding-top:3px}.dashlist-link .fa-star{color:#f80}.dashlist-link:hover{background-color:#333}.admin-settings-section{color:#32d1df;font-weight:bold}td.admin-settings-key{padding-left:20px}input[type=text].ng-dirty.ng-invalid{box-shadow:inset 0 0 7px #cc3900}@font-face{font-family:'raintank';src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SAywAAAC8AAAAYGNtYXAaVcxZAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zm7/N1QAAAFwAAAFmGhlYWQFNK2SAAAHCAAAADZoaGVhB14DyAAAB0AAAAAkaG10eAwxAAQAAAdkAAAAHGxvY2ECNgP2AAAHgAAAABBtYXhwABcAvAAAB5AAAAAgbmFtZflvA+cAAAewAAABTnBvc3QAAwAAAAAJAAAAACAAAwQAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADmAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIOYC//3//wAAAAAAIOYA//3//wAB/+MaBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAADwAA/7YDnAO3AAMAHQAhACUAKgAuADEAQgBTAGQAdQCGAJcAqAC5AAA3FyUnJTUTJzUjJwcjJwcjFQcTBxcVIQ0BNzM1NycTAxEXJTkCByERIREHFSc3NzEzAxQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwE2FhUHNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATYWFXsKAS9VAbOKkFsDmDvbEZhXTjY/Alj+wQFGGT4mIU5TU/3CmgJU/awxICDLAWUbE40TGxsTjRMbLo0LERELjQwQEAzQHBONExsbE40UG9cQC40MEBAMjQsQ7BsTjRMbGxONExvXEAuNDBAQDIwMEAEbjRMbGxONFBsbFKgQC40MEBAMjQsQDkMvFvQEAfYoVRcXPDxGDf4JwhFKBFpdHAbPAdn+zwFIF54x/ZsCZUbPygV3/s4TGxsTjBQbHBOMqRAMjQsQEAuMDBEdjBQbHBOMFBsbFIwMEBAMjAwQAREM+RQbHBONExscEo2MjAwQEAyNCxARCy4bE4wUGxwTjRIbuo0LEBALjQwQAREMAAoAAf+5A2IDtQAQACEAMgBDAFQAZQB2AIcAkACVAAATHgE/AT4BLwEuAQ8BDgEfAT8BNhYfARYGDwEGJi8BJjY3NxceAT8BPgEvAS4BDwEOARc3FxYGDwEGJi8BJjY/ATYWFwMuAQ8BDgEfAR4BPwE+AS8BBycmNj8BNhYfARYGDwEGJicFNz4BLwEuAQ8BDgEfAR4BNzcXFgYPAQYmLwEmNj8BNhYXARMfASUvAQMFEwMlEwWdAyAVkhUYAxcDIRSTFBgDFxWTDBQBFwIODZIMFAIXAg8M3hcDIRSSFBgDFwMgFZIUGAPgFwIPDJIMFAIWAg4MkgwUAs4DIRSTFBgDFwMgFZIVGAMXyhcCDwyTDBQBFwIODZIMFAIBL5IUGAMXAyAVkhQYAxcDIRSRFwIPDJIMFAIXAg8MkgwUAv1pahUNAtUNFWv9LJ9jAmxj/ZQCFxQYAxYEIBWSFRgDFwMhFJO3FwIPDJIMFAIXAg8MkwwUAQWTFBgDFgMhFJMUGAMWAyEUIpINEwIXAg8MkwwUAhYCDg3+1xQYAxcDIRSTFBgDFwMhFJO2kwwUAhYCDgyTDBQCFgIPCwMXAyEUkxQYAxcDIBWSFBkD35MMFAIWAg4NkgwUAhYCDgwBU/1PilFwUokCsXD9VwJ9YP2DYAAKAAP/twMyA7QAEAAhADIAQwBUAGUAdgCHAIwAkQAAExQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwEyFhUBNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATIWFQERIREhExEhESF7IBelFx8fF6UXIDelDhITDaUOExQN9CAXpBcgIBekFyD8Ew2lDhMUDaQOE/7rHxelFyAgF6UXH/wUDaUOEhMNpQ0UAUykFyAgF6QXICAXxRMNpQ4TFA2kDhP9YQMv/NE7Arr9RgJOFyAgF6QXICAXpMUTDqQOExMOpA4TIaQXICAXpBcgIBekDhMTDqQOExMO/twXICAXpBcgIBekpKQOExMOpA4TEw43IBekFyAgF6QXINukDhMTDqQOExMOAeb8AwP9/PkCzP00AAEAAAABAADkYnVvXw889QALBAAAAAAA0Ty0lAAAAADRPLSUAAD/tgOcA7cAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAA5wAAQAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAACAAAAA50AAANiAAEDMgADAAAAAAAKABQAHgEWAg4CzAABAAAABwC6AA8AAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEAEAAAAAEAAAAAAAIADgBOAAEAAAAAAAMAEAAmAAEAAAAAAAQAEABcAAEAAAAAAAUAFgAQAAEAAAAAAAYACAA2AAEAAAAAAAoANABsAAMAAQQJAAEAEAAAAAMAAQQJAAIADgBOAAMAAQQJAAMAEAAmAAMAAQQJAAQAEABcAAMAAQQJAAUAFgAQAAMAAQQJAAYAEAA+AAMAAQQJAAoANABsAHIAYQBpAG4AdABhAG4AawBWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBhAGkAbgB0AGEAbgBrcmFpbnRhbmsAcgBhAGkAbgB0AGEAbgBrAFIAZQBnAHUAbABhAHIAcgBhAGkAbgB0AGEAbgBrAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAlsAAsAAAAACSAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIDLGNtYXAAAAFoAAAATAAAAEwaVcxZZ2FzcAAAAbQAAAAIAAAACAAAABBnbHlmAAABvAAABZgAAAWYbv83VGhlYWQAAAdUAAAANgAAADYFNK2SaGhlYQAAB4wAAAAkAAAAJAdeA8hobXR4AAAHsAAAABwAAAAcDDEABGxvY2EAAAfMAAAAEAAAABACNgP2bWF4cAAAB9wAAAAgAAAAIAAXALxuYW1lAAAH/AAAAU4AAAFO+W8D53Bvc3QAAAlMAAAAIAAAACAAAwAAAAMEAAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA5gIDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDmAv/9//8AAAAAACDmAP/9//8AAf/jGgQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAA8AAP+2A5wDtwADAB0AIQAlACoALgAxAEIAUwBkAHUAhgCXAKgAuQAANxclJyU1Eyc1IycHIycHIxUHEwcXFSENATczNTcnEwMRFyU5AgchESERBxUnNzcxMwMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBNhYVBzQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwE2FhV7CgEvVQGzipBbA5g72xGYV042PwJY/sEBRhk+JiFOU1P9wpoCVP2sMSAgywFlGxONExsbE40TGy6NCxERC40MEBAM0BwTjRMbGxONFBvXEAuNDBAQDI0LEOwbE40TGxsTjRMb1xALjQwQEAyMDBABG40TGxsTjRQbGxSoEAuNDBAQDI0LEA5DLxb0BAH2KFUXFzw8Rg3+CcIRSgRaXRwGzwHZ/s8BSBeeMf2bAmVGz8oFd/7OExsbE4wUGxwTjKkQDI0LEBALjAwRHYwUGxwTjBQbGxSMDBAQDIwMEAERDPkUGxwTjRMbHBKNjIwMEBAMjQsQEQsuGxOMFBscE40SG7qNCxAQC40MEAERDAAKAAH/uQNiA7UAEAAhADIAQwBUAGUAdgCHAJAAlQAAEx4BPwE+AS8BLgEPAQ4BHwE/ATYWHwEWBg8BBiYvASY2NzcXHgE/AT4BLwEuAQ8BDgEXNxcWBg8BBiYvASY2PwE2FhcDLgEPAQ4BHwEeAT8BPgEvAQcnJjY/ATYWHwEWBg8BBiYnBTc+AS8BLgEPAQ4BHwEeATc3FxYGDwEGJi8BJjY/ATYWFwETHwElLwEDBRMDJRMFnQMgFZIVGAMXAyEUkxQYAxcVkwwUARcCDg2SDBQCFwIPDN4XAyEUkhQYAxcDIBWSFBgD4BcCDwySDBQCFgIODJIMFALOAyEUkxQYAxcDIBWSFRgDF8oXAg8MkwwUARcCDg2SDBQCAS+SFBgDFwMgFZIUGAMXAyEUkRcCDwySDBQCFwIPDJIMFAL9aWoVDQLVDRVr/SyfYwJsY/2UAhcUGAMWBCAVkhUYAxcDIRSTtxcCDwySDBQCFwIPDJMMFAEFkxQYAxYDIRSTFBgDFgMhFCKSDRMCFwIPDJMMFAIWAg4N/tcUGAMXAyEUkxQYAxcDIRSTtpMMFAIWAg4MkwwUAhYCDwsDFwMhFJMUGAMXAyAVkhQZA9+TDBQCFgIODZIMFAIWAg4MAVP9T4pRcFKJArFw/VcCfWD9g2AACgAD/7cDMgO0ABAAIQAyAEMAVABlAHYAhwCMAJEAABMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBMhYVATQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwEyFhUBESERIRMRIREheyAXpRcfHxelFyA3pQ4SEw2lDhMUDfQgF6QXICAXpBcg/BMNpQ4TFA2kDhP+6x8XpRcgIBelFx/8FA2lDhITDaUNFAFMpBcgIBekFyAgF8UTDaUOExQNpA4T/WEDL/zROwK6/UYCThcgIBekFyAgF6TFEw6kDhMTDqQOEyGkFyAgF6QXICAXpA4TEw6kDhMTDv7cFyAgF6QXICAXpKSkDhMTDqQOExMONyAXpBcgIBekFyDbpA4TEw6kDhMTDgHm/AMD/fz5Asz9NAABAAAAAQAA5GJ1b18PPPUACwQAAAAAANE8tJQAAAAA0Ty0lAAA/7YDnAO3AAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOcAAEAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAgAAAAOdAAADYgABAzIAAwAAAAAACgAUAB4BFgIOAswAAQAAAAcAugAPAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABAAAAABAAAAAAACAA4ATgABAAAAAAADABAAJgABAAAAAAAEABAAXAABAAAAAAAFABYAEAABAAAAAAAGAAgANgABAAAAAAAKADQAbAADAAEECQABABAAAAADAAEECQACAA4ATgADAAEECQADABAAJgADAAEECQAEABAAXAADAAEECQAFABYAEAADAAEECQAGABAAPgADAAEECQAKADQAbAByAGEAaQBuAHQAYQBuAGsAVgBlAHIAcwBpAG8AbgAgADEALgAwAHIAYQBpAG4AdABhAG4Aa3JhaW50YW5rAHIAYQBpAG4AdABhAG4AawBSAGUAZwB1AGwAYQByAHIAYQBpAG4AdABhAG4AawBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:normal;font-style:normal}.gf-icon{display:inline-block;font:normal normal normal 14px/1 'raintank';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gf-icon-snap-multi:before{content:"\e600"}.gf-icon-snap-single-tilt:before{content:"\e601"}.gf-icon-snap-single:before{content:"\e602"}.row-control-inner{padding:0;margin:0;position:relative}.hide-controls{padding:0}.hide-controls .row-tab{display:none}.hide-controls .add-row-panel-hint{display:none}.playlist-active .grafana-menu-zoom-out,.playlist-active .add-row-panel-hint,.playlist-active .grafana-menu-refresh,.playlist-active .top-nav-dashboards-btn,.playlist-active .top-nav-dash-actions{display:none}.playlist-active .grafana-menu-stop-playlist{display:list-item}.row-button{width:24px}.modal{max-width:800px;left:0;right:0;margin-left:auto;margin-right:auto;top:20%}.dashboard-fullscreen .main-view-container{overflow:hidden;height:0;padding:0}.dashboard-fullscreen .main-view-container .row-control-inner{display:none}.histogram-chart{position:relative}.scrollable{max-height:300px;overflow:auto}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar:hover{height:8px}::-webkit-scrollbar-button:start:decrement,::-webkit-scrollbar-button:end:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement{display:none}::-webkit-scrollbar-button:horizontal:increment{display:none}::-webkit-scrollbar-button:vertical:decrement{display:none}::-webkit-scrollbar-button:vertical:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement:active{background-image:none}::-webkit-scrollbar-button:horizontal:increment:active{background-image:none}::-webkit-scrollbar-button:vertical:decrement:active{background-image:none}::-webkit-scrollbar-button:vertical:increment:active{background-image:none}::-webkit-scrollbar-track-piece{background-color:transparent}::-webkit-scrollbar-thumb:vertical{height:50px;background:-webkit-gradient(linear,left top,right top,color-stop(0%,#3a3a3a),color-stop(100%,#3a3a3a));border:1px solid #000;border-top:1px solid #000;border-left:1px solid #000}::-webkit-scrollbar-thumb:horizontal{width:50px;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#3a3a3a),color-stop(100%,#3a3a3a));border:1px solid #000;border-top:1px solid #000;border-left:1px solid #000}.sp-replacer{background:inherit;border:0;color:inherit;padding:0}.sp-replacer:hover,.sp-replacer.sp-active{border-color:inherit;color:inherit}.sp-container{border-radius:0;background-color:#262626;border:0;padding:0}.sp-palette-container,.sp-picker-container{border:0}.sp-dd{display:none}.sp-preview{position:relative;width:15px;height:15px;border:0;margin-right:5px;float:left;z-index:0}.datapoints-warning{pointer:none;position:absolute;top:50%;left:50%;z-index:10;margin-top:-50px;margin-left:-100px;width:200px;text-align:center;cursor:auto;padding:10px}.metrics-editor-help:hover .hide{display:block}.grafana-tooltip{position:absolute;top:-1000;left:0;color:#c8c8c8;padding:10px;font-size:11pt;font-weight:200;background-color:#3a3939;border-radius:5px;z-index:9999;max-width:800px;max-height:600px;overflow:hidden;line-height:14px}.grafana-tooltip a{color:#e3e3e3}.grafana-tooltip hr{padding:2px;color:#c8c8c8;margin:0;border-bottom:0 solid #c8c8c8}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip-inner{max-width:400px}.grafana-version-info{position:absolute;bottom:2px;left:3px;font-size:80%;color:#7b7b7b}.grafana-version-info a{color:#7b7b7b}.template-variable{color:#32d1df}.grafana-info-box:before{content:"\f05a";font-family:'FontAwesome';position:absolute;top:-8px;left:-8px;font-size:20px;color:#33b5e5}.grafana-info-box{position:relative;padding:5px 15px;background-color:#262626;border:1px solid #000}.grafana-info-box h5{margin-top:5px}.grafana-tip{padding-left:5px}.shortcut-table td{padding:3px}.shortcut-table th:last-child{text-align:left}.shortcut-table td:first-child{text-align:right}.confirm-modal{border:1px solid #333;max-width:500px;background-color:#1f1f1f;text-align:center}.confirm-modal .modal-close{float:right;font-size:140%;padding:10px}.confirm-modal .confirm-modal-icon{padding-top:41px;font-size:280%;color:#690;padding-bottom:20px}.confirm-modal .confirm-modal-title{font-size:18px;color:#e3e3e3;margin-bottom:15px}.confirm-modal .confirm-modal-text{font-size:16px}.confirm-modal .confirm-modal-buttons{margin-top:35px;margin-bottom:35px}.confirm-modal .confirm-modal-buttons button{margin-right:5px}.share-snapshot{text-align:center}.share-snapshot .gf-icon-snap-multi{font-size:70px}.share-snapshot .fa-spinner{font-size:70px}.share-snapshot .share-snapshot-info-text{margin:10px 105px}.share-snapshot .share-snapshot-info-text strong{color:#fff;font-weight:bold}.share-snapshot .share-snapshot-header{margin:20px 0 22px 0}.share-snapshot .tight-form{text-align:left}.share-snapshot .share-snapshot-link{max-width:716px;white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}
\ No newline at end of file
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.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}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{max-width:100%;width:auto\9;height:auto;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"]{-webkit-appearance:button;cursor:pointer}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{*{text-shadow:none!important;color:#000!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}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#bbbfc2;background-color:#161616}a{color:#e3e3e3;text-decoration:none}a:hover,a:focus{color:#fff;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;content:"";line-height:0}.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;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%}.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;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0}.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:#adafae}a.muted:hover,a.muted:focus{color:#939695}.text-warning{color:#a47e3c}a.text-warning:hover,a.text-warning:focus{color:#7f612e}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#005f81}a.text-info:hover,a.text-info:focus{color:#00394e}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:#fff;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#adafae}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 #bbbfc2}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;*display:inline;*zoom:1;padding-left:5px;padding-right: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;content:"";line-height:0}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #262626;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #adafae}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #bbbfc2}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#adafae}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #bbbfc2;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:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#262626;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap}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:3px;-moz-border-radius:3px;border-radius:3px}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:#262626;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#adafae}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:#000;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;vertical-align:middle}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:#333;border:1px solid #333;-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,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;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;border:1px solid #333;background-color:#333}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:#adafae;background-color:#303030;border-color:#333;-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);cursor:not-allowed}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#788086}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#788086}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#788086}.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;content:"";line-height:0}.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:#555}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:#a47e3c}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#a47e3c}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#a47e3c;-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:#7f612e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#a47e3c;background-color:#f80;border-color:#a47e3c}.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:#bbbfc2;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:#bbbfc2;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#005f81}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#005f81}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#005f81;-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:#00394e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #00aae7;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #00aae7;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #00aae7}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#005f81;background-color:#bbbfc2;border-color:#005f81}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:transparent;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#e3e5e6}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;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,.input-append .popover,.input-prepend .popover{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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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:#bbbfc2;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:#bf3;border-color:#690}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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;*zoom:1;margin-bottom:0;vertical-align:middle}.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;content:"";line-height:0}.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 #262626}.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 #262626}.table .table{background-color:#161616}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #262626;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.table-bordered th,.table-bordered td{border-left:1px solid #262626}.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,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius: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:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.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:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:rgba(100,100,100,0.3)}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#262626}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:#bbbfc2}.table tbody tr.error>td{background-color:#bbbfc2}.table tbody tr.warning>td{background-color:#f80}.table tbody tr.info>td{background-color:#bbbfc2}.table-hover tbody tr.success:hover>td{background-color:#aeb2b6}.table-hover tbody tr.error:hover>td{background-color:#aeb2b6}.table-hover tbody tr.warning:hover>td{background-color:#e67a00}.table-hover tbody tr.info:hover>td{background-color:#aeb2b6}.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:#262626;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:transparent;border-bottom:1px solid #444}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#bbbfc2;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#fff;background-color:#005777;background-image:-moz-linear-gradient(top,#005f81,#004c68);background-image:-webkit-gradient(linear,0 0,0 100%,from(#005f81),to(#004c68));background-image:-webkit-linear-gradient(top,#005f81,#004c68);background-image:-o-linear-gradient(top,#005f81,#004c68);background-image:linear-gradient(to bottom,#005f81,#004c68);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f81',endColorstr='#ff004c68',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#005777;background-image:-moz-linear-gradient(top,#005f81,#004c68);background-image:-webkit-gradient(linear,0 0,0 100%,from(#005f81),to(#004c68));background-image:-webkit-linear-gradient(top,#005f81,#004c68);background-image:-o-linear-gradient(top,#005f81,#004c68);background-image:linear-gradient(to bottom,#005f81,#004c68);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f81',endColorstr='#ff004c68',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#adafae}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #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;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#000;margin-top:5px;margin-right:-10px}.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-left:20px;padding-right:20px}.typeahead{z-index:1051;margin-top:2px;-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,.close:focus{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;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#262626;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#4d4e4d;background-image:-moz-linear-gradient(top,#262626,#868988);background-image:-webkit-gradient(linear,0 0,0 100%,from(#262626),to(#868988));background-image:-webkit-linear-gradient(top,#262626,#868988);background-image:-o-linear-gradient(top,#262626,#868988);background-image:linear-gradient(to bottom,#262626,#868988);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff262626',endColorstr='#ff868988',GradientType=0);border-color:#868988 #868988 #606362;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#868988;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#262626;background-color:#868988;*background-color:#797d7b}.btn:active,.btn.active{background-color:#6d706e \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#262626;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,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(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:4px;-moz-border-radius:4px;border-radius:4px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.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:2px;-moz-border-radius:2px;border-radius:2px}.btn-block{display:block;width:100%;padding-left:0;padding-right: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-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006e95;background-image:-moz-linear-gradient(top,#005f81,#0085b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#005f81),to(#0085b4));background-image:-webkit-linear-gradient(top,#005f81,#0085b4);background-image:-o-linear-gradient(top,#005f81,#0085b4);background-image:linear-gradient(to bottom,#005f81,#0085b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f81',endColorstr='#ff0085b4',GradientType=0);border-color:#0085b4 #0085b4 #004c67;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#0085b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#0085b4;*background-color:#00729b}.btn-primary:active,.btn-primary.active{background-color:#005f81 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f58a0f;background-image:-moz-linear-gradient(top,#ff941a,#e67a00);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff941a),to(#e67a00));background-image:-webkit-linear-gradient(top,#ff941a,#e67a00);background-image:-o-linear-gradient(top,#ff941a,#e67a00);background-image:linear-gradient(to bottom,#ff941a,#e67a00);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff941a',endColorstr='#ffe67a00',GradientType=0);border-color:#e67a00 #e67a00 #995200;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e67a00;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#e67a00;*background-color:#cc6d00}.btn-warning:active,.btn-warning.active{background-color:#b35f00 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#d13a00;background-image:-moz-linear-gradient(top,#e64000,#b33200);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e64000),to(#b33200));background-image:-webkit-linear-gradient(top,#e64000,#b33200);background-image:-o-linear-gradient(top,#e64000,#b33200);background-image:linear-gradient(to bottom,#e64000,#b33200);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe64000',endColorstr='#ffb33200',GradientType=0);border-color:#b33200 #b33200 #661d00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#b33200;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#b33200;*background-color:#992b00}.btn-danger:active,.btn-danger.active{background-color:#802400 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#699e00;background-image:-moz-linear-gradient(top,#77b300,#558000);background-image:-webkit-gradient(linear,0 0,0 100%,from(#77b300),to(#558000));background-image:-webkit-linear-gradient(top,#77b300,#558000);background-image:-o-linear-gradient(top,#77b300,#558000);background-image:linear-gradient(to bottom,#77b300,#558000);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff77b300',endColorstr='#ff558000',GradientType=0);border-color:#558000 #558000 #230;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#558000;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#558000;*background-color:#460}.btn-success:active,.btn-success.active{background-color:#334d00 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#993dc7;background-image:-moz-linear-gradient(top,#a347d1,#8a2eb8);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a347d1),to(#8a2eb8));background-image:-webkit-linear-gradient(top,#a347d1,#8a2eb8);background-image:-o-linear-gradient(top,#a347d1,#8a2eb8);background-image:linear-gradient(to bottom,#a347d1,#8a2eb8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa347d1',endColorstr='#ff8a2eb8',GradientType=0);border-color:#8a2eb8 #8a2eb8 #5c1f7a;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#8a2eb8;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#8a2eb8;*background-color:#7a29a3}.btn-info:active,.btn-info.active{background-color:#6b248f \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#2b2b2b;background-image:-moz-linear-gradient(top,#262626,#333);background-image:-webkit-gradient(linear,0 0,0 100%,from(#262626),to(#333));background-image:-webkit-linear-gradient(top,#262626,#333);background-image:-o-linear-gradient(top,#262626,#333);background-image:linear-gradient(to bottom,#262626,#333);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff262626',endColorstr='#ff333333',GradientType=0);border-color:#333 #333 #0d0d0d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#333;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#333;*background-color:#262626}.btn-inverse:active,.btn-inverse.active{background-color:#191919 \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{border-color:transparent;cursor:pointer;color:#e3e3e3;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#fff;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#262626;text-decoration:none}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#f80;border:1px solid transparent;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.alert,.alert h4{color:#a47e3c}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#bbbfc2;border-color:#aeb4b6;color:#468847}.alert-success h4{color:#468847}.alert-danger,.alert-error{background-color:#bbbfc2;border-color:#b3b9bb;color:#b94a48}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{background-color:#bbbfc2;border-color:#a8afb1;color:#005f81}.alert-info h4{color:#005f81}.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-left:0;margin-bottom:20px;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#bbbfc2}.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:#adafae;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-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,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#e3e3e3}.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;content:"";line-height:0}.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,.nav-tabs>li>a:focus{border-color:#bbbfc2 #bbbfc2 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#bbb;background-color:#161616;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.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,.nav-pills>.active>a:focus{color:#fff;background-color:#e3e3e3}.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;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2}.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{border-top-color:#e3e3e3;border-bottom-color:#e3e3e3;margin-top:6px}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.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:#bbb;border-bottom-color:#bbb}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#adafae;border-color:#adafae}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#adafae}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0}.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,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{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,.tabs-left>.nav-tabs>li>a:focus{border-color:#bbbfc2 #ddd #bbbfc2 #bbbfc2}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{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,.tabs-right>.nav-tabs>li>a:focus{border-color:#bbbfc2 #bbbfc2 #bbbfc2 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#adafae}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default}.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2}.navbar-inner{min-height:52px;padding-left:20px;padding-right:20px;background-color:#1f1f1f;background-image:-moz-linear-gradient(top,#1f1f1f,#1f1f1f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1f1f1f),to(#1f1f1f));background-image:-webkit-linear-gradient(top,#1f1f1f,#1f1f1f);background-image:-o-linear-gradient(top,#1f1f1f,#1f1f1f);background-image:linear-gradient(to bottom,#1f1f1f,#1f1f1f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1f1f1f',endColorstr='#ff1f1f1f',GradientType=0);border:1px solid none;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-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);*zoom:1}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{float:left;display:block;padding:16px 20px 16px;margin-left:-20px;font-size:20px;font-weight:200;color:#e3e3e3;text-shadow:0 1px 0 #1f1f1f}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:52px;color:#adafae}.navbar-link{color:#adafae}.navbar-link:hover,.navbar-link:focus{color:#fff}.navbar .divider-vertical{height:52px;margin:0 9px;border-left:1px solid #1f1f1f;border-right:1px solid #1f1f1f}.navbar .btn,.navbar .btn-group{margin-top:11px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:11px}.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:11px;margin-bottom:0}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;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-left:0;padding-right: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,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(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:16px 15px 16px;color:#adafae;text-decoration:none;text-shadow:0 1px 0 #1f1f1f}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#fff;text-decoration:none}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:#1f1f1f;-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-left:5px;margin-right:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#121212;background-image:-moz-linear-gradient(top,#121212,#121212);background-image:-webkit-gradient(linear,0 0,0 100%,from(#121212),to(#121212));background-image:-webkit-linear-gradient(top,#121212,#121212);background-image:-o-linear-gradient(top,#121212,#121212);background-image:linear-gradient(to bottom,#121212,#121212);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff121212',endColorstr='#ff121212',GradientType=0);border-color:#121212 #121212 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#121212;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#121212;*background-color:#050505}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#000 \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{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:9px}.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #262626;position:absolute;top:-6px;left:10px}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0;bottom:-7px;top:auto}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #262626;border-bottom:0;bottom:-6px;top:auto}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#1f1f1f;color:#fff}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#adafae;border-bottom-color:#adafae}.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:#fff;border-bottom-color:#fff}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-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:#252a30;background-image:-moz-linear-gradient(top,#252a30,#252a30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#252a30),to(#252a30));background-image:-webkit-linear-gradient(top,#252a30,#252a30);background-image:-o-linear-gradient(top,#252a30,#252a30);background-image:linear-gradient(to bottom,#252a30,#252a30);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff252a30',endColorstr='#ff252a30',GradientType=0);border-color:transparent}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#adafae;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#adafae}.navbar-inverse .navbar-text{color:#adafae}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:#242a31;color:#fff}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#242a31}.navbar-inverse .navbar-link{color:#adafae}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-left-color:#252a30;border-right-color:#252a30}.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{background-color:#242a31;color:#fff}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#adafae;border-bottom-color:#adafae}.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:#5d6978;border-color:#252a30;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#262626;text-shadow:0 1px 0 #fff;background-color:#fff;border: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);outline:0}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#1a1d22;background-image:-moz-linear-gradient(top,#1a1d22,#1a1d22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1a1d22),to(#1a1d22));background-image:-webkit-linear-gradient(top,#1a1d22,#1a1d22);background-image:-o-linear-gradient(top,#1a1d22,#1a1d22);background-image:linear-gradient(to bottom,#1a1d22,#1a1d22);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1a1d22',endColorstr='#ff1a1d22',GradientType=0);border-color:#1a1d22 #1a1d22 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#1a1d22;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#1a1d22;*background-color:#0f1113}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#040405 \9}.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:.7;filter:alpha(opacity=70)}.modal{position:fixed;z-index:1050;width:100%;background-color:#fff;-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;outline:0}.modal.fade{-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;top:-25%}.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;overflow-y:auto;padding:15px}.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-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;*zoom:1}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#3a3939;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#3a3939}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#3a3939}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#3a3939}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#3a3939}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#262626;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#262626;border-bottom:1px solid #191919;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#262626}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#262626}.popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#262626}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#262626;bottom:-10px}.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;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#adafae}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{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:#f80}.label-warning[href],.badge-warning[href]{background-color:#cc6d00}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#005f81}.label-info[href],.badge-info[href]{background-color:#00394e}.label-inverse,.badge-inverse{background-color:#262626}.label-inverse[href],.badge-inverse[href]{background-color:#0c0c0c}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}label,input,button,select,textarea,.navbar .search-query:-moz-placeholder,.navbar .search-query::-webkit-input-placeholder{font-family:'Droid Sans',sans-serif;color:#bbb}blockquote{border-left:5px solid #262626}blockquote.pull-right{border-right:5px solid #262626}html{height:100%}body{height:100%;background:#161616}.page-header{border-bottom:1px solid #262626}hr{border-bottom:0}.navbar .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .brand{padding:0 15px;color:#e3e3e3;font-weight:normal;text-shadow:none}.navbar .nav>li>a{padding:15px 15px 14px;border-bottom:1px solid transparent}.navbar .nav>li>a:hover,.navbar .nav>.active>a,.navbar .nav>.active>a:hover{border-bottom:1px solid #33b5e5}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .navbar-text{margin-bottom:1px;padding:15px 15px 14px;line-height:inherit}.navbar .divider-vertical{margin:0;border-left:1px solid #262626;border-right-width:0}.navbar .search-query,.navbar .search-query:focus,.navbar .search-query.focused{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;background-color:#262626;line-height:normal;color:#adafae;text-shadow:none}.navbar .search-query:-moz-placeholder,.navbar .search-query:focus:-moz-placeholder,.navbar .search-query.focused:-moz-placeholder{color:#bbb}.navbar .search-query:-ms-input-placeholder,.navbar .search-query:focus:-ms-input-placeholder,.navbar .search-query.focused:-ms-input-placeholder{color:#bbb}.navbar .search-query::-webkit-input-placeholder,.navbar .search-query:focus::-webkit-input-placeholder,.navbar .search-query.focused::-webkit-input-placeholder{color:#bbb}@media(max-width:979px){.navbar .nav-collapse .nav li>a{border:0;color:#bbbfc2;font-weight:normal;text-shadow:none}.navbar .nav-collapse .nav li>a:hover{border:0;background-color:#33b5e5}.navbar .nav-collapse .nav .active>a{border:0;background-color:#33b5e5}.navbar .nav-collapse .dropdown-menu a:hover{background-color:#33b5e5}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border-top:0;border-bottom:0}.navbar .nav-collapse .nav-header{color:rgba(128,128,128,0.6)}.navbar-inverse .nav-collapse .nav li>a:hover{background-color:#111}.navbar-inverse .nav-collapse .nav .active>a{background-color:#111}.navbar-inverse .nav-collapse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav-collapse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav-collapse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111}}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}div.subnav{margin:0 1px;background-color:#1f1f1f;background-image:none;border:0;border-bottom:1px solid #262626}div.subnav .nav>li>a,div.subnav .nav>li:first-child>a,div.subnav .nav>li:first-child>a:hover{padding:11px 12px;border:0;background-color:#1f1f1f;color:#adafae}div.subnav .nav>li>a:hover,div.subnav .nav>li.active>a,div.subnav .nav>li.active>a:hover,div.subnav .nav>li:first-child>a:hover{padding:11px 12px;background:transparent;border:0;border-bottom:1px solid #33b5e5;color:#fff}div.subnav .nav li.nav-header{text-shadow:none}div.subnav-fixed{top:52px;margin:0}.nav-tabs{border-bottom:0}.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs li>a:hover,.nav-tabs li.active>a,.nav-tabs li.active>a:hover{border-color:transparent;background-color:transparent;border-bottom:2px solid #33b5e5;color:#fff}.nav-tabs li.disabled>a{color:#bbbfc2}.nav-tabs .open .dropdown-toggle{background-color:#060606;border-color:transparent}.nav-pills li>a:hover{background-color:#33b5e5;color:#fff}.nav-pills li.disabled>a{color:#bbbfc2}.nav-pills .open .dropdown-toggle{background-color:#060606}.nav-pills .dropdown-menu li>a:hover{border:0}.nav-list li>a{text-shadow:none}.nav-list li>a:hover{background-color:#33b5e5;color:#fff}.nav-list .nav-header{text-shadow:none}.nav-list .divider{background-color:transparent;border-bottom:1px solid #262626}.nav-stacked li>a{border:1px solid #262626!important}.nav-stacked li>a:hover,.nav-stacked li.active>a{background-color:#33b5e5;color:#fff}.tabbable .nav-tabs,.tabbable .nav-tabs li.active>a{border-color:#262626}.breadcrumb{background-color:transparent;background-image:none;border-width:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;font-size:14px}.breadcrumb li{text-shadow:none}.breadcrumb li>a{color:#33b5e5;text-shadow:none}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span,.pagination ul>.disabled>span:hover{background-color:rgba(0,0,0,0.2)}.pager li>a,.pager li>span{background-color:#161616;border:0}.pager li>a:hover,.pager li>span:hover{background-color:#33b5e5}.pager .disabled a,.pager .disabled a:hover{background-color:#161616}.btn{padding:5px 12px;background-image:none;-webkit-box-shadow:0 0 8px #161616;-moz-box-shadow:0 0 8px #161616;box-shadow:0 0 8px #161616;border:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-shadow:none}.btn.disabled{box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-inverse{border:1px solid #444}.btn-large{padding:14px 23px}.btn-small{padding:2px 10px}.btn-mini{padding:2px 6px}.btn-group>.btn:first-child,.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input,textarea,select{border-width:2px;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}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{color:#adafae}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly],.uneditable-input{border-color:#444}input:focus,textarea:focus,input.focused,textarea.focused{border-color:#52a8ec;outline:0;outline:thin dotted \9}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}legend,label{color:#bbbfc2;border-bottom:0 solid #222}.form-actions{border-top:1px solid #222}.table{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.table tbody tr.success td{background-color:#690;color:#fff}.table tbody tr.error td{background-color:#cc3900;color:#fff}.table tbody tr.info td{background-color:#33b5e5;color:#fff}.alert,.alert .alert-heading,.alert-success,.alert-success .alert-heading,.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading,.alert-info,.alert-info .alert-heading{color:#fff;text-shadow:none;border:0}.label{color:#fff}.badge{border-radius:0;font-weight:200}.label,.alert{background-color:#888}.label:hover{background-color:#6e6e6e}.label-important,.alert-danger,.alert-error{background-color:#cc3900}.label-important:hover{background-color:#992b00}.label-warning{background-color:#cc6d00}.label-warning:hover{background-color:#995200}.label-success,.alert-success{background-color:#5c8a00}.label-success:hover{background-color:#3a5700}.label-info,.alert-info{background-color:#00394e}.label-info:hover{background-color:#00141b}a:hover{text-decoration:none}.well,.hero-unit{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.well,.hero-unit{border-top:solid 1px #333;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.8);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.8);box-shadow:0 2px 4px rgba(0,0,0,0.8)}.thumbnail{border-color:#262626}.progress{background-color:#060606;background-image:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.modal{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;border-top:solid 1px #333;background-color:#1f1f1f}.modal-header{border-bottom:1px solid #1f1f1f}.modal-footer{background-color:#1f1f1f;border-top:1px solid #1f1f1f;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.popover{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.popover-title{border-bottom:0;color:#fff}.footer{border-top:1px solid #262626}.caret{color:#bbbfc2}.dropdown-submenu>a:after{border-left-color:#bbbfc2}@media(max-width:767px){div.panel{width:100%!important;padding:0!important}}.container-fluid{padding-left:0;padding-right:0}.main-view-container{padding:5px 10px;width:100%;box-sizing:border-box}.bgNav{background:#1f1f1f}.bgPrimary{background:#005f81;color:rgba(255,255,255,0.9)}.bgInfo{background:#a347d1;color:rgba(255,255,255,0.9)}.bgSuccess{background:#77b300;color:rgba(255,255,255,0.9)}.bgWarning{background:#ff941a;color:rgba(255,255,255,0.9)}.bgDanger{background:#e64000;color:rgba(255,255,255,0.9)}.bgInverse{background:#262626;color:rgba(255,255,255,0.9)}code,pre{background-color:#bbbfc2}div.editor-row{vertical-align:top}div.editor-row div.section{margin-right:20px;vertical-align:top;display:inline-block}div.editor-option{vertical-align:top;display:inline-block;margin-right:10px}div.editor-option label{display:block}#events{font-size:12px}.version{font-size:85%}.legend{color:#000}div.fake-input{background-color:#333;border:1px solid #333;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;border-radius:3px 3px 3px 3px}hr.small{margin:5px 0}form input.ng-invalid{color:#b94a48}.editor-title{margin-right:10px;font-size:1.7em;font-weight:bold;text-transform:capitalize}.editor-title small{opacity:.5;font-size:.7em;font-weight:normal}.bordered{border:1px solid #262626}.table-unpadded th,.table-unpadded td{padding:0 2px}.spy{position:absolute;right:0;top:0}.navbar-inner{border-width:0}.grafana-row{margin-bottom:5px}.row-tab .dropdown-menu-right{top:0;left:33px}.row-tab-button{padding:0;cursor:pointer;vertical-align:middle;width:30px;height:30px;text-align:center;display:inline-block;line-height:30px}.row-button{width:30px;float:left;cursor:pointer;line-height:31px}.row-text{white-space:nowrap;text-transform:uppercase;font-weight:bold;font-size:.9em;text-align:center;line-height:31px;height:31px}.row-close{padding:0;margin:0;background:#1f1f1f;text-align:center}.row-close-buttons{position:absolute;left:0}.row-open{margin-top:5px;left:-34px;position:absolute;z-index:100;transition:.10s left;transition-delay:.10s;-webkit-transition-delay:.10s}.row-open:hover{left:-12px}.odd{background-color:rgba(100,100,100,0.3)}.nomargin{margin:0}[ng\:cloak],[ng-cloak],.ng-cloak{display:none!important}.table tbody+tbody{border-top:0}.ui-draggable-dragging{display:block;z-index:9999}.link{color:#e3e3e3;cursor:pointer}.link:hover{color:#fff}.pointer{cursor:pointer}.popover{max-width:480px}.tiny{font-size:50%}.smaller{font-size:70%}.small{font-size:85%}.large{font-size:120%}.strong{font-weight:bold}a{cursor:pointer}.normal{font-weight:normal}.light{font-weight:200}.input-smaller{width:75px}.string{color:#c8ccce}.number{color:#00729b}.boolean{color:#b78c43}.key{color:#c05c5a}.btn-active{background-color:#e6e6e6;background-image:none;box-shadow:0 2px 4px rgba(0,0,0,0.15) inset,0 1px 2px rgba(0,0,0,0.05);outline:0 none}.remove:hover{background-color:#b33200}.faded{opacity:.2}div.flot-text{color:#bbbfc2!important}.page-alert-list{z-index:8000;min-width:300px;max-width:300px;position:fixed;right:20px;top:56px}.page-alert-list .alert{color:#fff;padding-bottom:13px;position:relative}.page-alert-list .alert-close{position:absolute;top:-4px;right:-2px;width:19px;height:19px;padding:0;background:#bbbfc2;border-radius:50%;border:0;font-size:1.1rem;color:#1f1f1f}.page-alert-list .alert-title{font-weight:bold;padding-bottom:2px}.alert-warning{background-color:#f80;border-color:transparent;color:#a47e3c}.popover.topLeft{margin-top:-10px}.popover.topLeft .arrow{bottom:-10px;left:25%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#262626}.popover.topLeft .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.topRight{margin-top:-10px}.popover.topRight .arrow{bottom:-10px;left:75%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#262626}.popover.topRight .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.rightTop .arrow{top:10%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightTop .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#262626}.popover.rightBottom .arrow{top:90%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightBottom .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#262626}.popover.bottomLeft .arrow{left:10%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottomLeft .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#262626}.popover.bottomRight .arrow{left:90%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottomRight .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#262626}.popover.leftTop .arrow{top:10%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftTop .arrow:after{right:1px;border-right-width:0;border-left-color:#262626;bottom:-10px}.popover.leftBottom .arrow{top:90%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftBottom .arrow:after{right:1px;border-right-width:0;border-left-color:#262626;bottom:-10px}.popover.topLeft .arrow{left:10%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.topLeft .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#262626}.popover.topRight .arrow{left:90%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.topRight .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#262626}.typeahead{max-height:300px;overflow-y:auto}.label-tag{background-color:#93c;color:#f2f2f2;border-radius:2px;text-shadow:none;font-size:13px;padding:4px 6px}.label-tag .icon-tag{position:relative;top:1px;padding-right:4px}.label-tag:hover{opacity:.85;background-color:#7a29a3}.save-dashboard-dropdown{padding:10px}.save-dashboard-dropdown li>a{padding-left:5px}.save-dashboard-dropdown-save-form{margin-bottom:5px}.inspector-request-table td{padding:5px}.inspector-request-table td:first-child{white-space:nowrap}.modal-body{padding:0}code,pre{background-color:#1f1f1f;color:#bbbfc2}.login-form{width:50%;float:left;margin-left:25%;margin-right:25%;padding-top:50px}.login-box{width:700px;margin:100px auto 0 auto}.login-box-logo{text-align:center;padding-bottom:50px}.login-inner-box{background:#1f1f1f}.login-tab-header{background:#262626;text-align:center}.btn-login-tab{background:transparent;border:0;font-size:15px;padding:10px 10px;font-weight:bold;display:inline-block;width:170px;color:#bbbfc2}.btn-login-tab.active{background:#191919;color:#fff}.btn-login-tab:focus{outline:0}.password-strength{display:block;width:50px;overflow:visible;white-space:nowrap;padding-top:3px;margin-left:97px;color:#858c92;border-top:3px solid #cc3900}.password-strength.password-strength-ok{width:170px;border-top:3px solid #f0c942}.password-strength.password-strength-good{width:254px;border-top:3px solid #8c0}.login-submit-button-row{text-align:center;margin-top:40px}.login-submit-button-row button{padding:9px 7px;font-size:14px;font-weight:bold;width:150px;display:inline-block;border:1px solid #404040}.login-oauth{margin-top:30px;padding:10px;background:#262626}.login-oauth .btn-google{background:#dd4b39;color:white}.login-oauth .btn-github{background:#555;color:white}.submenu-controls-visible .panel-fullscreen{top:88px}.submenu-controls{margin:10px 10px 0 5px;font-size:16px}.annotation-disabled,.annotation-disabled a{color:#707070}.annotation-segment label.cr1{margin-left:5px}.graph-canvas-wrapper{position:relative;cursor:crosshair}.graph-legend{margin:0 20px;text-align:center}.graph-legend .popover-content{padding:0}.graph-legend-icon{position:relative;padding-right:4px;top:1px}.graph-legend-icon,.graph-legend-alias,.graph-legend-value{float:left;white-space:nowrap;font-size:85%;text-align:left}.graph-legend-icon.current:before,.graph-legend-alias.current:before,.graph-legend-value.current:before{content:"Current: "}.graph-legend-icon.max:before,.graph-legend-alias.max:before,.graph-legend-value.max:before{content:"Max: "}.graph-legend-icon.min:before,.graph-legend-alias.min:before,.graph-legend-value.min:before{content:"Min: "}.graph-legend-icon.total:before,.graph-legend-alias.total:before,.graph-legend-value.total:before{content:"Total: "}.graph-legend-icon.avg:before,.graph-legend-alias.avg:before,.graph-legend-value.avg:before{content:"Avg: "}.graph-legend-icon .fa{font-size:135%;position:relative;top:1px}.graph-legend-series{float:left;white-space:nowrap;padding-left:10px;padding-top:6px}.graph-legend-value{padding-left:6px}.graph-legend-table{display:table;width:100%;margin:0}.graph-legend-table .graph-legend-series{display:table-row;float:none;padding-left:0}.graph-legend-table .graph-legend-series.pull-right{float:none}.graph-legend-table td,.graph-legend-table .graph-legend-alias,.graph-legend-table .graph-legend-icon,.graph-legend-table .graph-legend-value{float:none;display:table-cell;white-space:nowrap;padding:2px 10px;text-align:right;border-bottom:1px solid #000}.graph-legend-table .graph-legend-icon{width:5px;padding:0;top:0}.graph-legend-table .graph-legend-icon .fa{top:4px}.graph-legend-table .graph-legend-value{padding-left:15px}.graph-legend-table .graph-legend-alias{padding-left:7px;text-align:left;width:95%}.graph-legend-table .graph-legend-series:nth-child(odd){background-color:#242424}.graph-legend-table .graph-legend-value.current:before,.graph-legend-table .graph-legend-value.max:before,.graph-legend-table .graph-legend-value.min:before,.graph-legend-table .graph-legend-value.total:before,.graph-legend-table .graph-legend-value.avg:before{content:''}.graph-legend-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#33b5e5;font-size:85%;white-space:nowrap}.graph-legend-rightside.graph-wrapper{display:table;width:100%}.graph-legend-rightside .graph-canvas-wrapper{display:table-cell;width:100%;position:relative}.graph-legend-rightside .graph-legend-wrapper{display:table-cell;vertical-align:top;position:relative;left:4px}.graph-legend-rightside .graph-legend{margin:0}.graph-legend-rightside .graph-legend-series{display:block;padding-left:0}.graph-legend-rightside .graph-legend-table .graph-legend-series{display:table-row}.graph-legend-series-hidden a{color:#707070}.graph-legend-popover{width:200px}.graph-legend-popover label{display:inline-block}.graph-legend-popover .btn{padding:1px 3px;margin-right:0;line-height:initial}.graph-legend-popover .close{margin-right:5px;color:#e3e3e3;opacity:.7;text-shadow:none}.graph-legend-popover .editor-row{padding:5px}.annotation-tags{color:#93c}.graph-series-override input{float:left;margin-right:10px}.graph-series-override .graph-series-override-option{float:left;padding:2px 6px}.graph-series-override .graph-series-override-selector{float:left}.graph-tooltip{white-space:nowrap}.graph-tooltip .graph-tooltip-time{text-align:center;font-weight:bold;position:relative;top:-3px}.graph-tooltip .graph-tooltip-list-item{display:table-row}.graph-tooltip .graph-tooltip-series-name{display:table-cell}.graph-tooltip .graph-tooltip-value{display:table-cell;font-weight:bold;padding-left:10px;text-align:right}.left-yaxis-label{top:50%;left:-5px;transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);transform-origin:left top;-o-transform-origin:left top;-ms-transform-origin:left top;-moz-transform-origin:left top;-webkit-transform-origin:left top}.right-yaxis-label{top:50%;right:-5px;-webkit-transform:rotate(90deg);-webkit-transform-origin:right top;-moz-transform:rotate(90deg);-moz-transform-origin:right top;-ms-transform:rotate(90deg);-ms-transform-origin:right top;-o-transform:rotate(90deg);-o-transform-origin:right top;transform:rotate(90deg);transform-origin:right top}.axisLabel{color:#bbbfc2;font-size:11.9px;position:absolute;text-align:center;font-size:12px}.bootstrap-tagsinput{display:inline-block;padding:4px 6px;margin-bottom:10px;color:#555;vertical-align:middle;border-radius:4px;max-width:100%;line-height:22px;background-color:#333;border:1px solid #333;-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}.bootstrap-tagsinput input{border:0;box-shadow:none;outline:0;background-color:transparent;padding:0;padding-left:5px;margin:0;width:auto!important;max-width:inherit}.bootstrap-tagsinput input:focus{border:0;box-shadow:none}.bootstrap-tagsinput .tag{margin-right:2px;color:white}.bootstrap-tagsinput .tag [data-role="remove"]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role="remove"]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role="remove"]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.bootstrap-tagsinput .tag [data-role="remove"]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.grafana-options-table{width:100%}.grafana-options-table th{padding:5px 10px;border-bottom:4px solid #1f1f1f}.grafana-options-table tr td{background-color:#262626;padding:5px 10px;white-space:nowrap;border-bottom:4px solid #1f1f1f}.grafana-options-table tr td.nobg{background-color:transparent}.grafana-options-table .max-width-btns{padding-right:0}.grafana-options-table .max-width-btns .btn{box-sizing:border-box;width:100%}.max-width{overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap}.grafana-options-list{list-style:none;margin:0;max-width:450px}.grafana-options-list li:nth-child(odd){background-color:#242424}.grafana-options-list li{float:left;margin:2px;padding:5px 10px;border:1px solid #000}.grafana-options-list li:first-child{border:1px solid #000}.search-container{left:52px;top:33px;margin:15px;z-index:1000;position:absolute;width:700px;box-shadow:0 0 55px 0 black;padding:10px;background-color:#1f1f1f;border:1px solid #333}.search-container .label-tag{margin-left:6px;font-size:11px;padding:2px 6px}.search-field-wrapper{padding-bottom:10px}.search-field-wrapper input{width:100%;padding:18px 8px;box-sizing:border-box}.search-field-wrapper button{margin:0 4px 0 0}.search-field-wrapper>span{display:block;overflow:hidden}.search-results-container{height:450px;overflow:auto;display:block;line-height:28px}.search-results-container .search-result-item:hover,.search-results-container .search-result-item.selected{background-color:#333}.search-results-container .selected .search-result-tag{opacity:.70;color:white}.search-results-container .fa-star,.search-results-container .fa-star-o{padding-left:13px}.search-results-container .fa-star{color:#f80}.search-results-container .search-result-link{color:#bbbfc2}.search-results-container .search-result-link .fa{padding-right:10px}.search-results-container .search-result-item{display:block;padding:3px 10px;white-space:nowrap;background-color:#262626;margin-bottom:4px}.search-results-container .search-result-tags{float:right}.search-results-container .search-result-actions{float:right;padding-left:20px}.search-switches{position:absolute;top:19px;right:21px}.search-button-row{padding-top:20px}.search-button-row button,.search-button-row a{margin-right:10px}.panel{display:inline-block;float:left;vertical-align:top;position:relative}.panel-margin{margin:5px;display:block}.panel-container{background-color:#1f1f1f;position:relative;border:solid 1px #262626}.panel-container:hover .panel-actions{display:block}.panel-container.panel-transparent{background-color:transparent;border:0}.panel-content{padding:0 10px 5px 10px}.panel-title-container{min-height:5px;padding-top:4px;cursor:context-menu}.panel-title{border:0;font-weight:bold;position:relative;cursor:context-menu;width:100%;display:block}.panel-title.has-panel-links .panel-title-text:after{content:"\f08e";font-family:'FontAwesome';font-size:80%;padding-left:10px;position:relative;top:-1px}.panel-loading{position:absolute;top:-3px;right:0;z-index:800}.panel-header{text-align:center}.panel-error{color:#fff;position:absolute;left:0;padding:0 17px 6px 5px;top:0;z-index:10}.panel-error i{position:relative;top:-2px}.panel-error-arrow{width:0;height:0;position:absolute;border-left:31px solid transparent;border-right:30px solid transparent;border-bottom:27px solid #1f1f1f;left:0;bottom:0}.panel-fullscreen{z-index:100;display:block;position:fixed;left:0;right:0;top:60px;padding:0;overflow-y:auto;height:100%}.panel-fullscreen .dropdown-menu{margin-bottom:70px}.panel-fullscreen .panel-container{margin:15px}.panel-fullscreen .panel-menu{top:0}.panel-fullscreen .panel-title-container{padding:8px}.panel-full-edit{margin-top:30px;padding-bottom:130px}.panel-menu{z-index:500;position:absolute;background:#333;border:1px solid black;top:-62px}.panel-menu .panel-menu-row{white-space:nowrap;border-bottom:1px solid black}.panel-menu .panel-menu-row:last-child{border-bottom:0}.panel-menu .panel-menu-link,.panel-menu .panel-menu-icon{padding:5px 10px}.panel-menu .panel-menu-link{display:inline-block;border-right:1px solid black}.panel-menu .panel-menu-link:last-child{border:0}.panel-menu .dropdown-menu{text-align:left}.panel-highlight{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.on-drag-hover .panel-container{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.panel-drop-zone{display:none}.panel-drop-zone .panel-container{border:1px solid #262626}.panel-ghost{width:100%}.panel-ghost .panel-container{border:0;background:transparent}.panel-ghost .panel-ghost-list{margin:10px 0 10px 20px}.panel-ghost button{text-align:left;min-width:135px}.panel-ghost button .fa{position:relative;left:-5px}.panel-time-info{font-weight:bold;float:right;margin-right:15px;color:#33b5e5;font-size:85%;position:absolute;top:0;right:0}input[type=text].input-fluid{width:100%;box-sizing:border-box;padding:10px;font-size:16px;-moz-box-sizing:border-box;height:100%}input[type="checkbox"].cr1{display:none}label.cr1{display:inline-block;height:19px;clear:none;text-indent:2px;margin:0 0 1px 0;padding:0 0 0 20px;vertical-align:middle;background:url('../img/checkbox.png') left top no-repeat;cursor:pointer}input[type="checkbox"]:checked+label{background:url('../img/checkbox.png') 0 -18px no-repeat}.gf-form{padding-bottom:10px}.gf-form .checkbox-label{padding-left:7px;display:inline}.gf-fluid-input{border:0;display:block;overflow:hidden;padding-right:10px}.gf-fluid-input input[type=text]{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.gf-fluid-input textarea{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.singlestat-panel{position:relative;display:table;width:100%}.singlestat-panel-value-container{padding:20px;display:table-cell;vertical-align:middle;text-align:center;position:relative;z-index:1;font-size:3em;font-weight:bold}.singlestat-panel-prefix{padding-right:20px}.singlestat-panel-table{width:100%}.singlestat-panel-table td{padding:5px 10px;white-space:nowrap;text-align:right;border-bottom:1px solid #000}.singlestat-panel-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#33b5e5}.singlestat-panel-table td:first-child{text-align:left}.singlestat-panel-table tr:nth-child(odd) td{background-color:#242424}.singlestat-panel-table tr:last-child td{border:0}.tight-form{border-top:1px solid #000;border-left:1px solid #000;border-right:1px solid #000;background:#262626;width:100%}.tight-form:last-child,.tight-form.last{border-bottom:1px solid #000}.tight-form.borderless{background:transparent;border:0}.tight-form .checkbox-label{display:inline;padding-right:4px;margin-bottom:0}.spaced-form .tight-form{margin:7px 0}.borderless .tight-form-item,.borderless .tight-form-input{border:0}.tight-form-container .tight-form:last-child{border-bottom:0}.tight-form-container:last-child{border-bottom:1px solid #000}.tight-form-btn{padding:8px 12px}.tight-form-list{list-style:none;margin:0}.tight-form-list>li{float:left}.grafana-metric-options{margin-top:35px}.tight-form-item{padding:8px 7px;font-weight:normal;border-right:1px solid #050505;color:#c8c8c8;display:inline-block}.has-open-function .tight-form-item{padding-top:25px}.tight-form-disabled .tight-form-item{color:#888}.tight-form-item:hover,.tight-form-item:focus{text-decoration:none}.tight-form-itema:hover{background:#333}.tight-form-item.template-param-name{border-right:0;padding-right:0;padding-left:18px}.tight-form-item.annotation-segment{padding:8px 13px}.tight-form-item.last{border-right:0}.tight-form-item .fa-caret-down{font-size:75%;position:relative;top:1px}.tight-form-item-icon i{width:15px;text-align:center;display:inline-block}.tight-form-func{background:#333}.tight-form-func>a{color:#c8c8c8}.tight-form-func>a:hover{color:#e3e3e3}.tight-form-func.show-function-controls{padding-top:5px;min-width:100px;text-align:center}input[type=text].tight-form-func-param{background:transparent;border:0;margin:0;padding:0}input[type=text].tight-form-clear-input{padding:8px 7px;border:0;margin:0;background:transparent;float:left;color:#c8c8c8;border-radius:0;border-right:1px solid #050505}[type=text].tight-form-input,[type=email].tight-form-input,[type=number].tight-form-input,[type=password].tight-form-input{border:0;border-right:1px solid #050505;margin:0;border-radius:0;padding:8px 6px;height:100%;box-sizing:border-box}[type=text].tight-form-input.last,[type=email].tight-form-input.last,[type=number].tight-form-input.last,[type=password].tight-form-input.last{border-right:0}input[type=checkbox].tight-form-checkbox{margin:0}select.tight-form-input{border:0;border-right:1px solid #050505;margin:0;border-radius:0;height:36px;padding:8px 3px}select.tight-form-input.last{border-right:0}.tight-form-func-controls{display:none;text-align:center}.tight-form-func-controls .fa-arrow-left{float:left;position:relative;top:2px}.tight-form-func-controls .fa-arrow-right{float:right;position:relative;top:2px}.tight-form-func-controls .fa-remove{margin-left:10px}.tight-form-radio input[type=radio]{margin:0}.tight-form-radio label{display:inline}.sidemenu-canvas{position:relative}.sidemenu-wrapper{position:absolute;display:none;top:0;bottom:0;left:0;width:200px;background:#161616;min-height:100%;z-index:101}.sidemenu-wrapper a:focus{text-decoration:none}.sidemenu-open .sidemenu-wrapper{display:block}.sidemenu-open .search-container{left:200px}.sidemenu-open .main-view{padding-left:200px}.sidemenu-open .panel-fullscreen{left:200px}.sidemenu{font-size:16px;font-weight:400;list-style:none;margin:0;padding:0}.sidemenu>li{margin-bottom:9px}.sidemenu .fa-caret-down{position:relative;top:2px;font-size:90%}.sidemenu.sidemenu-small{font-size:14px}.sidemenu.sidemenu-small .icon-circle{border-radius:50%;background:#000;box-shadow:0 0 14px 2px rgba(255,255,255,0.05);border:1px solid transparent;width:28px;height:28px}.sidemenu.sidemenu-small .icon-circle i{top:1px;left:4px;font-size:110%}.sidemenu.sidemenu-small .sidemenu-item{line-height:28px;padding-left:25px}.sidemenu-item-text{width:110px;display:inline-block;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.sidemenu-top-btn{display:block;padding:8px 0 4px 22px;background-color:#1f1f1f;border-right:3px solid #161616}.sidemenu-top-btn img{border-radius:50%;background:#000;border:1px solid #161616;width:30px;padding:4px}.sidemenu-top-btn i{padding-right:5px;padding-top:5px;font-size:170%;color:#e3e3e3}.icon-circle{width:40px;height:40px;display:inline-block}.icon-circle i{color:#e3e3e3;opacity:.7;position:relative;left:7px;top:5px;font-size:150%}.sidemenu-item{color:#e3e3e3;line-height:40px;padding:0 10px 0 20px;display:block;white-space:nowrap}.sidemenu-item .sidemenu-item-text{padding-left:11px;transition:color 100ms ease-out}.sidemenu-item .sidemenu-item-text.no-icon{padding-left:59px}.sidemenu-item img{border-radius:50%;width:28px;height:28px;box-shadow:0 0 14px 2px rgba(255,255,255,0.05)}.sidemenu-system-section{background-color:#005f81;color:#fff;padding:3px 0;margin-left:10px;margin-right:10px;border-radius:2px}.sidemenu-system-section .sidemenu-system-section-inner{border:2px solid black;border-left:none;border-right:0;padding:4px;overflow:hidden}.sidemenu-system-section .fa{float:left;font-size:120%;line-height:41px;padding:0 15px}.sidemenu-section-tagline{font-style:italic;font-size:75%;line-height:10px}.sidemenu-section-text-wrapper{padding-top:4px}.navbar-inner{padding-left:0}.navbar .nav>li>a{padding:17px 15px 13px}.navbar .nav>li>a .fa{font-size:115%}.top-nav{float:left;font-size:16px}.fa.top-nav-breadcrumb-icon{margin:18px 0 6px 5px;float:left;font-size:120%;color:#bbbfc2}.top-nav-menu-btn{border:1px solid #161616;border-radius:50%;background:#000;display:block;position:relative;float:left;width:30px;height:30px;padding:4px;margin:6px 6px 3px 9px}.top-nav-menu-btn .fa{color:#bbbfc2;width:30px;height:30px;left:9px;top:7px;font-size:150%;opacity:0;position:absolute;transition:opacity .2s ease-in-out}.top-nav-menu-btn img{width:30px;position:absolute;opacity:1;transition:opacity .2s ease-in-out}.top-nav-menu-btn:hover .fa{opacity:.7}.top-nav-menu-btn:hover img{opacity:0}.top-nav-dashboards-btn{display:block;float:left;margin:9px 18px 5px 14px;border-radius:3px;font-size:1.4em;color:#a2a2a2;border:solid 1px #555}.top-nav-dashboards-btn a{display:inline-block;background:#333;padding:5px 15px 5px 10px;border-radius:3px;color:#a2a2a2}.top-nav-dashboards-btn a:hover{background:#444}.top-nav-dashboards-btn a:hover .fa{color:#e3e3e3}.top-nav-dashboards-btn .fa-th-large{position:relative;top:2px}.top-nav-dashboards-btn .fa-caret-down{font-size:60%;position:relative;top:4px}.dashboard-title{padding:0 6px 5px 5px;color:#fff;font-size:17px}.top-nav-icon{margin:5px 0 0 11px;line-height:41px;float:left}.top-nav-section{display:block;float:left;padding:19px 9px 8px 0;font-weight:bold}.top-nav-section i{padding-left:8px}.top-nav-title{display:block;float:left;font-size:17px;padding:18px 10px 10px 13px;color:#e3e3e3}.top-nav-snapshot-title{display:block;float:left;font-size:1.4em;margin:9px 18px 5px 14px;color:#e3e3e3}.top-nav-snapshot-title .gf-icon{position:relative;top:3px;font-size:27px}.top-nav-snapshot-title a{display:inline-block;padding:0 15px 5px 10px}.gf-box{margin:15px;background-color:#1f1f1f;position:relative;border:1px solid #333}.gf-box-no-margin{margin:0}.gf-box-header-close-btn{float:right;padding:0;margin:0;background-color:transparent;border:0;padding:8px;color:#bbbfc2}.gf-box-header-close-btn i{font-size:120%}.gf-box-header-close-btn:hover{color:#fff}.gf-box-body{padding:20px;min-height:150px}.gf-box-footer{overflow:hidden}.gf-box-header{border-bottom:1px solid #333;overflow:hidden;background-color:#262626}.gf-box-header .tabs{float:left}.gf-box-header .nav{margin:0}.gf-box-title{padding-right:20px;padding-left:10px;float:left;color:#e3e3e3;font-size:18px;font-weight:normal;line-height:38px;margin:0}.gf-box-title .fa{padding:0 8px 0 5px;color:#bbbfc2}.page-container{margin:15px;background:#1f1f1f;position:relative;border:1px solid #262626;padding:20px 20px 60px 49px}.page-container h2{color:#bbbfc2;font-weight:normal;font-size:22px}.page{max-width:653px}.admin-page{max-width:800px;margin-left:10px}.admin-page .gf-box{margin-top:0}.admin-page .gf-box-body{min-height:0}.admin-page h2{margin-left:15px;margin-bottom:0;font-size:17.5px;color:#bbbfc2}.admin-page h2 i{padding-right:6px}.dashlist-link{display:block;margin:5px;padding:7px;background-color:#262626;border:1px solid #000}.dashlist-link .fa{float:right;padding-top:3px}.dashlist-link .fa-star{color:#f80}.dashlist-link:hover{background-color:#333}.admin-settings-section{color:#32d1df;font-weight:bold}td.admin-settings-key{padding-left:20px}input[type=text].ng-dirty.ng-invalid{box-shadow:inset 0 0 7px #cc3900}@font-face{font-family:'raintank';src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SAywAAAC8AAAAYGNtYXAaVcxZAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zm7/N1QAAAFwAAAFmGhlYWQFNK2SAAAHCAAAADZoaGVhB14DyAAAB0AAAAAkaG10eAwxAAQAAAdkAAAAHGxvY2ECNgP2AAAHgAAAABBtYXhwABcAvAAAB5AAAAAgbmFtZflvA+cAAAewAAABTnBvc3QAAwAAAAAJAAAAACAAAwQAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADmAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIOYC//3//wAAAAAAIOYA//3//wAB/+MaBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAADwAA/7YDnAO3AAMAHQAhACUAKgAuADEAQgBTAGQAdQCGAJcAqAC5AAA3FyUnJTUTJzUjJwcjJwcjFQcTBxcVIQ0BNzM1NycTAxEXJTkCByERIREHFSc3NzEzAxQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwE2FhUHNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATYWFXsKAS9VAbOKkFsDmDvbEZhXTjY/Alj+wQFGGT4mIU5TU/3CmgJU/awxICDLAWUbE40TGxsTjRMbLo0LERELjQwQEAzQHBONExsbE40UG9cQC40MEBAMjQsQ7BsTjRMbGxONExvXEAuNDBAQDIwMEAEbjRMbGxONFBsbFKgQC40MEBAMjQsQDkMvFvQEAfYoVRcXPDxGDf4JwhFKBFpdHAbPAdn+zwFIF54x/ZsCZUbPygV3/s4TGxsTjBQbHBOMqRAMjQsQEAuMDBEdjBQbHBOMFBsbFIwMEBAMjAwQAREM+RQbHBONExscEo2MjAwQEAyNCxARCy4bE4wUGxwTjRIbuo0LEBALjQwQAREMAAoAAf+5A2IDtQAQACEAMgBDAFQAZQB2AIcAkACVAAATHgE/AT4BLwEuAQ8BDgEfAT8BNhYfARYGDwEGJi8BJjY3NxceAT8BPgEvAS4BDwEOARc3FxYGDwEGJi8BJjY/ATYWFwMuAQ8BDgEfAR4BPwE+AS8BBycmNj8BNhYfARYGDwEGJicFNz4BLwEuAQ8BDgEfAR4BNzcXFgYPAQYmLwEmNj8BNhYXARMfASUvAQMFEwMlEwWdAyAVkhUYAxcDIRSTFBgDFxWTDBQBFwIODZIMFAIXAg8M3hcDIRSSFBgDFwMgFZIUGAPgFwIPDJIMFAIWAg4MkgwUAs4DIRSTFBgDFwMgFZIVGAMXyhcCDwyTDBQBFwIODZIMFAIBL5IUGAMXAyAVkhQYAxcDIRSRFwIPDJIMFAIXAg8MkgwUAv1pahUNAtUNFWv9LJ9jAmxj/ZQCFxQYAxYEIBWSFRgDFwMhFJO3FwIPDJIMFAIXAg8MkwwUAQWTFBgDFgMhFJMUGAMWAyEUIpINEwIXAg8MkwwUAhYCDg3+1xQYAxcDIRSTFBgDFwMhFJO2kwwUAhYCDgyTDBQCFgIPCwMXAyEUkxQYAxcDIBWSFBkD35MMFAIWAg4NkgwUAhYCDgwBU/1PilFwUokCsXD9VwJ9YP2DYAAKAAP/twMyA7QAEAAhADIAQwBUAGUAdgCHAIwAkQAAExQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwEyFhUBNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATIWFQERIREhExEhESF7IBelFx8fF6UXIDelDhITDaUOExQN9CAXpBcgIBekFyD8Ew2lDhMUDaQOE/7rHxelFyAgF6UXH/wUDaUOEhMNpQ0UAUykFyAgF6QXICAXxRMNpQ4TFA2kDhP9YQMv/NE7Arr9RgJOFyAgF6QXICAXpMUTDqQOExMOpA4TIaQXICAXpBcgIBekDhMTDqQOExMO/twXICAXpBcgIBekpKQOExMOpA4TEw43IBekFyAgF6QXINukDhMTDqQOExMOAeb8AwP9/PkCzP00AAEAAAABAADkYnVvXw889QALBAAAAAAA0Ty0lAAAAADRPLSUAAD/tgOcA7cAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAA5wAAQAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAACAAAAA50AAANiAAEDMgADAAAAAAAKABQAHgEWAg4CzAABAAAABwC6AA8AAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEAEAAAAAEAAAAAAAIADgBOAAEAAAAAAAMAEAAmAAEAAAAAAAQAEABcAAEAAAAAAAUAFgAQAAEAAAAAAAYACAA2AAEAAAAAAAoANABsAAMAAQQJAAEAEAAAAAMAAQQJAAIADgBOAAMAAQQJAAMAEAAmAAMAAQQJAAQAEABcAAMAAQQJAAUAFgAQAAMAAQQJAAYAEAA+AAMAAQQJAAoANABsAHIAYQBpAG4AdABhAG4AawBWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBhAGkAbgB0AGEAbgBrcmFpbnRhbmsAcgBhAGkAbgB0AGEAbgBrAFIAZQBnAHUAbABhAHIAcgBhAGkAbgB0AGEAbgBrAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAlsAAsAAAAACSAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIDLGNtYXAAAAFoAAAATAAAAEwaVcxZZ2FzcAAAAbQAAAAIAAAACAAAABBnbHlmAAABvAAABZgAAAWYbv83VGhlYWQAAAdUAAAANgAAADYFNK2SaGhlYQAAB4wAAAAkAAAAJAdeA8hobXR4AAAHsAAAABwAAAAcDDEABGxvY2EAAAfMAAAAEAAAABACNgP2bWF4cAAAB9wAAAAgAAAAIAAXALxuYW1lAAAH/AAAAU4AAAFO+W8D53Bvc3QAAAlMAAAAIAAAACAAAwAAAAMEAAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA5gIDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDmAv/9//8AAAAAACDmAP/9//8AAf/jGgQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAA8AAP+2A5wDtwADAB0AIQAlACoALgAxAEIAUwBkAHUAhgCXAKgAuQAANxclJyU1Eyc1IycHIycHIxUHEwcXFSENATczNTcnEwMRFyU5AgchESERBxUnNzcxMwMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBNhYVBzQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwE2FhV7CgEvVQGzipBbA5g72xGYV042PwJY/sEBRhk+JiFOU1P9wpoCVP2sMSAgywFlGxONExsbE40TGy6NCxERC40MEBAM0BwTjRMbGxONFBvXEAuNDBAQDI0LEOwbE40TGxsTjRMb1xALjQwQEAyMDBABG40TGxsTjRQbGxSoEAuNDBAQDI0LEA5DLxb0BAH2KFUXFzw8Rg3+CcIRSgRaXRwGzwHZ/s8BSBeeMf2bAmVGz8oFd/7OExsbE4wUGxwTjKkQDI0LEBALjAwRHYwUGxwTjBQbGxSMDBAQDIwMEAERDPkUGxwTjRMbHBKNjIwMEBAMjQsQEQsuGxOMFBscE40SG7qNCxAQC40MEAERDAAKAAH/uQNiA7UAEAAhADIAQwBUAGUAdgCHAJAAlQAAEx4BPwE+AS8BLgEPAQ4BHwE/ATYWHwEWBg8BBiYvASY2NzcXHgE/AT4BLwEuAQ8BDgEXNxcWBg8BBiYvASY2PwE2FhcDLgEPAQ4BHwEeAT8BPgEvAQcnJjY/ATYWHwEWBg8BBiYnBTc+AS8BLgEPAQ4BHwEeATc3FxYGDwEGJi8BJjY/ATYWFwETHwElLwEDBRMDJRMFnQMgFZIVGAMXAyEUkxQYAxcVkwwUARcCDg2SDBQCFwIPDN4XAyEUkhQYAxcDIBWSFBgD4BcCDwySDBQCFgIODJIMFALOAyEUkxQYAxcDIBWSFRgDF8oXAg8MkwwUARcCDg2SDBQCAS+SFBgDFwMgFZIUGAMXAyEUkRcCDwySDBQCFwIPDJIMFAL9aWoVDQLVDRVr/SyfYwJsY/2UAhcUGAMWBCAVkhUYAxcDIRSTtxcCDwySDBQCFwIPDJMMFAEFkxQYAxYDIRSTFBgDFgMhFCKSDRMCFwIPDJMMFAIWAg4N/tcUGAMXAyEUkxQYAxcDIRSTtpMMFAIWAg4MkwwUAhYCDwsDFwMhFJMUGAMXAyAVkhQZA9+TDBQCFgIODZIMFAIWAg4MAVP9T4pRcFKJArFw/VcCfWD9g2AACgAD/7cDMgO0ABAAIQAyAEMAVABlAHYAhwCMAJEAABMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBMhYVATQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwEyFhUBESERIRMRIREheyAXpRcfHxelFyA3pQ4SEw2lDhMUDfQgF6QXICAXpBcg/BMNpQ4TFA2kDhP+6x8XpRcgIBelFx/8FA2lDhITDaUNFAFMpBcgIBekFyAgF8UTDaUOExQNpA4T/WEDL/zROwK6/UYCThcgIBekFyAgF6TFEw6kDhMTDqQOEyGkFyAgF6QXICAXpA4TEw6kDhMTDv7cFyAgF6QXICAXpKSkDhMTDqQOExMONyAXpBcgIBekFyDbpA4TEw6kDhMTDgHm/AMD/fz5Asz9NAABAAAAAQAA5GJ1b18PPPUACwQAAAAAANE8tJQAAAAA0Ty0lAAA/7YDnAO3AAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOcAAEAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAgAAAAOdAAADYgABAzIAAwAAAAAACgAUAB4BFgIOAswAAQAAAAcAugAPAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABAAAAABAAAAAAACAA4ATgABAAAAAAADABAAJgABAAAAAAAEABAAXAABAAAAAAAFABYAEAABAAAAAAAGAAgANgABAAAAAAAKADQAbAADAAEECQABABAAAAADAAEECQACAA4ATgADAAEECQADABAAJgADAAEECQAEABAAXAADAAEECQAFABYAEAADAAEECQAGABAAPgADAAEECQAKADQAbAByAGEAaQBuAHQAYQBuAGsAVgBlAHIAcwBpAG8AbgAgADEALgAwAHIAYQBpAG4AdABhAG4Aa3JhaW50YW5rAHIAYQBpAG4AdABhAG4AawBSAGUAZwB1AGwAYQByAHIAYQBpAG4AdABhAG4AawBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:normal;font-style:normal}.gf-icon{display:inline-block;font:normal normal normal 14px/1 'raintank';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gf-icon-snap-multi:before{content:"\e600"}.gf-icon-snap-single-tilt:before{content:"\e601"}.gf-icon-snap-single:before{content:"\e602"}.row-control-inner{padding:0;margin:0;position:relative}.hide-controls{padding:0}.hide-controls .row-tab{display:none}.hide-controls .add-row-panel-hint{display:none}.playlist-active .grafana-menu-zoom-out,.playlist-active .add-row-panel-hint,.playlist-active .grafana-menu-refresh,.playlist-active .top-nav-dashboards-btn,.playlist-active .top-nav-dash-actions{display:none}.playlist-active .grafana-menu-stop-playlist{display:list-item}.row-button{width:24px}.modal{max-width:800px;left:0;right:0;margin-left:auto;margin-right:auto;top:20%}.dashboard-fullscreen .main-view-container{overflow:hidden;height:0;padding:0}.dashboard-fullscreen .main-view-container .row-control-inner{display:none}.histogram-chart{position:relative}.scrollable{max-height:300px;overflow:auto}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar:hover{height:8px}::-webkit-scrollbar-button:start:decrement,::-webkit-scrollbar-button:end:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement{display:none}::-webkit-scrollbar-button:horizontal:increment{display:none}::-webkit-scrollbar-button:vertical:decrement{display:none}::-webkit-scrollbar-button:vertical:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement:active{background-image:none}::-webkit-scrollbar-button:horizontal:increment:active{background-image:none}::-webkit-scrollbar-button:vertical:decrement:active{background-image:none}::-webkit-scrollbar-button:vertical:increment:active{background-image:none}::-webkit-scrollbar-track-piece{background-color:transparent}::-webkit-scrollbar-thumb:vertical{height:50px;background:-webkit-gradient(linear,left top,right top,color-stop(0%,#3a3a3a),color-stop(100%,#3a3a3a));border:1px solid #000;border-top:1px solid #000;border-left:1px solid #000}::-webkit-scrollbar-thumb:horizontal{width:50px;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#3a3a3a),color-stop(100%,#3a3a3a));border:1px solid #000;border-top:1px solid #000;border-left:1px solid #000}.sp-replacer{background:inherit;border:0;color:inherit;padding:0}.sp-replacer:hover,.sp-replacer.sp-active{border-color:inherit;color:inherit}.sp-container{border-radius:0;background-color:#262626;border:0;padding:0}.sp-palette-container,.sp-picker-container{border:0}.sp-dd{display:none}.sp-preview{position:relative;width:15px;height:15px;border:0;margin-right:5px;float:left;z-index:0}.datapoints-warning{pointer:none;position:absolute;top:50%;left:50%;z-index:10;margin-top:-50px;margin-left:-100px;width:200px;text-align:center;cursor:auto;padding:10px}.metrics-editor-help:hover .hide{display:block}.grafana-tooltip{position:absolute;top:-1000;left:0;color:#c8c8c8;padding:10px;font-size:11pt;font-weight:200;background-color:#3a3939;border-radius:5px;z-index:9999;max-width:800px;max-height:600px;overflow:hidden;line-height:14px}.grafana-tooltip a{color:#e3e3e3}.grafana-tooltip hr{padding:2px;color:#c8c8c8;margin:0;border-bottom:0 solid #c8c8c8}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip-inner{max-width:400px}.grafana-version-info{position:absolute;bottom:2px;left:3px;font-size:80%;color:#7b7b7b}.grafana-version-info a{color:#7b7b7b}.template-variable{color:#32d1df}.grafana-info-box:before{content:"\f05a";font-family:'FontAwesome';position:absolute;top:-8px;left:-8px;font-size:20px;color:#33b5e5}.grafana-info-box{position:relative;padding:5px 15px;background-color:#262626;border:1px solid #000}.grafana-info-box h5{margin-top:5px}.grafana-tip{padding-left:5px}.shortcut-table td{padding:3px}.shortcut-table th:last-child{text-align:left}.shortcut-table td:first-child{text-align:right}.confirm-modal{border:1px solid #333;max-width:500px;background-color:#1f1f1f;text-align:center}.confirm-modal .modal-close{float:right;font-size:140%;padding:10px}.confirm-modal .confirm-modal-icon{padding-top:41px;font-size:280%;color:#690;padding-bottom:20px}.confirm-modal .confirm-modal-title{font-size:18px;color:#e3e3e3;margin-bottom:15px}.confirm-modal .confirm-modal-text{font-size:16px}.confirm-modal .confirm-modal-buttons{margin-top:35px;margin-bottom:35px}.confirm-modal .confirm-modal-buttons button{margin-right:5px}.share-snapshot{text-align:center}.share-snapshot .gf-icon-snap-multi{font-size:70px}.share-snapshot .fa-spinner{font-size:70px}.share-snapshot .share-snapshot-info-text{margin:10px 105px}.share-snapshot .share-snapshot-info-text strong{color:#fff;font-weight:bold}.share-snapshot .share-snapshot-header{margin:20px 0 22px 0}.share-snapshot .tight-form{text-align:left}.share-snapshot .share-snapshot-link{max-width:716px;white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}
\ No newline at end of file
diff --git a/public/css/bootstrap.light.min.css b/public/css/bootstrap.light.min.css
index d66cfdb1384..2c563bb4c1f 100644
--- a/public/css/bootstrap.light.min.css
+++ b/public/css/bootstrap.light.min.css
@@ -6,4 +6,4 @@
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world by @mdo and @fat.
- */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.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}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{max-width:100%;width:auto\9;height:auto;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"]{-webkit-appearance:button;cursor:pointer}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{*{text-shadow:none!important;color:#000!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}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#555;background-color:#eaeaea}a{color:#555;text-decoration:none}a:hover,a:focus{color:#222;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;content:"";line-height:0}.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;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%}.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;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0}.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,a.muted:focus{color:#808080}.text-warning{color:#ff934b}a.text-warning:hover,a.text-warning:focus{color:#ff7518}.text-error{color:#ff7169}a.text-error:hover,a.text-error:focus{color:#ff4136}.text-info{color:#af78ca}a.text-info:hover,a.text-info:focus{color:#9954bb}.text-success{color:#3dd441}a.text-success:hover,a.text-success:focus{color:#28b62c}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:#222;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 #f9f9f9}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;*display:inline;*zoom:1;padding-left:5px;padding-right: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;content:"";line-height:0}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #f9f9f9;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 #f9f9f9}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}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 #f9f9f9;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:Menlo,Monaco,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;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap}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:3px;-moz-border-radius:3px;border-radius:3px}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:#020202;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;vertical-align:middle}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 #999;-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,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;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;border:1px solid #999;background-color:#fff}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;background-color:#fcfcfc;border-color:#999;-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);cursor:not-allowed}.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;content:"";line-height:0}.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:#f9f9f9}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:#ff934b}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#ff934b}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#ff934b;-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:#ff7518;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd0b1;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd0b1;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd0b1}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#ff934b;background-color:#ff7518;border-color:#ff934b}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#ff7169}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#ff7169}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#ff7169;-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:#ff4136;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd2cf;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd2cf;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd2cf}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#ff7169;background-color:#ff4136;border-color:#ff7169}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#3dd441}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#3dd441}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#3dd441;-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:#28b62c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #90e793;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #90e793;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #90e793}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#3dd441;background-color:#28b62c;border-color:#3dd441}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#af78ca}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#af78ca}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#af78ca;-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:#9954bb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dac1e7;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dac1e7;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dac1e7}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#af78ca;background-color:#9954bb;border-color:#af78ca}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;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#7c7c7c}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;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,.input-append .popover,.input-prepend .popover{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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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:#f9f9f9;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:#90e793;border-color:#28b62c}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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;*zoom:1;margin-bottom:0;vertical-align:middle}.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;content:"";line-height:0}.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:#eaeaea}.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:3px;-moz-border-radius:3px;border-radius:3px}.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,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius: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:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.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:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.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:#e8f8fd}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:#28b62c}.table tbody tr.error>td{background-color:#ff4136}.table tbody tr.warning>td{background-color:#ff7518}.table tbody tr.info>td{background-color:#9954bb}.table-hover tbody tr.success:hover>td{background-color:#23a127}.table-hover tbody tr.error:hover>td{background-color:#ff291c}.table-hover tbody tr.warning:hover>td{background-color:#fe6600}.table-hover tbody tr.info:hover>td{background-color:#8d46b0}.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,.dropdown-submenu:focus>a{text-decoration:none;color:#fff;background-color:#24ade0;background-image:-moz-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2ab2e4),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-o-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:linear-gradient(to bottom,#2ab2e4,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2ab2e4',endColorstr='#ff1ca6d9',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#24ade0;background-image:-moz-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2ab2e4),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-o-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:linear-gradient(to bottom,#2ab2e4,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2ab2e4',endColorstr='#ff1ca6d9',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #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;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#ccc;margin-top:5px;margin-right:-10px}.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-left:20px;padding-right:20px}.typeahead{z-index:1051;margin-top:2px;-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,.close:focus{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;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#e9e9e9;background-image:-moz-linear-gradient(top,#f9f9f9,#d2d2d2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f9f9f9),to(#d2d2d2));background-image:-webkit-linear-gradient(top,#f9f9f9,#d2d2d2);background-image:-o-linear-gradient(top,#f9f9f9,#d2d2d2);background-image:linear-gradient(to bottom,#f9f9f9,#d2d2d2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9',endColorstr='#ffd2d2d2',GradientType=0);border-color:#d2d2d2 #d2d2d2 #acacac;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#d2d2d2;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#d2d2d2;*background-color:#c6c6c6}.btn:active,.btn.active{background-color:#b9b9b9 \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{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,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(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:22px 30px;font-size:17.5px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.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:2px 6px;font-size:10.5px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.btn-block{display:block;width:100%;padding-left:0;padding-right: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-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#32b2e1;background-image:-moz-linear-gradient(top,#41bae7,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#41bae7),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#41bae7,#1ca6d9);background-image:-o-linear-gradient(top,#41bae7,#1ca6d9);background-image:linear-gradient(to bottom,#41bae7,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff41bae7',endColorstr='#ff1ca6d9',GradientType=0);border-color:#1ca6d9 #1ca6d9 #137295;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#1ca6d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#1ca6d9;*background-color:#1995c2}.btn-primary:active,.btn-primary.active{background-color:#1683ac \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#fe781e;background-image:-moz-linear-gradient(top,#ff8432,#fe6600);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff8432),to(#fe6600));background-image:-webkit-linear-gradient(top,#ff8432,#fe6600);background-image:-o-linear-gradient(top,#ff8432,#fe6600);background-image:linear-gradient(to bottom,#ff8432,#fe6600);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff8432',endColorstr='#fffe6600',GradientType=0);border-color:#fe6600 #fe6600 #b14700;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#fe6600;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#fe6600;*background-color:#e45c00}.btn-warning:active,.btn-warning.active{background-color:#cb5200 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ff463b;background-image:-moz-linear-gradient(top,#ff5950,#ff291c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff5950),to(#ff291c));background-image:-webkit-linear-gradient(top,#ff5950,#ff291c);background-image:-o-linear-gradient(top,#ff5950,#ff291c);background-image:linear-gradient(to bottom,#ff5950,#ff291c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff5950',endColorstr='#ffff291c',GradientType=0);border-color:#ff291c #ff291c #cf0b00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#ff291c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#ff291c;*background-color:#ff1103}.btn-danger:active,.btn-danger.active{background-color:#e80d00 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#29ba2d;background-image:-moz-linear-gradient(top,#2dcb31,#23a127);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2dcb31),to(#23a127));background-image:-webkit-linear-gradient(top,#2dcb31,#23a127);background-image:-o-linear-gradient(top,#2dcb31,#23a127);background-image:linear-gradient(to bottom,#2dcb31,#23a127);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2dcb31',endColorstr='#ff23a127',GradientType=0);border-color:#23a127 #23a127 #166218;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#23a127;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#23a127;*background-color:#1f8c22}.btn-success:active,.btn-success.active{background-color:#1a771d \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#9b59bb;background-image:-moz-linear-gradient(top,#a466c2,#8d46b0);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a466c2),to(#8d46b0));background-image:-webkit-linear-gradient(top,#a466c2,#8d46b0);background-image:-o-linear-gradient(top,#a466c2,#8d46b0);background-image:linear-gradient(to bottom,#a466c2,#8d46b0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa466c2',endColorstr='#ff8d46b0',GradientType=0);border-color:#8d46b0 #8d46b0 #613079;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#8d46b0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#8d46b0;*background-color:#7e3f9d}.btn-info:active,.btn-info.active{background-color:#6f378b \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#4b4b4b;background-image:-moz-linear-gradient(top,#555,#3c3c3c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#555),to(#3c3c3c));background-image:-webkit-linear-gradient(top,#555,#3c3c3c);background-image:-o-linear-gradient(top,#555,#3c3c3c);background-image:linear-gradient(to bottom,#555,#3c3c3c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff555555',endColorstr='#ff3c3c3c',GradientType=0);border-color:#3c3c3c #3c3c3c #161616;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#3c3c3c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#3c3c3c;*background-color:#2f2f2f}.btn-inverse:active,.btn-inverse.active{background-color:#222 \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{border-color:transparent;cursor:pointer;color:#555;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#222;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#ff7518;border:1px solid transparent;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.alert,.alert h4{color:#ff934b}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#28b62c;border-color:transparent;color:#3dd441}.alert-success h4{color:#3dd441}.alert-danger,.alert-error{background-color:#ff4136;border-color:transparent;color:#ff7169}.alert-danger h4,.alert-error h4{color:#ff7169}.alert-info{background-color:#9954bb;border-color:transparent;color:#af78ca}.alert-info h4{color:#af78ca}.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-left:0;margin-bottom:20px;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f9f9f9}.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-left:15px;padding-right:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-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,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#555}.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;content:"";line-height:0}.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,.nav-tabs>li>a:focus{border-color:#f9f9f9 #f9f9f9 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;background-color:#eaeaea;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.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,.nav-pills>.active>a:focus{color:#fff;background-color:#555}.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;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2}.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{border-top-color:#555;border-bottom-color:#555;margin-top:6px}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#222;border-bottom-color:#222}.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,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{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,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0}.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,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{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,.tabs-left>.nav-tabs>li>a:focus{border-color:#f9f9f9 #ddd #f9f9f9 #f9f9f9}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{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,.tabs-right>.nav-tabs>li>a:focus{border-color:#f9f9f9 #f9f9f9 #f9f9f9 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default}.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2}.navbar-inner{min-height:52px;padding-left:20px;padding-right:20px;background-color:#f8f8f8;background-image:-moz-linear-gradient(top,#f8f8f8,#f8f8f8);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f8f8f8),to(#f8f8f8));background-image:-webkit-linear-gradient(top,#f8f8f8,#f8f8f8);background-image:-o-linear-gradient(top,#f8f8f8,#f8f8f8);background-image:linear-gradient(to bottom,#f8f8f8,#f8f8f8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8f8f8',endColorstr='#fff8f8f8',GradientType=0);border:1px solid none;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-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);*zoom:1}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{float:left;display:block;padding:16px 20px 16px;margin-left:-20px;font-size:20px;font-weight:200;color:#666;text-shadow:0 1px 0 #f8f8f8}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:52px;color:#666}.navbar-link{color:#666}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:52px;margin:0 9px;border-left:1px solid #f8f8f8;border-right:1px solid #f8f8f8}.navbar .btn,.navbar .btn-group{margin-top:11px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:11px}.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:11px;margin-bottom:0}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;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-left:0;padding-right: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,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(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:16px 15px 16px;color:#666;text-decoration:none;text-shadow:0 1px 0 #f8f8f8}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333;text-decoration:none}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e7e7e7;-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-left:5px;margin-right:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ebebeb;background-image:-moz-linear-gradient(top,#ebebeb,#ebebeb);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ebebeb),to(#ebebeb));background-image:-webkit-linear-gradient(top,#ebebeb,#ebebeb);background-image:-o-linear-gradient(top,#ebebeb,#ebebeb);background-image:linear-gradient(to bottom,#ebebeb,#ebebeb);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#ffebebeb',GradientType=0);border-color:#ebebeb #ebebeb #c5c5c5;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#ebebeb;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#ebebeb;*background-color:#dedede}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#d2d2d2 \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{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:9px}.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:10px}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0;bottom:-7px;top:auto}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #fff;border-bottom:0;bottom:-6px;top:auto}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e7e7e7;color:#555}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#666;border-bottom-color:#666}.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{left:auto;right:0}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-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:#2ab2e4;background-image:-moz-linear-gradient(top,#2ab2e4,#2ab2e4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2ab2e4),to(#2ab2e4));background-image:-webkit-linear-gradient(top,#2ab2e4,#2ab2e4);background-image:-o-linear-gradient(top,#2ab2e4,#2ab2e4);background-image:linear-gradient(to bottom,#2ab2e4,#2ab2e4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2ab2e4',endColorstr='#ff2ab2e4',GradientType=0);border-color:transparent}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#fff}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:rgba(0,0,0,0.05);color:#fff}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#2ab2e4}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-left-color:#2ab2e4;border-right-color:#2ab2e4}.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{background-color:#2ab2e4;color:#fff}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.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:#9bdbf2;border-color:#2ab2e4;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#333}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#333}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#333}.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;-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);outline:0}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#1ca6d9;background-image:-moz-linear-gradient(top,#1ca6d9,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1ca6d9),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#1ca6d9,#1ca6d9);background-image:-o-linear-gradient(top,#1ca6d9,#1ca6d9);background-image:linear-gradient(to bottom,#1ca6d9,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1ca6d9',endColorstr='#ff1ca6d9',GradientType=0);border-color:#1ca6d9 #1ca6d9 #137295;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#1ca6d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#1ca6d9;*background-color:#1995c2}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#1683ac \9}.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:.7;filter:alpha(opacity=70)}.modal{position:fixed;z-index:1050;width:100%;background-color:#fff;-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;outline:0}.modal.fade{-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;top:-25%}.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;overflow-y:auto;padding:15px}.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-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;*zoom:1}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#333}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#fff;border-bottom:1px solid #f2f2f2;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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:16px}.popover .arrow:after{border-width:15px;content:""}.popover.top .arrow{left:50%;margin-left:-16px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-16px}.popover.top .arrow:after{bottom:1px;margin-left:-15px;border-bottom-width:0;border-top-color:#fff}.popover.right .arrow{top:50%;left:-16px;margin-top:-16px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right .arrow:after{left:1px;bottom:-15px;border-left-width:0;border-right-color:#fff}.popover.bottom .arrow{left:50%;margin-left:-16px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-16px}.popover.bottom .arrow:after{top:1px;margin-left:-15px;border-top-width:0;border-bottom-color:#fff}.popover.left .arrow{top:50%;right:-16px;margin-top:-16px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-15px}.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;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#ff7169}.label-important[href],.badge-important[href]{background-color:#ff4136}.label-warning,.badge-warning{background-color:#ff7518}.label-warning[href],.badge-warning[href]{background-color:#e45c00}.label-success,.badge-success{background-color:#3dd441}.label-success[href],.badge-success[href]{background-color:#28b62c}.label-info,.badge-info{background-color:#af78ca}.label-info[href],.badge-info[href]{background-color:#9954bb}.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}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}body{font-weight:300;background:#eaeaea}blockquote{padding:10px 15px;background-color:#f9f9f9;border-left-color:#555}blockquote.pull-right{padding:10px 15px;border-right-color:#555}blockquote small{color:#555}.muted{color:#555}.text-warning{color:#ff7518}a.text-warning:hover{color:#e45c00}.text-error{color:#ff4136}a.text-error:hover{color:#ff1103}.text-info{color:#9954bb}a.text-info:hover{color:#7e3f9d}.text-success{color:#28b62c}a.text-success:hover{color:#1f8c22}.navbar .navbar-inner{background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar .brand{padding:0 15px}.navbar .brand:hover{color:#333}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-bottom:1px solid #2ab2e4;background-color:transparent}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555}.navbar .nav li.dropdown.open>.dropdown-toggle:hover,.navbar .nav li.dropdown.active>.dropdown-toggle:hover,.navbar .nav li.dropdown.open.active>.dropdown-toggle:hover{color:#f9f9f9}.navbar .navbar-search .search-query{line-height:normal}.navbar-inverse .brand,.navbar-inverse .nav>li>a{text-shadow:none}.navbar-inverse .brand:hover,.navbar-inverse .nav>.active>a,.navbar-inverse .nav>.active>a:hover,.navbar-inverse .nav>.active>a:focus{background-color:rgba(0,0,0,0.05);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;color:#fff}.navbar-inverse .navbar-search .search-query{color:#222}div.subnav{margin:0 1px;background:#999 none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}div.subnav .nav{background-color:transparent}div.subnav .nav>li>a{border-color:transparent}div.subnav .nav>.active>a,div.subnav .nav>.active>a:hover{border-color:transparent;background-color:#000;color:#fff;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav-fixed{top:53px;margin:0}.nav .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#2ab2e4}.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs li>a:hover,.nav-tabs li.active>a,.nav-tabs li.active>a:hover{border-color:transparent;background-color:transparent;border-bottom:2px solid #2ab2e4;color:#2ab2e4}.nav-tabs li.disabled>a{color:#555}.nav-tabs .open .dropdown-toggle{background-color:#060606;border-color:transparent}.tabs-below>.nav-tabs>li>a,.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0}.nav-pills>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;color:#000}.nav-pills>li>a:hover{background-color:#000;color:#fff}.nav-pills>.disabled>a,.nav-pills>.disabled>a:hover{background-color:#f9f9f9;color:#333}.nav-list>li>a{color:#222}.nav-list>li>a:hover{background-color:#2ab2e4;color:#fff;text-shadow:none}.nav-list .nav-header{color:#222}.nav-list .divider{background-color:#555;border-bottom:0}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>li>a,.pagination ul>li>span{margin-right:6px;color:#222}.pagination ul>li>a:hover,.pagination ul>li>span:hover{background-color:#222;color:#fff}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{margin-right:0}.pagination ul>.active>a,.pagination ul>.active>span{color:#fff}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{background-color:#f9f9f9;color:#333}.pager li>a,.pager li>span{background-color:#999;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;color:#222}.pager li>a:hover,.pager li>span:hover{background-color:#222;color:#fff}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>span{background-color:#f9f9f9;color:#333}.breadcrumb{background-color:#999}.breadcrumb li{text-shadow:none}.breadcrumb .divider,.breadcrumb .active{color:#222;text-shadow:none}.btn{padding:5px 12px;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-shadow:none}.btn.disabled{box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-large{padding:14px 23px}.btn-small{padding:2px 10px}.btn-mini{padding:2px 6px}.btn-group>.btn:first-child,.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}legend,label{color:#555;border-bottom:0 solid #222}.table tbody tr.success td{color:#fff}.table tbody tr.error td{color:#fff}.table tbody tr.info td{color:#fff}.table-bordered{-webkit-border-radius:0;-moz-border-radius:0;border-radius: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-radius:0;-moz-border-radius:0;border-radius:0}.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-radius:0;-moz-border-radius:0;border-radius:0}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"]{color:#222}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#ff7518}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#ff7518;color:#222}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#ff4136}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#ff4136;color:#222}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#28b62c}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#28b62c;color:#222}legend{border-bottom:0;color:#222}.form-actions{border-top:0;background-color:#f9f9f9}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.alert{text-shadow:none}.alert-heading,.alert h1,.alert h2,.alert h3,.alert h4,.alert h5,.alert h6{color:#fff}.label-success{background-color:#28b62c}.label-important{background-color:#ff4136}.label-info{background-color:#9954bb}.label-inverse{background-color:#000}.badge{border-radius:0;font-weight:200}a:hover{text-decoration:none}.hero-unit{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.well{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}a.thumbnail{background-color:#999}a.thumbnail:hover{background-color:#555;border-color:transparent}.progress{background-color:#f9f9f9;background-image:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.modal{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background-color:#eaeaea}.modal-header{border-bottom:0}.modal-footer{border-top:0;background-color:transparent}.popover{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.popover-title{border-bottom:0;color:#fff}@media(max-width:767px){div.panel{width:100%!important;padding:0!important}}.container-fluid{padding-left:0;padding-right:0}.main-view-container{padding:5px 10px;width:100%;box-sizing:border-box}.bgNav{background:#f8f8f8}.bgPrimary{background:#41bae7;color:rgba(255,255,255,0.9)}.bgInfo{background:#a466c2;color:rgba(255,255,255,0.9)}.bgSuccess{background:#2dcb31;color:rgba(255,255,255,0.9)}.bgWarning{background:#ff8432;color:rgba(255,255,255,0.9)}.bgDanger{background:#ff5950;color:rgba(255,255,255,0.9)}.bgInverse{background:#555;color:rgba(255,255,255,0.9)}code,pre{background-color:#f9f9f9}div.editor-row{vertical-align:top}div.editor-row div.section{margin-right:20px;vertical-align:top;display:inline-block}div.editor-option{vertical-align:top;display:inline-block;margin-right:10px}div.editor-option label{display:block}#events{font-size:12px}.version{font-size:85%}.legend{color:#000}div.fake-input{background-color:#fff;border:1px solid #999;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;border-radius:3px 3px 3px 3px}hr.small{margin:5px 0}form input.ng-invalid{color:#ff7169}.editor-title{margin-right:10px;font-size:1.7em;font-weight:bold;text-transform:capitalize}.editor-title small{opacity:.5;font-size:.7em;font-weight:normal}.bordered{border:1px solid #ddd}.table-unpadded th,.table-unpadded td{padding:0 2px}.spy{position:absolute;right:0;top:0}.navbar-inner{border-width:0}.grafana-row{margin-bottom:5px}.row-tab .dropdown-menu-right{top:0;left:33px}.row-tab-button{padding:0;cursor:pointer;vertical-align:middle;width:30px;height:30px;text-align:center;display:inline-block;line-height:30px}.row-button{width:30px;float:left;cursor:pointer;line-height:31px}.row-text{white-space:nowrap;text-transform:uppercase;font-weight:bold;font-size:.9em;text-align:center;line-height:31px;height:31px}.row-close{padding:0;margin:0;background:#fff;text-align:center}.row-close-buttons{position:absolute;left:0}.row-open{margin-top:5px;left:-34px;position:absolute;z-index:100;transition:.10s left;transition-delay:.10s;-webkit-transition-delay:.10s}.row-open:hover{left:-12px}.odd{background-color:#f9f9f9}.nomargin{margin:0}[ng\:cloak],[ng-cloak],.ng-cloak{display:none!important}.table tbody+tbody{border-top:0}.ui-draggable-dragging{display:block;z-index:9999}.link{color:#555;cursor:pointer}.link:hover{color:#222}.pointer{cursor:pointer}.popover{max-width:480px}.tiny{font-size:50%}.smaller{font-size:70%}.small{font-size:85%}.large{font-size:120%}.strong{font-weight:bold}a{cursor:pointer}.normal{font-weight:normal}.light{font-weight:200}.input-smaller{width:75px}.string{color:#626262}.number{color:#ba8bd1}.boolean{color:#ffa365}.key{color:#ff8983}.btn-active{background-color:#e6e6e6;background-image:none;box-shadow:0 2px 4px rgba(0,0,0,0.15) inset,0 1px 2px rgba(0,0,0,0.05);outline:0 none}.remove:hover{background-color:#ff291c}.faded{opacity:.2}div.flot-text{color:#555!important}.page-alert-list{z-index:8000;min-width:300px;max-width:300px;position:fixed;right:20px;top:56px}.page-alert-list .alert{color:#fff;padding-bottom:13px;position:relative}.page-alert-list .alert-close{position:absolute;top:-4px;right:-2px;width:19px;height:19px;padding:0;background:#f9f9f9;border-radius:50%;border:0;font-size:1.1rem;color:#222}.page-alert-list .alert-title{font-weight:bold;padding-bottom:2px}.alert-warning{background-color:#ff7518;border-color:transparent;color:#ff934b}.popover.topLeft{margin-top:-10px}.popover.topLeft .arrow{bottom:-10px;left:25%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#fff}.popover.topLeft .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.topRight{margin-top:-10px}.popover.topRight .arrow{bottom:-10px;left:75%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#fff}.popover.topRight .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.rightTop .arrow{top:10%;left:-16px;margin-top:-16px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightTop .arrow:after{left:1px;bottom:-15px;border-left-width:0;border-right-color:#fff}.popover.rightBottom .arrow{top:90%;left:-16px;margin-top:-16px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightBottom .arrow:after{left:1px;bottom:-15px;border-left-width:0;border-right-color:#fff}.popover.bottomLeft .arrow{left:10%;margin-left:-16px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-16px}.popover.bottomLeft .arrow:after{top:1px;margin-left:-15px;border-top-width:0;border-bottom-color:#fff}.popover.bottomRight .arrow{left:90%;margin-left:-16px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-16px}.popover.bottomRight .arrow:after{top:1px;margin-left:-15px;border-top-width:0;border-bottom-color:#fff}.popover.leftTop .arrow{top:10%;right:-16px;margin-top:-16px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftTop .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-15px}.popover.leftBottom .arrow{top:90%;right:-16px;margin-top:-16px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftBottom .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-15px}.popover.topLeft .arrow{left:10%;margin-left:-16px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-16px}.popover.topLeft .arrow:after{bottom:1px;margin-left:-15px;border-bottom-width:0;border-top-color:#fff}.popover.topRight .arrow{left:90%;margin-left:-16px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-16px}.popover.topRight .arrow:after{bottom:1px;margin-left:-15px;border-bottom-width:0;border-top-color:#fff}.typeahead{max-height:300px;overflow-y:auto}.label-tag{background-color:#9954bb;color:#f2f2f2;border-radius:2px;text-shadow:none;font-size:13px;padding:4px 6px}.label-tag .icon-tag{position:relative;top:1px;padding-right:4px}.label-tag:hover{opacity:.85;background-color:#7e3f9d}.save-dashboard-dropdown{padding:10px}.save-dashboard-dropdown li>a{padding-left:5px}.save-dashboard-dropdown-save-form{margin-bottom:5px}.inspector-request-table td{padding:5px}.inspector-request-table td:first-child{white-space:nowrap}.modal-body{padding:0}code,pre{background-color:#fff;color:#555}.login-form{width:50%;float:left;margin-left:25%;margin-right:25%;padding-top:50px}.login-box{width:700px;margin:100px auto 0 auto}.login-box-logo{text-align:center;padding-bottom:50px}.login-inner-box{background:#fff}.login-tab-header{background:#efefef;text-align:center}.btn-login-tab{background:transparent;border:0;font-size:15px;padding:10px 10px;font-weight:bold;display:inline-block;width:170px;color:#555}.btn-login-tab.active{background:#e2e2e2;color:#fff}.btn-login-tab:focus{outline:0}.password-strength{display:block;width:50px;overflow:visible;white-space:nowrap;padding-top:3px;margin-left:97px;color:#222;border-top:3px solid #ff4136}.password-strength.password-strength-ok{width:170px;border-top:3px solid #ffa04e}.password-strength.password-strength-good{width:254px;border-top:3px solid #3dd441}.login-submit-button-row{text-align:center;margin-top:40px}.login-submit-button-row button{padding:9px 7px;font-size:14px;font-weight:bold;width:150px;display:inline-block;border:1px solid #6f6f6f}.login-oauth{margin-top:30px;padding:10px;background:#efefef}.login-oauth .btn-google{background:#dd4b39;color:white}.login-oauth .btn-github{background:#555;color:white}.submenu-controls-visible .panel-fullscreen{top:88px}.submenu-controls{margin:10px 10px 0 0;font-size:16px}.annotation-disabled,.annotation-disabled a{color:#a2a2a2}.annotation-segment label.cr1{margin-left:5px}.graph-canvas-wrapper{position:relative;cursor:crosshair}.graph-legend{margin:0 20px;text-align:center}.graph-legend .popover-content{padding:0}.graph-legend-icon{position:relative;padding-right:4px;top:1px}.graph-legend-icon,.graph-legend-alias,.graph-legend-value{float:left;white-space:nowrap;font-size:85%;text-align:left}.graph-legend-icon.current:before,.graph-legend-alias.current:before,.graph-legend-value.current:before{content:"Current: "}.graph-legend-icon.max:before,.graph-legend-alias.max:before,.graph-legend-value.max:before{content:"Max: "}.graph-legend-icon.min:before,.graph-legend-alias.min:before,.graph-legend-value.min:before{content:"Min: "}.graph-legend-icon.total:before,.graph-legend-alias.total:before,.graph-legend-value.total:before{content:"Total: "}.graph-legend-icon.avg:before,.graph-legend-alias.avg:before,.graph-legend-value.avg:before{content:"Avg: "}.graph-legend-icon .fa{font-size:135%;position:relative;top:1px}.graph-legend-series{float:left;white-space:nowrap;padding-left:10px;padding-top:6px}.graph-legend-value{padding-left:6px}.graph-legend-table{display:table;width:100%;margin:0}.graph-legend-table .graph-legend-series{display:table-row;float:none;padding-left:0}.graph-legend-table .graph-legend-series.pull-right{float:none}.graph-legend-table td,.graph-legend-table .graph-legend-alias,.graph-legend-table .graph-legend-icon,.graph-legend-table .graph-legend-value{float:none;display:table-cell;white-space:nowrap;padding:2px 10px;text-align:right;border-bottom:1px solid #eee}.graph-legend-table .graph-legend-icon{width:5px;padding:0;top:0}.graph-legend-table .graph-legend-icon .fa{top:4px}.graph-legend-table .graph-legend-value{padding-left:15px}.graph-legend-table .graph-legend-alias{padding-left:7px;text-align:left;width:95%}.graph-legend-table .graph-legend-series:nth-child(odd){background-color:#e4e4e4}.graph-legend-table .graph-legend-value.current:before,.graph-legend-table .graph-legend-value.max:before,.graph-legend-table .graph-legend-value.min:before,.graph-legend-table .graph-legend-value.total:before,.graph-legend-table .graph-legend-value.avg:before{content:''}.graph-legend-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#2ab2e4;font-size:85%;white-space:nowrap}.graph-legend-rightside.graph-wrapper{display:table;width:100%}.graph-legend-rightside .graph-canvas-wrapper{display:table-cell;width:100%;position:relative}.graph-legend-rightside .graph-legend-wrapper{display:table-cell;vertical-align:top;position:relative;left:4px}.graph-legend-rightside .graph-legend{margin:0}.graph-legend-rightside .graph-legend-series{display:block;padding-left:0}.graph-legend-rightside .graph-legend-table .graph-legend-series{display:table-row}.graph-legend-series-hidden a{color:#a2a2a2}.graph-legend-popover{width:200px}.graph-legend-popover label{display:inline-block}.graph-legend-popover .btn{padding:1px 3px;margin-right:0;line-height:initial}.graph-legend-popover .close{margin-right:5px;color:#555;opacity:.7;text-shadow:none}.graph-legend-popover .editor-row{padding:5px}.annotation-tags{color:#9954bb}.graph-series-override input{float:left;margin-right:10px}.graph-series-override .graph-series-override-option{float:left;padding:2px 6px}.graph-series-override .graph-series-override-selector{float:left}.graph-tooltip{white-space:nowrap}.graph-tooltip .graph-tooltip-time{text-align:center;font-weight:bold;position:relative;top:-3px}.graph-tooltip .graph-tooltip-list-item{display:table-row}.graph-tooltip .graph-tooltip-series-name{display:table-cell}.graph-tooltip .graph-tooltip-value{display:table-cell;font-weight:bold;padding-left:10px;text-align:right}.left-yaxis-label{top:50%;left:-5px;transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);transform-origin:left top;-o-transform-origin:left top;-ms-transform-origin:left top;-moz-transform-origin:left top;-webkit-transform-origin:left top}.right-yaxis-label{top:50%;right:-5px;-webkit-transform:rotate(90deg);-webkit-transform-origin:right top;-moz-transform:rotate(90deg);-moz-transform-origin:right top;-ms-transform:rotate(90deg);-ms-transform-origin:right top;-o-transform:rotate(90deg);-o-transform-origin:right top;transform:rotate(90deg);transform-origin:right top}.axisLabel{color:#555;font-size:11.9px;position:absolute;text-align:center;font-size:12px}.bootstrap-tagsinput{display:inline-block;padding:4px 6px;margin-bottom:10px;color:#555;vertical-align:middle;border-radius:4px;max-width:100%;line-height:22px;background-color:#fff;border:1px solid #999;-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}.bootstrap-tagsinput input{border:0;box-shadow:none;outline:0;background-color:transparent;padding:0;padding-left:5px;margin:0;width:auto!important;max-width:inherit}.bootstrap-tagsinput input:focus{border:0;box-shadow:none}.bootstrap-tagsinput .tag{margin-right:2px;color:white}.bootstrap-tagsinput .tag [data-role="remove"]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role="remove"]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role="remove"]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.bootstrap-tagsinput .tag [data-role="remove"]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.grafana-options-table{width:100%}.grafana-options-table th{padding:5px 10px;border-bottom:4px solid #fff}.grafana-options-table tr td{background-color:#ececec;padding:5px 10px;white-space:nowrap;border-bottom:4px solid #fff}.grafana-options-table tr td.nobg{background-color:transparent}.grafana-options-table .max-width-btns{padding-right:0}.grafana-options-table .max-width-btns .btn{box-sizing:border-box;width:100%}.max-width{overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap}.grafana-options-list{list-style:none;margin:0;max-width:450px}.grafana-options-list li:nth-child(odd){background-color:#e4e4e4}.grafana-options-list li{float:left;margin:2px;padding:5px 10px;border:1px solid #eee}.grafana-options-list li:first-child{border:1px solid #eee}.search-container{left:52px;top:33px;margin:15px;z-index:1000;position:absolute;width:700px;box-shadow:0 0 55px 0 black;padding:10px;background-color:#fff;border:1px solid #e2e2e2}.search-container .label-tag{margin-left:6px;font-size:11px;padding:2px 6px}.search-field-wrapper{padding-bottom:10px}.search-field-wrapper input{width:100%;padding:18px 8px;box-sizing:border-box}.search-field-wrapper button{margin:0 4px 0 0}.search-field-wrapper>span{display:block;overflow:hidden}.search-results-container{height:450px;overflow:auto;display:block;line-height:28px}.search-results-container .search-result-item:hover,.search-results-container .search-result-item.selected{background-color:#dfdfdf}.search-results-container .selected .search-result-tag{opacity:.70;color:white}.search-results-container .fa-star,.search-results-container .fa-star-o{padding-left:13px}.search-results-container .fa-star{color:#ff7518}.search-results-container .search-result-link{color:#555}.search-results-container .search-result-link .fa{padding-right:10px}.search-results-container .search-result-item{display:block;padding:3px 10px;white-space:nowrap;background-color:#ececec;margin-bottom:4px}.search-results-container .search-result-tags{float:right}.search-results-container .search-result-actions{float:right;padding-left:20px}.search-switches{position:absolute;top:19px;right:21px}.search-button-row{padding-top:20px}.search-button-row button,.search-button-row a{margin-right:10px}.panel{display:inline-block;float:left;vertical-align:top;position:relative}.panel-margin{margin:5px;display:block}.panel-container{background-color:#fff;position:relative;border:solid 1px #ddd}.panel-container:hover .panel-actions{display:block}.panel-container.panel-transparent{background-color:transparent;border:0}.panel-content{padding:0 10px 5px 10px}.panel-title-container{min-height:5px;padding-top:4px;cursor:context-menu}.panel-title{border:0;font-weight:bold;position:relative;cursor:context-menu;width:100%;display:block}.panel-title.has-panel-links .panel-title-text:after{content:"\f08e";font-family:'FontAwesome';font-size:80%;padding-left:10px;position:relative;top:-1px}.panel-loading{position:absolute;top:-3px;right:0;z-index:800}.panel-header{text-align:center}.panel-error{color:#fff;position:absolute;left:0;padding:0 17px 6px 5px;top:0;z-index:10}.panel-error i{position:relative;top:-2px}.panel-error-arrow{width:0;height:0;position:absolute;border-left:31px solid transparent;border-right:30px solid transparent;border-bottom:27px solid #fff;left:0;bottom:0}.panel-fullscreen{z-index:100;display:block;position:fixed;left:0;right:0;top:60px;padding:0;overflow-y:auto;height:100%}.panel-fullscreen .dropdown-menu{margin-bottom:70px}.panel-fullscreen .panel-container{margin:15px}.panel-fullscreen .panel-menu{top:0}.panel-fullscreen .panel-title-container{padding:8px}.panel-full-edit{margin-top:30px;padding-bottom:130px}.panel-menu{z-index:500;position:absolute;background:#e2e2e2;border:1px solid black;top:-62px}.panel-menu .panel-menu-row{white-space:nowrap;border-bottom:1px solid black}.panel-menu .panel-menu-row:last-child{border-bottom:0}.panel-menu .panel-menu-link,.panel-menu .panel-menu-icon{padding:5px 10px}.panel-menu .panel-menu-link{display:inline-block;border-right:1px solid black}.panel-menu .panel-menu-link:last-child{border:0}.panel-menu .dropdown-menu{text-align:left}.panel-highlight{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.on-drag-hover .panel-container{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.panel-drop-zone{display:none}.panel-drop-zone .panel-container{border:1px solid #333}.panel-ghost{width:100%}.panel-ghost .panel-container{border:0;background:transparent}.panel-ghost .panel-ghost-list{margin:10px 0 10px 20px}.panel-ghost button{text-align:left;min-width:135px}.panel-ghost button .fa{position:relative;left:-5px}.panel-time-info{font-weight:bold;float:right;margin-right:15px;color:#2ab2e4;font-size:85%;position:absolute;top:0;right:0}input[type=text].input-fluid{width:100%;box-sizing:border-box;padding:10px;font-size:16px;-moz-box-sizing:border-box;height:100%}input[type="checkbox"].cr1{display:none}label.cr1{display:inline-block;height:19px;clear:none;text-indent:2px;margin:0 0 1px 0;padding:0 0 0 20px;vertical-align:middle;background:url('../img/checkbox_white.png') left top no-repeat;cursor:pointer}input[type="checkbox"]:checked+label{background:url('../img/checkbox_white.png') 0 -18px no-repeat}.gf-form{padding-bottom:10px}.gf-form .checkbox-label{padding-left:7px;display:inline}.gf-fluid-input{border:0;display:block;overflow:hidden;padding-right:10px}.gf-fluid-input input[type=text]{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.gf-fluid-input textarea{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.singlestat-panel{position:relative;display:table;width:100%}.singlestat-panel-value-container{padding:20px;display:table-cell;vertical-align:middle;text-align:center;position:relative;z-index:1;font-size:3em;font-weight:bold}.singlestat-panel-prefix{padding-right:20px}.singlestat-panel-table{width:100%}.singlestat-panel-table td{padding:5px 10px;white-space:nowrap;text-align:right;border-bottom:1px solid #eee}.singlestat-panel-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#2ab2e4}.singlestat-panel-table td:first-child{text-align:left}.singlestat-panel-table tr:nth-child(odd) td{background-color:#e4e4e4}.singlestat-panel-table tr:last-child td{border:0}.tight-form{border-top:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #ddd;background:#efefef;width:100%}.tight-form:last-child,.tight-form.last{border-bottom:1px solid #ddd}.tight-form.borderless{background:transparent;border:0}.tight-form .checkbox-label{display:inline;padding-right:4px;margin-bottom:0}.spaced-form .tight-form{margin:7px 0}.borderless .tight-form-item,.borderless .tight-form-input{border:0}.tight-form-container .tight-form:last-child{border-bottom:0}.tight-form-container:last-child{border-bottom:1px solid #ddd}.tight-form-btn{padding:8px 12px}.tight-form-list{list-style:none;margin:0}.tight-form-list>li{float:left}.grafana-metric-options{margin-top:35px}.tight-form-item{padding:8px 7px;font-weight:normal;border-right:1px solid #ddd;color:#555;display:inline-block}.has-open-function .tight-form-item{padding-top:25px}.tight-form-disabled .tight-form-item{color:#959595}.tight-form-item:hover,.tight-form-item:focus{text-decoration:none}.tight-form-itema:hover{background:#e2e2e2}.tight-form-item.template-param-name{border-right:0;padding-right:0;padding-left:18px}.tight-form-item.annotation-segment{padding:8px 10px}.tight-form-item.last{border-right:0}.tight-form-item .fa-caret-down{font-size:75%;position:relative;top:1px}.tight-form-item-icon i{width:15px;text-align:center;display:inline-block}.tight-form-func{background:#e2e2e2}.tight-form-func>a{color:#555}.tight-form-func>a:hover{color:#555}.tight-form-func.show-function-controls{padding-top:5px;min-width:100px;text-align:center}input[type=text].tight-form-func-param{background:transparent;border:0;margin:0;padding:0}input[type=text].tight-form-clear-input{padding:8px 7px;border:0;margin:0;background:transparent;float:left;color:#555;border-radius:0;border-right:1px solid #ddd}[type=text].tight-form-input,[type=email].tight-form-input,[type=number].tight-form-input,[type=password].tight-form-input{border:0;border-right:1px solid #ddd;margin:0;border-radius:0;padding:8px 6px;height:100%;box-sizing:border-box}[type=text].tight-form-input.last,[type=email].tight-form-input.last,[type=number].tight-form-input.last,[type=password].tight-form-input.last{border-right:0}input[type=checkbox].tight-form-checkbox{margin:0}select.tight-form-input{border:0;border-right:1px solid #ddd;margin:0;border-radius:0;height:36px;padding:8px 3px}select.tight-form-input.last{border-right:0}.tight-form-func-controls{display:none;text-align:center}.tight-form-func-controls .fa-arrow-left{float:left;position:relative;top:2px}.tight-form-func-controls .fa-arrow-right{float:right;position:relative;top:2px}.tight-form-func-controls .fa-remove{margin-left:10px}.tight-form-radio input[type=radio]{margin:0}.tight-form-radio label{display:inline}.sidemenu-canvas{position:relative}.sidemenu-wrapper{position:absolute;display:none;top:0;bottom:0;left:0;width:200px;background:#eaeaea;min-height:100%;z-index:101}.sidemenu-wrapper a:focus{text-decoration:none}.sidemenu-open .sidemenu-wrapper{display:block}.sidemenu-open .search-container{left:200px}.sidemenu-open .main-view{padding-left:200px}.sidemenu-open .panel-fullscreen{left:200px}.sidemenu{font-size:16px;font-weight:400;list-style:none;margin:0;padding:0}.sidemenu>li{margin-bottom:9px}.sidemenu .fa-caret-down{position:relative;top:2px;font-size:90%}.sidemenu.sidemenu-small{font-size:14px}.sidemenu.sidemenu-small .icon-circle{border-radius:50%;background:#fff;box-shadow:0 0 14px 2px rgba(0,0,0,0.05);border:1px solid rgba(0,0,0,0.05);width:28px;height:28px}.sidemenu.sidemenu-small .icon-circle i{top:1px;left:4px;font-size:110%}.sidemenu.sidemenu-small .sidemenu-item{line-height:28px;padding-left:25px}.sidemenu-item-text{width:110px;display:inline-block;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.sidemenu-top-btn{display:block;padding:8px 0 4px 22px;background-color:#f8f8f8;border-right:3px solid #eaeaea}.sidemenu-top-btn img{border-radius:50%;background:#fff;border:1px solid #eaeaea;width:30px;padding:4px}.sidemenu-top-btn i{padding-right:5px;padding-top:5px;font-size:170%;color:#555}.icon-circle{width:40px;height:40px;display:inline-block}.icon-circle i{color:#555;opacity:.7;position:relative;left:7px;top:5px;font-size:150%}.sidemenu-item{color:#555;line-height:40px;padding:0 10px 0 20px;display:block;white-space:nowrap}.sidemenu-item .sidemenu-item-text{padding-left:11px;transition:color 100ms ease-out}.sidemenu-item .sidemenu-item-text.no-icon{padding-left:59px}.sidemenu-item img{border-radius:50%;width:28px;height:28px;box-shadow:0 0 14px 2px rgba(255,255,255,0.05)}.sidemenu-system-section{background-color:#75caeb;color:#fff;padding:3px 0;margin-left:10px;margin-right:10px;border-radius:2px}.sidemenu-system-section .sidemenu-system-section-inner{border:2px solid black;border-left:none;border-right:0;padding:4px;overflow:hidden}.sidemenu-system-section .fa{float:left;font-size:120%;line-height:41px;padding:0 15px}.sidemenu-section-tagline{font-style:italic;font-size:75%;line-height:10px}.sidemenu-section-text-wrapper{padding-top:4px}.navbar-inner{padding-left:0}.navbar .nav>li>a{padding:17px 15px 13px}.navbar .nav>li>a .fa{font-size:115%}.top-nav{float:left;font-size:16px}.fa.top-nav-breadcrumb-icon{margin:18px 0 6px 5px;float:left;font-size:120%;color:#555}.top-nav-menu-btn{border:1px solid #eaeaea;border-radius:50%;background:#fff;display:block;position:relative;float:left;width:30px;height:30px;padding:4px;margin:6px 6px 3px 9px}.top-nav-menu-btn .fa{color:#555;width:30px;height:30px;left:9px;top:7px;font-size:150%;opacity:0;position:absolute;transition:opacity .2s ease-in-out}.top-nav-menu-btn img{width:30px;position:absolute;opacity:1;transition:opacity .2s ease-in-out}.top-nav-menu-btn:hover .fa{opacity:.7}.top-nav-menu-btn:hover img{opacity:0}.top-nav-dashboards-btn{display:block;float:left;margin:9px 18px 5px 14px;border-radius:3px;font-size:1.4em;color:#a2a2a2;border:solid 1px #f9f9f9}.top-nav-dashboards-btn a{display:inline-block;background:#e2e2e2;padding:5px 15px 5px 10px;border-radius:3px;color:#a2a2a2}.top-nav-dashboards-btn a:hover{background:#d6d6d6}.top-nav-dashboards-btn a:hover .fa{color:#555}.top-nav-dashboards-btn .fa-th-large{position:relative;top:2px}.top-nav-dashboards-btn .fa-caret-down{font-size:60%;position:relative;top:4px}.dashboard-title{padding:0 6px 5px 5px;color:#222;font-size:17px}.top-nav-icon{margin:5px 0 0 11px;line-height:41px;float:left}.top-nav-section{display:block;float:left;padding:19px 9px 8px 0;font-weight:bold}.top-nav-section i{padding-left:8px}.top-nav-title{display:block;float:left;font-size:17px;padding:18px 10px 10px 13px;color:#555}.top-nav-snapshot-title{display:block;float:left;font-size:1.4em;margin:9px 18px 5px 14px;color:#555}.top-nav-snapshot-title .gf-icon{position:relative;top:3px;font-size:27px}.top-nav-snapshot-title a{display:inline-block;padding:0 15px 5px 10px}.gf-box{margin:15px;background-color:#fff;position:relative;border:1px solid #e2e2e2}.gf-box-no-margin{margin:0}.gf-box-header-close-btn{float:right;padding:0;margin:0;background-color:transparent;border:0;padding:8px;font-size:120%;color:#555}.gf-box-header-close-btn:hover{color:#fff}.gf-box-body{padding:20px;min-height:150px}.gf-box-footer{overflow:hidden}.gf-box-header{border-bottom:1px solid #e2e2e2;overflow:hidden;background-color:#efefef}.gf-box-header .tabs{float:left}.gf-box-header .nav{margin:0}.gf-box-title{padding-right:20px;padding-left:10px;float:left;color:#555;font-size:18px;font-weight:normal;line-height:38px;margin:0}.gf-box-title .fa{padding:0 8px 0 5px;color:#555}.page-container{margin:15px;background:#fff;position:relative;border:1px solid #333;padding:20px 20px 60px 49px}.page-container h2{color:#555;font-weight:normal;font-size:22px}.page{max-width:653px}.admin-page{max-width:800px;margin-left:10px}.admin-page .gf-box{margin-top:0}.admin-page .gf-box-body{min-height:0}.admin-page h2{margin-left:15px;margin-bottom:0;font-size:17.5px;color:#555}.admin-page h2 i{padding-right:6px}.dashlist-link{display:block;margin:5px;padding:7px;background-color:#efefef;border:1px solid #ddd}.dashlist-link .fa{float:right;padding-top:3px}.dashlist-link .fa-star{color:#ff7518}.dashlist-link:hover{background-color:#e2e2e2}.admin-settings-section{color:#2ab2e4;font-weight:bold}td.admin-settings-key{padding-left:20px}input[type=text].ng-dirty.ng-invalid{box-shadow:inset 0 0 7px #ff4136}@font-face{font-family:'raintank';src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SAywAAAC8AAAAYGNtYXAaVcxZAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zm7/N1QAAAFwAAAFmGhlYWQFNK2SAAAHCAAAADZoaGVhB14DyAAAB0AAAAAkaG10eAwxAAQAAAdkAAAAHGxvY2ECNgP2AAAHgAAAABBtYXhwABcAvAAAB5AAAAAgbmFtZflvA+cAAAewAAABTnBvc3QAAwAAAAAJAAAAACAAAwQAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADmAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIOYC//3//wAAAAAAIOYA//3//wAB/+MaBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAADwAA/7YDnAO3AAMAHQAhACUAKgAuADEAQgBTAGQAdQCGAJcAqAC5AAA3FyUnJTUTJzUjJwcjJwcjFQcTBxcVIQ0BNzM1NycTAxEXJTkCByERIREHFSc3NzEzAxQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwE2FhUHNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATYWFXsKAS9VAbOKkFsDmDvbEZhXTjY/Alj+wQFGGT4mIU5TU/3CmgJU/awxICDLAWUbE40TGxsTjRMbLo0LERELjQwQEAzQHBONExsbE40UG9cQC40MEBAMjQsQ7BsTjRMbGxONExvXEAuNDBAQDIwMEAEbjRMbGxONFBsbFKgQC40MEBAMjQsQDkMvFvQEAfYoVRcXPDxGDf4JwhFKBFpdHAbPAdn+zwFIF54x/ZsCZUbPygV3/s4TGxsTjBQbHBOMqRAMjQsQEAuMDBEdjBQbHBOMFBsbFIwMEBAMjAwQAREM+RQbHBONExscEo2MjAwQEAyNCxARCy4bE4wUGxwTjRIbuo0LEBALjQwQAREMAAoAAf+5A2IDtQAQACEAMgBDAFQAZQB2AIcAkACVAAATHgE/AT4BLwEuAQ8BDgEfAT8BNhYfARYGDwEGJi8BJjY3NxceAT8BPgEvAS4BDwEOARc3FxYGDwEGJi8BJjY/ATYWFwMuAQ8BDgEfAR4BPwE+AS8BBycmNj8BNhYfARYGDwEGJicFNz4BLwEuAQ8BDgEfAR4BNzcXFgYPAQYmLwEmNj8BNhYXARMfASUvAQMFEwMlEwWdAyAVkhUYAxcDIRSTFBgDFxWTDBQBFwIODZIMFAIXAg8M3hcDIRSSFBgDFwMgFZIUGAPgFwIPDJIMFAIWAg4MkgwUAs4DIRSTFBgDFwMgFZIVGAMXyhcCDwyTDBQBFwIODZIMFAIBL5IUGAMXAyAVkhQYAxcDIRSRFwIPDJIMFAIXAg8MkgwUAv1pahUNAtUNFWv9LJ9jAmxj/ZQCFxQYAxYEIBWSFRgDFwMhFJO3FwIPDJIMFAIXAg8MkwwUAQWTFBgDFgMhFJMUGAMWAyEUIpINEwIXAg8MkwwUAhYCDg3+1xQYAxcDIRSTFBgDFwMhFJO2kwwUAhYCDgyTDBQCFgIPCwMXAyEUkxQYAxcDIBWSFBkD35MMFAIWAg4NkgwUAhYCDgwBU/1PilFwUokCsXD9VwJ9YP2DYAAKAAP/twMyA7QAEAAhADIAQwBUAGUAdgCHAIwAkQAAExQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwEyFhUBNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATIWFQERIREhExEhESF7IBelFx8fF6UXIDelDhITDaUOExQN9CAXpBcgIBekFyD8Ew2lDhMUDaQOE/7rHxelFyAgF6UXH/wUDaUOEhMNpQ0UAUykFyAgF6QXICAXxRMNpQ4TFA2kDhP9YQMv/NE7Arr9RgJOFyAgF6QXICAXpMUTDqQOExMOpA4TIaQXICAXpBcgIBekDhMTDqQOExMO/twXICAXpBcgIBekpKQOExMOpA4TEw43IBekFyAgF6QXINukDhMTDqQOExMOAeb8AwP9/PkCzP00AAEAAAABAADkYnVvXw889QALBAAAAAAA0Ty0lAAAAADRPLSUAAD/tgOcA7cAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAA5wAAQAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAACAAAAA50AAANiAAEDMgADAAAAAAAKABQAHgEWAg4CzAABAAAABwC6AA8AAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEAEAAAAAEAAAAAAAIADgBOAAEAAAAAAAMAEAAmAAEAAAAAAAQAEABcAAEAAAAAAAUAFgAQAAEAAAAAAAYACAA2AAEAAAAAAAoANABsAAMAAQQJAAEAEAAAAAMAAQQJAAIADgBOAAMAAQQJAAMAEAAmAAMAAQQJAAQAEABcAAMAAQQJAAUAFgAQAAMAAQQJAAYAEAA+AAMAAQQJAAoANABsAHIAYQBpAG4AdABhAG4AawBWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBhAGkAbgB0AGEAbgBrcmFpbnRhbmsAcgBhAGkAbgB0AGEAbgBrAFIAZQBnAHUAbABhAHIAcgBhAGkAbgB0AGEAbgBrAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAlsAAsAAAAACSAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIDLGNtYXAAAAFoAAAATAAAAEwaVcxZZ2FzcAAAAbQAAAAIAAAACAAAABBnbHlmAAABvAAABZgAAAWYbv83VGhlYWQAAAdUAAAANgAAADYFNK2SaGhlYQAAB4wAAAAkAAAAJAdeA8hobXR4AAAHsAAAABwAAAAcDDEABGxvY2EAAAfMAAAAEAAAABACNgP2bWF4cAAAB9wAAAAgAAAAIAAXALxuYW1lAAAH/AAAAU4AAAFO+W8D53Bvc3QAAAlMAAAAIAAAACAAAwAAAAMEAAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA5gIDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDmAv/9//8AAAAAACDmAP/9//8AAf/jGgQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAA8AAP+2A5wDtwADAB0AIQAlACoALgAxAEIAUwBkAHUAhgCXAKgAuQAANxclJyU1Eyc1IycHIycHIxUHEwcXFSENATczNTcnEwMRFyU5AgchESERBxUnNzcxMwMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBNhYVBzQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwE2FhV7CgEvVQGzipBbA5g72xGYV042PwJY/sEBRhk+JiFOU1P9wpoCVP2sMSAgywFlGxONExsbE40TGy6NCxERC40MEBAM0BwTjRMbGxONFBvXEAuNDBAQDI0LEOwbE40TGxsTjRMb1xALjQwQEAyMDBABG40TGxsTjRQbGxSoEAuNDBAQDI0LEA5DLxb0BAH2KFUXFzw8Rg3+CcIRSgRaXRwGzwHZ/s8BSBeeMf2bAmVGz8oFd/7OExsbE4wUGxwTjKkQDI0LEBALjAwRHYwUGxwTjBQbGxSMDBAQDIwMEAERDPkUGxwTjRMbHBKNjIwMEBAMjQsQEQsuGxOMFBscE40SG7qNCxAQC40MEAERDAAKAAH/uQNiA7UAEAAhADIAQwBUAGUAdgCHAJAAlQAAEx4BPwE+AS8BLgEPAQ4BHwE/ATYWHwEWBg8BBiYvASY2NzcXHgE/AT4BLwEuAQ8BDgEXNxcWBg8BBiYvASY2PwE2FhcDLgEPAQ4BHwEeAT8BPgEvAQcnJjY/ATYWHwEWBg8BBiYnBTc+AS8BLgEPAQ4BHwEeATc3FxYGDwEGJi8BJjY/ATYWFwETHwElLwEDBRMDJRMFnQMgFZIVGAMXAyEUkxQYAxcVkwwUARcCDg2SDBQCFwIPDN4XAyEUkhQYAxcDIBWSFBgD4BcCDwySDBQCFgIODJIMFALOAyEUkxQYAxcDIBWSFRgDF8oXAg8MkwwUARcCDg2SDBQCAS+SFBgDFwMgFZIUGAMXAyEUkRcCDwySDBQCFwIPDJIMFAL9aWoVDQLVDRVr/SyfYwJsY/2UAhcUGAMWBCAVkhUYAxcDIRSTtxcCDwySDBQCFwIPDJMMFAEFkxQYAxYDIRSTFBgDFgMhFCKSDRMCFwIPDJMMFAIWAg4N/tcUGAMXAyEUkxQYAxcDIRSTtpMMFAIWAg4MkwwUAhYCDwsDFwMhFJMUGAMXAyAVkhQZA9+TDBQCFgIODZIMFAIWAg4MAVP9T4pRcFKJArFw/VcCfWD9g2AACgAD/7cDMgO0ABAAIQAyAEMAVABlAHYAhwCMAJEAABMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBMhYVATQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwEyFhUBESERIRMRIREheyAXpRcfHxelFyA3pQ4SEw2lDhMUDfQgF6QXICAXpBcg/BMNpQ4TFA2kDhP+6x8XpRcgIBelFx/8FA2lDhITDaUNFAFMpBcgIBekFyAgF8UTDaUOExQNpA4T/WEDL/zROwK6/UYCThcgIBekFyAgF6TFEw6kDhMTDqQOEyGkFyAgF6QXICAXpA4TEw6kDhMTDv7cFyAgF6QXICAXpKSkDhMTDqQOExMONyAXpBcgIBekFyDbpA4TEw6kDhMTDgHm/AMD/fz5Asz9NAABAAAAAQAA5GJ1b18PPPUACwQAAAAAANE8tJQAAAAA0Ty0lAAA/7YDnAO3AAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOcAAEAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAgAAAAOdAAADYgABAzIAAwAAAAAACgAUAB4BFgIOAswAAQAAAAcAugAPAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABAAAAABAAAAAAACAA4ATgABAAAAAAADABAAJgABAAAAAAAEABAAXAABAAAAAAAFABYAEAABAAAAAAAGAAgANgABAAAAAAAKADQAbAADAAEECQABABAAAAADAAEECQACAA4ATgADAAEECQADABAAJgADAAEECQAEABAAXAADAAEECQAFABYAEAADAAEECQAGABAAPgADAAEECQAKADQAbAByAGEAaQBuAHQAYQBuAGsAVgBlAHIAcwBpAG8AbgAgADEALgAwAHIAYQBpAG4AdABhAG4Aa3JhaW50YW5rAHIAYQBpAG4AdABhAG4AawBSAGUAZwB1AGwAYQByAHIAYQBpAG4AdABhAG4AawBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:normal;font-style:normal}.gf-icon{display:inline-block;font:normal normal normal 14px/1 'raintank';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gf-icon-snap-multi:before{content:"\e600"}.gf-icon-snap-single-tilt:before{content:"\e601"}.gf-icon-snap-single:before{content:"\e602"}.row-control-inner{padding:0;margin:0;position:relative}.hide-controls{padding:0}.hide-controls .row-tab{display:none}.hide-controls .add-row-panel-hint{display:none}.playlist-active .grafana-menu-zoom-out,.playlist-active .add-row-panel-hint,.playlist-active .grafana-menu-refresh,.playlist-active .top-nav-dashboards-btn,.playlist-active .top-nav-dash-actions{display:none}.playlist-active .grafana-menu-stop-playlist{display:list-item}.row-button{width:24px}.modal{max-width:800px;left:0;right:0;margin-left:auto;margin-right:auto;top:20%}.dashboard-fullscreen .main-view-container{overflow:hidden;height:0;padding:0}.dashboard-fullscreen .main-view-container .row-control-inner{display:none}.histogram-chart{position:relative}.scrollable{max-height:300px;overflow:auto}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar:hover{height:8px}::-webkit-scrollbar-button:start:decrement,::-webkit-scrollbar-button:end:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement{display:none}::-webkit-scrollbar-button:horizontal:increment{display:none}::-webkit-scrollbar-button:vertical:decrement{display:none}::-webkit-scrollbar-button:vertical:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement:active{background-image:none}::-webkit-scrollbar-button:horizontal:increment:active{background-image:none}::-webkit-scrollbar-button:vertical:decrement:active{background-image:none}::-webkit-scrollbar-button:vertical:increment:active{background-image:none}::-webkit-scrollbar-track-piece{background-color:transparent}::-webkit-scrollbar-thumb:vertical{height:50px;background:-webkit-gradient(linear,left top,right top,color-stop(0%,#f9f9f9),color-stop(100%,#f9f9f9));border:1px solid #999;border-top:1px solid #999;border-left:1px solid #999}::-webkit-scrollbar-thumb:horizontal{width:50px;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#f9f9f9),color-stop(100%,#f9f9f9));border:1px solid #999;border-top:1px solid #999;border-left:1px solid #999}.sp-replacer{background:inherit;border:0;color:inherit;padding:0}.sp-replacer:hover,.sp-replacer.sp-active{border-color:inherit;color:inherit}.sp-container{border-radius:0;background-color:#f9f9f9;border:0;padding:0}.sp-palette-container,.sp-picker-container{border:0}.sp-dd{display:none}.sp-preview{position:relative;width:15px;height:15px;border:0;margin-right:5px;float:left;z-index:0}.datapoints-warning{pointer:none;position:absolute;top:50%;left:50%;z-index:10;margin-top:-50px;margin-left:-100px;width:200px;text-align:center;cursor:auto;padding:10px}.metrics-editor-help:hover .hide{display:block}.grafana-tooltip{position:absolute;top:-1000;left:0;color:#c8c8c8;padding:10px;font-size:11pt;font-weight:200;background-color:#3a3939;border-radius:5px;z-index:9999;max-width:800px;max-height:600px;overflow:hidden;line-height:14px}.grafana-tooltip a{color:#e3e3e3}.grafana-tooltip hr{padding:2px;color:#c8c8c8;margin:0;border-bottom:0 solid #c8c8c8}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip-inner{max-width:400px}.grafana-version-info{position:absolute;bottom:2px;left:3px;font-size:80%;color:#161616}.grafana-version-info a{color:#161616}.template-variable{color:#2ab2e4}.grafana-info-box:before{content:"\f05a";font-family:'FontAwesome';position:absolute;top:-8px;left:-8px;font-size:20px;color:#2ab2e4}.grafana-info-box{position:relative;padding:5px 15px;background-color:#efefef;border:1px solid #ddd}.grafana-info-box h5{margin-top:5px}.grafana-tip{padding-left:5px}.shortcut-table td{padding:3px}.shortcut-table th:last-child{text-align:left}.shortcut-table td:first-child{text-align:right}.confirm-modal{border:1px solid #e2e2e2;max-width:500px;background-color:#fff;text-align:center}.confirm-modal .modal-close{float:right;font-size:140%;padding:10px}.confirm-modal .confirm-modal-icon{padding-top:41px;font-size:280%;color:#28b62c;padding-bottom:20px}.confirm-modal .confirm-modal-title{font-size:18px;color:#555;margin-bottom:15px}.confirm-modal .confirm-modal-text{font-size:16px}.confirm-modal .confirm-modal-buttons{margin-top:35px;margin-bottom:35px}.confirm-modal .confirm-modal-buttons button{margin-right:5px}.share-snapshot{text-align:center}.share-snapshot .gf-icon-snap-multi{font-size:70px}.share-snapshot .fa-spinner{font-size:70px}.share-snapshot .share-snapshot-info-text{margin:10px 105px}.share-snapshot .share-snapshot-info-text strong{color:#222;font-weight:bold}.share-snapshot .share-snapshot-header{margin:20px 0 22px 0}.share-snapshot .tight-form{text-align:left}.share-snapshot .share-snapshot-link{max-width:716px;white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}
\ No newline at end of file
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.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}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{max-width:100%;width:auto\9;height:auto;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"]{-webkit-appearance:button;cursor:pointer}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{*{text-shadow:none!important;color:#000!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}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#555;background-color:#eaeaea}a{color:#555;text-decoration:none}a:hover,a:focus{color:#222;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;content:"";line-height:0}.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;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%}.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;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0}.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,a.muted:focus{color:#808080}.text-warning{color:#ff934b}a.text-warning:hover,a.text-warning:focus{color:#ff7518}.text-error{color:#ff7169}a.text-error:hover,a.text-error:focus{color:#ff4136}.text-info{color:#af78ca}a.text-info:hover,a.text-info:focus{color:#9954bb}.text-success{color:#3dd441}a.text-success:hover,a.text-success:focus{color:#28b62c}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:#222;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 #f9f9f9}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;*display:inline;*zoom:1;padding-left:5px;padding-right: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;content:"";line-height:0}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #f9f9f9;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 #f9f9f9}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}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 #f9f9f9;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:Menlo,Monaco,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;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap}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:3px;-moz-border-radius:3px;border-radius:3px}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:#020202;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;vertical-align:middle}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 #999;-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,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;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;border:1px solid #999;background-color:#fff}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;background-color:#fcfcfc;border-color:#999;-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);cursor:not-allowed}.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;content:"";line-height:0}.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:#f9f9f9}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:#ff934b}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#ff934b}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#ff934b;-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:#ff7518;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd0b1;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd0b1;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd0b1}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#ff934b;background-color:#ff7518;border-color:#ff934b}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#ff7169}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#ff7169}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#ff7169;-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:#ff4136;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd2cf;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd2cf;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd2cf}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#ff7169;background-color:#ff4136;border-color:#ff7169}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#3dd441}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#3dd441}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#3dd441;-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:#28b62c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #90e793;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #90e793;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #90e793}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#3dd441;background-color:#28b62c;border-color:#3dd441}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#af78ca}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#af78ca}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#af78ca;-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:#9954bb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dac1e7;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dac1e7;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dac1e7}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#af78ca;background-color:#9954bb;border-color:#af78ca}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;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#7c7c7c}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;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,.input-append .popover,.input-prepend .popover{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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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:#f9f9f9;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:#90e793;border-color:#28b62c}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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;*zoom:1;margin-bottom:0;vertical-align:middle}.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;content:"";line-height:0}.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:#eaeaea}.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:3px;-moz-border-radius:3px;border-radius:3px}.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,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius: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:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.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:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.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:#e8f8fd}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:#28b62c}.table tbody tr.error>td{background-color:#ff4136}.table tbody tr.warning>td{background-color:#ff7518}.table tbody tr.info>td{background-color:#9954bb}.table-hover tbody tr.success:hover>td{background-color:#23a127}.table-hover tbody tr.error:hover>td{background-color:#ff291c}.table-hover tbody tr.warning:hover>td{background-color:#fe6600}.table-hover tbody tr.info:hover>td{background-color:#8d46b0}.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,.dropdown-submenu:focus>a{text-decoration:none;color:#fff;background-color:#24ade0;background-image:-moz-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2ab2e4),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-o-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:linear-gradient(to bottom,#2ab2e4,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2ab2e4',endColorstr='#ff1ca6d9',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#24ade0;background-image:-moz-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2ab2e4),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-o-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:linear-gradient(to bottom,#2ab2e4,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2ab2e4',endColorstr='#ff1ca6d9',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #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;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#ccc;margin-top:5px;margin-right:-10px}.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-left:20px;padding-right:20px}.typeahead{z-index:1051;margin-top:2px;-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,.close:focus{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;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#e9e9e9;background-image:-moz-linear-gradient(top,#f9f9f9,#d2d2d2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f9f9f9),to(#d2d2d2));background-image:-webkit-linear-gradient(top,#f9f9f9,#d2d2d2);background-image:-o-linear-gradient(top,#f9f9f9,#d2d2d2);background-image:linear-gradient(to bottom,#f9f9f9,#d2d2d2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9',endColorstr='#ffd2d2d2',GradientType=0);border-color:#d2d2d2 #d2d2d2 #acacac;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#d2d2d2;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#d2d2d2;*background-color:#c6c6c6}.btn:active,.btn.active{background-color:#b9b9b9 \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{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,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(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:22px 30px;font-size:17.5px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.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:2px 6px;font-size:10.5px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.btn-block{display:block;width:100%;padding-left:0;padding-right: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-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#32b2e1;background-image:-moz-linear-gradient(top,#41bae7,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#41bae7),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#41bae7,#1ca6d9);background-image:-o-linear-gradient(top,#41bae7,#1ca6d9);background-image:linear-gradient(to bottom,#41bae7,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff41bae7',endColorstr='#ff1ca6d9',GradientType=0);border-color:#1ca6d9 #1ca6d9 #137295;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#1ca6d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#1ca6d9;*background-color:#1995c2}.btn-primary:active,.btn-primary.active{background-color:#1683ac \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#fe781e;background-image:-moz-linear-gradient(top,#ff8432,#fe6600);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff8432),to(#fe6600));background-image:-webkit-linear-gradient(top,#ff8432,#fe6600);background-image:-o-linear-gradient(top,#ff8432,#fe6600);background-image:linear-gradient(to bottom,#ff8432,#fe6600);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff8432',endColorstr='#fffe6600',GradientType=0);border-color:#fe6600 #fe6600 #b14700;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#fe6600;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#fe6600;*background-color:#e45c00}.btn-warning:active,.btn-warning.active{background-color:#cb5200 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ff463b;background-image:-moz-linear-gradient(top,#ff5950,#ff291c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff5950),to(#ff291c));background-image:-webkit-linear-gradient(top,#ff5950,#ff291c);background-image:-o-linear-gradient(top,#ff5950,#ff291c);background-image:linear-gradient(to bottom,#ff5950,#ff291c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff5950',endColorstr='#ffff291c',GradientType=0);border-color:#ff291c #ff291c #cf0b00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#ff291c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#ff291c;*background-color:#ff1103}.btn-danger:active,.btn-danger.active{background-color:#e80d00 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#29ba2d;background-image:-moz-linear-gradient(top,#2dcb31,#23a127);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2dcb31),to(#23a127));background-image:-webkit-linear-gradient(top,#2dcb31,#23a127);background-image:-o-linear-gradient(top,#2dcb31,#23a127);background-image:linear-gradient(to bottom,#2dcb31,#23a127);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2dcb31',endColorstr='#ff23a127',GradientType=0);border-color:#23a127 #23a127 #166218;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#23a127;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#23a127;*background-color:#1f8c22}.btn-success:active,.btn-success.active{background-color:#1a771d \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#9b59bb;background-image:-moz-linear-gradient(top,#a466c2,#8d46b0);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a466c2),to(#8d46b0));background-image:-webkit-linear-gradient(top,#a466c2,#8d46b0);background-image:-o-linear-gradient(top,#a466c2,#8d46b0);background-image:linear-gradient(to bottom,#a466c2,#8d46b0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa466c2',endColorstr='#ff8d46b0',GradientType=0);border-color:#8d46b0 #8d46b0 #613079;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#8d46b0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#8d46b0;*background-color:#7e3f9d}.btn-info:active,.btn-info.active{background-color:#6f378b \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#4b4b4b;background-image:-moz-linear-gradient(top,#555,#3c3c3c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#555),to(#3c3c3c));background-image:-webkit-linear-gradient(top,#555,#3c3c3c);background-image:-o-linear-gradient(top,#555,#3c3c3c);background-image:linear-gradient(to bottom,#555,#3c3c3c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff555555',endColorstr='#ff3c3c3c',GradientType=0);border-color:#3c3c3c #3c3c3c #161616;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#3c3c3c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#3c3c3c;*background-color:#2f2f2f}.btn-inverse:active,.btn-inverse.active{background-color:#222 \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{border-color:transparent;cursor:pointer;color:#555;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#222;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#ff7518;border:1px solid transparent;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.alert,.alert h4{color:#ff934b}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#28b62c;border-color:transparent;color:#3dd441}.alert-success h4{color:#3dd441}.alert-danger,.alert-error{background-color:#ff4136;border-color:transparent;color:#ff7169}.alert-danger h4,.alert-error h4{color:#ff7169}.alert-info{background-color:#9954bb;border-color:transparent;color:#af78ca}.alert-info h4{color:#af78ca}.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-left:0;margin-bottom:20px;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f9f9f9}.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-left:15px;padding-right:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-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,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#555}.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;content:"";line-height:0}.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,.nav-tabs>li>a:focus{border-color:#f9f9f9 #f9f9f9 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;background-color:#eaeaea;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.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,.nav-pills>.active>a:focus{color:#fff;background-color:#555}.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;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2}.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{border-top-color:#555;border-bottom-color:#555;margin-top:6px}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#222;border-bottom-color:#222}.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,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{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,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0}.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,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{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,.tabs-left>.nav-tabs>li>a:focus{border-color:#f9f9f9 #ddd #f9f9f9 #f9f9f9}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{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,.tabs-right>.nav-tabs>li>a:focus{border-color:#f9f9f9 #f9f9f9 #f9f9f9 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default}.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2}.navbar-inner{min-height:52px;padding-left:20px;padding-right:20px;background-color:#f8f8f8;background-image:-moz-linear-gradient(top,#f8f8f8,#f8f8f8);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f8f8f8),to(#f8f8f8));background-image:-webkit-linear-gradient(top,#f8f8f8,#f8f8f8);background-image:-o-linear-gradient(top,#f8f8f8,#f8f8f8);background-image:linear-gradient(to bottom,#f8f8f8,#f8f8f8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8f8f8',endColorstr='#fff8f8f8',GradientType=0);border:1px solid none;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-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);*zoom:1}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{float:left;display:block;padding:16px 20px 16px;margin-left:-20px;font-size:20px;font-weight:200;color:#666;text-shadow:0 1px 0 #f8f8f8}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:52px;color:#666}.navbar-link{color:#666}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:52px;margin:0 9px;border-left:1px solid #f8f8f8;border-right:1px solid #f8f8f8}.navbar .btn,.navbar .btn-group{margin-top:11px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:11px}.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:11px;margin-bottom:0}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;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-left:0;padding-right: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,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(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:16px 15px 16px;color:#666;text-decoration:none;text-shadow:0 1px 0 #f8f8f8}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333;text-decoration:none}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e7e7e7;-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-left:5px;margin-right:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ebebeb;background-image:-moz-linear-gradient(top,#ebebeb,#ebebeb);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ebebeb),to(#ebebeb));background-image:-webkit-linear-gradient(top,#ebebeb,#ebebeb);background-image:-o-linear-gradient(top,#ebebeb,#ebebeb);background-image:linear-gradient(to bottom,#ebebeb,#ebebeb);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#ffebebeb',GradientType=0);border-color:#ebebeb #ebebeb #c5c5c5;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#ebebeb;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#ebebeb;*background-color:#dedede}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#d2d2d2 \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{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:9px}.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:10px}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0;bottom:-7px;top:auto}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #fff;border-bottom:0;bottom:-6px;top:auto}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e7e7e7;color:#555}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#666;border-bottom-color:#666}.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{left:auto;right:0}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-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:#2ab2e4;background-image:-moz-linear-gradient(top,#2ab2e4,#2ab2e4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2ab2e4),to(#2ab2e4));background-image:-webkit-linear-gradient(top,#2ab2e4,#2ab2e4);background-image:-o-linear-gradient(top,#2ab2e4,#2ab2e4);background-image:linear-gradient(to bottom,#2ab2e4,#2ab2e4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2ab2e4',endColorstr='#ff2ab2e4',GradientType=0);border-color:transparent}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#fff}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:rgba(0,0,0,0.05);color:#fff}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#2ab2e4}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-left-color:#2ab2e4;border-right-color:#2ab2e4}.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{background-color:#2ab2e4;color:#fff}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.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:#9bdbf2;border-color:#2ab2e4;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#333}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#333}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#333}.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;-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);outline:0}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#1ca6d9;background-image:-moz-linear-gradient(top,#1ca6d9,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1ca6d9),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#1ca6d9,#1ca6d9);background-image:-o-linear-gradient(top,#1ca6d9,#1ca6d9);background-image:linear-gradient(to bottom,#1ca6d9,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1ca6d9',endColorstr='#ff1ca6d9',GradientType=0);border-color:#1ca6d9 #1ca6d9 #137295;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#1ca6d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#1ca6d9;*background-color:#1995c2}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#1683ac \9}.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:.7;filter:alpha(opacity=70)}.modal{position:fixed;z-index:1050;width:100%;background-color:#fff;-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;outline:0}.modal.fade{-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;top:-25%}.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;overflow-y:auto;padding:15px}.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-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;*zoom:1}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#333}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#fff;border-bottom:1px solid #f2f2f2;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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:16px}.popover .arrow:after{border-width:15px;content:""}.popover.top .arrow{left:50%;margin-left:-16px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-16px}.popover.top .arrow:after{bottom:1px;margin-left:-15px;border-bottom-width:0;border-top-color:#fff}.popover.right .arrow{top:50%;left:-16px;margin-top:-16px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right .arrow:after{left:1px;bottom:-15px;border-left-width:0;border-right-color:#fff}.popover.bottom .arrow{left:50%;margin-left:-16px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-16px}.popover.bottom .arrow:after{top:1px;margin-left:-15px;border-top-width:0;border-bottom-color:#fff}.popover.left .arrow{top:50%;right:-16px;margin-top:-16px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-15px}.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;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#ff7169}.label-important[href],.badge-important[href]{background-color:#ff4136}.label-warning,.badge-warning{background-color:#ff7518}.label-warning[href],.badge-warning[href]{background-color:#e45c00}.label-success,.badge-success{background-color:#3dd441}.label-success[href],.badge-success[href]{background-color:#28b62c}.label-info,.badge-info{background-color:#af78ca}.label-info[href],.badge-info[href]{background-color:#9954bb}.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}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}body{font-weight:300;background:#eaeaea}blockquote{padding:10px 15px;background-color:#f9f9f9;border-left-color:#555}blockquote.pull-right{padding:10px 15px;border-right-color:#555}blockquote small{color:#555}.muted{color:#555}.text-warning{color:#ff7518}a.text-warning:hover{color:#e45c00}.text-error{color:#ff4136}a.text-error:hover{color:#ff1103}.text-info{color:#9954bb}a.text-info:hover{color:#7e3f9d}.text-success{color:#28b62c}a.text-success:hover{color:#1f8c22}.navbar .navbar-inner{background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar .brand{padding:0 15px}.navbar .brand:hover{color:#333}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-bottom:1px solid #2ab2e4;background-color:transparent}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555}.navbar .nav li.dropdown.open>.dropdown-toggle:hover,.navbar .nav li.dropdown.active>.dropdown-toggle:hover,.navbar .nav li.dropdown.open.active>.dropdown-toggle:hover{color:#f9f9f9}.navbar .navbar-search .search-query{line-height:normal}.navbar-inverse .brand,.navbar-inverse .nav>li>a{text-shadow:none}.navbar-inverse .brand:hover,.navbar-inverse .nav>.active>a,.navbar-inverse .nav>.active>a:hover,.navbar-inverse .nav>.active>a:focus{background-color:rgba(0,0,0,0.05);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;color:#fff}.navbar-inverse .navbar-search .search-query{color:#222}div.subnav{margin:0 1px;background:#999 none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}div.subnav .nav{background-color:transparent}div.subnav .nav>li>a{border-color:transparent}div.subnav .nav>.active>a,div.subnav .nav>.active>a:hover{border-color:transparent;background-color:#000;color:#fff;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav-fixed{top:53px;margin:0}.nav .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#2ab2e4}.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs li>a:hover,.nav-tabs li.active>a,.nav-tabs li.active>a:hover{border-color:transparent;background-color:transparent;border-bottom:2px solid #2ab2e4;color:#2ab2e4}.nav-tabs li.disabled>a{color:#555}.nav-tabs .open .dropdown-toggle{background-color:#060606;border-color:transparent}.tabs-below>.nav-tabs>li>a,.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0}.nav-pills>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;color:#000}.nav-pills>li>a:hover{background-color:#000;color:#fff}.nav-pills>.disabled>a,.nav-pills>.disabled>a:hover{background-color:#f9f9f9;color:#333}.nav-list>li>a{color:#222}.nav-list>li>a:hover{background-color:#2ab2e4;color:#fff;text-shadow:none}.nav-list .nav-header{color:#222}.nav-list .divider{background-color:#555;border-bottom:0}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>li>a,.pagination ul>li>span{margin-right:6px;color:#222}.pagination ul>li>a:hover,.pagination ul>li>span:hover{background-color:#222;color:#fff}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{margin-right:0}.pagination ul>.active>a,.pagination ul>.active>span{color:#fff}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{background-color:#f9f9f9;color:#333}.pager li>a,.pager li>span{background-color:#999;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;color:#222}.pager li>a:hover,.pager li>span:hover{background-color:#222;color:#fff}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>span{background-color:#f9f9f9;color:#333}.breadcrumb{background-color:#999}.breadcrumb li{text-shadow:none}.breadcrumb .divider,.breadcrumb .active{color:#222;text-shadow:none}.btn{padding:5px 12px;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-shadow:none}.btn.disabled{box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-large{padding:14px 23px}.btn-small{padding:2px 10px}.btn-mini{padding:2px 6px}.btn-group>.btn:first-child,.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}legend,label{color:#555;border-bottom:0 solid #222}.table tbody tr.success td{color:#fff}.table tbody tr.error td{color:#fff}.table tbody tr.info td{color:#fff}.table-bordered{-webkit-border-radius:0;-moz-border-radius:0;border-radius: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-radius:0;-moz-border-radius:0;border-radius:0}.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-radius:0;-moz-border-radius:0;border-radius:0}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"]{color:#222}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#ff7518}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#ff7518;color:#222}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#ff4136}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#ff4136;color:#222}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#28b62c}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#28b62c;color:#222}legend{border-bottom:0;color:#222}.form-actions{border-top:0;background-color:#f9f9f9}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.alert{text-shadow:none}.alert-heading,.alert h1,.alert h2,.alert h3,.alert h4,.alert h5,.alert h6{color:#fff}.label-success{background-color:#28b62c}.label-important{background-color:#ff4136}.label-info{background-color:#9954bb}.label-inverse{background-color:#000}.badge{border-radius:0;font-weight:200}a:hover{text-decoration:none}.hero-unit{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.well{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}a.thumbnail{background-color:#999}a.thumbnail:hover{background-color:#555;border-color:transparent}.progress{background-color:#f9f9f9;background-image:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.modal{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background-color:#eaeaea}.modal-header{border-bottom:0}.modal-footer{border-top:0;background-color:transparent}.popover{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.popover-title{border-bottom:0;color:#fff}@media(max-width:767px){div.panel{width:100%!important;padding:0!important}}.container-fluid{padding-left:0;padding-right:0}.main-view-container{padding:5px 10px;width:100%;box-sizing:border-box}.bgNav{background:#f8f8f8}.bgPrimary{background:#41bae7;color:rgba(255,255,255,0.9)}.bgInfo{background:#a466c2;color:rgba(255,255,255,0.9)}.bgSuccess{background:#2dcb31;color:rgba(255,255,255,0.9)}.bgWarning{background:#ff8432;color:rgba(255,255,255,0.9)}.bgDanger{background:#ff5950;color:rgba(255,255,255,0.9)}.bgInverse{background:#555;color:rgba(255,255,255,0.9)}code,pre{background-color:#f9f9f9}div.editor-row{vertical-align:top}div.editor-row div.section{margin-right:20px;vertical-align:top;display:inline-block}div.editor-option{vertical-align:top;display:inline-block;margin-right:10px}div.editor-option label{display:block}#events{font-size:12px}.version{font-size:85%}.legend{color:#000}div.fake-input{background-color:#fff;border:1px solid #999;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;border-radius:3px 3px 3px 3px}hr.small{margin:5px 0}form input.ng-invalid{color:#ff7169}.editor-title{margin-right:10px;font-size:1.7em;font-weight:bold;text-transform:capitalize}.editor-title small{opacity:.5;font-size:.7em;font-weight:normal}.bordered{border:1px solid #ddd}.table-unpadded th,.table-unpadded td{padding:0 2px}.spy{position:absolute;right:0;top:0}.navbar-inner{border-width:0}.grafana-row{margin-bottom:5px}.row-tab .dropdown-menu-right{top:0;left:33px}.row-tab-button{padding:0;cursor:pointer;vertical-align:middle;width:30px;height:30px;text-align:center;display:inline-block;line-height:30px}.row-button{width:30px;float:left;cursor:pointer;line-height:31px}.row-text{white-space:nowrap;text-transform:uppercase;font-weight:bold;font-size:.9em;text-align:center;line-height:31px;height:31px}.row-close{padding:0;margin:0;background:#fff;text-align:center}.row-close-buttons{position:absolute;left:0}.row-open{margin-top:5px;left:-34px;position:absolute;z-index:100;transition:.10s left;transition-delay:.10s;-webkit-transition-delay:.10s}.row-open:hover{left:-12px}.odd{background-color:#f9f9f9}.nomargin{margin:0}[ng\:cloak],[ng-cloak],.ng-cloak{display:none!important}.table tbody+tbody{border-top:0}.ui-draggable-dragging{display:block;z-index:9999}.link{color:#555;cursor:pointer}.link:hover{color:#222}.pointer{cursor:pointer}.popover{max-width:480px}.tiny{font-size:50%}.smaller{font-size:70%}.small{font-size:85%}.large{font-size:120%}.strong{font-weight:bold}a{cursor:pointer}.normal{font-weight:normal}.light{font-weight:200}.input-smaller{width:75px}.string{color:#626262}.number{color:#ba8bd1}.boolean{color:#ffa365}.key{color:#ff8983}.btn-active{background-color:#e6e6e6;background-image:none;box-shadow:0 2px 4px rgba(0,0,0,0.15) inset,0 1px 2px rgba(0,0,0,0.05);outline:0 none}.remove:hover{background-color:#ff291c}.faded{opacity:.2}div.flot-text{color:#555!important}.page-alert-list{z-index:8000;min-width:300px;max-width:300px;position:fixed;right:20px;top:56px}.page-alert-list .alert{color:#fff;padding-bottom:13px;position:relative}.page-alert-list .alert-close{position:absolute;top:-4px;right:-2px;width:19px;height:19px;padding:0;background:#f9f9f9;border-radius:50%;border:0;font-size:1.1rem;color:#222}.page-alert-list .alert-title{font-weight:bold;padding-bottom:2px}.alert-warning{background-color:#ff7518;border-color:transparent;color:#ff934b}.popover.topLeft{margin-top:-10px}.popover.topLeft .arrow{bottom:-10px;left:25%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#fff}.popover.topLeft .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.topRight{margin-top:-10px}.popover.topRight .arrow{bottom:-10px;left:75%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#fff}.popover.topRight .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.rightTop .arrow{top:10%;left:-16px;margin-top:-16px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightTop .arrow:after{left:1px;bottom:-15px;border-left-width:0;border-right-color:#fff}.popover.rightBottom .arrow{top:90%;left:-16px;margin-top:-16px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightBottom .arrow:after{left:1px;bottom:-15px;border-left-width:0;border-right-color:#fff}.popover.bottomLeft .arrow{left:10%;margin-left:-16px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-16px}.popover.bottomLeft .arrow:after{top:1px;margin-left:-15px;border-top-width:0;border-bottom-color:#fff}.popover.bottomRight .arrow{left:90%;margin-left:-16px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-16px}.popover.bottomRight .arrow:after{top:1px;margin-left:-15px;border-top-width:0;border-bottom-color:#fff}.popover.leftTop .arrow{top:10%;right:-16px;margin-top:-16px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftTop .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-15px}.popover.leftBottom .arrow{top:90%;right:-16px;margin-top:-16px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftBottom .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-15px}.popover.topLeft .arrow{left:10%;margin-left:-16px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-16px}.popover.topLeft .arrow:after{bottom:1px;margin-left:-15px;border-bottom-width:0;border-top-color:#fff}.popover.topRight .arrow{left:90%;margin-left:-16px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-16px}.popover.topRight .arrow:after{bottom:1px;margin-left:-15px;border-bottom-width:0;border-top-color:#fff}.typeahead{max-height:300px;overflow-y:auto}.label-tag{background-color:#9954bb;color:#f2f2f2;border-radius:2px;text-shadow:none;font-size:13px;padding:4px 6px}.label-tag .icon-tag{position:relative;top:1px;padding-right:4px}.label-tag:hover{opacity:.85;background-color:#7e3f9d}.save-dashboard-dropdown{padding:10px}.save-dashboard-dropdown li>a{padding-left:5px}.save-dashboard-dropdown-save-form{margin-bottom:5px}.inspector-request-table td{padding:5px}.inspector-request-table td:first-child{white-space:nowrap}.modal-body{padding:0}code,pre{background-color:#fff;color:#555}.login-form{width:50%;float:left;margin-left:25%;margin-right:25%;padding-top:50px}.login-box{width:700px;margin:100px auto 0 auto}.login-box-logo{text-align:center;padding-bottom:50px}.login-inner-box{background:#fff}.login-tab-header{background:#efefef;text-align:center}.btn-login-tab{background:transparent;border:0;font-size:15px;padding:10px 10px;font-weight:bold;display:inline-block;width:170px;color:#555}.btn-login-tab.active{background:#e2e2e2;color:#fff}.btn-login-tab:focus{outline:0}.password-strength{display:block;width:50px;overflow:visible;white-space:nowrap;padding-top:3px;margin-left:97px;color:#222;border-top:3px solid #ff4136}.password-strength.password-strength-ok{width:170px;border-top:3px solid #ffa04e}.password-strength.password-strength-good{width:254px;border-top:3px solid #3dd441}.login-submit-button-row{text-align:center;margin-top:40px}.login-submit-button-row button{padding:9px 7px;font-size:14px;font-weight:bold;width:150px;display:inline-block;border:1px solid #6f6f6f}.login-oauth{margin-top:30px;padding:10px;background:#efefef}.login-oauth .btn-google{background:#dd4b39;color:white}.login-oauth .btn-github{background:#555;color:white}.submenu-controls-visible .panel-fullscreen{top:88px}.submenu-controls{margin:10px 10px 0 5px;font-size:16px}.annotation-disabled,.annotation-disabled a{color:#a2a2a2}.annotation-segment label.cr1{margin-left:5px}.graph-canvas-wrapper{position:relative;cursor:crosshair}.graph-legend{margin:0 20px;text-align:center}.graph-legend .popover-content{padding:0}.graph-legend-icon{position:relative;padding-right:4px;top:1px}.graph-legend-icon,.graph-legend-alias,.graph-legend-value{float:left;white-space:nowrap;font-size:85%;text-align:left}.graph-legend-icon.current:before,.graph-legend-alias.current:before,.graph-legend-value.current:before{content:"Current: "}.graph-legend-icon.max:before,.graph-legend-alias.max:before,.graph-legend-value.max:before{content:"Max: "}.graph-legend-icon.min:before,.graph-legend-alias.min:before,.graph-legend-value.min:before{content:"Min: "}.graph-legend-icon.total:before,.graph-legend-alias.total:before,.graph-legend-value.total:before{content:"Total: "}.graph-legend-icon.avg:before,.graph-legend-alias.avg:before,.graph-legend-value.avg:before{content:"Avg: "}.graph-legend-icon .fa{font-size:135%;position:relative;top:1px}.graph-legend-series{float:left;white-space:nowrap;padding-left:10px;padding-top:6px}.graph-legend-value{padding-left:6px}.graph-legend-table{display:table;width:100%;margin:0}.graph-legend-table .graph-legend-series{display:table-row;float:none;padding-left:0}.graph-legend-table .graph-legend-series.pull-right{float:none}.graph-legend-table td,.graph-legend-table .graph-legend-alias,.graph-legend-table .graph-legend-icon,.graph-legend-table .graph-legend-value{float:none;display:table-cell;white-space:nowrap;padding:2px 10px;text-align:right;border-bottom:1px solid #eee}.graph-legend-table .graph-legend-icon{width:5px;padding:0;top:0}.graph-legend-table .graph-legend-icon .fa{top:4px}.graph-legend-table .graph-legend-value{padding-left:15px}.graph-legend-table .graph-legend-alias{padding-left:7px;text-align:left;width:95%}.graph-legend-table .graph-legend-series:nth-child(odd){background-color:#e4e4e4}.graph-legend-table .graph-legend-value.current:before,.graph-legend-table .graph-legend-value.max:before,.graph-legend-table .graph-legend-value.min:before,.graph-legend-table .graph-legend-value.total:before,.graph-legend-table .graph-legend-value.avg:before{content:''}.graph-legend-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#2ab2e4;font-size:85%;white-space:nowrap}.graph-legend-rightside.graph-wrapper{display:table;width:100%}.graph-legend-rightside .graph-canvas-wrapper{display:table-cell;width:100%;position:relative}.graph-legend-rightside .graph-legend-wrapper{display:table-cell;vertical-align:top;position:relative;left:4px}.graph-legend-rightside .graph-legend{margin:0}.graph-legend-rightside .graph-legend-series{display:block;padding-left:0}.graph-legend-rightside .graph-legend-table .graph-legend-series{display:table-row}.graph-legend-series-hidden a{color:#a2a2a2}.graph-legend-popover{width:200px}.graph-legend-popover label{display:inline-block}.graph-legend-popover .btn{padding:1px 3px;margin-right:0;line-height:initial}.graph-legend-popover .close{margin-right:5px;color:#555;opacity:.7;text-shadow:none}.graph-legend-popover .editor-row{padding:5px}.annotation-tags{color:#9954bb}.graph-series-override input{float:left;margin-right:10px}.graph-series-override .graph-series-override-option{float:left;padding:2px 6px}.graph-series-override .graph-series-override-selector{float:left}.graph-tooltip{white-space:nowrap}.graph-tooltip .graph-tooltip-time{text-align:center;font-weight:bold;position:relative;top:-3px}.graph-tooltip .graph-tooltip-list-item{display:table-row}.graph-tooltip .graph-tooltip-series-name{display:table-cell}.graph-tooltip .graph-tooltip-value{display:table-cell;font-weight:bold;padding-left:10px;text-align:right}.left-yaxis-label{top:50%;left:-5px;transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);transform-origin:left top;-o-transform-origin:left top;-ms-transform-origin:left top;-moz-transform-origin:left top;-webkit-transform-origin:left top}.right-yaxis-label{top:50%;right:-5px;-webkit-transform:rotate(90deg);-webkit-transform-origin:right top;-moz-transform:rotate(90deg);-moz-transform-origin:right top;-ms-transform:rotate(90deg);-ms-transform-origin:right top;-o-transform:rotate(90deg);-o-transform-origin:right top;transform:rotate(90deg);transform-origin:right top}.axisLabel{color:#555;font-size:11.9px;position:absolute;text-align:center;font-size:12px}.bootstrap-tagsinput{display:inline-block;padding:4px 6px;margin-bottom:10px;color:#555;vertical-align:middle;border-radius:4px;max-width:100%;line-height:22px;background-color:#fff;border:1px solid #999;-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}.bootstrap-tagsinput input{border:0;box-shadow:none;outline:0;background-color:transparent;padding:0;padding-left:5px;margin:0;width:auto!important;max-width:inherit}.bootstrap-tagsinput input:focus{border:0;box-shadow:none}.bootstrap-tagsinput .tag{margin-right:2px;color:white}.bootstrap-tagsinput .tag [data-role="remove"]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role="remove"]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role="remove"]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.bootstrap-tagsinput .tag [data-role="remove"]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.grafana-options-table{width:100%}.grafana-options-table th{padding:5px 10px;border-bottom:4px solid #fff}.grafana-options-table tr td{background-color:#ececec;padding:5px 10px;white-space:nowrap;border-bottom:4px solid #fff}.grafana-options-table tr td.nobg{background-color:transparent}.grafana-options-table .max-width-btns{padding-right:0}.grafana-options-table .max-width-btns .btn{box-sizing:border-box;width:100%}.max-width{overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap}.grafana-options-list{list-style:none;margin:0;max-width:450px}.grafana-options-list li:nth-child(odd){background-color:#e4e4e4}.grafana-options-list li{float:left;margin:2px;padding:5px 10px;border:1px solid #eee}.grafana-options-list li:first-child{border:1px solid #eee}.search-container{left:52px;top:33px;margin:15px;z-index:1000;position:absolute;width:700px;box-shadow:0 0 55px 0 black;padding:10px;background-color:#fff;border:1px solid #e2e2e2}.search-container .label-tag{margin-left:6px;font-size:11px;padding:2px 6px}.search-field-wrapper{padding-bottom:10px}.search-field-wrapper input{width:100%;padding:18px 8px;box-sizing:border-box}.search-field-wrapper button{margin:0 4px 0 0}.search-field-wrapper>span{display:block;overflow:hidden}.search-results-container{height:450px;overflow:auto;display:block;line-height:28px}.search-results-container .search-result-item:hover,.search-results-container .search-result-item.selected{background-color:#dfdfdf}.search-results-container .selected .search-result-tag{opacity:.70;color:white}.search-results-container .fa-star,.search-results-container .fa-star-o{padding-left:13px}.search-results-container .fa-star{color:#ff7518}.search-results-container .search-result-link{color:#555}.search-results-container .search-result-link .fa{padding-right:10px}.search-results-container .search-result-item{display:block;padding:3px 10px;white-space:nowrap;background-color:#ececec;margin-bottom:4px}.search-results-container .search-result-tags{float:right}.search-results-container .search-result-actions{float:right;padding-left:20px}.search-switches{position:absolute;top:19px;right:21px}.search-button-row{padding-top:20px}.search-button-row button,.search-button-row a{margin-right:10px}.panel{display:inline-block;float:left;vertical-align:top;position:relative}.panel-margin{margin:5px;display:block}.panel-container{background-color:#fff;position:relative;border:solid 1px #ddd}.panel-container:hover .panel-actions{display:block}.panel-container.panel-transparent{background-color:transparent;border:0}.panel-content{padding:0 10px 5px 10px}.panel-title-container{min-height:5px;padding-top:4px;cursor:context-menu}.panel-title{border:0;font-weight:bold;position:relative;cursor:context-menu;width:100%;display:block}.panel-title.has-panel-links .panel-title-text:after{content:"\f08e";font-family:'FontAwesome';font-size:80%;padding-left:10px;position:relative;top:-1px}.panel-loading{position:absolute;top:-3px;right:0;z-index:800}.panel-header{text-align:center}.panel-error{color:#fff;position:absolute;left:0;padding:0 17px 6px 5px;top:0;z-index:10}.panel-error i{position:relative;top:-2px}.panel-error-arrow{width:0;height:0;position:absolute;border-left:31px solid transparent;border-right:30px solid transparent;border-bottom:27px solid #fff;left:0;bottom:0}.panel-fullscreen{z-index:100;display:block;position:fixed;left:0;right:0;top:60px;padding:0;overflow-y:auto;height:100%}.panel-fullscreen .dropdown-menu{margin-bottom:70px}.panel-fullscreen .panel-container{margin:15px}.panel-fullscreen .panel-menu{top:0}.panel-fullscreen .panel-title-container{padding:8px}.panel-full-edit{margin-top:30px;padding-bottom:130px}.panel-menu{z-index:500;position:absolute;background:#e2e2e2;border:1px solid black;top:-62px}.panel-menu .panel-menu-row{white-space:nowrap;border-bottom:1px solid black}.panel-menu .panel-menu-row:last-child{border-bottom:0}.panel-menu .panel-menu-link,.panel-menu .panel-menu-icon{padding:5px 10px}.panel-menu .panel-menu-link{display:inline-block;border-right:1px solid black}.panel-menu .panel-menu-link:last-child{border:0}.panel-menu .dropdown-menu{text-align:left}.panel-highlight{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.on-drag-hover .panel-container{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.panel-drop-zone{display:none}.panel-drop-zone .panel-container{border:1px solid #333}.panel-ghost{width:100%}.panel-ghost .panel-container{border:0;background:transparent}.panel-ghost .panel-ghost-list{margin:10px 0 10px 20px}.panel-ghost button{text-align:left;min-width:135px}.panel-ghost button .fa{position:relative;left:-5px}.panel-time-info{font-weight:bold;float:right;margin-right:15px;color:#2ab2e4;font-size:85%;position:absolute;top:0;right:0}input[type=text].input-fluid{width:100%;box-sizing:border-box;padding:10px;font-size:16px;-moz-box-sizing:border-box;height:100%}input[type="checkbox"].cr1{display:none}label.cr1{display:inline-block;height:19px;clear:none;text-indent:2px;margin:0 0 1px 0;padding:0 0 0 20px;vertical-align:middle;background:url('../img/checkbox_white.png') left top no-repeat;cursor:pointer}input[type="checkbox"]:checked+label{background:url('../img/checkbox_white.png') 0 -18px no-repeat}.gf-form{padding-bottom:10px}.gf-form .checkbox-label{padding-left:7px;display:inline}.gf-fluid-input{border:0;display:block;overflow:hidden;padding-right:10px}.gf-fluid-input input[type=text]{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.gf-fluid-input textarea{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.singlestat-panel{position:relative;display:table;width:100%}.singlestat-panel-value-container{padding:20px;display:table-cell;vertical-align:middle;text-align:center;position:relative;z-index:1;font-size:3em;font-weight:bold}.singlestat-panel-prefix{padding-right:20px}.singlestat-panel-table{width:100%}.singlestat-panel-table td{padding:5px 10px;white-space:nowrap;text-align:right;border-bottom:1px solid #eee}.singlestat-panel-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#2ab2e4}.singlestat-panel-table td:first-child{text-align:left}.singlestat-panel-table tr:nth-child(odd) td{background-color:#e4e4e4}.singlestat-panel-table tr:last-child td{border:0}.tight-form{border-top:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #ddd;background:#efefef;width:100%}.tight-form:last-child,.tight-form.last{border-bottom:1px solid #ddd}.tight-form.borderless{background:transparent;border:0}.tight-form .checkbox-label{display:inline;padding-right:4px;margin-bottom:0}.spaced-form .tight-form{margin:7px 0}.borderless .tight-form-item,.borderless .tight-form-input{border:0}.tight-form-container .tight-form:last-child{border-bottom:0}.tight-form-container:last-child{border-bottom:1px solid #ddd}.tight-form-btn{padding:8px 12px}.tight-form-list{list-style:none;margin:0}.tight-form-list>li{float:left}.grafana-metric-options{margin-top:35px}.tight-form-item{padding:8px 7px;font-weight:normal;border-right:1px solid #ddd;color:#555;display:inline-block}.has-open-function .tight-form-item{padding-top:25px}.tight-form-disabled .tight-form-item{color:#959595}.tight-form-item:hover,.tight-form-item:focus{text-decoration:none}.tight-form-itema:hover{background:#e2e2e2}.tight-form-item.template-param-name{border-right:0;padding-right:0;padding-left:18px}.tight-form-item.annotation-segment{padding:8px 13px}.tight-form-item.last{border-right:0}.tight-form-item .fa-caret-down{font-size:75%;position:relative;top:1px}.tight-form-item-icon i{width:15px;text-align:center;display:inline-block}.tight-form-func{background:#e2e2e2}.tight-form-func>a{color:#555}.tight-form-func>a:hover{color:#555}.tight-form-func.show-function-controls{padding-top:5px;min-width:100px;text-align:center}input[type=text].tight-form-func-param{background:transparent;border:0;margin:0;padding:0}input[type=text].tight-form-clear-input{padding:8px 7px;border:0;margin:0;background:transparent;float:left;color:#555;border-radius:0;border-right:1px solid #ddd}[type=text].tight-form-input,[type=email].tight-form-input,[type=number].tight-form-input,[type=password].tight-form-input{border:0;border-right:1px solid #ddd;margin:0;border-radius:0;padding:8px 6px;height:100%;box-sizing:border-box}[type=text].tight-form-input.last,[type=email].tight-form-input.last,[type=number].tight-form-input.last,[type=password].tight-form-input.last{border-right:0}input[type=checkbox].tight-form-checkbox{margin:0}select.tight-form-input{border:0;border-right:1px solid #ddd;margin:0;border-radius:0;height:36px;padding:8px 3px}select.tight-form-input.last{border-right:0}.tight-form-func-controls{display:none;text-align:center}.tight-form-func-controls .fa-arrow-left{float:left;position:relative;top:2px}.tight-form-func-controls .fa-arrow-right{float:right;position:relative;top:2px}.tight-form-func-controls .fa-remove{margin-left:10px}.tight-form-radio input[type=radio]{margin:0}.tight-form-radio label{display:inline}.sidemenu-canvas{position:relative}.sidemenu-wrapper{position:absolute;display:none;top:0;bottom:0;left:0;width:200px;background:#eaeaea;min-height:100%;z-index:101}.sidemenu-wrapper a:focus{text-decoration:none}.sidemenu-open .sidemenu-wrapper{display:block}.sidemenu-open .search-container{left:200px}.sidemenu-open .main-view{padding-left:200px}.sidemenu-open .panel-fullscreen{left:200px}.sidemenu{font-size:16px;font-weight:400;list-style:none;margin:0;padding:0}.sidemenu>li{margin-bottom:9px}.sidemenu .fa-caret-down{position:relative;top:2px;font-size:90%}.sidemenu.sidemenu-small{font-size:14px}.sidemenu.sidemenu-small .icon-circle{border-radius:50%;background:#fff;box-shadow:0 0 14px 2px rgba(0,0,0,0.05);border:1px solid rgba(0,0,0,0.05);width:28px;height:28px}.sidemenu.sidemenu-small .icon-circle i{top:1px;left:4px;font-size:110%}.sidemenu.sidemenu-small .sidemenu-item{line-height:28px;padding-left:25px}.sidemenu-item-text{width:110px;display:inline-block;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.sidemenu-top-btn{display:block;padding:8px 0 4px 22px;background-color:#f8f8f8;border-right:3px solid #eaeaea}.sidemenu-top-btn img{border-radius:50%;background:#fff;border:1px solid #eaeaea;width:30px;padding:4px}.sidemenu-top-btn i{padding-right:5px;padding-top:5px;font-size:170%;color:#555}.icon-circle{width:40px;height:40px;display:inline-block}.icon-circle i{color:#555;opacity:.7;position:relative;left:7px;top:5px;font-size:150%}.sidemenu-item{color:#555;line-height:40px;padding:0 10px 0 20px;display:block;white-space:nowrap}.sidemenu-item .sidemenu-item-text{padding-left:11px;transition:color 100ms ease-out}.sidemenu-item .sidemenu-item-text.no-icon{padding-left:59px}.sidemenu-item img{border-radius:50%;width:28px;height:28px;box-shadow:0 0 14px 2px rgba(255,255,255,0.05)}.sidemenu-system-section{background-color:#75caeb;color:#fff;padding:3px 0;margin-left:10px;margin-right:10px;border-radius:2px}.sidemenu-system-section .sidemenu-system-section-inner{border:2px solid black;border-left:none;border-right:0;padding:4px;overflow:hidden}.sidemenu-system-section .fa{float:left;font-size:120%;line-height:41px;padding:0 15px}.sidemenu-section-tagline{font-style:italic;font-size:75%;line-height:10px}.sidemenu-section-text-wrapper{padding-top:4px}.navbar-inner{padding-left:0}.navbar .nav>li>a{padding:17px 15px 13px}.navbar .nav>li>a .fa{font-size:115%}.top-nav{float:left;font-size:16px}.fa.top-nav-breadcrumb-icon{margin:18px 0 6px 5px;float:left;font-size:120%;color:#555}.top-nav-menu-btn{border:1px solid #eaeaea;border-radius:50%;background:#fff;display:block;position:relative;float:left;width:30px;height:30px;padding:4px;margin:6px 6px 3px 9px}.top-nav-menu-btn .fa{color:#555;width:30px;height:30px;left:9px;top:7px;font-size:150%;opacity:0;position:absolute;transition:opacity .2s ease-in-out}.top-nav-menu-btn img{width:30px;position:absolute;opacity:1;transition:opacity .2s ease-in-out}.top-nav-menu-btn:hover .fa{opacity:.7}.top-nav-menu-btn:hover img{opacity:0}.top-nav-dashboards-btn{display:block;float:left;margin:9px 18px 5px 14px;border-radius:3px;font-size:1.4em;color:#a2a2a2;border:solid 1px #f9f9f9}.top-nav-dashboards-btn a{display:inline-block;background:#e2e2e2;padding:5px 15px 5px 10px;border-radius:3px;color:#a2a2a2}.top-nav-dashboards-btn a:hover{background:#d6d6d6}.top-nav-dashboards-btn a:hover .fa{color:#555}.top-nav-dashboards-btn .fa-th-large{position:relative;top:2px}.top-nav-dashboards-btn .fa-caret-down{font-size:60%;position:relative;top:4px}.dashboard-title{padding:0 6px 5px 5px;color:#222;font-size:17px}.top-nav-icon{margin:5px 0 0 11px;line-height:41px;float:left}.top-nav-section{display:block;float:left;padding:19px 9px 8px 0;font-weight:bold}.top-nav-section i{padding-left:8px}.top-nav-title{display:block;float:left;font-size:17px;padding:18px 10px 10px 13px;color:#555}.top-nav-snapshot-title{display:block;float:left;font-size:1.4em;margin:9px 18px 5px 14px;color:#555}.top-nav-snapshot-title .gf-icon{position:relative;top:3px;font-size:27px}.top-nav-snapshot-title a{display:inline-block;padding:0 15px 5px 10px}.gf-box{margin:15px;background-color:#fff;position:relative;border:1px solid #e2e2e2}.gf-box-no-margin{margin:0}.gf-box-header-close-btn{float:right;padding:0;margin:0;background-color:transparent;border:0;padding:8px;color:#555}.gf-box-header-close-btn i{font-size:120%}.gf-box-header-close-btn:hover{color:#fff}.gf-box-body{padding:20px;min-height:150px}.gf-box-footer{overflow:hidden}.gf-box-header{border-bottom:1px solid #e2e2e2;overflow:hidden;background-color:#efefef}.gf-box-header .tabs{float:left}.gf-box-header .nav{margin:0}.gf-box-title{padding-right:20px;padding-left:10px;float:left;color:#555;font-size:18px;font-weight:normal;line-height:38px;margin:0}.gf-box-title .fa{padding:0 8px 0 5px;color:#555}.page-container{margin:15px;background:#fff;position:relative;border:1px solid #333;padding:20px 20px 60px 49px}.page-container h2{color:#555;font-weight:normal;font-size:22px}.page{max-width:653px}.admin-page{max-width:800px;margin-left:10px}.admin-page .gf-box{margin-top:0}.admin-page .gf-box-body{min-height:0}.admin-page h2{margin-left:15px;margin-bottom:0;font-size:17.5px;color:#555}.admin-page h2 i{padding-right:6px}.dashlist-link{display:block;margin:5px;padding:7px;background-color:#efefef;border:1px solid #ddd}.dashlist-link .fa{float:right;padding-top:3px}.dashlist-link .fa-star{color:#ff7518}.dashlist-link:hover{background-color:#e2e2e2}.admin-settings-section{color:#2ab2e4;font-weight:bold}td.admin-settings-key{padding-left:20px}input[type=text].ng-dirty.ng-invalid{box-shadow:inset 0 0 7px #ff4136}@font-face{font-family:'raintank';src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SAywAAAC8AAAAYGNtYXAaVcxZAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zm7/N1QAAAFwAAAFmGhlYWQFNK2SAAAHCAAAADZoaGVhB14DyAAAB0AAAAAkaG10eAwxAAQAAAdkAAAAHGxvY2ECNgP2AAAHgAAAABBtYXhwABcAvAAAB5AAAAAgbmFtZflvA+cAAAewAAABTnBvc3QAAwAAAAAJAAAAACAAAwQAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADmAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIOYC//3//wAAAAAAIOYA//3//wAB/+MaBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAADwAA/7YDnAO3AAMAHQAhACUAKgAuADEAQgBTAGQAdQCGAJcAqAC5AAA3FyUnJTUTJzUjJwcjJwcjFQcTBxcVIQ0BNzM1NycTAxEXJTkCByERIREHFSc3NzEzAxQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwE2FhUHNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATYWFXsKAS9VAbOKkFsDmDvbEZhXTjY/Alj+wQFGGT4mIU5TU/3CmgJU/awxICDLAWUbE40TGxsTjRMbLo0LERELjQwQEAzQHBONExsbE40UG9cQC40MEBAMjQsQ7BsTjRMbGxONExvXEAuNDBAQDIwMEAEbjRMbGxONFBsbFKgQC40MEBAMjQsQDkMvFvQEAfYoVRcXPDxGDf4JwhFKBFpdHAbPAdn+zwFIF54x/ZsCZUbPygV3/s4TGxsTjBQbHBOMqRAMjQsQEAuMDBEdjBQbHBOMFBsbFIwMEBAMjAwQAREM+RQbHBONExscEo2MjAwQEAyNCxARCy4bE4wUGxwTjRIbuo0LEBALjQwQAREMAAoAAf+5A2IDtQAQACEAMgBDAFQAZQB2AIcAkACVAAATHgE/AT4BLwEuAQ8BDgEfAT8BNhYfARYGDwEGJi8BJjY3NxceAT8BPgEvAS4BDwEOARc3FxYGDwEGJi8BJjY/ATYWFwMuAQ8BDgEfAR4BPwE+AS8BBycmNj8BNhYfARYGDwEGJicFNz4BLwEuAQ8BDgEfAR4BNzcXFgYPAQYmLwEmNj8BNhYXARMfASUvAQMFEwMlEwWdAyAVkhUYAxcDIRSTFBgDFxWTDBQBFwIODZIMFAIXAg8M3hcDIRSSFBgDFwMgFZIUGAPgFwIPDJIMFAIWAg4MkgwUAs4DIRSTFBgDFwMgFZIVGAMXyhcCDwyTDBQBFwIODZIMFAIBL5IUGAMXAyAVkhQYAxcDIRSRFwIPDJIMFAIXAg8MkgwUAv1pahUNAtUNFWv9LJ9jAmxj/ZQCFxQYAxYEIBWSFRgDFwMhFJO3FwIPDJIMFAIXAg8MkwwUAQWTFBgDFgMhFJMUGAMWAyEUIpINEwIXAg8MkwwUAhYCDg3+1xQYAxcDIRSTFBgDFwMhFJO2kwwUAhYCDgyTDBQCFgIPCwMXAyEUkxQYAxcDIBWSFBkD35MMFAIWAg4NkgwUAhYCDgwBU/1PilFwUokCsXD9VwJ9YP2DYAAKAAP/twMyA7QAEAAhADIAQwBUAGUAdgCHAIwAkQAAExQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwEyFhUBNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATIWFQERIREhExEhESF7IBelFx8fF6UXIDelDhITDaUOExQN9CAXpBcgIBekFyD8Ew2lDhMUDaQOE/7rHxelFyAgF6UXH/wUDaUOEhMNpQ0UAUykFyAgF6QXICAXxRMNpQ4TFA2kDhP9YQMv/NE7Arr9RgJOFyAgF6QXICAXpMUTDqQOExMOpA4TIaQXICAXpBcgIBekDhMTDqQOExMO/twXICAXpBcgIBekpKQOExMOpA4TEw43IBekFyAgF6QXINukDhMTDqQOExMOAeb8AwP9/PkCzP00AAEAAAABAADkYnVvXw889QALBAAAAAAA0Ty0lAAAAADRPLSUAAD/tgOcA7cAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAA5wAAQAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAACAAAAA50AAANiAAEDMgADAAAAAAAKABQAHgEWAg4CzAABAAAABwC6AA8AAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEAEAAAAAEAAAAAAAIADgBOAAEAAAAAAAMAEAAmAAEAAAAAAAQAEABcAAEAAAAAAAUAFgAQAAEAAAAAAAYACAA2AAEAAAAAAAoANABsAAMAAQQJAAEAEAAAAAMAAQQJAAIADgBOAAMAAQQJAAMAEAAmAAMAAQQJAAQAEABcAAMAAQQJAAUAFgAQAAMAAQQJAAYAEAA+AAMAAQQJAAoANABsAHIAYQBpAG4AdABhAG4AawBWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBhAGkAbgB0AGEAbgBrcmFpbnRhbmsAcgBhAGkAbgB0AGEAbgBrAFIAZQBnAHUAbABhAHIAcgBhAGkAbgB0AGEAbgBrAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAlsAAsAAAAACSAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIDLGNtYXAAAAFoAAAATAAAAEwaVcxZZ2FzcAAAAbQAAAAIAAAACAAAABBnbHlmAAABvAAABZgAAAWYbv83VGhlYWQAAAdUAAAANgAAADYFNK2SaGhlYQAAB4wAAAAkAAAAJAdeA8hobXR4AAAHsAAAABwAAAAcDDEABGxvY2EAAAfMAAAAEAAAABACNgP2bWF4cAAAB9wAAAAgAAAAIAAXALxuYW1lAAAH/AAAAU4AAAFO+W8D53Bvc3QAAAlMAAAAIAAAACAAAwAAAAMEAAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA5gIDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDmAv/9//8AAAAAACDmAP/9//8AAf/jGgQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAA8AAP+2A5wDtwADAB0AIQAlACoALgAxAEIAUwBkAHUAhgCXAKgAuQAANxclJyU1Eyc1IycHIycHIxUHEwcXFSENATczNTcnEwMRFyU5AgchESERBxUnNzcxMwMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBNhYVBzQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwE2FhV7CgEvVQGzipBbA5g72xGYV042PwJY/sEBRhk+JiFOU1P9wpoCVP2sMSAgywFlGxONExsbE40TGy6NCxERC40MEBAM0BwTjRMbGxONFBvXEAuNDBAQDI0LEOwbE40TGxsTjRMb1xALjQwQEAyMDBABG40TGxsTjRQbGxSoEAuNDBAQDI0LEA5DLxb0BAH2KFUXFzw8Rg3+CcIRSgRaXRwGzwHZ/s8BSBeeMf2bAmVGz8oFd/7OExsbE4wUGxwTjKkQDI0LEBALjAwRHYwUGxwTjBQbGxSMDBAQDIwMEAERDPkUGxwTjRMbHBKNjIwMEBAMjQsQEQsuGxOMFBscE40SG7qNCxAQC40MEAERDAAKAAH/uQNiA7UAEAAhADIAQwBUAGUAdgCHAJAAlQAAEx4BPwE+AS8BLgEPAQ4BHwE/ATYWHwEWBg8BBiYvASY2NzcXHgE/AT4BLwEuAQ8BDgEXNxcWBg8BBiYvASY2PwE2FhcDLgEPAQ4BHwEeAT8BPgEvAQcnJjY/ATYWHwEWBg8BBiYnBTc+AS8BLgEPAQ4BHwEeATc3FxYGDwEGJi8BJjY/ATYWFwETHwElLwEDBRMDJRMFnQMgFZIVGAMXAyEUkxQYAxcVkwwUARcCDg2SDBQCFwIPDN4XAyEUkhQYAxcDIBWSFBgD4BcCDwySDBQCFgIODJIMFALOAyEUkxQYAxcDIBWSFRgDF8oXAg8MkwwUARcCDg2SDBQCAS+SFBgDFwMgFZIUGAMXAyEUkRcCDwySDBQCFwIPDJIMFAL9aWoVDQLVDRVr/SyfYwJsY/2UAhcUGAMWBCAVkhUYAxcDIRSTtxcCDwySDBQCFwIPDJMMFAEFkxQYAxYDIRSTFBgDFgMhFCKSDRMCFwIPDJMMFAIWAg4N/tcUGAMXAyEUkxQYAxcDIRSTtpMMFAIWAg4MkwwUAhYCDwsDFwMhFJMUGAMXAyAVkhQZA9+TDBQCFgIODZIMFAIWAg4MAVP9T4pRcFKJArFw/VcCfWD9g2AACgAD/7cDMgO0ABAAIQAyAEMAVABlAHYAhwCMAJEAABMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBMhYVATQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwEyFhUBESERIRMRIREheyAXpRcfHxelFyA3pQ4SEw2lDhMUDfQgF6QXICAXpBcg/BMNpQ4TFA2kDhP+6x8XpRcgIBelFx/8FA2lDhITDaUNFAFMpBcgIBekFyAgF8UTDaUOExQNpA4T/WEDL/zROwK6/UYCThcgIBekFyAgF6TFEw6kDhMTDqQOEyGkFyAgF6QXICAXpA4TEw6kDhMTDv7cFyAgF6QXICAXpKSkDhMTDqQOExMONyAXpBcgIBekFyDbpA4TEw6kDhMTDgHm/AMD/fz5Asz9NAABAAAAAQAA5GJ1b18PPPUACwQAAAAAANE8tJQAAAAA0Ty0lAAA/7YDnAO3AAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOcAAEAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAgAAAAOdAAADYgABAzIAAwAAAAAACgAUAB4BFgIOAswAAQAAAAcAugAPAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABAAAAABAAAAAAACAA4ATgABAAAAAAADABAAJgABAAAAAAAEABAAXAABAAAAAAAFABYAEAABAAAAAAAGAAgANgABAAAAAAAKADQAbAADAAEECQABABAAAAADAAEECQACAA4ATgADAAEECQADABAAJgADAAEECQAEABAAXAADAAEECQAFABYAEAADAAEECQAGABAAPgADAAEECQAKADQAbAByAGEAaQBuAHQAYQBuAGsAVgBlAHIAcwBpAG8AbgAgADEALgAwAHIAYQBpAG4AdABhAG4Aa3JhaW50YW5rAHIAYQBpAG4AdABhAG4AawBSAGUAZwB1AGwAYQByAHIAYQBpAG4AdABhAG4AawBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:normal;font-style:normal}.gf-icon{display:inline-block;font:normal normal normal 14px/1 'raintank';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gf-icon-snap-multi:before{content:"\e600"}.gf-icon-snap-single-tilt:before{content:"\e601"}.gf-icon-snap-single:before{content:"\e602"}.row-control-inner{padding:0;margin:0;position:relative}.hide-controls{padding:0}.hide-controls .row-tab{display:none}.hide-controls .add-row-panel-hint{display:none}.playlist-active .grafana-menu-zoom-out,.playlist-active .add-row-panel-hint,.playlist-active .grafana-menu-refresh,.playlist-active .top-nav-dashboards-btn,.playlist-active .top-nav-dash-actions{display:none}.playlist-active .grafana-menu-stop-playlist{display:list-item}.row-button{width:24px}.modal{max-width:800px;left:0;right:0;margin-left:auto;margin-right:auto;top:20%}.dashboard-fullscreen .main-view-container{overflow:hidden;height:0;padding:0}.dashboard-fullscreen .main-view-container .row-control-inner{display:none}.histogram-chart{position:relative}.scrollable{max-height:300px;overflow:auto}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar:hover{height:8px}::-webkit-scrollbar-button:start:decrement,::-webkit-scrollbar-button:end:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement{display:none}::-webkit-scrollbar-button:horizontal:increment{display:none}::-webkit-scrollbar-button:vertical:decrement{display:none}::-webkit-scrollbar-button:vertical:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement:active{background-image:none}::-webkit-scrollbar-button:horizontal:increment:active{background-image:none}::-webkit-scrollbar-button:vertical:decrement:active{background-image:none}::-webkit-scrollbar-button:vertical:increment:active{background-image:none}::-webkit-scrollbar-track-piece{background-color:transparent}::-webkit-scrollbar-thumb:vertical{height:50px;background:-webkit-gradient(linear,left top,right top,color-stop(0%,#f9f9f9),color-stop(100%,#f9f9f9));border:1px solid #999;border-top:1px solid #999;border-left:1px solid #999}::-webkit-scrollbar-thumb:horizontal{width:50px;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#f9f9f9),color-stop(100%,#f9f9f9));border:1px solid #999;border-top:1px solid #999;border-left:1px solid #999}.sp-replacer{background:inherit;border:0;color:inherit;padding:0}.sp-replacer:hover,.sp-replacer.sp-active{border-color:inherit;color:inherit}.sp-container{border-radius:0;background-color:#f9f9f9;border:0;padding:0}.sp-palette-container,.sp-picker-container{border:0}.sp-dd{display:none}.sp-preview{position:relative;width:15px;height:15px;border:0;margin-right:5px;float:left;z-index:0}.datapoints-warning{pointer:none;position:absolute;top:50%;left:50%;z-index:10;margin-top:-50px;margin-left:-100px;width:200px;text-align:center;cursor:auto;padding:10px}.metrics-editor-help:hover .hide{display:block}.grafana-tooltip{position:absolute;top:-1000;left:0;color:#c8c8c8;padding:10px;font-size:11pt;font-weight:200;background-color:#3a3939;border-radius:5px;z-index:9999;max-width:800px;max-height:600px;overflow:hidden;line-height:14px}.grafana-tooltip a{color:#e3e3e3}.grafana-tooltip hr{padding:2px;color:#c8c8c8;margin:0;border-bottom:0 solid #c8c8c8}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip-inner{max-width:400px}.grafana-version-info{position:absolute;bottom:2px;left:3px;font-size:80%;color:#161616}.grafana-version-info a{color:#161616}.template-variable{color:#2ab2e4}.grafana-info-box:before{content:"\f05a";font-family:'FontAwesome';position:absolute;top:-8px;left:-8px;font-size:20px;color:#2ab2e4}.grafana-info-box{position:relative;padding:5px 15px;background-color:#efefef;border:1px solid #ddd}.grafana-info-box h5{margin-top:5px}.grafana-tip{padding-left:5px}.shortcut-table td{padding:3px}.shortcut-table th:last-child{text-align:left}.shortcut-table td:first-child{text-align:right}.confirm-modal{border:1px solid #e2e2e2;max-width:500px;background-color:#fff;text-align:center}.confirm-modal .modal-close{float:right;font-size:140%;padding:10px}.confirm-modal .confirm-modal-icon{padding-top:41px;font-size:280%;color:#28b62c;padding-bottom:20px}.confirm-modal .confirm-modal-title{font-size:18px;color:#555;margin-bottom:15px}.confirm-modal .confirm-modal-text{font-size:16px}.confirm-modal .confirm-modal-buttons{margin-top:35px;margin-bottom:35px}.confirm-modal .confirm-modal-buttons button{margin-right:5px}.share-snapshot{text-align:center}.share-snapshot .gf-icon-snap-multi{font-size:70px}.share-snapshot .fa-spinner{font-size:70px}.share-snapshot .share-snapshot-info-text{margin:10px 105px}.share-snapshot .share-snapshot-info-text strong{color:#222;font-weight:bold}.share-snapshot .share-snapshot-header{margin:20px 0 22px 0}.share-snapshot .tight-form{text-align:left}.share-snapshot .share-snapshot-link{max-width:716px;white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}
\ No newline at end of file
diff --git a/public/css/grafana.dark.min.css b/public/css/grafana.dark.min.css
index d1508e2b144..e2fd7312195 100644
--- a/public/css/grafana.dark.min.css
+++ b/public/css/grafana.dark.min.css
@@ -949,7 +949,7 @@ See http://bgrins.github.io/spectrum/themes/ for instructions.
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world by @mdo and @fat.
- */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.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}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{max-width:100%;width:auto\9;height:auto;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"]{-webkit-appearance:button;cursor:pointer}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{*{text-shadow:none!important;color:#000!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}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#bbbfc2;background-color:#161616}a{color:#e3e3e3;text-decoration:none}a:hover,a:focus{color:#fff;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;content:"";line-height:0}.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;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%}.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;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0}.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:#adafae}a.muted:hover,a.muted:focus{color:#939695}.text-warning{color:#a47e3c}a.text-warning:hover,a.text-warning:focus{color:#7f612e}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#005f81}a.text-info:hover,a.text-info:focus{color:#00394e}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:#fff;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#adafae}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 #bbbfc2}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;*display:inline;*zoom:1;padding-left:5px;padding-right: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;content:"";line-height:0}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #262626;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #adafae}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #bbbfc2}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#adafae}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #bbbfc2;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:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#262626;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap}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:3px;-moz-border-radius:3px;border-radius:3px}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:#262626;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#adafae}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:#000;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;vertical-align:middle}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:#333;border:1px solid #333;-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,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;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;border:1px solid #333;background-color:#333}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:#adafae;background-color:#303030;border-color:#333;-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);cursor:not-allowed}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#788086}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#788086}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#788086}.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;content:"";line-height:0}.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:#555}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:#a47e3c}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#a47e3c}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#a47e3c;-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:#7f612e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#a47e3c;background-color:#f80;border-color:#a47e3c}.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:#bbbfc2;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:#bbbfc2;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#005f81}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#005f81}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#005f81;-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:#00394e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #00aae7;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #00aae7;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #00aae7}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#005f81;background-color:#bbbfc2;border-color:#005f81}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:transparent;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#e3e5e6}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;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,.input-append .popover,.input-prepend .popover{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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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:#bbbfc2;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:#bf3;border-color:#690}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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;*zoom:1;margin-bottom:0;vertical-align:middle}.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;content:"";line-height:0}.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 #262626}.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 #262626}.table .table{background-color:#161616}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #262626;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.table-bordered th,.table-bordered td{border-left:1px solid #262626}.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,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius: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:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.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:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:rgba(100,100,100,0.3)}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#262626}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:#bbbfc2}.table tbody tr.error>td{background-color:#bbbfc2}.table tbody tr.warning>td{background-color:#f80}.table tbody tr.info>td{background-color:#bbbfc2}.table-hover tbody tr.success:hover>td{background-color:#aeb2b6}.table-hover tbody tr.error:hover>td{background-color:#aeb2b6}.table-hover tbody tr.warning:hover>td{background-color:#e67a00}.table-hover tbody tr.info:hover>td{background-color:#aeb2b6}.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:#262626;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:transparent;border-bottom:1px solid #444}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#bbbfc2;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#fff;background-color:#005777;background-image:-moz-linear-gradient(top,#005f81,#004c68);background-image:-webkit-gradient(linear,0 0,0 100%,from(#005f81),to(#004c68));background-image:-webkit-linear-gradient(top,#005f81,#004c68);background-image:-o-linear-gradient(top,#005f81,#004c68);background-image:linear-gradient(to bottom,#005f81,#004c68);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f81',endColorstr='#ff004c68',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#005777;background-image:-moz-linear-gradient(top,#005f81,#004c68);background-image:-webkit-gradient(linear,0 0,0 100%,from(#005f81),to(#004c68));background-image:-webkit-linear-gradient(top,#005f81,#004c68);background-image:-o-linear-gradient(top,#005f81,#004c68);background-image:linear-gradient(to bottom,#005f81,#004c68);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f81',endColorstr='#ff004c68',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#adafae}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #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;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#000;margin-top:5px;margin-right:-10px}.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-left:20px;padding-right:20px}.typeahead{z-index:1051;margin-top:2px;-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,.close:focus{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;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#262626;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#4d4e4d;background-image:-moz-linear-gradient(top,#262626,#868988);background-image:-webkit-gradient(linear,0 0,0 100%,from(#262626),to(#868988));background-image:-webkit-linear-gradient(top,#262626,#868988);background-image:-o-linear-gradient(top,#262626,#868988);background-image:linear-gradient(to bottom,#262626,#868988);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff262626',endColorstr='#ff868988',GradientType=0);border-color:#868988 #868988 #606362;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#868988;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#262626;background-color:#868988;*background-color:#797d7b}.btn:active,.btn.active{background-color:#6d706e \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#262626;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,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(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:4px;-moz-border-radius:4px;border-radius:4px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.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:2px;-moz-border-radius:2px;border-radius:2px}.btn-block{display:block;width:100%;padding-left:0;padding-right: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-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006e95;background-image:-moz-linear-gradient(top,#005f81,#0085b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#005f81),to(#0085b4));background-image:-webkit-linear-gradient(top,#005f81,#0085b4);background-image:-o-linear-gradient(top,#005f81,#0085b4);background-image:linear-gradient(to bottom,#005f81,#0085b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f81',endColorstr='#ff0085b4',GradientType=0);border-color:#0085b4 #0085b4 #004c67;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#0085b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#0085b4;*background-color:#00729b}.btn-primary:active,.btn-primary.active{background-color:#005f81 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f58a0f;background-image:-moz-linear-gradient(top,#ff941a,#e67a00);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff941a),to(#e67a00));background-image:-webkit-linear-gradient(top,#ff941a,#e67a00);background-image:-o-linear-gradient(top,#ff941a,#e67a00);background-image:linear-gradient(to bottom,#ff941a,#e67a00);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff941a',endColorstr='#ffe67a00',GradientType=0);border-color:#e67a00 #e67a00 #995200;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e67a00;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#e67a00;*background-color:#cc6d00}.btn-warning:active,.btn-warning.active{background-color:#b35f00 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#d13a00;background-image:-moz-linear-gradient(top,#e64000,#b33200);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e64000),to(#b33200));background-image:-webkit-linear-gradient(top,#e64000,#b33200);background-image:-o-linear-gradient(top,#e64000,#b33200);background-image:linear-gradient(to bottom,#e64000,#b33200);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe64000',endColorstr='#ffb33200',GradientType=0);border-color:#b33200 #b33200 #661d00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#b33200;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#b33200;*background-color:#992b00}.btn-danger:active,.btn-danger.active{background-color:#802400 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#699e00;background-image:-moz-linear-gradient(top,#77b300,#558000);background-image:-webkit-gradient(linear,0 0,0 100%,from(#77b300),to(#558000));background-image:-webkit-linear-gradient(top,#77b300,#558000);background-image:-o-linear-gradient(top,#77b300,#558000);background-image:linear-gradient(to bottom,#77b300,#558000);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff77b300',endColorstr='#ff558000',GradientType=0);border-color:#558000 #558000 #230;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#558000;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#558000;*background-color:#460}.btn-success:active,.btn-success.active{background-color:#334d00 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#993dc7;background-image:-moz-linear-gradient(top,#a347d1,#8a2eb8);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a347d1),to(#8a2eb8));background-image:-webkit-linear-gradient(top,#a347d1,#8a2eb8);background-image:-o-linear-gradient(top,#a347d1,#8a2eb8);background-image:linear-gradient(to bottom,#a347d1,#8a2eb8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa347d1',endColorstr='#ff8a2eb8',GradientType=0);border-color:#8a2eb8 #8a2eb8 #5c1f7a;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#8a2eb8;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#8a2eb8;*background-color:#7a29a3}.btn-info:active,.btn-info.active{background-color:#6b248f \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#2b2b2b;background-image:-moz-linear-gradient(top,#262626,#333);background-image:-webkit-gradient(linear,0 0,0 100%,from(#262626),to(#333));background-image:-webkit-linear-gradient(top,#262626,#333);background-image:-o-linear-gradient(top,#262626,#333);background-image:linear-gradient(to bottom,#262626,#333);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff262626',endColorstr='#ff333333',GradientType=0);border-color:#333 #333 #0d0d0d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#333;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#333;*background-color:#262626}.btn-inverse:active,.btn-inverse.active{background-color:#191919 \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{border-color:transparent;cursor:pointer;color:#e3e3e3;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#fff;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#262626;text-decoration:none}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#f80;border:1px solid transparent;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.alert,.alert h4{color:#a47e3c}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#bbbfc2;border-color:#aeb4b6;color:#468847}.alert-success h4{color:#468847}.alert-danger,.alert-error{background-color:#bbbfc2;border-color:#b3b9bb;color:#b94a48}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{background-color:#bbbfc2;border-color:#a8afb1;color:#005f81}.alert-info h4{color:#005f81}.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-left:0;margin-bottom:20px;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#bbbfc2}.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:#adafae;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-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,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#e3e3e3}.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;content:"";line-height:0}.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,.nav-tabs>li>a:focus{border-color:#bbbfc2 #bbbfc2 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#bbb;background-color:#161616;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.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,.nav-pills>.active>a:focus{color:#fff;background-color:#e3e3e3}.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;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2}.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{border-top-color:#e3e3e3;border-bottom-color:#e3e3e3;margin-top:6px}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.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:#bbb;border-bottom-color:#bbb}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#adafae;border-color:#adafae}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#adafae}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0}.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,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{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,.tabs-left>.nav-tabs>li>a:focus{border-color:#bbbfc2 #ddd #bbbfc2 #bbbfc2}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{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,.tabs-right>.nav-tabs>li>a:focus{border-color:#bbbfc2 #bbbfc2 #bbbfc2 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#adafae}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default}.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2}.navbar-inner{min-height:52px;padding-left:20px;padding-right:20px;background-color:#1f1f1f;background-image:-moz-linear-gradient(top,#1f1f1f,#1f1f1f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1f1f1f),to(#1f1f1f));background-image:-webkit-linear-gradient(top,#1f1f1f,#1f1f1f);background-image:-o-linear-gradient(top,#1f1f1f,#1f1f1f);background-image:linear-gradient(to bottom,#1f1f1f,#1f1f1f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1f1f1f',endColorstr='#ff1f1f1f',GradientType=0);border:1px solid none;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-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);*zoom:1}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{float:left;display:block;padding:16px 20px 16px;margin-left:-20px;font-size:20px;font-weight:200;color:#e3e3e3;text-shadow:0 1px 0 #1f1f1f}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:52px;color:#adafae}.navbar-link{color:#adafae}.navbar-link:hover,.navbar-link:focus{color:#fff}.navbar .divider-vertical{height:52px;margin:0 9px;border-left:1px solid #1f1f1f;border-right:1px solid #1f1f1f}.navbar .btn,.navbar .btn-group{margin-top:11px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:11px}.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:11px;margin-bottom:0}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;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-left:0;padding-right: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,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(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:16px 15px 16px;color:#adafae;text-decoration:none;text-shadow:0 1px 0 #1f1f1f}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#fff;text-decoration:none}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:#1f1f1f;-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-left:5px;margin-right:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#121212;background-image:-moz-linear-gradient(top,#121212,#121212);background-image:-webkit-gradient(linear,0 0,0 100%,from(#121212),to(#121212));background-image:-webkit-linear-gradient(top,#121212,#121212);background-image:-o-linear-gradient(top,#121212,#121212);background-image:linear-gradient(to bottom,#121212,#121212);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff121212',endColorstr='#ff121212',GradientType=0);border-color:#121212 #121212 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#121212;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#121212;*background-color:#050505}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#000 \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{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:9px}.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #262626;position:absolute;top:-6px;left:10px}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0;bottom:-7px;top:auto}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #262626;border-bottom:0;bottom:-6px;top:auto}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#1f1f1f;color:#fff}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#adafae;border-bottom-color:#adafae}.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:#fff;border-bottom-color:#fff}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-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:#252a30;background-image:-moz-linear-gradient(top,#252a30,#252a30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#252a30),to(#252a30));background-image:-webkit-linear-gradient(top,#252a30,#252a30);background-image:-o-linear-gradient(top,#252a30,#252a30);background-image:linear-gradient(to bottom,#252a30,#252a30);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff252a30',endColorstr='#ff252a30',GradientType=0);border-color:transparent}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#adafae;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#adafae}.navbar-inverse .navbar-text{color:#adafae}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:#242a31;color:#fff}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#242a31}.navbar-inverse .navbar-link{color:#adafae}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-left-color:#252a30;border-right-color:#252a30}.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{background-color:#242a31;color:#fff}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#adafae;border-bottom-color:#adafae}.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:#5d6978;border-color:#252a30;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#262626;text-shadow:0 1px 0 #fff;background-color:#fff;border: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);outline:0}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#1a1d22;background-image:-moz-linear-gradient(top,#1a1d22,#1a1d22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1a1d22),to(#1a1d22));background-image:-webkit-linear-gradient(top,#1a1d22,#1a1d22);background-image:-o-linear-gradient(top,#1a1d22,#1a1d22);background-image:linear-gradient(to bottom,#1a1d22,#1a1d22);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1a1d22',endColorstr='#ff1a1d22',GradientType=0);border-color:#1a1d22 #1a1d22 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#1a1d22;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#1a1d22;*background-color:#0f1113}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#040405 \9}.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:.7;filter:alpha(opacity=70)}.modal{position:fixed;z-index:1050;width:100%;background-color:#fff;-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;outline:0}.modal.fade{-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;top:-25%}.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;overflow-y:auto;padding:15px}.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-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;*zoom:1}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#3a3939;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#3a3939}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#3a3939}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#3a3939}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#3a3939}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#262626;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#262626;border-bottom:1px solid #191919;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#262626}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#262626}.popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#262626}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#262626;bottom:-10px}.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;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#adafae}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{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:#f80}.label-warning[href],.badge-warning[href]{background-color:#cc6d00}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#005f81}.label-info[href],.badge-info[href]{background-color:#00394e}.label-inverse,.badge-inverse{background-color:#262626}.label-inverse[href],.badge-inverse[href]{background-color:#0c0c0c}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}label,input,button,select,textarea,.navbar .search-query:-moz-placeholder,.navbar .search-query::-webkit-input-placeholder{font-family:'Droid Sans',sans-serif;color:#bbb}blockquote{border-left:5px solid #262626}blockquote.pull-right{border-right:5px solid #262626}html{height:100%}body{height:100%;background:#161616}.page-header{border-bottom:1px solid #262626}hr{border-bottom:0}.navbar .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .brand{padding:0 15px;color:#e3e3e3;font-weight:normal;text-shadow:none}.navbar .nav>li>a{padding:15px 15px 14px;border-bottom:1px solid transparent}.navbar .nav>li>a:hover,.navbar .nav>.active>a,.navbar .nav>.active>a:hover{border-bottom:1px solid #33b5e5}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .navbar-text{margin-bottom:1px;padding:15px 15px 14px;line-height:inherit}.navbar .divider-vertical{margin:0;border-left:1px solid #262626;border-right-width:0}.navbar .search-query,.navbar .search-query:focus,.navbar .search-query.focused{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;background-color:#262626;line-height:normal;color:#adafae;text-shadow:none}.navbar .search-query:-moz-placeholder,.navbar .search-query:focus:-moz-placeholder,.navbar .search-query.focused:-moz-placeholder{color:#bbb}.navbar .search-query:-ms-input-placeholder,.navbar .search-query:focus:-ms-input-placeholder,.navbar .search-query.focused:-ms-input-placeholder{color:#bbb}.navbar .search-query::-webkit-input-placeholder,.navbar .search-query:focus::-webkit-input-placeholder,.navbar .search-query.focused::-webkit-input-placeholder{color:#bbb}@media(max-width:979px){.navbar .nav-collapse .nav li>a{border:0;color:#bbbfc2;font-weight:normal;text-shadow:none}.navbar .nav-collapse .nav li>a:hover{border:0;background-color:#33b5e5}.navbar .nav-collapse .nav .active>a{border:0;background-color:#33b5e5}.navbar .nav-collapse .dropdown-menu a:hover{background-color:#33b5e5}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border-top:0;border-bottom:0}.navbar .nav-collapse .nav-header{color:rgba(128,128,128,0.6)}.navbar-inverse .nav-collapse .nav li>a:hover{background-color:#111}.navbar-inverse .nav-collapse .nav .active>a{background-color:#111}.navbar-inverse .nav-collapse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav-collapse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav-collapse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111}}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}div.subnav{margin:0 1px;background-color:#1f1f1f;background-image:none;border:0;border-bottom:1px solid #262626}div.subnav .nav>li>a,div.subnav .nav>li:first-child>a,div.subnav .nav>li:first-child>a:hover{padding:11px 12px;border:0;background-color:#1f1f1f;color:#adafae}div.subnav .nav>li>a:hover,div.subnav .nav>li.active>a,div.subnav .nav>li.active>a:hover,div.subnav .nav>li:first-child>a:hover{padding:11px 12px;background:transparent;border:0;border-bottom:1px solid #33b5e5;color:#fff}div.subnav .nav li.nav-header{text-shadow:none}div.subnav-fixed{top:52px;margin:0}.nav-tabs{border-bottom:0}.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs li>a:hover,.nav-tabs li.active>a,.nav-tabs li.active>a:hover{border-color:transparent;background-color:transparent;border-bottom:2px solid #33b5e5;color:#fff}.nav-tabs li.disabled>a{color:#bbbfc2}.nav-tabs .open .dropdown-toggle{background-color:#060606;border-color:transparent}.nav-pills li>a:hover{background-color:#33b5e5;color:#fff}.nav-pills li.disabled>a{color:#bbbfc2}.nav-pills .open .dropdown-toggle{background-color:#060606}.nav-pills .dropdown-menu li>a:hover{border:0}.nav-list li>a{text-shadow:none}.nav-list li>a:hover{background-color:#33b5e5;color:#fff}.nav-list .nav-header{text-shadow:none}.nav-list .divider{background-color:transparent;border-bottom:1px solid #262626}.nav-stacked li>a{border:1px solid #262626!important}.nav-stacked li>a:hover,.nav-stacked li.active>a{background-color:#33b5e5;color:#fff}.tabbable .nav-tabs,.tabbable .nav-tabs li.active>a{border-color:#262626}.breadcrumb{background-color:transparent;background-image:none;border-width:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;font-size:14px}.breadcrumb li{text-shadow:none}.breadcrumb li>a{color:#33b5e5;text-shadow:none}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span,.pagination ul>.disabled>span:hover{background-color:rgba(0,0,0,0.2)}.pager li>a,.pager li>span{background-color:#161616;border:0}.pager li>a:hover,.pager li>span:hover{background-color:#33b5e5}.pager .disabled a,.pager .disabled a:hover{background-color:#161616}.btn{padding:5px 12px;background-image:none;-webkit-box-shadow:0 0 8px #161616;-moz-box-shadow:0 0 8px #161616;box-shadow:0 0 8px #161616;border:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-shadow:none}.btn.disabled{box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-inverse{border:1px solid #444}.btn-large{padding:14px 23px}.btn-small{padding:2px 10px}.btn-mini{padding:2px 6px}.btn-group>.btn:first-child,.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input,textarea,select{border-width:2px;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}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{color:#adafae}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly],.uneditable-input{border-color:#444}input:focus,textarea:focus,input.focused,textarea.focused{border-color:#52a8ec;outline:0;outline:thin dotted \9}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}legend,label{color:#bbbfc2;border-bottom:0 solid #222}.form-actions{border-top:1px solid #222}.table{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.table tbody tr.success td{background-color:#690;color:#fff}.table tbody tr.error td{background-color:#cc3900;color:#fff}.table tbody tr.info td{background-color:#33b5e5;color:#fff}.alert,.alert .alert-heading,.alert-success,.alert-success .alert-heading,.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading,.alert-info,.alert-info .alert-heading{color:#fff;text-shadow:none;border:0}.label{color:#fff}.badge{border-radius:0;font-weight:200}.label,.alert{background-color:#888}.label:hover{background-color:#6e6e6e}.label-important,.alert-danger,.alert-error{background-color:#cc3900}.label-important:hover{background-color:#992b00}.label-warning{background-color:#cc6d00}.label-warning:hover{background-color:#995200}.label-success,.alert-success{background-color:#5c8a00}.label-success:hover{background-color:#3a5700}.label-info,.alert-info{background-color:#00394e}.label-info:hover{background-color:#00141b}a:hover{text-decoration:none}.well,.hero-unit{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.well,.hero-unit{border-top:solid 1px #333;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.8);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.8);box-shadow:0 2px 4px rgba(0,0,0,0.8)}.thumbnail{border-color:#262626}.progress{background-color:#060606;background-image:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.modal{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;border-top:solid 1px #333;background-color:#1f1f1f}.modal-header{border-bottom:1px solid #1f1f1f}.modal-footer{background-color:#1f1f1f;border-top:1px solid #1f1f1f;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.popover{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.popover-title{border-bottom:0;color:#fff}.footer{border-top:1px solid #262626}.caret{color:#bbbfc2}.dropdown-submenu>a:after{border-left-color:#bbbfc2}@media(max-width:767px){div.panel{width:100%!important;padding:0!important}}.container-fluid{padding-left:0;padding-right:0}.main-view-container{padding:5px 10px;width:100%;box-sizing:border-box}.bgNav{background:#1f1f1f}.bgPrimary{background:#005f81;color:rgba(255,255,255,0.9)}.bgInfo{background:#a347d1;color:rgba(255,255,255,0.9)}.bgSuccess{background:#77b300;color:rgba(255,255,255,0.9)}.bgWarning{background:#ff941a;color:rgba(255,255,255,0.9)}.bgDanger{background:#e64000;color:rgba(255,255,255,0.9)}.bgInverse{background:#262626;color:rgba(255,255,255,0.9)}code,pre{background-color:#bbbfc2}div.editor-row{vertical-align:top}div.editor-row div.section{margin-right:20px;vertical-align:top;display:inline-block}div.editor-option{vertical-align:top;display:inline-block;margin-right:10px}div.editor-option label{display:block}#events{font-size:12px}.version{font-size:85%}.legend{color:#000}div.fake-input{background-color:#333;border:1px solid #333;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;border-radius:3px 3px 3px 3px}hr.small{margin:5px 0}form input.ng-invalid{color:#b94a48}.editor-title{margin-right:10px;font-size:1.7em;font-weight:bold;text-transform:capitalize}.editor-title small{opacity:.5;font-size:.7em;font-weight:normal}.bordered{border:1px solid #262626}.table-unpadded th,.table-unpadded td{padding:0 2px}.spy{position:absolute;right:0;top:0}.navbar-inner{border-width:0}.grafana-row{margin-bottom:5px}.row-tab .dropdown-menu-right{top:0;left:33px}.row-tab-button{padding:0;cursor:pointer;vertical-align:middle;width:30px;height:30px;text-align:center;display:inline-block;line-height:30px}.row-button{width:30px;float:left;cursor:pointer;line-height:31px}.row-text{white-space:nowrap;text-transform:uppercase;font-weight:bold;font-size:.9em;text-align:center;line-height:31px;height:31px}.row-close{padding:0;margin:0;background:#1f1f1f;text-align:center}.row-close-buttons{position:absolute;left:0}.row-open{margin-top:5px;left:-34px;position:absolute;z-index:100;transition:.10s left;transition-delay:.10s;-webkit-transition-delay:.10s}.row-open:hover{left:-12px}.odd{background-color:rgba(100,100,100,0.3)}.nomargin{margin:0}[ng\:cloak],[ng-cloak],.ng-cloak{display:none!important}.table tbody+tbody{border-top:0}.ui-draggable-dragging{display:block;z-index:9999}.link{color:#e3e3e3;cursor:pointer}.link:hover{color:#fff}.pointer{cursor:pointer}.popover{max-width:480px}.tiny{font-size:50%}.smaller{font-size:70%}.small{font-size:85%}.large{font-size:120%}.strong{font-weight:bold}a{cursor:pointer}.normal{font-weight:normal}.light{font-weight:200}.input-smaller{width:75px}.string{color:#c8ccce}.number{color:#00729b}.boolean{color:#b78c43}.key{color:#c05c5a}.btn-active{background-color:#e6e6e6;background-image:none;box-shadow:0 2px 4px rgba(0,0,0,0.15) inset,0 1px 2px rgba(0,0,0,0.05);outline:0 none}.remove:hover{background-color:#b33200}.faded{opacity:.2}div.flot-text{color:#bbbfc2!important}.page-alert-list{z-index:8000;min-width:300px;max-width:300px;position:fixed;right:20px;top:56px}.page-alert-list .alert{color:#fff;padding-bottom:13px;position:relative}.page-alert-list .alert-close{position:absolute;top:-4px;right:-2px;width:19px;height:19px;padding:0;background:#bbbfc2;border-radius:50%;border:0;font-size:1.1rem;color:#1f1f1f}.page-alert-list .alert-title{font-weight:bold;padding-bottom:2px}.alert-warning{background-color:#f80;border-color:transparent;color:#a47e3c}.popover.topLeft{margin-top:-10px}.popover.topLeft .arrow{bottom:-10px;left:25%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#262626}.popover.topLeft .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.topRight{margin-top:-10px}.popover.topRight .arrow{bottom:-10px;left:75%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#262626}.popover.topRight .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.rightTop .arrow{top:10%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightTop .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#262626}.popover.rightBottom .arrow{top:90%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightBottom .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#262626}.popover.bottomLeft .arrow{left:10%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottomLeft .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#262626}.popover.bottomRight .arrow{left:90%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottomRight .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#262626}.popover.leftTop .arrow{top:10%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftTop .arrow:after{right:1px;border-right-width:0;border-left-color:#262626;bottom:-10px}.popover.leftBottom .arrow{top:90%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftBottom .arrow:after{right:1px;border-right-width:0;border-left-color:#262626;bottom:-10px}.popover.topLeft .arrow{left:10%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.topLeft .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#262626}.popover.topRight .arrow{left:90%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.topRight .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#262626}.typeahead{max-height:300px;overflow-y:auto}.label-tag{background-color:#93c;color:#f2f2f2;border-radius:2px;text-shadow:none;font-size:13px;padding:4px 6px}.label-tag .icon-tag{position:relative;top:1px;padding-right:4px}.label-tag:hover{opacity:.85;background-color:#7a29a3}.save-dashboard-dropdown{padding:10px}.save-dashboard-dropdown li>a{padding-left:5px}.save-dashboard-dropdown-save-form{margin-bottom:5px}.inspector-request-table td{padding:5px}.inspector-request-table td:first-child{white-space:nowrap}.modal-body{padding:0}code,pre{background-color:#1f1f1f;color:#bbbfc2}.login-form{width:50%;float:left;margin-left:25%;margin-right:25%;padding-top:50px}.login-box{width:700px;margin:100px auto 0 auto}.login-box-logo{text-align:center;padding-bottom:50px}.login-inner-box{background:#1f1f1f}.login-tab-header{background:#262626;text-align:center}.btn-login-tab{background:transparent;border:0;font-size:15px;padding:10px 10px;font-weight:bold;display:inline-block;width:170px;color:#bbbfc2}.btn-login-tab.active{background:#191919;color:#fff}.btn-login-tab:focus{outline:0}.password-strength{display:block;width:50px;overflow:visible;white-space:nowrap;padding-top:3px;margin-left:97px;color:#858c92;border-top:3px solid #cc3900}.password-strength.password-strength-ok{width:170px;border-top:3px solid #f0c942}.password-strength.password-strength-good{width:254px;border-top:3px solid #8c0}.login-submit-button-row{text-align:center;margin-top:40px}.login-submit-button-row button{padding:9px 7px;font-size:14px;font-weight:bold;width:150px;display:inline-block;border:1px solid #404040}.login-oauth{margin-top:30px;padding:10px;background:#262626}.login-oauth .btn-google{background:#dd4b39;color:white}.login-oauth .btn-github{background:#555;color:white}.submenu-controls-visible .panel-fullscreen{top:88px}.submenu-controls{margin:10px 10px 0 0;font-size:16px}.annotation-disabled,.annotation-disabled a{color:#707070}.annotation-segment label.cr1{margin-left:5px}.graph-canvas-wrapper{position:relative;cursor:crosshair}.graph-legend{margin:0 20px;text-align:center}.graph-legend .popover-content{padding:0}.graph-legend-icon{position:relative;padding-right:4px;top:1px}.graph-legend-icon,.graph-legend-alias,.graph-legend-value{float:left;white-space:nowrap;font-size:85%;text-align:left}.graph-legend-icon.current:before,.graph-legend-alias.current:before,.graph-legend-value.current:before{content:"Current: "}.graph-legend-icon.max:before,.graph-legend-alias.max:before,.graph-legend-value.max:before{content:"Max: "}.graph-legend-icon.min:before,.graph-legend-alias.min:before,.graph-legend-value.min:before{content:"Min: "}.graph-legend-icon.total:before,.graph-legend-alias.total:before,.graph-legend-value.total:before{content:"Total: "}.graph-legend-icon.avg:before,.graph-legend-alias.avg:before,.graph-legend-value.avg:before{content:"Avg: "}.graph-legend-icon .fa{font-size:135%;position:relative;top:1px}.graph-legend-series{float:left;white-space:nowrap;padding-left:10px;padding-top:6px}.graph-legend-value{padding-left:6px}.graph-legend-table{display:table;width:100%;margin:0}.graph-legend-table .graph-legend-series{display:table-row;float:none;padding-left:0}.graph-legend-table .graph-legend-series.pull-right{float:none}.graph-legend-table td,.graph-legend-table .graph-legend-alias,.graph-legend-table .graph-legend-icon,.graph-legend-table .graph-legend-value{float:none;display:table-cell;white-space:nowrap;padding:2px 10px;text-align:right;border-bottom:1px solid #000}.graph-legend-table .graph-legend-icon{width:5px;padding:0;top:0}.graph-legend-table .graph-legend-icon .fa{top:4px}.graph-legend-table .graph-legend-value{padding-left:15px}.graph-legend-table .graph-legend-alias{padding-left:7px;text-align:left;width:95%}.graph-legend-table .graph-legend-series:nth-child(odd){background-color:#242424}.graph-legend-table .graph-legend-value.current:before,.graph-legend-table .graph-legend-value.max:before,.graph-legend-table .graph-legend-value.min:before,.graph-legend-table .graph-legend-value.total:before,.graph-legend-table .graph-legend-value.avg:before{content:''}.graph-legend-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#33b5e5;font-size:85%;white-space:nowrap}.graph-legend-rightside.graph-wrapper{display:table;width:100%}.graph-legend-rightside .graph-canvas-wrapper{display:table-cell;width:100%;position:relative}.graph-legend-rightside .graph-legend-wrapper{display:table-cell;vertical-align:top;position:relative;left:4px}.graph-legend-rightside .graph-legend{margin:0}.graph-legend-rightside .graph-legend-series{display:block;padding-left:0}.graph-legend-rightside .graph-legend-table .graph-legend-series{display:table-row}.graph-legend-series-hidden a{color:#707070}.graph-legend-popover{width:200px}.graph-legend-popover label{display:inline-block}.graph-legend-popover .btn{padding:1px 3px;margin-right:0;line-height:initial}.graph-legend-popover .close{margin-right:5px;color:#e3e3e3;opacity:.7;text-shadow:none}.graph-legend-popover .editor-row{padding:5px}.annotation-tags{color:#93c}.graph-series-override input{float:left;margin-right:10px}.graph-series-override .graph-series-override-option{float:left;padding:2px 6px}.graph-series-override .graph-series-override-selector{float:left}.graph-tooltip{white-space:nowrap}.graph-tooltip .graph-tooltip-time{text-align:center;font-weight:bold;position:relative;top:-3px}.graph-tooltip .graph-tooltip-list-item{display:table-row}.graph-tooltip .graph-tooltip-series-name{display:table-cell}.graph-tooltip .graph-tooltip-value{display:table-cell;font-weight:bold;padding-left:10px;text-align:right}.left-yaxis-label{top:50%;left:-5px;transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);transform-origin:left top;-o-transform-origin:left top;-ms-transform-origin:left top;-moz-transform-origin:left top;-webkit-transform-origin:left top}.right-yaxis-label{top:50%;right:-5px;-webkit-transform:rotate(90deg);-webkit-transform-origin:right top;-moz-transform:rotate(90deg);-moz-transform-origin:right top;-ms-transform:rotate(90deg);-ms-transform-origin:right top;-o-transform:rotate(90deg);-o-transform-origin:right top;transform:rotate(90deg);transform-origin:right top}.axisLabel{color:#bbbfc2;font-size:11.9px;position:absolute;text-align:center;font-size:12px}.bootstrap-tagsinput{display:inline-block;padding:4px 6px;margin-bottom:10px;color:#555;vertical-align:middle;border-radius:4px;max-width:100%;line-height:22px;background-color:#333;border:1px solid #333;-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}.bootstrap-tagsinput input{border:0;box-shadow:none;outline:0;background-color:transparent;padding:0;padding-left:5px;margin:0;width:auto!important;max-width:inherit}.bootstrap-tagsinput input:focus{border:0;box-shadow:none}.bootstrap-tagsinput .tag{margin-right:2px;color:white}.bootstrap-tagsinput .tag [data-role="remove"]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role="remove"]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role="remove"]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.bootstrap-tagsinput .tag [data-role="remove"]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.grafana-options-table{width:100%}.grafana-options-table th{padding:5px 10px;border-bottom:4px solid #1f1f1f}.grafana-options-table tr td{background-color:#262626;padding:5px 10px;white-space:nowrap;border-bottom:4px solid #1f1f1f}.grafana-options-table tr td.nobg{background-color:transparent}.grafana-options-table .max-width-btns{padding-right:0}.grafana-options-table .max-width-btns .btn{box-sizing:border-box;width:100%}.max-width{overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap}.grafana-options-list{list-style:none;margin:0;max-width:450px}.grafana-options-list li:nth-child(odd){background-color:#242424}.grafana-options-list li{float:left;margin:2px;padding:5px 10px;border:1px solid #000}.grafana-options-list li:first-child{border:1px solid #000}.search-container{left:52px;top:33px;margin:15px;z-index:1000;position:absolute;width:700px;box-shadow:0 0 55px 0 black;padding:10px;background-color:#1f1f1f;border:1px solid #333}.search-container .label-tag{margin-left:6px;font-size:11px;padding:2px 6px}.search-field-wrapper{padding-bottom:10px}.search-field-wrapper input{width:100%;padding:18px 8px;box-sizing:border-box}.search-field-wrapper button{margin:0 4px 0 0}.search-field-wrapper>span{display:block;overflow:hidden}.search-results-container{height:450px;overflow:auto;display:block;line-height:28px}.search-results-container .search-result-item:hover,.search-results-container .search-result-item.selected{background-color:#333}.search-results-container .selected .search-result-tag{opacity:.70;color:white}.search-results-container .fa-star,.search-results-container .fa-star-o{padding-left:13px}.search-results-container .fa-star{color:#f80}.search-results-container .search-result-link{color:#bbbfc2}.search-results-container .search-result-link .fa{padding-right:10px}.search-results-container .search-result-item{display:block;padding:3px 10px;white-space:nowrap;background-color:#262626;margin-bottom:4px}.search-results-container .search-result-tags{float:right}.search-results-container .search-result-actions{float:right;padding-left:20px}.search-switches{position:absolute;top:19px;right:21px}.search-button-row{padding-top:20px}.search-button-row button,.search-button-row a{margin-right:10px}.panel{display:inline-block;float:left;vertical-align:top;position:relative}.panel-margin{margin:5px;display:block}.panel-container{background-color:#1f1f1f;position:relative;border:solid 1px #262626}.panel-container:hover .panel-actions{display:block}.panel-container.panel-transparent{background-color:transparent;border:0}.panel-content{padding:0 10px 5px 10px}.panel-title-container{min-height:5px;padding-top:4px;cursor:context-menu}.panel-title{border:0;font-weight:bold;position:relative;cursor:context-menu;width:100%;display:block}.panel-title.has-panel-links .panel-title-text:after{content:"\f08e";font-family:'FontAwesome';font-size:80%;padding-left:10px;position:relative;top:-1px}.panel-loading{position:absolute;top:-3px;right:0;z-index:800}.panel-header{text-align:center}.panel-error{color:#fff;position:absolute;left:0;padding:0 17px 6px 5px;top:0;z-index:10}.panel-error i{position:relative;top:-2px}.panel-error-arrow{width:0;height:0;position:absolute;border-left:31px solid transparent;border-right:30px solid transparent;border-bottom:27px solid #1f1f1f;left:0;bottom:0}.panel-fullscreen{z-index:100;display:block;position:fixed;left:0;right:0;top:60px;padding:0;overflow-y:auto;height:100%}.panel-fullscreen .dropdown-menu{margin-bottom:70px}.panel-fullscreen .panel-container{margin:15px}.panel-fullscreen .panel-menu{top:0}.panel-fullscreen .panel-title-container{padding:8px}.panel-full-edit{margin-top:30px;padding-bottom:130px}.panel-menu{z-index:500;position:absolute;background:#333;border:1px solid black;top:-62px}.panel-menu .panel-menu-row{white-space:nowrap;border-bottom:1px solid black}.panel-menu .panel-menu-row:last-child{border-bottom:0}.panel-menu .panel-menu-link,.panel-menu .panel-menu-icon{padding:5px 10px}.panel-menu .panel-menu-link{display:inline-block;border-right:1px solid black}.panel-menu .panel-menu-link:last-child{border:0}.panel-menu .dropdown-menu{text-align:left}.panel-highlight{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.on-drag-hover .panel-container{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.panel-drop-zone{display:none}.panel-drop-zone .panel-container{border:1px solid #262626}.panel-ghost{width:100%}.panel-ghost .panel-container{border:0;background:transparent}.panel-ghost .panel-ghost-list{margin:10px 0 10px 20px}.panel-ghost button{text-align:left;min-width:135px}.panel-ghost button .fa{position:relative;left:-5px}.panel-time-info{font-weight:bold;float:right;margin-right:15px;color:#33b5e5;font-size:85%;position:absolute;top:0;right:0}input[type=text].input-fluid{width:100%;box-sizing:border-box;padding:10px;font-size:16px;-moz-box-sizing:border-box;height:100%}input[type="checkbox"].cr1{display:none}label.cr1{display:inline-block;height:19px;clear:none;text-indent:2px;margin:0 0 1px 0;padding:0 0 0 20px;vertical-align:middle;background:url('../img/checkbox.png') left top no-repeat;cursor:pointer}input[type="checkbox"]:checked+label{background:url('../img/checkbox.png') 0 -18px no-repeat}.gf-form{padding-bottom:10px}.gf-form .checkbox-label{padding-left:7px;display:inline}.gf-fluid-input{border:0;display:block;overflow:hidden;padding-right:10px}.gf-fluid-input input[type=text]{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.gf-fluid-input textarea{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.singlestat-panel{position:relative;display:table;width:100%}.singlestat-panel-value-container{padding:20px;display:table-cell;vertical-align:middle;text-align:center;position:relative;z-index:1;font-size:3em;font-weight:bold}.singlestat-panel-prefix{padding-right:20px}.singlestat-panel-table{width:100%}.singlestat-panel-table td{padding:5px 10px;white-space:nowrap;text-align:right;border-bottom:1px solid #000}.singlestat-panel-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#33b5e5}.singlestat-panel-table td:first-child{text-align:left}.singlestat-panel-table tr:nth-child(odd) td{background-color:#242424}.singlestat-panel-table tr:last-child td{border:0}.tight-form{border-top:1px solid #000;border-left:1px solid #000;border-right:1px solid #000;background:#262626;width:100%}.tight-form:last-child,.tight-form.last{border-bottom:1px solid #000}.tight-form.borderless{background:transparent;border:0}.tight-form .checkbox-label{display:inline;padding-right:4px;margin-bottom:0}.spaced-form .tight-form{margin:7px 0}.borderless .tight-form-item,.borderless .tight-form-input{border:0}.tight-form-container .tight-form:last-child{border-bottom:0}.tight-form-container:last-child{border-bottom:1px solid #000}.tight-form-btn{padding:8px 12px}.tight-form-list{list-style:none;margin:0}.tight-form-list>li{float:left}.grafana-metric-options{margin-top:35px}.tight-form-item{padding:8px 7px;font-weight:normal;border-right:1px solid #050505;color:#c8c8c8;display:inline-block}.has-open-function .tight-form-item{padding-top:25px}.tight-form-disabled .tight-form-item{color:#888}.tight-form-item:hover,.tight-form-item:focus{text-decoration:none}.tight-form-itema:hover{background:#333}.tight-form-item.template-param-name{border-right:0;padding-right:0;padding-left:18px}.tight-form-item.annotation-segment{padding:8px 10px}.tight-form-item.last{border-right:0}.tight-form-item .fa-caret-down{font-size:75%;position:relative;top:1px}.tight-form-item-icon i{width:15px;text-align:center;display:inline-block}.tight-form-func{background:#333}.tight-form-func>a{color:#c8c8c8}.tight-form-func>a:hover{color:#e3e3e3}.tight-form-func.show-function-controls{padding-top:5px;min-width:100px;text-align:center}input[type=text].tight-form-func-param{background:transparent;border:0;margin:0;padding:0}input[type=text].tight-form-clear-input{padding:8px 7px;border:0;margin:0;background:transparent;float:left;color:#c8c8c8;border-radius:0;border-right:1px solid #050505}[type=text].tight-form-input,[type=email].tight-form-input,[type=number].tight-form-input,[type=password].tight-form-input{border:0;border-right:1px solid #050505;margin:0;border-radius:0;padding:8px 6px;height:100%;box-sizing:border-box}[type=text].tight-form-input.last,[type=email].tight-form-input.last,[type=number].tight-form-input.last,[type=password].tight-form-input.last{border-right:0}input[type=checkbox].tight-form-checkbox{margin:0}select.tight-form-input{border:0;border-right:1px solid #050505;margin:0;border-radius:0;height:36px;padding:8px 3px}select.tight-form-input.last{border-right:0}.tight-form-func-controls{display:none;text-align:center}.tight-form-func-controls .fa-arrow-left{float:left;position:relative;top:2px}.tight-form-func-controls .fa-arrow-right{float:right;position:relative;top:2px}.tight-form-func-controls .fa-remove{margin-left:10px}.tight-form-radio input[type=radio]{margin:0}.tight-form-radio label{display:inline}.sidemenu-canvas{position:relative}.sidemenu-wrapper{position:absolute;display:none;top:0;bottom:0;left:0;width:200px;background:#161616;min-height:100%;z-index:101}.sidemenu-wrapper a:focus{text-decoration:none}.sidemenu-open .sidemenu-wrapper{display:block}.sidemenu-open .search-container{left:200px}.sidemenu-open .main-view{padding-left:200px}.sidemenu-open .panel-fullscreen{left:200px}.sidemenu{font-size:16px;font-weight:400;list-style:none;margin:0;padding:0}.sidemenu>li{margin-bottom:9px}.sidemenu .fa-caret-down{position:relative;top:2px;font-size:90%}.sidemenu.sidemenu-small{font-size:14px}.sidemenu.sidemenu-small .icon-circle{border-radius:50%;background:#000;box-shadow:0 0 14px 2px rgba(255,255,255,0.05);border:1px solid transparent;width:28px;height:28px}.sidemenu.sidemenu-small .icon-circle i{top:1px;left:4px;font-size:110%}.sidemenu.sidemenu-small .sidemenu-item{line-height:28px;padding-left:25px}.sidemenu-item-text{width:110px;display:inline-block;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.sidemenu-top-btn{display:block;padding:8px 0 4px 22px;background-color:#1f1f1f;border-right:3px solid #161616}.sidemenu-top-btn img{border-radius:50%;background:#000;border:1px solid #161616;width:30px;padding:4px}.sidemenu-top-btn i{padding-right:5px;padding-top:5px;font-size:170%;color:#e3e3e3}.icon-circle{width:40px;height:40px;display:inline-block}.icon-circle i{color:#e3e3e3;opacity:.7;position:relative;left:7px;top:5px;font-size:150%}.sidemenu-item{color:#e3e3e3;line-height:40px;padding:0 10px 0 20px;display:block;white-space:nowrap}.sidemenu-item .sidemenu-item-text{padding-left:11px;transition:color 100ms ease-out}.sidemenu-item .sidemenu-item-text.no-icon{padding-left:59px}.sidemenu-item img{border-radius:50%;width:28px;height:28px;box-shadow:0 0 14px 2px rgba(255,255,255,0.05)}.sidemenu-system-section{background-color:#005f81;color:#fff;padding:3px 0;margin-left:10px;margin-right:10px;border-radius:2px}.sidemenu-system-section .sidemenu-system-section-inner{border:2px solid black;border-left:none;border-right:0;padding:4px;overflow:hidden}.sidemenu-system-section .fa{float:left;font-size:120%;line-height:41px;padding:0 15px}.sidemenu-section-tagline{font-style:italic;font-size:75%;line-height:10px}.sidemenu-section-text-wrapper{padding-top:4px}.navbar-inner{padding-left:0}.navbar .nav>li>a{padding:17px 15px 13px}.navbar .nav>li>a .fa{font-size:115%}.top-nav{float:left;font-size:16px}.fa.top-nav-breadcrumb-icon{margin:18px 0 6px 5px;float:left;font-size:120%;color:#bbbfc2}.top-nav-menu-btn{border:1px solid #161616;border-radius:50%;background:#000;display:block;position:relative;float:left;width:30px;height:30px;padding:4px;margin:6px 6px 3px 9px}.top-nav-menu-btn .fa{color:#bbbfc2;width:30px;height:30px;left:9px;top:7px;font-size:150%;opacity:0;position:absolute;transition:opacity .2s ease-in-out}.top-nav-menu-btn img{width:30px;position:absolute;opacity:1;transition:opacity .2s ease-in-out}.top-nav-menu-btn:hover .fa{opacity:.7}.top-nav-menu-btn:hover img{opacity:0}.top-nav-dashboards-btn{display:block;float:left;margin:9px 18px 5px 14px;border-radius:3px;font-size:1.4em;color:#a2a2a2;border:solid 1px #555}.top-nav-dashboards-btn a{display:inline-block;background:#333;padding:5px 15px 5px 10px;border-radius:3px;color:#a2a2a2}.top-nav-dashboards-btn a:hover{background:#444}.top-nav-dashboards-btn a:hover .fa{color:#e3e3e3}.top-nav-dashboards-btn .fa-th-large{position:relative;top:2px}.top-nav-dashboards-btn .fa-caret-down{font-size:60%;position:relative;top:4px}.dashboard-title{padding:0 6px 5px 5px;color:#fff;font-size:17px}.top-nav-icon{margin:5px 0 0 11px;line-height:41px;float:left}.top-nav-section{display:block;float:left;padding:19px 9px 8px 0;font-weight:bold}.top-nav-section i{padding-left:8px}.top-nav-title{display:block;float:left;font-size:17px;padding:18px 10px 10px 13px;color:#e3e3e3}.top-nav-snapshot-title{display:block;float:left;font-size:1.4em;margin:9px 18px 5px 14px;color:#e3e3e3}.top-nav-snapshot-title .gf-icon{position:relative;top:3px;font-size:27px}.top-nav-snapshot-title a{display:inline-block;padding:0 15px 5px 10px}.gf-box{margin:15px;background-color:#1f1f1f;position:relative;border:1px solid #333}.gf-box-no-margin{margin:0}.gf-box-header-close-btn{float:right;padding:0;margin:0;background-color:transparent;border:0;padding:8px;font-size:120%;color:#bbbfc2}.gf-box-header-close-btn:hover{color:#fff}.gf-box-body{padding:20px;min-height:150px}.gf-box-footer{overflow:hidden}.gf-box-header{border-bottom:1px solid #333;overflow:hidden;background-color:#262626}.gf-box-header .tabs{float:left}.gf-box-header .nav{margin:0}.gf-box-title{padding-right:20px;padding-left:10px;float:left;color:#e3e3e3;font-size:18px;font-weight:normal;line-height:38px;margin:0}.gf-box-title .fa{padding:0 8px 0 5px;color:#bbbfc2}.page-container{margin:15px;background:#1f1f1f;position:relative;border:1px solid #262626;padding:20px 20px 60px 49px}.page-container h2{color:#bbbfc2;font-weight:normal;font-size:22px}.page{max-width:653px}.admin-page{max-width:800px;margin-left:10px}.admin-page .gf-box{margin-top:0}.admin-page .gf-box-body{min-height:0}.admin-page h2{margin-left:15px;margin-bottom:0;font-size:17.5px;color:#bbbfc2}.admin-page h2 i{padding-right:6px}.dashlist-link{display:block;margin:5px;padding:7px;background-color:#262626;border:1px solid #000}.dashlist-link .fa{float:right;padding-top:3px}.dashlist-link .fa-star{color:#f80}.dashlist-link:hover{background-color:#333}.admin-settings-section{color:#32d1df;font-weight:bold}td.admin-settings-key{padding-left:20px}input[type=text].ng-dirty.ng-invalid{box-shadow:inset 0 0 7px #cc3900}@font-face{font-family:'raintank';src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SAywAAAC8AAAAYGNtYXAaVcxZAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zm7/N1QAAAFwAAAFmGhlYWQFNK2SAAAHCAAAADZoaGVhB14DyAAAB0AAAAAkaG10eAwxAAQAAAdkAAAAHGxvY2ECNgP2AAAHgAAAABBtYXhwABcAvAAAB5AAAAAgbmFtZflvA+cAAAewAAABTnBvc3QAAwAAAAAJAAAAACAAAwQAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADmAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIOYC//3//wAAAAAAIOYA//3//wAB/+MaBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAADwAA/7YDnAO3AAMAHQAhACUAKgAuADEAQgBTAGQAdQCGAJcAqAC5AAA3FyUnJTUTJzUjJwcjJwcjFQcTBxcVIQ0BNzM1NycTAxEXJTkCByERIREHFSc3NzEzAxQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwE2FhUHNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATYWFXsKAS9VAbOKkFsDmDvbEZhXTjY/Alj+wQFGGT4mIU5TU/3CmgJU/awxICDLAWUbE40TGxsTjRMbLo0LERELjQwQEAzQHBONExsbE40UG9cQC40MEBAMjQsQ7BsTjRMbGxONExvXEAuNDBAQDIwMEAEbjRMbGxONFBsbFKgQC40MEBAMjQsQDkMvFvQEAfYoVRcXPDxGDf4JwhFKBFpdHAbPAdn+zwFIF54x/ZsCZUbPygV3/s4TGxsTjBQbHBOMqRAMjQsQEAuMDBEdjBQbHBOMFBsbFIwMEBAMjAwQAREM+RQbHBONExscEo2MjAwQEAyNCxARCy4bE4wUGxwTjRIbuo0LEBALjQwQAREMAAoAAf+5A2IDtQAQACEAMgBDAFQAZQB2AIcAkACVAAATHgE/AT4BLwEuAQ8BDgEfAT8BNhYfARYGDwEGJi8BJjY3NxceAT8BPgEvAS4BDwEOARc3FxYGDwEGJi8BJjY/ATYWFwMuAQ8BDgEfAR4BPwE+AS8BBycmNj8BNhYfARYGDwEGJicFNz4BLwEuAQ8BDgEfAR4BNzcXFgYPAQYmLwEmNj8BNhYXARMfASUvAQMFEwMlEwWdAyAVkhUYAxcDIRSTFBgDFxWTDBQBFwIODZIMFAIXAg8M3hcDIRSSFBgDFwMgFZIUGAPgFwIPDJIMFAIWAg4MkgwUAs4DIRSTFBgDFwMgFZIVGAMXyhcCDwyTDBQBFwIODZIMFAIBL5IUGAMXAyAVkhQYAxcDIRSRFwIPDJIMFAIXAg8MkgwUAv1pahUNAtUNFWv9LJ9jAmxj/ZQCFxQYAxYEIBWSFRgDFwMhFJO3FwIPDJIMFAIXAg8MkwwUAQWTFBgDFgMhFJMUGAMWAyEUIpINEwIXAg8MkwwUAhYCDg3+1xQYAxcDIRSTFBgDFwMhFJO2kwwUAhYCDgyTDBQCFgIPCwMXAyEUkxQYAxcDIBWSFBkD35MMFAIWAg4NkgwUAhYCDgwBU/1PilFwUokCsXD9VwJ9YP2DYAAKAAP/twMyA7QAEAAhADIAQwBUAGUAdgCHAIwAkQAAExQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwEyFhUBNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATIWFQERIREhExEhESF7IBelFx8fF6UXIDelDhITDaUOExQN9CAXpBcgIBekFyD8Ew2lDhMUDaQOE/7rHxelFyAgF6UXH/wUDaUOEhMNpQ0UAUykFyAgF6QXICAXxRMNpQ4TFA2kDhP9YQMv/NE7Arr9RgJOFyAgF6QXICAXpMUTDqQOExMOpA4TIaQXICAXpBcgIBekDhMTDqQOExMO/twXICAXpBcgIBekpKQOExMOpA4TEw43IBekFyAgF6QXINukDhMTDqQOExMOAeb8AwP9/PkCzP00AAEAAAABAADkYnVvXw889QALBAAAAAAA0Ty0lAAAAADRPLSUAAD/tgOcA7cAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAA5wAAQAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAACAAAAA50AAANiAAEDMgADAAAAAAAKABQAHgEWAg4CzAABAAAABwC6AA8AAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEAEAAAAAEAAAAAAAIADgBOAAEAAAAAAAMAEAAmAAEAAAAAAAQAEABcAAEAAAAAAAUAFgAQAAEAAAAAAAYACAA2AAEAAAAAAAoANABsAAMAAQQJAAEAEAAAAAMAAQQJAAIADgBOAAMAAQQJAAMAEAAmAAMAAQQJAAQAEABcAAMAAQQJAAUAFgAQAAMAAQQJAAYAEAA+AAMAAQQJAAoANABsAHIAYQBpAG4AdABhAG4AawBWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBhAGkAbgB0AGEAbgBrcmFpbnRhbmsAcgBhAGkAbgB0AGEAbgBrAFIAZQBnAHUAbABhAHIAcgBhAGkAbgB0AGEAbgBrAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAlsAAsAAAAACSAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIDLGNtYXAAAAFoAAAATAAAAEwaVcxZZ2FzcAAAAbQAAAAIAAAACAAAABBnbHlmAAABvAAABZgAAAWYbv83VGhlYWQAAAdUAAAANgAAADYFNK2SaGhlYQAAB4wAAAAkAAAAJAdeA8hobXR4AAAHsAAAABwAAAAcDDEABGxvY2EAAAfMAAAAEAAAABACNgP2bWF4cAAAB9wAAAAgAAAAIAAXALxuYW1lAAAH/AAAAU4AAAFO+W8D53Bvc3QAAAlMAAAAIAAAACAAAwAAAAMEAAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA5gIDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDmAv/9//8AAAAAACDmAP/9//8AAf/jGgQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAA8AAP+2A5wDtwADAB0AIQAlACoALgAxAEIAUwBkAHUAhgCXAKgAuQAANxclJyU1Eyc1IycHIycHIxUHEwcXFSENATczNTcnEwMRFyU5AgchESERBxUnNzcxMwMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBNhYVBzQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwE2FhV7CgEvVQGzipBbA5g72xGYV042PwJY/sEBRhk+JiFOU1P9wpoCVP2sMSAgywFlGxONExsbE40TGy6NCxERC40MEBAM0BwTjRMbGxONFBvXEAuNDBAQDI0LEOwbE40TGxsTjRMb1xALjQwQEAyMDBABG40TGxsTjRQbGxSoEAuNDBAQDI0LEA5DLxb0BAH2KFUXFzw8Rg3+CcIRSgRaXRwGzwHZ/s8BSBeeMf2bAmVGz8oFd/7OExsbE4wUGxwTjKkQDI0LEBALjAwRHYwUGxwTjBQbGxSMDBAQDIwMEAERDPkUGxwTjRMbHBKNjIwMEBAMjQsQEQsuGxOMFBscE40SG7qNCxAQC40MEAERDAAKAAH/uQNiA7UAEAAhADIAQwBUAGUAdgCHAJAAlQAAEx4BPwE+AS8BLgEPAQ4BHwE/ATYWHwEWBg8BBiYvASY2NzcXHgE/AT4BLwEuAQ8BDgEXNxcWBg8BBiYvASY2PwE2FhcDLgEPAQ4BHwEeAT8BPgEvAQcnJjY/ATYWHwEWBg8BBiYnBTc+AS8BLgEPAQ4BHwEeATc3FxYGDwEGJi8BJjY/ATYWFwETHwElLwEDBRMDJRMFnQMgFZIVGAMXAyEUkxQYAxcVkwwUARcCDg2SDBQCFwIPDN4XAyEUkhQYAxcDIBWSFBgD4BcCDwySDBQCFgIODJIMFALOAyEUkxQYAxcDIBWSFRgDF8oXAg8MkwwUARcCDg2SDBQCAS+SFBgDFwMgFZIUGAMXAyEUkRcCDwySDBQCFwIPDJIMFAL9aWoVDQLVDRVr/SyfYwJsY/2UAhcUGAMWBCAVkhUYAxcDIRSTtxcCDwySDBQCFwIPDJMMFAEFkxQYAxYDIRSTFBgDFgMhFCKSDRMCFwIPDJMMFAIWAg4N/tcUGAMXAyEUkxQYAxcDIRSTtpMMFAIWAg4MkwwUAhYCDwsDFwMhFJMUGAMXAyAVkhQZA9+TDBQCFgIODZIMFAIWAg4MAVP9T4pRcFKJArFw/VcCfWD9g2AACgAD/7cDMgO0ABAAIQAyAEMAVABlAHYAhwCMAJEAABMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBMhYVATQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwEyFhUBESERIRMRIREheyAXpRcfHxelFyA3pQ4SEw2lDhMUDfQgF6QXICAXpBcg/BMNpQ4TFA2kDhP+6x8XpRcgIBelFx/8FA2lDhITDaUNFAFMpBcgIBekFyAgF8UTDaUOExQNpA4T/WEDL/zROwK6/UYCThcgIBekFyAgF6TFEw6kDhMTDqQOEyGkFyAgF6QXICAXpA4TEw6kDhMTDv7cFyAgF6QXICAXpKSkDhMTDqQOExMONyAXpBcgIBekFyDbpA4TEw6kDhMTDgHm/AMD/fz5Asz9NAABAAAAAQAA5GJ1b18PPPUACwQAAAAAANE8tJQAAAAA0Ty0lAAA/7YDnAO3AAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOcAAEAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAgAAAAOdAAADYgABAzIAAwAAAAAACgAUAB4BFgIOAswAAQAAAAcAugAPAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABAAAAABAAAAAAACAA4ATgABAAAAAAADABAAJgABAAAAAAAEABAAXAABAAAAAAAFABYAEAABAAAAAAAGAAgANgABAAAAAAAKADQAbAADAAEECQABABAAAAADAAEECQACAA4ATgADAAEECQADABAAJgADAAEECQAEABAAXAADAAEECQAFABYAEAADAAEECQAGABAAPgADAAEECQAKADQAbAByAGEAaQBuAHQAYQBuAGsAVgBlAHIAcwBpAG8AbgAgADEALgAwAHIAYQBpAG4AdABhAG4Aa3JhaW50YW5rAHIAYQBpAG4AdABhAG4AawBSAGUAZwB1AGwAYQByAHIAYQBpAG4AdABhAG4AawBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:normal;font-style:normal}.gf-icon{display:inline-block;font:normal normal normal 14px/1 'raintank';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gf-icon-snap-multi:before{content:"\e600"}.gf-icon-snap-single-tilt:before{content:"\e601"}.gf-icon-snap-single:before{content:"\e602"}.row-control-inner{padding:0;margin:0;position:relative}.hide-controls{padding:0}.hide-controls .row-tab{display:none}.hide-controls .add-row-panel-hint{display:none}.playlist-active .grafana-menu-zoom-out,.playlist-active .add-row-panel-hint,.playlist-active .grafana-menu-refresh,.playlist-active .top-nav-dashboards-btn,.playlist-active .top-nav-dash-actions{display:none}.playlist-active .grafana-menu-stop-playlist{display:list-item}.row-button{width:24px}.modal{max-width:800px;left:0;right:0;margin-left:auto;margin-right:auto;top:20%}.dashboard-fullscreen .main-view-container{overflow:hidden;height:0;padding:0}.dashboard-fullscreen .main-view-container .row-control-inner{display:none}.histogram-chart{position:relative}.scrollable{max-height:300px;overflow:auto}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar:hover{height:8px}::-webkit-scrollbar-button:start:decrement,::-webkit-scrollbar-button:end:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement{display:none}::-webkit-scrollbar-button:horizontal:increment{display:none}::-webkit-scrollbar-button:vertical:decrement{display:none}::-webkit-scrollbar-button:vertical:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement:active{background-image:none}::-webkit-scrollbar-button:horizontal:increment:active{background-image:none}::-webkit-scrollbar-button:vertical:decrement:active{background-image:none}::-webkit-scrollbar-button:vertical:increment:active{background-image:none}::-webkit-scrollbar-track-piece{background-color:transparent}::-webkit-scrollbar-thumb:vertical{height:50px;background:-webkit-gradient(linear,left top,right top,color-stop(0%,#3a3a3a),color-stop(100%,#3a3a3a));border:1px solid #000;border-top:1px solid #000;border-left:1px solid #000}::-webkit-scrollbar-thumb:horizontal{width:50px;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#3a3a3a),color-stop(100%,#3a3a3a));border:1px solid #000;border-top:1px solid #000;border-left:1px solid #000}.sp-replacer{background:inherit;border:0;color:inherit;padding:0}.sp-replacer:hover,.sp-replacer.sp-active{border-color:inherit;color:inherit}.sp-container{border-radius:0;background-color:#262626;border:0;padding:0}.sp-palette-container,.sp-picker-container{border:0}.sp-dd{display:none}.sp-preview{position:relative;width:15px;height:15px;border:0;margin-right:5px;float:left;z-index:0}.datapoints-warning{pointer:none;position:absolute;top:50%;left:50%;z-index:10;margin-top:-50px;margin-left:-100px;width:200px;text-align:center;cursor:auto;padding:10px}.metrics-editor-help:hover .hide{display:block}.grafana-tooltip{position:absolute;top:-1000;left:0;color:#c8c8c8;padding:10px;font-size:11pt;font-weight:200;background-color:#3a3939;border-radius:5px;z-index:9999;max-width:800px;max-height:600px;overflow:hidden;line-height:14px}.grafana-tooltip a{color:#e3e3e3}.grafana-tooltip hr{padding:2px;color:#c8c8c8;margin:0;border-bottom:0 solid #c8c8c8}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip-inner{max-width:400px}.grafana-version-info{position:absolute;bottom:2px;left:3px;font-size:80%;color:#7b7b7b}.grafana-version-info a{color:#7b7b7b}.template-variable{color:#32d1df}.grafana-info-box:before{content:"\f05a";font-family:'FontAwesome';position:absolute;top:-8px;left:-8px;font-size:20px;color:#33b5e5}.grafana-info-box{position:relative;padding:5px 15px;background-color:#262626;border:1px solid #000}.grafana-info-box h5{margin-top:5px}.grafana-tip{padding-left:5px}.shortcut-table td{padding:3px}.shortcut-table th:last-child{text-align:left}.shortcut-table td:first-child{text-align:right}.confirm-modal{border:1px solid #333;max-width:500px;background-color:#1f1f1f;text-align:center}.confirm-modal .modal-close{float:right;font-size:140%;padding:10px}.confirm-modal .confirm-modal-icon{padding-top:41px;font-size:280%;color:#690;padding-bottom:20px}.confirm-modal .confirm-modal-title{font-size:18px;color:#e3e3e3;margin-bottom:15px}.confirm-modal .confirm-modal-text{font-size:16px}.confirm-modal .confirm-modal-buttons{margin-top:35px;margin-bottom:35px}.confirm-modal .confirm-modal-buttons button{margin-right:5px}.share-snapshot{text-align:center}.share-snapshot .gf-icon-snap-multi{font-size:70px}.share-snapshot .fa-spinner{font-size:70px}.share-snapshot .share-snapshot-info-text{margin:10px 105px}.share-snapshot .share-snapshot-info-text strong{color:#fff;font-weight:bold}.share-snapshot .share-snapshot-header{margin:20px 0 22px 0}.share-snapshot .tight-form{text-align:left}.share-snapshot .share-snapshot-link{max-width:716px;white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.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}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{max-width:100%;width:auto\9;height:auto;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"]{-webkit-appearance:button;cursor:pointer}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{*{text-shadow:none!important;color:#000!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}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#bbbfc2;background-color:#161616}a{color:#e3e3e3;text-decoration:none}a:hover,a:focus{color:#fff;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;content:"";line-height:0}.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;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%}.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;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0}.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:#adafae}a.muted:hover,a.muted:focus{color:#939695}.text-warning{color:#a47e3c}a.text-warning:hover,a.text-warning:focus{color:#7f612e}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#005f81}a.text-info:hover,a.text-info:focus{color:#00394e}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:#fff;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#adafae}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 #bbbfc2}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;*display:inline;*zoom:1;padding-left:5px;padding-right: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;content:"";line-height:0}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #262626;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #adafae}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #bbbfc2}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#adafae}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #bbbfc2;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:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#262626;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap}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:3px;-moz-border-radius:3px;border-radius:3px}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:#262626;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#adafae}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:#000;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;vertical-align:middle}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:#333;border:1px solid #333;-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,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;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;border:1px solid #333;background-color:#333}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:#adafae;background-color:#303030;border-color:#333;-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);cursor:not-allowed}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#788086}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#788086}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#788086}.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;content:"";line-height:0}.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:#555}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:#a47e3c}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#a47e3c}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#a47e3c;-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:#7f612e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#a47e3c;background-color:#f80;border-color:#a47e3c}.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:#bbbfc2;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:#bbbfc2;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#005f81}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#005f81}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#005f81;-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:#00394e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #00aae7;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #00aae7;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #00aae7}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#005f81;background-color:#bbbfc2;border-color:#005f81}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:transparent;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#e3e5e6}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;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,.input-append .popover,.input-prepend .popover{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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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:#bbbfc2;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:#bf3;border-color:#690}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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;*zoom:1;margin-bottom:0;vertical-align:middle}.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;content:"";line-height:0}.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 #262626}.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 #262626}.table .table{background-color:#161616}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #262626;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.table-bordered th,.table-bordered td{border-left:1px solid #262626}.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,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius: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:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.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:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:rgba(100,100,100,0.3)}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#262626}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:#bbbfc2}.table tbody tr.error>td{background-color:#bbbfc2}.table tbody tr.warning>td{background-color:#f80}.table tbody tr.info>td{background-color:#bbbfc2}.table-hover tbody tr.success:hover>td{background-color:#aeb2b6}.table-hover tbody tr.error:hover>td{background-color:#aeb2b6}.table-hover tbody tr.warning:hover>td{background-color:#e67a00}.table-hover tbody tr.info:hover>td{background-color:#aeb2b6}.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:#262626;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:transparent;border-bottom:1px solid #444}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#bbbfc2;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#fff;background-color:#005777;background-image:-moz-linear-gradient(top,#005f81,#004c68);background-image:-webkit-gradient(linear,0 0,0 100%,from(#005f81),to(#004c68));background-image:-webkit-linear-gradient(top,#005f81,#004c68);background-image:-o-linear-gradient(top,#005f81,#004c68);background-image:linear-gradient(to bottom,#005f81,#004c68);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f81',endColorstr='#ff004c68',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#005777;background-image:-moz-linear-gradient(top,#005f81,#004c68);background-image:-webkit-gradient(linear,0 0,0 100%,from(#005f81),to(#004c68));background-image:-webkit-linear-gradient(top,#005f81,#004c68);background-image:-o-linear-gradient(top,#005f81,#004c68);background-image:linear-gradient(to bottom,#005f81,#004c68);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f81',endColorstr='#ff004c68',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#adafae}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #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;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#000;margin-top:5px;margin-right:-10px}.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-left:20px;padding-right:20px}.typeahead{z-index:1051;margin-top:2px;-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,.close:focus{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;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#262626;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#4d4e4d;background-image:-moz-linear-gradient(top,#262626,#868988);background-image:-webkit-gradient(linear,0 0,0 100%,from(#262626),to(#868988));background-image:-webkit-linear-gradient(top,#262626,#868988);background-image:-o-linear-gradient(top,#262626,#868988);background-image:linear-gradient(to bottom,#262626,#868988);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff262626',endColorstr='#ff868988',GradientType=0);border-color:#868988 #868988 #606362;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#868988;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#262626;background-color:#868988;*background-color:#797d7b}.btn:active,.btn.active{background-color:#6d706e \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#262626;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,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(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:4px;-moz-border-radius:4px;border-radius:4px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.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:2px;-moz-border-radius:2px;border-radius:2px}.btn-block{display:block;width:100%;padding-left:0;padding-right: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-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006e95;background-image:-moz-linear-gradient(top,#005f81,#0085b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#005f81),to(#0085b4));background-image:-webkit-linear-gradient(top,#005f81,#0085b4);background-image:-o-linear-gradient(top,#005f81,#0085b4);background-image:linear-gradient(to bottom,#005f81,#0085b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f81',endColorstr='#ff0085b4',GradientType=0);border-color:#0085b4 #0085b4 #004c67;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#0085b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#0085b4;*background-color:#00729b}.btn-primary:active,.btn-primary.active{background-color:#005f81 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f58a0f;background-image:-moz-linear-gradient(top,#ff941a,#e67a00);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff941a),to(#e67a00));background-image:-webkit-linear-gradient(top,#ff941a,#e67a00);background-image:-o-linear-gradient(top,#ff941a,#e67a00);background-image:linear-gradient(to bottom,#ff941a,#e67a00);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff941a',endColorstr='#ffe67a00',GradientType=0);border-color:#e67a00 #e67a00 #995200;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e67a00;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#e67a00;*background-color:#cc6d00}.btn-warning:active,.btn-warning.active{background-color:#b35f00 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#d13a00;background-image:-moz-linear-gradient(top,#e64000,#b33200);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e64000),to(#b33200));background-image:-webkit-linear-gradient(top,#e64000,#b33200);background-image:-o-linear-gradient(top,#e64000,#b33200);background-image:linear-gradient(to bottom,#e64000,#b33200);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe64000',endColorstr='#ffb33200',GradientType=0);border-color:#b33200 #b33200 #661d00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#b33200;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#b33200;*background-color:#992b00}.btn-danger:active,.btn-danger.active{background-color:#802400 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#699e00;background-image:-moz-linear-gradient(top,#77b300,#558000);background-image:-webkit-gradient(linear,0 0,0 100%,from(#77b300),to(#558000));background-image:-webkit-linear-gradient(top,#77b300,#558000);background-image:-o-linear-gradient(top,#77b300,#558000);background-image:linear-gradient(to bottom,#77b300,#558000);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff77b300',endColorstr='#ff558000',GradientType=0);border-color:#558000 #558000 #230;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#558000;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#558000;*background-color:#460}.btn-success:active,.btn-success.active{background-color:#334d00 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#993dc7;background-image:-moz-linear-gradient(top,#a347d1,#8a2eb8);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a347d1),to(#8a2eb8));background-image:-webkit-linear-gradient(top,#a347d1,#8a2eb8);background-image:-o-linear-gradient(top,#a347d1,#8a2eb8);background-image:linear-gradient(to bottom,#a347d1,#8a2eb8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa347d1',endColorstr='#ff8a2eb8',GradientType=0);border-color:#8a2eb8 #8a2eb8 #5c1f7a;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#8a2eb8;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#8a2eb8;*background-color:#7a29a3}.btn-info:active,.btn-info.active{background-color:#6b248f \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#2b2b2b;background-image:-moz-linear-gradient(top,#262626,#333);background-image:-webkit-gradient(linear,0 0,0 100%,from(#262626),to(#333));background-image:-webkit-linear-gradient(top,#262626,#333);background-image:-o-linear-gradient(top,#262626,#333);background-image:linear-gradient(to bottom,#262626,#333);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff262626',endColorstr='#ff333333',GradientType=0);border-color:#333 #333 #0d0d0d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#333;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#333;*background-color:#262626}.btn-inverse:active,.btn-inverse.active{background-color:#191919 \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{border-color:transparent;cursor:pointer;color:#e3e3e3;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#fff;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#262626;text-decoration:none}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#f80;border:1px solid transparent;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.alert,.alert h4{color:#a47e3c}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#bbbfc2;border-color:#aeb4b6;color:#468847}.alert-success h4{color:#468847}.alert-danger,.alert-error{background-color:#bbbfc2;border-color:#b3b9bb;color:#b94a48}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{background-color:#bbbfc2;border-color:#a8afb1;color:#005f81}.alert-info h4{color:#005f81}.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-left:0;margin-bottom:20px;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#bbbfc2}.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:#adafae;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-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,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#e3e3e3}.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;content:"";line-height:0}.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,.nav-tabs>li>a:focus{border-color:#bbbfc2 #bbbfc2 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#bbb;background-color:#161616;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.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,.nav-pills>.active>a:focus{color:#fff;background-color:#e3e3e3}.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;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2}.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{border-top-color:#e3e3e3;border-bottom-color:#e3e3e3;margin-top:6px}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.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:#bbb;border-bottom-color:#bbb}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#adafae;border-color:#adafae}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#adafae}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0}.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,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{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,.tabs-left>.nav-tabs>li>a:focus{border-color:#bbbfc2 #ddd #bbbfc2 #bbbfc2}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{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,.tabs-right>.nav-tabs>li>a:focus{border-color:#bbbfc2 #bbbfc2 #bbbfc2 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#adafae}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default}.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2}.navbar-inner{min-height:52px;padding-left:20px;padding-right:20px;background-color:#1f1f1f;background-image:-moz-linear-gradient(top,#1f1f1f,#1f1f1f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1f1f1f),to(#1f1f1f));background-image:-webkit-linear-gradient(top,#1f1f1f,#1f1f1f);background-image:-o-linear-gradient(top,#1f1f1f,#1f1f1f);background-image:linear-gradient(to bottom,#1f1f1f,#1f1f1f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1f1f1f',endColorstr='#ff1f1f1f',GradientType=0);border:1px solid none;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-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);*zoom:1}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{float:left;display:block;padding:16px 20px 16px;margin-left:-20px;font-size:20px;font-weight:200;color:#e3e3e3;text-shadow:0 1px 0 #1f1f1f}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:52px;color:#adafae}.navbar-link{color:#adafae}.navbar-link:hover,.navbar-link:focus{color:#fff}.navbar .divider-vertical{height:52px;margin:0 9px;border-left:1px solid #1f1f1f;border-right:1px solid #1f1f1f}.navbar .btn,.navbar .btn-group{margin-top:11px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:11px}.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:11px;margin-bottom:0}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;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-left:0;padding-right: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,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(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:16px 15px 16px;color:#adafae;text-decoration:none;text-shadow:0 1px 0 #1f1f1f}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#fff;text-decoration:none}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:#1f1f1f;-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-left:5px;margin-right:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#121212;background-image:-moz-linear-gradient(top,#121212,#121212);background-image:-webkit-gradient(linear,0 0,0 100%,from(#121212),to(#121212));background-image:-webkit-linear-gradient(top,#121212,#121212);background-image:-o-linear-gradient(top,#121212,#121212);background-image:linear-gradient(to bottom,#121212,#121212);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff121212',endColorstr='#ff121212',GradientType=0);border-color:#121212 #121212 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#121212;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#121212;*background-color:#050505}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#000 \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{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:9px}.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #262626;position:absolute;top:-6px;left:10px}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0;bottom:-7px;top:auto}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #262626;border-bottom:0;bottom:-6px;top:auto}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#1f1f1f;color:#fff}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#adafae;border-bottom-color:#adafae}.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:#fff;border-bottom-color:#fff}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-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:#252a30;background-image:-moz-linear-gradient(top,#252a30,#252a30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#252a30),to(#252a30));background-image:-webkit-linear-gradient(top,#252a30,#252a30);background-image:-o-linear-gradient(top,#252a30,#252a30);background-image:linear-gradient(to bottom,#252a30,#252a30);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff252a30',endColorstr='#ff252a30',GradientType=0);border-color:transparent}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#adafae;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#adafae}.navbar-inverse .navbar-text{color:#adafae}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:#242a31;color:#fff}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#242a31}.navbar-inverse .navbar-link{color:#adafae}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-left-color:#252a30;border-right-color:#252a30}.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{background-color:#242a31;color:#fff}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#adafae;border-bottom-color:#adafae}.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:#5d6978;border-color:#252a30;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#262626;text-shadow:0 1px 0 #fff;background-color:#fff;border: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);outline:0}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#1a1d22;background-image:-moz-linear-gradient(top,#1a1d22,#1a1d22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1a1d22),to(#1a1d22));background-image:-webkit-linear-gradient(top,#1a1d22,#1a1d22);background-image:-o-linear-gradient(top,#1a1d22,#1a1d22);background-image:linear-gradient(to bottom,#1a1d22,#1a1d22);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1a1d22',endColorstr='#ff1a1d22',GradientType=0);border-color:#1a1d22 #1a1d22 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#1a1d22;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#1a1d22;*background-color:#0f1113}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#040405 \9}.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:.7;filter:alpha(opacity=70)}.modal{position:fixed;z-index:1050;width:100%;background-color:#fff;-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;outline:0}.modal.fade{-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;top:-25%}.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;overflow-y:auto;padding:15px}.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-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;*zoom:1}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#3a3939;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#3a3939}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#3a3939}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#3a3939}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#3a3939}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#262626;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#262626;border-bottom:1px solid #191919;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#262626}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#262626}.popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#262626}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#262626;bottom:-10px}.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;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#adafae}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{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:#f80}.label-warning[href],.badge-warning[href]{background-color:#cc6d00}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#005f81}.label-info[href],.badge-info[href]{background-color:#00394e}.label-inverse,.badge-inverse{background-color:#262626}.label-inverse[href],.badge-inverse[href]{background-color:#0c0c0c}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}label,input,button,select,textarea,.navbar .search-query:-moz-placeholder,.navbar .search-query::-webkit-input-placeholder{font-family:'Droid Sans',sans-serif;color:#bbb}blockquote{border-left:5px solid #262626}blockquote.pull-right{border-right:5px solid #262626}html{height:100%}body{height:100%;background:#161616}.page-header{border-bottom:1px solid #262626}hr{border-bottom:0}.navbar .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .brand{padding:0 15px;color:#e3e3e3;font-weight:normal;text-shadow:none}.navbar .nav>li>a{padding:15px 15px 14px;border-bottom:1px solid transparent}.navbar .nav>li>a:hover,.navbar .nav>.active>a,.navbar .nav>.active>a:hover{border-bottom:1px solid #33b5e5}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .navbar-text{margin-bottom:1px;padding:15px 15px 14px;line-height:inherit}.navbar .divider-vertical{margin:0;border-left:1px solid #262626;border-right-width:0}.navbar .search-query,.navbar .search-query:focus,.navbar .search-query.focused{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;background-color:#262626;line-height:normal;color:#adafae;text-shadow:none}.navbar .search-query:-moz-placeholder,.navbar .search-query:focus:-moz-placeholder,.navbar .search-query.focused:-moz-placeholder{color:#bbb}.navbar .search-query:-ms-input-placeholder,.navbar .search-query:focus:-ms-input-placeholder,.navbar .search-query.focused:-ms-input-placeholder{color:#bbb}.navbar .search-query::-webkit-input-placeholder,.navbar .search-query:focus::-webkit-input-placeholder,.navbar .search-query.focused::-webkit-input-placeholder{color:#bbb}@media(max-width:979px){.navbar .nav-collapse .nav li>a{border:0;color:#bbbfc2;font-weight:normal;text-shadow:none}.navbar .nav-collapse .nav li>a:hover{border:0;background-color:#33b5e5}.navbar .nav-collapse .nav .active>a{border:0;background-color:#33b5e5}.navbar .nav-collapse .dropdown-menu a:hover{background-color:#33b5e5}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border-top:0;border-bottom:0}.navbar .nav-collapse .nav-header{color:rgba(128,128,128,0.6)}.navbar-inverse .nav-collapse .nav li>a:hover{background-color:#111}.navbar-inverse .nav-collapse .nav .active>a{background-color:#111}.navbar-inverse .nav-collapse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav-collapse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav-collapse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111}}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}div.subnav{margin:0 1px;background-color:#1f1f1f;background-image:none;border:0;border-bottom:1px solid #262626}div.subnav .nav>li>a,div.subnav .nav>li:first-child>a,div.subnav .nav>li:first-child>a:hover{padding:11px 12px;border:0;background-color:#1f1f1f;color:#adafae}div.subnav .nav>li>a:hover,div.subnav .nav>li.active>a,div.subnav .nav>li.active>a:hover,div.subnav .nav>li:first-child>a:hover{padding:11px 12px;background:transparent;border:0;border-bottom:1px solid #33b5e5;color:#fff}div.subnav .nav li.nav-header{text-shadow:none}div.subnav-fixed{top:52px;margin:0}.nav-tabs{border-bottom:0}.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs li>a:hover,.nav-tabs li.active>a,.nav-tabs li.active>a:hover{border-color:transparent;background-color:transparent;border-bottom:2px solid #33b5e5;color:#fff}.nav-tabs li.disabled>a{color:#bbbfc2}.nav-tabs .open .dropdown-toggle{background-color:#060606;border-color:transparent}.nav-pills li>a:hover{background-color:#33b5e5;color:#fff}.nav-pills li.disabled>a{color:#bbbfc2}.nav-pills .open .dropdown-toggle{background-color:#060606}.nav-pills .dropdown-menu li>a:hover{border:0}.nav-list li>a{text-shadow:none}.nav-list li>a:hover{background-color:#33b5e5;color:#fff}.nav-list .nav-header{text-shadow:none}.nav-list .divider{background-color:transparent;border-bottom:1px solid #262626}.nav-stacked li>a{border:1px solid #262626!important}.nav-stacked li>a:hover,.nav-stacked li.active>a{background-color:#33b5e5;color:#fff}.tabbable .nav-tabs,.tabbable .nav-tabs li.active>a{border-color:#262626}.breadcrumb{background-color:transparent;background-image:none;border-width:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;font-size:14px}.breadcrumb li{text-shadow:none}.breadcrumb li>a{color:#33b5e5;text-shadow:none}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span,.pagination ul>.disabled>span:hover{background-color:rgba(0,0,0,0.2)}.pager li>a,.pager li>span{background-color:#161616;border:0}.pager li>a:hover,.pager li>span:hover{background-color:#33b5e5}.pager .disabled a,.pager .disabled a:hover{background-color:#161616}.btn{padding:5px 12px;background-image:none;-webkit-box-shadow:0 0 8px #161616;-moz-box-shadow:0 0 8px #161616;box-shadow:0 0 8px #161616;border:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-shadow:none}.btn.disabled{box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-inverse{border:1px solid #444}.btn-large{padding:14px 23px}.btn-small{padding:2px 10px}.btn-mini{padding:2px 6px}.btn-group>.btn:first-child,.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input,textarea,select{border-width:2px;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}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{color:#adafae}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly],.uneditable-input{border-color:#444}input:focus,textarea:focus,input.focused,textarea.focused{border-color:#52a8ec;outline:0;outline:thin dotted \9}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}legend,label{color:#bbbfc2;border-bottom:0 solid #222}.form-actions{border-top:1px solid #222}.table{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.table tbody tr.success td{background-color:#690;color:#fff}.table tbody tr.error td{background-color:#cc3900;color:#fff}.table tbody tr.info td{background-color:#33b5e5;color:#fff}.alert,.alert .alert-heading,.alert-success,.alert-success .alert-heading,.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading,.alert-info,.alert-info .alert-heading{color:#fff;text-shadow:none;border:0}.label{color:#fff}.badge{border-radius:0;font-weight:200}.label,.alert{background-color:#888}.label:hover{background-color:#6e6e6e}.label-important,.alert-danger,.alert-error{background-color:#cc3900}.label-important:hover{background-color:#992b00}.label-warning{background-color:#cc6d00}.label-warning:hover{background-color:#995200}.label-success,.alert-success{background-color:#5c8a00}.label-success:hover{background-color:#3a5700}.label-info,.alert-info{background-color:#00394e}.label-info:hover{background-color:#00141b}a:hover{text-decoration:none}.well,.hero-unit{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.well,.hero-unit{border-top:solid 1px #333;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.8);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.8);box-shadow:0 2px 4px rgba(0,0,0,0.8)}.thumbnail{border-color:#262626}.progress{background-color:#060606;background-image:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.modal{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;border-top:solid 1px #333;background-color:#1f1f1f}.modal-header{border-bottom:1px solid #1f1f1f}.modal-footer{background-color:#1f1f1f;border-top:1px solid #1f1f1f;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.popover{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.popover-title{border-bottom:0;color:#fff}.footer{border-top:1px solid #262626}.caret{color:#bbbfc2}.dropdown-submenu>a:after{border-left-color:#bbbfc2}@media(max-width:767px){div.panel{width:100%!important;padding:0!important}}.container-fluid{padding-left:0;padding-right:0}.main-view-container{padding:5px 10px;width:100%;box-sizing:border-box}.bgNav{background:#1f1f1f}.bgPrimary{background:#005f81;color:rgba(255,255,255,0.9)}.bgInfo{background:#a347d1;color:rgba(255,255,255,0.9)}.bgSuccess{background:#77b300;color:rgba(255,255,255,0.9)}.bgWarning{background:#ff941a;color:rgba(255,255,255,0.9)}.bgDanger{background:#e64000;color:rgba(255,255,255,0.9)}.bgInverse{background:#262626;color:rgba(255,255,255,0.9)}code,pre{background-color:#bbbfc2}div.editor-row{vertical-align:top}div.editor-row div.section{margin-right:20px;vertical-align:top;display:inline-block}div.editor-option{vertical-align:top;display:inline-block;margin-right:10px}div.editor-option label{display:block}#events{font-size:12px}.version{font-size:85%}.legend{color:#000}div.fake-input{background-color:#333;border:1px solid #333;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;border-radius:3px 3px 3px 3px}hr.small{margin:5px 0}form input.ng-invalid{color:#b94a48}.editor-title{margin-right:10px;font-size:1.7em;font-weight:bold;text-transform:capitalize}.editor-title small{opacity:.5;font-size:.7em;font-weight:normal}.bordered{border:1px solid #262626}.table-unpadded th,.table-unpadded td{padding:0 2px}.spy{position:absolute;right:0;top:0}.navbar-inner{border-width:0}.grafana-row{margin-bottom:5px}.row-tab .dropdown-menu-right{top:0;left:33px}.row-tab-button{padding:0;cursor:pointer;vertical-align:middle;width:30px;height:30px;text-align:center;display:inline-block;line-height:30px}.row-button{width:30px;float:left;cursor:pointer;line-height:31px}.row-text{white-space:nowrap;text-transform:uppercase;font-weight:bold;font-size:.9em;text-align:center;line-height:31px;height:31px}.row-close{padding:0;margin:0;background:#1f1f1f;text-align:center}.row-close-buttons{position:absolute;left:0}.row-open{margin-top:5px;left:-34px;position:absolute;z-index:100;transition:.10s left;transition-delay:.10s;-webkit-transition-delay:.10s}.row-open:hover{left:-12px}.odd{background-color:rgba(100,100,100,0.3)}.nomargin{margin:0}[ng\:cloak],[ng-cloak],.ng-cloak{display:none!important}.table tbody+tbody{border-top:0}.ui-draggable-dragging{display:block;z-index:9999}.link{color:#e3e3e3;cursor:pointer}.link:hover{color:#fff}.pointer{cursor:pointer}.popover{max-width:480px}.tiny{font-size:50%}.smaller{font-size:70%}.small{font-size:85%}.large{font-size:120%}.strong{font-weight:bold}a{cursor:pointer}.normal{font-weight:normal}.light{font-weight:200}.input-smaller{width:75px}.string{color:#c8ccce}.number{color:#00729b}.boolean{color:#b78c43}.key{color:#c05c5a}.btn-active{background-color:#e6e6e6;background-image:none;box-shadow:0 2px 4px rgba(0,0,0,0.15) inset,0 1px 2px rgba(0,0,0,0.05);outline:0 none}.remove:hover{background-color:#b33200}.faded{opacity:.2}div.flot-text{color:#bbbfc2!important}.page-alert-list{z-index:8000;min-width:300px;max-width:300px;position:fixed;right:20px;top:56px}.page-alert-list .alert{color:#fff;padding-bottom:13px;position:relative}.page-alert-list .alert-close{position:absolute;top:-4px;right:-2px;width:19px;height:19px;padding:0;background:#bbbfc2;border-radius:50%;border:0;font-size:1.1rem;color:#1f1f1f}.page-alert-list .alert-title{font-weight:bold;padding-bottom:2px}.alert-warning{background-color:#f80;border-color:transparent;color:#a47e3c}.popover.topLeft{margin-top:-10px}.popover.topLeft .arrow{bottom:-10px;left:25%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#262626}.popover.topLeft .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.topRight{margin-top:-10px}.popover.topRight .arrow{bottom:-10px;left:75%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#262626}.popover.topRight .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.rightTop .arrow{top:10%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightTop .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#262626}.popover.rightBottom .arrow{top:90%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightBottom .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#262626}.popover.bottomLeft .arrow{left:10%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottomLeft .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#262626}.popover.bottomRight .arrow{left:90%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottomRight .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#262626}.popover.leftTop .arrow{top:10%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftTop .arrow:after{right:1px;border-right-width:0;border-left-color:#262626;bottom:-10px}.popover.leftBottom .arrow{top:90%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftBottom .arrow:after{right:1px;border-right-width:0;border-left-color:#262626;bottom:-10px}.popover.topLeft .arrow{left:10%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.topLeft .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#262626}.popover.topRight .arrow{left:90%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.topRight .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#262626}.typeahead{max-height:300px;overflow-y:auto}.label-tag{background-color:#93c;color:#f2f2f2;border-radius:2px;text-shadow:none;font-size:13px;padding:4px 6px}.label-tag .icon-tag{position:relative;top:1px;padding-right:4px}.label-tag:hover{opacity:.85;background-color:#7a29a3}.save-dashboard-dropdown{padding:10px}.save-dashboard-dropdown li>a{padding-left:5px}.save-dashboard-dropdown-save-form{margin-bottom:5px}.inspector-request-table td{padding:5px}.inspector-request-table td:first-child{white-space:nowrap}.modal-body{padding:0}code,pre{background-color:#1f1f1f;color:#bbbfc2}.login-form{width:50%;float:left;margin-left:25%;margin-right:25%;padding-top:50px}.login-box{width:700px;margin:100px auto 0 auto}.login-box-logo{text-align:center;padding-bottom:50px}.login-inner-box{background:#1f1f1f}.login-tab-header{background:#262626;text-align:center}.btn-login-tab{background:transparent;border:0;font-size:15px;padding:10px 10px;font-weight:bold;display:inline-block;width:170px;color:#bbbfc2}.btn-login-tab.active{background:#191919;color:#fff}.btn-login-tab:focus{outline:0}.password-strength{display:block;width:50px;overflow:visible;white-space:nowrap;padding-top:3px;margin-left:97px;color:#858c92;border-top:3px solid #cc3900}.password-strength.password-strength-ok{width:170px;border-top:3px solid #f0c942}.password-strength.password-strength-good{width:254px;border-top:3px solid #8c0}.login-submit-button-row{text-align:center;margin-top:40px}.login-submit-button-row button{padding:9px 7px;font-size:14px;font-weight:bold;width:150px;display:inline-block;border:1px solid #404040}.login-oauth{margin-top:30px;padding:10px;background:#262626}.login-oauth .btn-google{background:#dd4b39;color:white}.login-oauth .btn-github{background:#555;color:white}.submenu-controls-visible .panel-fullscreen{top:88px}.submenu-controls{margin:10px 10px 0 5px;font-size:16px}.annotation-disabled,.annotation-disabled a{color:#707070}.annotation-segment label.cr1{margin-left:5px}.graph-canvas-wrapper{position:relative;cursor:crosshair}.graph-legend{margin:0 20px;text-align:center}.graph-legend .popover-content{padding:0}.graph-legend-icon{position:relative;padding-right:4px;top:1px}.graph-legend-icon,.graph-legend-alias,.graph-legend-value{float:left;white-space:nowrap;font-size:85%;text-align:left}.graph-legend-icon.current:before,.graph-legend-alias.current:before,.graph-legend-value.current:before{content:"Current: "}.graph-legend-icon.max:before,.graph-legend-alias.max:before,.graph-legend-value.max:before{content:"Max: "}.graph-legend-icon.min:before,.graph-legend-alias.min:before,.graph-legend-value.min:before{content:"Min: "}.graph-legend-icon.total:before,.graph-legend-alias.total:before,.graph-legend-value.total:before{content:"Total: "}.graph-legend-icon.avg:before,.graph-legend-alias.avg:before,.graph-legend-value.avg:before{content:"Avg: "}.graph-legend-icon .fa{font-size:135%;position:relative;top:1px}.graph-legend-series{float:left;white-space:nowrap;padding-left:10px;padding-top:6px}.graph-legend-value{padding-left:6px}.graph-legend-table{display:table;width:100%;margin:0}.graph-legend-table .graph-legend-series{display:table-row;float:none;padding-left:0}.graph-legend-table .graph-legend-series.pull-right{float:none}.graph-legend-table td,.graph-legend-table .graph-legend-alias,.graph-legend-table .graph-legend-icon,.graph-legend-table .graph-legend-value{float:none;display:table-cell;white-space:nowrap;padding:2px 10px;text-align:right;border-bottom:1px solid #000}.graph-legend-table .graph-legend-icon{width:5px;padding:0;top:0}.graph-legend-table .graph-legend-icon .fa{top:4px}.graph-legend-table .graph-legend-value{padding-left:15px}.graph-legend-table .graph-legend-alias{padding-left:7px;text-align:left;width:95%}.graph-legend-table .graph-legend-series:nth-child(odd){background-color:#242424}.graph-legend-table .graph-legend-value.current:before,.graph-legend-table .graph-legend-value.max:before,.graph-legend-table .graph-legend-value.min:before,.graph-legend-table .graph-legend-value.total:before,.graph-legend-table .graph-legend-value.avg:before{content:''}.graph-legend-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#33b5e5;font-size:85%;white-space:nowrap}.graph-legend-rightside.graph-wrapper{display:table;width:100%}.graph-legend-rightside .graph-canvas-wrapper{display:table-cell;width:100%;position:relative}.graph-legend-rightside .graph-legend-wrapper{display:table-cell;vertical-align:top;position:relative;left:4px}.graph-legend-rightside .graph-legend{margin:0}.graph-legend-rightside .graph-legend-series{display:block;padding-left:0}.graph-legend-rightside .graph-legend-table .graph-legend-series{display:table-row}.graph-legend-series-hidden a{color:#707070}.graph-legend-popover{width:200px}.graph-legend-popover label{display:inline-block}.graph-legend-popover .btn{padding:1px 3px;margin-right:0;line-height:initial}.graph-legend-popover .close{margin-right:5px;color:#e3e3e3;opacity:.7;text-shadow:none}.graph-legend-popover .editor-row{padding:5px}.annotation-tags{color:#93c}.graph-series-override input{float:left;margin-right:10px}.graph-series-override .graph-series-override-option{float:left;padding:2px 6px}.graph-series-override .graph-series-override-selector{float:left}.graph-tooltip{white-space:nowrap}.graph-tooltip .graph-tooltip-time{text-align:center;font-weight:bold;position:relative;top:-3px}.graph-tooltip .graph-tooltip-list-item{display:table-row}.graph-tooltip .graph-tooltip-series-name{display:table-cell}.graph-tooltip .graph-tooltip-value{display:table-cell;font-weight:bold;padding-left:10px;text-align:right}.left-yaxis-label{top:50%;left:-5px;transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);transform-origin:left top;-o-transform-origin:left top;-ms-transform-origin:left top;-moz-transform-origin:left top;-webkit-transform-origin:left top}.right-yaxis-label{top:50%;right:-5px;-webkit-transform:rotate(90deg);-webkit-transform-origin:right top;-moz-transform:rotate(90deg);-moz-transform-origin:right top;-ms-transform:rotate(90deg);-ms-transform-origin:right top;-o-transform:rotate(90deg);-o-transform-origin:right top;transform:rotate(90deg);transform-origin:right top}.axisLabel{color:#bbbfc2;font-size:11.9px;position:absolute;text-align:center;font-size:12px}.bootstrap-tagsinput{display:inline-block;padding:4px 6px;margin-bottom:10px;color:#555;vertical-align:middle;border-radius:4px;max-width:100%;line-height:22px;background-color:#333;border:1px solid #333;-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}.bootstrap-tagsinput input{border:0;box-shadow:none;outline:0;background-color:transparent;padding:0;padding-left:5px;margin:0;width:auto!important;max-width:inherit}.bootstrap-tagsinput input:focus{border:0;box-shadow:none}.bootstrap-tagsinput .tag{margin-right:2px;color:white}.bootstrap-tagsinput .tag [data-role="remove"]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role="remove"]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role="remove"]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.bootstrap-tagsinput .tag [data-role="remove"]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.grafana-options-table{width:100%}.grafana-options-table th{padding:5px 10px;border-bottom:4px solid #1f1f1f}.grafana-options-table tr td{background-color:#262626;padding:5px 10px;white-space:nowrap;border-bottom:4px solid #1f1f1f}.grafana-options-table tr td.nobg{background-color:transparent}.grafana-options-table .max-width-btns{padding-right:0}.grafana-options-table .max-width-btns .btn{box-sizing:border-box;width:100%}.max-width{overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap}.grafana-options-list{list-style:none;margin:0;max-width:450px}.grafana-options-list li:nth-child(odd){background-color:#242424}.grafana-options-list li{float:left;margin:2px;padding:5px 10px;border:1px solid #000}.grafana-options-list li:first-child{border:1px solid #000}.search-container{left:52px;top:33px;margin:15px;z-index:1000;position:absolute;width:700px;box-shadow:0 0 55px 0 black;padding:10px;background-color:#1f1f1f;border:1px solid #333}.search-container .label-tag{margin-left:6px;font-size:11px;padding:2px 6px}.search-field-wrapper{padding-bottom:10px}.search-field-wrapper input{width:100%;padding:18px 8px;box-sizing:border-box}.search-field-wrapper button{margin:0 4px 0 0}.search-field-wrapper>span{display:block;overflow:hidden}.search-results-container{height:450px;overflow:auto;display:block;line-height:28px}.search-results-container .search-result-item:hover,.search-results-container .search-result-item.selected{background-color:#333}.search-results-container .selected .search-result-tag{opacity:.70;color:white}.search-results-container .fa-star,.search-results-container .fa-star-o{padding-left:13px}.search-results-container .fa-star{color:#f80}.search-results-container .search-result-link{color:#bbbfc2}.search-results-container .search-result-link .fa{padding-right:10px}.search-results-container .search-result-item{display:block;padding:3px 10px;white-space:nowrap;background-color:#262626;margin-bottom:4px}.search-results-container .search-result-tags{float:right}.search-results-container .search-result-actions{float:right;padding-left:20px}.search-switches{position:absolute;top:19px;right:21px}.search-button-row{padding-top:20px}.search-button-row button,.search-button-row a{margin-right:10px}.panel{display:inline-block;float:left;vertical-align:top;position:relative}.panel-margin{margin:5px;display:block}.panel-container{background-color:#1f1f1f;position:relative;border:solid 1px #262626}.panel-container:hover .panel-actions{display:block}.panel-container.panel-transparent{background-color:transparent;border:0}.panel-content{padding:0 10px 5px 10px}.panel-title-container{min-height:5px;padding-top:4px;cursor:context-menu}.panel-title{border:0;font-weight:bold;position:relative;cursor:context-menu;width:100%;display:block}.panel-title.has-panel-links .panel-title-text:after{content:"\f08e";font-family:'FontAwesome';font-size:80%;padding-left:10px;position:relative;top:-1px}.panel-loading{position:absolute;top:-3px;right:0;z-index:800}.panel-header{text-align:center}.panel-error{color:#fff;position:absolute;left:0;padding:0 17px 6px 5px;top:0;z-index:10}.panel-error i{position:relative;top:-2px}.panel-error-arrow{width:0;height:0;position:absolute;border-left:31px solid transparent;border-right:30px solid transparent;border-bottom:27px solid #1f1f1f;left:0;bottom:0}.panel-fullscreen{z-index:100;display:block;position:fixed;left:0;right:0;top:60px;padding:0;overflow-y:auto;height:100%}.panel-fullscreen .dropdown-menu{margin-bottom:70px}.panel-fullscreen .panel-container{margin:15px}.panel-fullscreen .panel-menu{top:0}.panel-fullscreen .panel-title-container{padding:8px}.panel-full-edit{margin-top:30px;padding-bottom:130px}.panel-menu{z-index:500;position:absolute;background:#333;border:1px solid black;top:-62px}.panel-menu .panel-menu-row{white-space:nowrap;border-bottom:1px solid black}.panel-menu .panel-menu-row:last-child{border-bottom:0}.panel-menu .panel-menu-link,.panel-menu .panel-menu-icon{padding:5px 10px}.panel-menu .panel-menu-link{display:inline-block;border-right:1px solid black}.panel-menu .panel-menu-link:last-child{border:0}.panel-menu .dropdown-menu{text-align:left}.panel-highlight{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.on-drag-hover .panel-container{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.panel-drop-zone{display:none}.panel-drop-zone .panel-container{border:1px solid #262626}.panel-ghost{width:100%}.panel-ghost .panel-container{border:0;background:transparent}.panel-ghost .panel-ghost-list{margin:10px 0 10px 20px}.panel-ghost button{text-align:left;min-width:135px}.panel-ghost button .fa{position:relative;left:-5px}.panel-time-info{font-weight:bold;float:right;margin-right:15px;color:#33b5e5;font-size:85%;position:absolute;top:0;right:0}input[type=text].input-fluid{width:100%;box-sizing:border-box;padding:10px;font-size:16px;-moz-box-sizing:border-box;height:100%}input[type="checkbox"].cr1{display:none}label.cr1{display:inline-block;height:19px;clear:none;text-indent:2px;margin:0 0 1px 0;padding:0 0 0 20px;vertical-align:middle;background:url('../img/checkbox.png') left top no-repeat;cursor:pointer}input[type="checkbox"]:checked+label{background:url('../img/checkbox.png') 0 -18px no-repeat}.gf-form{padding-bottom:10px}.gf-form .checkbox-label{padding-left:7px;display:inline}.gf-fluid-input{border:0;display:block;overflow:hidden;padding-right:10px}.gf-fluid-input input[type=text]{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.gf-fluid-input textarea{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.singlestat-panel{position:relative;display:table;width:100%}.singlestat-panel-value-container{padding:20px;display:table-cell;vertical-align:middle;text-align:center;position:relative;z-index:1;font-size:3em;font-weight:bold}.singlestat-panel-prefix{padding-right:20px}.singlestat-panel-table{width:100%}.singlestat-panel-table td{padding:5px 10px;white-space:nowrap;text-align:right;border-bottom:1px solid #000}.singlestat-panel-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#33b5e5}.singlestat-panel-table td:first-child{text-align:left}.singlestat-panel-table tr:nth-child(odd) td{background-color:#242424}.singlestat-panel-table tr:last-child td{border:0}.tight-form{border-top:1px solid #000;border-left:1px solid #000;border-right:1px solid #000;background:#262626;width:100%}.tight-form:last-child,.tight-form.last{border-bottom:1px solid #000}.tight-form.borderless{background:transparent;border:0}.tight-form .checkbox-label{display:inline;padding-right:4px;margin-bottom:0}.spaced-form .tight-form{margin:7px 0}.borderless .tight-form-item,.borderless .tight-form-input{border:0}.tight-form-container .tight-form:last-child{border-bottom:0}.tight-form-container:last-child{border-bottom:1px solid #000}.tight-form-btn{padding:8px 12px}.tight-form-list{list-style:none;margin:0}.tight-form-list>li{float:left}.grafana-metric-options{margin-top:35px}.tight-form-item{padding:8px 7px;font-weight:normal;border-right:1px solid #050505;color:#c8c8c8;display:inline-block}.has-open-function .tight-form-item{padding-top:25px}.tight-form-disabled .tight-form-item{color:#888}.tight-form-item:hover,.tight-form-item:focus{text-decoration:none}.tight-form-itema:hover{background:#333}.tight-form-item.template-param-name{border-right:0;padding-right:0;padding-left:18px}.tight-form-item.annotation-segment{padding:8px 13px}.tight-form-item.last{border-right:0}.tight-form-item .fa-caret-down{font-size:75%;position:relative;top:1px}.tight-form-item-icon i{width:15px;text-align:center;display:inline-block}.tight-form-func{background:#333}.tight-form-func>a{color:#c8c8c8}.tight-form-func>a:hover{color:#e3e3e3}.tight-form-func.show-function-controls{padding-top:5px;min-width:100px;text-align:center}input[type=text].tight-form-func-param{background:transparent;border:0;margin:0;padding:0}input[type=text].tight-form-clear-input{padding:8px 7px;border:0;margin:0;background:transparent;float:left;color:#c8c8c8;border-radius:0;border-right:1px solid #050505}[type=text].tight-form-input,[type=email].tight-form-input,[type=number].tight-form-input,[type=password].tight-form-input{border:0;border-right:1px solid #050505;margin:0;border-radius:0;padding:8px 6px;height:100%;box-sizing:border-box}[type=text].tight-form-input.last,[type=email].tight-form-input.last,[type=number].tight-form-input.last,[type=password].tight-form-input.last{border-right:0}input[type=checkbox].tight-form-checkbox{margin:0}select.tight-form-input{border:0;border-right:1px solid #050505;margin:0;border-radius:0;height:36px;padding:8px 3px}select.tight-form-input.last{border-right:0}.tight-form-func-controls{display:none;text-align:center}.tight-form-func-controls .fa-arrow-left{float:left;position:relative;top:2px}.tight-form-func-controls .fa-arrow-right{float:right;position:relative;top:2px}.tight-form-func-controls .fa-remove{margin-left:10px}.tight-form-radio input[type=radio]{margin:0}.tight-form-radio label{display:inline}.sidemenu-canvas{position:relative}.sidemenu-wrapper{position:absolute;display:none;top:0;bottom:0;left:0;width:200px;background:#161616;min-height:100%;z-index:101}.sidemenu-wrapper a:focus{text-decoration:none}.sidemenu-open .sidemenu-wrapper{display:block}.sidemenu-open .search-container{left:200px}.sidemenu-open .main-view{padding-left:200px}.sidemenu-open .panel-fullscreen{left:200px}.sidemenu{font-size:16px;font-weight:400;list-style:none;margin:0;padding:0}.sidemenu>li{margin-bottom:9px}.sidemenu .fa-caret-down{position:relative;top:2px;font-size:90%}.sidemenu.sidemenu-small{font-size:14px}.sidemenu.sidemenu-small .icon-circle{border-radius:50%;background:#000;box-shadow:0 0 14px 2px rgba(255,255,255,0.05);border:1px solid transparent;width:28px;height:28px}.sidemenu.sidemenu-small .icon-circle i{top:1px;left:4px;font-size:110%}.sidemenu.sidemenu-small .sidemenu-item{line-height:28px;padding-left:25px}.sidemenu-item-text{width:110px;display:inline-block;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.sidemenu-top-btn{display:block;padding:8px 0 4px 22px;background-color:#1f1f1f;border-right:3px solid #161616}.sidemenu-top-btn img{border-radius:50%;background:#000;border:1px solid #161616;width:30px;padding:4px}.sidemenu-top-btn i{padding-right:5px;padding-top:5px;font-size:170%;color:#e3e3e3}.icon-circle{width:40px;height:40px;display:inline-block}.icon-circle i{color:#e3e3e3;opacity:.7;position:relative;left:7px;top:5px;font-size:150%}.sidemenu-item{color:#e3e3e3;line-height:40px;padding:0 10px 0 20px;display:block;white-space:nowrap}.sidemenu-item .sidemenu-item-text{padding-left:11px;transition:color 100ms ease-out}.sidemenu-item .sidemenu-item-text.no-icon{padding-left:59px}.sidemenu-item img{border-radius:50%;width:28px;height:28px;box-shadow:0 0 14px 2px rgba(255,255,255,0.05)}.sidemenu-system-section{background-color:#005f81;color:#fff;padding:3px 0;margin-left:10px;margin-right:10px;border-radius:2px}.sidemenu-system-section .sidemenu-system-section-inner{border:2px solid black;border-left:none;border-right:0;padding:4px;overflow:hidden}.sidemenu-system-section .fa{float:left;font-size:120%;line-height:41px;padding:0 15px}.sidemenu-section-tagline{font-style:italic;font-size:75%;line-height:10px}.sidemenu-section-text-wrapper{padding-top:4px}.navbar-inner{padding-left:0}.navbar .nav>li>a{padding:17px 15px 13px}.navbar .nav>li>a .fa{font-size:115%}.top-nav{float:left;font-size:16px}.fa.top-nav-breadcrumb-icon{margin:18px 0 6px 5px;float:left;font-size:120%;color:#bbbfc2}.top-nav-menu-btn{border:1px solid #161616;border-radius:50%;background:#000;display:block;position:relative;float:left;width:30px;height:30px;padding:4px;margin:6px 6px 3px 9px}.top-nav-menu-btn .fa{color:#bbbfc2;width:30px;height:30px;left:9px;top:7px;font-size:150%;opacity:0;position:absolute;transition:opacity .2s ease-in-out}.top-nav-menu-btn img{width:30px;position:absolute;opacity:1;transition:opacity .2s ease-in-out}.top-nav-menu-btn:hover .fa{opacity:.7}.top-nav-menu-btn:hover img{opacity:0}.top-nav-dashboards-btn{display:block;float:left;margin:9px 18px 5px 14px;border-radius:3px;font-size:1.4em;color:#a2a2a2;border:solid 1px #555}.top-nav-dashboards-btn a{display:inline-block;background:#333;padding:5px 15px 5px 10px;border-radius:3px;color:#a2a2a2}.top-nav-dashboards-btn a:hover{background:#444}.top-nav-dashboards-btn a:hover .fa{color:#e3e3e3}.top-nav-dashboards-btn .fa-th-large{position:relative;top:2px}.top-nav-dashboards-btn .fa-caret-down{font-size:60%;position:relative;top:4px}.dashboard-title{padding:0 6px 5px 5px;color:#fff;font-size:17px}.top-nav-icon{margin:5px 0 0 11px;line-height:41px;float:left}.top-nav-section{display:block;float:left;padding:19px 9px 8px 0;font-weight:bold}.top-nav-section i{padding-left:8px}.top-nav-title{display:block;float:left;font-size:17px;padding:18px 10px 10px 13px;color:#e3e3e3}.top-nav-snapshot-title{display:block;float:left;font-size:1.4em;margin:9px 18px 5px 14px;color:#e3e3e3}.top-nav-snapshot-title .gf-icon{position:relative;top:3px;font-size:27px}.top-nav-snapshot-title a{display:inline-block;padding:0 15px 5px 10px}.gf-box{margin:15px;background-color:#1f1f1f;position:relative;border:1px solid #333}.gf-box-no-margin{margin:0}.gf-box-header-close-btn{float:right;padding:0;margin:0;background-color:transparent;border:0;padding:8px;color:#bbbfc2}.gf-box-header-close-btn i{font-size:120%}.gf-box-header-close-btn:hover{color:#fff}.gf-box-body{padding:20px;min-height:150px}.gf-box-footer{overflow:hidden}.gf-box-header{border-bottom:1px solid #333;overflow:hidden;background-color:#262626}.gf-box-header .tabs{float:left}.gf-box-header .nav{margin:0}.gf-box-title{padding-right:20px;padding-left:10px;float:left;color:#e3e3e3;font-size:18px;font-weight:normal;line-height:38px;margin:0}.gf-box-title .fa{padding:0 8px 0 5px;color:#bbbfc2}.page-container{margin:15px;background:#1f1f1f;position:relative;border:1px solid #262626;padding:20px 20px 60px 49px}.page-container h2{color:#bbbfc2;font-weight:normal;font-size:22px}.page{max-width:653px}.admin-page{max-width:800px;margin-left:10px}.admin-page .gf-box{margin-top:0}.admin-page .gf-box-body{min-height:0}.admin-page h2{margin-left:15px;margin-bottom:0;font-size:17.5px;color:#bbbfc2}.admin-page h2 i{padding-right:6px}.dashlist-link{display:block;margin:5px;padding:7px;background-color:#262626;border:1px solid #000}.dashlist-link .fa{float:right;padding-top:3px}.dashlist-link .fa-star{color:#f80}.dashlist-link:hover{background-color:#333}.admin-settings-section{color:#32d1df;font-weight:bold}td.admin-settings-key{padding-left:20px}input[type=text].ng-dirty.ng-invalid{box-shadow:inset 0 0 7px #cc3900}@font-face{font-family:'raintank';src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SAywAAAC8AAAAYGNtYXAaVcxZAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zm7/N1QAAAFwAAAFmGhlYWQFNK2SAAAHCAAAADZoaGVhB14DyAAAB0AAAAAkaG10eAwxAAQAAAdkAAAAHGxvY2ECNgP2AAAHgAAAABBtYXhwABcAvAAAB5AAAAAgbmFtZflvA+cAAAewAAABTnBvc3QAAwAAAAAJAAAAACAAAwQAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADmAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIOYC//3//wAAAAAAIOYA//3//wAB/+MaBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAADwAA/7YDnAO3AAMAHQAhACUAKgAuADEAQgBTAGQAdQCGAJcAqAC5AAA3FyUnJTUTJzUjJwcjJwcjFQcTBxcVIQ0BNzM1NycTAxEXJTkCByERIREHFSc3NzEzAxQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwE2FhUHNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATYWFXsKAS9VAbOKkFsDmDvbEZhXTjY/Alj+wQFGGT4mIU5TU/3CmgJU/awxICDLAWUbE40TGxsTjRMbLo0LERELjQwQEAzQHBONExsbE40UG9cQC40MEBAMjQsQ7BsTjRMbGxONExvXEAuNDBAQDIwMEAEbjRMbGxONFBsbFKgQC40MEBAMjQsQDkMvFvQEAfYoVRcXPDxGDf4JwhFKBFpdHAbPAdn+zwFIF54x/ZsCZUbPygV3/s4TGxsTjBQbHBOMqRAMjQsQEAuMDBEdjBQbHBOMFBsbFIwMEBAMjAwQAREM+RQbHBONExscEo2MjAwQEAyNCxARCy4bE4wUGxwTjRIbuo0LEBALjQwQAREMAAoAAf+5A2IDtQAQACEAMgBDAFQAZQB2AIcAkACVAAATHgE/AT4BLwEuAQ8BDgEfAT8BNhYfARYGDwEGJi8BJjY3NxceAT8BPgEvAS4BDwEOARc3FxYGDwEGJi8BJjY/ATYWFwMuAQ8BDgEfAR4BPwE+AS8BBycmNj8BNhYfARYGDwEGJicFNz4BLwEuAQ8BDgEfAR4BNzcXFgYPAQYmLwEmNj8BNhYXARMfASUvAQMFEwMlEwWdAyAVkhUYAxcDIRSTFBgDFxWTDBQBFwIODZIMFAIXAg8M3hcDIRSSFBgDFwMgFZIUGAPgFwIPDJIMFAIWAg4MkgwUAs4DIRSTFBgDFwMgFZIVGAMXyhcCDwyTDBQBFwIODZIMFAIBL5IUGAMXAyAVkhQYAxcDIRSRFwIPDJIMFAIXAg8MkgwUAv1pahUNAtUNFWv9LJ9jAmxj/ZQCFxQYAxYEIBWSFRgDFwMhFJO3FwIPDJIMFAIXAg8MkwwUAQWTFBgDFgMhFJMUGAMWAyEUIpINEwIXAg8MkwwUAhYCDg3+1xQYAxcDIRSTFBgDFwMhFJO2kwwUAhYCDgyTDBQCFgIPCwMXAyEUkxQYAxcDIBWSFBkD35MMFAIWAg4NkgwUAhYCDgwBU/1PilFwUokCsXD9VwJ9YP2DYAAKAAP/twMyA7QAEAAhADIAQwBUAGUAdgCHAIwAkQAAExQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwEyFhUBNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATIWFQERIREhExEhESF7IBelFx8fF6UXIDelDhITDaUOExQN9CAXpBcgIBekFyD8Ew2lDhMUDaQOE/7rHxelFyAgF6UXH/wUDaUOEhMNpQ0UAUykFyAgF6QXICAXxRMNpQ4TFA2kDhP9YQMv/NE7Arr9RgJOFyAgF6QXICAXpMUTDqQOExMOpA4TIaQXICAXpBcgIBekDhMTDqQOExMO/twXICAXpBcgIBekpKQOExMOpA4TEw43IBekFyAgF6QXINukDhMTDqQOExMOAeb8AwP9/PkCzP00AAEAAAABAADkYnVvXw889QALBAAAAAAA0Ty0lAAAAADRPLSUAAD/tgOcA7cAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAA5wAAQAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAACAAAAA50AAANiAAEDMgADAAAAAAAKABQAHgEWAg4CzAABAAAABwC6AA8AAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEAEAAAAAEAAAAAAAIADgBOAAEAAAAAAAMAEAAmAAEAAAAAAAQAEABcAAEAAAAAAAUAFgAQAAEAAAAAAAYACAA2AAEAAAAAAAoANABsAAMAAQQJAAEAEAAAAAMAAQQJAAIADgBOAAMAAQQJAAMAEAAmAAMAAQQJAAQAEABcAAMAAQQJAAUAFgAQAAMAAQQJAAYAEAA+AAMAAQQJAAoANABsAHIAYQBpAG4AdABhAG4AawBWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBhAGkAbgB0AGEAbgBrcmFpbnRhbmsAcgBhAGkAbgB0AGEAbgBrAFIAZQBnAHUAbABhAHIAcgBhAGkAbgB0AGEAbgBrAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAlsAAsAAAAACSAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIDLGNtYXAAAAFoAAAATAAAAEwaVcxZZ2FzcAAAAbQAAAAIAAAACAAAABBnbHlmAAABvAAABZgAAAWYbv83VGhlYWQAAAdUAAAANgAAADYFNK2SaGhlYQAAB4wAAAAkAAAAJAdeA8hobXR4AAAHsAAAABwAAAAcDDEABGxvY2EAAAfMAAAAEAAAABACNgP2bWF4cAAAB9wAAAAgAAAAIAAXALxuYW1lAAAH/AAAAU4AAAFO+W8D53Bvc3QAAAlMAAAAIAAAACAAAwAAAAMEAAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA5gIDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDmAv/9//8AAAAAACDmAP/9//8AAf/jGgQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAA8AAP+2A5wDtwADAB0AIQAlACoALgAxAEIAUwBkAHUAhgCXAKgAuQAANxclJyU1Eyc1IycHIycHIxUHEwcXFSENATczNTcnEwMRFyU5AgchESERBxUnNzcxMwMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBNhYVBzQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwE2FhV7CgEvVQGzipBbA5g72xGYV042PwJY/sEBRhk+JiFOU1P9wpoCVP2sMSAgywFlGxONExsbE40TGy6NCxERC40MEBAM0BwTjRMbGxONFBvXEAuNDBAQDI0LEOwbE40TGxsTjRMb1xALjQwQEAyMDBABG40TGxsTjRQbGxSoEAuNDBAQDI0LEA5DLxb0BAH2KFUXFzw8Rg3+CcIRSgRaXRwGzwHZ/s8BSBeeMf2bAmVGz8oFd/7OExsbE4wUGxwTjKkQDI0LEBALjAwRHYwUGxwTjBQbGxSMDBAQDIwMEAERDPkUGxwTjRMbHBKNjIwMEBAMjQsQEQsuGxOMFBscE40SG7qNCxAQC40MEAERDAAKAAH/uQNiA7UAEAAhADIAQwBUAGUAdgCHAJAAlQAAEx4BPwE+AS8BLgEPAQ4BHwE/ATYWHwEWBg8BBiYvASY2NzcXHgE/AT4BLwEuAQ8BDgEXNxcWBg8BBiYvASY2PwE2FhcDLgEPAQ4BHwEeAT8BPgEvAQcnJjY/ATYWHwEWBg8BBiYnBTc+AS8BLgEPAQ4BHwEeATc3FxYGDwEGJi8BJjY/ATYWFwETHwElLwEDBRMDJRMFnQMgFZIVGAMXAyEUkxQYAxcVkwwUARcCDg2SDBQCFwIPDN4XAyEUkhQYAxcDIBWSFBgD4BcCDwySDBQCFgIODJIMFALOAyEUkxQYAxcDIBWSFRgDF8oXAg8MkwwUARcCDg2SDBQCAS+SFBgDFwMgFZIUGAMXAyEUkRcCDwySDBQCFwIPDJIMFAL9aWoVDQLVDRVr/SyfYwJsY/2UAhcUGAMWBCAVkhUYAxcDIRSTtxcCDwySDBQCFwIPDJMMFAEFkxQYAxYDIRSTFBgDFgMhFCKSDRMCFwIPDJMMFAIWAg4N/tcUGAMXAyEUkxQYAxcDIRSTtpMMFAIWAg4MkwwUAhYCDwsDFwMhFJMUGAMXAyAVkhQZA9+TDBQCFgIODZIMFAIWAg4MAVP9T4pRcFKJArFw/VcCfWD9g2AACgAD/7cDMgO0ABAAIQAyAEMAVABlAHYAhwCMAJEAABMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBMhYVATQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwEyFhUBESERIRMRIREheyAXpRcfHxelFyA3pQ4SEw2lDhMUDfQgF6QXICAXpBcg/BMNpQ4TFA2kDhP+6x8XpRcgIBelFx/8FA2lDhITDaUNFAFMpBcgIBekFyAgF8UTDaUOExQNpA4T/WEDL/zROwK6/UYCThcgIBekFyAgF6TFEw6kDhMTDqQOEyGkFyAgF6QXICAXpA4TEw6kDhMTDv7cFyAgF6QXICAXpKSkDhMTDqQOExMONyAXpBcgIBekFyDbpA4TEw6kDhMTDgHm/AMD/fz5Asz9NAABAAAAAQAA5GJ1b18PPPUACwQAAAAAANE8tJQAAAAA0Ty0lAAA/7YDnAO3AAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOcAAEAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAgAAAAOdAAADYgABAzIAAwAAAAAACgAUAB4BFgIOAswAAQAAAAcAugAPAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABAAAAABAAAAAAACAA4ATgABAAAAAAADABAAJgABAAAAAAAEABAAXAABAAAAAAAFABYAEAABAAAAAAAGAAgANgABAAAAAAAKADQAbAADAAEECQABABAAAAADAAEECQACAA4ATgADAAEECQADABAAJgADAAEECQAEABAAXAADAAEECQAFABYAEAADAAEECQAGABAAPgADAAEECQAKADQAbAByAGEAaQBuAHQAYQBuAGsAVgBlAHIAcwBpAG8AbgAgADEALgAwAHIAYQBpAG4AdABhAG4Aa3JhaW50YW5rAHIAYQBpAG4AdABhAG4AawBSAGUAZwB1AGwAYQByAHIAYQBpAG4AdABhAG4AawBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:normal;font-style:normal}.gf-icon{display:inline-block;font:normal normal normal 14px/1 'raintank';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gf-icon-snap-multi:before{content:"\e600"}.gf-icon-snap-single-tilt:before{content:"\e601"}.gf-icon-snap-single:before{content:"\e602"}.row-control-inner{padding:0;margin:0;position:relative}.hide-controls{padding:0}.hide-controls .row-tab{display:none}.hide-controls .add-row-panel-hint{display:none}.playlist-active .grafana-menu-zoom-out,.playlist-active .add-row-panel-hint,.playlist-active .grafana-menu-refresh,.playlist-active .top-nav-dashboards-btn,.playlist-active .top-nav-dash-actions{display:none}.playlist-active .grafana-menu-stop-playlist{display:list-item}.row-button{width:24px}.modal{max-width:800px;left:0;right:0;margin-left:auto;margin-right:auto;top:20%}.dashboard-fullscreen .main-view-container{overflow:hidden;height:0;padding:0}.dashboard-fullscreen .main-view-container .row-control-inner{display:none}.histogram-chart{position:relative}.scrollable{max-height:300px;overflow:auto}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar:hover{height:8px}::-webkit-scrollbar-button:start:decrement,::-webkit-scrollbar-button:end:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement{display:none}::-webkit-scrollbar-button:horizontal:increment{display:none}::-webkit-scrollbar-button:vertical:decrement{display:none}::-webkit-scrollbar-button:vertical:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement:active{background-image:none}::-webkit-scrollbar-button:horizontal:increment:active{background-image:none}::-webkit-scrollbar-button:vertical:decrement:active{background-image:none}::-webkit-scrollbar-button:vertical:increment:active{background-image:none}::-webkit-scrollbar-track-piece{background-color:transparent}::-webkit-scrollbar-thumb:vertical{height:50px;background:-webkit-gradient(linear,left top,right top,color-stop(0%,#3a3a3a),color-stop(100%,#3a3a3a));border:1px solid #000;border-top:1px solid #000;border-left:1px solid #000}::-webkit-scrollbar-thumb:horizontal{width:50px;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#3a3a3a),color-stop(100%,#3a3a3a));border:1px solid #000;border-top:1px solid #000;border-left:1px solid #000}.sp-replacer{background:inherit;border:0;color:inherit;padding:0}.sp-replacer:hover,.sp-replacer.sp-active{border-color:inherit;color:inherit}.sp-container{border-radius:0;background-color:#262626;border:0;padding:0}.sp-palette-container,.sp-picker-container{border:0}.sp-dd{display:none}.sp-preview{position:relative;width:15px;height:15px;border:0;margin-right:5px;float:left;z-index:0}.datapoints-warning{pointer:none;position:absolute;top:50%;left:50%;z-index:10;margin-top:-50px;margin-left:-100px;width:200px;text-align:center;cursor:auto;padding:10px}.metrics-editor-help:hover .hide{display:block}.grafana-tooltip{position:absolute;top:-1000;left:0;color:#c8c8c8;padding:10px;font-size:11pt;font-weight:200;background-color:#3a3939;border-radius:5px;z-index:9999;max-width:800px;max-height:600px;overflow:hidden;line-height:14px}.grafana-tooltip a{color:#e3e3e3}.grafana-tooltip hr{padding:2px;color:#c8c8c8;margin:0;border-bottom:0 solid #c8c8c8}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip-inner{max-width:400px}.grafana-version-info{position:absolute;bottom:2px;left:3px;font-size:80%;color:#7b7b7b}.grafana-version-info a{color:#7b7b7b}.template-variable{color:#32d1df}.grafana-info-box:before{content:"\f05a";font-family:'FontAwesome';position:absolute;top:-8px;left:-8px;font-size:20px;color:#33b5e5}.grafana-info-box{position:relative;padding:5px 15px;background-color:#262626;border:1px solid #000}.grafana-info-box h5{margin-top:5px}.grafana-tip{padding-left:5px}.shortcut-table td{padding:3px}.shortcut-table th:last-child{text-align:left}.shortcut-table td:first-child{text-align:right}.confirm-modal{border:1px solid #333;max-width:500px;background-color:#1f1f1f;text-align:center}.confirm-modal .modal-close{float:right;font-size:140%;padding:10px}.confirm-modal .confirm-modal-icon{padding-top:41px;font-size:280%;color:#690;padding-bottom:20px}.confirm-modal .confirm-modal-title{font-size:18px;color:#e3e3e3;margin-bottom:15px}.confirm-modal .confirm-modal-text{font-size:16px}.confirm-modal .confirm-modal-buttons{margin-top:35px;margin-bottom:35px}.confirm-modal .confirm-modal-buttons button{margin-right:5px}.share-snapshot{text-align:center}.share-snapshot .gf-icon-snap-multi{font-size:70px}.share-snapshot .fa-spinner{font-size:70px}.share-snapshot .share-snapshot-info-text{margin:10px 105px}.share-snapshot .share-snapshot-info-text strong{color:#fff;font-weight:bold}.share-snapshot .share-snapshot-header{margin:20px 0 22px 0}.share-snapshot .tight-form{text-align:left}.share-snapshot .share-snapshot-link{max-width:716px;white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}
/*!
* Bootstrap Responsive v2.3.2
*
diff --git a/public/css/grafana.light.min.css b/public/css/grafana.light.min.css
index 8faf55c17f9..dc0430c785b 100644
--- a/public/css/grafana.light.min.css
+++ b/public/css/grafana.light.min.css
@@ -949,7 +949,7 @@ See http://bgrins.github.io/spectrum/themes/ for instructions.
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world by @mdo and @fat.
- */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.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}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{max-width:100%;width:auto\9;height:auto;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"]{-webkit-appearance:button;cursor:pointer}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{*{text-shadow:none!important;color:#000!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}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#555;background-color:#eaeaea}a{color:#555;text-decoration:none}a:hover,a:focus{color:#222;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;content:"";line-height:0}.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;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%}.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;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0}.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,a.muted:focus{color:#808080}.text-warning{color:#ff934b}a.text-warning:hover,a.text-warning:focus{color:#ff7518}.text-error{color:#ff7169}a.text-error:hover,a.text-error:focus{color:#ff4136}.text-info{color:#af78ca}a.text-info:hover,a.text-info:focus{color:#9954bb}.text-success{color:#3dd441}a.text-success:hover,a.text-success:focus{color:#28b62c}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:#222;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 #f9f9f9}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;*display:inline;*zoom:1;padding-left:5px;padding-right: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;content:"";line-height:0}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #f9f9f9;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 #f9f9f9}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}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 #f9f9f9;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:Menlo,Monaco,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;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap}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:3px;-moz-border-radius:3px;border-radius:3px}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:#020202;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;vertical-align:middle}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 #999;-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,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;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;border:1px solid #999;background-color:#fff}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;background-color:#fcfcfc;border-color:#999;-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);cursor:not-allowed}.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;content:"";line-height:0}.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:#f9f9f9}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:#ff934b}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#ff934b}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#ff934b;-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:#ff7518;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd0b1;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd0b1;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd0b1}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#ff934b;background-color:#ff7518;border-color:#ff934b}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#ff7169}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#ff7169}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#ff7169;-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:#ff4136;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd2cf;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd2cf;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd2cf}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#ff7169;background-color:#ff4136;border-color:#ff7169}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#3dd441}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#3dd441}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#3dd441;-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:#28b62c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #90e793;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #90e793;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #90e793}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#3dd441;background-color:#28b62c;border-color:#3dd441}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#af78ca}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#af78ca}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#af78ca;-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:#9954bb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dac1e7;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dac1e7;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dac1e7}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#af78ca;background-color:#9954bb;border-color:#af78ca}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;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#7c7c7c}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;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,.input-append .popover,.input-prepend .popover{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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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:#f9f9f9;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:#90e793;border-color:#28b62c}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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;*zoom:1;margin-bottom:0;vertical-align:middle}.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;content:"";line-height:0}.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:#eaeaea}.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:3px;-moz-border-radius:3px;border-radius:3px}.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,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius: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:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.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:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.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:#e8f8fd}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:#28b62c}.table tbody tr.error>td{background-color:#ff4136}.table tbody tr.warning>td{background-color:#ff7518}.table tbody tr.info>td{background-color:#9954bb}.table-hover tbody tr.success:hover>td{background-color:#23a127}.table-hover tbody tr.error:hover>td{background-color:#ff291c}.table-hover tbody tr.warning:hover>td{background-color:#fe6600}.table-hover tbody tr.info:hover>td{background-color:#8d46b0}.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,.dropdown-submenu:focus>a{text-decoration:none;color:#fff;background-color:#24ade0;background-image:-moz-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2ab2e4),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-o-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:linear-gradient(to bottom,#2ab2e4,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2ab2e4',endColorstr='#ff1ca6d9',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#24ade0;background-image:-moz-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2ab2e4),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-o-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:linear-gradient(to bottom,#2ab2e4,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2ab2e4',endColorstr='#ff1ca6d9',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #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;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#ccc;margin-top:5px;margin-right:-10px}.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-left:20px;padding-right:20px}.typeahead{z-index:1051;margin-top:2px;-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,.close:focus{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;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#e9e9e9;background-image:-moz-linear-gradient(top,#f9f9f9,#d2d2d2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f9f9f9),to(#d2d2d2));background-image:-webkit-linear-gradient(top,#f9f9f9,#d2d2d2);background-image:-o-linear-gradient(top,#f9f9f9,#d2d2d2);background-image:linear-gradient(to bottom,#f9f9f9,#d2d2d2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9',endColorstr='#ffd2d2d2',GradientType=0);border-color:#d2d2d2 #d2d2d2 #acacac;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#d2d2d2;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#d2d2d2;*background-color:#c6c6c6}.btn:active,.btn.active{background-color:#b9b9b9 \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{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,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(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:22px 30px;font-size:17.5px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.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:2px 6px;font-size:10.5px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.btn-block{display:block;width:100%;padding-left:0;padding-right: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-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#32b2e1;background-image:-moz-linear-gradient(top,#41bae7,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#41bae7),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#41bae7,#1ca6d9);background-image:-o-linear-gradient(top,#41bae7,#1ca6d9);background-image:linear-gradient(to bottom,#41bae7,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff41bae7',endColorstr='#ff1ca6d9',GradientType=0);border-color:#1ca6d9 #1ca6d9 #137295;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#1ca6d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#1ca6d9;*background-color:#1995c2}.btn-primary:active,.btn-primary.active{background-color:#1683ac \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#fe781e;background-image:-moz-linear-gradient(top,#ff8432,#fe6600);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff8432),to(#fe6600));background-image:-webkit-linear-gradient(top,#ff8432,#fe6600);background-image:-o-linear-gradient(top,#ff8432,#fe6600);background-image:linear-gradient(to bottom,#ff8432,#fe6600);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff8432',endColorstr='#fffe6600',GradientType=0);border-color:#fe6600 #fe6600 #b14700;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#fe6600;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#fe6600;*background-color:#e45c00}.btn-warning:active,.btn-warning.active{background-color:#cb5200 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ff463b;background-image:-moz-linear-gradient(top,#ff5950,#ff291c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff5950),to(#ff291c));background-image:-webkit-linear-gradient(top,#ff5950,#ff291c);background-image:-o-linear-gradient(top,#ff5950,#ff291c);background-image:linear-gradient(to bottom,#ff5950,#ff291c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff5950',endColorstr='#ffff291c',GradientType=0);border-color:#ff291c #ff291c #cf0b00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#ff291c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#ff291c;*background-color:#ff1103}.btn-danger:active,.btn-danger.active{background-color:#e80d00 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#29ba2d;background-image:-moz-linear-gradient(top,#2dcb31,#23a127);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2dcb31),to(#23a127));background-image:-webkit-linear-gradient(top,#2dcb31,#23a127);background-image:-o-linear-gradient(top,#2dcb31,#23a127);background-image:linear-gradient(to bottom,#2dcb31,#23a127);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2dcb31',endColorstr='#ff23a127',GradientType=0);border-color:#23a127 #23a127 #166218;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#23a127;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#23a127;*background-color:#1f8c22}.btn-success:active,.btn-success.active{background-color:#1a771d \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#9b59bb;background-image:-moz-linear-gradient(top,#a466c2,#8d46b0);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a466c2),to(#8d46b0));background-image:-webkit-linear-gradient(top,#a466c2,#8d46b0);background-image:-o-linear-gradient(top,#a466c2,#8d46b0);background-image:linear-gradient(to bottom,#a466c2,#8d46b0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa466c2',endColorstr='#ff8d46b0',GradientType=0);border-color:#8d46b0 #8d46b0 #613079;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#8d46b0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#8d46b0;*background-color:#7e3f9d}.btn-info:active,.btn-info.active{background-color:#6f378b \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#4b4b4b;background-image:-moz-linear-gradient(top,#555,#3c3c3c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#555),to(#3c3c3c));background-image:-webkit-linear-gradient(top,#555,#3c3c3c);background-image:-o-linear-gradient(top,#555,#3c3c3c);background-image:linear-gradient(to bottom,#555,#3c3c3c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff555555',endColorstr='#ff3c3c3c',GradientType=0);border-color:#3c3c3c #3c3c3c #161616;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#3c3c3c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#3c3c3c;*background-color:#2f2f2f}.btn-inverse:active,.btn-inverse.active{background-color:#222 \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{border-color:transparent;cursor:pointer;color:#555;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#222;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#ff7518;border:1px solid transparent;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.alert,.alert h4{color:#ff934b}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#28b62c;border-color:transparent;color:#3dd441}.alert-success h4{color:#3dd441}.alert-danger,.alert-error{background-color:#ff4136;border-color:transparent;color:#ff7169}.alert-danger h4,.alert-error h4{color:#ff7169}.alert-info{background-color:#9954bb;border-color:transparent;color:#af78ca}.alert-info h4{color:#af78ca}.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-left:0;margin-bottom:20px;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f9f9f9}.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-left:15px;padding-right:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-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,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#555}.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;content:"";line-height:0}.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,.nav-tabs>li>a:focus{border-color:#f9f9f9 #f9f9f9 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;background-color:#eaeaea;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.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,.nav-pills>.active>a:focus{color:#fff;background-color:#555}.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;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2}.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{border-top-color:#555;border-bottom-color:#555;margin-top:6px}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#222;border-bottom-color:#222}.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,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{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,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0}.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,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{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,.tabs-left>.nav-tabs>li>a:focus{border-color:#f9f9f9 #ddd #f9f9f9 #f9f9f9}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{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,.tabs-right>.nav-tabs>li>a:focus{border-color:#f9f9f9 #f9f9f9 #f9f9f9 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default}.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2}.navbar-inner{min-height:52px;padding-left:20px;padding-right:20px;background-color:#f8f8f8;background-image:-moz-linear-gradient(top,#f8f8f8,#f8f8f8);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f8f8f8),to(#f8f8f8));background-image:-webkit-linear-gradient(top,#f8f8f8,#f8f8f8);background-image:-o-linear-gradient(top,#f8f8f8,#f8f8f8);background-image:linear-gradient(to bottom,#f8f8f8,#f8f8f8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8f8f8',endColorstr='#fff8f8f8',GradientType=0);border:1px solid none;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-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);*zoom:1}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{float:left;display:block;padding:16px 20px 16px;margin-left:-20px;font-size:20px;font-weight:200;color:#666;text-shadow:0 1px 0 #f8f8f8}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:52px;color:#666}.navbar-link{color:#666}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:52px;margin:0 9px;border-left:1px solid #f8f8f8;border-right:1px solid #f8f8f8}.navbar .btn,.navbar .btn-group{margin-top:11px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:11px}.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:11px;margin-bottom:0}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;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-left:0;padding-right: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,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(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:16px 15px 16px;color:#666;text-decoration:none;text-shadow:0 1px 0 #f8f8f8}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333;text-decoration:none}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e7e7e7;-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-left:5px;margin-right:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ebebeb;background-image:-moz-linear-gradient(top,#ebebeb,#ebebeb);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ebebeb),to(#ebebeb));background-image:-webkit-linear-gradient(top,#ebebeb,#ebebeb);background-image:-o-linear-gradient(top,#ebebeb,#ebebeb);background-image:linear-gradient(to bottom,#ebebeb,#ebebeb);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#ffebebeb',GradientType=0);border-color:#ebebeb #ebebeb #c5c5c5;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#ebebeb;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#ebebeb;*background-color:#dedede}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#d2d2d2 \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{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:9px}.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:10px}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0;bottom:-7px;top:auto}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #fff;border-bottom:0;bottom:-6px;top:auto}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e7e7e7;color:#555}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#666;border-bottom-color:#666}.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{left:auto;right:0}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-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:#2ab2e4;background-image:-moz-linear-gradient(top,#2ab2e4,#2ab2e4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2ab2e4),to(#2ab2e4));background-image:-webkit-linear-gradient(top,#2ab2e4,#2ab2e4);background-image:-o-linear-gradient(top,#2ab2e4,#2ab2e4);background-image:linear-gradient(to bottom,#2ab2e4,#2ab2e4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2ab2e4',endColorstr='#ff2ab2e4',GradientType=0);border-color:transparent}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#fff}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:rgba(0,0,0,0.05);color:#fff}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#2ab2e4}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-left-color:#2ab2e4;border-right-color:#2ab2e4}.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{background-color:#2ab2e4;color:#fff}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.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:#9bdbf2;border-color:#2ab2e4;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#333}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#333}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#333}.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;-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);outline:0}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#1ca6d9;background-image:-moz-linear-gradient(top,#1ca6d9,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1ca6d9),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#1ca6d9,#1ca6d9);background-image:-o-linear-gradient(top,#1ca6d9,#1ca6d9);background-image:linear-gradient(to bottom,#1ca6d9,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1ca6d9',endColorstr='#ff1ca6d9',GradientType=0);border-color:#1ca6d9 #1ca6d9 #137295;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#1ca6d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#1ca6d9;*background-color:#1995c2}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#1683ac \9}.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:.7;filter:alpha(opacity=70)}.modal{position:fixed;z-index:1050;width:100%;background-color:#fff;-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;outline:0}.modal.fade{-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;top:-25%}.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;overflow-y:auto;padding:15px}.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-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;*zoom:1}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#333}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#fff;border-bottom:1px solid #f2f2f2;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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:16px}.popover .arrow:after{border-width:15px;content:""}.popover.top .arrow{left:50%;margin-left:-16px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-16px}.popover.top .arrow:after{bottom:1px;margin-left:-15px;border-bottom-width:0;border-top-color:#fff}.popover.right .arrow{top:50%;left:-16px;margin-top:-16px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right .arrow:after{left:1px;bottom:-15px;border-left-width:0;border-right-color:#fff}.popover.bottom .arrow{left:50%;margin-left:-16px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-16px}.popover.bottom .arrow:after{top:1px;margin-left:-15px;border-top-width:0;border-bottom-color:#fff}.popover.left .arrow{top:50%;right:-16px;margin-top:-16px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-15px}.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;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#ff7169}.label-important[href],.badge-important[href]{background-color:#ff4136}.label-warning,.badge-warning{background-color:#ff7518}.label-warning[href],.badge-warning[href]{background-color:#e45c00}.label-success,.badge-success{background-color:#3dd441}.label-success[href],.badge-success[href]{background-color:#28b62c}.label-info,.badge-info{background-color:#af78ca}.label-info[href],.badge-info[href]{background-color:#9954bb}.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}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}body{font-weight:300;background:#eaeaea}blockquote{padding:10px 15px;background-color:#f9f9f9;border-left-color:#555}blockquote.pull-right{padding:10px 15px;border-right-color:#555}blockquote small{color:#555}.muted{color:#555}.text-warning{color:#ff7518}a.text-warning:hover{color:#e45c00}.text-error{color:#ff4136}a.text-error:hover{color:#ff1103}.text-info{color:#9954bb}a.text-info:hover{color:#7e3f9d}.text-success{color:#28b62c}a.text-success:hover{color:#1f8c22}.navbar .navbar-inner{background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar .brand{padding:0 15px}.navbar .brand:hover{color:#333}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-bottom:1px solid #2ab2e4;background-color:transparent}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555}.navbar .nav li.dropdown.open>.dropdown-toggle:hover,.navbar .nav li.dropdown.active>.dropdown-toggle:hover,.navbar .nav li.dropdown.open.active>.dropdown-toggle:hover{color:#f9f9f9}.navbar .navbar-search .search-query{line-height:normal}.navbar-inverse .brand,.navbar-inverse .nav>li>a{text-shadow:none}.navbar-inverse .brand:hover,.navbar-inverse .nav>.active>a,.navbar-inverse .nav>.active>a:hover,.navbar-inverse .nav>.active>a:focus{background-color:rgba(0,0,0,0.05);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;color:#fff}.navbar-inverse .navbar-search .search-query{color:#222}div.subnav{margin:0 1px;background:#999 none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}div.subnav .nav{background-color:transparent}div.subnav .nav>li>a{border-color:transparent}div.subnav .nav>.active>a,div.subnav .nav>.active>a:hover{border-color:transparent;background-color:#000;color:#fff;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav-fixed{top:53px;margin:0}.nav .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#2ab2e4}.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs li>a:hover,.nav-tabs li.active>a,.nav-tabs li.active>a:hover{border-color:transparent;background-color:transparent;border-bottom:2px solid #2ab2e4;color:#2ab2e4}.nav-tabs li.disabled>a{color:#555}.nav-tabs .open .dropdown-toggle{background-color:#060606;border-color:transparent}.tabs-below>.nav-tabs>li>a,.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0}.nav-pills>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;color:#000}.nav-pills>li>a:hover{background-color:#000;color:#fff}.nav-pills>.disabled>a,.nav-pills>.disabled>a:hover{background-color:#f9f9f9;color:#333}.nav-list>li>a{color:#222}.nav-list>li>a:hover{background-color:#2ab2e4;color:#fff;text-shadow:none}.nav-list .nav-header{color:#222}.nav-list .divider{background-color:#555;border-bottom:0}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>li>a,.pagination ul>li>span{margin-right:6px;color:#222}.pagination ul>li>a:hover,.pagination ul>li>span:hover{background-color:#222;color:#fff}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{margin-right:0}.pagination ul>.active>a,.pagination ul>.active>span{color:#fff}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{background-color:#f9f9f9;color:#333}.pager li>a,.pager li>span{background-color:#999;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;color:#222}.pager li>a:hover,.pager li>span:hover{background-color:#222;color:#fff}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>span{background-color:#f9f9f9;color:#333}.breadcrumb{background-color:#999}.breadcrumb li{text-shadow:none}.breadcrumb .divider,.breadcrumb .active{color:#222;text-shadow:none}.btn{padding:5px 12px;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-shadow:none}.btn.disabled{box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-large{padding:14px 23px}.btn-small{padding:2px 10px}.btn-mini{padding:2px 6px}.btn-group>.btn:first-child,.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}legend,label{color:#555;border-bottom:0 solid #222}.table tbody tr.success td{color:#fff}.table tbody tr.error td{color:#fff}.table tbody tr.info td{color:#fff}.table-bordered{-webkit-border-radius:0;-moz-border-radius:0;border-radius: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-radius:0;-moz-border-radius:0;border-radius:0}.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-radius:0;-moz-border-radius:0;border-radius:0}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"]{color:#222}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#ff7518}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#ff7518;color:#222}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#ff4136}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#ff4136;color:#222}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#28b62c}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#28b62c;color:#222}legend{border-bottom:0;color:#222}.form-actions{border-top:0;background-color:#f9f9f9}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.alert{text-shadow:none}.alert-heading,.alert h1,.alert h2,.alert h3,.alert h4,.alert h5,.alert h6{color:#fff}.label-success{background-color:#28b62c}.label-important{background-color:#ff4136}.label-info{background-color:#9954bb}.label-inverse{background-color:#000}.badge{border-radius:0;font-weight:200}a:hover{text-decoration:none}.hero-unit{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.well{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}a.thumbnail{background-color:#999}a.thumbnail:hover{background-color:#555;border-color:transparent}.progress{background-color:#f9f9f9;background-image:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.modal{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background-color:#eaeaea}.modal-header{border-bottom:0}.modal-footer{border-top:0;background-color:transparent}.popover{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.popover-title{border-bottom:0;color:#fff}@media(max-width:767px){div.panel{width:100%!important;padding:0!important}}.container-fluid{padding-left:0;padding-right:0}.main-view-container{padding:5px 10px;width:100%;box-sizing:border-box}.bgNav{background:#f8f8f8}.bgPrimary{background:#41bae7;color:rgba(255,255,255,0.9)}.bgInfo{background:#a466c2;color:rgba(255,255,255,0.9)}.bgSuccess{background:#2dcb31;color:rgba(255,255,255,0.9)}.bgWarning{background:#ff8432;color:rgba(255,255,255,0.9)}.bgDanger{background:#ff5950;color:rgba(255,255,255,0.9)}.bgInverse{background:#555;color:rgba(255,255,255,0.9)}code,pre{background-color:#f9f9f9}div.editor-row{vertical-align:top}div.editor-row div.section{margin-right:20px;vertical-align:top;display:inline-block}div.editor-option{vertical-align:top;display:inline-block;margin-right:10px}div.editor-option label{display:block}#events{font-size:12px}.version{font-size:85%}.legend{color:#000}div.fake-input{background-color:#fff;border:1px solid #999;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;border-radius:3px 3px 3px 3px}hr.small{margin:5px 0}form input.ng-invalid{color:#ff7169}.editor-title{margin-right:10px;font-size:1.7em;font-weight:bold;text-transform:capitalize}.editor-title small{opacity:.5;font-size:.7em;font-weight:normal}.bordered{border:1px solid #ddd}.table-unpadded th,.table-unpadded td{padding:0 2px}.spy{position:absolute;right:0;top:0}.navbar-inner{border-width:0}.grafana-row{margin-bottom:5px}.row-tab .dropdown-menu-right{top:0;left:33px}.row-tab-button{padding:0;cursor:pointer;vertical-align:middle;width:30px;height:30px;text-align:center;display:inline-block;line-height:30px}.row-button{width:30px;float:left;cursor:pointer;line-height:31px}.row-text{white-space:nowrap;text-transform:uppercase;font-weight:bold;font-size:.9em;text-align:center;line-height:31px;height:31px}.row-close{padding:0;margin:0;background:#fff;text-align:center}.row-close-buttons{position:absolute;left:0}.row-open{margin-top:5px;left:-34px;position:absolute;z-index:100;transition:.10s left;transition-delay:.10s;-webkit-transition-delay:.10s}.row-open:hover{left:-12px}.odd{background-color:#f9f9f9}.nomargin{margin:0}[ng\:cloak],[ng-cloak],.ng-cloak{display:none!important}.table tbody+tbody{border-top:0}.ui-draggable-dragging{display:block;z-index:9999}.link{color:#555;cursor:pointer}.link:hover{color:#222}.pointer{cursor:pointer}.popover{max-width:480px}.tiny{font-size:50%}.smaller{font-size:70%}.small{font-size:85%}.large{font-size:120%}.strong{font-weight:bold}a{cursor:pointer}.normal{font-weight:normal}.light{font-weight:200}.input-smaller{width:75px}.string{color:#626262}.number{color:#ba8bd1}.boolean{color:#ffa365}.key{color:#ff8983}.btn-active{background-color:#e6e6e6;background-image:none;box-shadow:0 2px 4px rgba(0,0,0,0.15) inset,0 1px 2px rgba(0,0,0,0.05);outline:0 none}.remove:hover{background-color:#ff291c}.faded{opacity:.2}div.flot-text{color:#555!important}.page-alert-list{z-index:8000;min-width:300px;max-width:300px;position:fixed;right:20px;top:56px}.page-alert-list .alert{color:#fff;padding-bottom:13px;position:relative}.page-alert-list .alert-close{position:absolute;top:-4px;right:-2px;width:19px;height:19px;padding:0;background:#f9f9f9;border-radius:50%;border:0;font-size:1.1rem;color:#222}.page-alert-list .alert-title{font-weight:bold;padding-bottom:2px}.alert-warning{background-color:#ff7518;border-color:transparent;color:#ff934b}.popover.topLeft{margin-top:-10px}.popover.topLeft .arrow{bottom:-10px;left:25%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#fff}.popover.topLeft .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.topRight{margin-top:-10px}.popover.topRight .arrow{bottom:-10px;left:75%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#fff}.popover.topRight .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.rightTop .arrow{top:10%;left:-16px;margin-top:-16px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightTop .arrow:after{left:1px;bottom:-15px;border-left-width:0;border-right-color:#fff}.popover.rightBottom .arrow{top:90%;left:-16px;margin-top:-16px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightBottom .arrow:after{left:1px;bottom:-15px;border-left-width:0;border-right-color:#fff}.popover.bottomLeft .arrow{left:10%;margin-left:-16px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-16px}.popover.bottomLeft .arrow:after{top:1px;margin-left:-15px;border-top-width:0;border-bottom-color:#fff}.popover.bottomRight .arrow{left:90%;margin-left:-16px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-16px}.popover.bottomRight .arrow:after{top:1px;margin-left:-15px;border-top-width:0;border-bottom-color:#fff}.popover.leftTop .arrow{top:10%;right:-16px;margin-top:-16px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftTop .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-15px}.popover.leftBottom .arrow{top:90%;right:-16px;margin-top:-16px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftBottom .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-15px}.popover.topLeft .arrow{left:10%;margin-left:-16px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-16px}.popover.topLeft .arrow:after{bottom:1px;margin-left:-15px;border-bottom-width:0;border-top-color:#fff}.popover.topRight .arrow{left:90%;margin-left:-16px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-16px}.popover.topRight .arrow:after{bottom:1px;margin-left:-15px;border-bottom-width:0;border-top-color:#fff}.typeahead{max-height:300px;overflow-y:auto}.label-tag{background-color:#9954bb;color:#f2f2f2;border-radius:2px;text-shadow:none;font-size:13px;padding:4px 6px}.label-tag .icon-tag{position:relative;top:1px;padding-right:4px}.label-tag:hover{opacity:.85;background-color:#7e3f9d}.save-dashboard-dropdown{padding:10px}.save-dashboard-dropdown li>a{padding-left:5px}.save-dashboard-dropdown-save-form{margin-bottom:5px}.inspector-request-table td{padding:5px}.inspector-request-table td:first-child{white-space:nowrap}.modal-body{padding:0}code,pre{background-color:#fff;color:#555}.login-form{width:50%;float:left;margin-left:25%;margin-right:25%;padding-top:50px}.login-box{width:700px;margin:100px auto 0 auto}.login-box-logo{text-align:center;padding-bottom:50px}.login-inner-box{background:#fff}.login-tab-header{background:#efefef;text-align:center}.btn-login-tab{background:transparent;border:0;font-size:15px;padding:10px 10px;font-weight:bold;display:inline-block;width:170px;color:#555}.btn-login-tab.active{background:#e2e2e2;color:#fff}.btn-login-tab:focus{outline:0}.password-strength{display:block;width:50px;overflow:visible;white-space:nowrap;padding-top:3px;margin-left:97px;color:#222;border-top:3px solid #ff4136}.password-strength.password-strength-ok{width:170px;border-top:3px solid #ffa04e}.password-strength.password-strength-good{width:254px;border-top:3px solid #3dd441}.login-submit-button-row{text-align:center;margin-top:40px}.login-submit-button-row button{padding:9px 7px;font-size:14px;font-weight:bold;width:150px;display:inline-block;border:1px solid #6f6f6f}.login-oauth{margin-top:30px;padding:10px;background:#efefef}.login-oauth .btn-google{background:#dd4b39;color:white}.login-oauth .btn-github{background:#555;color:white}.submenu-controls-visible .panel-fullscreen{top:88px}.submenu-controls{margin:10px 10px 0 0;font-size:16px}.annotation-disabled,.annotation-disabled a{color:#a2a2a2}.annotation-segment label.cr1{margin-left:5px}.graph-canvas-wrapper{position:relative;cursor:crosshair}.graph-legend{margin:0 20px;text-align:center}.graph-legend .popover-content{padding:0}.graph-legend-icon{position:relative;padding-right:4px;top:1px}.graph-legend-icon,.graph-legend-alias,.graph-legend-value{float:left;white-space:nowrap;font-size:85%;text-align:left}.graph-legend-icon.current:before,.graph-legend-alias.current:before,.graph-legend-value.current:before{content:"Current: "}.graph-legend-icon.max:before,.graph-legend-alias.max:before,.graph-legend-value.max:before{content:"Max: "}.graph-legend-icon.min:before,.graph-legend-alias.min:before,.graph-legend-value.min:before{content:"Min: "}.graph-legend-icon.total:before,.graph-legend-alias.total:before,.graph-legend-value.total:before{content:"Total: "}.graph-legend-icon.avg:before,.graph-legend-alias.avg:before,.graph-legend-value.avg:before{content:"Avg: "}.graph-legend-icon .fa{font-size:135%;position:relative;top:1px}.graph-legend-series{float:left;white-space:nowrap;padding-left:10px;padding-top:6px}.graph-legend-value{padding-left:6px}.graph-legend-table{display:table;width:100%;margin:0}.graph-legend-table .graph-legend-series{display:table-row;float:none;padding-left:0}.graph-legend-table .graph-legend-series.pull-right{float:none}.graph-legend-table td,.graph-legend-table .graph-legend-alias,.graph-legend-table .graph-legend-icon,.graph-legend-table .graph-legend-value{float:none;display:table-cell;white-space:nowrap;padding:2px 10px;text-align:right;border-bottom:1px solid #eee}.graph-legend-table .graph-legend-icon{width:5px;padding:0;top:0}.graph-legend-table .graph-legend-icon .fa{top:4px}.graph-legend-table .graph-legend-value{padding-left:15px}.graph-legend-table .graph-legend-alias{padding-left:7px;text-align:left;width:95%}.graph-legend-table .graph-legend-series:nth-child(odd){background-color:#e4e4e4}.graph-legend-table .graph-legend-value.current:before,.graph-legend-table .graph-legend-value.max:before,.graph-legend-table .graph-legend-value.min:before,.graph-legend-table .graph-legend-value.total:before,.graph-legend-table .graph-legend-value.avg:before{content:''}.graph-legend-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#2ab2e4;font-size:85%;white-space:nowrap}.graph-legend-rightside.graph-wrapper{display:table;width:100%}.graph-legend-rightside .graph-canvas-wrapper{display:table-cell;width:100%;position:relative}.graph-legend-rightside .graph-legend-wrapper{display:table-cell;vertical-align:top;position:relative;left:4px}.graph-legend-rightside .graph-legend{margin:0}.graph-legend-rightside .graph-legend-series{display:block;padding-left:0}.graph-legend-rightside .graph-legend-table .graph-legend-series{display:table-row}.graph-legend-series-hidden a{color:#a2a2a2}.graph-legend-popover{width:200px}.graph-legend-popover label{display:inline-block}.graph-legend-popover .btn{padding:1px 3px;margin-right:0;line-height:initial}.graph-legend-popover .close{margin-right:5px;color:#555;opacity:.7;text-shadow:none}.graph-legend-popover .editor-row{padding:5px}.annotation-tags{color:#9954bb}.graph-series-override input{float:left;margin-right:10px}.graph-series-override .graph-series-override-option{float:left;padding:2px 6px}.graph-series-override .graph-series-override-selector{float:left}.graph-tooltip{white-space:nowrap}.graph-tooltip .graph-tooltip-time{text-align:center;font-weight:bold;position:relative;top:-3px}.graph-tooltip .graph-tooltip-list-item{display:table-row}.graph-tooltip .graph-tooltip-series-name{display:table-cell}.graph-tooltip .graph-tooltip-value{display:table-cell;font-weight:bold;padding-left:10px;text-align:right}.left-yaxis-label{top:50%;left:-5px;transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);transform-origin:left top;-o-transform-origin:left top;-ms-transform-origin:left top;-moz-transform-origin:left top;-webkit-transform-origin:left top}.right-yaxis-label{top:50%;right:-5px;-webkit-transform:rotate(90deg);-webkit-transform-origin:right top;-moz-transform:rotate(90deg);-moz-transform-origin:right top;-ms-transform:rotate(90deg);-ms-transform-origin:right top;-o-transform:rotate(90deg);-o-transform-origin:right top;transform:rotate(90deg);transform-origin:right top}.axisLabel{color:#555;font-size:11.9px;position:absolute;text-align:center;font-size:12px}.bootstrap-tagsinput{display:inline-block;padding:4px 6px;margin-bottom:10px;color:#555;vertical-align:middle;border-radius:4px;max-width:100%;line-height:22px;background-color:#fff;border:1px solid #999;-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}.bootstrap-tagsinput input{border:0;box-shadow:none;outline:0;background-color:transparent;padding:0;padding-left:5px;margin:0;width:auto!important;max-width:inherit}.bootstrap-tagsinput input:focus{border:0;box-shadow:none}.bootstrap-tagsinput .tag{margin-right:2px;color:white}.bootstrap-tagsinput .tag [data-role="remove"]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role="remove"]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role="remove"]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.bootstrap-tagsinput .tag [data-role="remove"]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.grafana-options-table{width:100%}.grafana-options-table th{padding:5px 10px;border-bottom:4px solid #fff}.grafana-options-table tr td{background-color:#ececec;padding:5px 10px;white-space:nowrap;border-bottom:4px solid #fff}.grafana-options-table tr td.nobg{background-color:transparent}.grafana-options-table .max-width-btns{padding-right:0}.grafana-options-table .max-width-btns .btn{box-sizing:border-box;width:100%}.max-width{overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap}.grafana-options-list{list-style:none;margin:0;max-width:450px}.grafana-options-list li:nth-child(odd){background-color:#e4e4e4}.grafana-options-list li{float:left;margin:2px;padding:5px 10px;border:1px solid #eee}.grafana-options-list li:first-child{border:1px solid #eee}.search-container{left:52px;top:33px;margin:15px;z-index:1000;position:absolute;width:700px;box-shadow:0 0 55px 0 black;padding:10px;background-color:#fff;border:1px solid #e2e2e2}.search-container .label-tag{margin-left:6px;font-size:11px;padding:2px 6px}.search-field-wrapper{padding-bottom:10px}.search-field-wrapper input{width:100%;padding:18px 8px;box-sizing:border-box}.search-field-wrapper button{margin:0 4px 0 0}.search-field-wrapper>span{display:block;overflow:hidden}.search-results-container{height:450px;overflow:auto;display:block;line-height:28px}.search-results-container .search-result-item:hover,.search-results-container .search-result-item.selected{background-color:#dfdfdf}.search-results-container .selected .search-result-tag{opacity:.70;color:white}.search-results-container .fa-star,.search-results-container .fa-star-o{padding-left:13px}.search-results-container .fa-star{color:#ff7518}.search-results-container .search-result-link{color:#555}.search-results-container .search-result-link .fa{padding-right:10px}.search-results-container .search-result-item{display:block;padding:3px 10px;white-space:nowrap;background-color:#ececec;margin-bottom:4px}.search-results-container .search-result-tags{float:right}.search-results-container .search-result-actions{float:right;padding-left:20px}.search-switches{position:absolute;top:19px;right:21px}.search-button-row{padding-top:20px}.search-button-row button,.search-button-row a{margin-right:10px}.panel{display:inline-block;float:left;vertical-align:top;position:relative}.panel-margin{margin:5px;display:block}.panel-container{background-color:#fff;position:relative;border:solid 1px #ddd}.panel-container:hover .panel-actions{display:block}.panel-container.panel-transparent{background-color:transparent;border:0}.panel-content{padding:0 10px 5px 10px}.panel-title-container{min-height:5px;padding-top:4px;cursor:context-menu}.panel-title{border:0;font-weight:bold;position:relative;cursor:context-menu;width:100%;display:block}.panel-title.has-panel-links .panel-title-text:after{content:"\f08e";font-family:'FontAwesome';font-size:80%;padding-left:10px;position:relative;top:-1px}.panel-loading{position:absolute;top:-3px;right:0;z-index:800}.panel-header{text-align:center}.panel-error{color:#fff;position:absolute;left:0;padding:0 17px 6px 5px;top:0;z-index:10}.panel-error i{position:relative;top:-2px}.panel-error-arrow{width:0;height:0;position:absolute;border-left:31px solid transparent;border-right:30px solid transparent;border-bottom:27px solid #fff;left:0;bottom:0}.panel-fullscreen{z-index:100;display:block;position:fixed;left:0;right:0;top:60px;padding:0;overflow-y:auto;height:100%}.panel-fullscreen .dropdown-menu{margin-bottom:70px}.panel-fullscreen .panel-container{margin:15px}.panel-fullscreen .panel-menu{top:0}.panel-fullscreen .panel-title-container{padding:8px}.panel-full-edit{margin-top:30px;padding-bottom:130px}.panel-menu{z-index:500;position:absolute;background:#e2e2e2;border:1px solid black;top:-62px}.panel-menu .panel-menu-row{white-space:nowrap;border-bottom:1px solid black}.panel-menu .panel-menu-row:last-child{border-bottom:0}.panel-menu .panel-menu-link,.panel-menu .panel-menu-icon{padding:5px 10px}.panel-menu .panel-menu-link{display:inline-block;border-right:1px solid black}.panel-menu .panel-menu-link:last-child{border:0}.panel-menu .dropdown-menu{text-align:left}.panel-highlight{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.on-drag-hover .panel-container{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.panel-drop-zone{display:none}.panel-drop-zone .panel-container{border:1px solid #333}.panel-ghost{width:100%}.panel-ghost .panel-container{border:0;background:transparent}.panel-ghost .panel-ghost-list{margin:10px 0 10px 20px}.panel-ghost button{text-align:left;min-width:135px}.panel-ghost button .fa{position:relative;left:-5px}.panel-time-info{font-weight:bold;float:right;margin-right:15px;color:#2ab2e4;font-size:85%;position:absolute;top:0;right:0}input[type=text].input-fluid{width:100%;box-sizing:border-box;padding:10px;font-size:16px;-moz-box-sizing:border-box;height:100%}input[type="checkbox"].cr1{display:none}label.cr1{display:inline-block;height:19px;clear:none;text-indent:2px;margin:0 0 1px 0;padding:0 0 0 20px;vertical-align:middle;background:url('../img/checkbox_white.png') left top no-repeat;cursor:pointer}input[type="checkbox"]:checked+label{background:url('../img/checkbox_white.png') 0 -18px no-repeat}.gf-form{padding-bottom:10px}.gf-form .checkbox-label{padding-left:7px;display:inline}.gf-fluid-input{border:0;display:block;overflow:hidden;padding-right:10px}.gf-fluid-input input[type=text]{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.gf-fluid-input textarea{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.singlestat-panel{position:relative;display:table;width:100%}.singlestat-panel-value-container{padding:20px;display:table-cell;vertical-align:middle;text-align:center;position:relative;z-index:1;font-size:3em;font-weight:bold}.singlestat-panel-prefix{padding-right:20px}.singlestat-panel-table{width:100%}.singlestat-panel-table td{padding:5px 10px;white-space:nowrap;text-align:right;border-bottom:1px solid #eee}.singlestat-panel-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#2ab2e4}.singlestat-panel-table td:first-child{text-align:left}.singlestat-panel-table tr:nth-child(odd) td{background-color:#e4e4e4}.singlestat-panel-table tr:last-child td{border:0}.tight-form{border-top:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #ddd;background:#efefef;width:100%}.tight-form:last-child,.tight-form.last{border-bottom:1px solid #ddd}.tight-form.borderless{background:transparent;border:0}.tight-form .checkbox-label{display:inline;padding-right:4px;margin-bottom:0}.spaced-form .tight-form{margin:7px 0}.borderless .tight-form-item,.borderless .tight-form-input{border:0}.tight-form-container .tight-form:last-child{border-bottom:0}.tight-form-container:last-child{border-bottom:1px solid #ddd}.tight-form-btn{padding:8px 12px}.tight-form-list{list-style:none;margin:0}.tight-form-list>li{float:left}.grafana-metric-options{margin-top:35px}.tight-form-item{padding:8px 7px;font-weight:normal;border-right:1px solid #ddd;color:#555;display:inline-block}.has-open-function .tight-form-item{padding-top:25px}.tight-form-disabled .tight-form-item{color:#959595}.tight-form-item:hover,.tight-form-item:focus{text-decoration:none}.tight-form-itema:hover{background:#e2e2e2}.tight-form-item.template-param-name{border-right:0;padding-right:0;padding-left:18px}.tight-form-item.annotation-segment{padding:8px 10px}.tight-form-item.last{border-right:0}.tight-form-item .fa-caret-down{font-size:75%;position:relative;top:1px}.tight-form-item-icon i{width:15px;text-align:center;display:inline-block}.tight-form-func{background:#e2e2e2}.tight-form-func>a{color:#555}.tight-form-func>a:hover{color:#555}.tight-form-func.show-function-controls{padding-top:5px;min-width:100px;text-align:center}input[type=text].tight-form-func-param{background:transparent;border:0;margin:0;padding:0}input[type=text].tight-form-clear-input{padding:8px 7px;border:0;margin:0;background:transparent;float:left;color:#555;border-radius:0;border-right:1px solid #ddd}[type=text].tight-form-input,[type=email].tight-form-input,[type=number].tight-form-input,[type=password].tight-form-input{border:0;border-right:1px solid #ddd;margin:0;border-radius:0;padding:8px 6px;height:100%;box-sizing:border-box}[type=text].tight-form-input.last,[type=email].tight-form-input.last,[type=number].tight-form-input.last,[type=password].tight-form-input.last{border-right:0}input[type=checkbox].tight-form-checkbox{margin:0}select.tight-form-input{border:0;border-right:1px solid #ddd;margin:0;border-radius:0;height:36px;padding:8px 3px}select.tight-form-input.last{border-right:0}.tight-form-func-controls{display:none;text-align:center}.tight-form-func-controls .fa-arrow-left{float:left;position:relative;top:2px}.tight-form-func-controls .fa-arrow-right{float:right;position:relative;top:2px}.tight-form-func-controls .fa-remove{margin-left:10px}.tight-form-radio input[type=radio]{margin:0}.tight-form-radio label{display:inline}.sidemenu-canvas{position:relative}.sidemenu-wrapper{position:absolute;display:none;top:0;bottom:0;left:0;width:200px;background:#eaeaea;min-height:100%;z-index:101}.sidemenu-wrapper a:focus{text-decoration:none}.sidemenu-open .sidemenu-wrapper{display:block}.sidemenu-open .search-container{left:200px}.sidemenu-open .main-view{padding-left:200px}.sidemenu-open .panel-fullscreen{left:200px}.sidemenu{font-size:16px;font-weight:400;list-style:none;margin:0;padding:0}.sidemenu>li{margin-bottom:9px}.sidemenu .fa-caret-down{position:relative;top:2px;font-size:90%}.sidemenu.sidemenu-small{font-size:14px}.sidemenu.sidemenu-small .icon-circle{border-radius:50%;background:#fff;box-shadow:0 0 14px 2px rgba(0,0,0,0.05);border:1px solid rgba(0,0,0,0.05);width:28px;height:28px}.sidemenu.sidemenu-small .icon-circle i{top:1px;left:4px;font-size:110%}.sidemenu.sidemenu-small .sidemenu-item{line-height:28px;padding-left:25px}.sidemenu-item-text{width:110px;display:inline-block;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.sidemenu-top-btn{display:block;padding:8px 0 4px 22px;background-color:#f8f8f8;border-right:3px solid #eaeaea}.sidemenu-top-btn img{border-radius:50%;background:#fff;border:1px solid #eaeaea;width:30px;padding:4px}.sidemenu-top-btn i{padding-right:5px;padding-top:5px;font-size:170%;color:#555}.icon-circle{width:40px;height:40px;display:inline-block}.icon-circle i{color:#555;opacity:.7;position:relative;left:7px;top:5px;font-size:150%}.sidemenu-item{color:#555;line-height:40px;padding:0 10px 0 20px;display:block;white-space:nowrap}.sidemenu-item .sidemenu-item-text{padding-left:11px;transition:color 100ms ease-out}.sidemenu-item .sidemenu-item-text.no-icon{padding-left:59px}.sidemenu-item img{border-radius:50%;width:28px;height:28px;box-shadow:0 0 14px 2px rgba(255,255,255,0.05)}.sidemenu-system-section{background-color:#75caeb;color:#fff;padding:3px 0;margin-left:10px;margin-right:10px;border-radius:2px}.sidemenu-system-section .sidemenu-system-section-inner{border:2px solid black;border-left:none;border-right:0;padding:4px;overflow:hidden}.sidemenu-system-section .fa{float:left;font-size:120%;line-height:41px;padding:0 15px}.sidemenu-section-tagline{font-style:italic;font-size:75%;line-height:10px}.sidemenu-section-text-wrapper{padding-top:4px}.navbar-inner{padding-left:0}.navbar .nav>li>a{padding:17px 15px 13px}.navbar .nav>li>a .fa{font-size:115%}.top-nav{float:left;font-size:16px}.fa.top-nav-breadcrumb-icon{margin:18px 0 6px 5px;float:left;font-size:120%;color:#555}.top-nav-menu-btn{border:1px solid #eaeaea;border-radius:50%;background:#fff;display:block;position:relative;float:left;width:30px;height:30px;padding:4px;margin:6px 6px 3px 9px}.top-nav-menu-btn .fa{color:#555;width:30px;height:30px;left:9px;top:7px;font-size:150%;opacity:0;position:absolute;transition:opacity .2s ease-in-out}.top-nav-menu-btn img{width:30px;position:absolute;opacity:1;transition:opacity .2s ease-in-out}.top-nav-menu-btn:hover .fa{opacity:.7}.top-nav-menu-btn:hover img{opacity:0}.top-nav-dashboards-btn{display:block;float:left;margin:9px 18px 5px 14px;border-radius:3px;font-size:1.4em;color:#a2a2a2;border:solid 1px #f9f9f9}.top-nav-dashboards-btn a{display:inline-block;background:#e2e2e2;padding:5px 15px 5px 10px;border-radius:3px;color:#a2a2a2}.top-nav-dashboards-btn a:hover{background:#d6d6d6}.top-nav-dashboards-btn a:hover .fa{color:#555}.top-nav-dashboards-btn .fa-th-large{position:relative;top:2px}.top-nav-dashboards-btn .fa-caret-down{font-size:60%;position:relative;top:4px}.dashboard-title{padding:0 6px 5px 5px;color:#222;font-size:17px}.top-nav-icon{margin:5px 0 0 11px;line-height:41px;float:left}.top-nav-section{display:block;float:left;padding:19px 9px 8px 0;font-weight:bold}.top-nav-section i{padding-left:8px}.top-nav-title{display:block;float:left;font-size:17px;padding:18px 10px 10px 13px;color:#555}.top-nav-snapshot-title{display:block;float:left;font-size:1.4em;margin:9px 18px 5px 14px;color:#555}.top-nav-snapshot-title .gf-icon{position:relative;top:3px;font-size:27px}.top-nav-snapshot-title a{display:inline-block;padding:0 15px 5px 10px}.gf-box{margin:15px;background-color:#fff;position:relative;border:1px solid #e2e2e2}.gf-box-no-margin{margin:0}.gf-box-header-close-btn{float:right;padding:0;margin:0;background-color:transparent;border:0;padding:8px;font-size:120%;color:#555}.gf-box-header-close-btn:hover{color:#fff}.gf-box-body{padding:20px;min-height:150px}.gf-box-footer{overflow:hidden}.gf-box-header{border-bottom:1px solid #e2e2e2;overflow:hidden;background-color:#efefef}.gf-box-header .tabs{float:left}.gf-box-header .nav{margin:0}.gf-box-title{padding-right:20px;padding-left:10px;float:left;color:#555;font-size:18px;font-weight:normal;line-height:38px;margin:0}.gf-box-title .fa{padding:0 8px 0 5px;color:#555}.page-container{margin:15px;background:#fff;position:relative;border:1px solid #333;padding:20px 20px 60px 49px}.page-container h2{color:#555;font-weight:normal;font-size:22px}.page{max-width:653px}.admin-page{max-width:800px;margin-left:10px}.admin-page .gf-box{margin-top:0}.admin-page .gf-box-body{min-height:0}.admin-page h2{margin-left:15px;margin-bottom:0;font-size:17.5px;color:#555}.admin-page h2 i{padding-right:6px}.dashlist-link{display:block;margin:5px;padding:7px;background-color:#efefef;border:1px solid #ddd}.dashlist-link .fa{float:right;padding-top:3px}.dashlist-link .fa-star{color:#ff7518}.dashlist-link:hover{background-color:#e2e2e2}.admin-settings-section{color:#2ab2e4;font-weight:bold}td.admin-settings-key{padding-left:20px}input[type=text].ng-dirty.ng-invalid{box-shadow:inset 0 0 7px #ff4136}@font-face{font-family:'raintank';src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SAywAAAC8AAAAYGNtYXAaVcxZAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zm7/N1QAAAFwAAAFmGhlYWQFNK2SAAAHCAAAADZoaGVhB14DyAAAB0AAAAAkaG10eAwxAAQAAAdkAAAAHGxvY2ECNgP2AAAHgAAAABBtYXhwABcAvAAAB5AAAAAgbmFtZflvA+cAAAewAAABTnBvc3QAAwAAAAAJAAAAACAAAwQAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADmAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIOYC//3//wAAAAAAIOYA//3//wAB/+MaBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAADwAA/7YDnAO3AAMAHQAhACUAKgAuADEAQgBTAGQAdQCGAJcAqAC5AAA3FyUnJTUTJzUjJwcjJwcjFQcTBxcVIQ0BNzM1NycTAxEXJTkCByERIREHFSc3NzEzAxQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwE2FhUHNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATYWFXsKAS9VAbOKkFsDmDvbEZhXTjY/Alj+wQFGGT4mIU5TU/3CmgJU/awxICDLAWUbE40TGxsTjRMbLo0LERELjQwQEAzQHBONExsbE40UG9cQC40MEBAMjQsQ7BsTjRMbGxONExvXEAuNDBAQDIwMEAEbjRMbGxONFBsbFKgQC40MEBAMjQsQDkMvFvQEAfYoVRcXPDxGDf4JwhFKBFpdHAbPAdn+zwFIF54x/ZsCZUbPygV3/s4TGxsTjBQbHBOMqRAMjQsQEAuMDBEdjBQbHBOMFBsbFIwMEBAMjAwQAREM+RQbHBONExscEo2MjAwQEAyNCxARCy4bE4wUGxwTjRIbuo0LEBALjQwQAREMAAoAAf+5A2IDtQAQACEAMgBDAFQAZQB2AIcAkACVAAATHgE/AT4BLwEuAQ8BDgEfAT8BNhYfARYGDwEGJi8BJjY3NxceAT8BPgEvAS4BDwEOARc3FxYGDwEGJi8BJjY/ATYWFwMuAQ8BDgEfAR4BPwE+AS8BBycmNj8BNhYfARYGDwEGJicFNz4BLwEuAQ8BDgEfAR4BNzcXFgYPAQYmLwEmNj8BNhYXARMfASUvAQMFEwMlEwWdAyAVkhUYAxcDIRSTFBgDFxWTDBQBFwIODZIMFAIXAg8M3hcDIRSSFBgDFwMgFZIUGAPgFwIPDJIMFAIWAg4MkgwUAs4DIRSTFBgDFwMgFZIVGAMXyhcCDwyTDBQBFwIODZIMFAIBL5IUGAMXAyAVkhQYAxcDIRSRFwIPDJIMFAIXAg8MkgwUAv1pahUNAtUNFWv9LJ9jAmxj/ZQCFxQYAxYEIBWSFRgDFwMhFJO3FwIPDJIMFAIXAg8MkwwUAQWTFBgDFgMhFJMUGAMWAyEUIpINEwIXAg8MkwwUAhYCDg3+1xQYAxcDIRSTFBgDFwMhFJO2kwwUAhYCDgyTDBQCFgIPCwMXAyEUkxQYAxcDIBWSFBkD35MMFAIWAg4NkgwUAhYCDgwBU/1PilFwUokCsXD9VwJ9YP2DYAAKAAP/twMyA7QAEAAhADIAQwBUAGUAdgCHAIwAkQAAExQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwEyFhUBNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATIWFQERIREhExEhESF7IBelFx8fF6UXIDelDhITDaUOExQN9CAXpBcgIBekFyD8Ew2lDhMUDaQOE/7rHxelFyAgF6UXH/wUDaUOEhMNpQ0UAUykFyAgF6QXICAXxRMNpQ4TFA2kDhP9YQMv/NE7Arr9RgJOFyAgF6QXICAXpMUTDqQOExMOpA4TIaQXICAXpBcgIBekDhMTDqQOExMO/twXICAXpBcgIBekpKQOExMOpA4TEw43IBekFyAgF6QXINukDhMTDqQOExMOAeb8AwP9/PkCzP00AAEAAAABAADkYnVvXw889QALBAAAAAAA0Ty0lAAAAADRPLSUAAD/tgOcA7cAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAA5wAAQAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAACAAAAA50AAANiAAEDMgADAAAAAAAKABQAHgEWAg4CzAABAAAABwC6AA8AAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEAEAAAAAEAAAAAAAIADgBOAAEAAAAAAAMAEAAmAAEAAAAAAAQAEABcAAEAAAAAAAUAFgAQAAEAAAAAAAYACAA2AAEAAAAAAAoANABsAAMAAQQJAAEAEAAAAAMAAQQJAAIADgBOAAMAAQQJAAMAEAAmAAMAAQQJAAQAEABcAAMAAQQJAAUAFgAQAAMAAQQJAAYAEAA+AAMAAQQJAAoANABsAHIAYQBpAG4AdABhAG4AawBWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBhAGkAbgB0AGEAbgBrcmFpbnRhbmsAcgBhAGkAbgB0AGEAbgBrAFIAZQBnAHUAbABhAHIAcgBhAGkAbgB0AGEAbgBrAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAlsAAsAAAAACSAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIDLGNtYXAAAAFoAAAATAAAAEwaVcxZZ2FzcAAAAbQAAAAIAAAACAAAABBnbHlmAAABvAAABZgAAAWYbv83VGhlYWQAAAdUAAAANgAAADYFNK2SaGhlYQAAB4wAAAAkAAAAJAdeA8hobXR4AAAHsAAAABwAAAAcDDEABGxvY2EAAAfMAAAAEAAAABACNgP2bWF4cAAAB9wAAAAgAAAAIAAXALxuYW1lAAAH/AAAAU4AAAFO+W8D53Bvc3QAAAlMAAAAIAAAACAAAwAAAAMEAAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA5gIDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDmAv/9//8AAAAAACDmAP/9//8AAf/jGgQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAA8AAP+2A5wDtwADAB0AIQAlACoALgAxAEIAUwBkAHUAhgCXAKgAuQAANxclJyU1Eyc1IycHIycHIxUHEwcXFSENATczNTcnEwMRFyU5AgchESERBxUnNzcxMwMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBNhYVBzQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwE2FhV7CgEvVQGzipBbA5g72xGYV042PwJY/sEBRhk+JiFOU1P9wpoCVP2sMSAgywFlGxONExsbE40TGy6NCxERC40MEBAM0BwTjRMbGxONFBvXEAuNDBAQDI0LEOwbE40TGxsTjRMb1xALjQwQEAyMDBABG40TGxsTjRQbGxSoEAuNDBAQDI0LEA5DLxb0BAH2KFUXFzw8Rg3+CcIRSgRaXRwGzwHZ/s8BSBeeMf2bAmVGz8oFd/7OExsbE4wUGxwTjKkQDI0LEBALjAwRHYwUGxwTjBQbGxSMDBAQDIwMEAERDPkUGxwTjRMbHBKNjIwMEBAMjQsQEQsuGxOMFBscE40SG7qNCxAQC40MEAERDAAKAAH/uQNiA7UAEAAhADIAQwBUAGUAdgCHAJAAlQAAEx4BPwE+AS8BLgEPAQ4BHwE/ATYWHwEWBg8BBiYvASY2NzcXHgE/AT4BLwEuAQ8BDgEXNxcWBg8BBiYvASY2PwE2FhcDLgEPAQ4BHwEeAT8BPgEvAQcnJjY/ATYWHwEWBg8BBiYnBTc+AS8BLgEPAQ4BHwEeATc3FxYGDwEGJi8BJjY/ATYWFwETHwElLwEDBRMDJRMFnQMgFZIVGAMXAyEUkxQYAxcVkwwUARcCDg2SDBQCFwIPDN4XAyEUkhQYAxcDIBWSFBgD4BcCDwySDBQCFgIODJIMFALOAyEUkxQYAxcDIBWSFRgDF8oXAg8MkwwUARcCDg2SDBQCAS+SFBgDFwMgFZIUGAMXAyEUkRcCDwySDBQCFwIPDJIMFAL9aWoVDQLVDRVr/SyfYwJsY/2UAhcUGAMWBCAVkhUYAxcDIRSTtxcCDwySDBQCFwIPDJMMFAEFkxQYAxYDIRSTFBgDFgMhFCKSDRMCFwIPDJMMFAIWAg4N/tcUGAMXAyEUkxQYAxcDIRSTtpMMFAIWAg4MkwwUAhYCDwsDFwMhFJMUGAMXAyAVkhQZA9+TDBQCFgIODZIMFAIWAg4MAVP9T4pRcFKJArFw/VcCfWD9g2AACgAD/7cDMgO0ABAAIQAyAEMAVABlAHYAhwCMAJEAABMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBMhYVATQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwEyFhUBESERIRMRIREheyAXpRcfHxelFyA3pQ4SEw2lDhMUDfQgF6QXICAXpBcg/BMNpQ4TFA2kDhP+6x8XpRcgIBelFx/8FA2lDhITDaUNFAFMpBcgIBekFyAgF8UTDaUOExQNpA4T/WEDL/zROwK6/UYCThcgIBekFyAgF6TFEw6kDhMTDqQOEyGkFyAgF6QXICAXpA4TEw6kDhMTDv7cFyAgF6QXICAXpKSkDhMTDqQOExMONyAXpBcgIBekFyDbpA4TEw6kDhMTDgHm/AMD/fz5Asz9NAABAAAAAQAA5GJ1b18PPPUACwQAAAAAANE8tJQAAAAA0Ty0lAAA/7YDnAO3AAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOcAAEAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAgAAAAOdAAADYgABAzIAAwAAAAAACgAUAB4BFgIOAswAAQAAAAcAugAPAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABAAAAABAAAAAAACAA4ATgABAAAAAAADABAAJgABAAAAAAAEABAAXAABAAAAAAAFABYAEAABAAAAAAAGAAgANgABAAAAAAAKADQAbAADAAEECQABABAAAAADAAEECQACAA4ATgADAAEECQADABAAJgADAAEECQAEABAAXAADAAEECQAFABYAEAADAAEECQAGABAAPgADAAEECQAKADQAbAByAGEAaQBuAHQAYQBuAGsAVgBlAHIAcwBpAG8AbgAgADEALgAwAHIAYQBpAG4AdABhAG4Aa3JhaW50YW5rAHIAYQBpAG4AdABhAG4AawBSAGUAZwB1AGwAYQByAHIAYQBpAG4AdABhAG4AawBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:normal;font-style:normal}.gf-icon{display:inline-block;font:normal normal normal 14px/1 'raintank';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gf-icon-snap-multi:before{content:"\e600"}.gf-icon-snap-single-tilt:before{content:"\e601"}.gf-icon-snap-single:before{content:"\e602"}.row-control-inner{padding:0;margin:0;position:relative}.hide-controls{padding:0}.hide-controls .row-tab{display:none}.hide-controls .add-row-panel-hint{display:none}.playlist-active .grafana-menu-zoom-out,.playlist-active .add-row-panel-hint,.playlist-active .grafana-menu-refresh,.playlist-active .top-nav-dashboards-btn,.playlist-active .top-nav-dash-actions{display:none}.playlist-active .grafana-menu-stop-playlist{display:list-item}.row-button{width:24px}.modal{max-width:800px;left:0;right:0;margin-left:auto;margin-right:auto;top:20%}.dashboard-fullscreen .main-view-container{overflow:hidden;height:0;padding:0}.dashboard-fullscreen .main-view-container .row-control-inner{display:none}.histogram-chart{position:relative}.scrollable{max-height:300px;overflow:auto}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar:hover{height:8px}::-webkit-scrollbar-button:start:decrement,::-webkit-scrollbar-button:end:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement{display:none}::-webkit-scrollbar-button:horizontal:increment{display:none}::-webkit-scrollbar-button:vertical:decrement{display:none}::-webkit-scrollbar-button:vertical:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement:active{background-image:none}::-webkit-scrollbar-button:horizontal:increment:active{background-image:none}::-webkit-scrollbar-button:vertical:decrement:active{background-image:none}::-webkit-scrollbar-button:vertical:increment:active{background-image:none}::-webkit-scrollbar-track-piece{background-color:transparent}::-webkit-scrollbar-thumb:vertical{height:50px;background:-webkit-gradient(linear,left top,right top,color-stop(0%,#f9f9f9),color-stop(100%,#f9f9f9));border:1px solid #999;border-top:1px solid #999;border-left:1px solid #999}::-webkit-scrollbar-thumb:horizontal{width:50px;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#f9f9f9),color-stop(100%,#f9f9f9));border:1px solid #999;border-top:1px solid #999;border-left:1px solid #999}.sp-replacer{background:inherit;border:0;color:inherit;padding:0}.sp-replacer:hover,.sp-replacer.sp-active{border-color:inherit;color:inherit}.sp-container{border-radius:0;background-color:#f9f9f9;border:0;padding:0}.sp-palette-container,.sp-picker-container{border:0}.sp-dd{display:none}.sp-preview{position:relative;width:15px;height:15px;border:0;margin-right:5px;float:left;z-index:0}.datapoints-warning{pointer:none;position:absolute;top:50%;left:50%;z-index:10;margin-top:-50px;margin-left:-100px;width:200px;text-align:center;cursor:auto;padding:10px}.metrics-editor-help:hover .hide{display:block}.grafana-tooltip{position:absolute;top:-1000;left:0;color:#c8c8c8;padding:10px;font-size:11pt;font-weight:200;background-color:#3a3939;border-radius:5px;z-index:9999;max-width:800px;max-height:600px;overflow:hidden;line-height:14px}.grafana-tooltip a{color:#e3e3e3}.grafana-tooltip hr{padding:2px;color:#c8c8c8;margin:0;border-bottom:0 solid #c8c8c8}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip-inner{max-width:400px}.grafana-version-info{position:absolute;bottom:2px;left:3px;font-size:80%;color:#161616}.grafana-version-info a{color:#161616}.template-variable{color:#2ab2e4}.grafana-info-box:before{content:"\f05a";font-family:'FontAwesome';position:absolute;top:-8px;left:-8px;font-size:20px;color:#2ab2e4}.grafana-info-box{position:relative;padding:5px 15px;background-color:#efefef;border:1px solid #ddd}.grafana-info-box h5{margin-top:5px}.grafana-tip{padding-left:5px}.shortcut-table td{padding:3px}.shortcut-table th:last-child{text-align:left}.shortcut-table td:first-child{text-align:right}.confirm-modal{border:1px solid #e2e2e2;max-width:500px;background-color:#fff;text-align:center}.confirm-modal .modal-close{float:right;font-size:140%;padding:10px}.confirm-modal .confirm-modal-icon{padding-top:41px;font-size:280%;color:#28b62c;padding-bottom:20px}.confirm-modal .confirm-modal-title{font-size:18px;color:#555;margin-bottom:15px}.confirm-modal .confirm-modal-text{font-size:16px}.confirm-modal .confirm-modal-buttons{margin-top:35px;margin-bottom:35px}.confirm-modal .confirm-modal-buttons button{margin-right:5px}.share-snapshot{text-align:center}.share-snapshot .gf-icon-snap-multi{font-size:70px}.share-snapshot .fa-spinner{font-size:70px}.share-snapshot .share-snapshot-info-text{margin:10px 105px}.share-snapshot .share-snapshot-info-text strong{color:#222;font-weight:bold}.share-snapshot .share-snapshot-header{margin:20px 0 22px 0}.share-snapshot .tight-form{text-align:left}.share-snapshot .share-snapshot-link{max-width:716px;white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.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}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{max-width:100%;width:auto\9;height:auto;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"]{-webkit-appearance:button;cursor:pointer}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{*{text-shadow:none!important;color:#000!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}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#555;background-color:#eaeaea}a{color:#555;text-decoration:none}a:hover,a:focus{color:#222;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;content:"";line-height:0}.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;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%}.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;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0}.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,a.muted:focus{color:#808080}.text-warning{color:#ff934b}a.text-warning:hover,a.text-warning:focus{color:#ff7518}.text-error{color:#ff7169}a.text-error:hover,a.text-error:focus{color:#ff4136}.text-info{color:#af78ca}a.text-info:hover,a.text-info:focus{color:#9954bb}.text-success{color:#3dd441}a.text-success:hover,a.text-success:focus{color:#28b62c}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:#222;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 #f9f9f9}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;*display:inline;*zoom:1;padding-left:5px;padding-right: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;content:"";line-height:0}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #f9f9f9;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 #f9f9f9}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}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 #f9f9f9;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:Menlo,Monaco,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;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap}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:3px;-moz-border-radius:3px;border-radius:3px}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:#020202;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;vertical-align:middle}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 #999;-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,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;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;border:1px solid #999;background-color:#fff}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;background-color:#fcfcfc;border-color:#999;-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);cursor:not-allowed}.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;content:"";line-height:0}.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:#f9f9f9}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:#ff934b}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#ff934b}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#ff934b;-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:#ff7518;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd0b1;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd0b1;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd0b1}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#ff934b;background-color:#ff7518;border-color:#ff934b}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#ff7169}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#ff7169}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#ff7169;-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:#ff4136;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd2cf;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd2cf;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffd2cf}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#ff7169;background-color:#ff4136;border-color:#ff7169}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#3dd441}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#3dd441}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#3dd441;-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:#28b62c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #90e793;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #90e793;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #90e793}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#3dd441;background-color:#28b62c;border-color:#3dd441}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#af78ca}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#af78ca}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#af78ca;-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:#9954bb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dac1e7;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dac1e7;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dac1e7}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#af78ca;background-color:#9954bb;border-color:#af78ca}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;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#7c7c7c}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;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,.input-append .popover,.input-prepend .popover{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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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:#f9f9f9;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:#90e793;border-color:#28b62c}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 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;*zoom:1;margin-bottom:0;vertical-align:middle}.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;content:"";line-height:0}.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:#eaeaea}.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:3px;-moz-border-radius:3px;border-radius:3px}.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,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius: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:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px}.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:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px}.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:#e8f8fd}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:#28b62c}.table tbody tr.error>td{background-color:#ff4136}.table tbody tr.warning>td{background-color:#ff7518}.table tbody tr.info>td{background-color:#9954bb}.table-hover tbody tr.success:hover>td{background-color:#23a127}.table-hover tbody tr.error:hover>td{background-color:#ff291c}.table-hover tbody tr.warning:hover>td{background-color:#fe6600}.table-hover tbody tr.info:hover>td{background-color:#8d46b0}.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,.dropdown-submenu:focus>a{text-decoration:none;color:#fff;background-color:#24ade0;background-image:-moz-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2ab2e4),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-o-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:linear-gradient(to bottom,#2ab2e4,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2ab2e4',endColorstr='#ff1ca6d9',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#24ade0;background-image:-moz-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2ab2e4),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:-o-linear-gradient(top,#2ab2e4,#1ca6d9);background-image:linear-gradient(to bottom,#2ab2e4,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2ab2e4',endColorstr='#ff1ca6d9',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #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;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#ccc;margin-top:5px;margin-right:-10px}.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-left:20px;padding-right:20px}.typeahead{z-index:1051;margin-top:2px;-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,.close:focus{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;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#e9e9e9;background-image:-moz-linear-gradient(top,#f9f9f9,#d2d2d2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f9f9f9),to(#d2d2d2));background-image:-webkit-linear-gradient(top,#f9f9f9,#d2d2d2);background-image:-o-linear-gradient(top,#f9f9f9,#d2d2d2);background-image:linear-gradient(to bottom,#f9f9f9,#d2d2d2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9',endColorstr='#ffd2d2d2',GradientType=0);border-color:#d2d2d2 #d2d2d2 #acacac;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#d2d2d2;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#d2d2d2;*background-color:#c6c6c6}.btn:active,.btn.active{background-color:#b9b9b9 \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{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,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(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:22px 30px;font-size:17.5px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.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:2px 6px;font-size:10.5px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.btn-block{display:block;width:100%;padding-left:0;padding-right: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-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#32b2e1;background-image:-moz-linear-gradient(top,#41bae7,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#41bae7),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#41bae7,#1ca6d9);background-image:-o-linear-gradient(top,#41bae7,#1ca6d9);background-image:linear-gradient(to bottom,#41bae7,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff41bae7',endColorstr='#ff1ca6d9',GradientType=0);border-color:#1ca6d9 #1ca6d9 #137295;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#1ca6d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#1ca6d9;*background-color:#1995c2}.btn-primary:active,.btn-primary.active{background-color:#1683ac \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#fe781e;background-image:-moz-linear-gradient(top,#ff8432,#fe6600);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff8432),to(#fe6600));background-image:-webkit-linear-gradient(top,#ff8432,#fe6600);background-image:-o-linear-gradient(top,#ff8432,#fe6600);background-image:linear-gradient(to bottom,#ff8432,#fe6600);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff8432',endColorstr='#fffe6600',GradientType=0);border-color:#fe6600 #fe6600 #b14700;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#fe6600;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#fe6600;*background-color:#e45c00}.btn-warning:active,.btn-warning.active{background-color:#cb5200 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ff463b;background-image:-moz-linear-gradient(top,#ff5950,#ff291c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff5950),to(#ff291c));background-image:-webkit-linear-gradient(top,#ff5950,#ff291c);background-image:-o-linear-gradient(top,#ff5950,#ff291c);background-image:linear-gradient(to bottom,#ff5950,#ff291c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff5950',endColorstr='#ffff291c',GradientType=0);border-color:#ff291c #ff291c #cf0b00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#ff291c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#ff291c;*background-color:#ff1103}.btn-danger:active,.btn-danger.active{background-color:#e80d00 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#29ba2d;background-image:-moz-linear-gradient(top,#2dcb31,#23a127);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2dcb31),to(#23a127));background-image:-webkit-linear-gradient(top,#2dcb31,#23a127);background-image:-o-linear-gradient(top,#2dcb31,#23a127);background-image:linear-gradient(to bottom,#2dcb31,#23a127);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2dcb31',endColorstr='#ff23a127',GradientType=0);border-color:#23a127 #23a127 #166218;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#23a127;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#23a127;*background-color:#1f8c22}.btn-success:active,.btn-success.active{background-color:#1a771d \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#9b59bb;background-image:-moz-linear-gradient(top,#a466c2,#8d46b0);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a466c2),to(#8d46b0));background-image:-webkit-linear-gradient(top,#a466c2,#8d46b0);background-image:-o-linear-gradient(top,#a466c2,#8d46b0);background-image:linear-gradient(to bottom,#a466c2,#8d46b0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa466c2',endColorstr='#ff8d46b0',GradientType=0);border-color:#8d46b0 #8d46b0 #613079;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#8d46b0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#8d46b0;*background-color:#7e3f9d}.btn-info:active,.btn-info.active{background-color:#6f378b \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#4b4b4b;background-image:-moz-linear-gradient(top,#555,#3c3c3c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#555),to(#3c3c3c));background-image:-webkit-linear-gradient(top,#555,#3c3c3c);background-image:-o-linear-gradient(top,#555,#3c3c3c);background-image:linear-gradient(to bottom,#555,#3c3c3c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff555555',endColorstr='#ff3c3c3c',GradientType=0);border-color:#3c3c3c #3c3c3c #161616;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#3c3c3c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#3c3c3c;*background-color:#2f2f2f}.btn-inverse:active,.btn-inverse.active{background-color:#222 \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{border-color:transparent;cursor:pointer;color:#555;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#222;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#ff7518;border:1px solid transparent;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.alert,.alert h4{color:#ff934b}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#28b62c;border-color:transparent;color:#3dd441}.alert-success h4{color:#3dd441}.alert-danger,.alert-error{background-color:#ff4136;border-color:transparent;color:#ff7169}.alert-danger h4,.alert-error h4{color:#ff7169}.alert-info{background-color:#9954bb;border-color:transparent;color:#af78ca}.alert-info h4{color:#af78ca}.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-left:0;margin-bottom:20px;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f9f9f9}.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-left:15px;padding-right:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-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,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#555}.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;content:"";line-height:0}.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,.nav-tabs>li>a:focus{border-color:#f9f9f9 #f9f9f9 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;background-color:#eaeaea;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.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,.nav-pills>.active>a:focus{color:#fff;background-color:#555}.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;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2}.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{border-top-color:#555;border-bottom-color:#555;margin-top:6px}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#222;border-bottom-color:#222}.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,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{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,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0}.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,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{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,.tabs-left>.nav-tabs>li>a:focus{border-color:#f9f9f9 #ddd #f9f9f9 #f9f9f9}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{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,.tabs-right>.nav-tabs>li>a:focus{border-color:#f9f9f9 #f9f9f9 #f9f9f9 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default}.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2}.navbar-inner{min-height:52px;padding-left:20px;padding-right:20px;background-color:#f8f8f8;background-image:-moz-linear-gradient(top,#f8f8f8,#f8f8f8);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f8f8f8),to(#f8f8f8));background-image:-webkit-linear-gradient(top,#f8f8f8,#f8f8f8);background-image:-o-linear-gradient(top,#f8f8f8,#f8f8f8);background-image:linear-gradient(to bottom,#f8f8f8,#f8f8f8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8f8f8',endColorstr='#fff8f8f8',GradientType=0);border:1px solid none;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-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);*zoom:1}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{float:left;display:block;padding:16px 20px 16px;margin-left:-20px;font-size:20px;font-weight:200;color:#666;text-shadow:0 1px 0 #f8f8f8}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:52px;color:#666}.navbar-link{color:#666}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:52px;margin:0 9px;border-left:1px solid #f8f8f8;border-right:1px solid #f8f8f8}.navbar .btn,.navbar .btn-group{margin-top:11px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:11px}.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:11px;margin-bottom:0}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;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-left:0;padding-right: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,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(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:16px 15px 16px;color:#666;text-decoration:none;text-shadow:0 1px 0 #f8f8f8}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333;text-decoration:none}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e7e7e7;-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-left:5px;margin-right:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ebebeb;background-image:-moz-linear-gradient(top,#ebebeb,#ebebeb);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ebebeb),to(#ebebeb));background-image:-webkit-linear-gradient(top,#ebebeb,#ebebeb);background-image:-o-linear-gradient(top,#ebebeb,#ebebeb);background-image:linear-gradient(to bottom,#ebebeb,#ebebeb);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#ffebebeb',GradientType=0);border-color:#ebebeb #ebebeb #c5c5c5;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#ebebeb;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#ebebeb;*background-color:#dedede}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#d2d2d2 \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{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:9px}.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:10px}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0;bottom:-7px;top:auto}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #fff;border-bottom:0;bottom:-6px;top:auto}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e7e7e7;color:#555}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#666;border-bottom-color:#666}.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{left:auto;right:0}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-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:#2ab2e4;background-image:-moz-linear-gradient(top,#2ab2e4,#2ab2e4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2ab2e4),to(#2ab2e4));background-image:-webkit-linear-gradient(top,#2ab2e4,#2ab2e4);background-image:-o-linear-gradient(top,#2ab2e4,#2ab2e4);background-image:linear-gradient(to bottom,#2ab2e4,#2ab2e4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2ab2e4',endColorstr='#ff2ab2e4',GradientType=0);border-color:transparent}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#fff}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:rgba(0,0,0,0.05);color:#fff}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#2ab2e4}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-left-color:#2ab2e4;border-right-color:#2ab2e4}.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{background-color:#2ab2e4;color:#fff}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.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:#9bdbf2;border-color:#2ab2e4;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#333}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#333}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#333}.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;-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);outline:0}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#1ca6d9;background-image:-moz-linear-gradient(top,#1ca6d9,#1ca6d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1ca6d9),to(#1ca6d9));background-image:-webkit-linear-gradient(top,#1ca6d9,#1ca6d9);background-image:-o-linear-gradient(top,#1ca6d9,#1ca6d9);background-image:linear-gradient(to bottom,#1ca6d9,#1ca6d9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1ca6d9',endColorstr='#ff1ca6d9',GradientType=0);border-color:#1ca6d9 #1ca6d9 #137295;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#1ca6d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#1ca6d9;*background-color:#1995c2}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#1683ac \9}.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:.7;filter:alpha(opacity=70)}.modal{position:fixed;z-index:1050;width:100%;background-color:#fff;-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;outline:0}.modal.fade{-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;top:-25%}.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;overflow-y:auto;padding:15px}.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-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;*zoom:1}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#333}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#fff;border-bottom:1px solid #f2f2f2;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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:16px}.popover .arrow:after{border-width:15px;content:""}.popover.top .arrow{left:50%;margin-left:-16px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-16px}.popover.top .arrow:after{bottom:1px;margin-left:-15px;border-bottom-width:0;border-top-color:#fff}.popover.right .arrow{top:50%;left:-16px;margin-top:-16px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right .arrow:after{left:1px;bottom:-15px;border-left-width:0;border-right-color:#fff}.popover.bottom .arrow{left:50%;margin-left:-16px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-16px}.popover.bottom .arrow:after{top:1px;margin-left:-15px;border-top-width:0;border-bottom-color:#fff}.popover.left .arrow{top:50%;right:-16px;margin-top:-16px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-15px}.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;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#ff7169}.label-important[href],.badge-important[href]{background-color:#ff4136}.label-warning,.badge-warning{background-color:#ff7518}.label-warning[href],.badge-warning[href]{background-color:#e45c00}.label-success,.badge-success{background-color:#3dd441}.label-success[href],.badge-success[href]{background-color:#28b62c}.label-info,.badge-info{background-color:#af78ca}.label-info[href],.badge-info[href]{background-color:#9954bb}.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}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}body{font-weight:300;background:#eaeaea}blockquote{padding:10px 15px;background-color:#f9f9f9;border-left-color:#555}blockquote.pull-right{padding:10px 15px;border-right-color:#555}blockquote small{color:#555}.muted{color:#555}.text-warning{color:#ff7518}a.text-warning:hover{color:#e45c00}.text-error{color:#ff4136}a.text-error:hover{color:#ff1103}.text-info{color:#9954bb}a.text-info:hover{color:#7e3f9d}.text-success{color:#28b62c}a.text-success:hover{color:#1f8c22}.navbar .navbar-inner{background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar .brand{padding:0 15px}.navbar .brand:hover{color:#333}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-bottom:1px solid #2ab2e4;background-color:transparent}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555}.navbar .nav li.dropdown.open>.dropdown-toggle:hover,.navbar .nav li.dropdown.active>.dropdown-toggle:hover,.navbar .nav li.dropdown.open.active>.dropdown-toggle:hover{color:#f9f9f9}.navbar .navbar-search .search-query{line-height:normal}.navbar-inverse .brand,.navbar-inverse .nav>li>a{text-shadow:none}.navbar-inverse .brand:hover,.navbar-inverse .nav>.active>a,.navbar-inverse .nav>.active>a:hover,.navbar-inverse .nav>.active>a:focus{background-color:rgba(0,0,0,0.05);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;color:#fff}.navbar-inverse .navbar-search .search-query{color:#222}div.subnav{margin:0 1px;background:#999 none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}div.subnav .nav{background-color:transparent}div.subnav .nav>li>a{border-color:transparent}div.subnav .nav>.active>a,div.subnav .nav>.active>a:hover{border-color:transparent;background-color:#000;color:#fff;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav-fixed{top:53px;margin:0}.nav .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#2ab2e4}.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs li>a:hover,.nav-tabs li.active>a,.nav-tabs li.active>a:hover{border-color:transparent;background-color:transparent;border-bottom:2px solid #2ab2e4;color:#2ab2e4}.nav-tabs li.disabled>a{color:#555}.nav-tabs .open .dropdown-toggle{background-color:#060606;border-color:transparent}.tabs-below>.nav-tabs>li>a,.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0}.nav-pills>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;color:#000}.nav-pills>li>a:hover{background-color:#000;color:#fff}.nav-pills>.disabled>a,.nav-pills>.disabled>a:hover{background-color:#f9f9f9;color:#333}.nav-list>li>a{color:#222}.nav-list>li>a:hover{background-color:#2ab2e4;color:#fff;text-shadow:none}.nav-list .nav-header{color:#222}.nav-list .divider{background-color:#555;border-bottom:0}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>li>a,.pagination ul>li>span{margin-right:6px;color:#222}.pagination ul>li>a:hover,.pagination ul>li>span:hover{background-color:#222;color:#fff}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{margin-right:0}.pagination ul>.active>a,.pagination ul>.active>span{color:#fff}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{background-color:#f9f9f9;color:#333}.pager li>a,.pager li>span{background-color:#999;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;color:#222}.pager li>a:hover,.pager li>span:hover{background-color:#222;color:#fff}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>span{background-color:#f9f9f9;color:#333}.breadcrumb{background-color:#999}.breadcrumb li{text-shadow:none}.breadcrumb .divider,.breadcrumb .active{color:#222;text-shadow:none}.btn{padding:5px 12px;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-shadow:none}.btn.disabled{box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-large{padding:14px 23px}.btn-small{padding:2px 10px}.btn-mini{padding:2px 6px}.btn-group>.btn:first-child,.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}legend,label{color:#555;border-bottom:0 solid #222}.table tbody tr.success td{color:#fff}.table tbody tr.error td{color:#fff}.table tbody tr.info td{color:#fff}.table-bordered{-webkit-border-radius:0;-moz-border-radius:0;border-radius: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-radius:0;-moz-border-radius:0;border-radius:0}.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-radius:0;-moz-border-radius:0;border-radius:0}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"]{color:#222}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#ff7518}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#ff7518;color:#222}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#ff4136}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#ff4136;color:#222}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#28b62c}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#28b62c;color:#222}legend{border-bottom:0;color:#222}.form-actions{border-top:0;background-color:#f9f9f9}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.alert{text-shadow:none}.alert-heading,.alert h1,.alert h2,.alert h3,.alert h4,.alert h5,.alert h6{color:#fff}.label-success{background-color:#28b62c}.label-important{background-color:#ff4136}.label-info{background-color:#9954bb}.label-inverse{background-color:#000}.badge{border-radius:0;font-weight:200}a:hover{text-decoration:none}.hero-unit{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.well{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}a.thumbnail{background-color:#999}a.thumbnail:hover{background-color:#555;border-color:transparent}.progress{background-color:#f9f9f9;background-image:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.modal{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background-color:#eaeaea}.modal-header{border-bottom:0}.modal-footer{border-top:0;background-color:transparent}.popover{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.popover-title{border-bottom:0;color:#fff}@media(max-width:767px){div.panel{width:100%!important;padding:0!important}}.container-fluid{padding-left:0;padding-right:0}.main-view-container{padding:5px 10px;width:100%;box-sizing:border-box}.bgNav{background:#f8f8f8}.bgPrimary{background:#41bae7;color:rgba(255,255,255,0.9)}.bgInfo{background:#a466c2;color:rgba(255,255,255,0.9)}.bgSuccess{background:#2dcb31;color:rgba(255,255,255,0.9)}.bgWarning{background:#ff8432;color:rgba(255,255,255,0.9)}.bgDanger{background:#ff5950;color:rgba(255,255,255,0.9)}.bgInverse{background:#555;color:rgba(255,255,255,0.9)}code,pre{background-color:#f9f9f9}div.editor-row{vertical-align:top}div.editor-row div.section{margin-right:20px;vertical-align:top;display:inline-block}div.editor-option{vertical-align:top;display:inline-block;margin-right:10px}div.editor-option label{display:block}#events{font-size:12px}.version{font-size:85%}.legend{color:#000}div.fake-input{background-color:#fff;border:1px solid #999;-webkit-border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;border-radius:3px 3px 3px 3px}hr.small{margin:5px 0}form input.ng-invalid{color:#ff7169}.editor-title{margin-right:10px;font-size:1.7em;font-weight:bold;text-transform:capitalize}.editor-title small{opacity:.5;font-size:.7em;font-weight:normal}.bordered{border:1px solid #ddd}.table-unpadded th,.table-unpadded td{padding:0 2px}.spy{position:absolute;right:0;top:0}.navbar-inner{border-width:0}.grafana-row{margin-bottom:5px}.row-tab .dropdown-menu-right{top:0;left:33px}.row-tab-button{padding:0;cursor:pointer;vertical-align:middle;width:30px;height:30px;text-align:center;display:inline-block;line-height:30px}.row-button{width:30px;float:left;cursor:pointer;line-height:31px}.row-text{white-space:nowrap;text-transform:uppercase;font-weight:bold;font-size:.9em;text-align:center;line-height:31px;height:31px}.row-close{padding:0;margin:0;background:#fff;text-align:center}.row-close-buttons{position:absolute;left:0}.row-open{margin-top:5px;left:-34px;position:absolute;z-index:100;transition:.10s left;transition-delay:.10s;-webkit-transition-delay:.10s}.row-open:hover{left:-12px}.odd{background-color:#f9f9f9}.nomargin{margin:0}[ng\:cloak],[ng-cloak],.ng-cloak{display:none!important}.table tbody+tbody{border-top:0}.ui-draggable-dragging{display:block;z-index:9999}.link{color:#555;cursor:pointer}.link:hover{color:#222}.pointer{cursor:pointer}.popover{max-width:480px}.tiny{font-size:50%}.smaller{font-size:70%}.small{font-size:85%}.large{font-size:120%}.strong{font-weight:bold}a{cursor:pointer}.normal{font-weight:normal}.light{font-weight:200}.input-smaller{width:75px}.string{color:#626262}.number{color:#ba8bd1}.boolean{color:#ffa365}.key{color:#ff8983}.btn-active{background-color:#e6e6e6;background-image:none;box-shadow:0 2px 4px rgba(0,0,0,0.15) inset,0 1px 2px rgba(0,0,0,0.05);outline:0 none}.remove:hover{background-color:#ff291c}.faded{opacity:.2}div.flot-text{color:#555!important}.page-alert-list{z-index:8000;min-width:300px;max-width:300px;position:fixed;right:20px;top:56px}.page-alert-list .alert{color:#fff;padding-bottom:13px;position:relative}.page-alert-list .alert-close{position:absolute;top:-4px;right:-2px;width:19px;height:19px;padding:0;background:#f9f9f9;border-radius:50%;border:0;font-size:1.1rem;color:#222}.page-alert-list .alert-title{font-weight:bold;padding-bottom:2px}.alert-warning{background-color:#ff7518;border-color:transparent;color:#ff934b}.popover.topLeft{margin-top:-10px}.popover.topLeft .arrow{bottom:-10px;left:25%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#fff}.popover.topLeft .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.topRight{margin-top:-10px}.popover.topRight .arrow{bottom:-10px;left:75%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#fff}.popover.topRight .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,0.25);bottom:-1px;left:-11px}.popover.rightTop .arrow{top:10%;left:-16px;margin-top:-16px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightTop .arrow:after{left:1px;bottom:-15px;border-left-width:0;border-right-color:#fff}.popover.rightBottom .arrow{top:90%;left:-16px;margin-top:-16px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.rightBottom .arrow:after{left:1px;bottom:-15px;border-left-width:0;border-right-color:#fff}.popover.bottomLeft .arrow{left:10%;margin-left:-16px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-16px}.popover.bottomLeft .arrow:after{top:1px;margin-left:-15px;border-top-width:0;border-bottom-color:#fff}.popover.bottomRight .arrow{left:90%;margin-left:-16px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-16px}.popover.bottomRight .arrow:after{top:1px;margin-left:-15px;border-top-width:0;border-bottom-color:#fff}.popover.leftTop .arrow{top:10%;right:-16px;margin-top:-16px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftTop .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-15px}.popover.leftBottom .arrow{top:90%;right:-16px;margin-top:-16px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.leftBottom .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-15px}.popover.topLeft .arrow{left:10%;margin-left:-16px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-16px}.popover.topLeft .arrow:after{bottom:1px;margin-left:-15px;border-bottom-width:0;border-top-color:#fff}.popover.topRight .arrow{left:90%;margin-left:-16px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-16px}.popover.topRight .arrow:after{bottom:1px;margin-left:-15px;border-bottom-width:0;border-top-color:#fff}.typeahead{max-height:300px;overflow-y:auto}.label-tag{background-color:#9954bb;color:#f2f2f2;border-radius:2px;text-shadow:none;font-size:13px;padding:4px 6px}.label-tag .icon-tag{position:relative;top:1px;padding-right:4px}.label-tag:hover{opacity:.85;background-color:#7e3f9d}.save-dashboard-dropdown{padding:10px}.save-dashboard-dropdown li>a{padding-left:5px}.save-dashboard-dropdown-save-form{margin-bottom:5px}.inspector-request-table td{padding:5px}.inspector-request-table td:first-child{white-space:nowrap}.modal-body{padding:0}code,pre{background-color:#fff;color:#555}.login-form{width:50%;float:left;margin-left:25%;margin-right:25%;padding-top:50px}.login-box{width:700px;margin:100px auto 0 auto}.login-box-logo{text-align:center;padding-bottom:50px}.login-inner-box{background:#fff}.login-tab-header{background:#efefef;text-align:center}.btn-login-tab{background:transparent;border:0;font-size:15px;padding:10px 10px;font-weight:bold;display:inline-block;width:170px;color:#555}.btn-login-tab.active{background:#e2e2e2;color:#fff}.btn-login-tab:focus{outline:0}.password-strength{display:block;width:50px;overflow:visible;white-space:nowrap;padding-top:3px;margin-left:97px;color:#222;border-top:3px solid #ff4136}.password-strength.password-strength-ok{width:170px;border-top:3px solid #ffa04e}.password-strength.password-strength-good{width:254px;border-top:3px solid #3dd441}.login-submit-button-row{text-align:center;margin-top:40px}.login-submit-button-row button{padding:9px 7px;font-size:14px;font-weight:bold;width:150px;display:inline-block;border:1px solid #6f6f6f}.login-oauth{margin-top:30px;padding:10px;background:#efefef}.login-oauth .btn-google{background:#dd4b39;color:white}.login-oauth .btn-github{background:#555;color:white}.submenu-controls-visible .panel-fullscreen{top:88px}.submenu-controls{margin:10px 10px 0 5px;font-size:16px}.annotation-disabled,.annotation-disabled a{color:#a2a2a2}.annotation-segment label.cr1{margin-left:5px}.graph-canvas-wrapper{position:relative;cursor:crosshair}.graph-legend{margin:0 20px;text-align:center}.graph-legend .popover-content{padding:0}.graph-legend-icon{position:relative;padding-right:4px;top:1px}.graph-legend-icon,.graph-legend-alias,.graph-legend-value{float:left;white-space:nowrap;font-size:85%;text-align:left}.graph-legend-icon.current:before,.graph-legend-alias.current:before,.graph-legend-value.current:before{content:"Current: "}.graph-legend-icon.max:before,.graph-legend-alias.max:before,.graph-legend-value.max:before{content:"Max: "}.graph-legend-icon.min:before,.graph-legend-alias.min:before,.graph-legend-value.min:before{content:"Min: "}.graph-legend-icon.total:before,.graph-legend-alias.total:before,.graph-legend-value.total:before{content:"Total: "}.graph-legend-icon.avg:before,.graph-legend-alias.avg:before,.graph-legend-value.avg:before{content:"Avg: "}.graph-legend-icon .fa{font-size:135%;position:relative;top:1px}.graph-legend-series{float:left;white-space:nowrap;padding-left:10px;padding-top:6px}.graph-legend-value{padding-left:6px}.graph-legend-table{display:table;width:100%;margin:0}.graph-legend-table .graph-legend-series{display:table-row;float:none;padding-left:0}.graph-legend-table .graph-legend-series.pull-right{float:none}.graph-legend-table td,.graph-legend-table .graph-legend-alias,.graph-legend-table .graph-legend-icon,.graph-legend-table .graph-legend-value{float:none;display:table-cell;white-space:nowrap;padding:2px 10px;text-align:right;border-bottom:1px solid #eee}.graph-legend-table .graph-legend-icon{width:5px;padding:0;top:0}.graph-legend-table .graph-legend-icon .fa{top:4px}.graph-legend-table .graph-legend-value{padding-left:15px}.graph-legend-table .graph-legend-alias{padding-left:7px;text-align:left;width:95%}.graph-legend-table .graph-legend-series:nth-child(odd){background-color:#e4e4e4}.graph-legend-table .graph-legend-value.current:before,.graph-legend-table .graph-legend-value.max:before,.graph-legend-table .graph-legend-value.min:before,.graph-legend-table .graph-legend-value.total:before,.graph-legend-table .graph-legend-value.avg:before{content:''}.graph-legend-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#2ab2e4;font-size:85%;white-space:nowrap}.graph-legend-rightside.graph-wrapper{display:table;width:100%}.graph-legend-rightside .graph-canvas-wrapper{display:table-cell;width:100%;position:relative}.graph-legend-rightside .graph-legend-wrapper{display:table-cell;vertical-align:top;position:relative;left:4px}.graph-legend-rightside .graph-legend{margin:0}.graph-legend-rightside .graph-legend-series{display:block;padding-left:0}.graph-legend-rightside .graph-legend-table .graph-legend-series{display:table-row}.graph-legend-series-hidden a{color:#a2a2a2}.graph-legend-popover{width:200px}.graph-legend-popover label{display:inline-block}.graph-legend-popover .btn{padding:1px 3px;margin-right:0;line-height:initial}.graph-legend-popover .close{margin-right:5px;color:#555;opacity:.7;text-shadow:none}.graph-legend-popover .editor-row{padding:5px}.annotation-tags{color:#9954bb}.graph-series-override input{float:left;margin-right:10px}.graph-series-override .graph-series-override-option{float:left;padding:2px 6px}.graph-series-override .graph-series-override-selector{float:left}.graph-tooltip{white-space:nowrap}.graph-tooltip .graph-tooltip-time{text-align:center;font-weight:bold;position:relative;top:-3px}.graph-tooltip .graph-tooltip-list-item{display:table-row}.graph-tooltip .graph-tooltip-series-name{display:table-cell}.graph-tooltip .graph-tooltip-value{display:table-cell;font-weight:bold;padding-left:10px;text-align:right}.left-yaxis-label{top:50%;left:-5px;transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);transform-origin:left top;-o-transform-origin:left top;-ms-transform-origin:left top;-moz-transform-origin:left top;-webkit-transform-origin:left top}.right-yaxis-label{top:50%;right:-5px;-webkit-transform:rotate(90deg);-webkit-transform-origin:right top;-moz-transform:rotate(90deg);-moz-transform-origin:right top;-ms-transform:rotate(90deg);-ms-transform-origin:right top;-o-transform:rotate(90deg);-o-transform-origin:right top;transform:rotate(90deg);transform-origin:right top}.axisLabel{color:#555;font-size:11.9px;position:absolute;text-align:center;font-size:12px}.bootstrap-tagsinput{display:inline-block;padding:4px 6px;margin-bottom:10px;color:#555;vertical-align:middle;border-radius:4px;max-width:100%;line-height:22px;background-color:#fff;border:1px solid #999;-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}.bootstrap-tagsinput input{border:0;box-shadow:none;outline:0;background-color:transparent;padding:0;padding-left:5px;margin:0;width:auto!important;max-width:inherit}.bootstrap-tagsinput input:focus{border:0;box-shadow:none}.bootstrap-tagsinput .tag{margin-right:2px;color:white}.bootstrap-tagsinput .tag [data-role="remove"]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role="remove"]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role="remove"]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.bootstrap-tagsinput .tag [data-role="remove"]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.grafana-options-table{width:100%}.grafana-options-table th{padding:5px 10px;border-bottom:4px solid #fff}.grafana-options-table tr td{background-color:#ececec;padding:5px 10px;white-space:nowrap;border-bottom:4px solid #fff}.grafana-options-table tr td.nobg{background-color:transparent}.grafana-options-table .max-width-btns{padding-right:0}.grafana-options-table .max-width-btns .btn{box-sizing:border-box;width:100%}.max-width{overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap}.grafana-options-list{list-style:none;margin:0;max-width:450px}.grafana-options-list li:nth-child(odd){background-color:#e4e4e4}.grafana-options-list li{float:left;margin:2px;padding:5px 10px;border:1px solid #eee}.grafana-options-list li:first-child{border:1px solid #eee}.search-container{left:52px;top:33px;margin:15px;z-index:1000;position:absolute;width:700px;box-shadow:0 0 55px 0 black;padding:10px;background-color:#fff;border:1px solid #e2e2e2}.search-container .label-tag{margin-left:6px;font-size:11px;padding:2px 6px}.search-field-wrapper{padding-bottom:10px}.search-field-wrapper input{width:100%;padding:18px 8px;box-sizing:border-box}.search-field-wrapper button{margin:0 4px 0 0}.search-field-wrapper>span{display:block;overflow:hidden}.search-results-container{height:450px;overflow:auto;display:block;line-height:28px}.search-results-container .search-result-item:hover,.search-results-container .search-result-item.selected{background-color:#dfdfdf}.search-results-container .selected .search-result-tag{opacity:.70;color:white}.search-results-container .fa-star,.search-results-container .fa-star-o{padding-left:13px}.search-results-container .fa-star{color:#ff7518}.search-results-container .search-result-link{color:#555}.search-results-container .search-result-link .fa{padding-right:10px}.search-results-container .search-result-item{display:block;padding:3px 10px;white-space:nowrap;background-color:#ececec;margin-bottom:4px}.search-results-container .search-result-tags{float:right}.search-results-container .search-result-actions{float:right;padding-left:20px}.search-switches{position:absolute;top:19px;right:21px}.search-button-row{padding-top:20px}.search-button-row button,.search-button-row a{margin-right:10px}.panel{display:inline-block;float:left;vertical-align:top;position:relative}.panel-margin{margin:5px;display:block}.panel-container{background-color:#fff;position:relative;border:solid 1px #ddd}.panel-container:hover .panel-actions{display:block}.panel-container.panel-transparent{background-color:transparent;border:0}.panel-content{padding:0 10px 5px 10px}.panel-title-container{min-height:5px;padding-top:4px;cursor:context-menu}.panel-title{border:0;font-weight:bold;position:relative;cursor:context-menu;width:100%;display:block}.panel-title.has-panel-links .panel-title-text:after{content:"\f08e";font-family:'FontAwesome';font-size:80%;padding-left:10px;position:relative;top:-1px}.panel-loading{position:absolute;top:-3px;right:0;z-index:800}.panel-header{text-align:center}.panel-error{color:#fff;position:absolute;left:0;padding:0 17px 6px 5px;top:0;z-index:10}.panel-error i{position:relative;top:-2px}.panel-error-arrow{width:0;height:0;position:absolute;border-left:31px solid transparent;border-right:30px solid transparent;border-bottom:27px solid #fff;left:0;bottom:0}.panel-fullscreen{z-index:100;display:block;position:fixed;left:0;right:0;top:60px;padding:0;overflow-y:auto;height:100%}.panel-fullscreen .dropdown-menu{margin-bottom:70px}.panel-fullscreen .panel-container{margin:15px}.panel-fullscreen .panel-menu{top:0}.panel-fullscreen .panel-title-container{padding:8px}.panel-full-edit{margin-top:30px;padding-bottom:130px}.panel-menu{z-index:500;position:absolute;background:#e2e2e2;border:1px solid black;top:-62px}.panel-menu .panel-menu-row{white-space:nowrap;border-bottom:1px solid black}.panel-menu .panel-menu-row:last-child{border-bottom:0}.panel-menu .panel-menu-link,.panel-menu .panel-menu-icon{padding:5px 10px}.panel-menu .panel-menu-link{display:inline-block;border-right:1px solid black}.panel-menu .panel-menu-link:last-child{border:0}.panel-menu .dropdown-menu{text-align:left}.panel-highlight{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.on-drag-hover .panel-container{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 5px rgba(82,168,236,0.8)}.panel-drop-zone{display:none}.panel-drop-zone .panel-container{border:1px solid #333}.panel-ghost{width:100%}.panel-ghost .panel-container{border:0;background:transparent}.panel-ghost .panel-ghost-list{margin:10px 0 10px 20px}.panel-ghost button{text-align:left;min-width:135px}.panel-ghost button .fa{position:relative;left:-5px}.panel-time-info{font-weight:bold;float:right;margin-right:15px;color:#2ab2e4;font-size:85%;position:absolute;top:0;right:0}input[type=text].input-fluid{width:100%;box-sizing:border-box;padding:10px;font-size:16px;-moz-box-sizing:border-box;height:100%}input[type="checkbox"].cr1{display:none}label.cr1{display:inline-block;height:19px;clear:none;text-indent:2px;margin:0 0 1px 0;padding:0 0 0 20px;vertical-align:middle;background:url('../img/checkbox_white.png') left top no-repeat;cursor:pointer}input[type="checkbox"]:checked+label{background:url('../img/checkbox_white.png') 0 -18px no-repeat}.gf-form{padding-bottom:10px}.gf-form .checkbox-label{padding-left:7px;display:inline}.gf-fluid-input{border:0;display:block;overflow:hidden;padding-right:10px}.gf-fluid-input input[type=text]{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.gf-fluid-input textarea{width:100%;padding:5px 6px;height:100%;box-sizing:border-box}.singlestat-panel{position:relative;display:table;width:100%}.singlestat-panel-value-container{padding:20px;display:table-cell;vertical-align:middle;text-align:center;position:relative;z-index:1;font-size:3em;font-weight:bold}.singlestat-panel-prefix{padding-right:20px}.singlestat-panel-table{width:100%}.singlestat-panel-table td{padding:5px 10px;white-space:nowrap;text-align:right;border-bottom:1px solid #eee}.singlestat-panel-table th{text-align:right;padding:5px 10px;font-weight:bold;color:#2ab2e4}.singlestat-panel-table td:first-child{text-align:left}.singlestat-panel-table tr:nth-child(odd) td{background-color:#e4e4e4}.singlestat-panel-table tr:last-child td{border:0}.tight-form{border-top:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #ddd;background:#efefef;width:100%}.tight-form:last-child,.tight-form.last{border-bottom:1px solid #ddd}.tight-form.borderless{background:transparent;border:0}.tight-form .checkbox-label{display:inline;padding-right:4px;margin-bottom:0}.spaced-form .tight-form{margin:7px 0}.borderless .tight-form-item,.borderless .tight-form-input{border:0}.tight-form-container .tight-form:last-child{border-bottom:0}.tight-form-container:last-child{border-bottom:1px solid #ddd}.tight-form-btn{padding:8px 12px}.tight-form-list{list-style:none;margin:0}.tight-form-list>li{float:left}.grafana-metric-options{margin-top:35px}.tight-form-item{padding:8px 7px;font-weight:normal;border-right:1px solid #ddd;color:#555;display:inline-block}.has-open-function .tight-form-item{padding-top:25px}.tight-form-disabled .tight-form-item{color:#959595}.tight-form-item:hover,.tight-form-item:focus{text-decoration:none}.tight-form-itema:hover{background:#e2e2e2}.tight-form-item.template-param-name{border-right:0;padding-right:0;padding-left:18px}.tight-form-item.annotation-segment{padding:8px 13px}.tight-form-item.last{border-right:0}.tight-form-item .fa-caret-down{font-size:75%;position:relative;top:1px}.tight-form-item-icon i{width:15px;text-align:center;display:inline-block}.tight-form-func{background:#e2e2e2}.tight-form-func>a{color:#555}.tight-form-func>a:hover{color:#555}.tight-form-func.show-function-controls{padding-top:5px;min-width:100px;text-align:center}input[type=text].tight-form-func-param{background:transparent;border:0;margin:0;padding:0}input[type=text].tight-form-clear-input{padding:8px 7px;border:0;margin:0;background:transparent;float:left;color:#555;border-radius:0;border-right:1px solid #ddd}[type=text].tight-form-input,[type=email].tight-form-input,[type=number].tight-form-input,[type=password].tight-form-input{border:0;border-right:1px solid #ddd;margin:0;border-radius:0;padding:8px 6px;height:100%;box-sizing:border-box}[type=text].tight-form-input.last,[type=email].tight-form-input.last,[type=number].tight-form-input.last,[type=password].tight-form-input.last{border-right:0}input[type=checkbox].tight-form-checkbox{margin:0}select.tight-form-input{border:0;border-right:1px solid #ddd;margin:0;border-radius:0;height:36px;padding:8px 3px}select.tight-form-input.last{border-right:0}.tight-form-func-controls{display:none;text-align:center}.tight-form-func-controls .fa-arrow-left{float:left;position:relative;top:2px}.tight-form-func-controls .fa-arrow-right{float:right;position:relative;top:2px}.tight-form-func-controls .fa-remove{margin-left:10px}.tight-form-radio input[type=radio]{margin:0}.tight-form-radio label{display:inline}.sidemenu-canvas{position:relative}.sidemenu-wrapper{position:absolute;display:none;top:0;bottom:0;left:0;width:200px;background:#eaeaea;min-height:100%;z-index:101}.sidemenu-wrapper a:focus{text-decoration:none}.sidemenu-open .sidemenu-wrapper{display:block}.sidemenu-open .search-container{left:200px}.sidemenu-open .main-view{padding-left:200px}.sidemenu-open .panel-fullscreen{left:200px}.sidemenu{font-size:16px;font-weight:400;list-style:none;margin:0;padding:0}.sidemenu>li{margin-bottom:9px}.sidemenu .fa-caret-down{position:relative;top:2px;font-size:90%}.sidemenu.sidemenu-small{font-size:14px}.sidemenu.sidemenu-small .icon-circle{border-radius:50%;background:#fff;box-shadow:0 0 14px 2px rgba(0,0,0,0.05);border:1px solid rgba(0,0,0,0.05);width:28px;height:28px}.sidemenu.sidemenu-small .icon-circle i{top:1px;left:4px;font-size:110%}.sidemenu.sidemenu-small .sidemenu-item{line-height:28px;padding-left:25px}.sidemenu-item-text{width:110px;display:inline-block;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.sidemenu-top-btn{display:block;padding:8px 0 4px 22px;background-color:#f8f8f8;border-right:3px solid #eaeaea}.sidemenu-top-btn img{border-radius:50%;background:#fff;border:1px solid #eaeaea;width:30px;padding:4px}.sidemenu-top-btn i{padding-right:5px;padding-top:5px;font-size:170%;color:#555}.icon-circle{width:40px;height:40px;display:inline-block}.icon-circle i{color:#555;opacity:.7;position:relative;left:7px;top:5px;font-size:150%}.sidemenu-item{color:#555;line-height:40px;padding:0 10px 0 20px;display:block;white-space:nowrap}.sidemenu-item .sidemenu-item-text{padding-left:11px;transition:color 100ms ease-out}.sidemenu-item .sidemenu-item-text.no-icon{padding-left:59px}.sidemenu-item img{border-radius:50%;width:28px;height:28px;box-shadow:0 0 14px 2px rgba(255,255,255,0.05)}.sidemenu-system-section{background-color:#75caeb;color:#fff;padding:3px 0;margin-left:10px;margin-right:10px;border-radius:2px}.sidemenu-system-section .sidemenu-system-section-inner{border:2px solid black;border-left:none;border-right:0;padding:4px;overflow:hidden}.sidemenu-system-section .fa{float:left;font-size:120%;line-height:41px;padding:0 15px}.sidemenu-section-tagline{font-style:italic;font-size:75%;line-height:10px}.sidemenu-section-text-wrapper{padding-top:4px}.navbar-inner{padding-left:0}.navbar .nav>li>a{padding:17px 15px 13px}.navbar .nav>li>a .fa{font-size:115%}.top-nav{float:left;font-size:16px}.fa.top-nav-breadcrumb-icon{margin:18px 0 6px 5px;float:left;font-size:120%;color:#555}.top-nav-menu-btn{border:1px solid #eaeaea;border-radius:50%;background:#fff;display:block;position:relative;float:left;width:30px;height:30px;padding:4px;margin:6px 6px 3px 9px}.top-nav-menu-btn .fa{color:#555;width:30px;height:30px;left:9px;top:7px;font-size:150%;opacity:0;position:absolute;transition:opacity .2s ease-in-out}.top-nav-menu-btn img{width:30px;position:absolute;opacity:1;transition:opacity .2s ease-in-out}.top-nav-menu-btn:hover .fa{opacity:.7}.top-nav-menu-btn:hover img{opacity:0}.top-nav-dashboards-btn{display:block;float:left;margin:9px 18px 5px 14px;border-radius:3px;font-size:1.4em;color:#a2a2a2;border:solid 1px #f9f9f9}.top-nav-dashboards-btn a{display:inline-block;background:#e2e2e2;padding:5px 15px 5px 10px;border-radius:3px;color:#a2a2a2}.top-nav-dashboards-btn a:hover{background:#d6d6d6}.top-nav-dashboards-btn a:hover .fa{color:#555}.top-nav-dashboards-btn .fa-th-large{position:relative;top:2px}.top-nav-dashboards-btn .fa-caret-down{font-size:60%;position:relative;top:4px}.dashboard-title{padding:0 6px 5px 5px;color:#222;font-size:17px}.top-nav-icon{margin:5px 0 0 11px;line-height:41px;float:left}.top-nav-section{display:block;float:left;padding:19px 9px 8px 0;font-weight:bold}.top-nav-section i{padding-left:8px}.top-nav-title{display:block;float:left;font-size:17px;padding:18px 10px 10px 13px;color:#555}.top-nav-snapshot-title{display:block;float:left;font-size:1.4em;margin:9px 18px 5px 14px;color:#555}.top-nav-snapshot-title .gf-icon{position:relative;top:3px;font-size:27px}.top-nav-snapshot-title a{display:inline-block;padding:0 15px 5px 10px}.gf-box{margin:15px;background-color:#fff;position:relative;border:1px solid #e2e2e2}.gf-box-no-margin{margin:0}.gf-box-header-close-btn{float:right;padding:0;margin:0;background-color:transparent;border:0;padding:8px;color:#555}.gf-box-header-close-btn i{font-size:120%}.gf-box-header-close-btn:hover{color:#fff}.gf-box-body{padding:20px;min-height:150px}.gf-box-footer{overflow:hidden}.gf-box-header{border-bottom:1px solid #e2e2e2;overflow:hidden;background-color:#efefef}.gf-box-header .tabs{float:left}.gf-box-header .nav{margin:0}.gf-box-title{padding-right:20px;padding-left:10px;float:left;color:#555;font-size:18px;font-weight:normal;line-height:38px;margin:0}.gf-box-title .fa{padding:0 8px 0 5px;color:#555}.page-container{margin:15px;background:#fff;position:relative;border:1px solid #333;padding:20px 20px 60px 49px}.page-container h2{color:#555;font-weight:normal;font-size:22px}.page{max-width:653px}.admin-page{max-width:800px;margin-left:10px}.admin-page .gf-box{margin-top:0}.admin-page .gf-box-body{min-height:0}.admin-page h2{margin-left:15px;margin-bottom:0;font-size:17.5px;color:#555}.admin-page h2 i{padding-right:6px}.dashlist-link{display:block;margin:5px;padding:7px;background-color:#efefef;border:1px solid #ddd}.dashlist-link .fa{float:right;padding-top:3px}.dashlist-link .fa-star{color:#ff7518}.dashlist-link:hover{background-color:#e2e2e2}.admin-settings-section{color:#2ab2e4;font-weight:bold}td.admin-settings-key{padding-left:20px}input[type=text].ng-dirty.ng-invalid{box-shadow:inset 0 0 7px #ff4136}@font-face{font-family:'raintank';src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SAywAAAC8AAAAYGNtYXAaVcxZAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zm7/N1QAAAFwAAAFmGhlYWQFNK2SAAAHCAAAADZoaGVhB14DyAAAB0AAAAAkaG10eAwxAAQAAAdkAAAAHGxvY2ECNgP2AAAHgAAAABBtYXhwABcAvAAAB5AAAAAgbmFtZflvA+cAAAewAAABTnBvc3QAAwAAAAAJAAAAACAAAwQAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADmAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIOYC//3//wAAAAAAIOYA//3//wAB/+MaBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAADwAA/7YDnAO3AAMAHQAhACUAKgAuADEAQgBTAGQAdQCGAJcAqAC5AAA3FyUnJTUTJzUjJwcjJwcjFQcTBxcVIQ0BNzM1NycTAxEXJTkCByERIREHFSc3NzEzAxQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwE2FhUHNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATYWFXsKAS9VAbOKkFsDmDvbEZhXTjY/Alj+wQFGGT4mIU5TU/3CmgJU/awxICDLAWUbE40TGxsTjRMbLo0LERELjQwQEAzQHBONExsbE40UG9cQC40MEBAMjQsQ7BsTjRMbGxONExvXEAuNDBAQDIwMEAEbjRMbGxONFBsbFKgQC40MEBAMjQsQDkMvFvQEAfYoVRcXPDxGDf4JwhFKBFpdHAbPAdn+zwFIF54x/ZsCZUbPygV3/s4TGxsTjBQbHBOMqRAMjQsQEAuMDBEdjBQbHBOMFBsbFIwMEBAMjAwQAREM+RQbHBONExscEo2MjAwQEAyNCxARCy4bE4wUGxwTjRIbuo0LEBALjQwQAREMAAoAAf+5A2IDtQAQACEAMgBDAFQAZQB2AIcAkACVAAATHgE/AT4BLwEuAQ8BDgEfAT8BNhYfARYGDwEGJi8BJjY3NxceAT8BPgEvAS4BDwEOARc3FxYGDwEGJi8BJjY/ATYWFwMuAQ8BDgEfAR4BPwE+AS8BBycmNj8BNhYfARYGDwEGJicFNz4BLwEuAQ8BDgEfAR4BNzcXFgYPAQYmLwEmNj8BNhYXARMfASUvAQMFEwMlEwWdAyAVkhUYAxcDIRSTFBgDFxWTDBQBFwIODZIMFAIXAg8M3hcDIRSSFBgDFwMgFZIUGAPgFwIPDJIMFAIWAg4MkgwUAs4DIRSTFBgDFwMgFZIVGAMXyhcCDwyTDBQBFwIODZIMFAIBL5IUGAMXAyAVkhQYAxcDIRSRFwIPDJIMFAIXAg8MkgwUAv1pahUNAtUNFWv9LJ9jAmxj/ZQCFxQYAxYEIBWSFRgDFwMhFJO3FwIPDJIMFAIXAg8MkwwUAQWTFBgDFgMhFJMUGAMWAyEUIpINEwIXAg8MkwwUAhYCDg3+1xQYAxcDIRSTFBgDFwMhFJO2kwwUAhYCDgyTDBQCFgIPCwMXAyEUkxQYAxcDIBWSFBkD35MMFAIWAg4NkgwUAhYCDgwBU/1PilFwUokCsXD9VwJ9YP2DYAAKAAP/twMyA7QAEAAhADIAQwBUAGUAdgCHAIwAkQAAExQWOwEyNj0BNCYrASIGHQE3MzIWHQEUBisBIiY9ATQ2MxcVFBY7ATI2PQE0JisBIgYVMxUUBisBIiY9ATQ2OwEyFhUBNCYrASIGHQEUFjsBMjY9AQc1NDY7ATIWHQEUBisBIiY1BTMyNj0BNCYrASIGHQEUFjM3FRQGKwEiJj0BNDY7ATIWFQERIREhExEhESF7IBelFx8fF6UXIDelDhITDaUOExQN9CAXpBcgIBekFyD8Ew2lDhMUDaQOE/7rHxelFyAgF6UXH/wUDaUOEhMNpQ0UAUykFyAgF6QXICAXxRMNpQ4TFA2kDhP9YQMv/NE7Arr9RgJOFyAgF6QXICAXpMUTDqQOExMOpA4TIaQXICAXpBcgIBekDhMTDqQOExMO/twXICAXpBcgIBekpKQOExMOpA4TEw43IBekFyAgF6QXINukDhMTDqQOExMOAeb8AwP9/PkCzP00AAEAAAABAADkYnVvXw889QALBAAAAAAA0Ty0lAAAAADRPLSUAAD/tgOcA7cAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAA5wAAQAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAACAAAAA50AAANiAAEDMgADAAAAAAAKABQAHgEWAg4CzAABAAAABwC6AA8AAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEAEAAAAAEAAAAAAAIADgBOAAEAAAAAAAMAEAAmAAEAAAAAAAQAEABcAAEAAAAAAAUAFgAQAAEAAAAAAAYACAA2AAEAAAAAAAoANABsAAMAAQQJAAEAEAAAAAMAAQQJAAIADgBOAAMAAQQJAAMAEAAmAAMAAQQJAAQAEABcAAMAAQQJAAUAFgAQAAMAAQQJAAYAEAA+AAMAAQQJAAoANABsAHIAYQBpAG4AdABhAG4AawBWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBhAGkAbgB0AGEAbgBrcmFpbnRhbmsAcgBhAGkAbgB0AGEAbgBrAFIAZQBnAHUAbABhAHIAcgBhAGkAbgB0AGEAbgBrAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAlsAAsAAAAACSAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIDLGNtYXAAAAFoAAAATAAAAEwaVcxZZ2FzcAAAAbQAAAAIAAAACAAAABBnbHlmAAABvAAABZgAAAWYbv83VGhlYWQAAAdUAAAANgAAADYFNK2SaGhlYQAAB4wAAAAkAAAAJAdeA8hobXR4AAAHsAAAABwAAAAcDDEABGxvY2EAAAfMAAAAEAAAABACNgP2bWF4cAAAB9wAAAAgAAAAIAAXALxuYW1lAAAH/AAAAU4AAAFO+W8D53Bvc3QAAAlMAAAAIAAAACAAAwAAAAMEAAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA5gIDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDmAv/9//8AAAAAACDmAP/9//8AAf/jGgQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAA8AAP+2A5wDtwADAB0AIQAlACoALgAxAEIAUwBkAHUAhgCXAKgAuQAANxclJyU1Eyc1IycHIycHIxUHEwcXFSENATczNTcnEwMRFyU5AgchESERBxUnNzcxMwMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBNhYVBzQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwE2FhV7CgEvVQGzipBbA5g72xGYV042PwJY/sEBRhk+JiFOU1P9wpoCVP2sMSAgywFlGxONExsbE40TGy6NCxERC40MEBAM0BwTjRMbGxONFBvXEAuNDBAQDI0LEOwbE40TGxsTjRMb1xALjQwQEAyMDBABG40TGxsTjRQbGxSoEAuNDBAQDI0LEA5DLxb0BAH2KFUXFzw8Rg3+CcIRSgRaXRwGzwHZ/s8BSBeeMf2bAmVGz8oFd/7OExsbE4wUGxwTjKkQDI0LEBALjAwRHYwUGxwTjBQbGxSMDBAQDIwMEAERDPkUGxwTjRMbHBKNjIwMEBAMjQsQEQsuGxOMFBscE40SG7qNCxAQC40MEAERDAAKAAH/uQNiA7UAEAAhADIAQwBUAGUAdgCHAJAAlQAAEx4BPwE+AS8BLgEPAQ4BHwE/ATYWHwEWBg8BBiYvASY2NzcXHgE/AT4BLwEuAQ8BDgEXNxcWBg8BBiYvASY2PwE2FhcDLgEPAQ4BHwEeAT8BPgEvAQcnJjY/ATYWHwEWBg8BBiYnBTc+AS8BLgEPAQ4BHwEeATc3FxYGDwEGJi8BJjY/ATYWFwETHwElLwEDBRMDJRMFnQMgFZIVGAMXAyEUkxQYAxcVkwwUARcCDg2SDBQCFwIPDN4XAyEUkhQYAxcDIBWSFBgD4BcCDwySDBQCFgIODJIMFALOAyEUkxQYAxcDIBWSFRgDF8oXAg8MkwwUARcCDg2SDBQCAS+SFBgDFwMgFZIUGAMXAyEUkRcCDwySDBQCFwIPDJIMFAL9aWoVDQLVDRVr/SyfYwJsY/2UAhcUGAMWBCAVkhUYAxcDIRSTtxcCDwySDBQCFwIPDJMMFAEFkxQYAxYDIRSTFBgDFgMhFCKSDRMCFwIPDJMMFAIWAg4N/tcUGAMXAyEUkxQYAxcDIRSTtpMMFAIWAg4MkwwUAhYCDwsDFwMhFJMUGAMXAyAVkhQZA9+TDBQCFgIODZIMFAIWAg4MAVP9T4pRcFKJArFw/VcCfWD9g2AACgAD/7cDMgO0ABAAIQAyAEMAVABlAHYAhwCMAJEAABMUFjsBMjY9ATQmKwEiBh0BNzMyFh0BFAYrASImPQE0NjMXFRQWOwEyNj0BNCYrASIGFTMVFAYrASImPQE0NjsBMhYVATQmKwEiBh0BFBY7ATI2PQEHNTQ2OwEyFh0BFAYrASImNQUzMjY9ATQmKwEiBh0BFBYzNxUUBisBIiY9ATQ2OwEyFhUBESERIRMRIREheyAXpRcfHxelFyA3pQ4SEw2lDhMUDfQgF6QXICAXpBcg/BMNpQ4TFA2kDhP+6x8XpRcgIBelFx/8FA2lDhITDaUNFAFMpBcgIBekFyAgF8UTDaUOExQNpA4T/WEDL/zROwK6/UYCThcgIBekFyAgF6TFEw6kDhMTDqQOEyGkFyAgF6QXICAXpA4TEw6kDhMTDv7cFyAgF6QXICAXpKSkDhMTDqQOExMONyAXpBcgIBekFyDbpA4TEw6kDhMTDgHm/AMD/fz5Asz9NAABAAAAAQAA5GJ1b18PPPUACwQAAAAAANE8tJQAAAAA0Ty0lAAA/7YDnAO3AAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOcAAEAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAgAAAAOdAAADYgABAzIAAwAAAAAACgAUAB4BFgIOAswAAQAAAAcAugAPAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABAAAAABAAAAAAACAA4ATgABAAAAAAADABAAJgABAAAAAAAEABAAXAABAAAAAAAFABYAEAABAAAAAAAGAAgANgABAAAAAAAKADQAbAADAAEECQABABAAAAADAAEECQACAA4ATgADAAEECQADABAAJgADAAEECQAEABAAXAADAAEECQAFABYAEAADAAEECQAGABAAPgADAAEECQAKADQAbAByAGEAaQBuAHQAYQBuAGsAVgBlAHIAcwBpAG8AbgAgADEALgAwAHIAYQBpAG4AdABhAG4Aa3JhaW50YW5rAHIAYQBpAG4AdABhAG4AawBSAGUAZwB1AGwAYQByAHIAYQBpAG4AdABhAG4AawBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:normal;font-style:normal}.gf-icon{display:inline-block;font:normal normal normal 14px/1 'raintank';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.gf-icon-snap-multi:before{content:"\e600"}.gf-icon-snap-single-tilt:before{content:"\e601"}.gf-icon-snap-single:before{content:"\e602"}.row-control-inner{padding:0;margin:0;position:relative}.hide-controls{padding:0}.hide-controls .row-tab{display:none}.hide-controls .add-row-panel-hint{display:none}.playlist-active .grafana-menu-zoom-out,.playlist-active .add-row-panel-hint,.playlist-active .grafana-menu-refresh,.playlist-active .top-nav-dashboards-btn,.playlist-active .top-nav-dash-actions{display:none}.playlist-active .grafana-menu-stop-playlist{display:list-item}.row-button{width:24px}.modal{max-width:800px;left:0;right:0;margin-left:auto;margin-right:auto;top:20%}.dashboard-fullscreen .main-view-container{overflow:hidden;height:0;padding:0}.dashboard-fullscreen .main-view-container .row-control-inner{display:none}.histogram-chart{position:relative}.scrollable{max-height:300px;overflow:auto}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar:hover{height:8px}::-webkit-scrollbar-button:start:decrement,::-webkit-scrollbar-button:end:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement{display:none}::-webkit-scrollbar-button:horizontal:increment{display:none}::-webkit-scrollbar-button:vertical:decrement{display:none}::-webkit-scrollbar-button:vertical:increment{display:none}::-webkit-scrollbar-button:horizontal:decrement:active{background-image:none}::-webkit-scrollbar-button:horizontal:increment:active{background-image:none}::-webkit-scrollbar-button:vertical:decrement:active{background-image:none}::-webkit-scrollbar-button:vertical:increment:active{background-image:none}::-webkit-scrollbar-track-piece{background-color:transparent}::-webkit-scrollbar-thumb:vertical{height:50px;background:-webkit-gradient(linear,left top,right top,color-stop(0%,#f9f9f9),color-stop(100%,#f9f9f9));border:1px solid #999;border-top:1px solid #999;border-left:1px solid #999}::-webkit-scrollbar-thumb:horizontal{width:50px;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#f9f9f9),color-stop(100%,#f9f9f9));border:1px solid #999;border-top:1px solid #999;border-left:1px solid #999}.sp-replacer{background:inherit;border:0;color:inherit;padding:0}.sp-replacer:hover,.sp-replacer.sp-active{border-color:inherit;color:inherit}.sp-container{border-radius:0;background-color:#f9f9f9;border:0;padding:0}.sp-palette-container,.sp-picker-container{border:0}.sp-dd{display:none}.sp-preview{position:relative;width:15px;height:15px;border:0;margin-right:5px;float:left;z-index:0}.datapoints-warning{pointer:none;position:absolute;top:50%;left:50%;z-index:10;margin-top:-50px;margin-left:-100px;width:200px;text-align:center;cursor:auto;padding:10px}.metrics-editor-help:hover .hide{display:block}.grafana-tooltip{position:absolute;top:-1000;left:0;color:#c8c8c8;padding:10px;font-size:11pt;font-weight:200;background-color:#3a3939;border-radius:5px;z-index:9999;max-width:800px;max-height:600px;overflow:hidden;line-height:14px}.grafana-tooltip a{color:#e3e3e3}.grafana-tooltip hr{padding:2px;color:#c8c8c8;margin:0;border-bottom:0 solid #c8c8c8}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip-inner{max-width:400px}.grafana-version-info{position:absolute;bottom:2px;left:3px;font-size:80%;color:#161616}.grafana-version-info a{color:#161616}.template-variable{color:#2ab2e4}.grafana-info-box:before{content:"\f05a";font-family:'FontAwesome';position:absolute;top:-8px;left:-8px;font-size:20px;color:#2ab2e4}.grafana-info-box{position:relative;padding:5px 15px;background-color:#efefef;border:1px solid #ddd}.grafana-info-box h5{margin-top:5px}.grafana-tip{padding-left:5px}.shortcut-table td{padding:3px}.shortcut-table th:last-child{text-align:left}.shortcut-table td:first-child{text-align:right}.confirm-modal{border:1px solid #e2e2e2;max-width:500px;background-color:#fff;text-align:center}.confirm-modal .modal-close{float:right;font-size:140%;padding:10px}.confirm-modal .confirm-modal-icon{padding-top:41px;font-size:280%;color:#28b62c;padding-bottom:20px}.confirm-modal .confirm-modal-title{font-size:18px;color:#555;margin-bottom:15px}.confirm-modal .confirm-modal-text{font-size:16px}.confirm-modal .confirm-modal-buttons{margin-top:35px;margin-bottom:35px}.confirm-modal .confirm-modal-buttons button{margin-right:5px}.share-snapshot{text-align:center}.share-snapshot .gf-icon-snap-multi{font-size:70px}.share-snapshot .fa-spinner{font-size:70px}.share-snapshot .share-snapshot-info-text{margin:10px 105px}.share-snapshot .share-snapshot-info-text strong{color:#222;font-weight:bold}.share-snapshot .share-snapshot-header{margin:20px 0 22px 0}.share-snapshot .tight-form{text-align:left}.share-snapshot .share-snapshot-link{max-width:716px;white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}
/*!
* Bootstrap Responsive v2.3.2
*
diff --git a/public/css/less/gfbox.less b/public/css/less/gfbox.less
index 50401e21c50..8f4469b1390 100644
--- a/public/css/less/gfbox.less
+++ b/public/css/less/gfbox.less
@@ -16,7 +16,9 @@
background-color: transparent;
border: none;
padding: 8px;
- font-size: 120%;
+ i {
+ font-size: 120%;
+ }
color: @textColor;
&:hover {
color: @white;
diff --git a/public/css/less/submenu.less b/public/css/less/submenu.less
index fa933ced863..a610a9ed7d6 100644
--- a/public/css/less/submenu.less
+++ b/public/css/less/submenu.less
@@ -3,8 +3,9 @@
top: 88px;
}
}
+
.submenu-controls {
- margin: 10px 10px 0 0px;
+ margin: 10px 10px 0 5px;
font-size: 16px;
}
diff --git a/public/css/less/tightform.less b/public/css/less/tightform.less
index dbf46a1f3e6..c8a7486cd12 100644
--- a/public/css/less/tightform.less
+++ b/public/css/less/tightform.less
@@ -89,7 +89,7 @@
padding-left: 18px;
}
&.annotation-segment {
- padding: 8px 10px;
+ padding: 8px 13px;
}
&.last {
From 060d0b777b0393dc68769d0533c7f4064f4a562d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Mon, 30 Mar 2015 12:31:12 +0200
Subject: [PATCH 011/181] Updated install docs and changelog
---
CHANGELOG.md | 2 +-
docs/sources/installation/index.md | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 15f4fe5fa22..aa48bf7df41 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-# 2.0.0 (unreleased)
+# 2.0.0-Beta1 (2015-03-30)
**New features**
- [Issue #1623](https://github.com/grafana/grafana/issues/1623). Share Dashboard: Dashboard snapshot sharing (dash and data snapshot), save to local or save to public snapshot dashboard snapshots.raintank.io site
diff --git a/docs/sources/installation/index.md b/docs/sources/installation/index.md
index 3f4ebf12118..a08fe186962 100644
--- a/docs/sources/installation/index.md
+++ b/docs/sources/installation/index.md
@@ -10,14 +10,14 @@ a tar that contains all required files and binaries. If you can't find a package
to build one your self, read [build from source](../project/building_from_source) instructions for more information.
## Ubuntu & Debian
-Start by [downloading](http://grafana.org/download/builds) the latest `.deb` package.
+Start by [downloading](http://grafana.org/download) the latest `.deb` package.
To install the package:
$ sudo dpkg -i grafana_latest_amd64.deb
## Redhat & Centos
-Start by [downloading](http://grafana.org/download/builds) the latest `.rpm` package.
+Start by [downloading](http://grafana.org/download) the latest `.rpm` package.
$ sudo rpm -Uvh grafana-latest-1.x86_64.rpm
From fb0629a9139e481b72e681a21e1a67c2bf43ecaa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Mon, 30 Mar 2015 15:45:02 +0200
Subject: [PATCH 012/181] Bumbped version to 2.0.0-beta1
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index b7cd83048f1..1b1290b0da8 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"company": "Coding Instinct AB"
},
"name": "grafana",
- "version": "2.0.0-prebeta3",
+ "version": "2.0.0-beta1",
"repository": {
"type": "git",
"url": "http://github.com/torkelo/grafana.git"
From dade6fc1913855114ed358556db8e830eba6e382 Mon Sep 17 00:00:00 2001
From: Lars Francke
Date: Mon, 30 Mar 2015 16:55:37 +0200
Subject: [PATCH 013/181] Update index.md
Fixes two typos and a minor inconsistency
---
docs/sources/index.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/docs/sources/index.md b/docs/sources/index.md
index ca463496947..537d1494ca9 100644
--- a/docs/sources/index.md
+++ b/docs/sources/index.md
@@ -6,11 +6,11 @@ page_keywords: grafana, introduction, documentation, about
Grafana is a general purpose dashboard and graph composer. It's focused on providing
rich ways to visualize time series metrics, mainly though graphs but supports other ways to visualize data through
-a pluggable panel architecture. It currently has rich support for for [Graphite](http://graphite.readthedocs.org/en/latest/),
+a pluggable panel architecture. It currently has rich support for [Graphite](http://graphite.readthedocs.org/en/latest/),
[InfluxDB](http://influxdb.org) and [OpenTSDB](http://opentsdb.net). But supports other data sources via plugins.
It is most commonly used for infrastructure monitoring, application monitoring and metric analytics. But Grafana
-has an open architecture and design that enabled is to be used in other domains as well, like home automation,
+has an open architecture and design that enables it to be used in other domains as well, like home automation,
weather and industrial sensors analytics.
## Support
@@ -20,7 +20,7 @@ correctly there are a number of sources where you can get help.
- [Troubleshooting guide](../troubleshooting)
- \#grafana IRC channel on freenode
-- Search closed and open [issues on github](https://github.com/grafana/grafana/issues).
+- Search closed and open [issues on github](https://github.com/grafana/grafana/issues)
- [Mailing list](https://groups.io/org/groupsio/grafana)
Do not hesitate to open a new issue with a question, bug report or an idea for improvement.
From 2eeae21777ec20c887667e2c6b23b205603bf2f9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Mon, 30 Mar 2015 17:35:34 +0200
Subject: [PATCH 014/181] Updated whats new docs guide
---
docs/VERSION | 2 +-
docs/sources/guides/whats-new-in-v2.md | 7 ++++++-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/docs/VERSION b/docs/VERSION
index 227cea21564..edb49bc725f 100644
--- a/docs/VERSION
+++ b/docs/VERSION
@@ -1 +1 @@
-2.0.0
+2.0.0-beta
diff --git a/docs/sources/guides/whats-new-in-v2.md b/docs/sources/guides/whats-new-in-v2.md
index e7054e89cbd..f511e29fd42 100644
--- a/docs/sources/guides/whats-new-in-v2.md
+++ b/docs/sources/guides/whats-new-in-v2.md
@@ -21,6 +21,10 @@ that is provided by [Raintank](http://raintank.io) that allows you to publish da
The same rules still apply, anyone with the link can view it. You can set an expiration time if you want the snapshot to be removed
after a certain time period.
+Dashboard snapshots are really useful when you want to share a whole dashboard or just a panel with an external client who do not
+have access to your Grafana instance. Instead of taking a picture you can snapshot the current visible data
+and share an interactive dashboard. It can also be used in combination with panel iframe embedding (mentioned below).
+
## Panel time overrides & timeshift
In Grafana v2.x you can now override the relative time range for individual panels. You can also add a
@@ -44,7 +48,8 @@ upper right of a panel when overriden time range options.
## Panel IFrame embedding
You can embed a single panel on another web page using the panel share dialog. Below you should see an iframe
-with a graph panel (taken from dashoard snapshot at [snapshot.raintank.io](http://snapshot.raintank.io).
+with a graph panel (taken from dashoard snapshot at [snapshot.raintank.io](http://snapshot.raintank.io). Try
+hovering or zooming on the panel below!
From b313637848553d68cc5453cdf7ecd1eeb42c83ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Mon, 30 Mar 2015 17:39:16 +0200
Subject: [PATCH 015/181] updated confiuration docs
---
docs/sources/installation/configuration.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/sources/installation/configuration.md b/docs/sources/installation/configuration.md
index d89ed953fa4..b1bf879cc1d 100644
--- a/docs/sources/installation/configuration.md
+++ b/docs/sources/installation/configuration.md
@@ -209,7 +209,7 @@ How long sessions lasts in seconds. Defaults to `86400` (24 hours).
## [analytics]
-### reporting-enabled
+### reporting_enabled
When enabled Grafana will send anonymous usage statistics to stats.grafana.org.
No ip addresses are being tracked, only simple counters to track running instances,
versions, dashboard & error counts. It is very helpful to us, please leave this
From ffe389af4aac720bdd912b6e52e73c5cc620ea23 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Mon, 30 Mar 2015 19:18:15 +0200
Subject: [PATCH 016/181] Updated to whats new guide
---
docs/sources/guides/whats-new-in-v2.md | 71 ++++++++++++++++----------
1 file changed, 45 insertions(+), 26 deletions(-)
diff --git a/docs/sources/guides/whats-new-in-v2.md b/docs/sources/guides/whats-new-in-v2.md
index f511e29fd42..fc40506ef36 100644
--- a/docs/sources/guides/whats-new-in-v2.md
+++ b/docs/sources/guides/whats-new-in-v2.md
@@ -6,24 +6,41 @@ page_keywords: grafana, new, changes, features, documentation
# What's New in Grafana v2.0
-This is a guide that describes some of changes and new features that can be found in Grafana v2.0.
+Grafana 2.0 represents months of work by the Grafana team and the community. We are pleased to be able to
+release the Grafana 2.0 beta. This is a guide that describes some of changes and new features that can
+be found in Grafana V2.0.
+
+If you are interested in how to migrate from Grafana V1.x to V2.0, please read our [Migration Guide](../installation/migrating_to2.md)
+
+## New backend
+
+Grafana now ships with its own backend server. Graphs are still 100% client-side rendered, but the integrated server allows for much of
+the new functionality that 2.0 brings. The backend server is written in Go, has a full HTTP API, and is also completely open source.
+
+In addition to new features, the backend server makes it much easier to set up and enjoy Grafana.
+Grafana 2.0 ships as a single binary with no dependencies, and we hope to extend support to more platforms.
+Authentication is built in, and Grafana is now capable of proxying connections to Data Sources.
+There are no longer any CORS (Cross Origin Resource Sharing) issues requiring messy workarounds.
+Elasticsearch is no longer required just to store dashboards.
## Dashboard Snapshot sharing
-A dashboard snapshot is an instant way to share an interactive dashboard publicly. When created, we strip sensitive data like queries
-(metric, template and annotation) and panel links, leaving only the visible metric data and series names embedded into your dashboard. Dashboard
-snapshots can be accessed by anyone who has the link and can reach the URL.
+A Dashboard Snapshot is an easy way to create and share a URL for a stripped down, point-in-time version of any Dashboard.
+You can give this URL to anyone or everyone, and they can view the Snapshot even if they're not a User of your Grafana instance.
+You can set an expiration time for any Snapshots you create. When you create a Snapshot, we strip some data, like
+panel metric queries, annotation and template queries and panel links. The data points displayed on
+screen for that specific time period in your Dashboard is saved in the JSON of the Snapshot itself.
+
+Sharing a Snapshot is similar to sharing a link to a screenshot of your dashboard, only way better (they'll look great at any screen resolution, you can hover over series,
+even zoom in). Also they are fast to load as they aren't actually connected to any live Data Sources in any way.
+
+They're a great way to communicate about a particular incident with specific people, or over the Internet. You can also use them to show off your dashboards.

### Publish snapshots
You can publish snapshots to you local instance or to [snapshot.raintank.io](http://snapshot.raintank.io). The later is a free service
that is provided by [Raintank](http://raintank.io) that allows you to publish dashboard snapshots to an external grafana instance.
-The same rules still apply, anyone with the link can view it. You can set an expiration time if you want the snapshot to be removed
-after a certain time period.
-
-Dashboard snapshots are really useful when you want to share a whole dashboard or just a panel with an external client who do not
-have access to your Grafana instance. Instead of taking a picture you can snapshot the current visible data
-and share an interactive dashboard. It can also be used in combination with panel iframe embedding (mentioned below).
+The same rules still apply, anyone with the link can view it.
## Panel time overrides & timeshift
@@ -57,17 +74,22 @@ hovering or zooming on the panel below!
-1. Side menu toggle
-2. Dashboard title & Search dropdown (also includes access to New dashboard, Import & Playlist)
-3. Star/unstar current dashboard
-4. Share current dashboard (Make sure the dashboard is saved before)
-5. Save current dashboard
-6. Settings dropdown (dashboard settings, annotations, templating, etc)
+1. `Side menubar toggle` Toggle the side menubar on or off. This allows you to focus on the data presented on the Dashboard. The side menubar provides access to features unrelated to a Dashboard such as Users, Organizations, and Data Sources.
+2. `Dashboard dropdown` This main dropdown shows you which Dashboard you are currently viewing, and allows you to easily switch to a new Dashboard. From here you can also create a new Dashboard, Import existing Dashboards, and manage Dashboard playlists.
+3. `Star Dashboard`: Star (or unstar) the current Dashboar. Starred Dashboards will show up on your own Home Dashboard by default, and are a convenient way to mark Dashboards that you're interested in.
+4. `Share Dashboard`: Share the current dashboard by creating a link or create a static Snapshot of it. Make sure the Dashboard is saved before sharing.
+5. `Save dashboard`: Save the current Dashboard.
+6. `Settings`: Manage Dashboard settings and features such as Templating and Annotations.
> **Note** In Grafana v2.0 when you change the title of a dashboard and then save it it will no
> longer create a new dashboard. It will just change the name for the current dashboard.
> To change name and create a new dashboard use the `Save As...` menu option
+### New Side menubar
+
+The side menubar provides access to features such as User Preferences, Organizations, and Data Sources.
+If you have multiple Organizations, you can easily switch between them.
+
## New search view & starring dashboards

@@ -100,18 +122,16 @@ Graphite or OpenTSDB without having to spend time with nginx CORS (Cross origin
> hide database user & password details from the frontend / browser.
## Relative time now delay
+A commonly reported problem has been graphs dipping to zero at the the end, because metric data for
+the last interval has yet to be written to the Data Source. These graphs then "self correct" once the data comes in, but can look deceiving or alarming at times.
-A problem that has plagued many is the fact that graphs tend to dip to zero by the end because metrics for
-the last interval has yet to be received by the time series database. You can now work around this by adding
-a now delay in `Dashboard Settings` > `Time Picker` tab.
-
+You can avoid this problem by adding a `now delay` in `Dashboard Settings` > `Time Picker` tab. This will effectively cause Grafana to ignore the most recent data up to the set delay. The necessary delay will depend on how much latency you have in your collection pipeline.

## Overwrite protection
-Grafana v2.0 will protect you and your other Grafana users from accidentally overwriting each others changes
-to the same dashboard. The same protection also applies if you try to create a new dashboard with a
-name that already exists.
+Grafana v2.0 will protect Users from accidentally overwriting another Users changes. Similar protections are in place if you try to create a new Dashboard with the same name as an existing one.
+These protections are only the first step; we will be building out additional capabilities around dashboard versioning and management in future versions of Grafana.

@@ -121,10 +141,9 @@ If you open side menu (by clicking on the Grafana icon in the top header) you ca
Here you can update your user details, UI Theme and change password.
## PNG rendering
+Grafana now supports server-side PNG rendering. From the Panel share dialog you now have access to a link that will render the Panel to a PNG image.
-In the panel share dialog you now have access to a link that will render the panel to a PNG image.
-The panel is rendered on the backend via phantomjs (headless browser). This requires that your metric
-data source is accessible from your Grafana server host machine.
+> **Note** This requires that your Data Source is accessible from your Grafana instance.

From cedb11ebab6e8e73dec778654483a4b2e42a18d6 Mon Sep 17 00:00:00 2001
From: Matt Robenolt
Date: Mon, 30 Mar 2015 18:11:39 -0700
Subject: [PATCH 017/181] Let xorm convert `False` into the right type
---
pkg/services/sqlstore/datasource.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pkg/services/sqlstore/datasource.go b/pkg/services/sqlstore/datasource.go
index 9c3dd6c2902..e82d42951e8 100644
--- a/pkg/services/sqlstore/datasource.go
+++ b/pkg/services/sqlstore/datasource.go
@@ -89,8 +89,8 @@ func AddDataSource(cmd *m.AddDataSourceCommand) error {
func updateIsDefaultFlag(ds *m.DataSource, sess *xorm.Session) error {
// Handle is default flag
if ds.IsDefault {
- rawSql := "UPDATE data_source SET is_default = 0 WHERE org_id=? AND id <> ?"
- if _, err := sess.Exec(rawSql, ds.OrgId, ds.Id); err != nil {
+ rawSql := "UPDATE data_source SET is_default=? WHERE org_id=? AND id <> ?"
+ if _, err := sess.Exec(rawSql, False, ds.OrgId, ds.Id); err != nil {
return err
}
}
From aa724fc11e1ffe2c79532149fea9e9f293b2c598 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Tue, 31 Mar 2015 10:48:14 +0200
Subject: [PATCH 018/181] Remove datasource names in panels from snapshots
---
public/app/features/dashboard/shareSnapshotCtrl.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/public/app/features/dashboard/shareSnapshotCtrl.js b/public/app/features/dashboard/shareSnapshotCtrl.js
index eba1e6e6ac7..17a313b2b64 100644
--- a/public/app/features/dashboard/shareSnapshotCtrl.js
+++ b/public/app/features/dashboard/shareSnapshotCtrl.js
@@ -86,6 +86,7 @@ function (angular, _) {
dash.forEachPanel(function(panel) {
panel.targets = [];
panel.links = [];
+ panel.datasource = null;
});
// remove annotations
dash.annotations.list = [];
From b83367063e71298296555c54e2d3f5032146d350 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Tue, 31 Mar 2015 14:03:01 +0200
Subject: [PATCH 019/181] Small improvement to dashboard loading error handling
---
pkg/middleware/auth.go | 3 +--
public/app/routes/dashLoadControllers.js | 15 ++++++++-------
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/pkg/middleware/auth.go b/pkg/middleware/auth.go
index 53b554942a6..3d73b15c7f3 100644
--- a/pkg/middleware/auth.go
+++ b/pkg/middleware/auth.go
@@ -42,6 +42,7 @@ func authDenied(c *Context) {
return
}
+ c.SetCookie("redirect_to", url.QueryEscape(setting.AppSubUrl+c.Req.RequestURI), 0, setting.AppSubUrl+"/")
c.Redirect(setting.AppSubUrl + "/login")
}
@@ -63,13 +64,11 @@ func RoleAuth(roles ...m.RoleType) macaron.Handler {
func Auth(options *AuthOptions) macaron.Handler {
return func(c *Context) {
if !c.IsGrafanaAdmin && options.ReqGrafanaAdmin {
- c.SetCookie("redirect_to", url.QueryEscape(setting.AppSubUrl+c.Req.RequestURI), 0, setting.AppSubUrl+"/")
authDenied(c)
return
}
if !c.IsSignedIn && options.ReqSignedIn && !c.AllowAnonymous {
- c.SetCookie("redirect_to", url.QueryEscape(setting.AppSubUrl+c.Req.RequestURI), 0, setting.AppSubUrl+"/")
authDenied(c)
return
}
diff --git a/public/app/routes/dashLoadControllers.js b/public/app/routes/dashLoadControllers.js
index 8e888c07a80..51db273eac0 100644
--- a/public/app/routes/dashLoadControllers.js
+++ b/public/app/routes/dashLoadControllers.js
@@ -12,12 +12,15 @@ function (angular, _, kbn, moment, $) {
module.controller('DashFromDBCtrl', function($scope, $routeParams, backendSrv) {
+ function dashboardLoadFailed(title) {
+ $scope.initDashboard({meta: {}, model: {title: title}}, $scope);
+ }
+
if (!$routeParams.slug) {
backendSrv.get('/api/dashboards/home').then(function(result) {
$scope.initDashboard(result, $scope);
},function() {
- $scope.initDashboard({}, $scope);
- $scope.appEvent('alert-error', ['Load dashboard failed', '']);
+ dashboardLoadFailed('Not found');
});
return;
@@ -26,17 +29,15 @@ function (angular, _, kbn, moment, $) {
return backendSrv.getDashboard($routeParams.slug).then(function(result) {
$scope.initDashboard(result, $scope);
}, function() {
- $scope.initDashboard({
- meta: {},
- model: { title: 'Not found' }
- }, $scope);
+ dashboardLoadFailed('Not found');
});
+
});
module.controller('DashFromSnapshotCtrl', function($scope, $routeParams, backendSrv) {
backendSrv.get('/api/snapshots/' + $routeParams.key).then(function(result) {
$scope.initDashboard(result, $scope);
- },function() {
+ }, function() {
$scope.initDashboard({meta: {isSnapshot: true}, model: {title: 'Snapshot not found'}}, $scope);
});
});
From 1d0a3660bde4b93905c257f7eb04e8c361a52f58 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Tue, 31 Mar 2015 14:31:47 +0200
Subject: [PATCH 020/181] Fixed issue with updating default data source, it
required page reload to take effect, should not be required, now fixed, Fixes
#1671
---
CHANGELOG.md | 5 +++++
public/app/features/org/datasourceEditCtrl.js | 8 +++++---
public/app/services/datasourceSrv.js | 6 ++----
3 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index aa48bf7df41..26996359593 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 2.0.0-RC1 (unreleased)
+
+- [Issue #1671](https://github.com/grafana/grafana/issues/1671). Data sources: Fixed issue with changing default data source (should not require full page load to take effect, now fixed)
+
+
# 2.0.0-Beta1 (2015-03-30)
**New features**
diff --git a/public/app/features/org/datasourceEditCtrl.js b/public/app/features/org/datasourceEditCtrl.js
index 913c45fcd67..780aee3e843 100644
--- a/public/app/features/org/datasourceEditCtrl.js
+++ b/public/app/features/org/datasourceEditCtrl.js
@@ -1,8 +1,8 @@
define([
'angular',
- 'lodash',
+ 'config',
],
-function (angular) {
+function (angular, config) {
'use strict';
var module = angular.module('grafana.controllers');
@@ -59,7 +59,9 @@ function (angular) {
$scope.updateFrontendSettings = function() {
backendSrv.get('/api/frontend/settings').then(function(settings) {
- datasourceSrv.init(settings.datasources);
+ config.datasources = settings.datasources;
+ config.defaultDatasource = settings.defaultDatasource;
+ datasourceSrv.init();
});
};
diff --git a/public/app/services/datasourceSrv.js b/public/app/services/datasourceSrv.js
index 82a19efdff0..35256c9fe4f 100644
--- a/public/app/services/datasourceSrv.js
+++ b/public/app/services/datasourceSrv.js
@@ -11,9 +11,7 @@ function (angular, _, config) {
module.service('datasourceSrv', function($q, $injector, $rootScope) {
var self = this;
- this.init = function(dsSettingList) {
- config.datasources = dsSettingList;
-
+ this.init = function() {
this.datasources = {};
this.metricSources = [];
this.annotationSources = [];
@@ -77,6 +75,6 @@ function (angular, _, config) {
return this.metricSources;
};
- this.init(config.datasources);
+ this.init();
});
});
From 463c5199545b11becc690f0d592d68c6984d6d43 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Tue, 31 Mar 2015 17:30:27 +0200
Subject: [PATCH 021/181] Dashlist panel: added fresh panel when changing
limit, Fixes #1677
---
CHANGELOG.md | 1 -
conf/defaults.ini | 2 +-
public/app/panels/dashlist/editor.html | 2 +-
3 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 26996359593..3c0ab7cde47 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,6 @@
- [Issue #1671](https://github.com/grafana/grafana/issues/1671). Data sources: Fixed issue with changing default data source (should not require full page load to take effect, now fixed)
-
# 2.0.0-Beta1 (2015-03-30)
**New features**
diff --git a/conf/defaults.ini b/conf/defaults.ini
index d328733abc9..26fa1b6f126 100644
--- a/conf/defaults.ini
+++ b/conf/defaults.ini
@@ -16,7 +16,7 @@ router_logging = false
; the path relative to the binary where the static (html/js/css) files are placed
static_root_path = public
; enable gzip
-enable_gzip = false
+enable_gzip = true
; https certs & key file
cert_file =
cert_key =
diff --git a/public/app/panels/dashlist/editor.html b/public/app/panels/dashlist/editor.html
index a6de7570f07..578d9e4b2d2 100644
--- a/public/app/panels/dashlist/editor.html
+++ b/public/app/panels/dashlist/editor.html
@@ -47,7 +47,7 @@
Limit number to
-
+
From 4af1dcd54f26a564de74990f777c5e73f02477a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Tue, 31 Mar 2015 17:42:51 +0200
Subject: [PATCH 022/181] Updated defaults.ini, reverted change in previous
commit
---
conf/defaults.ini | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/conf/defaults.ini b/conf/defaults.ini
index 26fa1b6f126..d328733abc9 100644
--- a/conf/defaults.ini
+++ b/conf/defaults.ini
@@ -16,7 +16,7 @@ router_logging = false
; the path relative to the binary where the static (html/js/css) files are placed
static_root_path = public
; enable gzip
-enable_gzip = true
+enable_gzip = false
; https certs & key file
cert_file =
cert_key =
From 7eb45e17992a42e0ec4855386562529e73b98056 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Tue, 31 Mar 2015 19:18:41 +0200
Subject: [PATCH 023/181] MySQL session: fixed problem using mysql as session
store, Fixes #1681
---
CHANGELOG.md | 2 +
Godeps/Godeps.json | 2 +-
.../macaron-contrib/session/.gitignore | 2 +
.../macaron-contrib/session/README.md | 6 +-
.../macaron-contrib/session/file.go | 40 +---
.../macaron-contrib/session/ledis/ledis.go | 153 ++++++++-----
.../session/ledis/ledis.goconvey | 1 +
.../session/ledis/ledis_test.go | 105 +++++++++
.../session/memcache/memcache.go | 210 ++++++++---------
.../session/memcache/memcache.goconvey | 1 +
.../session/memcache/memcache_test.go | 107 +++++++++
.../macaron-contrib/session/memory.go | 36 +--
.../macaron-contrib/session/mysql/mysql.go | 148 ++++++------
.../session/mysql/mysql.goconvey | 1 +
.../session/mysql/mysql_test.go | 138 ++++++++++++
.../macaron-contrib/session/nodb/nodb.go | 203 +++++++++++++++++
.../session/nodb/nodb.goconvey | 1 +
.../macaron-contrib/session/nodb/nodb_test.go | 105 +++++++++
.../session/postgres/postgres.go | 196 ++++++++++++++++
.../session/postgres/postgres.goconvey | 1 +
.../session/postgres/postgres_test.go | 138 ++++++++++++
.../session/postgres/postgresql.go | 211 ------------------
.../macaron-contrib/session/redis/redis.go | 199 +++++++++--------
.../session/redis/redis.goconvey | 1 +
.../session/redis/redis_test.go | 107 +++++++++
.../macaron-contrib/session/session.go | 44 ++--
.../macaron-contrib/session/session_test.go | 2 +-
.../macaron-contrib/session/utils.go | 30 +--
28 files changed, 1529 insertions(+), 661 deletions(-)
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/.gitignore
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/ledis/ledis.goconvey
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/ledis/ledis_test.go
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/memcache/memcache.goconvey
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/memcache/memcache_test.go
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/mysql/mysql.goconvey
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/mysql/mysql_test.go
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/nodb/nodb.go
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/nodb/nodb.goconvey
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/nodb/nodb_test.go
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgres.go
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgres.goconvey
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgres_test.go
delete mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgresql.go
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/redis/redis.goconvey
create mode 100644 Godeps/_workspace/src/github.com/macaron-contrib/session/redis/redis_test.go
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3c0ab7cde47..e21e94685d4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,7 @@
# 2.0.0-RC1 (unreleased)
+**FIxes**
+- [Issue #1681](https://github.com/grafana/grafana/issues/1681). MySQL session: fixed problem using mysql as session store
- [Issue #1671](https://github.com/grafana/grafana/issues/1671). Data sources: Fixed issue with changing default data source (should not require full page load to take effect, now fixed)
# 2.0.0-Beta1 (2015-03-30)
diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json
index 857b045ddd8..ce0a9ea142e 100644
--- a/Godeps/Godeps.json
+++ b/Godeps/Godeps.json
@@ -47,7 +47,7 @@
},
{
"ImportPath": "github.com/macaron-contrib/session",
- "Rev": "65b8817c40cb5bdce08673a15fd2a648c2ba0e16"
+ "Rev": "31e841d95c7302b9ac456c830ea2d6dfcef4f84a"
},
{
"ImportPath": "github.com/mattn/go-sqlite3",
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/.gitignore b/Godeps/_workspace/src/github.com/macaron-contrib/session/.gitignore
new file mode 100644
index 00000000000..9297dbcd7c4
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/.gitignore
@@ -0,0 +1,2 @@
+ledis/tmp.db
+nodb/tmp.db
\ No newline at end of file
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/README.md b/Godeps/_workspace/src/github.com/macaron-contrib/session/README.md
index 496ce64ce0d..01de811eacc 100644
--- a/Godeps/_workspace/src/github.com/macaron-contrib/session/README.md
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/README.md
@@ -1,7 +1,7 @@
session [](https://drone.io/github.com/macaron-contrib/session/latest) [](http://gocover.io/github.com/macaron-contrib/session)
=======
-Middleware session provides session management for [Macaron](https://github.com/Unknwon/macaron). It can use many session providers, including memory, file, Redis, Memcache, PostgreSQL, MySQL, Couchbase and Ledis.
+Middleware session provides session management for [Macaron](https://github.com/Unknwon/macaron). It can use many session providers, including memory, file, Redis, Memcache, PostgreSQL, MySQL, Couchbase, Ledis and Nodb.
### Installation
@@ -12,6 +12,10 @@ Middleware session provides session management for [Macaron](https://github.com/
- [API Reference](https://gowalker.org/github.com/macaron-contrib/session)
- [Documentation](http://macaron.gogs.io/docs/middlewares/session)
+## Credits
+
+This package is forked from [beego/session](https://github.com/astaxie/beego/tree/master/session) with reconstruction(over 80%).
+
## License
This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text.
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/file.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/file.go
index 4dfb906ec7e..cab807d00bd 100644
--- a/Godeps/_workspace/src/github.com/macaron-contrib/session/file.go
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/file.go
@@ -28,17 +28,17 @@ import (
"github.com/Unknwon/com"
)
-// FileSessionStore represents a file session store implementation.
-type FileSessionStore struct {
+// FileStore represents a file session store implementation.
+type FileStore struct {
p *FileProvider
sid string
lock sync.RWMutex
data map[interface{}]interface{}
}
-// NewFileSessionStore creates and returns a file session store.
-func NewFileSessionStore(p *FileProvider, sid string, kv map[interface{}]interface{}) *FileSessionStore {
- return &FileSessionStore{
+// NewFileStore creates and returns a file session store.
+func NewFileStore(p *FileProvider, sid string, kv map[interface{}]interface{}) *FileStore {
+ return &FileStore{
p: p,
sid: sid,
data: kv,
@@ -46,7 +46,7 @@ func NewFileSessionStore(p *FileProvider, sid string, kv map[interface{}]interfa
}
// Set sets value to given key in session.
-func (s *FileSessionStore) Set(key, val interface{}) error {
+func (s *FileStore) Set(key, val interface{}) error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -55,7 +55,7 @@ func (s *FileSessionStore) Set(key, val interface{}) error {
}
// Get gets value by given key in session.
-func (s *FileSessionStore) Get(key interface{}) interface{} {
+func (s *FileStore) Get(key interface{}) interface{} {
s.lock.RLock()
defer s.lock.RUnlock()
@@ -63,7 +63,7 @@ func (s *FileSessionStore) Get(key interface{}) interface{} {
}
// Delete delete a key from session.
-func (s *FileSessionStore) Delete(key interface{}) error {
+func (s *FileStore) Delete(key interface{}) error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -72,12 +72,12 @@ func (s *FileSessionStore) Delete(key interface{}) error {
}
// ID returns current session ID.
-func (s *FileSessionStore) ID() string {
+func (s *FileStore) ID() string {
return s.sid
}
// Release releases resource and save data to provider.
-func (s *FileSessionStore) Release() error {
+func (s *FileStore) Release() error {
data, err := EncodeGob(s.data)
if err != nil {
return err
@@ -87,7 +87,7 @@ func (s *FileSessionStore) Release() error {
}
// Flush deletes all session data.
-func (s *FileSessionStore) Flush() error {
+func (s *FileStore) Flush() error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -97,7 +97,6 @@ func (s *FileSessionStore) Flush() error {
// FileProvider represents a file session provider implementation.
type FileProvider struct {
- lock sync.RWMutex
maxlifetime int64
rootPath string
}
@@ -115,9 +114,6 @@ func (p *FileProvider) filepath(sid string) string {
// Read returns raw session store by session ID.
func (p *FileProvider) Read(sid string) (_ RawStore, err error) {
- p.lock.Lock()
- defer p.lock.Unlock()
-
filename := p.filepath(sid)
if err = os.MkdirAll(path.Dir(filename), os.ModePerm); err != nil {
return nil, err
@@ -151,22 +147,16 @@ func (p *FileProvider) Read(sid string) (_ RawStore, err error) {
return nil, err
}
}
- return NewFileSessionStore(p, sid, kv), nil
+ return NewFileStore(p, sid, kv), nil
}
// Exist returns true if session with given ID exists.
func (p *FileProvider) Exist(sid string) bool {
- p.lock.Lock()
- defer p.lock.Unlock()
-
return com.IsFile(p.filepath(sid))
}
// Destory deletes a session by session ID.
func (p *FileProvider) Destory(sid string) error {
- p.lock.Lock()
- defer p.lock.Unlock()
-
return os.Remove(p.filepath(sid))
}
@@ -201,12 +191,9 @@ func (p *FileProvider) regenerate(oldsid, sid string) (err error) {
// Regenerate regenerates a session store from old session ID to new one.
func (p *FileProvider) Regenerate(oldsid, sid string) (_ RawStore, err error) {
- p.lock.Lock()
if err := p.regenerate(oldsid, sid); err != nil {
- p.lock.Unlock()
return nil, err
}
- p.lock.Unlock()
return p.Read(sid)
}
@@ -236,9 +223,6 @@ func (p *FileProvider) GC() {
return
}
- p.lock.Lock()
- defer p.lock.Unlock()
-
if err := filepath.Walk(p.rootPath, func(path string, fi os.FileInfo, err error) error {
if err != nil {
return err
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/ledis/ledis.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/ledis/ledis.go
index 7893769b525..afde7134cbd 100644
--- a/Godeps/_workspace/src/github.com/macaron-contrib/session/ledis/ledis.go
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/ledis/ledis.go
@@ -16,26 +16,39 @@
package session
import (
+ "fmt"
+ "strings"
"sync"
+ "github.com/Unknwon/com"
"github.com/siddontang/ledisdb/config"
"github.com/siddontang/ledisdb/ledis"
+ "gopkg.in/ini.v1"
"github.com/macaron-contrib/session"
)
-var c *ledis.DB
+// LedisStore represents a ledis session store implementation.
+type LedisStore struct {
+ c *ledis.DB
+ sid string
+ expire int64
+ lock sync.RWMutex
+ data map[interface{}]interface{}
+}
-// LedisSessionStore represents a ledis session store implementation.
-type LedisSessionStore struct {
- sid string
- lock sync.RWMutex
- data map[interface{}]interface{}
- maxlifetime int64
+// NewLedisStore creates and returns a ledis session store.
+func NewLedisStore(c *ledis.DB, sid string, expire int64, kv map[interface{}]interface{}) *LedisStore {
+ return &LedisStore{
+ c: c,
+ expire: expire,
+ sid: sid,
+ data: kv,
+ }
}
// Set sets value to given key in session.
-func (s *LedisSessionStore) Set(key, val interface{}) error {
+func (s *LedisStore) Set(key, val interface{}) error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -44,7 +57,7 @@ func (s *LedisSessionStore) Set(key, val interface{}) error {
}
// Get gets value by given key in session.
-func (s *LedisSessionStore) Get(key interface{}) interface{} {
+func (s *LedisStore) Get(key interface{}) interface{} {
s.lock.RLock()
defer s.lock.RUnlock()
@@ -52,7 +65,7 @@ func (s *LedisSessionStore) Get(key interface{}) interface{} {
}
// Delete delete a key from session.
-func (s *LedisSessionStore) Delete(key interface{}) error {
+func (s *LedisStore) Delete(key interface{}) error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -61,25 +74,26 @@ func (s *LedisSessionStore) Delete(key interface{}) error {
}
// ID returns current session ID.
-func (s *LedisSessionStore) ID() string {
+func (s *LedisStore) ID() string {
return s.sid
}
// Release releases resource and save data to provider.
-func (s *LedisSessionStore) Release() error {
+func (s *LedisStore) Release() error {
data, err := session.EncodeGob(s.data)
if err != nil {
return err
}
- if err = c.Set([]byte(s.sid), data); err != nil {
+
+ if err = s.c.Set([]byte(s.sid), data); err != nil {
return err
}
- _, err = c.Expire([]byte(s.sid), s.maxlifetime)
+ _, err = s.c.Expire([]byte(s.sid), s.expire)
return err
}
// Flush deletes all session data.
-func (s *LedisSessionStore) Flush() error {
+func (s *LedisStore) Flush() error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -89,30 +103,54 @@ func (s *LedisSessionStore) Flush() error {
// LedisProvider represents a ledis session provider implementation.
type LedisProvider struct {
- maxlifetime int64
- savePath string
+ c *ledis.DB
+ expire int64
}
-// Init initializes memory session provider.
-func (p *LedisProvider) Init(maxlifetime int64, savePath string) error {
- p.maxlifetime = maxlifetime
- p.savePath = savePath
- cfg := new(config.Config)
- cfg.DataDir = p.savePath
- var err error
- nowLedis, err := ledis.Open(cfg)
- c, err = nowLedis.Select(0)
+// Init initializes ledis session provider.
+// configs: data_dir=./app.db,db=0
+func (p *LedisProvider) Init(expire int64, configs string) error {
+ p.expire = expire
+
+ cfg, err := ini.Load([]byte(strings.Replace(configs, ",", "\n", -1)))
if err != nil {
- println(err)
- return nil
+ return err
}
- return nil
+
+ db := 0
+ opt := new(config.Config)
+ for k, v := range cfg.Section("").KeysHash() {
+ switch k {
+ case "data_dir":
+ opt.DataDir = v
+ case "db":
+ db = com.StrTo(v).MustInt()
+ default:
+ return fmt.Errorf("session/ledis: unsupported option '%s'", k)
+ }
+ }
+
+ l, err := ledis.Open(opt)
+ if err != nil {
+ return fmt.Errorf("session/ledis: error opening db: %v", err)
+ }
+ p.c, err = l.Select(db)
+ return err
}
// Read returns raw session store by session ID.
func (p *LedisProvider) Read(sid string) (session.RawStore, error) {
- kvs, err := c.Get([]byte(sid))
+ if !p.Exist(sid) {
+ if err := p.c.Set([]byte(sid), []byte("")); err != nil {
+ return nil, err
+ }
+ }
+
var kv map[interface{}]interface{}
+ kvs, err := p.c.Get([]byte(sid))
+ if err != nil {
+ return nil, err
+ }
if len(kvs) == 0 {
kv = make(map[interface{}]interface{})
} else {
@@ -121,41 +159,40 @@ func (p *LedisProvider) Read(sid string) (session.RawStore, error) {
return nil, err
}
}
- ls := &LedisSessionStore{sid: sid, data: kv, maxlifetime: p.maxlifetime}
- return ls, nil
+
+ return NewLedisStore(p.c, sid, p.expire, kv), nil
}
// Exist returns true if session with given ID exists.
func (p *LedisProvider) Exist(sid string) bool {
- count, _ := c.Exists([]byte(sid))
- if count == 0 {
- return false
- } else {
- return true
- }
+ count, err := p.c.Exists([]byte(sid))
+ return err == nil && count > 0
}
// Destory deletes a session by session ID.
func (p *LedisProvider) Destory(sid string) error {
- _, err := c.Del([]byte(sid))
+ _, err := p.c.Del([]byte(sid))
return err
}
// Regenerate regenerates a session store from old session ID to new one.
-func (p *LedisProvider) Regenerate(oldsid, sid string) (session.RawStore, error) {
- count, _ := c.Exists([]byte(sid))
- if count == 0 {
- // oldsid doesn't exists, set the new sid directly
- // ignore error here, since if it return error
- // the existed value will be 0
- c.Set([]byte(sid), []byte(""))
- c.Expire([]byte(sid), p.maxlifetime)
- } else {
- data, _ := c.Get([]byte(oldsid))
- c.Set([]byte(sid), data)
- c.Expire([]byte(sid), p.maxlifetime)
+func (p *LedisProvider) Regenerate(oldsid, sid string) (_ session.RawStore, err error) {
+ if p.Exist(sid) {
+ return nil, fmt.Errorf("new sid '%s' already exists", sid)
}
- kvs, err := c.Get([]byte(sid))
+
+ kvs := make([]byte, 0)
+ if p.Exist(oldsid) {
+ if kvs, err = p.c.Get([]byte(oldsid)); err != nil {
+ return nil, err
+ } else if _, err = p.c.Del([]byte(oldsid)); err != nil {
+ return nil, err
+ }
+ }
+ if err = p.c.SetEX([]byte(sid), p.expire, kvs); err != nil {
+ return nil, err
+ }
+
var kv map[interface{}]interface{}
if len(kvs) == 0 {
kv = make(map[interface{}]interface{})
@@ -165,18 +202,20 @@ func (p *LedisProvider) Regenerate(oldsid, sid string) (session.RawStore, error)
return nil, err
}
}
- ls := &LedisSessionStore{sid: sid, data: kv, maxlifetime: p.maxlifetime}
- return ls, nil
+
+ return NewLedisStore(p.c, sid, p.expire, kv), nil
}
// Count counts and returns number of sessions.
func (p *LedisProvider) Count() int {
- // FIXME
- return 0
+ // FIXME: how come this library does not have DbSize() method?
+ return -1
}
// GC calls GC to clean expired sessions.
-func (p *LedisProvider) GC() {}
+func (p *LedisProvider) GC() {
+ // FIXME: wtf???
+}
func init() {
session.Register("ledis", &LedisProvider{})
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/ledis/ledis.goconvey b/Godeps/_workspace/src/github.com/macaron-contrib/session/ledis/ledis.goconvey
new file mode 100644
index 00000000000..8485e986e45
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/ledis/ledis.goconvey
@@ -0,0 +1 @@
+ignore
\ No newline at end of file
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/ledis/ledis_test.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/ledis/ledis_test.go
new file mode 100644
index 00000000000..dac42a364b7
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/ledis/ledis_test.go
@@ -0,0 +1,105 @@
+// Copyright 2014 Unknwon
+//
+// Licensed under the Apache License, Version 2.0 (the "License"): you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+package session
+
+import (
+ "net/http"
+ "net/http/httptest"
+ "testing"
+
+ "github.com/Unknwon/macaron"
+ . "github.com/smartystreets/goconvey/convey"
+
+ "github.com/macaron-contrib/session"
+)
+
+func Test_LedisProvider(t *testing.T) {
+ Convey("Test ledis session provider", t, func() {
+ opt := session.Options{
+ Provider: "ledis",
+ ProviderConfig: "data_dir=./tmp.db",
+ }
+
+ Convey("Basic operation", func() {
+ m := macaron.New()
+ m.Use(session.Sessioner(opt))
+
+ m.Get("/", func(ctx *macaron.Context, sess session.Store) {
+ sess.Set("uname", "unknwon")
+ })
+ m.Get("/reg", func(ctx *macaron.Context, sess session.Store) {
+ raw, err := sess.RegenerateId(ctx)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+
+ uname := raw.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+ })
+ m.Get("/get", func(ctx *macaron.Context, sess session.Store) {
+ sid := sess.ID()
+ So(sid, ShouldNotBeEmpty)
+
+ raw, err := sess.Read(sid)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+
+ uname := sess.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+
+ So(sess.Delete("uname"), ShouldBeNil)
+ So(sess.Get("uname"), ShouldBeNil)
+
+ So(sess.Destory(ctx), ShouldBeNil)
+ })
+
+ resp := httptest.NewRecorder()
+ req, err := http.NewRequest("GET", "/", nil)
+ So(err, ShouldBeNil)
+ m.ServeHTTP(resp, req)
+
+ cookie := resp.Header().Get("Set-Cookie")
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/reg", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", cookie)
+ m.ServeHTTP(resp, req)
+
+ cookie = resp.Header().Get("Set-Cookie")
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/get", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", cookie)
+ m.ServeHTTP(resp, req)
+
+ Convey("Regenrate empty session", func() {
+ m.Get("/empty", func(ctx *macaron.Context, sess session.Store) {
+ raw, err := sess.RegenerateId(ctx)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+ })
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/empty", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", "MacaronSession=ad2c7e3cbecfcf486; Path=/;")
+ m.ServeHTTP(resp, req)
+ })
+ })
+ })
+}
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/memcache/memcache.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/memcache/memcache.go
index e06895202f0..b4fcdde62bd 100644
--- a/Godeps/_workspace/src/github.com/macaron-contrib/session/memcache/memcache.go
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/memcache/memcache.go
@@ -16,6 +16,7 @@
package session
import (
+ "fmt"
"strings"
"sync"
@@ -24,20 +25,35 @@ import (
"github.com/macaron-contrib/session"
)
-var (
- client *memcache.Client
-)
+// MemcacheStore represents a memcache session store implementation.
+type MemcacheStore struct {
+ c *memcache.Client
+ sid string
+ expire int32
+ lock sync.RWMutex
+ data map[interface{}]interface{}
+}
-// MemcacheSessionStore represents a memcache session store implementation.
-type MemcacheSessionStore struct {
- sid string
- lock sync.RWMutex
- data map[interface{}]interface{}
- maxlifetime int64
+// NewMemcacheStore creates and returns a memcache session store.
+func NewMemcacheStore(c *memcache.Client, sid string, expire int32, kv map[interface{}]interface{}) *MemcacheStore {
+ return &MemcacheStore{
+ c: c,
+ sid: sid,
+ expire: expire,
+ data: kv,
+ }
+}
+
+func NewItem(sid string, data []byte, expire int32) *memcache.Item {
+ return &memcache.Item{
+ Key: sid,
+ Value: data,
+ Expiration: expire,
+ }
}
// Set sets value to given key in session.
-func (s *MemcacheSessionStore) Set(key, val interface{}) error {
+func (s *MemcacheStore) Set(key, val interface{}) error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -46,7 +62,7 @@ func (s *MemcacheSessionStore) Set(key, val interface{}) error {
}
// Get gets value by given key in session.
-func (s *MemcacheSessionStore) Get(key interface{}) interface{} {
+func (s *MemcacheStore) Get(key interface{}) interface{} {
s.lock.RLock()
defer s.lock.RUnlock()
@@ -54,7 +70,7 @@ func (s *MemcacheSessionStore) Get(key interface{}) interface{} {
}
// Delete delete a key from session.
-func (s *MemcacheSessionStore) Delete(key interface{}) error {
+func (s *MemcacheStore) Delete(key interface{}) error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -63,26 +79,22 @@ func (s *MemcacheSessionStore) Delete(key interface{}) error {
}
// ID returns current session ID.
-func (s *MemcacheSessionStore) ID() string {
+func (s *MemcacheStore) ID() string {
return s.sid
}
// Release releases resource and save data to provider.
-func (s *MemcacheSessionStore) Release() error {
+func (s *MemcacheStore) Release() error {
data, err := session.EncodeGob(s.data)
if err != nil {
return err
}
- return client.Set(&memcache.Item{
- Key: s.sid,
- Value: data,
- Expiration: int32(s.maxlifetime),
- })
+ return s.c.Set(NewItem(s.sid, data, s.expire))
}
// Flush deletes all session data.
-func (s *MemcacheSessionStore) Flush() error {
+func (s *MemcacheStore) Flush() error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -90,41 +102,75 @@ func (s *MemcacheSessionStore) Flush() error {
return nil
}
-// MemProvider represents a memcache session provider implementation.
-type MemProvider struct {
- maxlifetime int64
- conninfo []string
- poolsize int
- password string
+// MemcacheProvider represents a memcache session provider implementation.
+type MemcacheProvider struct {
+ c *memcache.Client
+ expire int32
}
-// Init initializes memory session provider.
-// connStrs can be multiple connection strings separate by ;
-// e.g. 127.0.0.1:9090
-func (p *MemProvider) Init(maxlifetime int64, connStrs string) error {
- p.maxlifetime = maxlifetime
- p.conninfo = strings.Split(connStrs, ";")
- client = memcache.New(p.conninfo...)
- return nil
-}
-
-func (p *MemProvider) connectInit() error {
- client = memcache.New(p.conninfo...)
+// Init initializes memcache session provider.
+// connStrs: 127.0.0.1:9090;127.0.0.1:9091
+func (p *MemcacheProvider) Init(expire int64, connStrs string) error {
+ p.expire = int32(expire)
+ p.c = memcache.New(strings.Split(connStrs, ";")...)
return nil
}
// Read returns raw session store by session ID.
-func (p *MemProvider) Read(sid string) (session.RawStore, error) {
- if client == nil {
- if err := p.connectInit(); err != nil {
+func (p *MemcacheProvider) Read(sid string) (session.RawStore, error) {
+ if !p.Exist(sid) {
+ if err := p.c.Set(NewItem(sid, []byte(""), p.expire)); err != nil {
return nil, err
}
}
- item, err := client.Get(sid)
+ var kv map[interface{}]interface{}
+ item, err := p.c.Get(sid)
if err != nil {
return nil, err
}
+ if len(item.Value) == 0 {
+ kv = make(map[interface{}]interface{})
+ } else {
+ kv, err = session.DecodeGob(item.Value)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return NewMemcacheStore(p.c, sid, p.expire, kv), nil
+}
+
+// Exist returns true if session with given ID exists.
+func (p *MemcacheProvider) Exist(sid string) bool {
+ _, err := p.c.Get(sid)
+ return err == nil
+}
+
+// Destory deletes a session by session ID.
+func (p *MemcacheProvider) Destory(sid string) error {
+ return p.c.Delete(sid)
+}
+
+// Regenerate regenerates a session store from old session ID to new one.
+func (p *MemcacheProvider) Regenerate(oldsid, sid string) (_ session.RawStore, err error) {
+ if p.Exist(sid) {
+ return nil, fmt.Errorf("new sid '%s' already exists", sid)
+ }
+
+ item := NewItem(sid, []byte(""), p.expire)
+ if p.Exist(oldsid) {
+ item, err = p.c.Get(oldsid)
+ if err != nil {
+ return nil, err
+ } else if err = p.c.Delete(oldsid); err != nil {
+ return nil, err
+ }
+ item.Key = sid
+ }
+ if err = p.c.Set(item); err != nil {
+ return nil, err
+ }
var kv map[interface{}]interface{}
if len(item.Value) == 0 {
@@ -136,86 +182,18 @@ func (p *MemProvider) Read(sid string) (session.RawStore, error) {
}
}
- rs := &MemcacheSessionStore{sid: sid, data: kv, maxlifetime: p.maxlifetime}
- return rs, nil
-}
-
-// Exist returns true if session with given ID exists.
-func (p *MemProvider) Exist(sid string) bool {
- if client == nil {
- if err := p.connectInit(); err != nil {
- return false
- }
- }
-
- if item, err := client.Get(sid); err != nil || len(item.Value) == 0 {
- return false
- } else {
- return true
- }
-}
-
-// Destory deletes a session by session ID.
-func (p *MemProvider) Destory(sid string) error {
- if client == nil {
- if err := p.connectInit(); err != nil {
- return err
- }
- }
-
- return client.Delete(sid)
-}
-
-// Regenerate regenerates a session store from old session ID to new one.
-func (p *MemProvider) Regenerate(oldsid, sid string) (session.RawStore, error) {
- if client == nil {
- if err := p.connectInit(); err != nil {
- return nil, err
- }
- }
-
- var contain []byte
- if item, err := client.Get(sid); err != nil || len(item.Value) == 0 {
- // oldsid doesn't exists, set the new sid directly
- // ignore error here, since if it return error
- // the existed value will be 0
- item.Key = sid
- item.Value = []byte("")
- item.Expiration = int32(p.maxlifetime)
- client.Set(item)
- } else {
- client.Delete(oldsid)
- item.Key = sid
- item.Value = item.Value
- item.Expiration = int32(p.maxlifetime)
- client.Set(item)
- contain = item.Value
- }
-
- var kv map[interface{}]interface{}
- if len(contain) == 0 {
- kv = make(map[interface{}]interface{})
- } else {
- var err error
- kv, err = session.DecodeGob(contain)
- if err != nil {
- return nil, err
- }
- }
-
- rs := &MemcacheSessionStore{sid: sid, data: kv, maxlifetime: p.maxlifetime}
- return rs, nil
+ return NewMemcacheStore(p.c, sid, p.expire, kv), nil
}
// Count counts and returns number of sessions.
-func (p *MemProvider) Count() int {
- // FIXME
- return 0
+func (p *MemcacheProvider) Count() int {
+ // FIXME: how come this library does not have Stats method?
+ return -1
}
// GC calls GC to clean expired sessions.
-func (p *MemProvider) GC() {}
+func (p *MemcacheProvider) GC() {}
func init() {
- session.Register("memcache", &MemProvider{})
+ session.Register("memcache", &MemcacheProvider{})
}
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/memcache/memcache.goconvey b/Godeps/_workspace/src/github.com/macaron-contrib/session/memcache/memcache.goconvey
new file mode 100644
index 00000000000..8485e986e45
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/memcache/memcache.goconvey
@@ -0,0 +1 @@
+ignore
\ No newline at end of file
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/memcache/memcache_test.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/memcache/memcache_test.go
new file mode 100644
index 00000000000..beb272d52b1
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/memcache/memcache_test.go
@@ -0,0 +1,107 @@
+// Copyright 2014 Unknwon
+//
+// Licensed under the Apache License, Version 2.0 (the "License"): you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+package session
+
+import (
+ "net/http"
+ "net/http/httptest"
+ "testing"
+
+ "github.com/Unknwon/macaron"
+ . "github.com/smartystreets/goconvey/convey"
+
+ "github.com/macaron-contrib/session"
+)
+
+func Test_MemcacheProvider(t *testing.T) {
+ Convey("Test memcache session provider", t, func() {
+ opt := session.Options{
+ Provider: "memcache",
+ ProviderConfig: "127.0.0.1:9090",
+ }
+
+ Convey("Basic operation", func() {
+ m := macaron.New()
+ m.Use(session.Sessioner(opt))
+
+ m.Get("/", func(ctx *macaron.Context, sess session.Store) {
+ sess.Set("uname", "unknwon")
+ })
+ m.Get("/reg", func(ctx *macaron.Context, sess session.Store) {
+ raw, err := sess.RegenerateId(ctx)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+
+ uname := raw.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+ })
+ m.Get("/get", func(ctx *macaron.Context, sess session.Store) {
+ sid := sess.ID()
+ So(sid, ShouldNotBeEmpty)
+
+ raw, err := sess.Read(sid)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+
+ uname := sess.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+
+ So(sess.Delete("uname"), ShouldBeNil)
+ So(sess.Get("uname"), ShouldBeNil)
+
+ So(sess.Destory(ctx), ShouldBeNil)
+ })
+
+ resp := httptest.NewRecorder()
+ req, err := http.NewRequest("GET", "/", nil)
+ So(err, ShouldBeNil)
+ m.ServeHTTP(resp, req)
+
+ cookie := resp.Header().Get("Set-Cookie")
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/reg", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", cookie)
+ m.ServeHTTP(resp, req)
+
+ cookie = resp.Header().Get("Set-Cookie")
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/get", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", cookie)
+ m.ServeHTTP(resp, req)
+ })
+
+ Convey("Regenrate empty session", func() {
+ m := macaron.New()
+ m.Use(session.Sessioner(opt))
+ m.Get("/", func(ctx *macaron.Context, sess session.Store) {
+ raw, err := sess.RegenerateId(ctx)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+ })
+
+ resp := httptest.NewRecorder()
+ req, err := http.NewRequest("GET", "/", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", "MacaronSession=ad2c7e3cbecfcf486; Path=/;")
+ m.ServeHTTP(resp, req)
+ })
+ })
+}
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/memory.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/memory.go
index 040b8e697dc..e717635b951 100644
--- a/Godeps/_workspace/src/github.com/macaron-contrib/session/memory.go
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/memory.go
@@ -22,17 +22,17 @@ import (
"time"
)
-// MemSessionStore represents a in-memory session store implementation.
-type MemSessionStore struct {
+// MemStore represents a in-memory session store implementation.
+type MemStore struct {
sid string
lock sync.RWMutex
data map[interface{}]interface{}
lastAccess time.Time
}
-// NewMemSessionStore creates and returns a memory session store.
-func NewMemSessionStore(sid string) *MemSessionStore {
- return &MemSessionStore{
+// NewMemStore creates and returns a memory session store.
+func NewMemStore(sid string) *MemStore {
+ return &MemStore{
sid: sid,
data: make(map[interface{}]interface{}),
lastAccess: time.Now(),
@@ -40,7 +40,7 @@ func NewMemSessionStore(sid string) *MemSessionStore {
}
// Set sets value to given key in session.
-func (s *MemSessionStore) Set(key, val interface{}) error {
+func (s *MemStore) Set(key, val interface{}) error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -49,15 +49,15 @@ func (s *MemSessionStore) Set(key, val interface{}) error {
}
// Get gets value by given key in session.
-func (s *MemSessionStore) Get(key interface{}) interface{} {
+func (s *MemStore) Get(key interface{}) interface{} {
s.lock.RLock()
defer s.lock.RUnlock()
return s.data[key]
}
-// Delete delete a key from session.
-func (s *MemSessionStore) Delete(key interface{}) error {
+// Delete deletes a key from session.
+func (s *MemStore) Delete(key interface{}) error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -66,17 +66,17 @@ func (s *MemSessionStore) Delete(key interface{}) error {
}
// ID returns current session ID.
-func (s *MemSessionStore) ID() string {
+func (s *MemStore) ID() string {
return s.sid
}
// Release releases resource and save data to provider.
-func (_ *MemSessionStore) Release() error {
+func (_ *MemStore) Release() error {
return nil
}
// Flush deletes all session data.
-func (s *MemSessionStore) Flush() error {
+func (s *MemStore) Flush() error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -105,7 +105,7 @@ func (p *MemProvider) update(sid string) error {
defer p.lock.Unlock()
if e, ok := p.data[sid]; ok {
- e.Value.(*MemSessionStore).lastAccess = time.Now()
+ e.Value.(*MemStore).lastAccess = time.Now()
p.list.MoveToFront(e)
return nil
}
@@ -122,14 +122,14 @@ func (p *MemProvider) Read(sid string) (_ RawStore, err error) {
if err = p.update(sid); err != nil {
return nil, err
}
- return e.Value.(*MemSessionStore), nil
+ return e.Value.(*MemStore), nil
}
// Create a new session.
p.lock.Lock()
defer p.lock.Unlock()
- s := NewMemSessionStore(sid)
+ s := NewMemStore(sid)
p.data[sid] = p.list.PushBack(s)
return s, nil
}
@@ -173,7 +173,7 @@ func (p *MemProvider) Regenerate(oldsid, sid string) (RawStore, error) {
return nil, err
}
- s.(*MemSessionStore).sid = sid
+ s.(*MemStore).sid = sid
p.data[sid] = p.list.PushBack(s)
return s, nil
}
@@ -193,11 +193,11 @@ func (p *MemProvider) GC() {
break
}
- if (e.Value.(*MemSessionStore).lastAccess.Unix() + p.maxLifetime) < time.Now().Unix() {
+ if (e.Value.(*MemStore).lastAccess.Unix() + p.maxLifetime) < time.Now().Unix() {
p.lock.RUnlock()
p.lock.Lock()
p.list.Remove(e)
- delete(p.data, e.Value.(*MemSessionStore).sid)
+ delete(p.data, e.Value.(*MemStore).sid)
p.lock.Unlock()
p.lock.RLock()
} else {
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/mysql/mysql.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/mysql/mysql.go
index 908de4f1b52..7997e03c0d8 100644
--- a/Godeps/_workspace/src/github.com/macaron-contrib/session/mysql/mysql.go
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/mysql/mysql.go
@@ -17,6 +17,8 @@ package session
import (
"database/sql"
+ "fmt"
+ "log"
"sync"
"time"
@@ -25,16 +27,25 @@ import (
"github.com/macaron-contrib/session"
)
-// MysqlSessionStore represents a mysql session store implementation.
-type MysqlSessionStore struct {
+// MysqlStore represents a mysql session store implementation.
+type MysqlStore struct {
c *sql.DB
sid string
lock sync.RWMutex
data map[interface{}]interface{}
}
+// NewMysqlStore creates and returns a mysql session store.
+func NewMysqlStore(c *sql.DB, sid string, kv map[interface{}]interface{}) *MysqlStore {
+ return &MysqlStore{
+ c: c,
+ sid: sid,
+ data: kv,
+ }
+}
+
// Set sets value to given key in session.
-func (s *MysqlSessionStore) Set(key, val interface{}) error {
+func (s *MysqlStore) Set(key, val interface{}) error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -43,7 +54,7 @@ func (s *MysqlSessionStore) Set(key, val interface{}) error {
}
// Get gets value by given key in session.
-func (s *MysqlSessionStore) Get(key interface{}) interface{} {
+func (s *MysqlStore) Get(key interface{}) interface{} {
s.lock.RLock()
defer s.lock.RUnlock()
@@ -51,7 +62,7 @@ func (s *MysqlSessionStore) Get(key interface{}) interface{} {
}
// Delete delete a key from session.
-func (s *MysqlSessionStore) Delete(key interface{}) error {
+func (s *MysqlStore) Delete(key interface{}) error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -60,24 +71,24 @@ func (s *MysqlSessionStore) Delete(key interface{}) error {
}
// ID returns current session ID.
-func (s *MysqlSessionStore) ID() string {
+func (s *MysqlStore) ID() string {
return s.sid
}
// Release releases resource and save data to provider.
-func (s *MysqlSessionStore) Release() error {
- defer s.c.Close()
+func (s *MysqlStore) Release() error {
data, err := session.EncodeGob(s.data)
if err != nil {
return err
}
- _, err = s.c.Exec("UPDATE session set `session_data`=?, `session_expiry`=? where session_key=?",
+
+ _, err = s.c.Exec("UPDATE session SET data=?, expiry=? WHERE `key`=?",
data, time.Now().Unix(), s.sid)
return err
}
// Flush deletes all session data.
-func (s *MysqlSessionStore) Flush() error {
+func (s *MysqlStore) Flush() error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -87,113 +98,96 @@ func (s *MysqlSessionStore) Flush() error {
// MysqlProvider represents a mysql session provider implementation.
type MysqlProvider struct {
- maxlifetime int64
- connStr string
+ c *sql.DB
+ expire int64
}
-func (p *MysqlProvider) connectInit() *sql.DB {
- db, e := sql.Open("mysql", p.connStr)
- if e != nil {
- return nil
+// Init initializes mysql session provider.
+// connStr: username:password@protocol(address)/dbname?param=value
+func (p *MysqlProvider) Init(expire int64, connStr string) (err error) {
+ p.expire = expire
+
+ p.c, err = sql.Open("mysql", connStr)
+ if err != nil {
+ return err
}
- return db
-}
-
-// Init initializes memory session provider.
-func (p *MysqlProvider) Init(maxlifetime int64, connStr string) error {
- p.maxlifetime = maxlifetime
- p.connStr = connStr
- return nil
+ return p.c.Ping()
}
// Read returns raw session store by session ID.
func (p *MysqlProvider) Read(sid string) (session.RawStore, error) {
- c := p.connectInit()
- row := c.QueryRow("select session_data from session where session_key=?", sid)
- var sessiondata []byte
- err := row.Scan(&sessiondata)
+ var data []byte
+ err := p.c.QueryRow("SELECT data FROM session WHERE `key`=?", sid).Scan(&data)
if err == sql.ErrNoRows {
- c.Exec("insert into session(`session_key`,`session_data`,`session_expiry`) values(?,?,?)",
+ _, err = p.c.Exec("INSERT INTO session(`key`,data,expiry) VALUES(?,?,?)",
sid, "", time.Now().Unix())
}
+ if err != nil {
+ return nil, err
+ }
+
var kv map[interface{}]interface{}
- if len(sessiondata) == 0 {
+ if len(data) == 0 {
kv = make(map[interface{}]interface{})
} else {
- kv, err = session.DecodeGob(sessiondata)
+ kv, err = session.DecodeGob(data)
if err != nil {
return nil, err
}
}
- rs := &MysqlSessionStore{c: c, sid: sid, data: kv}
- return rs, nil
+
+ return NewMysqlStore(p.c, sid, kv), nil
}
// Exist returns true if session with given ID exists.
func (p *MysqlProvider) Exist(sid string) bool {
- c := p.connectInit()
- defer c.Close()
-
- row := c.QueryRow("select session_data from session where session_key=?", sid)
- var sessiondata []byte
- err := row.Scan(&sessiondata)
- if err == sql.ErrNoRows {
- return false
- } else {
- return true
+ var data []byte
+ err := p.c.QueryRow("SELECT data FROM session WHERE `key`=?", sid).Scan(&data)
+ if err != nil && err != sql.ErrNoRows {
+ panic("session/mysql: error checking existence: " + err.Error())
}
+ return err != sql.ErrNoRows
}
// Destory deletes a session by session ID.
-func (p *MysqlProvider) Destory(sid string) (err error) {
- c := p.connectInit()
- if _, err = c.Exec("DELETE FROM session where session_key=?", sid); err != nil {
- return err
- }
- return c.Close()
+func (p *MysqlProvider) Destory(sid string) error {
+ _, err := p.c.Exec("DELETE FROM session WHERE `key`=?", sid)
+ return err
}
// Regenerate regenerates a session store from old session ID to new one.
-func (p *MysqlProvider) Regenerate(oldsid, sid string) (session.RawStore, error) {
- c := p.connectInit()
- row := c.QueryRow("select session_data from session where session_key=?", oldsid)
- var sessiondata []byte
- err := row.Scan(&sessiondata)
- if err == sql.ErrNoRows {
- c.Exec("insert into session(`session_key`,`session_data`,`session_expiry`) values(?,?,?)", oldsid, "", time.Now().Unix())
+func (p *MysqlProvider) Regenerate(oldsid, sid string) (_ session.RawStore, err error) {
+ if p.Exist(sid) {
+ return nil, fmt.Errorf("new sid '%s' already exists", sid)
}
- c.Exec("update session set `session_key`=? where session_key=?", sid, oldsid)
- var kv map[interface{}]interface{}
- if len(sessiondata) == 0 {
- kv = make(map[interface{}]interface{})
- } else {
- kv, err = session.DecodeGob(sessiondata)
- if err != nil {
+
+ if !p.Exist(oldsid) {
+ if _, err = p.c.Exec("INSERT INTO session(`key`,data,expiry) VALUES(?,?,?)",
+ oldsid, "", time.Now().Unix()); err != nil {
return nil, err
}
}
- rs := &MysqlSessionStore{c: c, sid: sid, data: kv}
- return rs, nil
+
+ if _, err = p.c.Exec("UPDATE session SET `key`=? WHERE `key`=?", sid, oldsid); err != nil {
+ return nil, err
+ }
+
+ return p.Read(sid)
}
// Count counts and returns number of sessions.
-func (p *MysqlProvider) Count() int {
- c := p.connectInit()
- defer c.Close()
-
- var total int
- err := c.QueryRow("SELECT count(*) as num from session").Scan(&total)
- if err != nil {
- return 0
+func (p *MysqlProvider) Count() (total int) {
+ if err := p.c.QueryRow("SELECT COUNT(*) AS NUM FROM session").Scan(&total); err != nil {
+ panic("session/mysql: error counting records: " + err.Error())
}
return total
}
// GC calls GC to clean expired sessions.
-func (mp *MysqlProvider) GC() {
- c := mp.connectInit()
- c.Exec("DELETE from session where session_expiry < ?", time.Now().Unix()-mp.maxlifetime)
- c.Close()
+func (p *MysqlProvider) GC() {
+ if _, err := p.c.Exec("DELETE FROM session WHERE UNIX_TIMESTAMP(NOW()) - expiry > ?", p.expire); err != nil {
+ log.Printf("session/mysql: error garbage collecting: %v", err)
+ }
}
func init() {
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/mysql/mysql.goconvey b/Godeps/_workspace/src/github.com/macaron-contrib/session/mysql/mysql.goconvey
new file mode 100644
index 00000000000..8485e986e45
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/mysql/mysql.goconvey
@@ -0,0 +1 @@
+ignore
\ No newline at end of file
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/mysql/mysql_test.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/mysql/mysql_test.go
new file mode 100644
index 00000000000..15b3996a228
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/mysql/mysql_test.go
@@ -0,0 +1,138 @@
+// Copyright 2014 Unknwon
+//
+// Licensed under the Apache License, Version 2.0 (the "License"): you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+package session
+
+import (
+ "net/http"
+ "net/http/httptest"
+ "testing"
+ "time"
+
+ "github.com/Unknwon/macaron"
+ . "github.com/smartystreets/goconvey/convey"
+
+ "github.com/macaron-contrib/session"
+)
+
+func Test_MysqlProvider(t *testing.T) {
+ Convey("Test mysql session provider", t, func() {
+ opt := session.Options{
+ Provider: "mysql",
+ ProviderConfig: "root:@tcp(localhost:3306)/macaron?charset=utf8",
+ }
+
+ Convey("Basic operation", func() {
+ m := macaron.New()
+ m.Use(session.Sessioner(opt))
+
+ m.Get("/", func(ctx *macaron.Context, sess session.Store) {
+ sess.Set("uname", "unknwon")
+ })
+ m.Get("/reg", func(ctx *macaron.Context, sess session.Store) {
+ raw, err := sess.RegenerateId(ctx)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+
+ uname := raw.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+ })
+ m.Get("/get", func(ctx *macaron.Context, sess session.Store) {
+ sid := sess.ID()
+ So(sid, ShouldNotBeEmpty)
+
+ raw, err := sess.Read(sid)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+ So(raw.Release(), ShouldBeNil)
+
+ uname := sess.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+
+ So(sess.Delete("uname"), ShouldBeNil)
+ So(sess.Get("uname"), ShouldBeNil)
+
+ So(sess.Destory(ctx), ShouldBeNil)
+ })
+
+ resp := httptest.NewRecorder()
+ req, err := http.NewRequest("GET", "/", nil)
+ So(err, ShouldBeNil)
+ m.ServeHTTP(resp, req)
+
+ cookie := resp.Header().Get("Set-Cookie")
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/reg", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", cookie)
+ m.ServeHTTP(resp, req)
+
+ cookie = resp.Header().Get("Set-Cookie")
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/get", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", cookie)
+ m.ServeHTTP(resp, req)
+ })
+
+ Convey("Regenrate empty session", func() {
+ m := macaron.New()
+ m.Use(session.Sessioner(opt))
+ m.Get("/", func(ctx *macaron.Context, sess session.Store) {
+ raw, err := sess.RegenerateId(ctx)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+
+ So(sess.Destory(ctx), ShouldBeNil)
+ })
+
+ resp := httptest.NewRecorder()
+ req, err := http.NewRequest("GET", "/", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", "MacaronSession=ad2c7e3cbecfcf48; Path=/;")
+ m.ServeHTTP(resp, req)
+ })
+
+ Convey("GC session", func() {
+ m := macaron.New()
+ opt2 := opt
+ opt2.Gclifetime = 1
+ m.Use(session.Sessioner(opt2))
+
+ m.Get("/", func(sess session.Store) {
+ sess.Set("uname", "unknwon")
+ So(sess.ID(), ShouldNotBeEmpty)
+ uname := sess.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+
+ So(sess.Flush(), ShouldBeNil)
+ So(sess.Get("uname"), ShouldBeNil)
+
+ time.Sleep(2 * time.Second)
+ sess.GC()
+ So(sess.Count(), ShouldEqual, 0)
+ })
+
+ resp := httptest.NewRecorder()
+ req, err := http.NewRequest("GET", "/", nil)
+ So(err, ShouldBeNil)
+ m.ServeHTTP(resp, req)
+ })
+ })
+}
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/nodb/nodb.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/nodb/nodb.go
new file mode 100644
index 00000000000..7f017bf0457
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/nodb/nodb.go
@@ -0,0 +1,203 @@
+// Copyright 2015 Unknwon
+//
+// Licensed under the Apache License, Version 2.0 (the "License"): you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+package session
+
+import (
+ "fmt"
+ "sync"
+
+ "github.com/lunny/nodb"
+ "github.com/lunny/nodb/config"
+
+ "github.com/macaron-contrib/session"
+)
+
+// NodbStore represents a nodb session store implementation.
+type NodbStore struct {
+ c *nodb.DB
+ sid string
+ expire int64
+ lock sync.RWMutex
+ data map[interface{}]interface{}
+}
+
+// NewNodbStore creates and returns a ledis session store.
+func NewNodbStore(c *nodb.DB, sid string, expire int64, kv map[interface{}]interface{}) *NodbStore {
+ return &NodbStore{
+ c: c,
+ expire: expire,
+ sid: sid,
+ data: kv,
+ }
+}
+
+// Set sets value to given key in session.
+func (s *NodbStore) Set(key, val interface{}) error {
+ s.lock.Lock()
+ defer s.lock.Unlock()
+
+ s.data[key] = val
+ return nil
+}
+
+// Get gets value by given key in session.
+func (s *NodbStore) Get(key interface{}) interface{} {
+ s.lock.RLock()
+ defer s.lock.RUnlock()
+
+ return s.data[key]
+}
+
+// Delete delete a key from session.
+func (s *NodbStore) Delete(key interface{}) error {
+ s.lock.Lock()
+ defer s.lock.Unlock()
+
+ delete(s.data, key)
+ return nil
+}
+
+// ID returns current session ID.
+func (s *NodbStore) ID() string {
+ return s.sid
+}
+
+// Release releases resource and save data to provider.
+func (s *NodbStore) Release() error {
+ data, err := session.EncodeGob(s.data)
+ if err != nil {
+ return err
+ }
+
+ if err = s.c.Set([]byte(s.sid), data); err != nil {
+ return err
+ }
+ _, err = s.c.Expire([]byte(s.sid), s.expire)
+ return err
+}
+
+// Flush deletes all session data.
+func (s *NodbStore) Flush() error {
+ s.lock.Lock()
+ defer s.lock.Unlock()
+
+ s.data = make(map[interface{}]interface{})
+ return nil
+}
+
+// NodbProvider represents a ledis session provider implementation.
+type NodbProvider struct {
+ c *nodb.DB
+ expire int64
+}
+
+// Init initializes nodb session provider.
+func (p *NodbProvider) Init(expire int64, configs string) error {
+ p.expire = expire
+
+ cfg := new(config.Config)
+ cfg.DataDir = configs
+ dbs, err := nodb.Open(cfg)
+ if err != nil {
+ return fmt.Errorf("session/nodb: error opening db: %v", err)
+ }
+
+ p.c, err = dbs.Select(0)
+ return err
+}
+
+// Read returns raw session store by session ID.
+func (p *NodbProvider) Read(sid string) (session.RawStore, error) {
+ if !p.Exist(sid) {
+ if err := p.c.Set([]byte(sid), []byte("")); err != nil {
+ return nil, err
+ }
+ }
+
+ var kv map[interface{}]interface{}
+ kvs, err := p.c.Get([]byte(sid))
+ if err != nil {
+ return nil, err
+ }
+ if len(kvs) == 0 {
+ kv = make(map[interface{}]interface{})
+ } else {
+ kv, err = session.DecodeGob(kvs)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return NewNodbStore(p.c, sid, p.expire, kv), nil
+}
+
+// Exist returns true if session with given ID exists.
+func (p *NodbProvider) Exist(sid string) bool {
+ count, err := p.c.Exists([]byte(sid))
+ return err == nil && count > 0
+}
+
+// Destory deletes a session by session ID.
+func (p *NodbProvider) Destory(sid string) error {
+ _, err := p.c.Del([]byte(sid))
+ return err
+}
+
+// Regenerate regenerates a session store from old session ID to new one.
+func (p *NodbProvider) Regenerate(oldsid, sid string) (_ session.RawStore, err error) {
+ if p.Exist(sid) {
+ return nil, fmt.Errorf("new sid '%s' already exists", sid)
+ }
+
+ kvs := make([]byte, 0)
+ if p.Exist(oldsid) {
+ if kvs, err = p.c.Get([]byte(oldsid)); err != nil {
+ return nil, err
+ } else if _, err = p.c.Del([]byte(oldsid)); err != nil {
+ return nil, err
+ }
+ }
+
+ if err = p.c.Set([]byte(sid), kvs); err != nil {
+ return nil, err
+ } else if _, err = p.c.Expire([]byte(sid), p.expire); err != nil {
+ return nil, err
+ }
+
+ var kv map[interface{}]interface{}
+ if len(kvs) == 0 {
+ kv = make(map[interface{}]interface{})
+ } else {
+ kv, err = session.DecodeGob([]byte(kvs))
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return NewNodbStore(p.c, sid, p.expire, kv), nil
+}
+
+// Count counts and returns number of sessions.
+func (p *NodbProvider) Count() int {
+ // FIXME: how come this library does not have DbSize() method?
+ return -1
+}
+
+// GC calls GC to clean expired sessions.
+func (p *NodbProvider) GC() {}
+
+func init() {
+ session.Register("nodb", &NodbProvider{})
+}
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/nodb/nodb.goconvey b/Godeps/_workspace/src/github.com/macaron-contrib/session/nodb/nodb.goconvey
new file mode 100644
index 00000000000..8485e986e45
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/nodb/nodb.goconvey
@@ -0,0 +1 @@
+ignore
\ No newline at end of file
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/nodb/nodb_test.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/nodb/nodb_test.go
new file mode 100644
index 00000000000..c86ba98ded5
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/nodb/nodb_test.go
@@ -0,0 +1,105 @@
+// Copyright 2015 Unknwon
+//
+// Licensed under the Apache License, Version 2.0 (the "License"): you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+package session
+
+import (
+ "net/http"
+ "net/http/httptest"
+ "testing"
+
+ "github.com/Unknwon/macaron"
+ . "github.com/smartystreets/goconvey/convey"
+
+ "github.com/macaron-contrib/session"
+)
+
+func Test_LedisProvider(t *testing.T) {
+ Convey("Test nodb session provider", t, func() {
+ opt := session.Options{
+ Provider: "nodb",
+ ProviderConfig: "./tmp.db",
+ }
+
+ Convey("Basic operation", func() {
+ m := macaron.New()
+ m.Use(session.Sessioner(opt))
+
+ m.Get("/", func(ctx *macaron.Context, sess session.Store) {
+ sess.Set("uname", "unknwon")
+ })
+ m.Get("/reg", func(ctx *macaron.Context, sess session.Store) {
+ raw, err := sess.RegenerateId(ctx)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+
+ uname := raw.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+ })
+ m.Get("/get", func(ctx *macaron.Context, sess session.Store) {
+ sid := sess.ID()
+ So(sid, ShouldNotBeEmpty)
+
+ raw, err := sess.Read(sid)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+
+ uname := sess.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+
+ So(sess.Delete("uname"), ShouldBeNil)
+ So(sess.Get("uname"), ShouldBeNil)
+
+ So(sess.Destory(ctx), ShouldBeNil)
+ })
+
+ resp := httptest.NewRecorder()
+ req, err := http.NewRequest("GET", "/", nil)
+ So(err, ShouldBeNil)
+ m.ServeHTTP(resp, req)
+
+ cookie := resp.Header().Get("Set-Cookie")
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/reg", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", cookie)
+ m.ServeHTTP(resp, req)
+
+ cookie = resp.Header().Get("Set-Cookie")
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/get", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", cookie)
+ m.ServeHTTP(resp, req)
+
+ Convey("Regenrate empty session", func() {
+ m.Get("/empty", func(ctx *macaron.Context, sess session.Store) {
+ raw, err := sess.RegenerateId(ctx)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+ })
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/empty", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", "MacaronSession=ad2c7e3cbecfcf486; Path=/;")
+ m.ServeHTTP(resp, req)
+ })
+ })
+ })
+}
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgres.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgres.go
new file mode 100644
index 00000000000..5cb4c82ea84
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgres.go
@@ -0,0 +1,196 @@
+// Copyright 2013 Beego Authors
+// Copyright 2014 Unknwon
+//
+// Licensed under the Apache License, Version 2.0 (the "License"): you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+package session
+
+import (
+ "database/sql"
+ "fmt"
+ "log"
+ "sync"
+ "time"
+
+ _ "github.com/lib/pq"
+
+ "github.com/macaron-contrib/session"
+)
+
+// PostgresStore represents a postgres session store implementation.
+type PostgresStore struct {
+ c *sql.DB
+ sid string
+ lock sync.RWMutex
+ data map[interface{}]interface{}
+}
+
+// NewPostgresStore creates and returns a postgres session store.
+func NewPostgresStore(c *sql.DB, sid string, kv map[interface{}]interface{}) *PostgresStore {
+ return &PostgresStore{
+ c: c,
+ sid: sid,
+ data: kv,
+ }
+}
+
+// Set sets value to given key in session.
+func (s *PostgresStore) Set(key, value interface{}) error {
+ s.lock.Lock()
+ defer s.lock.Unlock()
+
+ s.data[key] = value
+ return nil
+}
+
+// Get gets value by given key in session.
+func (s *PostgresStore) Get(key interface{}) interface{} {
+ s.lock.RLock()
+ defer s.lock.RUnlock()
+
+ return s.data[key]
+}
+
+// Delete delete a key from session.
+func (s *PostgresStore) Delete(key interface{}) error {
+ s.lock.Lock()
+ defer s.lock.Unlock()
+
+ delete(s.data, key)
+ return nil
+}
+
+// ID returns current session ID.
+func (s *PostgresStore) ID() string {
+ return s.sid
+}
+
+// save postgres session values to database.
+// must call this method to save values to database.
+func (s *PostgresStore) Release() error {
+ data, err := session.EncodeGob(s.data)
+ if err != nil {
+ return err
+ }
+
+ _, err = s.c.Exec("UPDATE session SET data=$1, expiry=$2 WHERE key=$3",
+ data, time.Now().Unix(), s.sid)
+ return err
+}
+
+// Flush deletes all session data.
+func (s *PostgresStore) Flush() error {
+ s.lock.Lock()
+ defer s.lock.Unlock()
+
+ s.data = make(map[interface{}]interface{})
+ return nil
+}
+
+// PostgresProvider represents a postgres session provider implementation.
+type PostgresProvider struct {
+ c *sql.DB
+ maxlifetime int64
+}
+
+// Init initializes postgres session provider.
+// connStr: user=a password=b host=localhost port=5432 dbname=c sslmode=disable
+func (p *PostgresProvider) Init(maxlifetime int64, connStr string) (err error) {
+ p.maxlifetime = maxlifetime
+
+ p.c, err = sql.Open("postgres", connStr)
+ if err != nil {
+ return err
+ }
+ return p.c.Ping()
+}
+
+// Read returns raw session store by session ID.
+func (p *PostgresProvider) Read(sid string) (session.RawStore, error) {
+ var data []byte
+ err := p.c.QueryRow("SELECT data FROM session WHERE key=$1", sid).Scan(&data)
+ if err == sql.ErrNoRows {
+ _, err = p.c.Exec("INSERT INTO session(key,data,expiry) VALUES($1,$2,$3)",
+ sid, "", time.Now().Unix())
+ }
+ if err != nil {
+ return nil, err
+ }
+
+ var kv map[interface{}]interface{}
+ if len(data) == 0 {
+ kv = make(map[interface{}]interface{})
+ } else {
+ kv, err = session.DecodeGob(data)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return NewPostgresStore(p.c, sid, kv), nil
+}
+
+// Exist returns true if session with given ID exists.
+func (p *PostgresProvider) Exist(sid string) bool {
+ var data []byte
+ err := p.c.QueryRow("SELECT data FROM session WHERE key=$1", sid).Scan(&data)
+ if err != nil && err != sql.ErrNoRows {
+ panic("session/postgres: error checking existence: " + err.Error())
+ }
+ return err != sql.ErrNoRows
+}
+
+// Destory deletes a session by session ID.
+func (p *PostgresProvider) Destory(sid string) error {
+ _, err := p.c.Exec("DELETE FROM session WHERE key=$1", sid)
+ return err
+}
+
+// Regenerate regenerates a session store from old session ID to new one.
+func (p *PostgresProvider) Regenerate(oldsid, sid string) (_ session.RawStore, err error) {
+ if p.Exist(sid) {
+ return nil, fmt.Errorf("new sid '%s' already exists", sid)
+ }
+
+ if !p.Exist(oldsid) {
+ if _, err = p.c.Exec("INSERT INTO session(key,data,expiry) VALUES($1,$2,$3)",
+ oldsid, "", time.Now().Unix()); err != nil {
+ return nil, err
+ }
+ }
+
+ if _, err = p.c.Exec("UPDATE session SET key=$1 WHERE key=$2", sid, oldsid); err != nil {
+ return nil, err
+ }
+
+ return p.Read(sid)
+}
+
+// Count counts and returns number of sessions.
+func (p *PostgresProvider) Count() (total int) {
+ if err := p.c.QueryRow("SELECT COUNT(*) AS NUM FROM session").Scan(&total); err != nil {
+ panic("session/postgres: error counting records: " + err.Error())
+ }
+ return total
+}
+
+// GC calls GC to clean expired sessions.
+func (p *PostgresProvider) GC() {
+ if _, err := p.c.Exec("DELETE FROM session WHERE EXTRACT(EPOCH FROM NOW()) - expiry > $1", p.maxlifetime); err != nil {
+ log.Printf("session/postgres: error garbage collecting: %v", err)
+ }
+}
+
+func init() {
+ session.Register("postgres", &PostgresProvider{})
+}
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgres.goconvey b/Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgres.goconvey
new file mode 100644
index 00000000000..8485e986e45
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgres.goconvey
@@ -0,0 +1 @@
+ignore
\ No newline at end of file
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgres_test.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgres_test.go
new file mode 100644
index 00000000000..ea212c729f6
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgres_test.go
@@ -0,0 +1,138 @@
+// Copyright 2014 Unknwon
+//
+// Licensed under the Apache License, Version 2.0 (the "License"): you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+package session
+
+import (
+ "net/http"
+ "net/http/httptest"
+ "testing"
+ "time"
+
+ "github.com/Unknwon/macaron"
+ . "github.com/smartystreets/goconvey/convey"
+
+ "github.com/macaron-contrib/session"
+)
+
+func Test_PostgresProvider(t *testing.T) {
+ Convey("Test postgres session provider", t, func() {
+ opt := session.Options{
+ Provider: "postgres",
+ ProviderConfig: "user=jiahuachen dbname=macaron port=5432 sslmode=disable",
+ }
+
+ Convey("Basic operation", func() {
+ m := macaron.New()
+ m.Use(session.Sessioner(opt))
+
+ m.Get("/", func(ctx *macaron.Context, sess session.Store) {
+ sess.Set("uname", "unknwon")
+ })
+ m.Get("/reg", func(ctx *macaron.Context, sess session.Store) {
+ raw, err := sess.RegenerateId(ctx)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+
+ uname := raw.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+ })
+ m.Get("/get", func(ctx *macaron.Context, sess session.Store) {
+ sid := sess.ID()
+ So(sid, ShouldNotBeEmpty)
+
+ raw, err := sess.Read(sid)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+ So(raw.Release(), ShouldBeNil)
+
+ uname := sess.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+
+ So(sess.Delete("uname"), ShouldBeNil)
+ So(sess.Get("uname"), ShouldBeNil)
+
+ So(sess.Destory(ctx), ShouldBeNil)
+ })
+
+ resp := httptest.NewRecorder()
+ req, err := http.NewRequest("GET", "/", nil)
+ So(err, ShouldBeNil)
+ m.ServeHTTP(resp, req)
+
+ cookie := resp.Header().Get("Set-Cookie")
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/reg", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", cookie)
+ m.ServeHTTP(resp, req)
+
+ cookie = resp.Header().Get("Set-Cookie")
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/get", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", cookie)
+ m.ServeHTTP(resp, req)
+ })
+
+ Convey("Regenrate empty session", func() {
+ m := macaron.New()
+ m.Use(session.Sessioner(opt))
+ m.Get("/", func(ctx *macaron.Context, sess session.Store) {
+ raw, err := sess.RegenerateId(ctx)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+
+ So(sess.Destory(ctx), ShouldBeNil)
+ })
+
+ resp := httptest.NewRecorder()
+ req, err := http.NewRequest("GET", "/", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", "MacaronSession=ad2c7e3cbecfcf48; Path=/;")
+ m.ServeHTTP(resp, req)
+ })
+
+ Convey("GC session", func() {
+ m := macaron.New()
+ opt2 := opt
+ opt2.Gclifetime = 1
+ m.Use(session.Sessioner(opt2))
+
+ m.Get("/", func(sess session.Store) {
+ sess.Set("uname", "unknwon")
+ So(sess.ID(), ShouldNotBeEmpty)
+ uname := sess.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+
+ So(sess.Flush(), ShouldBeNil)
+ So(sess.Get("uname"), ShouldBeNil)
+
+ time.Sleep(2 * time.Second)
+ sess.GC()
+ So(sess.Count(), ShouldEqual, 0)
+ })
+
+ resp := httptest.NewRecorder()
+ req, err := http.NewRequest("GET", "/", nil)
+ So(err, ShouldBeNil)
+ m.ServeHTTP(resp, req)
+ })
+ })
+}
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgresql.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgresql.go
deleted file mode 100644
index bfe87c69ee0..00000000000
--- a/Godeps/_workspace/src/github.com/macaron-contrib/session/postgres/postgresql.go
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2013 Beego Authors
-// Copyright 2014 Unknwon
-//
-// Licensed under the Apache License, Version 2.0 (the "License"): you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations
-// under the License.
-
-package session
-
-import (
- "database/sql"
- "sync"
- "time"
-
- _ "github.com/lib/pq"
-
- "github.com/macaron-contrib/session"
-)
-
-// PostgresqlSessionStore represents a postgresql session store implementation.
-type PostgresqlSessionStore struct {
- c *sql.DB
- sid string
- lock sync.RWMutex
- data map[interface{}]interface{}
-}
-
-// Set sets value to given key in session.
-func (s *PostgresqlSessionStore) Set(key, value interface{}) error {
- s.lock.Lock()
- defer s.lock.Unlock()
-
- s.data[key] = value
- return nil
-}
-
-// Get gets value by given key in session.
-func (s *PostgresqlSessionStore) Get(key interface{}) interface{} {
- s.lock.RLock()
- defer s.lock.RUnlock()
-
- return s.data[key]
-}
-
-// Delete delete a key from session.
-func (s *PostgresqlSessionStore) Delete(key interface{}) error {
- s.lock.Lock()
- defer s.lock.Unlock()
-
- delete(s.data, key)
- return nil
-}
-
-// ID returns current session ID.
-func (s *PostgresqlSessionStore) ID() string {
- return s.sid
-}
-
-// save postgresql session values to database.
-// must call this method to save values to database.
-func (s *PostgresqlSessionStore) Release() error {
- defer s.c.Close()
-
- data, err := session.EncodeGob(s.data)
- if err != nil {
- return err
- }
-
- _, err = s.c.Exec("UPDATE session set session_data=$1, session_expiry=$2 where session_key=$3",
- data, time.Now().Format(time.RFC3339), s.sid)
- return err
-}
-
-// Flush deletes all session data.
-func (s *PostgresqlSessionStore) Flush() error {
- s.lock.Lock()
- defer s.lock.Unlock()
-
- s.data = make(map[interface{}]interface{})
- return nil
-}
-
-// PostgresqlProvider represents a postgresql session provider implementation.
-type PostgresqlProvider struct {
- maxlifetime int64
- connStr string
-}
-
-func (p *PostgresqlProvider) connectInit() *sql.DB {
- db, e := sql.Open("postgres", p.connStr)
- if e != nil {
- return nil
- }
- return db
-}
-
-// Init initializes memory session provider.
-func (p *PostgresqlProvider) Init(maxlifetime int64, connStr string) error {
- p.maxlifetime = maxlifetime
- p.connStr = connStr
- return nil
-}
-
-// Read returns raw session store by session ID.
-func (p *PostgresqlProvider) Read(sid string) (session.RawStore, error) {
- c := p.connectInit()
- row := c.QueryRow("select session_data from session where session_key=$1", sid)
- var sessiondata []byte
- err := row.Scan(&sessiondata)
- if err == sql.ErrNoRows {
- _, err = c.Exec("insert into session(session_key,session_data,session_expiry) values($1,$2,$3)",
- sid, "", time.Now().Format(time.RFC3339))
-
- if err != nil {
- return nil, err
- }
- } else if err != nil {
- return nil, err
- }
-
- var kv map[interface{}]interface{}
- if len(sessiondata) == 0 {
- kv = make(map[interface{}]interface{})
- } else {
- kv, err = session.DecodeGob(sessiondata)
- if err != nil {
- return nil, err
- }
- }
- rs := &PostgresqlSessionStore{c: c, sid: sid, data: kv}
- return rs, nil
-}
-
-// Exist returns true if session with given ID exists.
-func (p *PostgresqlProvider) Exist(sid string) bool {
- c := p.connectInit()
- defer c.Close()
- row := c.QueryRow("select session_data from session where session_key=$1", sid)
- var sessiondata []byte
- err := row.Scan(&sessiondata)
-
- if err == sql.ErrNoRows {
- return false
- } else {
- return true
- }
-}
-
-// Destory deletes a session by session ID.
-func (p *PostgresqlProvider) Destory(sid string) (err error) {
- c := p.connectInit()
- if _, err = c.Exec("DELETE FROM session where session_key=$1", sid); err != nil {
- return err
- }
- return c.Close()
-}
-
-// Regenerate regenerates a session store from old session ID to new one.
-func (p *PostgresqlProvider) Regenerate(oldsid, sid string) (session.RawStore, error) {
- c := p.connectInit()
- row := c.QueryRow("select session_data from session where session_key=$1", oldsid)
- var sessiondata []byte
- err := row.Scan(&sessiondata)
- if err == sql.ErrNoRows {
- c.Exec("insert into session(session_key,session_data,session_expiry) values($1,$2,$3)",
- oldsid, "", time.Now().Format(time.RFC3339))
- }
- c.Exec("update session set session_key=$1 where session_key=$2", sid, oldsid)
- var kv map[interface{}]interface{}
- if len(sessiondata) == 0 {
- kv = make(map[interface{}]interface{})
- } else {
- kv, err = session.DecodeGob(sessiondata)
- if err != nil {
- return nil, err
- }
- }
- rs := &PostgresqlSessionStore{c: c, sid: sid, data: kv}
- return rs, nil
-}
-
-// Count counts and returns number of sessions.
-func (p *PostgresqlProvider) Count() int {
- c := p.connectInit()
- defer c.Close()
- var total int
- err := c.QueryRow("SELECT count(*) as num from session").Scan(&total)
- if err != nil {
- return 0
- }
- return total
-}
-
-// GC calls GC to clean expired sessions.
-func (mp *PostgresqlProvider) GC() {
- c := mp.connectInit()
- c.Exec("DELETE from session where EXTRACT(EPOCH FROM (current_timestamp - session_expiry)) > $1", mp.maxlifetime)
- c.Close()
-}
-
-func init() {
- session.Register("postgresql", &PostgresqlProvider{})
-}
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/redis/redis.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/redis/redis.go
index 211866317f3..6d6a2c464c8 100644
--- a/Godeps/_workspace/src/github.com/macaron-contrib/session/redis/redis.go
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/redis/redis.go
@@ -16,31 +16,39 @@
package session
import (
- "strconv"
+ "fmt"
"strings"
"sync"
+ "time"
- "github.com/beego/redigo/redis"
+ "github.com/Unknwon/com"
+ "gopkg.in/ini.v1"
+ "gopkg.in/redis.v2"
"github.com/macaron-contrib/session"
)
-// redis max pool size
-var MAX_POOL_SIZE = 100
+// RedisStore represents a redis session store implementation.
+type RedisStore struct {
+ c *redis.Client
+ sid string
+ duration time.Duration
+ lock sync.RWMutex
+ data map[interface{}]interface{}
+}
-var redisPool chan redis.Conn
-
-// RedisSessionStore represents a redis session store implementation.
-type RedisSessionStore struct {
- p *redis.Pool
- sid string
- lock sync.RWMutex
- data map[interface{}]interface{}
- maxlifetime int64
+// NewRedisStore creates and returns a redis session store.
+func NewRedisStore(c *redis.Client, sid string, dur time.Duration, kv map[interface{}]interface{}) *RedisStore {
+ return &RedisStore{
+ c: c,
+ sid: sid,
+ duration: dur,
+ data: kv,
+ }
}
// Set sets value to given key in session.
-func (s *RedisSessionStore) Set(key, val interface{}) error {
+func (s *RedisStore) Set(key, val interface{}) error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -49,7 +57,7 @@ func (s *RedisSessionStore) Set(key, val interface{}) error {
}
// Get gets value by given key in session.
-func (s *RedisSessionStore) Get(key interface{}) interface{} {
+func (s *RedisStore) Get(key interface{}) interface{} {
s.lock.RLock()
defer s.lock.RUnlock()
@@ -57,7 +65,7 @@ func (s *RedisSessionStore) Get(key interface{}) interface{} {
}
// Delete delete a key from session.
-func (s *RedisSessionStore) Delete(key interface{}) error {
+func (s *RedisStore) Delete(key interface{}) error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -66,26 +74,22 @@ func (s *RedisSessionStore) Delete(key interface{}) error {
}
// ID returns current session ID.
-func (s *RedisSessionStore) ID() string {
+func (s *RedisStore) ID() string {
return s.sid
}
// Release releases resource and save data to provider.
-func (s *RedisSessionStore) Release() error {
- c := s.p.Get()
- defer c.Close()
-
+func (s *RedisStore) Release() error {
data, err := session.EncodeGob(s.data)
if err != nil {
return err
}
- _, err = c.Do("SETEX", s.sid, s.maxlifetime, string(data))
- return err
+ return s.c.SetEx(s.sid, s.duration, string(data)).Err()
}
// Flush deletes all session data.
-func (s *RedisSessionStore) Flush() error {
+func (s *RedisStore) Flush() error {
s.lock.Lock()
defer s.lock.Unlock()
@@ -95,59 +99,65 @@ func (s *RedisSessionStore) Flush() error {
// RedisProvider represents a redis session provider implementation.
type RedisProvider struct {
- maxlifetime int64
- connAddr string
- poolsize int
- password string
- poollist *redis.Pool
+ c *redis.Client
+ duration time.Duration
}
-// Init initializes memory session provider.
-// connStr: ,,
-// e.g. 127.0.0.1:6379,100,macaron
-func (p *RedisProvider) Init(maxlifetime int64, connStr string) error {
- p.maxlifetime = maxlifetime
- configs := strings.Split(connStr, ",")
- if len(configs) > 0 {
- p.connAddr = configs[0]
+// Init initializes redis session provider.
+// configs: network=tcp,addr=:6379,password=macaron,db=0,pool_size=100,idle_timeout=180
+func (p *RedisProvider) Init(maxlifetime int64, configs string) (err error) {
+ p.duration, err = time.ParseDuration(fmt.Sprintf("%ds", maxlifetime))
+ if err != nil {
+ return err
}
- if len(configs) > 1 {
- poolsize, err := strconv.Atoi(configs[1])
- if err != nil || poolsize <= 0 {
- p.poolsize = MAX_POOL_SIZE
- } else {
- p.poolsize = poolsize
- }
- } else {
- p.poolsize = MAX_POOL_SIZE
- }
- if len(configs) > 2 {
- p.password = configs[2]
- }
- p.poollist = redis.NewPool(func() (redis.Conn, error) {
- c, err := redis.Dial("tcp", p.connAddr)
- if err != nil {
- return nil, err
- }
- if p.password != "" {
- if _, err := c.Do("AUTH", p.password); err != nil {
- c.Close()
- return nil, err
- }
- }
- return c, err
- }, p.poolsize)
- return p.poollist.Get().Err()
+ cfg, err := ini.Load([]byte(strings.Replace(configs, ",", "\n", -1)))
+ if err != nil {
+ return err
+ }
+
+ opt := &redis.Options{
+ Network: "tcp",
+ }
+ for k, v := range cfg.Section("").KeysHash() {
+ switch k {
+ case "network":
+ opt.Network = v
+ case "addr":
+ opt.Addr = v
+ case "password":
+ opt.Password = v
+ case "db":
+ opt.DB = com.StrTo(v).MustInt64()
+ case "pool_size":
+ opt.PoolSize = com.StrTo(v).MustInt()
+ case "idle_timeout":
+ opt.IdleTimeout, err = time.ParseDuration(v + "s")
+ if err != nil {
+ return fmt.Errorf("error parsing idle timeout: %v", err)
+ }
+ default:
+ return fmt.Errorf("session/redis: unsupported option '%s'", k)
+ }
+ }
+
+ p.c = redis.NewClient(opt)
+ return p.c.Ping().Err()
}
// Read returns raw session store by session ID.
func (p *RedisProvider) Read(sid string) (session.RawStore, error) {
- c := p.poollist.Get()
- defer c.Close()
+ if !p.Exist(sid) {
+ if err := p.c.Set(sid, "").Err(); err != nil {
+ return nil, err
+ }
+ }
- kvs, err := redis.String(c.Do("GET", sid))
var kv map[interface{}]interface{}
+ kvs, err := p.c.Get(sid).Result()
+ if err != nil {
+ return nil, err
+ }
if len(kvs) == 0 {
kv = make(map[interface{}]interface{})
} else {
@@ -157,48 +167,41 @@ func (p *RedisProvider) Read(sid string) (session.RawStore, error) {
}
}
- rs := &RedisSessionStore{p: p.poollist, sid: sid, data: kv, maxlifetime: p.maxlifetime}
- return rs, nil
+ return NewRedisStore(p.c, sid, p.duration, kv), nil
}
// Exist returns true if session with given ID exists.
func (p *RedisProvider) Exist(sid string) bool {
- c := p.poollist.Get()
- defer c.Close()
-
- if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 {
- return false
- } else {
- return true
- }
+ has, err := p.c.Exists(sid).Result()
+ return err == nil && has
}
// Destory deletes a session by session ID.
func (p *RedisProvider) Destory(sid string) error {
- c := p.poollist.Get()
- defer c.Close()
-
- _, err := c.Do("DEL", sid)
- return err
+ return p.c.Del(sid).Err()
}
// Regenerate regenerates a session store from old session ID to new one.
-func (p *RedisProvider) Regenerate(oldsid, sid string) (session.RawStore, error) {
- c := p.poollist.Get()
- defer c.Close()
-
- if existed, _ := redis.Int(c.Do("EXISTS", oldsid)); existed == 0 {
- // oldsid doesn't exists, set the new sid directly
- // ignore error here, since if it return error
- // the existed value will be 0
- c.Do("SET", sid, "", "EX", p.maxlifetime)
- } else {
- c.Do("RENAME", oldsid, sid)
- c.Do("EXPIRE", sid, p.maxlifetime)
+func (p *RedisProvider) Regenerate(oldsid, sid string) (_ session.RawStore, err error) {
+ if p.Exist(sid) {
+ return nil, fmt.Errorf("new sid '%s' already exists", sid)
+ } else if !p.Exist(oldsid) {
+ // Make a fake old session.
+ if err = p.c.SetEx(oldsid, p.duration, "").Err(); err != nil {
+ return nil, err
+ }
+ }
+
+ if err = p.c.Rename(oldsid, sid).Err(); err != nil {
+ return nil, err
}
- kvs, err := redis.String(c.Do("GET", sid))
var kv map[interface{}]interface{}
+ kvs, err := p.c.Get(sid).Result()
+ if err != nil {
+ return nil, err
+ }
+
if len(kvs) == 0 {
kv = make(map[interface{}]interface{})
} else {
@@ -208,14 +211,12 @@ func (p *RedisProvider) Regenerate(oldsid, sid string) (session.RawStore, error)
}
}
- rs := &RedisSessionStore{p: p.poollist, sid: sid, data: kv, maxlifetime: p.maxlifetime}
- return rs, nil
+ return NewRedisStore(p.c, sid, p.duration, kv), nil
}
// Count counts and returns number of sessions.
func (p *RedisProvider) Count() int {
- // FIXME
- return 0
+ return int(p.c.DbSize().Val())
}
// GC calls GC to clean expired sessions.
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/redis/redis.goconvey b/Godeps/_workspace/src/github.com/macaron-contrib/session/redis/redis.goconvey
new file mode 100644
index 00000000000..8485e986e45
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/redis/redis.goconvey
@@ -0,0 +1 @@
+ignore
\ No newline at end of file
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/redis/redis_test.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/redis/redis_test.go
new file mode 100644
index 00000000000..9fd8e6518f8
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/redis/redis_test.go
@@ -0,0 +1,107 @@
+// Copyright 2014 Unknwon
+//
+// Licensed under the Apache License, Version 2.0 (the "License"): you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+
+package session
+
+import (
+ "net/http"
+ "net/http/httptest"
+ "testing"
+
+ "github.com/Unknwon/macaron"
+ . "github.com/smartystreets/goconvey/convey"
+
+ "github.com/macaron-contrib/session"
+)
+
+func Test_RedisProvider(t *testing.T) {
+ Convey("Test redis session provider", t, func() {
+ opt := session.Options{
+ Provider: "redis",
+ ProviderConfig: "addr=:6379",
+ }
+
+ Convey("Basic operation", func() {
+ m := macaron.New()
+ m.Use(session.Sessioner(opt))
+
+ m.Get("/", func(ctx *macaron.Context, sess session.Store) {
+ sess.Set("uname", "unknwon")
+ })
+ m.Get("/reg", func(ctx *macaron.Context, sess session.Store) {
+ raw, err := sess.RegenerateId(ctx)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+
+ uname := raw.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+ })
+ m.Get("/get", func(ctx *macaron.Context, sess session.Store) {
+ sid := sess.ID()
+ So(sid, ShouldNotBeEmpty)
+
+ raw, err := sess.Read(sid)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+
+ uname := sess.Get("uname")
+ So(uname, ShouldNotBeNil)
+ So(uname, ShouldEqual, "unknwon")
+
+ So(sess.Delete("uname"), ShouldBeNil)
+ So(sess.Get("uname"), ShouldBeNil)
+
+ So(sess.Destory(ctx), ShouldBeNil)
+ })
+
+ resp := httptest.NewRecorder()
+ req, err := http.NewRequest("GET", "/", nil)
+ So(err, ShouldBeNil)
+ m.ServeHTTP(resp, req)
+
+ cookie := resp.Header().Get("Set-Cookie")
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/reg", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", cookie)
+ m.ServeHTTP(resp, req)
+
+ cookie = resp.Header().Get("Set-Cookie")
+
+ resp = httptest.NewRecorder()
+ req, err = http.NewRequest("GET", "/get", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", cookie)
+ m.ServeHTTP(resp, req)
+ })
+
+ Convey("Regenrate empty session", func() {
+ m := macaron.New()
+ m.Use(session.Sessioner(opt))
+ m.Get("/", func(ctx *macaron.Context, sess session.Store) {
+ raw, err := sess.RegenerateId(ctx)
+ So(err, ShouldBeNil)
+ So(raw, ShouldNotBeNil)
+ })
+
+ resp := httptest.NewRecorder()
+ req, err := http.NewRequest("GET", "/", nil)
+ So(err, ShouldBeNil)
+ req.Header.Set("Cookie", "MacaronSession=ad2c7e3cbecfcf486; Path=/;")
+ m.ServeHTTP(resp, req)
+ })
+ })
+}
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/session.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/session.go
index 204c65d7668..9cc1d528749 100644
--- a/Godeps/_workspace/src/github.com/macaron-contrib/session/session.go
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/session.go
@@ -13,7 +13,7 @@
// License for the specific language governing permissions and limitations
// under the License.
-// Package session a middleware that provides the session manager of Macaron.
+// Package session a middleware that provides the session management of Macaron.
package session
// NOTE: last sync 000033e on Nov 4, 2014.
@@ -28,7 +28,7 @@ import (
"github.com/Unknwon/macaron"
)
-const _VERSION = "0.1.1"
+const _VERSION = "0.1.6"
func Version() string {
return _VERSION
@@ -37,11 +37,11 @@ func Version() string {
// RawStore is the interface that operates the session data.
type RawStore interface {
// Set sets value to given key in session.
- Set(key, value interface{}) error
+ Set(interface{}, interface{}) error
// Get gets value by given key in session.
- Get(key interface{}) interface{}
- // Delete delete a key from session.
- Delete(key interface{}) error
+ Get(interface{}) interface{}
+ // Delete deletes a key from session.
+ Delete(interface{}) error
// ID returns current session ID.
ID() string
// Release releases session resource and save data to provider.
@@ -54,7 +54,7 @@ type RawStore interface {
type Store interface {
RawStore
// Read returns raw session store by session ID.
- Read(sid string) (RawStore, error)
+ Read(string) (RawStore, error)
// Destory deletes a session.
Destory(*macaron.Context) error
// RegenerateId regenerates a session store from old session ID to new one.
@@ -111,7 +111,7 @@ func prepareOptions(options []Options) Options {
if len(opt.Provider) == 0 {
opt.Provider = sec.Key("PROVIDER").MustString("memory")
}
- if len(opt.ProviderConfig) == 0 && opt.Provider == "file" {
+ if len(opt.ProviderConfig) == 0 {
opt.ProviderConfig = sec.Key("PROVIDER_CONFIG").MustString("data/sessions")
}
if len(opt.CookieName) == 0 {
@@ -155,7 +155,7 @@ func Sessioner(options ...Options) macaron.Handler {
return func(ctx *macaron.Context) {
sess, err := manager.Start(ctx)
if err != nil {
- panic("session: " + err.Error())
+ panic("session(start): " + err.Error())
}
// Get flash.
@@ -187,8 +187,8 @@ func Sessioner(options ...Options) macaron.Handler {
ctx.Next()
- if sess.Release() != nil {
- panic("session: " + err.Error())
+ if err = sess.Release(); err != nil {
+ panic("session(release): " + err.Error())
}
}
}
@@ -242,17 +242,14 @@ type Manager struct {
func NewManager(name string, opt Options) (*Manager, error) {
p, ok := providers[name]
if !ok {
- return nil, fmt.Errorf("session: unknown provider ‘%q’(forgotten import?)", name)
+ return nil, fmt.Errorf("session: unknown provider '%s'(forgotten import?)", name)
}
- if err := p.Init(opt.Maxlifetime, opt.ProviderConfig); err != nil {
- return nil, err
- }
- return &Manager{p, opt}, nil
+ return &Manager{p, opt}, p.Init(opt.Maxlifetime, opt.ProviderConfig)
}
// sessionId generates a new session ID with rand string, unix nano time, remote addr by hash function.
func (m *Manager) sessionId() string {
- return hex.EncodeToString(generateRandomKey(m.opt.IDLength))
+ return hex.EncodeToString(generateRandomKey(m.opt.IDLength / 2))
}
// Start starts a session by generating new one
@@ -315,16 +312,9 @@ func (m *Manager) Destory(ctx *macaron.Context) error {
func (m *Manager) RegenerateId(ctx *macaron.Context) (sess RawStore, err error) {
sid := m.sessionId()
oldsid := ctx.GetCookie(m.opt.CookieName)
- if len(oldsid) == 0 {
- sess, err = m.provider.Read(oldsid)
- if err != nil {
- return nil, err
- }
- } else {
- sess, err = m.provider.Regenerate(oldsid, sid)
- if err != nil {
- return nil, err
- }
+ sess, err = m.provider.Regenerate(oldsid, sid)
+ if err != nil {
+ return nil, err
}
ck := &http.Cookie{
Name: m.opt.CookieName,
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/session_test.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/session_test.go
index 327c1d0c6a5..82efc277c61 100644
--- a/Godeps/_workspace/src/github.com/macaron-contrib/session/session_test.go
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/session_test.go
@@ -42,7 +42,7 @@ func Test_Sessioner(t *testing.T) {
m.ServeHTTP(resp, req)
})
- Convey("Register invalid provider that", t, func() {
+ Convey("Register invalid provider", t, func() {
Convey("Provider not exists", func() {
defer func() {
So(recover(), ShouldNotBeNil)
diff --git a/Godeps/_workspace/src/github.com/macaron-contrib/session/utils.go b/Godeps/_workspace/src/github.com/macaron-contrib/session/utils.go
index a165de83070..6c9ea495fe5 100644
--- a/Godeps/_workspace/src/github.com/macaron-contrib/session/utils.go
+++ b/Godeps/_workspace/src/github.com/macaron-contrib/session/utils.go
@@ -24,39 +24,19 @@ import (
"github.com/Unknwon/com"
)
-func init() {
- gob.Register([]interface{}{})
- gob.Register(map[int]interface{}{})
- gob.Register(map[string]interface{}{})
- gob.Register(map[interface{}]interface{}{})
- gob.Register(map[string]string{})
- gob.Register(map[int]string{})
- gob.Register(map[int]int{})
- gob.Register(map[int]int64{})
-}
-
func EncodeGob(obj map[interface{}]interface{}) ([]byte, error) {
for _, v := range obj {
gob.Register(v)
}
buf := bytes.NewBuffer(nil)
- enc := gob.NewEncoder(buf)
- err := enc.Encode(obj)
- if err != nil {
- return []byte(""), err
- }
- return buf.Bytes(), nil
+ err := gob.NewEncoder(buf).Encode(obj)
+ return buf.Bytes(), err
}
-func DecodeGob(encoded []byte) (map[interface{}]interface{}, error) {
+func DecodeGob(encoded []byte) (out map[interface{}]interface{}, err error) {
buf := bytes.NewBuffer(encoded)
- dec := gob.NewDecoder(buf)
- var out map[interface{}]interface{}
- err := dec.Decode(&out)
- if err != nil {
- return nil, err
- }
- return out, nil
+ err = gob.NewDecoder(buf).Decode(&out)
+ return out, err
}
// generateRandomKey creates a random key with the given strength.
From 76ea0f432aff082e1ad3403ca7708ee8ab1d9c98 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Tue, 31 Mar 2015 19:20:34 +0200
Subject: [PATCH 024/181] updated master version to beta2
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 1b1290b0da8..8df5f593006 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"company": "Coding Instinct AB"
},
"name": "grafana",
- "version": "2.0.0-beta1",
+ "version": "2.0.0-beta2",
"repository": {
"type": "git",
"url": "http://github.com/torkelo/grafana.git"
From 03e336ba9ea2b594c0861efa9efcfd77351d8ae6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Tue, 31 Mar 2015 21:48:54 +0200
Subject: [PATCH 025/181] Fixed minor issue doing snapshot from home (root)
dashboard
---
public/app/features/dashboard/shareSnapshotCtrl.js | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/public/app/features/dashboard/shareSnapshotCtrl.js b/public/app/features/dashboard/shareSnapshotCtrl.js
index 17a313b2b64..010f074957b 100644
--- a/public/app/features/dashboard/shareSnapshotCtrl.js
+++ b/public/app/features/dashboard/shareSnapshotCtrl.js
@@ -66,9 +66,15 @@ function (angular, _) {
$scope.snapshotUrl = results.url;
$scope.saveExternalSnapshotRef(cmdData, results);
} else {
- var baseUrl = $location.absUrl().replace($location.url(), "");
- $scope.snapshotUrl = baseUrl + '/dashboard/snapshot/' + results.key;
- $scope.deleteUrl = baseUrl + '/api/snapshots-delete/' + results.deleteKey;
+ var url = $location.url();
+ var baseUrl = $location.absUrl();
+
+ if (url !== '/') {
+ baseUrl = baseUrl.replace(url, '') + '/';
+ }
+
+ $scope.snapshotUrl = baseUrl + 'dashboard/snapshot/' + results.key;
+ $scope.deleteUrl = baseUrl + 'api/snapshots-delete/' + results.deleteKey;
}
$scope.step = 2;
From 3c2bfbfc1c1b311f5c96c8964f5bf9bd20ce3362 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Tue, 31 Mar 2015 22:06:19 +0200
Subject: [PATCH 026/181] Search: Dashboard results should be sorted
alphabetically, Fixes #1685
---
CHANGELOG.md | 1 +
pkg/services/sqlstore/dashboard.go | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e21e94685d4..ace3efcbe62 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
**FIxes**
- [Issue #1681](https://github.com/grafana/grafana/issues/1681). MySQL session: fixed problem using mysql as session store
- [Issue #1671](https://github.com/grafana/grafana/issues/1671). Data sources: Fixed issue with changing default data source (should not require full page load to take effect, now fixed)
+- [Issue #1685](https://github.com/grafana/grafana/issues/1685). Search: Dashboard results should be sorted alphabetically
# 2.0.0-Beta1 (2015-03-30)
diff --git a/pkg/services/sqlstore/dashboard.go b/pkg/services/sqlstore/dashboard.go
index 0384a5bb6e6..7dbebd94e4c 100644
--- a/pkg/services/sqlstore/dashboard.go
+++ b/pkg/services/sqlstore/dashboard.go
@@ -140,7 +140,7 @@ func SearchDashboards(query *m.SearchDashboardsQuery) error {
query.Limit = 300
}
- sql.WriteString(fmt.Sprintf(" LIMIT %d", query.Limit))
+ sql.WriteString(fmt.Sprintf(" ORDER BY dashboard.title ASC LIMIT %d", query.Limit))
var res []DashboardSearchProjection
err := x.Sql(sql.String(), params...).Find(&res)
From 4ca125da412b824d348fb02fb3a86d11cea15141 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Wed, 1 Apr 2015 08:24:03 +0200
Subject: [PATCH 027/181] Delete snapshot fix: the action is now shows
confirmation directly in the modal (not opening a new tab with api call as in
beta1), Fixes #1682
---
public/app/features/dashboard/partials/shareModal.html | 10 +++++++++-
public/app/features/dashboard/shareSnapshotCtrl.js | 6 ++++++
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/public/app/features/dashboard/partials/shareModal.html b/public/app/features/dashboard/partials/shareModal.html
index 881d30ada97..6b9ff8aef16 100644
--- a/public/app/features/dashboard/partials/shareModal.html
+++ b/public/app/features/dashboard/partials/shareModal.html
@@ -84,6 +84,13 @@
+
+
diff --git a/public/app/features/dashboard/shareSnapshotCtrl.js b/public/app/features/dashboard/shareSnapshotCtrl.js
index 010f074957b..bcdbee57d18 100644
--- a/public/app/features/dashboard/shareSnapshotCtrl.js
+++ b/public/app/features/dashboard/shareSnapshotCtrl.js
@@ -117,6 +117,12 @@ function (angular, _) {
});
};
+ $scope.deleteSnapshot = function() {
+ backendSrv.get($scope.deleteUrl).then(function() {
+ $scope.step = 3;
+ });
+ };
+
$scope.saveExternalSnapshotRef = function(cmdData, results) {
// save external in local instance as well
cmdData.external = true;
From 5422d13607bdee899c75a038241b310ff94caa3d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Wed, 1 Apr 2015 08:26:02 +0200
Subject: [PATCH 028/181] Postgres fix update
---
pkg/services/sqlstore/datasource.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pkg/services/sqlstore/datasource.go b/pkg/services/sqlstore/datasource.go
index e82d42951e8..ebb2ad977b1 100644
--- a/pkg/services/sqlstore/datasource.go
+++ b/pkg/services/sqlstore/datasource.go
@@ -90,7 +90,7 @@ func updateIsDefaultFlag(ds *m.DataSource, sess *xorm.Session) error {
// Handle is default flag
if ds.IsDefault {
rawSql := "UPDATE data_source SET is_default=? WHERE org_id=? AND id <> ?"
- if _, err := sess.Exec(rawSql, False, ds.OrgId, ds.Id); err != nil {
+ if _, err := sess.Exec(rawSql, false, ds.OrgId, ds.Id); err != nil {
return err
}
}
From c3fa68ade85d2087b9aae3490a5e3e105486db8d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Wed, 1 Apr 2015 09:00:17 +0200
Subject: [PATCH 029/181] Data source proxy: Fixed issue with Gzip enabled and
data source proxy, Fixes #1675
---
CHANGELOG.md | 1 +
pkg/cmd/web.go | 3 ++-
pkg/middleware/util.go | 20 ++++++++++++++++++++
3 files changed, 23 insertions(+), 1 deletion(-)
create mode 100644 pkg/middleware/util.go
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ace3efcbe62..165f7b40253 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
# 2.0.0-RC1 (unreleased)
**FIxes**
+- [Issue #1675](https://github.com/grafana/grafana/issues/1675). Data source proxy: Fixed issue with Gzip enabled and data source proxy
- [Issue #1681](https://github.com/grafana/grafana/issues/1681). MySQL session: fixed problem using mysql as session store
- [Issue #1671](https://github.com/grafana/grafana/issues/1671). Data sources: Fixed issue with changing default data source (should not require full page load to take effect, now fixed)
- [Issue #1685](https://github.com/grafana/grafana/issues/1685). Search: Dashboard results should be sorted alphabetically
diff --git a/pkg/cmd/web.go b/pkg/cmd/web.go
index 1fc6e8a999c..8d7697b9871 100644
--- a/pkg/cmd/web.go
+++ b/pkg/cmd/web.go
@@ -42,8 +42,9 @@ func newMacaron() *macaron.Macaron {
m := macaron.New()
m.Use(middleware.Logger())
m.Use(macaron.Recovery())
+
if setting.EnableGzip {
- m.Use(macaron.Gziper())
+ m.Use(middleware.Gziper())
}
mapStatic(m, "", "public")
diff --git a/pkg/middleware/util.go b/pkg/middleware/util.go
new file mode 100644
index 00000000000..2d7d9739ead
--- /dev/null
+++ b/pkg/middleware/util.go
@@ -0,0 +1,20 @@
+package middleware
+
+import (
+ "strings"
+
+ "github.com/Unknwon/macaron"
+)
+
+func Gziper() macaron.Handler {
+ macaronGziper := macaron.Gziper()
+
+ return func(ctx *macaron.Context) {
+ requestPath := ctx.Req.URL.RequestURI()
+ if strings.HasPrefix(requestPath, "/api/datasources/proxy") {
+ return
+ }
+
+ ctx.Invoke(macaronGziper)
+ }
+}
From cf877e6567860ce7ef4b991c688d25eb18677f32 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Wed, 1 Apr 2015 09:45:42 +0200
Subject: [PATCH 030/181] added postgres and redis session options
---
Godeps/Godeps.json | 14 +-
.../src/gopkg.in/bufio.v1/.travis.yml | 11 +
.../_workspace/src/gopkg.in/bufio.v1/LICENSE | 27 +
.../_workspace/src/gopkg.in/bufio.v1/Makefile | 2 +
.../src/gopkg.in/bufio.v1/README.md | 4 +
.../src/gopkg.in/bufio.v1/buffer.go | 413 ++
.../src/gopkg.in/bufio.v1/buffer_test.go | 527 +++
.../_workspace/src/gopkg.in/bufio.v1/bufio.go | 728 ++++
.../src/gopkg.in/bufio.v1/bufio_test.go | 1418 +++++++
.../src/gopkg.in/bufio.v1/export_test.go | 9 +
.../src/gopkg.in/redis.v2/.travis.yml | 19 +
.../_workspace/src/gopkg.in/redis.v2/LICENSE | 27 +
.../_workspace/src/gopkg.in/redis.v2/Makefile | 3 +
.../src/gopkg.in/redis.v2/README.md | 46 +
.../src/gopkg.in/redis.v2/command.go | 597 +++
.../src/gopkg.in/redis.v2/commands.go | 1246 ++++++
.../_workspace/src/gopkg.in/redis.v2/doc.go | 4 +
.../_workspace/src/gopkg.in/redis.v2/error.go | 23 +
.../src/gopkg.in/redis.v2/example_test.go | 180 +
.../src/gopkg.in/redis.v2/export_test.go | 5 +
.../_workspace/src/gopkg.in/redis.v2/multi.go | 138 +
.../src/gopkg.in/redis.v2/parser.go | 262 ++
.../src/gopkg.in/redis.v2/parser_test.go | 54 +
.../src/gopkg.in/redis.v2/pipeline.go | 91 +
.../_workspace/src/gopkg.in/redis.v2/pool.go | 405 ++
.../src/gopkg.in/redis.v2/pubsub.go | 134 +
.../src/gopkg.in/redis.v2/rate_limit.go | 53 +
.../src/gopkg.in/redis.v2/rate_limit_test.go | 31 +
.../_workspace/src/gopkg.in/redis.v2/redis.go | 231 ++
.../src/gopkg.in/redis.v2/redis_test.go | 3333 +++++++++++++++++
.../src/gopkg.in/redis.v2/script.go | 52 +
.../src/gopkg.in/redis.v2/sentinel.go | 291 ++
.../src/gopkg.in/redis.v2/sentinel_test.go | 185 +
.../gopkg.in/redis.v2/testdata/sentinel.conf | 6 +
pkg/cmd/web.go | 1 +
pkg/setting/setting.go | 2 +-
36 files changed, 10569 insertions(+), 3 deletions(-)
create mode 100644 Godeps/_workspace/src/gopkg.in/bufio.v1/.travis.yml
create mode 100644 Godeps/_workspace/src/gopkg.in/bufio.v1/LICENSE
create mode 100644 Godeps/_workspace/src/gopkg.in/bufio.v1/Makefile
create mode 100644 Godeps/_workspace/src/gopkg.in/bufio.v1/README.md
create mode 100644 Godeps/_workspace/src/gopkg.in/bufio.v1/buffer.go
create mode 100644 Godeps/_workspace/src/gopkg.in/bufio.v1/buffer_test.go
create mode 100644 Godeps/_workspace/src/gopkg.in/bufio.v1/bufio.go
create mode 100644 Godeps/_workspace/src/gopkg.in/bufio.v1/bufio_test.go
create mode 100644 Godeps/_workspace/src/gopkg.in/bufio.v1/export_test.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/.travis.yml
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/LICENSE
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/Makefile
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/README.md
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/command.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/commands.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/doc.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/error.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/example_test.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/export_test.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/multi.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/parser.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/parser_test.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/pipeline.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/pool.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/pubsub.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/rate_limit.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/rate_limit_test.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/redis.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/redis_test.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/script.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/sentinel.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/sentinel_test.go
create mode 100644 Godeps/_workspace/src/gopkg.in/redis.v2/testdata/sentinel.conf
diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json
index ce0a9ea142e..e423a574cd2 100644
--- a/Godeps/Godeps.json
+++ b/Godeps/Godeps.json
@@ -1,6 +1,6 @@
{
- "ImportPath": "github.com/torkelo/grafana-pro",
- "GoVersion": "go1.3",
+ "ImportPath": "github.com/grafana/grafana",
+ "GoVersion": "go1.4.2",
"Packages": [
"./pkg/..."
],
@@ -70,10 +70,20 @@
"ImportPath": "golang.org/x/oauth2",
"Rev": "e5909d4679a1926c774c712b343f10b8298687a3"
},
+ {
+ "ImportPath": "gopkg.in/bufio.v1",
+ "Comment": "v1",
+ "Rev": "567b2bfa514e796916c4747494d6ff5132a1dfce"
+ },
{
"ImportPath": "gopkg.in/ini.v1",
"Comment": "v0-16-g1772191",
"Rev": "177219109c97e7920c933e21c9b25f874357b237"
+ },
+ {
+ "ImportPath": "gopkg.in/redis.v2",
+ "Comment": "v2.3.2",
+ "Rev": "e6179049628164864e6e84e973cfb56335748dea"
}
]
}
diff --git a/Godeps/_workspace/src/gopkg.in/bufio.v1/.travis.yml b/Godeps/_workspace/src/gopkg.in/bufio.v1/.travis.yml
new file mode 100644
index 00000000000..ccca6bb4a61
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/bufio.v1/.travis.yml
@@ -0,0 +1,11 @@
+language: go
+
+go:
+ - 1.0
+ - 1.1
+ - 1.2
+ - tip
+
+install:
+ - go get launchpad.net/gocheck
+ - go get gopkg.in/bufio.v1
diff --git a/Godeps/_workspace/src/gopkg.in/bufio.v1/LICENSE b/Godeps/_workspace/src/gopkg.in/bufio.v1/LICENSE
new file mode 100644
index 00000000000..07a316cbf47
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/bufio.v1/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2013 The bufio Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Godeps/_workspace/src/gopkg.in/bufio.v1/Makefile b/Godeps/_workspace/src/gopkg.in/bufio.v1/Makefile
new file mode 100644
index 00000000000..038ed47e941
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/bufio.v1/Makefile
@@ -0,0 +1,2 @@
+all:
+ go test gopkg.in/bufio.v1
diff --git a/Godeps/_workspace/src/gopkg.in/bufio.v1/README.md b/Godeps/_workspace/src/gopkg.in/bufio.v1/README.md
new file mode 100644
index 00000000000..bfb85ee544f
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/bufio.v1/README.md
@@ -0,0 +1,4 @@
+bufio
+=====
+
+This is a fork of the http://golang.org/pkg/bufio/ package. It adds `ReadN` method that allows reading next `n` bytes from the internal buffer without allocating intermediate buffer. This method works just like the [Buffer.Next](http://golang.org/pkg/bytes/#Buffer.Next) method, but has slightly different signature.
diff --git a/Godeps/_workspace/src/gopkg.in/bufio.v1/buffer.go b/Godeps/_workspace/src/gopkg.in/bufio.v1/buffer.go
new file mode 100644
index 00000000000..8b915605b64
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/bufio.v1/buffer.go
@@ -0,0 +1,413 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bufio
+
+// Simple byte buffer for marshaling data.
+
+import (
+ "bytes"
+ "errors"
+ "io"
+ "unicode/utf8"
+)
+
+// A Buffer is a variable-sized buffer of bytes with Read and Write methods.
+// The zero value for Buffer is an empty buffer ready to use.
+type Buffer struct {
+ buf []byte // contents are the bytes buf[off : len(buf)]
+ off int // read at &buf[off], write at &buf[len(buf)]
+ runeBytes [utf8.UTFMax]byte // avoid allocation of slice on each WriteByte or Rune
+ bootstrap [64]byte // memory to hold first slice; helps small buffers (Printf) avoid allocation.
+ lastRead readOp // last read operation, so that Unread* can work correctly.
+}
+
+// The readOp constants describe the last action performed on
+// the buffer, so that UnreadRune and UnreadByte can
+// check for invalid usage.
+type readOp int
+
+const (
+ opInvalid readOp = iota // Non-read operation.
+ opReadRune // Read rune.
+ opRead // Any other read operation.
+)
+
+// ErrTooLarge is passed to panic if memory cannot be allocated to store data in a buffer.
+var ErrTooLarge = errors.New("bytes.Buffer: too large")
+
+// Bytes returns a slice of the contents of the unread portion of the buffer;
+// len(b.Bytes()) == b.Len(). If the caller changes the contents of the
+// returned slice, the contents of the buffer will change provided there
+// are no intervening method calls on the Buffer.
+func (b *Buffer) Bytes() []byte { return b.buf[b.off:] }
+
+// String returns the contents of the unread portion of the buffer
+// as a string. If the Buffer is a nil pointer, it returns "".
+func (b *Buffer) String() string {
+ if b == nil {
+ // Special case, useful in debugging.
+ return ""
+ }
+ return string(b.buf[b.off:])
+}
+
+// Len returns the number of bytes of the unread portion of the buffer;
+// b.Len() == len(b.Bytes()).
+func (b *Buffer) Len() int { return len(b.buf) - b.off }
+
+// Truncate discards all but the first n unread bytes from the buffer.
+// It panics if n is negative or greater than the length of the buffer.
+func (b *Buffer) Truncate(n int) {
+ b.lastRead = opInvalid
+ switch {
+ case n < 0 || n > b.Len():
+ panic("bytes.Buffer: truncation out of range")
+ case n == 0:
+ // Reuse buffer space.
+ b.off = 0
+ }
+ b.buf = b.buf[0 : b.off+n]
+}
+
+// Reset resets the buffer so it has no content.
+// b.Reset() is the same as b.Truncate(0).
+func (b *Buffer) Reset() { b.Truncate(0) }
+
+// grow grows the buffer to guarantee space for n more bytes.
+// It returns the index where bytes should be written.
+// If the buffer can't grow it will panic with ErrTooLarge.
+func (b *Buffer) grow(n int) int {
+ m := b.Len()
+ // If buffer is empty, reset to recover space.
+ if m == 0 && b.off != 0 {
+ b.Truncate(0)
+ }
+ if len(b.buf)+n > cap(b.buf) {
+ var buf []byte
+ if b.buf == nil && n <= len(b.bootstrap) {
+ buf = b.bootstrap[0:]
+ } else if m+n <= cap(b.buf)/2 {
+ // We can slide things down instead of allocating a new
+ // slice. We only need m+n <= cap(b.buf) to slide, but
+ // we instead let capacity get twice as large so we
+ // don't spend all our time copying.
+ copy(b.buf[:], b.buf[b.off:])
+ buf = b.buf[:m]
+ } else {
+ // not enough space anywhere
+ buf = makeSlice(2*cap(b.buf) + n)
+ copy(buf, b.buf[b.off:])
+ }
+ b.buf = buf
+ b.off = 0
+ }
+ b.buf = b.buf[0 : b.off+m+n]
+ return b.off + m
+}
+
+// Grow grows the buffer's capacity, if necessary, to guarantee space for
+// another n bytes. After Grow(n), at least n bytes can be written to the
+// buffer without another allocation.
+// If n is negative, Grow will panic.
+// If the buffer can't grow it will panic with ErrTooLarge.
+func (b *Buffer) Grow(n int) {
+ if n < 0 {
+ panic("bytes.Buffer.Grow: negative count")
+ }
+ m := b.grow(n)
+ b.buf = b.buf[0:m]
+}
+
+// Write appends the contents of p to the buffer, growing the buffer as
+// needed. The return value n is the length of p; err is always nil. If the
+// buffer becomes too large, Write will panic with ErrTooLarge.
+func (b *Buffer) Write(p []byte) (n int, err error) {
+ b.lastRead = opInvalid
+ m := b.grow(len(p))
+ return copy(b.buf[m:], p), nil
+}
+
+// WriteString appends the contents of s to the buffer, growing the buffer as
+// needed. The return value n is the length of s; err is always nil. If the
+// buffer becomes too large, WriteString will panic with ErrTooLarge.
+func (b *Buffer) WriteString(s string) (n int, err error) {
+ b.lastRead = opInvalid
+ m := b.grow(len(s))
+ return copy(b.buf[m:], s), nil
+}
+
+// MinRead is the minimum slice size passed to a Read call by
+// Buffer.ReadFrom. As long as the Buffer has at least MinRead bytes beyond
+// what is required to hold the contents of r, ReadFrom will not grow the
+// underlying buffer.
+const MinRead = 512
+
+// ReadFrom reads data from r until EOF and appends it to the buffer, growing
+// the buffer as needed. The return value n is the number of bytes read. Any
+// error except io.EOF encountered during the read is also returned. If the
+// buffer becomes too large, ReadFrom will panic with ErrTooLarge.
+func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) {
+ b.lastRead = opInvalid
+ // If buffer is empty, reset to recover space.
+ if b.off >= len(b.buf) {
+ b.Truncate(0)
+ }
+ for {
+ if free := cap(b.buf) - len(b.buf); free < MinRead {
+ // not enough space at end
+ newBuf := b.buf
+ if b.off+free < MinRead {
+ // not enough space using beginning of buffer;
+ // double buffer capacity
+ newBuf = makeSlice(2*cap(b.buf) + MinRead)
+ }
+ copy(newBuf, b.buf[b.off:])
+ b.buf = newBuf[:len(b.buf)-b.off]
+ b.off = 0
+ }
+ m, e := r.Read(b.buf[len(b.buf):cap(b.buf)])
+ b.buf = b.buf[0 : len(b.buf)+m]
+ n += int64(m)
+ if e == io.EOF {
+ break
+ }
+ if e != nil {
+ return n, e
+ }
+ }
+ return n, nil // err is EOF, so return nil explicitly
+}
+
+// makeSlice allocates a slice of size n. If the allocation fails, it panics
+// with ErrTooLarge.
+func makeSlice(n int) []byte {
+ // If the make fails, give a known error.
+ defer func() {
+ if recover() != nil {
+ panic(ErrTooLarge)
+ }
+ }()
+ return make([]byte, n)
+}
+
+// WriteTo writes data to w until the buffer is drained or an error occurs.
+// The return value n is the number of bytes written; it always fits into an
+// int, but it is int64 to match the io.WriterTo interface. Any error
+// encountered during the write is also returned.
+func (b *Buffer) WriteTo(w io.Writer) (n int64, err error) {
+ b.lastRead = opInvalid
+ if b.off < len(b.buf) {
+ nBytes := b.Len()
+ m, e := w.Write(b.buf[b.off:])
+ if m > nBytes {
+ panic("bytes.Buffer.WriteTo: invalid Write count")
+ }
+ b.off += m
+ n = int64(m)
+ if e != nil {
+ return n, e
+ }
+ // all bytes should have been written, by definition of
+ // Write method in io.Writer
+ if m != nBytes {
+ return n, io.ErrShortWrite
+ }
+ }
+ // Buffer is now empty; reset.
+ b.Truncate(0)
+ return
+}
+
+// WriteByte appends the byte c to the buffer, growing the buffer as needed.
+// The returned error is always nil, but is included to match bufio.Writer's
+// WriteByte. If the buffer becomes too large, WriteByte will panic with
+// ErrTooLarge.
+func (b *Buffer) WriteByte(c byte) error {
+ b.lastRead = opInvalid
+ m := b.grow(1)
+ b.buf[m] = c
+ return nil
+}
+
+// WriteRune appends the UTF-8 encoding of Unicode code point r to the
+// buffer, returning its length and an error, which is always nil but is
+// included to match bufio.Writer's WriteRune. The buffer is grown as needed;
+// if it becomes too large, WriteRune will panic with ErrTooLarge.
+func (b *Buffer) WriteRune(r rune) (n int, err error) {
+ if r < utf8.RuneSelf {
+ b.WriteByte(byte(r))
+ return 1, nil
+ }
+ n = utf8.EncodeRune(b.runeBytes[0:], r)
+ b.Write(b.runeBytes[0:n])
+ return n, nil
+}
+
+// Read reads the next len(p) bytes from the buffer or until the buffer
+// is drained. The return value n is the number of bytes read. If the
+// buffer has no data to return, err is io.EOF (unless len(p) is zero);
+// otherwise it is nil.
+func (b *Buffer) Read(p []byte) (n int, err error) {
+ b.lastRead = opInvalid
+ if b.off >= len(b.buf) {
+ // Buffer is empty, reset to recover space.
+ b.Truncate(0)
+ if len(p) == 0 {
+ return
+ }
+ return 0, io.EOF
+ }
+ n = copy(p, b.buf[b.off:])
+ b.off += n
+ if n > 0 {
+ b.lastRead = opRead
+ }
+ return
+}
+
+// Next returns a slice containing the next n bytes from the buffer,
+// advancing the buffer as if the bytes had been returned by Read.
+// If there are fewer than n bytes in the buffer, Next returns the entire buffer.
+// The slice is only valid until the next call to a read or write method.
+func (b *Buffer) Next(n int) []byte {
+ b.lastRead = opInvalid
+ m := b.Len()
+ if n > m {
+ n = m
+ }
+ data := b.buf[b.off : b.off+n]
+ b.off += n
+ if n > 0 {
+ b.lastRead = opRead
+ }
+ return data
+}
+
+// ReadByte reads and returns the next byte from the buffer.
+// If no byte is available, it returns error io.EOF.
+func (b *Buffer) ReadByte() (c byte, err error) {
+ b.lastRead = opInvalid
+ if b.off >= len(b.buf) {
+ // Buffer is empty, reset to recover space.
+ b.Truncate(0)
+ return 0, io.EOF
+ }
+ c = b.buf[b.off]
+ b.off++
+ b.lastRead = opRead
+ return c, nil
+}
+
+// ReadRune reads and returns the next UTF-8-encoded
+// Unicode code point from the buffer.
+// If no bytes are available, the error returned is io.EOF.
+// If the bytes are an erroneous UTF-8 encoding, it
+// consumes one byte and returns U+FFFD, 1.
+func (b *Buffer) ReadRune() (r rune, size int, err error) {
+ b.lastRead = opInvalid
+ if b.off >= len(b.buf) {
+ // Buffer is empty, reset to recover space.
+ b.Truncate(0)
+ return 0, 0, io.EOF
+ }
+ b.lastRead = opReadRune
+ c := b.buf[b.off]
+ if c < utf8.RuneSelf {
+ b.off++
+ return rune(c), 1, nil
+ }
+ r, n := utf8.DecodeRune(b.buf[b.off:])
+ b.off += n
+ return r, n, nil
+}
+
+// UnreadRune unreads the last rune returned by ReadRune.
+// If the most recent read or write operation on the buffer was
+// not a ReadRune, UnreadRune returns an error. (In this regard
+// it is stricter than UnreadByte, which will unread the last byte
+// from any read operation.)
+func (b *Buffer) UnreadRune() error {
+ if b.lastRead != opReadRune {
+ return errors.New("bytes.Buffer: UnreadRune: previous operation was not ReadRune")
+ }
+ b.lastRead = opInvalid
+ if b.off > 0 {
+ _, n := utf8.DecodeLastRune(b.buf[0:b.off])
+ b.off -= n
+ }
+ return nil
+}
+
+// UnreadByte unreads the last byte returned by the most recent
+// read operation. If write has happened since the last read, UnreadByte
+// returns an error.
+func (b *Buffer) UnreadByte() error {
+ if b.lastRead != opReadRune && b.lastRead != opRead {
+ return errors.New("bytes.Buffer: UnreadByte: previous operation was not a read")
+ }
+ b.lastRead = opInvalid
+ if b.off > 0 {
+ b.off--
+ }
+ return nil
+}
+
+// ReadBytes reads until the first occurrence of delim in the input,
+// returning a slice containing the data up to and including the delimiter.
+// If ReadBytes encounters an error before finding a delimiter,
+// it returns the data read before the error and the error itself (often io.EOF).
+// ReadBytes returns err != nil if and only if the returned data does not end in
+// delim.
+func (b *Buffer) ReadBytes(delim byte) (line []byte, err error) {
+ slice, err := b.readSlice(delim)
+ // return a copy of slice. The buffer's backing array may
+ // be overwritten by later calls.
+ line = append(line, slice...)
+ return
+}
+
+// readSlice is like ReadBytes but returns a reference to internal buffer data.
+func (b *Buffer) readSlice(delim byte) (line []byte, err error) {
+ i := bytes.IndexByte(b.buf[b.off:], delim)
+ end := b.off + i + 1
+ if i < 0 {
+ end = len(b.buf)
+ err = io.EOF
+ }
+ line = b.buf[b.off:end]
+ b.off = end
+ b.lastRead = opRead
+ return line, err
+}
+
+// ReadString reads until the first occurrence of delim in the input,
+// returning a string containing the data up to and including the delimiter.
+// If ReadString encounters an error before finding a delimiter,
+// it returns the data read before the error and the error itself (often io.EOF).
+// ReadString returns err != nil if and only if the returned data does not end
+// in delim.
+func (b *Buffer) ReadString(delim byte) (line string, err error) {
+ slice, err := b.readSlice(delim)
+ return string(slice), err
+}
+
+// NewBuffer creates and initializes a new Buffer using buf as its initial
+// contents. It is intended to prepare a Buffer to read existing data. It
+// can also be used to size the internal buffer for writing. To do that,
+// buf should have the desired capacity but a length of zero.
+//
+// In most cases, new(Buffer) (or just declaring a Buffer variable) is
+// sufficient to initialize a Buffer.
+func NewBuffer(buf []byte) *Buffer { return &Buffer{buf: buf} }
+
+// NewBufferString creates and initializes a new Buffer using string s as its
+// initial contents. It is intended to prepare a buffer to read an existing
+// string.
+//
+// In most cases, new(Buffer) (or just declaring a Buffer variable) is
+// sufficient to initialize a Buffer.
+func NewBufferString(s string) *Buffer {
+ return &Buffer{buf: []byte(s)}
+}
diff --git a/Godeps/_workspace/src/gopkg.in/bufio.v1/buffer_test.go b/Godeps/_workspace/src/gopkg.in/bufio.v1/buffer_test.go
new file mode 100644
index 00000000000..ca1ac210513
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/bufio.v1/buffer_test.go
@@ -0,0 +1,527 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bufio
+
+import (
+ "bytes"
+ "io"
+ "math/rand"
+ "runtime"
+ "testing"
+ "unicode/utf8"
+)
+
+const N = 10000 // make this bigger for a larger (and slower) test
+var data string // test data for write tests
+var testBytes []byte // test data; same as data but as a slice.
+
+func init() {
+ testBytes = make([]byte, N)
+ for i := 0; i < N; i++ {
+ testBytes[i] = 'a' + byte(i%26)
+ }
+ data = string(testBytes)
+}
+
+// Verify that contents of buf match the string s.
+func check(t *testing.T, testname string, buf *Buffer, s string) {
+ bytes := buf.Bytes()
+ str := buf.String()
+ if buf.Len() != len(bytes) {
+ t.Errorf("%s: buf.Len() == %d, len(buf.Bytes()) == %d", testname, buf.Len(), len(bytes))
+ }
+
+ if buf.Len() != len(str) {
+ t.Errorf("%s: buf.Len() == %d, len(buf.String()) == %d", testname, buf.Len(), len(str))
+ }
+
+ if buf.Len() != len(s) {
+ t.Errorf("%s: buf.Len() == %d, len(s) == %d", testname, buf.Len(), len(s))
+ }
+
+ if string(bytes) != s {
+ t.Errorf("%s: string(buf.Bytes()) == %q, s == %q", testname, string(bytes), s)
+ }
+}
+
+// Fill buf through n writes of string fus.
+// The initial contents of buf corresponds to the string s;
+// the result is the final contents of buf returned as a string.
+func fillString(t *testing.T, testname string, buf *Buffer, s string, n int, fus string) string {
+ check(t, testname+" (fill 1)", buf, s)
+ for ; n > 0; n-- {
+ m, err := buf.WriteString(fus)
+ if m != len(fus) {
+ t.Errorf(testname+" (fill 2): m == %d, expected %d", m, len(fus))
+ }
+ if err != nil {
+ t.Errorf(testname+" (fill 3): err should always be nil, found err == %s", err)
+ }
+ s += fus
+ check(t, testname+" (fill 4)", buf, s)
+ }
+ return s
+}
+
+// Fill buf through n writes of byte slice fub.
+// The initial contents of buf corresponds to the string s;
+// the result is the final contents of buf returned as a string.
+func fillBytes(t *testing.T, testname string, buf *Buffer, s string, n int, fub []byte) string {
+ check(t, testname+" (fill 1)", buf, s)
+ for ; n > 0; n-- {
+ m, err := buf.Write(fub)
+ if m != len(fub) {
+ t.Errorf(testname+" (fill 2): m == %d, expected %d", m, len(fub))
+ }
+ if err != nil {
+ t.Errorf(testname+" (fill 3): err should always be nil, found err == %s", err)
+ }
+ s += string(fub)
+ check(t, testname+" (fill 4)", buf, s)
+ }
+ return s
+}
+
+func TestNewBuffer(t *testing.T) {
+ buf := NewBuffer(testBytes)
+ check(t, "NewBuffer", buf, data)
+}
+
+func TestNewBufferString(t *testing.T) {
+ buf := NewBufferString(data)
+ check(t, "NewBufferString", buf, data)
+}
+
+// Empty buf through repeated reads into fub.
+// The initial contents of buf corresponds to the string s.
+func empty(t *testing.T, testname string, buf *Buffer, s string, fub []byte) {
+ check(t, testname+" (empty 1)", buf, s)
+
+ for {
+ n, err := buf.Read(fub)
+ if n == 0 {
+ break
+ }
+ if err != nil {
+ t.Errorf(testname+" (empty 2): err should always be nil, found err == %s", err)
+ }
+ s = s[n:]
+ check(t, testname+" (empty 3)", buf, s)
+ }
+
+ check(t, testname+" (empty 4)", buf, "")
+}
+
+func TestBasicOperations(t *testing.T) {
+ var buf Buffer
+
+ for i := 0; i < 5; i++ {
+ check(t, "TestBasicOperations (1)", &buf, "")
+
+ buf.Reset()
+ check(t, "TestBasicOperations (2)", &buf, "")
+
+ buf.Truncate(0)
+ check(t, "TestBasicOperations (3)", &buf, "")
+
+ n, err := buf.Write([]byte(data[0:1]))
+ if n != 1 {
+ t.Errorf("wrote 1 byte, but n == %d", n)
+ }
+ if err != nil {
+ t.Errorf("err should always be nil, but err == %s", err)
+ }
+ check(t, "TestBasicOperations (4)", &buf, "a")
+
+ buf.WriteByte(data[1])
+ check(t, "TestBasicOperations (5)", &buf, "ab")
+
+ n, err = buf.Write([]byte(data[2:26]))
+ if n != 24 {
+ t.Errorf("wrote 25 bytes, but n == %d", n)
+ }
+ check(t, "TestBasicOperations (6)", &buf, string(data[0:26]))
+
+ buf.Truncate(26)
+ check(t, "TestBasicOperations (7)", &buf, string(data[0:26]))
+
+ buf.Truncate(20)
+ check(t, "TestBasicOperations (8)", &buf, string(data[0:20]))
+
+ empty(t, "TestBasicOperations (9)", &buf, string(data[0:20]), make([]byte, 5))
+ empty(t, "TestBasicOperations (10)", &buf, "", make([]byte, 100))
+
+ buf.WriteByte(data[1])
+ c, err := buf.ReadByte()
+ if err != nil {
+ t.Error("ReadByte unexpected eof")
+ }
+ if c != data[1] {
+ t.Errorf("ReadByte wrong value c=%v", c)
+ }
+ c, err = buf.ReadByte()
+ if err == nil {
+ t.Error("ReadByte unexpected not eof")
+ }
+ }
+}
+
+func TestLargeStringWrites(t *testing.T) {
+ var buf Buffer
+ limit := 30
+ if testing.Short() {
+ limit = 9
+ }
+ for i := 3; i < limit; i += 3 {
+ s := fillString(t, "TestLargeWrites (1)", &buf, "", 5, data)
+ empty(t, "TestLargeStringWrites (2)", &buf, s, make([]byte, len(data)/i))
+ }
+ check(t, "TestLargeStringWrites (3)", &buf, "")
+}
+
+func TestLargeByteWrites(t *testing.T) {
+ var buf Buffer
+ limit := 30
+ if testing.Short() {
+ limit = 9
+ }
+ for i := 3; i < limit; i += 3 {
+ s := fillBytes(t, "TestLargeWrites (1)", &buf, "", 5, testBytes)
+ empty(t, "TestLargeByteWrites (2)", &buf, s, make([]byte, len(data)/i))
+ }
+ check(t, "TestLargeByteWrites (3)", &buf, "")
+}
+
+func TestLargeStringReads(t *testing.T) {
+ var buf Buffer
+ for i := 3; i < 30; i += 3 {
+ s := fillString(t, "TestLargeReads (1)", &buf, "", 5, data[0:len(data)/i])
+ empty(t, "TestLargeReads (2)", &buf, s, make([]byte, len(data)))
+ }
+ check(t, "TestLargeStringReads (3)", &buf, "")
+}
+
+func TestLargeByteReads(t *testing.T) {
+ var buf Buffer
+ for i := 3; i < 30; i += 3 {
+ s := fillBytes(t, "TestLargeReads (1)", &buf, "", 5, testBytes[0:len(testBytes)/i])
+ empty(t, "TestLargeReads (2)", &buf, s, make([]byte, len(data)))
+ }
+ check(t, "TestLargeByteReads (3)", &buf, "")
+}
+
+func TestMixedReadsAndWrites(t *testing.T) {
+ var buf Buffer
+ s := ""
+ for i := 0; i < 50; i++ {
+ wlen := rand.Intn(len(data))
+ if i%2 == 0 {
+ s = fillString(t, "TestMixedReadsAndWrites (1)", &buf, s, 1, data[0:wlen])
+ } else {
+ s = fillBytes(t, "TestMixedReadsAndWrites (1)", &buf, s, 1, testBytes[0:wlen])
+ }
+
+ rlen := rand.Intn(len(data))
+ fub := make([]byte, rlen)
+ n, _ := buf.Read(fub)
+ s = s[n:]
+ }
+ empty(t, "TestMixedReadsAndWrites (2)", &buf, s, make([]byte, buf.Len()))
+}
+
+func TestNil(t *testing.T) {
+ var b *Buffer
+ if b.String() != "" {
+ t.Errorf("expected ; got %q", b.String())
+ }
+}
+
+func TestReadFrom(t *testing.T) {
+ var buf Buffer
+ for i := 3; i < 30; i += 3 {
+ s := fillBytes(t, "TestReadFrom (1)", &buf, "", 5, testBytes[0:len(testBytes)/i])
+ var b Buffer
+ b.ReadFrom(&buf)
+ empty(t, "TestReadFrom (2)", &b, s, make([]byte, len(data)))
+ }
+}
+
+func TestWriteTo(t *testing.T) {
+ var buf Buffer
+ for i := 3; i < 30; i += 3 {
+ s := fillBytes(t, "TestWriteTo (1)", &buf, "", 5, testBytes[0:len(testBytes)/i])
+ var b Buffer
+ buf.WriteTo(&b)
+ empty(t, "TestWriteTo (2)", &b, s, make([]byte, len(data)))
+ }
+}
+
+func TestRuneIO(t *testing.T) {
+ const NRune = 1000
+ // Built a test slice while we write the data
+ b := make([]byte, utf8.UTFMax*NRune)
+ var buf Buffer
+ n := 0
+ for r := rune(0); r < NRune; r++ {
+ size := utf8.EncodeRune(b[n:], r)
+ nbytes, err := buf.WriteRune(r)
+ if err != nil {
+ t.Fatalf("WriteRune(%U) error: %s", r, err)
+ }
+ if nbytes != size {
+ t.Fatalf("WriteRune(%U) expected %d, got %d", r, size, nbytes)
+ }
+ n += size
+ }
+ b = b[0:n]
+
+ // Check the resulting bytes
+ if !bytes.Equal(buf.Bytes(), b) {
+ t.Fatalf("incorrect result from WriteRune: %q not %q", buf.Bytes(), b)
+ }
+
+ p := make([]byte, utf8.UTFMax)
+ // Read it back with ReadRune
+ for r := rune(0); r < NRune; r++ {
+ size := utf8.EncodeRune(p, r)
+ nr, nbytes, err := buf.ReadRune()
+ if nr != r || nbytes != size || err != nil {
+ t.Fatalf("ReadRune(%U) got %U,%d not %U,%d (err=%s)", r, nr, nbytes, r, size, err)
+ }
+ }
+
+ // Check that UnreadRune works
+ buf.Reset()
+ buf.Write(b)
+ for r := rune(0); r < NRune; r++ {
+ r1, size, _ := buf.ReadRune()
+ if err := buf.UnreadRune(); err != nil {
+ t.Fatalf("UnreadRune(%U) got error %q", r, err)
+ }
+ r2, nbytes, err := buf.ReadRune()
+ if r1 != r2 || r1 != r || nbytes != size || err != nil {
+ t.Fatalf("ReadRune(%U) after UnreadRune got %U,%d not %U,%d (err=%s)", r, r2, nbytes, r, size, err)
+ }
+ }
+}
+
+func TestNext(t *testing.T) {
+ b := []byte{0, 1, 2, 3, 4}
+ tmp := make([]byte, 5)
+ for i := 0; i <= 5; i++ {
+ for j := i; j <= 5; j++ {
+ for k := 0; k <= 6; k++ {
+ // 0 <= i <= j <= 5; 0 <= k <= 6
+ // Check that if we start with a buffer
+ // of length j at offset i and ask for
+ // Next(k), we get the right bytes.
+ buf := NewBuffer(b[0:j])
+ n, _ := buf.Read(tmp[0:i])
+ if n != i {
+ t.Fatalf("Read %d returned %d", i, n)
+ }
+ bb := buf.Next(k)
+ want := k
+ if want > j-i {
+ want = j - i
+ }
+ if len(bb) != want {
+ t.Fatalf("in %d,%d: len(Next(%d)) == %d", i, j, k, len(bb))
+ }
+ for l, v := range bb {
+ if v != byte(l+i) {
+ t.Fatalf("in %d,%d: Next(%d)[%d] = %d, want %d", i, j, k, l, v, l+i)
+ }
+ }
+ }
+ }
+ }
+}
+
+var readBytesTests = []struct {
+ buffer string
+ delim byte
+ expected []string
+ err error
+}{
+ {"", 0, []string{""}, io.EOF},
+ {"a\x00", 0, []string{"a\x00"}, nil},
+ {"abbbaaaba", 'b', []string{"ab", "b", "b", "aaab"}, nil},
+ {"hello\x01world", 1, []string{"hello\x01"}, nil},
+ {"foo\nbar", 0, []string{"foo\nbar"}, io.EOF},
+ {"alpha\nbeta\ngamma\n", '\n', []string{"alpha\n", "beta\n", "gamma\n"}, nil},
+ {"alpha\nbeta\ngamma", '\n', []string{"alpha\n", "beta\n", "gamma"}, io.EOF},
+}
+
+func TestReadBytes(t *testing.T) {
+ for _, test := range readBytesTests {
+ buf := NewBufferString(test.buffer)
+ var err error
+ for _, expected := range test.expected {
+ var bytes []byte
+ bytes, err = buf.ReadBytes(test.delim)
+ if string(bytes) != expected {
+ t.Errorf("expected %q, got %q", expected, bytes)
+ }
+ if err != nil {
+ break
+ }
+ }
+ if err != test.err {
+ t.Errorf("expected error %v, got %v", test.err, err)
+ }
+ }
+}
+
+func TestReadString(t *testing.T) {
+ for _, test := range readBytesTests {
+ buf := NewBufferString(test.buffer)
+ var err error
+ for _, expected := range test.expected {
+ var s string
+ s, err = buf.ReadString(test.delim)
+ if s != expected {
+ t.Errorf("expected %q, got %q", expected, s)
+ }
+ if err != nil {
+ break
+ }
+ }
+ if err != test.err {
+ t.Errorf("expected error %v, got %v", test.err, err)
+ }
+ }
+}
+
+func BenchmarkReadString(b *testing.B) {
+ const n = 32 << 10
+
+ data := make([]byte, n)
+ data[n-1] = 'x'
+ b.SetBytes(int64(n))
+ for i := 0; i < b.N; i++ {
+ buf := NewBuffer(data)
+ _, err := buf.ReadString('x')
+ if err != nil {
+ b.Fatal(err)
+ }
+ }
+}
+
+func TestGrow(t *testing.T) {
+ x := []byte{'x'}
+ y := []byte{'y'}
+ tmp := make([]byte, 72)
+ for _, startLen := range []int{0, 100, 1000, 10000, 100000} {
+ xBytes := bytes.Repeat(x, startLen)
+ for _, growLen := range []int{0, 100, 1000, 10000, 100000} {
+ buf := NewBuffer(xBytes)
+ // If we read, this affects buf.off, which is good to test.
+ readBytes, _ := buf.Read(tmp)
+ buf.Grow(growLen)
+ yBytes := bytes.Repeat(y, growLen)
+ // Check no allocation occurs in write, as long as we're single-threaded.
+ var m1, m2 runtime.MemStats
+ runtime.ReadMemStats(&m1)
+ buf.Write(yBytes)
+ runtime.ReadMemStats(&m2)
+ if runtime.GOMAXPROCS(-1) == 1 && m1.Mallocs != m2.Mallocs {
+ t.Errorf("allocation occurred during write")
+ }
+ // Check that buffer has correct data.
+ if !bytes.Equal(buf.Bytes()[0:startLen-readBytes], xBytes[readBytes:]) {
+ t.Errorf("bad initial data at %d %d", startLen, growLen)
+ }
+ if !bytes.Equal(buf.Bytes()[startLen-readBytes:startLen-readBytes+growLen], yBytes) {
+ t.Errorf("bad written data at %d %d", startLen, growLen)
+ }
+ }
+ }
+}
+
+// Was a bug: used to give EOF reading empty slice at EOF.
+func TestReadEmptyAtEOF(t *testing.T) {
+ b := new(Buffer)
+ slice := make([]byte, 0)
+ n, err := b.Read(slice)
+ if err != nil {
+ t.Errorf("read error: %v", err)
+ }
+ if n != 0 {
+ t.Errorf("wrong count; got %d want 0", n)
+ }
+}
+
+func TestBufferUnreadByte(t *testing.T) {
+ b := new(Buffer)
+ b.WriteString("abcdefghijklmnopqrstuvwxyz")
+
+ _, err := b.ReadBytes('m')
+ if err != nil {
+ t.Fatalf("ReadBytes: %v", err)
+ }
+
+ err = b.UnreadByte()
+ if err != nil {
+ t.Fatalf("UnreadByte: %v", err)
+ }
+ c, err := b.ReadByte()
+ if err != nil {
+ t.Fatalf("ReadByte: %v", err)
+ }
+ if c != 'm' {
+ t.Errorf("ReadByte = %q; want %q", c, 'm')
+ }
+}
+
+// Tests that we occasionally compact. Issue 5154.
+func TestBufferGrowth(t *testing.T) {
+ var b Buffer
+ buf := make([]byte, 1024)
+ b.Write(buf[0:1])
+ var cap0 int
+ for i := 0; i < 5<<10; i++ {
+ b.Write(buf)
+ b.Read(buf)
+ if i == 0 {
+ cap0 = b.Cap()
+ }
+ }
+ cap1 := b.Cap()
+ // (*Buffer).grow allows for 2x capacity slop before sliding,
+ // so set our error threshold at 3x.
+ if cap1 > cap0*3 {
+ t.Errorf("buffer cap = %d; too big (grew from %d)", cap1, cap0)
+ }
+}
+
+// From Issue 5154.
+func BenchmarkBufferNotEmptyWriteRead(b *testing.B) {
+ buf := make([]byte, 1024)
+ for i := 0; i < b.N; i++ {
+ var b Buffer
+ b.Write(buf[0:1])
+ for i := 0; i < 5<<10; i++ {
+ b.Write(buf)
+ b.Read(buf)
+ }
+ }
+}
+
+// Check that we don't compact too often. From Issue 5154.
+func BenchmarkBufferFullSmallReads(b *testing.B) {
+ buf := make([]byte, 1024)
+ for i := 0; i < b.N; i++ {
+ var b Buffer
+ b.Write(buf)
+ for b.Len()+20 < b.Cap() {
+ b.Write(buf[:10])
+ }
+ for i := 0; i < 5<<10; i++ {
+ b.Read(buf[:1])
+ b.Write(buf[:1])
+ }
+ }
+}
diff --git a/Godeps/_workspace/src/gopkg.in/bufio.v1/bufio.go b/Godeps/_workspace/src/gopkg.in/bufio.v1/bufio.go
new file mode 100644
index 00000000000..8f5cdc084d4
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/bufio.v1/bufio.go
@@ -0,0 +1,728 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer
+// object, creating another object (Reader or Writer) that also implements
+// the interface but provides buffering and some help for textual I/O.
+package bufio
+
+import (
+ "bytes"
+ "errors"
+ "io"
+ "unicode/utf8"
+)
+
+const (
+ defaultBufSize = 4096
+)
+
+var (
+ ErrInvalidUnreadByte = errors.New("bufio: invalid use of UnreadByte")
+ ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune")
+ ErrBufferFull = errors.New("bufio: buffer full")
+ ErrNegativeCount = errors.New("bufio: negative count")
+)
+
+// Buffered input.
+
+// Reader implements buffering for an io.Reader object.
+type Reader struct {
+ buf []byte
+ rd io.Reader
+ r, w int
+ err error
+ lastByte int
+ lastRuneSize int
+}
+
+const minReadBufferSize = 16
+const maxConsecutiveEmptyReads = 100
+
+// NewReaderSize returns a new Reader whose buffer has at least the specified
+// size. If the argument io.Reader is already a Reader with large enough
+// size, it returns the underlying Reader.
+func NewReaderSize(rd io.Reader, size int) *Reader {
+ // Is it already a Reader?
+ b, ok := rd.(*Reader)
+ if ok && len(b.buf) >= size {
+ return b
+ }
+ if size < minReadBufferSize {
+ size = minReadBufferSize
+ }
+ r := new(Reader)
+ r.reset(make([]byte, size), rd)
+ return r
+}
+
+// NewReader returns a new Reader whose buffer has the default size.
+func NewReader(rd io.Reader) *Reader {
+ return NewReaderSize(rd, defaultBufSize)
+}
+
+// Reset discards any buffered data, resets all state, and switches
+// the buffered reader to read from r.
+func (b *Reader) Reset(r io.Reader) {
+ b.reset(b.buf, r)
+}
+
+func (b *Reader) reset(buf []byte, r io.Reader) {
+ *b = Reader{
+ buf: buf,
+ rd: r,
+ lastByte: -1,
+ lastRuneSize: -1,
+ }
+}
+
+var errNegativeRead = errors.New("bufio: reader returned negative count from Read")
+
+// fill reads a new chunk into the buffer.
+func (b *Reader) fill() {
+ // Slide existing data to beginning.
+ if b.r > 0 {
+ copy(b.buf, b.buf[b.r:b.w])
+ b.w -= b.r
+ b.r = 0
+ }
+
+ if b.w >= len(b.buf) {
+ panic("bufio: tried to fill full buffer")
+ }
+
+ // Read new data: try a limited number of times.
+ for i := maxConsecutiveEmptyReads; i > 0; i-- {
+ n, err := b.rd.Read(b.buf[b.w:])
+ if n < 0 {
+ panic(errNegativeRead)
+ }
+ b.w += n
+ if err != nil {
+ b.err = err
+ return
+ }
+ if n > 0 {
+ return
+ }
+ }
+ b.err = io.ErrNoProgress
+}
+
+func (b *Reader) readErr() error {
+ err := b.err
+ b.err = nil
+ return err
+}
+
+// Peek returns the next n bytes without advancing the reader. The bytes stop
+// being valid at the next read call. If Peek returns fewer than n bytes, it
+// also returns an error explaining why the read is short. The error is
+// ErrBufferFull if n is larger than b's buffer size.
+func (b *Reader) Peek(n int) ([]byte, error) {
+ if n < 0 {
+ return nil, ErrNegativeCount
+ }
+ if n > len(b.buf) {
+ return nil, ErrBufferFull
+ }
+ // 0 <= n <= len(b.buf)
+ for b.w-b.r < n && b.err == nil {
+ b.fill() // b.w-b.r < len(b.buf) => buffer is not full
+ }
+ m := b.w - b.r
+ if m > n {
+ m = n
+ }
+ var err error
+ if m < n {
+ err = b.readErr()
+ if err == nil {
+ err = ErrBufferFull
+ }
+ }
+ return b.buf[b.r : b.r+m], err
+}
+
+// Read reads data into p.
+// It returns the number of bytes read into p.
+// It calls Read at most once on the underlying Reader,
+// hence n may be less than len(p).
+// At EOF, the count will be zero and err will be io.EOF.
+func (b *Reader) Read(p []byte) (n int, err error) {
+ n = len(p)
+ if n == 0 {
+ return 0, b.readErr()
+ }
+ if b.r == b.w {
+ if b.err != nil {
+ return 0, b.readErr()
+ }
+ if len(p) >= len(b.buf) {
+ // Large read, empty buffer.
+ // Read directly into p to avoid copy.
+ n, b.err = b.rd.Read(p)
+ if n < 0 {
+ panic(errNegativeRead)
+ }
+ if n > 0 {
+ b.lastByte = int(p[n-1])
+ b.lastRuneSize = -1
+ }
+ return n, b.readErr()
+ }
+ b.fill() // buffer is empty
+ if b.w == b.r {
+ return 0, b.readErr()
+ }
+ }
+
+ if n > b.w-b.r {
+ n = b.w - b.r
+ }
+ copy(p[0:n], b.buf[b.r:])
+ b.r += n
+ b.lastByte = int(b.buf[b.r-1])
+ b.lastRuneSize = -1
+ return n, nil
+}
+
+// ReadByte reads and returns a single byte.
+// If no byte is available, returns an error.
+func (b *Reader) ReadByte() (c byte, err error) {
+ b.lastRuneSize = -1
+ for b.r == b.w {
+ if b.err != nil {
+ return 0, b.readErr()
+ }
+ b.fill() // buffer is empty
+ }
+ c = b.buf[b.r]
+ b.r++
+ b.lastByte = int(c)
+ return c, nil
+}
+
+// UnreadByte unreads the last byte. Only the most recently read byte can be unread.
+func (b *Reader) UnreadByte() error {
+ if b.lastByte < 0 || b.r == 0 && b.w > 0 {
+ return ErrInvalidUnreadByte
+ }
+ // b.r > 0 || b.w == 0
+ if b.r > 0 {
+ b.r--
+ } else {
+ // b.r == 0 && b.w == 0
+ b.w = 1
+ }
+ b.buf[b.r] = byte(b.lastByte)
+ b.lastByte = -1
+ b.lastRuneSize = -1
+ return nil
+}
+
+// ReadRune reads a single UTF-8 encoded Unicode character and returns the
+// rune and its size in bytes. If the encoded rune is invalid, it consumes one byte
+// and returns unicode.ReplacementChar (U+FFFD) with a size of 1.
+func (b *Reader) ReadRune() (r rune, size int, err error) {
+ for b.r+utf8.UTFMax > b.w && !utf8.FullRune(b.buf[b.r:b.w]) && b.err == nil && b.w-b.r < len(b.buf) {
+ b.fill() // b.w-b.r < len(buf) => buffer is not full
+ }
+ b.lastRuneSize = -1
+ if b.r == b.w {
+ return 0, 0, b.readErr()
+ }
+ r, size = rune(b.buf[b.r]), 1
+ if r >= 0x80 {
+ r, size = utf8.DecodeRune(b.buf[b.r:b.w])
+ }
+ b.r += size
+ b.lastByte = int(b.buf[b.r-1])
+ b.lastRuneSize = size
+ return r, size, nil
+}
+
+// UnreadRune unreads the last rune. If the most recent read operation on
+// the buffer was not a ReadRune, UnreadRune returns an error. (In this
+// regard it is stricter than UnreadByte, which will unread the last byte
+// from any read operation.)
+func (b *Reader) UnreadRune() error {
+ if b.lastRuneSize < 0 || b.r < b.lastRuneSize {
+ return ErrInvalidUnreadRune
+ }
+ b.r -= b.lastRuneSize
+ b.lastByte = -1
+ b.lastRuneSize = -1
+ return nil
+}
+
+// Buffered returns the number of bytes that can be read from the current buffer.
+func (b *Reader) Buffered() int { return b.w - b.r }
+
+// ReadSlice reads until the first occurrence of delim in the input,
+// returning a slice pointing at the bytes in the buffer.
+// The bytes stop being valid at the next read.
+// If ReadSlice encounters an error before finding a delimiter,
+// it returns all the data in the buffer and the error itself (often io.EOF).
+// ReadSlice fails with error ErrBufferFull if the buffer fills without a delim.
+// Because the data returned from ReadSlice will be overwritten
+// by the next I/O operation, most clients should use
+// ReadBytes or ReadString instead.
+// ReadSlice returns err != nil if and only if line does not end in delim.
+func (b *Reader) ReadSlice(delim byte) (line []byte, err error) {
+ for {
+ // Search buffer.
+ if i := bytes.IndexByte(b.buf[b.r:b.w], delim); i >= 0 {
+ line = b.buf[b.r : b.r+i+1]
+ b.r += i + 1
+ break
+ }
+
+ // Pending error?
+ if b.err != nil {
+ line = b.buf[b.r:b.w]
+ b.r = b.w
+ err = b.readErr()
+ break
+ }
+
+ // Buffer full?
+ if n := b.Buffered(); n >= len(b.buf) {
+ b.r = b.w
+ line = b.buf
+ err = ErrBufferFull
+ break
+ }
+
+ b.fill() // buffer is not full
+ }
+
+ // Handle last byte, if any.
+ if i := len(line) - 1; i >= 0 {
+ b.lastByte = int(line[i])
+ }
+
+ return
+}
+
+// ReadN tries to read exactly n bytes.
+// The bytes stop being valid at the next read call.
+// If ReadN encounters an error before reading n bytes,
+// it returns all the data in the buffer and the error itself (often io.EOF).
+// ReadN fails with error ErrBufferFull if the buffer fills
+// without reading N bytes.
+// Because the data returned from ReadN will be overwritten
+// by the next I/O operation, most clients should use
+// ReadBytes or ReadString instead.
+func (b *Reader) ReadN(n int) ([]byte, error) {
+ for b.Buffered() < n {
+ if b.err != nil {
+ buf := b.buf[b.r:b.w]
+ b.r = b.w
+ return buf, b.readErr()
+ }
+
+ // Buffer is full?
+ if b.Buffered() >= len(b.buf) {
+ b.r = b.w
+ return b.buf, ErrBufferFull
+ }
+
+ b.fill()
+ }
+ buf := b.buf[b.r : b.r+n]
+ b.r += n
+ return buf, nil
+}
+
+// ReadLine is a low-level line-reading primitive. Most callers should use
+// ReadBytes('\n') or ReadString('\n') instead or use a Scanner.
+//
+// ReadLine tries to return a single line, not including the end-of-line bytes.
+// If the line was too long for the buffer then isPrefix is set and the
+// beginning of the line is returned. The rest of the line will be returned
+// from future calls. isPrefix will be false when returning the last fragment
+// of the line. The returned buffer is only valid until the next call to
+// ReadLine. ReadLine either returns a non-nil line or it returns an error,
+// never both.
+//
+// The text returned from ReadLine does not include the line end ("\r\n" or "\n").
+// No indication or error is given if the input ends without a final line end.
+// Calling UnreadByte after ReadLine will always unread the last byte read
+// (possibly a character belonging to the line end) even if that byte is not
+// part of the line returned by ReadLine.
+func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) {
+ line, err = b.ReadSlice('\n')
+ if err == ErrBufferFull {
+ // Handle the case where "\r\n" straddles the buffer.
+ if len(line) > 0 && line[len(line)-1] == '\r' {
+ // Put the '\r' back on buf and drop it from line.
+ // Let the next call to ReadLine check for "\r\n".
+ if b.r == 0 {
+ // should be unreachable
+ panic("bufio: tried to rewind past start of buffer")
+ }
+ b.r--
+ line = line[:len(line)-1]
+ }
+ return line, true, nil
+ }
+
+ if len(line) == 0 {
+ if err != nil {
+ line = nil
+ }
+ return
+ }
+ err = nil
+
+ if line[len(line)-1] == '\n' {
+ drop := 1
+ if len(line) > 1 && line[len(line)-2] == '\r' {
+ drop = 2
+ }
+ line = line[:len(line)-drop]
+ }
+ return
+}
+
+// ReadBytes reads until the first occurrence of delim in the input,
+// returning a slice containing the data up to and including the delimiter.
+// If ReadBytes encounters an error before finding a delimiter,
+// it returns the data read before the error and the error itself (often io.EOF).
+// ReadBytes returns err != nil if and only if the returned data does not end in
+// delim.
+// For simple uses, a Scanner may be more convenient.
+func (b *Reader) ReadBytes(delim byte) (line []byte, err error) {
+ // Use ReadSlice to look for array,
+ // accumulating full buffers.
+ var frag []byte
+ var full [][]byte
+ err = nil
+
+ for {
+ var e error
+ frag, e = b.ReadSlice(delim)
+ if e == nil { // got final fragment
+ break
+ }
+ if e != ErrBufferFull { // unexpected error
+ err = e
+ break
+ }
+
+ // Make a copy of the buffer.
+ buf := make([]byte, len(frag))
+ copy(buf, frag)
+ full = append(full, buf)
+ }
+
+ // Allocate new buffer to hold the full pieces and the fragment.
+ n := 0
+ for i := range full {
+ n += len(full[i])
+ }
+ n += len(frag)
+
+ // Copy full pieces and fragment in.
+ buf := make([]byte, n)
+ n = 0
+ for i := range full {
+ n += copy(buf[n:], full[i])
+ }
+ copy(buf[n:], frag)
+ return buf, err
+}
+
+// ReadString reads until the first occurrence of delim in the input,
+// returning a string containing the data up to and including the delimiter.
+// If ReadString encounters an error before finding a delimiter,
+// it returns the data read before the error and the error itself (often io.EOF).
+// ReadString returns err != nil if and only if the returned data does not end in
+// delim.
+// For simple uses, a Scanner may be more convenient.
+func (b *Reader) ReadString(delim byte) (line string, err error) {
+ bytes, err := b.ReadBytes(delim)
+ line = string(bytes)
+ return line, err
+}
+
+// WriteTo implements io.WriterTo.
+func (b *Reader) WriteTo(w io.Writer) (n int64, err error) {
+ n, err = b.writeBuf(w)
+ if err != nil {
+ return
+ }
+
+ if r, ok := b.rd.(io.WriterTo); ok {
+ m, err := r.WriteTo(w)
+ n += m
+ return n, err
+ }
+
+ if w, ok := w.(io.ReaderFrom); ok {
+ m, err := w.ReadFrom(b.rd)
+ n += m
+ return n, err
+ }
+
+ if b.w-b.r < len(b.buf) {
+ b.fill() // buffer not full
+ }
+
+ for b.r < b.w {
+ // b.r < b.w => buffer is not empty
+ m, err := b.writeBuf(w)
+ n += m
+ if err != nil {
+ return n, err
+ }
+ b.fill() // buffer is empty
+ }
+
+ if b.err == io.EOF {
+ b.err = nil
+ }
+
+ return n, b.readErr()
+}
+
+// writeBuf writes the Reader's buffer to the writer.
+func (b *Reader) writeBuf(w io.Writer) (int64, error) {
+ n, err := w.Write(b.buf[b.r:b.w])
+ if n < b.r-b.w {
+ panic(errors.New("bufio: writer did not write all data"))
+ }
+ b.r += n
+ return int64(n), err
+}
+
+// buffered output
+
+// Writer implements buffering for an io.Writer object.
+// If an error occurs writing to a Writer, no more data will be
+// accepted and all subsequent writes will return the error.
+// After all data has been written, the client should call the
+// Flush method to guarantee all data has been forwarded to
+// the underlying io.Writer.
+type Writer struct {
+ err error
+ buf []byte
+ n int
+ wr io.Writer
+}
+
+// NewWriterSize returns a new Writer whose buffer has at least the specified
+// size. If the argument io.Writer is already a Writer with large enough
+// size, it returns the underlying Writer.
+func NewWriterSize(w io.Writer, size int) *Writer {
+ // Is it already a Writer?
+ b, ok := w.(*Writer)
+ if ok && len(b.buf) >= size {
+ return b
+ }
+ if size <= 0 {
+ size = defaultBufSize
+ }
+ return &Writer{
+ buf: make([]byte, size),
+ wr: w,
+ }
+}
+
+// NewWriter returns a new Writer whose buffer has the default size.
+func NewWriter(w io.Writer) *Writer {
+ return NewWriterSize(w, defaultBufSize)
+}
+
+// Reset discards any unflushed buffered data, clears any error, and
+// resets b to write its output to w.
+func (b *Writer) Reset(w io.Writer) {
+ b.err = nil
+ b.n = 0
+ b.wr = w
+}
+
+// Flush writes any buffered data to the underlying io.Writer.
+func (b *Writer) Flush() error {
+ err := b.flush()
+ return err
+}
+
+func (b *Writer) flush() error {
+ if b.err != nil {
+ return b.err
+ }
+ if b.n == 0 {
+ return nil
+ }
+ n, err := b.wr.Write(b.buf[0:b.n])
+ if n < b.n && err == nil {
+ err = io.ErrShortWrite
+ }
+ if err != nil {
+ if n > 0 && n < b.n {
+ copy(b.buf[0:b.n-n], b.buf[n:b.n])
+ }
+ b.n -= n
+ b.err = err
+ return err
+ }
+ b.n = 0
+ return nil
+}
+
+// Available returns how many bytes are unused in the buffer.
+func (b *Writer) Available() int { return len(b.buf) - b.n }
+
+// Buffered returns the number of bytes that have been written into the current buffer.
+func (b *Writer) Buffered() int { return b.n }
+
+// Write writes the contents of p into the buffer.
+// It returns the number of bytes written.
+// If nn < len(p), it also returns an error explaining
+// why the write is short.
+func (b *Writer) Write(p []byte) (nn int, err error) {
+ for len(p) > b.Available() && b.err == nil {
+ var n int
+ if b.Buffered() == 0 {
+ // Large write, empty buffer.
+ // Write directly from p to avoid copy.
+ n, b.err = b.wr.Write(p)
+ } else {
+ n = copy(b.buf[b.n:], p)
+ b.n += n
+ b.flush()
+ }
+ nn += n
+ p = p[n:]
+ }
+ if b.err != nil {
+ return nn, b.err
+ }
+ n := copy(b.buf[b.n:], p)
+ b.n += n
+ nn += n
+ return nn, nil
+}
+
+// WriteByte writes a single byte.
+func (b *Writer) WriteByte(c byte) error {
+ if b.err != nil {
+ return b.err
+ }
+ if b.Available() <= 0 && b.flush() != nil {
+ return b.err
+ }
+ b.buf[b.n] = c
+ b.n++
+ return nil
+}
+
+// WriteRune writes a single Unicode code point, returning
+// the number of bytes written and any error.
+func (b *Writer) WriteRune(r rune) (size int, err error) {
+ if r < utf8.RuneSelf {
+ err = b.WriteByte(byte(r))
+ if err != nil {
+ return 0, err
+ }
+ return 1, nil
+ }
+ if b.err != nil {
+ return 0, b.err
+ }
+ n := b.Available()
+ if n < utf8.UTFMax {
+ if b.flush(); b.err != nil {
+ return 0, b.err
+ }
+ n = b.Available()
+ if n < utf8.UTFMax {
+ // Can only happen if buffer is silly small.
+ return b.WriteString(string(r))
+ }
+ }
+ size = utf8.EncodeRune(b.buf[b.n:], r)
+ b.n += size
+ return size, nil
+}
+
+// WriteString writes a string.
+// It returns the number of bytes written.
+// If the count is less than len(s), it also returns an error explaining
+// why the write is short.
+func (b *Writer) WriteString(s string) (int, error) {
+ nn := 0
+ for len(s) > b.Available() && b.err == nil {
+ n := copy(b.buf[b.n:], s)
+ b.n += n
+ nn += n
+ s = s[n:]
+ b.flush()
+ }
+ if b.err != nil {
+ return nn, b.err
+ }
+ n := copy(b.buf[b.n:], s)
+ b.n += n
+ nn += n
+ return nn, nil
+}
+
+// ReadFrom implements io.ReaderFrom.
+func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) {
+ if b.Buffered() == 0 {
+ if w, ok := b.wr.(io.ReaderFrom); ok {
+ return w.ReadFrom(r)
+ }
+ }
+ var m int
+ for {
+ if b.Available() == 0 {
+ if err1 := b.flush(); err1 != nil {
+ return n, err1
+ }
+ }
+ nr := 0
+ for nr < maxConsecutiveEmptyReads {
+ m, err = r.Read(b.buf[b.n:])
+ if m != 0 || err != nil {
+ break
+ }
+ nr++
+ }
+ if nr == maxConsecutiveEmptyReads {
+ return n, io.ErrNoProgress
+ }
+ b.n += m
+ n += int64(m)
+ if err != nil {
+ break
+ }
+ }
+ if err == io.EOF {
+ // If we filled the buffer exactly, flush pre-emptively.
+ if b.Available() == 0 {
+ err = b.flush()
+ } else {
+ err = nil
+ }
+ }
+ return n, err
+}
+
+// buffered input and output
+
+// ReadWriter stores pointers to a Reader and a Writer.
+// It implements io.ReadWriter.
+type ReadWriter struct {
+ *Reader
+ *Writer
+}
+
+// NewReadWriter allocates a new ReadWriter that dispatches to r and w.
+func NewReadWriter(r *Reader, w *Writer) *ReadWriter {
+ return &ReadWriter{r, w}
+}
diff --git a/Godeps/_workspace/src/gopkg.in/bufio.v1/bufio_test.go b/Godeps/_workspace/src/gopkg.in/bufio.v1/bufio_test.go
new file mode 100644
index 00000000000..f19d9bd282a
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/bufio.v1/bufio_test.go
@@ -0,0 +1,1418 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bufio_test
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "strings"
+ "testing"
+ "testing/iotest"
+ "time"
+ "unicode/utf8"
+
+ . "gopkg.in/bufio.v1"
+)
+
+// Reads from a reader and rot13s the result.
+type rot13Reader struct {
+ r io.Reader
+}
+
+func newRot13Reader(r io.Reader) *rot13Reader {
+ r13 := new(rot13Reader)
+ r13.r = r
+ return r13
+}
+
+func (r13 *rot13Reader) Read(p []byte) (int, error) {
+ n, err := r13.r.Read(p)
+ if err != nil {
+ return n, err
+ }
+ for i := 0; i < n; i++ {
+ c := p[i] | 0x20 // lowercase byte
+ if 'a' <= c && c <= 'm' {
+ p[i] += 13
+ } else if 'n' <= c && c <= 'z' {
+ p[i] -= 13
+ }
+ }
+ return n, nil
+}
+
+// Call ReadByte to accumulate the text of a file
+func readBytes(buf *Reader) string {
+ var b [1000]byte
+ nb := 0
+ for {
+ c, err := buf.ReadByte()
+ if err == io.EOF {
+ break
+ }
+ if err == nil {
+ b[nb] = c
+ nb++
+ } else if err != iotest.ErrTimeout {
+ panic("Data: " + err.Error())
+ }
+ }
+ return string(b[0:nb])
+}
+
+func TestReaderSimple(t *testing.T) {
+ data := "hello world"
+ b := NewReader(strings.NewReader(data))
+ if s := readBytes(b); s != "hello world" {
+ t.Errorf("simple hello world test failed: got %q", s)
+ }
+
+ b = NewReader(newRot13Reader(strings.NewReader(data)))
+ if s := readBytes(b); s != "uryyb jbeyq" {
+ t.Errorf("rot13 hello world test failed: got %q", s)
+ }
+}
+
+type readMaker struct {
+ name string
+ fn func(io.Reader) io.Reader
+}
+
+var readMakers = []readMaker{
+ {"full", func(r io.Reader) io.Reader { return r }},
+ {"byte", iotest.OneByteReader},
+ {"half", iotest.HalfReader},
+ {"data+err", iotest.DataErrReader},
+ {"timeout", iotest.TimeoutReader},
+}
+
+// Call ReadString (which ends up calling everything else)
+// to accumulate the text of a file.
+func readLines(b *Reader) string {
+ s := ""
+ for {
+ s1, err := b.ReadString('\n')
+ if err == io.EOF {
+ break
+ }
+ if err != nil && err != iotest.ErrTimeout {
+ panic("GetLines: " + err.Error())
+ }
+ s += s1
+ }
+ return s
+}
+
+// Call Read to accumulate the text of a file
+func reads(buf *Reader, m int) string {
+ var b [1000]byte
+ nb := 0
+ for {
+ n, err := buf.Read(b[nb : nb+m])
+ nb += n
+ if err == io.EOF {
+ break
+ }
+ }
+ return string(b[0:nb])
+}
+
+type bufReader struct {
+ name string
+ fn func(*Reader) string
+}
+
+var bufreaders = []bufReader{
+ {"1", func(b *Reader) string { return reads(b, 1) }},
+ {"2", func(b *Reader) string { return reads(b, 2) }},
+ {"3", func(b *Reader) string { return reads(b, 3) }},
+ {"4", func(b *Reader) string { return reads(b, 4) }},
+ {"5", func(b *Reader) string { return reads(b, 5) }},
+ {"7", func(b *Reader) string { return reads(b, 7) }},
+ {"bytes", readBytes},
+ {"lines", readLines},
+}
+
+const minReadBufferSize = 16
+
+var bufsizes = []int{
+ 0, minReadBufferSize, 23, 32, 46, 64, 93, 128, 1024, 4096,
+}
+
+func TestReader(t *testing.T) {
+ var texts [31]string
+ str := ""
+ all := ""
+ for i := 0; i < len(texts)-1; i++ {
+ texts[i] = str + "\n"
+ all += texts[i]
+ str += string(i%26 + 'a')
+ }
+ texts[len(texts)-1] = all
+
+ for h := 0; h < len(texts); h++ {
+ text := texts[h]
+ for i := 0; i < len(readMakers); i++ {
+ for j := 0; j < len(bufreaders); j++ {
+ for k := 0; k < len(bufsizes); k++ {
+ readmaker := readMakers[i]
+ bufreader := bufreaders[j]
+ bufsize := bufsizes[k]
+ read := readmaker.fn(strings.NewReader(text))
+ buf := NewReaderSize(read, bufsize)
+ s := bufreader.fn(buf)
+ if s != text {
+ t.Errorf("reader=%s fn=%s bufsize=%d want=%q got=%q",
+ readmaker.name, bufreader.name, bufsize, text, s)
+ }
+ }
+ }
+ }
+ }
+}
+
+type zeroReader struct{}
+
+func (zeroReader) Read(p []byte) (int, error) {
+ return 0, nil
+}
+
+func TestZeroReader(t *testing.T) {
+ var z zeroReader
+ r := NewReader(z)
+
+ c := make(chan error)
+ go func() {
+ _, err := r.ReadByte()
+ c <- err
+ }()
+
+ select {
+ case err := <-c:
+ if err == nil {
+ t.Error("error expected")
+ } else if err != io.ErrNoProgress {
+ t.Error("unexpected error:", err)
+ }
+ case <-time.After(time.Second):
+ t.Error("test timed out (endless loop in ReadByte?)")
+ }
+}
+
+// A StringReader delivers its data one string segment at a time via Read.
+type StringReader struct {
+ data []string
+ step int
+}
+
+func (r *StringReader) Read(p []byte) (n int, err error) {
+ if r.step < len(r.data) {
+ s := r.data[r.step]
+ n = copy(p, s)
+ r.step++
+ } else {
+ err = io.EOF
+ }
+ return
+}
+
+func readRuneSegments(t *testing.T, segments []string) {
+ got := ""
+ want := strings.Join(segments, "")
+ r := NewReader(&StringReader{data: segments})
+ for {
+ r, _, err := r.ReadRune()
+ if err != nil {
+ if err != io.EOF {
+ return
+ }
+ break
+ }
+ got += string(r)
+ }
+ if got != want {
+ t.Errorf("segments=%v got=%s want=%s", segments, got, want)
+ }
+}
+
+var segmentList = [][]string{
+ {},
+ {""},
+ {"日", "本語"},
+ {"\u65e5", "\u672c", "\u8a9e"},
+ {"\U000065e5", "\U0000672c", "\U00008a9e"},
+ {"\xe6", "\x97\xa5\xe6", "\x9c\xac\xe8\xaa\x9e"},
+ {"Hello", ", ", "World", "!"},
+ {"Hello", ", ", "", "World", "!"},
+}
+
+func TestReadRune(t *testing.T) {
+ for _, s := range segmentList {
+ readRuneSegments(t, s)
+ }
+}
+
+func TestUnreadRune(t *testing.T) {
+ segments := []string{"Hello, world:", "日本語"}
+ r := NewReader(&StringReader{data: segments})
+ got := ""
+ want := strings.Join(segments, "")
+ // Normal execution.
+ for {
+ r1, _, err := r.ReadRune()
+ if err != nil {
+ if err != io.EOF {
+ t.Error("unexpected error on ReadRune:", err)
+ }
+ break
+ }
+ got += string(r1)
+ // Put it back and read it again.
+ if err = r.UnreadRune(); err != nil {
+ t.Fatal("unexpected error on UnreadRune:", err)
+ }
+ r2, _, err := r.ReadRune()
+ if err != nil {
+ t.Fatal("unexpected error reading after unreading:", err)
+ }
+ if r1 != r2 {
+ t.Fatalf("incorrect rune after unread: got %c, want %c", r1, r2)
+ }
+ }
+ if got != want {
+ t.Errorf("got %q, want %q", got, want)
+ }
+}
+
+func TestReaderUnreadByte(t *testing.T) {
+ segments := []string{"Hello, ", "world"}
+ r := NewReader(&StringReader{data: segments})
+ got := ""
+ want := strings.Join(segments, "")
+ // Normal execution.
+ for {
+ b1, err := r.ReadByte()
+ if err != nil {
+ if err != io.EOF {
+ t.Error("unexpected error on ReadByte:", err)
+ }
+ break
+ }
+ got += string(b1)
+ // Put it back and read it again.
+ if err = r.UnreadByte(); err != nil {
+ t.Fatal("unexpected error on UnreadByte:", err)
+ }
+ b2, err := r.ReadByte()
+ if err != nil {
+ t.Fatal("unexpected error reading after unreading:", err)
+ }
+ if b1 != b2 {
+ t.Fatalf("incorrect byte after unread: got %q, want %q", b1, b2)
+ }
+ }
+ if got != want {
+ t.Errorf("got %q, want %q", got, want)
+ }
+}
+
+func TestUnreadByteMultiple(t *testing.T) {
+ segments := []string{"Hello, ", "world"}
+ data := strings.Join(segments, "")
+ for n := 0; n <= len(data); n++ {
+ r := NewReader(&StringReader{data: segments})
+ // Read n bytes.
+ for i := 0; i < n; i++ {
+ b, err := r.ReadByte()
+ if err != nil {
+ t.Fatalf("n = %d: unexpected error on ReadByte: %v", n, err)
+ }
+ if b != data[i] {
+ t.Fatalf("n = %d: incorrect byte returned from ReadByte: got %q, want %q", n, b, data[i])
+ }
+ }
+ // Unread one byte if there is one.
+ if n > 0 {
+ if err := r.UnreadByte(); err != nil {
+ t.Errorf("n = %d: unexpected error on UnreadByte: %v", n, err)
+ }
+ }
+ // Test that we cannot unread any further.
+ if err := r.UnreadByte(); err == nil {
+ t.Errorf("n = %d: expected error on UnreadByte", n)
+ }
+ }
+}
+
+func TestUnreadByteOthers(t *testing.T) {
+ // A list of readers to use in conjunction with UnreadByte.
+ var readers = []func(*Reader, byte) ([]byte, error){
+ (*Reader).ReadBytes,
+ (*Reader).ReadSlice,
+ func(r *Reader, delim byte) ([]byte, error) {
+ data, err := r.ReadString(delim)
+ return []byte(data), err
+ },
+ // ReadLine doesn't fit the data/pattern easily
+ // so we leave it out. It should be covered via
+ // the ReadSlice test since ReadLine simply calls
+ // ReadSlice, and it's that function that handles
+ // the last byte.
+ }
+
+ // Try all readers with UnreadByte.
+ for rno, read := range readers {
+ // Some input data that is longer than the minimum reader buffer size.
+ const n = 10
+ var buf bytes.Buffer
+ for i := 0; i < n; i++ {
+ buf.WriteString("abcdefg")
+ }
+
+ r := NewReaderSize(&buf, minReadBufferSize)
+ readTo := func(delim byte, want string) {
+ data, err := read(r, delim)
+ if err != nil {
+ t.Fatalf("#%d: unexpected error reading to %c: %v", rno, delim, err)
+ }
+ if got := string(data); got != want {
+ t.Fatalf("#%d: got %q, want %q", rno, got, want)
+ }
+ }
+
+ // Read the data with occasional UnreadByte calls.
+ for i := 0; i < n; i++ {
+ readTo('d', "abcd")
+ for j := 0; j < 3; j++ {
+ if err := r.UnreadByte(); err != nil {
+ t.Fatalf("#%d: unexpected error on UnreadByte: %v", rno, err)
+ }
+ readTo('d', "d")
+ }
+ readTo('g', "efg")
+ }
+
+ // All data should have been read.
+ _, err := r.ReadByte()
+ if err != io.EOF {
+ t.Errorf("#%d: got error %v; want EOF", rno, err)
+ }
+ }
+}
+
+// Test that UnreadRune fails if the preceding operation was not a ReadRune.
+func TestUnreadRuneError(t *testing.T) {
+ buf := make([]byte, 3) // All runes in this test are 3 bytes long
+ r := NewReader(&StringReader{data: []string{"日本語日本語日本語"}})
+ if r.UnreadRune() == nil {
+ t.Error("expected error on UnreadRune from fresh buffer")
+ }
+ _, _, err := r.ReadRune()
+ if err != nil {
+ t.Error("unexpected error on ReadRune (1):", err)
+ }
+ if err = r.UnreadRune(); err != nil {
+ t.Error("unexpected error on UnreadRune (1):", err)
+ }
+ if r.UnreadRune() == nil {
+ t.Error("expected error after UnreadRune (1)")
+ }
+ // Test error after Read.
+ _, _, err = r.ReadRune() // reset state
+ if err != nil {
+ t.Error("unexpected error on ReadRune (2):", err)
+ }
+ _, err = r.Read(buf)
+ if err != nil {
+ t.Error("unexpected error on Read (2):", err)
+ }
+ if r.UnreadRune() == nil {
+ t.Error("expected error after Read (2)")
+ }
+ // Test error after ReadByte.
+ _, _, err = r.ReadRune() // reset state
+ if err != nil {
+ t.Error("unexpected error on ReadRune (2):", err)
+ }
+ for _ = range buf {
+ _, err = r.ReadByte()
+ if err != nil {
+ t.Error("unexpected error on ReadByte (2):", err)
+ }
+ }
+ if r.UnreadRune() == nil {
+ t.Error("expected error after ReadByte")
+ }
+ // Test error after UnreadByte.
+ _, _, err = r.ReadRune() // reset state
+ if err != nil {
+ t.Error("unexpected error on ReadRune (3):", err)
+ }
+ _, err = r.ReadByte()
+ if err != nil {
+ t.Error("unexpected error on ReadByte (3):", err)
+ }
+ err = r.UnreadByte()
+ if err != nil {
+ t.Error("unexpected error on UnreadByte (3):", err)
+ }
+ if r.UnreadRune() == nil {
+ t.Error("expected error after UnreadByte (3)")
+ }
+}
+
+func TestUnreadRuneAtEOF(t *testing.T) {
+ // UnreadRune/ReadRune should error at EOF (was a bug; used to panic)
+ r := NewReader(strings.NewReader("x"))
+ r.ReadRune()
+ r.ReadRune()
+ r.UnreadRune()
+ _, _, err := r.ReadRune()
+ if err == nil {
+ t.Error("expected error at EOF")
+ } else if err != io.EOF {
+ t.Error("expected EOF; got", err)
+ }
+}
+
+func TestReadWriteRune(t *testing.T) {
+ const NRune = 1000
+ byteBuf := new(bytes.Buffer)
+ w := NewWriter(byteBuf)
+ // Write the runes out using WriteRune
+ buf := make([]byte, utf8.UTFMax)
+ for r := rune(0); r < NRune; r++ {
+ size := utf8.EncodeRune(buf, r)
+ nbytes, err := w.WriteRune(r)
+ if err != nil {
+ t.Fatalf("WriteRune(0x%x) error: %s", r, err)
+ }
+ if nbytes != size {
+ t.Fatalf("WriteRune(0x%x) expected %d, got %d", r, size, nbytes)
+ }
+ }
+ w.Flush()
+
+ r := NewReader(byteBuf)
+ // Read them back with ReadRune
+ for r1 := rune(0); r1 < NRune; r1++ {
+ size := utf8.EncodeRune(buf, r1)
+ nr, nbytes, err := r.ReadRune()
+ if nr != r1 || nbytes != size || err != nil {
+ t.Fatalf("ReadRune(0x%x) got 0x%x,%d not 0x%x,%d (err=%s)", r1, nr, nbytes, r1, size, err)
+ }
+ }
+}
+
+func TestWriter(t *testing.T) {
+ var data [8192]byte
+
+ for i := 0; i < len(data); i++ {
+ data[i] = byte(' ' + i%('~'-' '))
+ }
+ w := new(bytes.Buffer)
+ for i := 0; i < len(bufsizes); i++ {
+ for j := 0; j < len(bufsizes); j++ {
+ nwrite := bufsizes[i]
+ bs := bufsizes[j]
+
+ // Write nwrite bytes using buffer size bs.
+ // Check that the right amount makes it out
+ // and that the data is correct.
+
+ w.Reset()
+ buf := NewWriterSize(w, bs)
+ context := fmt.Sprintf("nwrite=%d bufsize=%d", nwrite, bs)
+ n, e1 := buf.Write(data[0:nwrite])
+ if e1 != nil || n != nwrite {
+ t.Errorf("%s: buf.Write %d = %d, %v", context, nwrite, n, e1)
+ continue
+ }
+ if e := buf.Flush(); e != nil {
+ t.Errorf("%s: buf.Flush = %v", context, e)
+ }
+
+ written := w.Bytes()
+ if len(written) != nwrite {
+ t.Errorf("%s: %d bytes written", context, len(written))
+ }
+ for l := 0; l < len(written); l++ {
+ if written[i] != data[i] {
+ t.Errorf("wrong bytes written")
+ t.Errorf("want=%q", data[0:len(written)])
+ t.Errorf("have=%q", written)
+ }
+ }
+ }
+ }
+}
+
+// Check that write errors are returned properly.
+
+type errorWriterTest struct {
+ n, m int
+ err error
+ expect error
+}
+
+func (w errorWriterTest) Write(p []byte) (int, error) {
+ return len(p) * w.n / w.m, w.err
+}
+
+var errorWriterTests = []errorWriterTest{
+ {0, 1, nil, io.ErrShortWrite},
+ {1, 2, nil, io.ErrShortWrite},
+ {1, 1, nil, nil},
+ {0, 1, io.ErrClosedPipe, io.ErrClosedPipe},
+ {1, 2, io.ErrClosedPipe, io.ErrClosedPipe},
+ {1, 1, io.ErrClosedPipe, io.ErrClosedPipe},
+}
+
+func TestWriteErrors(t *testing.T) {
+ for _, w := range errorWriterTests {
+ buf := NewWriter(w)
+ _, e := buf.Write([]byte("hello world"))
+ if e != nil {
+ t.Errorf("Write hello to %v: %v", w, e)
+ continue
+ }
+ // Two flushes, to verify the error is sticky.
+ for i := 0; i < 2; i++ {
+ e = buf.Flush()
+ if e != w.expect {
+ t.Errorf("Flush %d/2 %v: got %v, wanted %v", i+1, w, e, w.expect)
+ }
+ }
+ }
+}
+
+func TestNewReaderSizeIdempotent(t *testing.T) {
+ const BufSize = 1000
+ b := NewReaderSize(strings.NewReader("hello world"), BufSize)
+ // Does it recognize itself?
+ b1 := NewReaderSize(b, BufSize)
+ if b1 != b {
+ t.Error("NewReaderSize did not detect underlying Reader")
+ }
+ // Does it wrap if existing buffer is too small?
+ b2 := NewReaderSize(b, 2*BufSize)
+ if b2 == b {
+ t.Error("NewReaderSize did not enlarge buffer")
+ }
+}
+
+func TestNewWriterSizeIdempotent(t *testing.T) {
+ const BufSize = 1000
+ b := NewWriterSize(new(bytes.Buffer), BufSize)
+ // Does it recognize itself?
+ b1 := NewWriterSize(b, BufSize)
+ if b1 != b {
+ t.Error("NewWriterSize did not detect underlying Writer")
+ }
+ // Does it wrap if existing buffer is too small?
+ b2 := NewWriterSize(b, 2*BufSize)
+ if b2 == b {
+ t.Error("NewWriterSize did not enlarge buffer")
+ }
+}
+
+func TestWriteString(t *testing.T) {
+ const BufSize = 8
+ buf := new(bytes.Buffer)
+ b := NewWriterSize(buf, BufSize)
+ b.WriteString("0") // easy
+ b.WriteString("123456") // still easy
+ b.WriteString("7890") // easy after flush
+ b.WriteString("abcdefghijklmnopqrstuvwxy") // hard
+ b.WriteString("z")
+ if err := b.Flush(); err != nil {
+ t.Error("WriteString", err)
+ }
+ s := "01234567890abcdefghijklmnopqrstuvwxyz"
+ if string(buf.Bytes()) != s {
+ t.Errorf("WriteString wants %q gets %q", s, string(buf.Bytes()))
+ }
+}
+
+func TestBufferFull(t *testing.T) {
+ const longString = "And now, hello, world! It is the time for all good men to come to the aid of their party"
+ buf := NewReaderSize(strings.NewReader(longString), minReadBufferSize)
+ line, err := buf.ReadSlice('!')
+ if string(line) != "And now, hello, " || err != ErrBufferFull {
+ t.Errorf("first ReadSlice(,) = %q, %v", line, err)
+ }
+ line, err = buf.ReadSlice('!')
+ if string(line) != "world!" || err != nil {
+ t.Errorf("second ReadSlice(,) = %q, %v", line, err)
+ }
+}
+
+func TestPeek(t *testing.T) {
+ p := make([]byte, 10)
+ // string is 16 (minReadBufferSize) long.
+ buf := NewReaderSize(strings.NewReader("abcdefghijklmnop"), minReadBufferSize)
+ if s, err := buf.Peek(1); string(s) != "a" || err != nil {
+ t.Fatalf("want %q got %q, err=%v", "a", string(s), err)
+ }
+ if s, err := buf.Peek(4); string(s) != "abcd" || err != nil {
+ t.Fatalf("want %q got %q, err=%v", "abcd", string(s), err)
+ }
+ if _, err := buf.Peek(-1); err != ErrNegativeCount {
+ t.Fatalf("want ErrNegativeCount got %v", err)
+ }
+ if _, err := buf.Peek(32); err != ErrBufferFull {
+ t.Fatalf("want ErrBufFull got %v", err)
+ }
+ if _, err := buf.Read(p[0:3]); string(p[0:3]) != "abc" || err != nil {
+ t.Fatalf("want %q got %q, err=%v", "abc", string(p[0:3]), err)
+ }
+ if s, err := buf.Peek(1); string(s) != "d" || err != nil {
+ t.Fatalf("want %q got %q, err=%v", "d", string(s), err)
+ }
+ if s, err := buf.Peek(2); string(s) != "de" || err != nil {
+ t.Fatalf("want %q got %q, err=%v", "de", string(s), err)
+ }
+ if _, err := buf.Read(p[0:3]); string(p[0:3]) != "def" || err != nil {
+ t.Fatalf("want %q got %q, err=%v", "def", string(p[0:3]), err)
+ }
+ if s, err := buf.Peek(4); string(s) != "ghij" || err != nil {
+ t.Fatalf("want %q got %q, err=%v", "ghij", string(s), err)
+ }
+ if _, err := buf.Read(p[0:]); string(p[0:]) != "ghijklmnop" || err != nil {
+ t.Fatalf("want %q got %q, err=%v", "ghijklmnop", string(p[0:minReadBufferSize]), err)
+ }
+ if s, err := buf.Peek(0); string(s) != "" || err != nil {
+ t.Fatalf("want %q got %q, err=%v", "", string(s), err)
+ }
+ if _, err := buf.Peek(1); err != io.EOF {
+ t.Fatalf("want EOF got %v", err)
+ }
+
+ // Test for issue 3022, not exposing a reader's error on a successful Peek.
+ buf = NewReaderSize(dataAndEOFReader("abcd"), 32)
+ if s, err := buf.Peek(2); string(s) != "ab" || err != nil {
+ t.Errorf(`Peek(2) on "abcd", EOF = %q, %v; want "ab", nil`, string(s), err)
+ }
+ if s, err := buf.Peek(4); string(s) != "abcd" || err != nil {
+ t.Errorf(`Peek(4) on "abcd", EOF = %q, %v; want "abcd", nil`, string(s), err)
+ }
+ if n, err := buf.Read(p[0:5]); string(p[0:n]) != "abcd" || err != nil {
+ t.Fatalf("Read after peek = %q, %v; want abcd, EOF", p[0:n], err)
+ }
+ if n, err := buf.Read(p[0:1]); string(p[0:n]) != "" || err != io.EOF {
+ t.Fatalf(`second Read after peek = %q, %v; want "", EOF`, p[0:n], err)
+ }
+}
+
+type dataAndEOFReader string
+
+func (r dataAndEOFReader) Read(p []byte) (int, error) {
+ return copy(p, r), io.EOF
+}
+
+func TestPeekThenUnreadRune(t *testing.T) {
+ // This sequence used to cause a crash.
+ r := NewReader(strings.NewReader("x"))
+ r.ReadRune()
+ r.Peek(1)
+ r.UnreadRune()
+ r.ReadRune() // Used to panic here
+}
+
+var testOutput = []byte("0123456789abcdefghijklmnopqrstuvwxy")
+var testInput = []byte("012\n345\n678\n9ab\ncde\nfgh\nijk\nlmn\nopq\nrst\nuvw\nxy")
+var testInputrn = []byte("012\r\n345\r\n678\r\n9ab\r\ncde\r\nfgh\r\nijk\r\nlmn\r\nopq\r\nrst\r\nuvw\r\nxy\r\n\n\r\n")
+
+// TestReader wraps a []byte and returns reads of a specific length.
+type testReader struct {
+ data []byte
+ stride int
+}
+
+func (t *testReader) Read(buf []byte) (n int, err error) {
+ n = t.stride
+ if n > len(t.data) {
+ n = len(t.data)
+ }
+ if n > len(buf) {
+ n = len(buf)
+ }
+ copy(buf, t.data)
+ t.data = t.data[n:]
+ if len(t.data) == 0 {
+ err = io.EOF
+ }
+ return
+}
+
+func testReadLine(t *testing.T, input []byte) {
+ //for stride := 1; stride < len(input); stride++ {
+ for stride := 1; stride < 2; stride++ {
+ done := 0
+ reader := testReader{input, stride}
+ l := NewReaderSize(&reader, len(input)+1)
+ for {
+ line, isPrefix, err := l.ReadLine()
+ if len(line) > 0 && err != nil {
+ t.Errorf("ReadLine returned both data and error: %s", err)
+ }
+ if isPrefix {
+ t.Errorf("ReadLine returned prefix")
+ }
+ if err != nil {
+ if err != io.EOF {
+ t.Fatalf("Got unknown error: %s", err)
+ }
+ break
+ }
+ if want := testOutput[done : done+len(line)]; !bytes.Equal(want, line) {
+ t.Errorf("Bad line at stride %d: want: %x got: %x", stride, want, line)
+ }
+ done += len(line)
+ }
+ if done != len(testOutput) {
+ t.Errorf("ReadLine didn't return everything: got: %d, want: %d (stride: %d)", done, len(testOutput), stride)
+ }
+ }
+}
+
+func TestReadLine(t *testing.T) {
+ testReadLine(t, testInput)
+ testReadLine(t, testInputrn)
+}
+
+func TestLineTooLong(t *testing.T) {
+ data := make([]byte, 0)
+ for i := 0; i < minReadBufferSize*5/2; i++ {
+ data = append(data, '0'+byte(i%10))
+ }
+ buf := bytes.NewReader(data)
+ l := NewReaderSize(buf, minReadBufferSize)
+ line, isPrefix, err := l.ReadLine()
+ if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil {
+ t.Errorf("bad result for first line: got %q want %q %v", line, data[:minReadBufferSize], err)
+ }
+ data = data[len(line):]
+ line, isPrefix, err = l.ReadLine()
+ if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil {
+ t.Errorf("bad result for second line: got %q want %q %v", line, data[:minReadBufferSize], err)
+ }
+ data = data[len(line):]
+ line, isPrefix, err = l.ReadLine()
+ if isPrefix || !bytes.Equal(line, data[:minReadBufferSize/2]) || err != nil {
+ t.Errorf("bad result for third line: got %q want %q %v", line, data[:minReadBufferSize/2], err)
+ }
+ line, isPrefix, err = l.ReadLine()
+ if isPrefix || err == nil {
+ t.Errorf("expected no more lines: %x %s", line, err)
+ }
+}
+
+func TestReadAfterLines(t *testing.T) {
+ line1 := "this is line1"
+ restData := "this is line2\nthis is line 3\n"
+ inbuf := bytes.NewReader([]byte(line1 + "\n" + restData))
+ outbuf := new(bytes.Buffer)
+ maxLineLength := len(line1) + len(restData)/2
+ l := NewReaderSize(inbuf, maxLineLength)
+ line, isPrefix, err := l.ReadLine()
+ if isPrefix || err != nil || string(line) != line1 {
+ t.Errorf("bad result for first line: isPrefix=%v err=%v line=%q", isPrefix, err, string(line))
+ }
+ n, err := io.Copy(outbuf, l)
+ if int(n) != len(restData) || err != nil {
+ t.Errorf("bad result for Read: n=%d err=%v", n, err)
+ }
+ if outbuf.String() != restData {
+ t.Errorf("bad result for Read: got %q; expected %q", outbuf.String(), restData)
+ }
+}
+
+func TestReadEmptyBuffer(t *testing.T) {
+ l := NewReaderSize(new(bytes.Buffer), minReadBufferSize)
+ line, isPrefix, err := l.ReadLine()
+ if err != io.EOF {
+ t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err)
+ }
+}
+
+func TestLinesAfterRead(t *testing.T) {
+ l := NewReaderSize(bytes.NewReader([]byte("foo")), minReadBufferSize)
+ _, err := ioutil.ReadAll(l)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ line, isPrefix, err := l.ReadLine()
+ if err != io.EOF {
+ t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err)
+ }
+}
+
+func TestReadLineNonNilLineOrError(t *testing.T) {
+ r := NewReader(strings.NewReader("line 1\n"))
+ for i := 0; i < 2; i++ {
+ l, _, err := r.ReadLine()
+ if l != nil && err != nil {
+ t.Fatalf("on line %d/2; ReadLine=%#v, %v; want non-nil line or Error, but not both",
+ i+1, l, err)
+ }
+ }
+}
+
+type readLineResult struct {
+ line []byte
+ isPrefix bool
+ err error
+}
+
+var readLineNewlinesTests = []struct {
+ input string
+ expect []readLineResult
+}{
+ {"012345678901234\r\n012345678901234\r\n", []readLineResult{
+ {[]byte("012345678901234"), true, nil},
+ {nil, false, nil},
+ {[]byte("012345678901234"), true, nil},
+ {nil, false, nil},
+ {nil, false, io.EOF},
+ }},
+ {"0123456789012345\r012345678901234\r", []readLineResult{
+ {[]byte("0123456789012345"), true, nil},
+ {[]byte("\r012345678901234"), true, nil},
+ {[]byte("\r"), false, nil},
+ {nil, false, io.EOF},
+ }},
+}
+
+func TestReadLineNewlines(t *testing.T) {
+ for _, e := range readLineNewlinesTests {
+ testReadLineNewlines(t, e.input, e.expect)
+ }
+}
+
+func testReadLineNewlines(t *testing.T, input string, expect []readLineResult) {
+ b := NewReaderSize(strings.NewReader(input), minReadBufferSize)
+ for i, e := range expect {
+ line, isPrefix, err := b.ReadLine()
+ if !bytes.Equal(line, e.line) {
+ t.Errorf("%q call %d, line == %q, want %q", input, i, line, e.line)
+ return
+ }
+ if isPrefix != e.isPrefix {
+ t.Errorf("%q call %d, isPrefix == %v, want %v", input, i, isPrefix, e.isPrefix)
+ return
+ }
+ if err != e.err {
+ t.Errorf("%q call %d, err == %v, want %v", input, i, err, e.err)
+ return
+ }
+ }
+}
+
+func createTestInput(n int) []byte {
+ input := make([]byte, n)
+ for i := range input {
+ // 101 and 251 are arbitrary prime numbers.
+ // The idea is to create an input sequence
+ // which doesn't repeat too frequently.
+ input[i] = byte(i % 251)
+ if i%101 == 0 {
+ input[i] ^= byte(i / 101)
+ }
+ }
+ return input
+}
+
+func TestReaderWriteTo(t *testing.T) {
+ input := createTestInput(8192)
+ r := NewReader(onlyReader{bytes.NewReader(input)})
+ w := new(bytes.Buffer)
+ if n, err := r.WriteTo(w); err != nil || n != int64(len(input)) {
+ t.Fatalf("r.WriteTo(w) = %d, %v, want %d, nil", n, err, len(input))
+ }
+
+ for i, val := range w.Bytes() {
+ if val != input[i] {
+ t.Errorf("after write: out[%d] = %#x, want %#x", i, val, input[i])
+ }
+ }
+}
+
+type errorWriterToTest struct {
+ rn, wn int
+ rerr, werr error
+ expected error
+}
+
+func (r errorWriterToTest) Read(p []byte) (int, error) {
+ return len(p) * r.rn, r.rerr
+}
+
+func (w errorWriterToTest) Write(p []byte) (int, error) {
+ return len(p) * w.wn, w.werr
+}
+
+var errorWriterToTests = []errorWriterToTest{
+ {1, 0, nil, io.ErrClosedPipe, io.ErrClosedPipe},
+ {0, 1, io.ErrClosedPipe, nil, io.ErrClosedPipe},
+ {0, 0, io.ErrUnexpectedEOF, io.ErrClosedPipe, io.ErrClosedPipe},
+ {0, 1, io.EOF, nil, nil},
+}
+
+func TestReaderWriteToErrors(t *testing.T) {
+ for i, rw := range errorWriterToTests {
+ r := NewReader(rw)
+ if _, err := r.WriteTo(rw); err != rw.expected {
+ t.Errorf("r.WriteTo(errorWriterToTests[%d]) = _, %v, want _,%v", i, err, rw.expected)
+ }
+ }
+}
+
+func TestWriterReadFrom(t *testing.T) {
+ ws := []func(io.Writer) io.Writer{
+ func(w io.Writer) io.Writer { return onlyWriter{w} },
+ func(w io.Writer) io.Writer { return w },
+ }
+
+ rs := []func(io.Reader) io.Reader{
+ iotest.DataErrReader,
+ func(r io.Reader) io.Reader { return r },
+ }
+
+ for ri, rfunc := range rs {
+ for wi, wfunc := range ws {
+ input := createTestInput(8192)
+ b := new(bytes.Buffer)
+ w := NewWriter(wfunc(b))
+ r := rfunc(bytes.NewReader(input))
+ if n, err := w.ReadFrom(r); err != nil || n != int64(len(input)) {
+ t.Errorf("ws[%d],rs[%d]: w.ReadFrom(r) = %d, %v, want %d, nil", wi, ri, n, err, len(input))
+ continue
+ }
+ if err := w.Flush(); err != nil {
+ t.Errorf("Flush returned %v", err)
+ continue
+ }
+ if got, want := b.String(), string(input); got != want {
+ t.Errorf("ws[%d], rs[%d]:\ngot %q\nwant %q\n", wi, ri, got, want)
+ }
+ }
+ }
+}
+
+type errorReaderFromTest struct {
+ rn, wn int
+ rerr, werr error
+ expected error
+}
+
+func (r errorReaderFromTest) Read(p []byte) (int, error) {
+ return len(p) * r.rn, r.rerr
+}
+
+func (w errorReaderFromTest) Write(p []byte) (int, error) {
+ return len(p) * w.wn, w.werr
+}
+
+var errorReaderFromTests = []errorReaderFromTest{
+ {0, 1, io.EOF, nil, nil},
+ {1, 1, io.EOF, nil, nil},
+ {0, 1, io.ErrClosedPipe, nil, io.ErrClosedPipe},
+ {0, 0, io.ErrClosedPipe, io.ErrShortWrite, io.ErrClosedPipe},
+ {1, 0, nil, io.ErrShortWrite, io.ErrShortWrite},
+}
+
+func TestWriterReadFromErrors(t *testing.T) {
+ for i, rw := range errorReaderFromTests {
+ w := NewWriter(rw)
+ if _, err := w.ReadFrom(rw); err != rw.expected {
+ t.Errorf("w.ReadFrom(errorReaderFromTests[%d]) = _, %v, want _,%v", i, err, rw.expected)
+ }
+ }
+}
+
+// TestWriterReadFromCounts tests that using io.Copy to copy into a
+// bufio.Writer does not prematurely flush the buffer. For example, when
+// buffering writes to a network socket, excessive network writes should be
+// avoided.
+func TestWriterReadFromCounts(t *testing.T) {
+ var w0 writeCountingDiscard
+ b0 := NewWriterSize(&w0, 1234)
+ b0.WriteString(strings.Repeat("x", 1000))
+ if w0 != 0 {
+ t.Fatalf("write 1000 'x's: got %d writes, want 0", w0)
+ }
+ b0.WriteString(strings.Repeat("x", 200))
+ if w0 != 0 {
+ t.Fatalf("write 1200 'x's: got %d writes, want 0", w0)
+ }
+ io.Copy(b0, onlyReader{strings.NewReader(strings.Repeat("x", 30))})
+ if w0 != 0 {
+ t.Fatalf("write 1230 'x's: got %d writes, want 0", w0)
+ }
+ io.Copy(b0, onlyReader{strings.NewReader(strings.Repeat("x", 9))})
+ if w0 != 1 {
+ t.Fatalf("write 1239 'x's: got %d writes, want 1", w0)
+ }
+
+ var w1 writeCountingDiscard
+ b1 := NewWriterSize(&w1, 1234)
+ b1.WriteString(strings.Repeat("x", 1200))
+ b1.Flush()
+ if w1 != 1 {
+ t.Fatalf("flush 1200 'x's: got %d writes, want 1", w1)
+ }
+ b1.WriteString(strings.Repeat("x", 89))
+ if w1 != 1 {
+ t.Fatalf("write 1200 + 89 'x's: got %d writes, want 1", w1)
+ }
+ io.Copy(b1, onlyReader{strings.NewReader(strings.Repeat("x", 700))})
+ if w1 != 1 {
+ t.Fatalf("write 1200 + 789 'x's: got %d writes, want 1", w1)
+ }
+ io.Copy(b1, onlyReader{strings.NewReader(strings.Repeat("x", 600))})
+ if w1 != 2 {
+ t.Fatalf("write 1200 + 1389 'x's: got %d writes, want 2", w1)
+ }
+ b1.Flush()
+ if w1 != 3 {
+ t.Fatalf("flush 1200 + 1389 'x's: got %d writes, want 3", w1)
+ }
+}
+
+// A writeCountingDiscard is like ioutil.Discard and counts the number of times
+// Write is called on it.
+type writeCountingDiscard int
+
+func (w *writeCountingDiscard) Write(p []byte) (int, error) {
+ *w++
+ return len(p), nil
+}
+
+type negativeReader int
+
+func (r *negativeReader) Read([]byte) (int, error) { return -1, nil }
+
+func TestNegativeRead(t *testing.T) {
+ // should panic with a description pointing at the reader, not at itself.
+ // (should NOT panic with slice index error, for example.)
+ b := NewReader(new(negativeReader))
+ defer func() {
+ switch err := recover().(type) {
+ case nil:
+ t.Fatal("read did not panic")
+ case error:
+ if !strings.Contains(err.Error(), "reader returned negative count from Read") {
+ t.Fatalf("wrong panic: %v", err)
+ }
+ default:
+ t.Fatalf("unexpected panic value: %T(%v)", err, err)
+ }
+ }()
+ b.Read(make([]byte, 100))
+}
+
+var errFake = errors.New("fake error")
+
+type errorThenGoodReader struct {
+ didErr bool
+ nread int
+}
+
+func (r *errorThenGoodReader) Read(p []byte) (int, error) {
+ r.nread++
+ if !r.didErr {
+ r.didErr = true
+ return 0, errFake
+ }
+ return len(p), nil
+}
+
+func TestReaderClearError(t *testing.T) {
+ r := &errorThenGoodReader{}
+ b := NewReader(r)
+ buf := make([]byte, 1)
+ if _, err := b.Read(nil); err != nil {
+ t.Fatalf("1st nil Read = %v; want nil", err)
+ }
+ if _, err := b.Read(buf); err != errFake {
+ t.Fatalf("1st Read = %v; want errFake", err)
+ }
+ if _, err := b.Read(nil); err != nil {
+ t.Fatalf("2nd nil Read = %v; want nil", err)
+ }
+ if _, err := b.Read(buf); err != nil {
+ t.Fatalf("3rd Read with buffer = %v; want nil", err)
+ }
+ if r.nread != 2 {
+ t.Errorf("num reads = %d; want 2", r.nread)
+ }
+}
+
+// Test for golang.org/issue/5947
+func TestWriterReadFromWhileFull(t *testing.T) {
+ buf := new(bytes.Buffer)
+ w := NewWriterSize(buf, 10)
+
+ // Fill buffer exactly.
+ n, err := w.Write([]byte("0123456789"))
+ if n != 10 || err != nil {
+ t.Fatalf("Write returned (%v, %v), want (10, nil)", n, err)
+ }
+
+ // Use ReadFrom to read in some data.
+ n2, err := w.ReadFrom(strings.NewReader("abcdef"))
+ if n2 != 6 || err != nil {
+ t.Fatalf("ReadFrom returned (%v, %v), want (6, nil)", n2, err)
+ }
+}
+
+type emptyThenNonEmptyReader struct {
+ r io.Reader
+ n int
+}
+
+func (r *emptyThenNonEmptyReader) Read(p []byte) (int, error) {
+ if r.n <= 0 {
+ return r.r.Read(p)
+ }
+ r.n--
+ return 0, nil
+}
+
+// Test for golang.org/issue/7611
+func TestWriterReadFromUntilEOF(t *testing.T) {
+ buf := new(bytes.Buffer)
+ w := NewWriterSize(buf, 5)
+
+ // Partially fill buffer
+ n, err := w.Write([]byte("0123"))
+ if n != 4 || err != nil {
+ t.Fatalf("Write returned (%v, %v), want (4, nil)", n, err)
+ }
+
+ // Use ReadFrom to read in some data.
+ r := &emptyThenNonEmptyReader{r: strings.NewReader("abcd"), n: 3}
+ n2, err := w.ReadFrom(r)
+ if n2 != 4 || err != nil {
+ t.Fatalf("ReadFrom returned (%v, %v), want (4, nil)", n2, err)
+ }
+ w.Flush()
+ if got, want := string(buf.Bytes()), "0123abcd"; got != want {
+ t.Fatalf("buf.Bytes() returned %q, want %q", got, want)
+ }
+}
+
+func TestWriterReadFromErrNoProgress(t *testing.T) {
+ buf := new(bytes.Buffer)
+ w := NewWriterSize(buf, 5)
+
+ // Partially fill buffer
+ n, err := w.Write([]byte("0123"))
+ if n != 4 || err != nil {
+ t.Fatalf("Write returned (%v, %v), want (4, nil)", n, err)
+ }
+
+ // Use ReadFrom to read in some data.
+ r := &emptyThenNonEmptyReader{r: strings.NewReader("abcd"), n: 100}
+ n2, err := w.ReadFrom(r)
+ if n2 != 0 || err != io.ErrNoProgress {
+ t.Fatalf("buf.Bytes() returned (%v, %v), want (0, io.ErrNoProgress)", n2, err)
+ }
+}
+
+func TestReaderReset(t *testing.T) {
+ r := NewReader(strings.NewReader("foo foo"))
+ buf := make([]byte, 3)
+ r.Read(buf)
+ if string(buf) != "foo" {
+ t.Errorf("buf = %q; want foo", buf)
+ }
+ r.Reset(strings.NewReader("bar bar"))
+ all, err := ioutil.ReadAll(r)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if string(all) != "bar bar" {
+ t.Errorf("ReadAll = %q; want bar bar", all)
+ }
+}
+
+func TestWriterReset(t *testing.T) {
+ var buf1, buf2 bytes.Buffer
+ w := NewWriter(&buf1)
+ w.WriteString("foo")
+ w.Reset(&buf2) // and not flushed
+ w.WriteString("bar")
+ w.Flush()
+ if buf1.String() != "" {
+ t.Errorf("buf1 = %q; want empty", buf1.String())
+ }
+ if buf2.String() != "bar" {
+ t.Errorf("buf2 = %q; want bar", buf2.String())
+ }
+}
+
+// An onlyReader only implements io.Reader, no matter what other methods the underlying implementation may have.
+type onlyReader struct {
+ io.Reader
+}
+
+// An onlyWriter only implements io.Writer, no matter what other methods the underlying implementation may have.
+type onlyWriter struct {
+ io.Writer
+}
+
+func BenchmarkReaderCopyOptimal(b *testing.B) {
+ // Optimal case is where the underlying reader implements io.WriterTo
+ srcBuf := bytes.NewBuffer(make([]byte, 8192))
+ src := NewReader(srcBuf)
+ dstBuf := new(bytes.Buffer)
+ dst := onlyWriter{dstBuf}
+ for i := 0; i < b.N; i++ {
+ srcBuf.Reset()
+ src.Reset(srcBuf)
+ dstBuf.Reset()
+ io.Copy(dst, src)
+ }
+}
+
+func BenchmarkReaderCopyUnoptimal(b *testing.B) {
+ // Unoptimal case is where the underlying reader doesn't implement io.WriterTo
+ srcBuf := bytes.NewBuffer(make([]byte, 8192))
+ src := NewReader(onlyReader{srcBuf})
+ dstBuf := new(bytes.Buffer)
+ dst := onlyWriter{dstBuf}
+ for i := 0; i < b.N; i++ {
+ srcBuf.Reset()
+ src.Reset(onlyReader{srcBuf})
+ dstBuf.Reset()
+ io.Copy(dst, src)
+ }
+}
+
+func BenchmarkReaderCopyNoWriteTo(b *testing.B) {
+ srcBuf := bytes.NewBuffer(make([]byte, 8192))
+ srcReader := NewReader(srcBuf)
+ src := onlyReader{srcReader}
+ dstBuf := new(bytes.Buffer)
+ dst := onlyWriter{dstBuf}
+ for i := 0; i < b.N; i++ {
+ srcBuf.Reset()
+ srcReader.Reset(srcBuf)
+ dstBuf.Reset()
+ io.Copy(dst, src)
+ }
+}
+
+func BenchmarkReaderWriteToOptimal(b *testing.B) {
+ const bufSize = 16 << 10
+ buf := make([]byte, bufSize)
+ r := bytes.NewReader(buf)
+ srcReader := NewReaderSize(onlyReader{r}, 1<<10)
+ if _, ok := ioutil.Discard.(io.ReaderFrom); !ok {
+ b.Fatal("ioutil.Discard doesn't support ReaderFrom")
+ }
+ for i := 0; i < b.N; i++ {
+ r.Seek(0, 0)
+ srcReader.Reset(onlyReader{r})
+ n, err := srcReader.WriteTo(ioutil.Discard)
+ if err != nil {
+ b.Fatal(err)
+ }
+ if n != bufSize {
+ b.Fatalf("n = %d; want %d", n, bufSize)
+ }
+ }
+}
+
+func BenchmarkWriterCopyOptimal(b *testing.B) {
+ // Optimal case is where the underlying writer implements io.ReaderFrom
+ srcBuf := bytes.NewBuffer(make([]byte, 8192))
+ src := onlyReader{srcBuf}
+ dstBuf := new(bytes.Buffer)
+ dst := NewWriter(dstBuf)
+ for i := 0; i < b.N; i++ {
+ srcBuf.Reset()
+ dstBuf.Reset()
+ dst.Reset(dstBuf)
+ io.Copy(dst, src)
+ }
+}
+
+func BenchmarkWriterCopyUnoptimal(b *testing.B) {
+ srcBuf := bytes.NewBuffer(make([]byte, 8192))
+ src := onlyReader{srcBuf}
+ dstBuf := new(bytes.Buffer)
+ dst := NewWriter(onlyWriter{dstBuf})
+ for i := 0; i < b.N; i++ {
+ srcBuf.Reset()
+ dstBuf.Reset()
+ dst.Reset(onlyWriter{dstBuf})
+ io.Copy(dst, src)
+ }
+}
+
+func BenchmarkWriterCopyNoReadFrom(b *testing.B) {
+ srcBuf := bytes.NewBuffer(make([]byte, 8192))
+ src := onlyReader{srcBuf}
+ dstBuf := new(bytes.Buffer)
+ dstWriter := NewWriter(dstBuf)
+ dst := onlyWriter{dstWriter}
+ for i := 0; i < b.N; i++ {
+ srcBuf.Reset()
+ dstBuf.Reset()
+ dstWriter.Reset(dstBuf)
+ io.Copy(dst, src)
+ }
+}
+
+func BenchmarkReaderEmpty(b *testing.B) {
+ b.ReportAllocs()
+ str := strings.Repeat("x", 16<<10)
+ for i := 0; i < b.N; i++ {
+ br := NewReader(strings.NewReader(str))
+ n, err := io.Copy(ioutil.Discard, br)
+ if err != nil {
+ b.Fatal(err)
+ }
+ if n != int64(len(str)) {
+ b.Fatal("wrong length")
+ }
+ }
+}
+
+func BenchmarkWriterEmpty(b *testing.B) {
+ b.ReportAllocs()
+ str := strings.Repeat("x", 1<<10)
+ bs := []byte(str)
+ for i := 0; i < b.N; i++ {
+ bw := NewWriter(ioutil.Discard)
+ bw.Flush()
+ bw.WriteByte('a')
+ bw.Flush()
+ bw.WriteRune('B')
+ bw.Flush()
+ bw.Write(bs)
+ bw.Flush()
+ bw.WriteString(str)
+ bw.Flush()
+ }
+}
+
+func BenchmarkWriterFlush(b *testing.B) {
+ b.ReportAllocs()
+ bw := NewWriter(ioutil.Discard)
+ str := strings.Repeat("x", 50)
+ for i := 0; i < b.N; i++ {
+ bw.WriteString(str)
+ bw.Flush()
+ }
+}
diff --git a/Godeps/_workspace/src/gopkg.in/bufio.v1/export_test.go b/Godeps/_workspace/src/gopkg.in/bufio.v1/export_test.go
new file mode 100644
index 00000000000..16629d0224c
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/bufio.v1/export_test.go
@@ -0,0 +1,9 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bufio
+
+func (b *Buffer) Cap() int {
+ return cap(b.buf)
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/.travis.yml b/Godeps/_workspace/src/gopkg.in/redis.v2/.travis.yml
new file mode 100644
index 00000000000..c3cf4b8a6e3
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/.travis.yml
@@ -0,0 +1,19 @@
+language: go
+
+services:
+- redis-server
+
+go:
+ - 1.1
+ - 1.2
+ - 1.3
+ - tip
+
+install:
+ - go get gopkg.in/bufio.v1
+ - go get gopkg.in/check.v1
+ - mkdir -p $HOME/gopath/src/gopkg.in
+ - ln -s `pwd` $HOME/gopath/src/gopkg.in/redis.v2
+
+before_script:
+ - redis-server testdata/sentinel.conf --sentinel &
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/LICENSE b/Godeps/_workspace/src/gopkg.in/redis.v2/LICENSE
new file mode 100644
index 00000000000..6855a95feb9
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2012 The Redis Go Client Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/Makefile b/Godeps/_workspace/src/gopkg.in/redis.v2/Makefile
new file mode 100644
index 00000000000..b250d9bfa96
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/Makefile
@@ -0,0 +1,3 @@
+all:
+ go test gopkg.in/redis.v2 -cpu=1,2,4
+ go test gopkg.in/redis.v2 -short -race
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/README.md b/Godeps/_workspace/src/gopkg.in/redis.v2/README.md
new file mode 100644
index 00000000000..ddf875f9a19
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/README.md
@@ -0,0 +1,46 @@
+Redis client for Golang [](https://travis-ci.org/go-redis/redis)
+=======================
+
+Supports:
+
+- Redis 2.8 commands except QUIT, MONITOR, SLOWLOG and SYNC.
+- Pub/sub.
+- Transactions.
+- Pipelining.
+- Connection pool.
+- TLS connections.
+- Thread safety.
+- Timeouts.
+- Redis Sentinel.
+
+API docs: http://godoc.org/gopkg.in/redis.v2.
+Examples: http://godoc.org/gopkg.in/redis.v2#pkg-examples.
+
+Installation
+------------
+
+Install:
+
+ go get gopkg.in/redis.v2
+
+Look and feel
+-------------
+
+Some corner cases:
+
+ SORT list LIMIT 0 2 ASC
+ vals, err := client.Sort("list", redis.Sort{Offset: 0, Count: 2, Order: "ASC"}).Result()
+
+ ZRANGEBYSCORE zset -inf +inf WITHSCORES LIMIT 0 2
+ vals, err := client.ZRangeByScoreWithScores("zset", redis.ZRangeByScore{
+ Min: "-inf",
+ Max: "+inf",
+ Offset: 0,
+ Count: 2,
+ }).Result()
+
+ ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE SUM
+ vals, err := client.ZInterStore("out", redis.ZStore{Weights: []int64{2, 3}}, "zset1", "zset2").Result()
+
+ EVAL "return {KEYS[1],ARGV[1]}" 1 "key" "hello"
+ vals, err := client.Eval("return {KEYS[1],ARGV[1]}", []string{"key"}, []string{"hello"}).Result()
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/command.go b/Godeps/_workspace/src/gopkg.in/redis.v2/command.go
new file mode 100644
index 00000000000..d7c76cf92a9
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/command.go
@@ -0,0 +1,597 @@
+package redis
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+ "time"
+
+ "gopkg.in/bufio.v1"
+)
+
+var (
+ _ Cmder = (*Cmd)(nil)
+ _ Cmder = (*SliceCmd)(nil)
+ _ Cmder = (*StatusCmd)(nil)
+ _ Cmder = (*IntCmd)(nil)
+ _ Cmder = (*DurationCmd)(nil)
+ _ Cmder = (*BoolCmd)(nil)
+ _ Cmder = (*StringCmd)(nil)
+ _ Cmder = (*FloatCmd)(nil)
+ _ Cmder = (*StringSliceCmd)(nil)
+ _ Cmder = (*BoolSliceCmd)(nil)
+ _ Cmder = (*StringStringMapCmd)(nil)
+ _ Cmder = (*ZSliceCmd)(nil)
+ _ Cmder = (*ScanCmd)(nil)
+)
+
+type Cmder interface {
+ args() []string
+ parseReply(*bufio.Reader) error
+ setErr(error)
+
+ writeTimeout() *time.Duration
+ readTimeout() *time.Duration
+
+ Err() error
+ String() string
+}
+
+func setCmdsErr(cmds []Cmder, e error) {
+ for _, cmd := range cmds {
+ cmd.setErr(e)
+ }
+}
+
+func cmdString(cmd Cmder, val interface{}) string {
+ s := strings.Join(cmd.args(), " ")
+ if err := cmd.Err(); err != nil {
+ return s + ": " + err.Error()
+ }
+ if val != nil {
+ return s + ": " + fmt.Sprint(val)
+ }
+ return s
+
+}
+
+//------------------------------------------------------------------------------
+
+type baseCmd struct {
+ _args []string
+
+ err error
+
+ _writeTimeout, _readTimeout *time.Duration
+}
+
+func newBaseCmd(args ...string) *baseCmd {
+ return &baseCmd{
+ _args: args,
+ }
+}
+
+func (cmd *baseCmd) Err() error {
+ if cmd.err != nil {
+ return cmd.err
+ }
+ return nil
+}
+
+func (cmd *baseCmd) args() []string {
+ return cmd._args
+}
+
+func (cmd *baseCmd) readTimeout() *time.Duration {
+ return cmd._readTimeout
+}
+
+func (cmd *baseCmd) setReadTimeout(d time.Duration) {
+ cmd._readTimeout = &d
+}
+
+func (cmd *baseCmd) writeTimeout() *time.Duration {
+ return cmd._writeTimeout
+}
+
+func (cmd *baseCmd) setWriteTimeout(d time.Duration) {
+ cmd._writeTimeout = &d
+}
+
+func (cmd *baseCmd) setErr(e error) {
+ cmd.err = e
+}
+
+//------------------------------------------------------------------------------
+
+type Cmd struct {
+ *baseCmd
+
+ val interface{}
+}
+
+func NewCmd(args ...string) *Cmd {
+ return &Cmd{
+ baseCmd: newBaseCmd(args...),
+ }
+}
+
+func (cmd *Cmd) Val() interface{} {
+ return cmd.val
+}
+
+func (cmd *Cmd) Result() (interface{}, error) {
+ return cmd.val, cmd.err
+}
+
+func (cmd *Cmd) String() string {
+ return cmdString(cmd, cmd.val)
+}
+
+func (cmd *Cmd) parseReply(rd *bufio.Reader) error {
+ cmd.val, cmd.err = parseReply(rd, parseSlice)
+ return cmd.err
+}
+
+//------------------------------------------------------------------------------
+
+type SliceCmd struct {
+ *baseCmd
+
+ val []interface{}
+}
+
+func NewSliceCmd(args ...string) *SliceCmd {
+ return &SliceCmd{
+ baseCmd: newBaseCmd(args...),
+ }
+}
+
+func (cmd *SliceCmd) Val() []interface{} {
+ return cmd.val
+}
+
+func (cmd *SliceCmd) Result() ([]interface{}, error) {
+ return cmd.val, cmd.err
+}
+
+func (cmd *SliceCmd) String() string {
+ return cmdString(cmd, cmd.val)
+}
+
+func (cmd *SliceCmd) parseReply(rd *bufio.Reader) error {
+ v, err := parseReply(rd, parseSlice)
+ if err != nil {
+ cmd.err = err
+ return err
+ }
+ cmd.val = v.([]interface{})
+ return nil
+}
+
+//------------------------------------------------------------------------------
+
+type StatusCmd struct {
+ *baseCmd
+
+ val string
+}
+
+func NewStatusCmd(args ...string) *StatusCmd {
+ return &StatusCmd{
+ baseCmd: newBaseCmd(args...),
+ }
+}
+
+func (cmd *StatusCmd) Val() string {
+ return cmd.val
+}
+
+func (cmd *StatusCmd) Result() (string, error) {
+ return cmd.val, cmd.err
+}
+
+func (cmd *StatusCmd) String() string {
+ return cmdString(cmd, cmd.val)
+}
+
+func (cmd *StatusCmd) parseReply(rd *bufio.Reader) error {
+ v, err := parseReply(rd, nil)
+ if err != nil {
+ cmd.err = err
+ return err
+ }
+ cmd.val = v.(string)
+ return nil
+}
+
+//------------------------------------------------------------------------------
+
+type IntCmd struct {
+ *baseCmd
+
+ val int64
+}
+
+func NewIntCmd(args ...string) *IntCmd {
+ return &IntCmd{
+ baseCmd: newBaseCmd(args...),
+ }
+}
+
+func (cmd *IntCmd) Val() int64 {
+ return cmd.val
+}
+
+func (cmd *IntCmd) Result() (int64, error) {
+ return cmd.val, cmd.err
+}
+
+func (cmd *IntCmd) String() string {
+ return cmdString(cmd, cmd.val)
+}
+
+func (cmd *IntCmd) parseReply(rd *bufio.Reader) error {
+ v, err := parseReply(rd, nil)
+ if err != nil {
+ cmd.err = err
+ return err
+ }
+ cmd.val = v.(int64)
+ return nil
+}
+
+//------------------------------------------------------------------------------
+
+type DurationCmd struct {
+ *baseCmd
+
+ val time.Duration
+ precision time.Duration
+}
+
+func NewDurationCmd(precision time.Duration, args ...string) *DurationCmd {
+ return &DurationCmd{
+ baseCmd: newBaseCmd(args...),
+ precision: precision,
+ }
+}
+
+func (cmd *DurationCmd) Val() time.Duration {
+ return cmd.val
+}
+
+func (cmd *DurationCmd) Result() (time.Duration, error) {
+ return cmd.val, cmd.err
+}
+
+func (cmd *DurationCmd) String() string {
+ return cmdString(cmd, cmd.val)
+}
+
+func (cmd *DurationCmd) parseReply(rd *bufio.Reader) error {
+ v, err := parseReply(rd, nil)
+ if err != nil {
+ cmd.err = err
+ return err
+ }
+ cmd.val = time.Duration(v.(int64)) * cmd.precision
+ return nil
+}
+
+//------------------------------------------------------------------------------
+
+type BoolCmd struct {
+ *baseCmd
+
+ val bool
+}
+
+func NewBoolCmd(args ...string) *BoolCmd {
+ return &BoolCmd{
+ baseCmd: newBaseCmd(args...),
+ }
+}
+
+func (cmd *BoolCmd) Val() bool {
+ return cmd.val
+}
+
+func (cmd *BoolCmd) Result() (bool, error) {
+ return cmd.val, cmd.err
+}
+
+func (cmd *BoolCmd) String() string {
+ return cmdString(cmd, cmd.val)
+}
+
+func (cmd *BoolCmd) parseReply(rd *bufio.Reader) error {
+ v, err := parseReply(rd, nil)
+ if err != nil {
+ cmd.err = err
+ return err
+ }
+ cmd.val = v.(int64) == 1
+ return nil
+}
+
+//------------------------------------------------------------------------------
+
+type StringCmd struct {
+ *baseCmd
+
+ val string
+}
+
+func NewStringCmd(args ...string) *StringCmd {
+ return &StringCmd{
+ baseCmd: newBaseCmd(args...),
+ }
+}
+
+func (cmd *StringCmd) Val() string {
+ return cmd.val
+}
+
+func (cmd *StringCmd) Result() (string, error) {
+ return cmd.val, cmd.err
+}
+
+func (cmd *StringCmd) Int64() (int64, error) {
+ if cmd.err != nil {
+ return 0, cmd.err
+ }
+ return strconv.ParseInt(cmd.val, 10, 64)
+}
+
+func (cmd *StringCmd) Uint64() (uint64, error) {
+ if cmd.err != nil {
+ return 0, cmd.err
+ }
+ return strconv.ParseUint(cmd.val, 10, 64)
+}
+
+func (cmd *StringCmd) Float64() (float64, error) {
+ if cmd.err != nil {
+ return 0, cmd.err
+ }
+ return strconv.ParseFloat(cmd.val, 64)
+}
+
+func (cmd *StringCmd) String() string {
+ return cmdString(cmd, cmd.val)
+}
+
+func (cmd *StringCmd) parseReply(rd *bufio.Reader) error {
+ v, err := parseReply(rd, nil)
+ if err != nil {
+ cmd.err = err
+ return err
+ }
+ cmd.val = v.(string)
+ return nil
+}
+
+//------------------------------------------------------------------------------
+
+type FloatCmd struct {
+ *baseCmd
+
+ val float64
+}
+
+func NewFloatCmd(args ...string) *FloatCmd {
+ return &FloatCmd{
+ baseCmd: newBaseCmd(args...),
+ }
+}
+
+func (cmd *FloatCmd) Val() float64 {
+ return cmd.val
+}
+
+func (cmd *FloatCmd) String() string {
+ return cmdString(cmd, cmd.val)
+}
+
+func (cmd *FloatCmd) parseReply(rd *bufio.Reader) error {
+ v, err := parseReply(rd, nil)
+ if err != nil {
+ cmd.err = err
+ return err
+ }
+ cmd.val, cmd.err = strconv.ParseFloat(v.(string), 64)
+ return cmd.err
+}
+
+//------------------------------------------------------------------------------
+
+type StringSliceCmd struct {
+ *baseCmd
+
+ val []string
+}
+
+func NewStringSliceCmd(args ...string) *StringSliceCmd {
+ return &StringSliceCmd{
+ baseCmd: newBaseCmd(args...),
+ }
+}
+
+func (cmd *StringSliceCmd) Val() []string {
+ return cmd.val
+}
+
+func (cmd *StringSliceCmd) Result() ([]string, error) {
+ return cmd.Val(), cmd.Err()
+}
+
+func (cmd *StringSliceCmd) String() string {
+ return cmdString(cmd, cmd.val)
+}
+
+func (cmd *StringSliceCmd) parseReply(rd *bufio.Reader) error {
+ v, err := parseReply(rd, parseStringSlice)
+ if err != nil {
+ cmd.err = err
+ return err
+ }
+ cmd.val = v.([]string)
+ return nil
+}
+
+//------------------------------------------------------------------------------
+
+type BoolSliceCmd struct {
+ *baseCmd
+
+ val []bool
+}
+
+func NewBoolSliceCmd(args ...string) *BoolSliceCmd {
+ return &BoolSliceCmd{
+ baseCmd: newBaseCmd(args...),
+ }
+}
+
+func (cmd *BoolSliceCmd) Val() []bool {
+ return cmd.val
+}
+
+func (cmd *BoolSliceCmd) Result() ([]bool, error) {
+ return cmd.val, cmd.err
+}
+
+func (cmd *BoolSliceCmd) String() string {
+ return cmdString(cmd, cmd.val)
+}
+
+func (cmd *BoolSliceCmd) parseReply(rd *bufio.Reader) error {
+ v, err := parseReply(rd, parseBoolSlice)
+ if err != nil {
+ cmd.err = err
+ return err
+ }
+ cmd.val = v.([]bool)
+ return nil
+}
+
+//------------------------------------------------------------------------------
+
+type StringStringMapCmd struct {
+ *baseCmd
+
+ val map[string]string
+}
+
+func NewStringStringMapCmd(args ...string) *StringStringMapCmd {
+ return &StringStringMapCmd{
+ baseCmd: newBaseCmd(args...),
+ }
+}
+
+func (cmd *StringStringMapCmd) Val() map[string]string {
+ return cmd.val
+}
+
+func (cmd *StringStringMapCmd) Result() (map[string]string, error) {
+ return cmd.val, cmd.err
+}
+
+func (cmd *StringStringMapCmd) String() string {
+ return cmdString(cmd, cmd.val)
+}
+
+func (cmd *StringStringMapCmd) parseReply(rd *bufio.Reader) error {
+ v, err := parseReply(rd, parseStringStringMap)
+ if err != nil {
+ cmd.err = err
+ return err
+ }
+ cmd.val = v.(map[string]string)
+ return nil
+}
+
+//------------------------------------------------------------------------------
+
+type ZSliceCmd struct {
+ *baseCmd
+
+ val []Z
+}
+
+func NewZSliceCmd(args ...string) *ZSliceCmd {
+ return &ZSliceCmd{
+ baseCmd: newBaseCmd(args...),
+ }
+}
+
+func (cmd *ZSliceCmd) Val() []Z {
+ return cmd.val
+}
+
+func (cmd *ZSliceCmd) Result() ([]Z, error) {
+ return cmd.val, cmd.err
+}
+
+func (cmd *ZSliceCmd) String() string {
+ return cmdString(cmd, cmd.val)
+}
+
+func (cmd *ZSliceCmd) parseReply(rd *bufio.Reader) error {
+ v, err := parseReply(rd, parseZSlice)
+ if err != nil {
+ cmd.err = err
+ return err
+ }
+ cmd.val = v.([]Z)
+ return nil
+}
+
+//------------------------------------------------------------------------------
+
+type ScanCmd struct {
+ *baseCmd
+
+ cursor int64
+ keys []string
+}
+
+func NewScanCmd(args ...string) *ScanCmd {
+ return &ScanCmd{
+ baseCmd: newBaseCmd(args...),
+ }
+}
+
+func (cmd *ScanCmd) Val() (int64, []string) {
+ return cmd.cursor, cmd.keys
+}
+
+func (cmd *ScanCmd) Result() (int64, []string, error) {
+ return cmd.cursor, cmd.keys, cmd.err
+}
+
+func (cmd *ScanCmd) String() string {
+ return cmdString(cmd, cmd.keys)
+}
+
+func (cmd *ScanCmd) parseReply(rd *bufio.Reader) error {
+ vi, err := parseReply(rd, parseSlice)
+ if err != nil {
+ cmd.err = err
+ return cmd.err
+ }
+ v := vi.([]interface{})
+
+ cmd.cursor, cmd.err = strconv.ParseInt(v[0].(string), 10, 64)
+ if cmd.err != nil {
+ return cmd.err
+ }
+
+ keys := v[1].([]interface{})
+ for _, keyi := range keys {
+ cmd.keys = append(cmd.keys, keyi.(string))
+ }
+
+ return nil
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/commands.go b/Godeps/_workspace/src/gopkg.in/redis.v2/commands.go
new file mode 100644
index 00000000000..6068bab17e1
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/commands.go
@@ -0,0 +1,1246 @@
+package redis
+
+import (
+ "io"
+ "strconv"
+ "time"
+)
+
+func formatFloat(f float64) string {
+ return strconv.FormatFloat(f, 'f', -1, 64)
+}
+
+func readTimeout(sec int64) time.Duration {
+ if sec == 0 {
+ return 0
+ }
+ return time.Duration(sec+1) * time.Second
+}
+
+//------------------------------------------------------------------------------
+
+func (c *Client) Auth(password string) *StatusCmd {
+ cmd := NewStatusCmd("AUTH", password)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Echo(message string) *StringCmd {
+ cmd := NewStringCmd("ECHO", message)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Ping() *StatusCmd {
+ cmd := NewStatusCmd("PING")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Quit() *StatusCmd {
+ panic("not implemented")
+}
+
+func (c *Client) Select(index int64) *StatusCmd {
+ cmd := NewStatusCmd("SELECT", strconv.FormatInt(index, 10))
+ c.Process(cmd)
+ return cmd
+}
+
+//------------------------------------------------------------------------------
+
+func (c *Client) Del(keys ...string) *IntCmd {
+ args := append([]string{"DEL"}, keys...)
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Dump(key string) *StringCmd {
+ cmd := NewStringCmd("DUMP", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Exists(key string) *BoolCmd {
+ cmd := NewBoolCmd("EXISTS", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Expire(key string, dur time.Duration) *BoolCmd {
+ cmd := NewBoolCmd("EXPIRE", key, strconv.FormatInt(int64(dur/time.Second), 10))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ExpireAt(key string, tm time.Time) *BoolCmd {
+ cmd := NewBoolCmd("EXPIREAT", key, strconv.FormatInt(tm.Unix(), 10))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Keys(pattern string) *StringSliceCmd {
+ cmd := NewStringSliceCmd("KEYS", pattern)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Migrate(host, port, key string, db, timeout int64) *StatusCmd {
+ cmd := NewStatusCmd(
+ "MIGRATE",
+ host,
+ port,
+ key,
+ strconv.FormatInt(db, 10),
+ strconv.FormatInt(timeout, 10),
+ )
+ cmd.setReadTimeout(readTimeout(timeout))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Move(key string, db int64) *BoolCmd {
+ cmd := NewBoolCmd("MOVE", key, strconv.FormatInt(db, 10))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ObjectRefCount(keys ...string) *IntCmd {
+ args := append([]string{"OBJECT", "REFCOUNT"}, keys...)
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ObjectEncoding(keys ...string) *StringCmd {
+ args := append([]string{"OBJECT", "ENCODING"}, keys...)
+ cmd := NewStringCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ObjectIdleTime(keys ...string) *DurationCmd {
+ args := append([]string{"OBJECT", "IDLETIME"}, keys...)
+ cmd := NewDurationCmd(time.Second, args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Persist(key string) *BoolCmd {
+ cmd := NewBoolCmd("PERSIST", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) PExpire(key string, dur time.Duration) *BoolCmd {
+ cmd := NewBoolCmd("PEXPIRE", key, strconv.FormatInt(int64(dur/time.Millisecond), 10))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) PExpireAt(key string, tm time.Time) *BoolCmd {
+ cmd := NewBoolCmd(
+ "PEXPIREAT",
+ key,
+ strconv.FormatInt(tm.UnixNano()/int64(time.Millisecond), 10),
+ )
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) PTTL(key string) *DurationCmd {
+ cmd := NewDurationCmd(time.Millisecond, "PTTL", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) RandomKey() *StringCmd {
+ cmd := NewStringCmd("RANDOMKEY")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Rename(key, newkey string) *StatusCmd {
+ cmd := NewStatusCmd("RENAME", key, newkey)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) RenameNX(key, newkey string) *BoolCmd {
+ cmd := NewBoolCmd("RENAMENX", key, newkey)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Restore(key string, ttl int64, value string) *StatusCmd {
+ cmd := NewStatusCmd(
+ "RESTORE",
+ key,
+ strconv.FormatInt(ttl, 10),
+ value,
+ )
+ c.Process(cmd)
+ return cmd
+}
+
+type Sort struct {
+ By string
+ Offset, Count float64
+ Get []string
+ Order string
+ IsAlpha bool
+ Store string
+}
+
+func (c *Client) Sort(key string, sort Sort) *StringSliceCmd {
+ args := []string{"SORT", key}
+ if sort.By != "" {
+ args = append(args, "BY", sort.By)
+ }
+ if sort.Offset != 0 || sort.Count != 0 {
+ args = append(args, "LIMIT", formatFloat(sort.Offset), formatFloat(sort.Count))
+ }
+ for _, get := range sort.Get {
+ args = append(args, "GET", get)
+ }
+ if sort.Order != "" {
+ args = append(args, sort.Order)
+ }
+ if sort.IsAlpha {
+ args = append(args, "ALPHA")
+ }
+ if sort.Store != "" {
+ args = append(args, "STORE", sort.Store)
+ }
+ cmd := NewStringSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) TTL(key string) *DurationCmd {
+ cmd := NewDurationCmd(time.Second, "TTL", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Type(key string) *StatusCmd {
+ cmd := NewStatusCmd("TYPE", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Scan(cursor int64, match string, count int64) *ScanCmd {
+ args := []string{"SCAN", strconv.FormatInt(cursor, 10)}
+ if match != "" {
+ args = append(args, "MATCH", match)
+ }
+ if count > 0 {
+ args = append(args, "COUNT", strconv.FormatInt(count, 10))
+ }
+ cmd := NewScanCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SScan(key string, cursor int64, match string, count int64) *ScanCmd {
+ args := []string{"SSCAN", key, strconv.FormatInt(cursor, 10)}
+ if match != "" {
+ args = append(args, "MATCH", match)
+ }
+ if count > 0 {
+ args = append(args, "COUNT", strconv.FormatInt(count, 10))
+ }
+ cmd := NewScanCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HScan(key string, cursor int64, match string, count int64) *ScanCmd {
+ args := []string{"HSCAN", key, strconv.FormatInt(cursor, 10)}
+ if match != "" {
+ args = append(args, "MATCH", match)
+ }
+ if count > 0 {
+ args = append(args, "COUNT", strconv.FormatInt(count, 10))
+ }
+ cmd := NewScanCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZScan(key string, cursor int64, match string, count int64) *ScanCmd {
+ args := []string{"ZSCAN", key, strconv.FormatInt(cursor, 10)}
+ if match != "" {
+ args = append(args, "MATCH", match)
+ }
+ if count > 0 {
+ args = append(args, "COUNT", strconv.FormatInt(count, 10))
+ }
+ cmd := NewScanCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+//------------------------------------------------------------------------------
+
+func (c *Client) Append(key, value string) *IntCmd {
+ cmd := NewIntCmd("APPEND", key, value)
+ c.Process(cmd)
+ return cmd
+}
+
+type BitCount struct {
+ Start, End int64
+}
+
+func (c *Client) BitCount(key string, bitCount *BitCount) *IntCmd {
+ args := []string{"BITCOUNT", key}
+ if bitCount != nil {
+ args = append(
+ args,
+ strconv.FormatInt(bitCount.Start, 10),
+ strconv.FormatInt(bitCount.End, 10),
+ )
+ }
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) bitOp(op, destKey string, keys ...string) *IntCmd {
+ args := []string{"BITOP", op, destKey}
+ args = append(args, keys...)
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) BitOpAnd(destKey string, keys ...string) *IntCmd {
+ return c.bitOp("AND", destKey, keys...)
+}
+
+func (c *Client) BitOpOr(destKey string, keys ...string) *IntCmd {
+ return c.bitOp("OR", destKey, keys...)
+}
+
+func (c *Client) BitOpXor(destKey string, keys ...string) *IntCmd {
+ return c.bitOp("XOR", destKey, keys...)
+}
+
+func (c *Client) BitOpNot(destKey string, key string) *IntCmd {
+ return c.bitOp("NOT", destKey, key)
+}
+
+func (c *Client) Decr(key string) *IntCmd {
+ cmd := NewIntCmd("DECR", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) DecrBy(key string, decrement int64) *IntCmd {
+ cmd := NewIntCmd("DECRBY", key, strconv.FormatInt(decrement, 10))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Get(key string) *StringCmd {
+ cmd := NewStringCmd("GET", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) GetBit(key string, offset int64) *IntCmd {
+ cmd := NewIntCmd("GETBIT", key, strconv.FormatInt(offset, 10))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) GetRange(key string, start, end int64) *StringCmd {
+ cmd := NewStringCmd(
+ "GETRANGE",
+ key,
+ strconv.FormatInt(start, 10),
+ strconv.FormatInt(end, 10),
+ )
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) GetSet(key, value string) *StringCmd {
+ cmd := NewStringCmd("GETSET", key, value)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Incr(key string) *IntCmd {
+ cmd := NewIntCmd("INCR", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) IncrBy(key string, value int64) *IntCmd {
+ cmd := NewIntCmd("INCRBY", key, strconv.FormatInt(value, 10))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) IncrByFloat(key string, value float64) *FloatCmd {
+ cmd := NewFloatCmd("INCRBYFLOAT", key, formatFloat(value))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) MGet(keys ...string) *SliceCmd {
+ args := append([]string{"MGET"}, keys...)
+ cmd := NewSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) MSet(pairs ...string) *StatusCmd {
+ args := append([]string{"MSET"}, pairs...)
+ cmd := NewStatusCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) MSetNX(pairs ...string) *BoolCmd {
+ args := append([]string{"MSETNX"}, pairs...)
+ cmd := NewBoolCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) PSetEx(key string, dur time.Duration, value string) *StatusCmd {
+ cmd := NewStatusCmd(
+ "PSETEX",
+ key,
+ strconv.FormatInt(int64(dur/time.Millisecond), 10),
+ value,
+ )
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Set(key, value string) *StatusCmd {
+ cmd := NewStatusCmd("SET", key, value)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SetBit(key string, offset int64, value int) *IntCmd {
+ cmd := NewIntCmd(
+ "SETBIT",
+ key,
+ strconv.FormatInt(offset, 10),
+ strconv.FormatInt(int64(value), 10),
+ )
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SetEx(key string, dur time.Duration, value string) *StatusCmd {
+ cmd := NewStatusCmd("SETEX", key, strconv.FormatInt(int64(dur/time.Second), 10), value)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SetNX(key, value string) *BoolCmd {
+ cmd := NewBoolCmd("SETNX", key, value)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SetRange(key string, offset int64, value string) *IntCmd {
+ cmd := NewIntCmd("SETRANGE", key, strconv.FormatInt(offset, 10), value)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) StrLen(key string) *IntCmd {
+ cmd := NewIntCmd("STRLEN", key)
+ c.Process(cmd)
+ return cmd
+}
+
+//------------------------------------------------------------------------------
+
+func (c *Client) HDel(key string, fields ...string) *IntCmd {
+ args := append([]string{"HDEL", key}, fields...)
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HExists(key, field string) *BoolCmd {
+ cmd := NewBoolCmd("HEXISTS", key, field)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HGet(key, field string) *StringCmd {
+ cmd := NewStringCmd("HGET", key, field)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HGetAll(key string) *StringSliceCmd {
+ cmd := NewStringSliceCmd("HGETALL", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HGetAllMap(key string) *StringStringMapCmd {
+ cmd := NewStringStringMapCmd("HGETALL", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HIncrBy(key, field string, incr int64) *IntCmd {
+ cmd := NewIntCmd("HINCRBY", key, field, strconv.FormatInt(incr, 10))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HIncrByFloat(key, field string, incr float64) *FloatCmd {
+ cmd := NewFloatCmd("HINCRBYFLOAT", key, field, formatFloat(incr))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HKeys(key string) *StringSliceCmd {
+ cmd := NewStringSliceCmd("HKEYS", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HLen(key string) *IntCmd {
+ cmd := NewIntCmd("HLEN", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HMGet(key string, fields ...string) *SliceCmd {
+ args := append([]string{"HMGET", key}, fields...)
+ cmd := NewSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HMSet(key, field, value string, pairs ...string) *StatusCmd {
+ args := append([]string{"HMSET", key, field, value}, pairs...)
+ cmd := NewStatusCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HSet(key, field, value string) *BoolCmd {
+ cmd := NewBoolCmd("HSET", key, field, value)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HSetNX(key, field, value string) *BoolCmd {
+ cmd := NewBoolCmd("HSETNX", key, field, value)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) HVals(key string) *StringSliceCmd {
+ cmd := NewStringSliceCmd("HVALS", key)
+ c.Process(cmd)
+ return cmd
+}
+
+//------------------------------------------------------------------------------
+
+func (c *Client) BLPop(timeout int64, keys ...string) *StringSliceCmd {
+ args := append([]string{"BLPOP"}, keys...)
+ args = append(args, strconv.FormatInt(timeout, 10))
+ cmd := NewStringSliceCmd(args...)
+ cmd.setReadTimeout(readTimeout(timeout))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) BRPop(timeout int64, keys ...string) *StringSliceCmd {
+ args := append([]string{"BRPOP"}, keys...)
+ args = append(args, strconv.FormatInt(timeout, 10))
+ cmd := NewStringSliceCmd(args...)
+ cmd.setReadTimeout(readTimeout(timeout))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) BRPopLPush(source, destination string, timeout int64) *StringCmd {
+ cmd := NewStringCmd(
+ "BRPOPLPUSH",
+ source,
+ destination,
+ strconv.FormatInt(timeout, 10),
+ )
+ cmd.setReadTimeout(readTimeout(timeout))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) LIndex(key string, index int64) *StringCmd {
+ cmd := NewStringCmd("LINDEX", key, strconv.FormatInt(index, 10))
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) LInsert(key, op, pivot, value string) *IntCmd {
+ cmd := NewIntCmd("LINSERT", key, op, pivot, value)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) LLen(key string) *IntCmd {
+ cmd := NewIntCmd("LLEN", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) LPop(key string) *StringCmd {
+ cmd := NewStringCmd("LPOP", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) LPush(key string, values ...string) *IntCmd {
+ args := append([]string{"LPUSH", key}, values...)
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) LPushX(key, value string) *IntCmd {
+ cmd := NewIntCmd("LPUSHX", key, value)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) LRange(key string, start, stop int64) *StringSliceCmd {
+ cmd := NewStringSliceCmd(
+ "LRANGE",
+ key,
+ strconv.FormatInt(start, 10),
+ strconv.FormatInt(stop, 10),
+ )
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) LRem(key string, count int64, value string) *IntCmd {
+ cmd := NewIntCmd("LREM", key, strconv.FormatInt(count, 10), value)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) LSet(key string, index int64, value string) *StatusCmd {
+ cmd := NewStatusCmd("LSET", key, strconv.FormatInt(index, 10), value)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) LTrim(key string, start, stop int64) *StatusCmd {
+ cmd := NewStatusCmd(
+ "LTRIM",
+ key,
+ strconv.FormatInt(start, 10),
+ strconv.FormatInt(stop, 10),
+ )
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) RPop(key string) *StringCmd {
+ cmd := NewStringCmd("RPOP", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) RPopLPush(source, destination string) *StringCmd {
+ cmd := NewStringCmd("RPOPLPUSH", source, destination)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) RPush(key string, values ...string) *IntCmd {
+ args := append([]string{"RPUSH", key}, values...)
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) RPushX(key string, value string) *IntCmd {
+ cmd := NewIntCmd("RPUSHX", key, value)
+ c.Process(cmd)
+ return cmd
+}
+
+//------------------------------------------------------------------------------
+
+func (c *Client) SAdd(key string, members ...string) *IntCmd {
+ args := append([]string{"SADD", key}, members...)
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SCard(key string) *IntCmd {
+ cmd := NewIntCmd("SCARD", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SDiff(keys ...string) *StringSliceCmd {
+ args := append([]string{"SDIFF"}, keys...)
+ cmd := NewStringSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SDiffStore(destination string, keys ...string) *IntCmd {
+ args := append([]string{"SDIFFSTORE", destination}, keys...)
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SInter(keys ...string) *StringSliceCmd {
+ args := append([]string{"SINTER"}, keys...)
+ cmd := NewStringSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SInterStore(destination string, keys ...string) *IntCmd {
+ args := append([]string{"SINTERSTORE", destination}, keys...)
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SIsMember(key, member string) *BoolCmd {
+ cmd := NewBoolCmd("SISMEMBER", key, member)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SMembers(key string) *StringSliceCmd {
+ cmd := NewStringSliceCmd("SMEMBERS", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SMove(source, destination, member string) *BoolCmd {
+ cmd := NewBoolCmd("SMOVE", source, destination, member)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SPop(key string) *StringCmd {
+ cmd := NewStringCmd("SPOP", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SRandMember(key string) *StringCmd {
+ cmd := NewStringCmd("SRANDMEMBER", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SRem(key string, members ...string) *IntCmd {
+ args := append([]string{"SREM", key}, members...)
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SUnion(keys ...string) *StringSliceCmd {
+ args := append([]string{"SUNION"}, keys...)
+ cmd := NewStringSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SUnionStore(destination string, keys ...string) *IntCmd {
+ args := append([]string{"SUNIONSTORE", destination}, keys...)
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+//------------------------------------------------------------------------------
+
+type Z struct {
+ Score float64
+ Member string
+}
+
+type ZStore struct {
+ Weights []int64
+ Aggregate string
+}
+
+func (c *Client) ZAdd(key string, members ...Z) *IntCmd {
+ args := []string{"ZADD", key}
+ for _, m := range members {
+ args = append(args, formatFloat(m.Score), m.Member)
+ }
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZCard(key string) *IntCmd {
+ cmd := NewIntCmd("ZCARD", key)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZCount(key, min, max string) *IntCmd {
+ cmd := NewIntCmd("ZCOUNT", key, min, max)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZIncrBy(key string, increment float64, member string) *FloatCmd {
+ cmd := NewFloatCmd("ZINCRBY", key, formatFloat(increment), member)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZInterStore(
+ destination string,
+ store ZStore,
+ keys ...string,
+) *IntCmd {
+ args := []string{"ZINTERSTORE", destination, strconv.FormatInt(int64(len(keys)), 10)}
+ args = append(args, keys...)
+ if len(store.Weights) > 0 {
+ args = append(args, "WEIGHTS")
+ for _, weight := range store.Weights {
+ args = append(args, strconv.FormatInt(weight, 10))
+ }
+ }
+ if store.Aggregate != "" {
+ args = append(args, "AGGREGATE", store.Aggregate)
+ }
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) zRange(key string, start, stop int64, withScores bool) *StringSliceCmd {
+ args := []string{
+ "ZRANGE",
+ key,
+ strconv.FormatInt(start, 10),
+ strconv.FormatInt(stop, 10),
+ }
+ if withScores {
+ args = append(args, "WITHSCORES")
+ }
+ cmd := NewStringSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZRange(key string, start, stop int64) *StringSliceCmd {
+ return c.zRange(key, start, stop, false)
+}
+
+func (c *Client) ZRangeWithScores(key string, start, stop int64) *ZSliceCmd {
+ args := []string{
+ "ZRANGE",
+ key,
+ strconv.FormatInt(start, 10),
+ strconv.FormatInt(stop, 10),
+ "WITHSCORES",
+ }
+ cmd := NewZSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+type ZRangeByScore struct {
+ Min, Max string
+
+ Offset, Count int64
+}
+
+func (c *Client) zRangeByScore(key string, opt ZRangeByScore, withScores bool) *StringSliceCmd {
+ args := []string{"ZRANGEBYSCORE", key, opt.Min, opt.Max}
+ if withScores {
+ args = append(args, "WITHSCORES")
+ }
+ if opt.Offset != 0 || opt.Count != 0 {
+ args = append(
+ args,
+ "LIMIT",
+ strconv.FormatInt(opt.Offset, 10),
+ strconv.FormatInt(opt.Count, 10),
+ )
+ }
+ cmd := NewStringSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZRangeByScore(key string, opt ZRangeByScore) *StringSliceCmd {
+ return c.zRangeByScore(key, opt, false)
+}
+
+func (c *Client) ZRangeByScoreWithScores(key string, opt ZRangeByScore) *ZSliceCmd {
+ args := []string{"ZRANGEBYSCORE", key, opt.Min, opt.Max, "WITHSCORES"}
+ if opt.Offset != 0 || opt.Count != 0 {
+ args = append(
+ args,
+ "LIMIT",
+ strconv.FormatInt(opt.Offset, 10),
+ strconv.FormatInt(opt.Count, 10),
+ )
+ }
+ cmd := NewZSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZRank(key, member string) *IntCmd {
+ cmd := NewIntCmd("ZRANK", key, member)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZRem(key string, members ...string) *IntCmd {
+ args := append([]string{"ZREM", key}, members...)
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZRemRangeByRank(key string, start, stop int64) *IntCmd {
+ cmd := NewIntCmd(
+ "ZREMRANGEBYRANK",
+ key,
+ strconv.FormatInt(start, 10),
+ strconv.FormatInt(stop, 10),
+ )
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZRemRangeByScore(key, min, max string) *IntCmd {
+ cmd := NewIntCmd("ZREMRANGEBYSCORE", key, min, max)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) zRevRange(key, start, stop string, withScores bool) *StringSliceCmd {
+ args := []string{"ZREVRANGE", key, start, stop}
+ if withScores {
+ args = append(args, "WITHSCORES")
+ }
+ cmd := NewStringSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZRevRange(key, start, stop string) *StringSliceCmd {
+ return c.zRevRange(key, start, stop, false)
+}
+
+func (c *Client) ZRevRangeWithScores(key, start, stop string) *ZSliceCmd {
+ args := []string{"ZREVRANGE", key, start, stop, "WITHSCORES"}
+ cmd := NewZSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) zRevRangeByScore(key string, opt ZRangeByScore, withScores bool) *StringSliceCmd {
+ args := []string{"ZREVRANGEBYSCORE", key, opt.Max, opt.Min}
+ if withScores {
+ args = append(args, "WITHSCORES")
+ }
+ if opt.Offset != 0 || opt.Count != 0 {
+ args = append(
+ args,
+ "LIMIT",
+ strconv.FormatInt(opt.Offset, 10),
+ strconv.FormatInt(opt.Count, 10),
+ )
+ }
+ cmd := NewStringSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZRevRangeByScore(key string, opt ZRangeByScore) *StringSliceCmd {
+ return c.zRevRangeByScore(key, opt, false)
+}
+
+func (c *Client) ZRevRangeByScoreWithScores(key string, opt ZRangeByScore) *ZSliceCmd {
+ args := []string{"ZREVRANGEBYSCORE", key, opt.Max, opt.Min, "WITHSCORES"}
+ if opt.Offset != 0 || opt.Count != 0 {
+ args = append(
+ args,
+ "LIMIT",
+ strconv.FormatInt(opt.Offset, 10),
+ strconv.FormatInt(opt.Count, 10),
+ )
+ }
+ cmd := NewZSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZRevRank(key, member string) *IntCmd {
+ cmd := NewIntCmd("ZREVRANK", key, member)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZScore(key, member string) *FloatCmd {
+ cmd := NewFloatCmd("ZSCORE", key, member)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ZUnionStore(
+ destination string,
+ store ZStore,
+ keys ...string,
+) *IntCmd {
+ args := []string{"ZUNIONSTORE", destination, strconv.FormatInt(int64(len(keys)), 10)}
+ args = append(args, keys...)
+ if len(store.Weights) > 0 {
+ args = append(args, "WEIGHTS")
+ for _, weight := range store.Weights {
+ args = append(args, strconv.FormatInt(weight, 10))
+ }
+ }
+ if store.Aggregate != "" {
+ args = append(args, "AGGREGATE", store.Aggregate)
+ }
+ cmd := NewIntCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+//------------------------------------------------------------------------------
+
+func (c *Client) BgRewriteAOF() *StatusCmd {
+ cmd := NewStatusCmd("BGREWRITEAOF")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) BgSave() *StatusCmd {
+ cmd := NewStatusCmd("BGSAVE")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ClientKill(ipPort string) *StatusCmd {
+ cmd := NewStatusCmd("CLIENT", "KILL", ipPort)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ClientList() *StringCmd {
+ cmd := NewStringCmd("CLIENT", "LIST")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ConfigGet(parameter string) *SliceCmd {
+ cmd := NewSliceCmd("CONFIG", "GET", parameter)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ConfigResetStat() *StatusCmd {
+ cmd := NewStatusCmd("CONFIG", "RESETSTAT")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ConfigSet(parameter, value string) *StatusCmd {
+ cmd := NewStatusCmd("CONFIG", "SET", parameter, value)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) DbSize() *IntCmd {
+ cmd := NewIntCmd("DBSIZE")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) FlushAll() *StatusCmd {
+ cmd := NewStatusCmd("FLUSHALL")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) FlushDb() *StatusCmd {
+ cmd := NewStatusCmd("FLUSHDB")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Info() *StringCmd {
+ cmd := NewStringCmd("INFO")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) LastSave() *IntCmd {
+ cmd := NewIntCmd("LASTSAVE")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) Save() *StatusCmd {
+ cmd := NewStatusCmd("SAVE")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) shutdown(modifier string) *StatusCmd {
+ var args []string
+ if modifier == "" {
+ args = []string{"SHUTDOWN"}
+ } else {
+ args = []string{"SHUTDOWN", modifier}
+ }
+ cmd := NewStatusCmd(args...)
+ c.Process(cmd)
+ if err := cmd.Err(); err != nil {
+ if err == io.EOF {
+ // Server quit as expected.
+ cmd.err = nil
+ }
+ } else {
+ // Server did not quit. String reply contains the reason.
+ cmd.err = errorf(cmd.val)
+ cmd.val = ""
+ }
+ return cmd
+}
+
+func (c *Client) Shutdown() *StatusCmd {
+ return c.shutdown("")
+}
+
+func (c *Client) ShutdownSave() *StatusCmd {
+ return c.shutdown("SAVE")
+}
+
+func (c *Client) ShutdownNoSave() *StatusCmd {
+ return c.shutdown("NOSAVE")
+}
+
+func (c *Client) SlaveOf(host, port string) *StatusCmd {
+ cmd := NewStatusCmd("SLAVEOF", host, port)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) SlowLog() {
+ panic("not implemented")
+}
+
+func (c *Client) Sync() {
+ panic("not implemented")
+}
+
+func (c *Client) Time() *StringSliceCmd {
+ cmd := NewStringSliceCmd("TIME")
+ c.Process(cmd)
+ return cmd
+}
+
+//------------------------------------------------------------------------------
+
+func (c *Client) Eval(script string, keys []string, args []string) *Cmd {
+ cmdArgs := []string{"EVAL", script, strconv.FormatInt(int64(len(keys)), 10)}
+ cmdArgs = append(cmdArgs, keys...)
+ cmdArgs = append(cmdArgs, args...)
+ cmd := NewCmd(cmdArgs...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) EvalSha(sha1 string, keys []string, args []string) *Cmd {
+ cmdArgs := []string{"EVALSHA", sha1, strconv.FormatInt(int64(len(keys)), 10)}
+ cmdArgs = append(cmdArgs, keys...)
+ cmdArgs = append(cmdArgs, args...)
+ cmd := NewCmd(cmdArgs...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ScriptExists(scripts ...string) *BoolSliceCmd {
+ args := append([]string{"SCRIPT", "EXISTS"}, scripts...)
+ cmd := NewBoolSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ScriptFlush() *StatusCmd {
+ cmd := NewStatusCmd("SCRIPT", "FLUSH")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ScriptKill() *StatusCmd {
+ cmd := NewStatusCmd("SCRIPT", "KILL")
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) ScriptLoad(script string) *StringCmd {
+ cmd := NewStringCmd("SCRIPT", "LOAD", script)
+ c.Process(cmd)
+ return cmd
+}
+
+//------------------------------------------------------------------------------
+
+func (c *Client) DebugObject(key string) *StringCmd {
+ cmd := NewStringCmd("DEBUG", "OBJECT", key)
+ c.Process(cmd)
+ return cmd
+}
+
+//------------------------------------------------------------------------------
+
+func (c *Client) PubSubChannels(pattern string) *StringSliceCmd {
+ args := []string{"PUBSUB", "CHANNELS"}
+ if pattern != "*" {
+ args = append(args, pattern)
+ }
+ cmd := NewStringSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) PubSubNumSub(channels ...string) *SliceCmd {
+ args := []string{"PUBSUB", "NUMSUB"}
+ args = append(args, channels...)
+ cmd := NewSliceCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Client) PubSubNumPat() *IntCmd {
+ cmd := NewIntCmd("PUBSUB", "NUMPAT")
+ c.Process(cmd)
+ return cmd
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/doc.go b/Godeps/_workspace/src/gopkg.in/redis.v2/doc.go
new file mode 100644
index 00000000000..55262533a63
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/doc.go
@@ -0,0 +1,4 @@
+/*
+Package redis implements a Redis client.
+*/
+package redis
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/error.go b/Godeps/_workspace/src/gopkg.in/redis.v2/error.go
new file mode 100644
index 00000000000..667fffdc682
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/error.go
@@ -0,0 +1,23 @@
+package redis
+
+import (
+ "fmt"
+)
+
+// Redis nil reply.
+var Nil = errorf("redis: nil")
+
+// Redis transaction failed.
+var TxFailedErr = errorf("redis: transaction failed")
+
+type redisError struct {
+ s string
+}
+
+func errorf(s string, args ...interface{}) redisError {
+ return redisError{s: fmt.Sprintf(s, args...)}
+}
+
+func (err redisError) Error() string {
+ return err.s
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/example_test.go b/Godeps/_workspace/src/gopkg.in/redis.v2/example_test.go
new file mode 100644
index 00000000000..dbc95131033
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/example_test.go
@@ -0,0 +1,180 @@
+package redis_test
+
+import (
+ "fmt"
+ "strconv"
+
+ "gopkg.in/redis.v2"
+)
+
+var client *redis.Client
+
+func init() {
+ client = redis.NewTCPClient(&redis.Options{
+ Addr: ":6379",
+ })
+ client.FlushDb()
+}
+
+func ExampleNewTCPClient() {
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: "localhost:6379",
+ Password: "", // no password set
+ DB: 0, // use default DB
+ })
+
+ pong, err := client.Ping().Result()
+ fmt.Println(pong, err)
+ // Output: PONG
+}
+
+func ExampleNewFailoverClient() {
+ client := redis.NewFailoverClient(&redis.FailoverOptions{
+ MasterName: "master",
+ SentinelAddrs: []string{":26379"},
+ })
+
+ pong, err := client.Ping().Result()
+ fmt.Println(pong, err)
+ // Output: PONG
+}
+
+func ExampleClient() {
+ if err := client.Set("foo", "bar").Err(); err != nil {
+ panic(err)
+ }
+
+ v, err := client.Get("hello").Result()
+ fmt.Printf("%q %q %v", v, err, err == redis.Nil)
+ // Output: "" "redis: nil" true
+}
+
+func ExampleClient_Incr() {
+ if err := client.Incr("counter").Err(); err != nil {
+ panic(err)
+ }
+
+ n, err := client.Get("counter").Int64()
+ fmt.Println(n, err)
+ // Output: 1
+}
+
+func ExampleClient_Pipelined() {
+ cmds, err := client.Pipelined(func(c *redis.Pipeline) error {
+ c.Set("key1", "hello1")
+ c.Get("key1")
+ return nil
+ })
+ fmt.Println(err)
+ set := cmds[0].(*redis.StatusCmd)
+ fmt.Println(set)
+ get := cmds[1].(*redis.StringCmd)
+ fmt.Println(get)
+ // Output:
+ // SET key1 hello1: OK
+ // GET key1: hello1
+}
+
+func ExamplePipeline() {
+ pipeline := client.Pipeline()
+ set := pipeline.Set("key1", "hello1")
+ get := pipeline.Get("key1")
+ cmds, err := pipeline.Exec()
+ fmt.Println(cmds, err)
+ fmt.Println(set)
+ fmt.Println(get)
+ // Output: [SET key1 hello1: OK GET key1: hello1]
+ // SET key1 hello1: OK
+ // GET key1: hello1
+}
+
+func ExampleMulti() {
+ incr := func(tx *redis.Multi) ([]redis.Cmder, error) {
+ s, err := tx.Get("key").Result()
+ if err != nil && err != redis.Nil {
+ return nil, err
+ }
+ n, _ := strconv.ParseInt(s, 10, 64)
+
+ return tx.Exec(func() error {
+ tx.Set("key", strconv.FormatInt(n+1, 10))
+ return nil
+ })
+ }
+
+ client.Del("key")
+
+ tx := client.Multi()
+ defer tx.Close()
+
+ watch := tx.Watch("key")
+ _ = watch.Err()
+
+ for {
+ cmds, err := incr(tx)
+ if err == redis.TxFailedErr {
+ continue
+ } else if err != nil {
+ panic(err)
+ }
+ fmt.Println(cmds, err)
+ break
+ }
+
+ // Output: [SET key 1: OK]
+}
+
+func ExamplePubSub() {
+ pubsub := client.PubSub()
+ defer pubsub.Close()
+
+ err := pubsub.Subscribe("mychannel")
+ _ = err
+
+ msg, err := pubsub.Receive()
+ fmt.Println(msg, err)
+
+ pub := client.Publish("mychannel", "hello")
+ _ = pub.Err()
+
+ msg, err = pubsub.Receive()
+ fmt.Println(msg, err)
+
+ // Output: subscribe: mychannel
+ // Message
+}
+
+func ExampleScript() {
+ setnx := redis.NewScript(`
+ if redis.call("get", KEYS[1]) == false then
+ redis.call("set", KEYS[1], ARGV[1])
+ return 1
+ end
+ return 0
+ `)
+
+ v1, err := setnx.Run(client, []string{"keynx"}, []string{"foo"}).Result()
+ fmt.Println(v1.(int64), err)
+
+ v2, err := setnx.Run(client, []string{"keynx"}, []string{"bar"}).Result()
+ fmt.Println(v2.(int64), err)
+
+ get := client.Get("keynx")
+ fmt.Println(get)
+
+ // Output: 1
+ // 0
+ // GET keynx: foo
+}
+
+func Example_customCommand() {
+ Get := func(client *redis.Client, key string) *redis.StringCmd {
+ cmd := redis.NewStringCmd("GET", key)
+ client.Process(cmd)
+ return cmd
+ }
+
+ v, err := Get(client, "key_does_not_exist").Result()
+ fmt.Printf("%q %s", v, err)
+ // Output: "" redis: nil
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/export_test.go b/Godeps/_workspace/src/gopkg.in/redis.v2/export_test.go
new file mode 100644
index 00000000000..7f7fa67972b
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/export_test.go
@@ -0,0 +1,5 @@
+package redis
+
+func (c *baseClient) Pool() pool {
+ return c.connPool
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/multi.go b/Godeps/_workspace/src/gopkg.in/redis.v2/multi.go
new file mode 100644
index 00000000000..bff38dfaaa4
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/multi.go
@@ -0,0 +1,138 @@
+package redis
+
+import (
+ "errors"
+ "fmt"
+)
+
+var errDiscard = errors.New("redis: Discard can be used only inside Exec")
+
+// Not thread-safe.
+type Multi struct {
+ *Client
+}
+
+func (c *Client) Multi() *Multi {
+ return &Multi{
+ Client: &Client{
+ baseClient: &baseClient{
+ opt: c.opt,
+ connPool: newSingleConnPool(c.connPool, true),
+ },
+ },
+ }
+}
+
+func (c *Multi) Close() error {
+ if err := c.Unwatch().Err(); err != nil {
+ return err
+ }
+ return c.Client.Close()
+}
+
+func (c *Multi) Watch(keys ...string) *StatusCmd {
+ args := append([]string{"WATCH"}, keys...)
+ cmd := NewStatusCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Multi) Unwatch(keys ...string) *StatusCmd {
+ args := append([]string{"UNWATCH"}, keys...)
+ cmd := NewStatusCmd(args...)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *Multi) Discard() error {
+ if c.cmds == nil {
+ return errDiscard
+ }
+ c.cmds = c.cmds[:1]
+ return nil
+}
+
+// Exec always returns list of commands. If transaction fails
+// TxFailedErr is returned. Otherwise Exec returns error of the first
+// failed command or nil.
+func (c *Multi) Exec(f func() error) ([]Cmder, error) {
+ c.cmds = []Cmder{NewStatusCmd("MULTI")}
+ if err := f(); err != nil {
+ return nil, err
+ }
+ c.cmds = append(c.cmds, NewSliceCmd("EXEC"))
+
+ cmds := c.cmds
+ c.cmds = nil
+
+ if len(cmds) == 2 {
+ return []Cmder{}, nil
+ }
+
+ cn, err := c.conn()
+ if err != nil {
+ setCmdsErr(cmds[1:len(cmds)-1], err)
+ return cmds[1 : len(cmds)-1], err
+ }
+
+ err = c.execCmds(cn, cmds)
+ if err != nil {
+ c.freeConn(cn, err)
+ return cmds[1 : len(cmds)-1], err
+ }
+
+ c.putConn(cn)
+ return cmds[1 : len(cmds)-1], nil
+}
+
+func (c *Multi) execCmds(cn *conn, cmds []Cmder) error {
+ err := c.writeCmd(cn, cmds...)
+ if err != nil {
+ setCmdsErr(cmds[1:len(cmds)-1], err)
+ return err
+ }
+
+ statusCmd := NewStatusCmd()
+
+ // Omit last command (EXEC).
+ cmdsLen := len(cmds) - 1
+
+ // Parse queued replies.
+ for i := 0; i < cmdsLen; i++ {
+ if err := statusCmd.parseReply(cn.rd); err != nil {
+ setCmdsErr(cmds[1:len(cmds)-1], err)
+ return err
+ }
+ }
+
+ // Parse number of replies.
+ line, err := readLine(cn.rd)
+ if err != nil {
+ setCmdsErr(cmds[1:len(cmds)-1], err)
+ return err
+ }
+ if line[0] != '*' {
+ err := fmt.Errorf("redis: expected '*', but got line %q", line)
+ setCmdsErr(cmds[1:len(cmds)-1], err)
+ return err
+ }
+ if len(line) == 3 && line[1] == '-' && line[2] == '1' {
+ setCmdsErr(cmds[1:len(cmds)-1], TxFailedErr)
+ return TxFailedErr
+ }
+
+ var firstCmdErr error
+
+ // Parse replies.
+ // Loop starts from 1 to omit MULTI cmd.
+ for i := 1; i < cmdsLen; i++ {
+ cmd := cmds[i]
+ if err := cmd.parseReply(cn.rd); err != nil {
+ if firstCmdErr == nil {
+ firstCmdErr = err
+ }
+ }
+ }
+
+ return firstCmdErr
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/parser.go b/Godeps/_workspace/src/gopkg.in/redis.v2/parser.go
new file mode 100644
index 00000000000..b4c380c7644
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/parser.go
@@ -0,0 +1,262 @@
+package redis
+
+import (
+ "errors"
+ "fmt"
+ "strconv"
+
+ "gopkg.in/bufio.v1"
+)
+
+type multiBulkParser func(rd *bufio.Reader, n int64) (interface{}, error)
+
+var (
+ errReaderTooSmall = errors.New("redis: reader is too small")
+)
+
+//------------------------------------------------------------------------------
+
+func appendArgs(buf []byte, args []string) []byte {
+ buf = append(buf, '*')
+ buf = strconv.AppendUint(buf, uint64(len(args)), 10)
+ buf = append(buf, '\r', '\n')
+ for _, arg := range args {
+ buf = append(buf, '$')
+ buf = strconv.AppendUint(buf, uint64(len(arg)), 10)
+ buf = append(buf, '\r', '\n')
+ buf = append(buf, arg...)
+ buf = append(buf, '\r', '\n')
+ }
+ return buf
+}
+
+//------------------------------------------------------------------------------
+
+func readLine(rd *bufio.Reader) ([]byte, error) {
+ line, isPrefix, err := rd.ReadLine()
+ if err != nil {
+ return line, err
+ }
+ if isPrefix {
+ return line, errReaderTooSmall
+ }
+ return line, nil
+}
+
+func readN(rd *bufio.Reader, n int) ([]byte, error) {
+ b, err := rd.ReadN(n)
+ if err == bufio.ErrBufferFull {
+ tmp := make([]byte, n)
+ r := copy(tmp, b)
+ b = tmp
+
+ for {
+ nn, err := rd.Read(b[r:])
+ r += nn
+ if r >= n {
+ // Ignore error if we read enough.
+ break
+ }
+ if err != nil {
+ return nil, err
+ }
+ }
+ } else if err != nil {
+ return nil, err
+ }
+ return b, nil
+}
+
+//------------------------------------------------------------------------------
+
+func parseReq(rd *bufio.Reader) ([]string, error) {
+ line, err := readLine(rd)
+ if err != nil {
+ return nil, err
+ }
+
+ if line[0] != '*' {
+ return []string{string(line)}, nil
+ }
+ numReplies, err := strconv.ParseInt(string(line[1:]), 10, 64)
+ if err != nil {
+ return nil, err
+ }
+
+ args := make([]string, 0, numReplies)
+ for i := int64(0); i < numReplies; i++ {
+ line, err = readLine(rd)
+ if err != nil {
+ return nil, err
+ }
+ if line[0] != '$' {
+ return nil, fmt.Errorf("redis: expected '$', but got %q", line)
+ }
+
+ argLen, err := strconv.ParseInt(string(line[1:]), 10, 32)
+ if err != nil {
+ return nil, err
+ }
+
+ arg, err := readN(rd, int(argLen)+2)
+ if err != nil {
+ return nil, err
+ }
+ args = append(args, string(arg[:argLen]))
+ }
+ return args, nil
+}
+
+//------------------------------------------------------------------------------
+
+func parseReply(rd *bufio.Reader, p multiBulkParser) (interface{}, error) {
+ line, err := readLine(rd)
+ if err != nil {
+ return nil, err
+ }
+
+ switch line[0] {
+ case '-':
+ return nil, errorf(string(line[1:]))
+ case '+':
+ return string(line[1:]), nil
+ case ':':
+ v, err := strconv.ParseInt(string(line[1:]), 10, 64)
+ if err != nil {
+ return nil, err
+ }
+ return v, nil
+ case '$':
+ if len(line) == 3 && line[1] == '-' && line[2] == '1' {
+ return nil, Nil
+ }
+
+ replyLen, err := strconv.Atoi(string(line[1:]))
+ if err != nil {
+ return nil, err
+ }
+
+ b, err := readN(rd, replyLen+2)
+ if err != nil {
+ return nil, err
+ }
+ return string(b[:replyLen]), nil
+ case '*':
+ if len(line) == 3 && line[1] == '-' && line[2] == '1' {
+ return nil, Nil
+ }
+
+ repliesNum, err := strconv.ParseInt(string(line[1:]), 10, 64)
+ if err != nil {
+ return nil, err
+ }
+
+ return p(rd, repliesNum)
+ }
+ return nil, fmt.Errorf("redis: can't parse %q", line)
+}
+
+func parseSlice(rd *bufio.Reader, n int64) (interface{}, error) {
+ vals := make([]interface{}, 0, n)
+ for i := int64(0); i < n; i++ {
+ v, err := parseReply(rd, parseSlice)
+ if err == Nil {
+ vals = append(vals, nil)
+ } else if err != nil {
+ return nil, err
+ } else {
+ vals = append(vals, v)
+ }
+ }
+ return vals, nil
+}
+
+func parseStringSlice(rd *bufio.Reader, n int64) (interface{}, error) {
+ vals := make([]string, 0, n)
+ for i := int64(0); i < n; i++ {
+ viface, err := parseReply(rd, nil)
+ if err != nil {
+ return nil, err
+ }
+ v, ok := viface.(string)
+ if !ok {
+ return nil, fmt.Errorf("got %T, expected string", viface)
+ }
+ vals = append(vals, v)
+ }
+ return vals, nil
+}
+
+func parseBoolSlice(rd *bufio.Reader, n int64) (interface{}, error) {
+ vals := make([]bool, 0, n)
+ for i := int64(0); i < n; i++ {
+ viface, err := parseReply(rd, nil)
+ if err != nil {
+ return nil, err
+ }
+ v, ok := viface.(int64)
+ if !ok {
+ return nil, fmt.Errorf("got %T, expected int64", viface)
+ }
+ vals = append(vals, v == 1)
+ }
+ return vals, nil
+}
+
+func parseStringStringMap(rd *bufio.Reader, n int64) (interface{}, error) {
+ m := make(map[string]string, n/2)
+ for i := int64(0); i < n; i += 2 {
+ keyiface, err := parseReply(rd, nil)
+ if err != nil {
+ return nil, err
+ }
+ key, ok := keyiface.(string)
+ if !ok {
+ return nil, fmt.Errorf("got %T, expected string", keyiface)
+ }
+
+ valueiface, err := parseReply(rd, nil)
+ if err != nil {
+ return nil, err
+ }
+ value, ok := valueiface.(string)
+ if !ok {
+ return nil, fmt.Errorf("got %T, expected string", valueiface)
+ }
+
+ m[key] = value
+ }
+ return m, nil
+}
+
+func parseZSlice(rd *bufio.Reader, n int64) (interface{}, error) {
+ zz := make([]Z, n/2)
+ for i := int64(0); i < n; i += 2 {
+ z := &zz[i/2]
+
+ memberiface, err := parseReply(rd, nil)
+ if err != nil {
+ return nil, err
+ }
+ member, ok := memberiface.(string)
+ if !ok {
+ return nil, fmt.Errorf("got %T, expected string", memberiface)
+ }
+ z.Member = member
+
+ scoreiface, err := parseReply(rd, nil)
+ if err != nil {
+ return nil, err
+ }
+ scorestr, ok := scoreiface.(string)
+ if !ok {
+ return nil, fmt.Errorf("got %T, expected string", scoreiface)
+ }
+ score, err := strconv.ParseFloat(scorestr, 64)
+ if err != nil {
+ return nil, err
+ }
+ z.Score = score
+ }
+ return zz, nil
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/parser_test.go b/Godeps/_workspace/src/gopkg.in/redis.v2/parser_test.go
new file mode 100644
index 00000000000..1b9e15810a8
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/parser_test.go
@@ -0,0 +1,54 @@
+package redis
+
+import (
+ "testing"
+
+ "gopkg.in/bufio.v1"
+)
+
+func BenchmarkParseReplyStatus(b *testing.B) {
+ benchmarkParseReply(b, "+OK\r\n", nil, false)
+}
+
+func BenchmarkParseReplyInt(b *testing.B) {
+ benchmarkParseReply(b, ":1\r\n", nil, false)
+}
+
+func BenchmarkParseReplyError(b *testing.B) {
+ benchmarkParseReply(b, "-Error message\r\n", nil, true)
+}
+
+func BenchmarkParseReplyString(b *testing.B) {
+ benchmarkParseReply(b, "$5\r\nhello\r\n", nil, false)
+}
+
+func BenchmarkParseReplySlice(b *testing.B) {
+ benchmarkParseReply(b, "*2\r\n$5\r\nhello\r\n$5\r\nworld\r\n", parseSlice, false)
+}
+
+func benchmarkParseReply(b *testing.B, reply string, p multiBulkParser, wanterr bool) {
+ b.StopTimer()
+
+ buf := &bufio.Buffer{}
+ rd := bufio.NewReader(buf)
+ for i := 0; i < b.N; i++ {
+ buf.WriteString(reply)
+ }
+
+ b.StartTimer()
+
+ for i := 0; i < b.N; i++ {
+ _, err := parseReply(rd, p)
+ if !wanterr && err != nil {
+ panic(err)
+ }
+ }
+}
+
+func BenchmarkAppendArgs(b *testing.B) {
+ buf := make([]byte, 0, 64)
+ args := []string{"hello", "world", "foo", "bar"}
+ for i := 0; i < b.N; i++ {
+ appendArgs(buf, args)
+ }
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/pipeline.go b/Godeps/_workspace/src/gopkg.in/redis.v2/pipeline.go
new file mode 100644
index 00000000000..540d6c51d9b
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/pipeline.go
@@ -0,0 +1,91 @@
+package redis
+
+// Not thread-safe.
+type Pipeline struct {
+ *Client
+
+ closed bool
+}
+
+func (c *Client) Pipeline() *Pipeline {
+ return &Pipeline{
+ Client: &Client{
+ baseClient: &baseClient{
+ opt: c.opt,
+ connPool: c.connPool,
+
+ cmds: make([]Cmder, 0),
+ },
+ },
+ }
+}
+
+func (c *Client) Pipelined(f func(*Pipeline) error) ([]Cmder, error) {
+ pc := c.Pipeline()
+ if err := f(pc); err != nil {
+ return nil, err
+ }
+ cmds, err := pc.Exec()
+ pc.Close()
+ return cmds, err
+}
+
+func (c *Pipeline) Close() error {
+ c.closed = true
+ return nil
+}
+
+func (c *Pipeline) Discard() error {
+ if c.closed {
+ return errClosed
+ }
+ c.cmds = c.cmds[:0]
+ return nil
+}
+
+// Exec always returns list of commands and error of the first failed
+// command if any.
+func (c *Pipeline) Exec() ([]Cmder, error) {
+ if c.closed {
+ return nil, errClosed
+ }
+
+ cmds := c.cmds
+ c.cmds = make([]Cmder, 0)
+
+ if len(cmds) == 0 {
+ return []Cmder{}, nil
+ }
+
+ cn, err := c.conn()
+ if err != nil {
+ setCmdsErr(cmds, err)
+ return cmds, err
+ }
+
+ if err := c.execCmds(cn, cmds); err != nil {
+ c.freeConn(cn, err)
+ return cmds, err
+ }
+
+ c.putConn(cn)
+ return cmds, nil
+}
+
+func (c *Pipeline) execCmds(cn *conn, cmds []Cmder) error {
+ if err := c.writeCmd(cn, cmds...); err != nil {
+ setCmdsErr(cmds, err)
+ return err
+ }
+
+ var firstCmdErr error
+ for _, cmd := range cmds {
+ if err := cmd.parseReply(cn.rd); err != nil {
+ if firstCmdErr == nil {
+ firstCmdErr = err
+ }
+ }
+ }
+
+ return firstCmdErr
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/pool.go b/Godeps/_workspace/src/gopkg.in/redis.v2/pool.go
new file mode 100644
index 00000000000..bca4d196335
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/pool.go
@@ -0,0 +1,405 @@
+package redis
+
+import (
+ "container/list"
+ "errors"
+ "log"
+ "net"
+ "sync"
+ "time"
+
+ "gopkg.in/bufio.v1"
+)
+
+var (
+ errClosed = errors.New("redis: client is closed")
+ errRateLimited = errors.New("redis: you open connections too fast")
+)
+
+var (
+ zeroTime = time.Time{}
+)
+
+type pool interface {
+ Get() (*conn, bool, error)
+ Put(*conn) error
+ Remove(*conn) error
+ Len() int
+ Size() int
+ Close() error
+ Filter(func(*conn) bool)
+}
+
+//------------------------------------------------------------------------------
+
+type conn struct {
+ netcn net.Conn
+ rd *bufio.Reader
+ buf []byte
+
+ inUse bool
+ usedAt time.Time
+
+ readTimeout time.Duration
+ writeTimeout time.Duration
+
+ elem *list.Element
+}
+
+func newConnFunc(dial func() (net.Conn, error)) func() (*conn, error) {
+ return func() (*conn, error) {
+ netcn, err := dial()
+ if err != nil {
+ return nil, err
+ }
+ cn := &conn{
+ netcn: netcn,
+ buf: make([]byte, 0, 64),
+ }
+ cn.rd = bufio.NewReader(cn)
+ return cn, nil
+ }
+}
+
+func (cn *conn) Read(b []byte) (int, error) {
+ if cn.readTimeout != 0 {
+ cn.netcn.SetReadDeadline(time.Now().Add(cn.readTimeout))
+ } else {
+ cn.netcn.SetReadDeadline(zeroTime)
+ }
+ return cn.netcn.Read(b)
+}
+
+func (cn *conn) Write(b []byte) (int, error) {
+ if cn.writeTimeout != 0 {
+ cn.netcn.SetWriteDeadline(time.Now().Add(cn.writeTimeout))
+ } else {
+ cn.netcn.SetWriteDeadline(zeroTime)
+ }
+ return cn.netcn.Write(b)
+}
+
+func (cn *conn) RemoteAddr() net.Addr {
+ return cn.netcn.RemoteAddr()
+}
+
+func (cn *conn) Close() error {
+ return cn.netcn.Close()
+}
+
+//------------------------------------------------------------------------------
+
+type connPool struct {
+ dial func() (*conn, error)
+ rl *rateLimiter
+
+ opt *options
+
+ cond *sync.Cond
+ conns *list.List
+
+ idleNum int
+ closed bool
+}
+
+func newConnPool(dial func() (*conn, error), opt *options) *connPool {
+ return &connPool{
+ dial: dial,
+ rl: newRateLimiter(time.Second, 2*opt.PoolSize),
+
+ opt: opt,
+
+ cond: sync.NewCond(&sync.Mutex{}),
+ conns: list.New(),
+ }
+}
+
+func (p *connPool) new() (*conn, error) {
+ if !p.rl.Check() {
+ return nil, errRateLimited
+ }
+ return p.dial()
+}
+
+func (p *connPool) Get() (*conn, bool, error) {
+ p.cond.L.Lock()
+
+ if p.closed {
+ p.cond.L.Unlock()
+ return nil, false, errClosed
+ }
+
+ if p.opt.IdleTimeout > 0 {
+ for el := p.conns.Front(); el != nil; el = el.Next() {
+ cn := el.Value.(*conn)
+ if cn.inUse {
+ break
+ }
+ if time.Since(cn.usedAt) > p.opt.IdleTimeout {
+ if err := p.remove(cn); err != nil {
+ log.Printf("remove failed: %s", err)
+ }
+ }
+ }
+ }
+
+ for p.conns.Len() >= p.opt.PoolSize && p.idleNum == 0 {
+ p.cond.Wait()
+ }
+
+ if p.idleNum > 0 {
+ elem := p.conns.Front()
+ cn := elem.Value.(*conn)
+ if cn.inUse {
+ panic("pool: precondition failed")
+ }
+ cn.inUse = true
+ p.conns.MoveToBack(elem)
+ p.idleNum--
+
+ p.cond.L.Unlock()
+ return cn, false, nil
+ }
+
+ if p.conns.Len() < p.opt.PoolSize {
+ cn, err := p.new()
+ if err != nil {
+ p.cond.L.Unlock()
+ return nil, false, err
+ }
+
+ cn.inUse = true
+ cn.elem = p.conns.PushBack(cn)
+
+ p.cond.L.Unlock()
+ return cn, true, nil
+ }
+
+ panic("not reached")
+}
+
+func (p *connPool) Put(cn *conn) error {
+ if cn.rd.Buffered() != 0 {
+ b, _ := cn.rd.ReadN(cn.rd.Buffered())
+ log.Printf("redis: connection has unread data: %q", b)
+ return p.Remove(cn)
+ }
+
+ if p.opt.IdleTimeout > 0 {
+ cn.usedAt = time.Now()
+ }
+
+ p.cond.L.Lock()
+ if p.closed {
+ p.cond.L.Unlock()
+ return errClosed
+ }
+ cn.inUse = false
+ p.conns.MoveToFront(cn.elem)
+ p.idleNum++
+ p.cond.Signal()
+ p.cond.L.Unlock()
+
+ return nil
+}
+
+func (p *connPool) Remove(cn *conn) error {
+ p.cond.L.Lock()
+ if p.closed {
+ // Noop, connection is already closed.
+ p.cond.L.Unlock()
+ return nil
+ }
+ err := p.remove(cn)
+ p.cond.Signal()
+ p.cond.L.Unlock()
+ return err
+}
+
+func (p *connPool) remove(cn *conn) error {
+ p.conns.Remove(cn.elem)
+ cn.elem = nil
+ if !cn.inUse {
+ p.idleNum--
+ }
+ return cn.Close()
+}
+
+// Len returns number of idle connections.
+func (p *connPool) Len() int {
+ defer p.cond.L.Unlock()
+ p.cond.L.Lock()
+ return p.idleNum
+}
+
+// Size returns number of connections in the pool.
+func (p *connPool) Size() int {
+ defer p.cond.L.Unlock()
+ p.cond.L.Lock()
+ return p.conns.Len()
+}
+
+func (p *connPool) Filter(f func(*conn) bool) {
+ p.cond.L.Lock()
+ for el, next := p.conns.Front(), p.conns.Front(); el != nil; el = next {
+ next = el.Next()
+ cn := el.Value.(*conn)
+ if !f(cn) {
+ p.remove(cn)
+ }
+ }
+ p.cond.L.Unlock()
+}
+
+func (p *connPool) Close() error {
+ defer p.cond.L.Unlock()
+ p.cond.L.Lock()
+ if p.closed {
+ return nil
+ }
+ p.closed = true
+ p.rl.Close()
+ var retErr error
+ for {
+ e := p.conns.Front()
+ if e == nil {
+ break
+ }
+ if err := p.remove(e.Value.(*conn)); err != nil {
+ log.Printf("cn.Close failed: %s", err)
+ retErr = err
+ }
+ }
+ return retErr
+}
+
+//------------------------------------------------------------------------------
+
+type singleConnPool struct {
+ pool pool
+
+ cnMtx sync.Mutex
+ cn *conn
+
+ reusable bool
+
+ closed bool
+}
+
+func newSingleConnPool(pool pool, reusable bool) *singleConnPool {
+ return &singleConnPool{
+ pool: pool,
+ reusable: reusable,
+ }
+}
+
+func (p *singleConnPool) SetConn(cn *conn) {
+ p.cnMtx.Lock()
+ p.cn = cn
+ p.cnMtx.Unlock()
+}
+
+func (p *singleConnPool) Get() (*conn, bool, error) {
+ defer p.cnMtx.Unlock()
+ p.cnMtx.Lock()
+
+ if p.closed {
+ return nil, false, errClosed
+ }
+ if p.cn != nil {
+ return p.cn, false, nil
+ }
+
+ cn, isNew, err := p.pool.Get()
+ if err != nil {
+ return nil, false, err
+ }
+ p.cn = cn
+
+ return p.cn, isNew, nil
+}
+
+func (p *singleConnPool) Put(cn *conn) error {
+ defer p.cnMtx.Unlock()
+ p.cnMtx.Lock()
+ if p.cn != cn {
+ panic("p.cn != cn")
+ }
+ if p.closed {
+ return errClosed
+ }
+ return nil
+}
+
+func (p *singleConnPool) put() error {
+ err := p.pool.Put(p.cn)
+ p.cn = nil
+ return err
+}
+
+func (p *singleConnPool) Remove(cn *conn) error {
+ defer p.cnMtx.Unlock()
+ p.cnMtx.Lock()
+ if p.cn == nil {
+ panic("p.cn == nil")
+ }
+ if p.cn != cn {
+ panic("p.cn != cn")
+ }
+ if p.closed {
+ return errClosed
+ }
+ return p.remove()
+}
+
+func (p *singleConnPool) remove() error {
+ err := p.pool.Remove(p.cn)
+ p.cn = nil
+ return err
+}
+
+func (p *singleConnPool) Len() int {
+ defer p.cnMtx.Unlock()
+ p.cnMtx.Lock()
+ if p.cn == nil {
+ return 0
+ }
+ return 1
+}
+
+func (p *singleConnPool) Size() int {
+ defer p.cnMtx.Unlock()
+ p.cnMtx.Lock()
+ if p.cn == nil {
+ return 0
+ }
+ return 1
+}
+
+func (p *singleConnPool) Filter(f func(*conn) bool) {
+ p.cnMtx.Lock()
+ if p.cn != nil {
+ if !f(p.cn) {
+ p.remove()
+ }
+ }
+ p.cnMtx.Unlock()
+}
+
+func (p *singleConnPool) Close() error {
+ defer p.cnMtx.Unlock()
+ p.cnMtx.Lock()
+ if p.closed {
+ return nil
+ }
+ p.closed = true
+ var err error
+ if p.cn != nil {
+ if p.reusable {
+ err = p.put()
+ } else {
+ err = p.remove()
+ }
+ }
+ return err
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/pubsub.go b/Godeps/_workspace/src/gopkg.in/redis.v2/pubsub.go
new file mode 100644
index 00000000000..6ac130bac45
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/pubsub.go
@@ -0,0 +1,134 @@
+package redis
+
+import (
+ "fmt"
+ "time"
+)
+
+// Not thread-safe.
+type PubSub struct {
+ *baseClient
+}
+
+func (c *Client) PubSub() *PubSub {
+ return &PubSub{
+ baseClient: &baseClient{
+ opt: c.opt,
+ connPool: newSingleConnPool(c.connPool, false),
+ },
+ }
+}
+
+func (c *Client) Publish(channel, message string) *IntCmd {
+ req := NewIntCmd("PUBLISH", channel, message)
+ c.Process(req)
+ return req
+}
+
+type Message struct {
+ Channel string
+ Payload string
+}
+
+func (m *Message) String() string {
+ return fmt.Sprintf("Message<%s: %s>", m.Channel, m.Payload)
+}
+
+type PMessage struct {
+ Channel string
+ Pattern string
+ Payload string
+}
+
+func (m *PMessage) String() string {
+ return fmt.Sprintf("PMessage<%s: %s>", m.Channel, m.Payload)
+}
+
+type Subscription struct {
+ Kind string
+ Channel string
+ Count int
+}
+
+func (m *Subscription) String() string {
+ return fmt.Sprintf("%s: %s", m.Kind, m.Channel)
+}
+
+func (c *PubSub) Receive() (interface{}, error) {
+ return c.ReceiveTimeout(0)
+}
+
+func (c *PubSub) ReceiveTimeout(timeout time.Duration) (interface{}, error) {
+ cn, err := c.conn()
+ if err != nil {
+ return nil, err
+ }
+ cn.readTimeout = timeout
+
+ cmd := NewSliceCmd()
+ if err := cmd.parseReply(cn.rd); err != nil {
+ return nil, err
+ }
+
+ reply := cmd.Val()
+
+ msgName := reply[0].(string)
+ switch msgName {
+ case "subscribe", "unsubscribe", "psubscribe", "punsubscribe":
+ return &Subscription{
+ Kind: msgName,
+ Channel: reply[1].(string),
+ Count: int(reply[2].(int64)),
+ }, nil
+ case "message":
+ return &Message{
+ Channel: reply[1].(string),
+ Payload: reply[2].(string),
+ }, nil
+ case "pmessage":
+ return &PMessage{
+ Pattern: reply[1].(string),
+ Channel: reply[2].(string),
+ Payload: reply[3].(string),
+ }, nil
+ }
+ return nil, fmt.Errorf("redis: unsupported message name: %q", msgName)
+}
+
+func (c *PubSub) subscribe(cmd string, channels ...string) error {
+ cn, err := c.conn()
+ if err != nil {
+ return err
+ }
+
+ args := append([]string{cmd}, channels...)
+ req := NewSliceCmd(args...)
+ return c.writeCmd(cn, req)
+}
+
+func (c *PubSub) Subscribe(channels ...string) error {
+ return c.subscribe("SUBSCRIBE", channels...)
+}
+
+func (c *PubSub) PSubscribe(patterns ...string) error {
+ return c.subscribe("PSUBSCRIBE", patterns...)
+}
+
+func (c *PubSub) unsubscribe(cmd string, channels ...string) error {
+ cn, err := c.conn()
+ if err != nil {
+ return err
+ }
+
+ args := append([]string{cmd}, channels...)
+ req := NewSliceCmd(args...)
+ return c.writeCmd(cn, req)
+}
+
+func (c *PubSub) Unsubscribe(channels ...string) error {
+ return c.unsubscribe("UNSUBSCRIBE", channels...)
+}
+
+func (c *PubSub) PUnsubscribe(patterns ...string) error {
+ return c.unsubscribe("PUNSUBSCRIBE", patterns...)
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/rate_limit.go b/Godeps/_workspace/src/gopkg.in/redis.v2/rate_limit.go
new file mode 100644
index 00000000000..20d85127077
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/rate_limit.go
@@ -0,0 +1,53 @@
+package redis
+
+import (
+ "sync/atomic"
+ "time"
+)
+
+type rateLimiter struct {
+ v int64
+
+ _closed int64
+}
+
+func newRateLimiter(limit time.Duration, bucketSize int) *rateLimiter {
+ rl := &rateLimiter{
+ v: int64(bucketSize),
+ }
+ go rl.loop(limit, int64(bucketSize))
+ return rl
+}
+
+func (rl *rateLimiter) loop(limit time.Duration, bucketSize int64) {
+ for {
+ if rl.closed() {
+ break
+ }
+ if v := atomic.LoadInt64(&rl.v); v < bucketSize {
+ atomic.AddInt64(&rl.v, 1)
+ }
+ time.Sleep(limit)
+ }
+}
+
+func (rl *rateLimiter) Check() bool {
+ for {
+ if v := atomic.LoadInt64(&rl.v); v > 0 {
+ if atomic.CompareAndSwapInt64(&rl.v, v, v-1) {
+ return true
+ }
+ } else {
+ return false
+ }
+ }
+}
+
+func (rl *rateLimiter) Close() error {
+ atomic.StoreInt64(&rl._closed, 1)
+ return nil
+}
+
+func (rl *rateLimiter) closed() bool {
+ return atomic.LoadInt64(&rl._closed) == 1
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/rate_limit_test.go b/Godeps/_workspace/src/gopkg.in/redis.v2/rate_limit_test.go
new file mode 100644
index 00000000000..2f0d41a2eb9
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/rate_limit_test.go
@@ -0,0 +1,31 @@
+package redis
+
+import (
+ "sync"
+ "testing"
+ "time"
+)
+
+func TestRateLimiter(t *testing.T) {
+ var n = 100000
+ if testing.Short() {
+ n = 1000
+ }
+ rl := newRateLimiter(time.Minute, n)
+
+ wg := &sync.WaitGroup{}
+ for i := 0; i < n; i++ {
+ wg.Add(1)
+ go func() {
+ if !rl.Check() {
+ panic("check failed")
+ }
+ wg.Done()
+ }()
+ }
+ wg.Wait()
+
+ if rl.Check() && rl.Check() {
+ t.Fatal("check passed")
+ }
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/redis.go b/Godeps/_workspace/src/gopkg.in/redis.v2/redis.go
new file mode 100644
index 00000000000..0d15dc8f854
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/redis.go
@@ -0,0 +1,231 @@
+package redis
+
+import (
+ "log"
+ "net"
+ "time"
+)
+
+type baseClient struct {
+ connPool pool
+ opt *options
+ cmds []Cmder
+}
+
+func (c *baseClient) writeCmd(cn *conn, cmds ...Cmder) error {
+ buf := cn.buf[:0]
+ for _, cmd := range cmds {
+ buf = appendArgs(buf, cmd.args())
+ }
+
+ _, err := cn.Write(buf)
+ return err
+}
+
+func (c *baseClient) conn() (*conn, error) {
+ cn, isNew, err := c.connPool.Get()
+ if err != nil {
+ return nil, err
+ }
+
+ if isNew {
+ if err := c.initConn(cn); err != nil {
+ c.removeConn(cn)
+ return nil, err
+ }
+ }
+
+ return cn, nil
+}
+
+func (c *baseClient) initConn(cn *conn) error {
+ if c.opt.Password == "" && c.opt.DB == 0 {
+ return nil
+ }
+
+ pool := newSingleConnPool(c.connPool, false)
+ pool.SetConn(cn)
+
+ // Client is not closed because we want to reuse underlying connection.
+ client := &Client{
+ baseClient: &baseClient{
+ opt: c.opt,
+ connPool: pool,
+ },
+ }
+
+ if c.opt.Password != "" {
+ if err := client.Auth(c.opt.Password).Err(); err != nil {
+ return err
+ }
+ }
+
+ if c.opt.DB > 0 {
+ if err := client.Select(c.opt.DB).Err(); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+func (c *baseClient) freeConn(cn *conn, ei error) error {
+ if cn.rd.Buffered() > 0 {
+ return c.connPool.Remove(cn)
+ }
+ if _, ok := ei.(redisError); ok {
+ return c.connPool.Put(cn)
+ }
+ return c.connPool.Remove(cn)
+}
+
+func (c *baseClient) removeConn(cn *conn) {
+ if err := c.connPool.Remove(cn); err != nil {
+ log.Printf("pool.Remove failed: %s", err)
+ }
+}
+
+func (c *baseClient) putConn(cn *conn) {
+ if err := c.connPool.Put(cn); err != nil {
+ log.Printf("pool.Put failed: %s", err)
+ }
+}
+
+func (c *baseClient) Process(cmd Cmder) {
+ if c.cmds == nil {
+ c.run(cmd)
+ } else {
+ c.cmds = append(c.cmds, cmd)
+ }
+}
+
+func (c *baseClient) run(cmd Cmder) {
+ cn, err := c.conn()
+ if err != nil {
+ cmd.setErr(err)
+ return
+ }
+
+ if timeout := cmd.writeTimeout(); timeout != nil {
+ cn.writeTimeout = *timeout
+ } else {
+ cn.writeTimeout = c.opt.WriteTimeout
+ }
+
+ if timeout := cmd.readTimeout(); timeout != nil {
+ cn.readTimeout = *timeout
+ } else {
+ cn.readTimeout = c.opt.ReadTimeout
+ }
+
+ if err := c.writeCmd(cn, cmd); err != nil {
+ c.freeConn(cn, err)
+ cmd.setErr(err)
+ return
+ }
+
+ if err := cmd.parseReply(cn.rd); err != nil {
+ c.freeConn(cn, err)
+ return
+ }
+
+ c.putConn(cn)
+}
+
+// Close closes the client, releasing any open resources.
+func (c *baseClient) Close() error {
+ return c.connPool.Close()
+}
+
+//------------------------------------------------------------------------------
+
+type options struct {
+ Password string
+ DB int64
+
+ DialTimeout time.Duration
+ ReadTimeout time.Duration
+ WriteTimeout time.Duration
+
+ PoolSize int
+ IdleTimeout time.Duration
+}
+
+type Options struct {
+ Network string
+ Addr string
+
+ // Dialer creates new network connection and has priority over
+ // Network and Addr options.
+ Dialer func() (net.Conn, error)
+
+ Password string
+ DB int64
+
+ DialTimeout time.Duration
+ ReadTimeout time.Duration
+ WriteTimeout time.Duration
+
+ PoolSize int
+ IdleTimeout time.Duration
+}
+
+func (opt *Options) getPoolSize() int {
+ if opt.PoolSize == 0 {
+ return 10
+ }
+ return opt.PoolSize
+}
+
+func (opt *Options) getDialTimeout() time.Duration {
+ if opt.DialTimeout == 0 {
+ return 5 * time.Second
+ }
+ return opt.DialTimeout
+}
+
+func (opt *Options) options() *options {
+ return &options{
+ DB: opt.DB,
+ Password: opt.Password,
+
+ DialTimeout: opt.getDialTimeout(),
+ ReadTimeout: opt.ReadTimeout,
+ WriteTimeout: opt.WriteTimeout,
+
+ PoolSize: opt.getPoolSize(),
+ IdleTimeout: opt.IdleTimeout,
+ }
+}
+
+type Client struct {
+ *baseClient
+}
+
+func NewClient(clOpt *Options) *Client {
+ opt := clOpt.options()
+ dialer := clOpt.Dialer
+ if dialer == nil {
+ dialer = func() (net.Conn, error) {
+ return net.DialTimeout(clOpt.Network, clOpt.Addr, opt.DialTimeout)
+ }
+ }
+ return &Client{
+ baseClient: &baseClient{
+ opt: opt,
+ connPool: newConnPool(newConnFunc(dialer), opt),
+ },
+ }
+}
+
+// Deprecated. Use NewClient instead.
+func NewTCPClient(opt *Options) *Client {
+ opt.Network = "tcp"
+ return NewClient(opt)
+}
+
+// Deprecated. Use NewClient instead.
+func NewUnixClient(opt *Options) *Client {
+ opt.Network = "unix"
+ return NewClient(opt)
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/redis_test.go b/Godeps/_workspace/src/gopkg.in/redis.v2/redis_test.go
new file mode 100644
index 00000000000..49f84d0e1e4
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/redis_test.go
@@ -0,0 +1,3333 @@
+package redis_test
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "net"
+ "sort"
+ "strconv"
+ "sync"
+ "testing"
+ "time"
+
+ "gopkg.in/redis.v2"
+
+ . "gopkg.in/check.v1"
+)
+
+const redisAddr = ":6379"
+
+//------------------------------------------------------------------------------
+
+func sortStrings(slice []string) []string {
+ sort.Strings(slice)
+ return slice
+}
+
+//------------------------------------------------------------------------------
+
+type RedisConnectorTest struct{}
+
+var _ = Suite(&RedisConnectorTest{})
+
+func (t *RedisConnectorTest) TestShutdown(c *C) {
+ c.Skip("shutdowns server")
+
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+
+ shutdown := client.Shutdown()
+ c.Check(shutdown.Err(), Equals, io.EOF)
+ c.Check(shutdown.Val(), Equals, "")
+
+ ping := client.Ping()
+ c.Check(ping.Err(), ErrorMatches, "dial tcp :[0-9]+: connection refused")
+ c.Check(ping.Val(), Equals, "")
+}
+
+func (t *RedisConnectorTest) TestNewTCPClient(c *C) {
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+ ping := client.Ping()
+ c.Check(ping.Err(), IsNil)
+ c.Check(ping.Val(), Equals, "PONG")
+ c.Assert(client.Close(), IsNil)
+}
+
+func (t *RedisConnectorTest) TestNewUnixClient(c *C) {
+ c.Skip("not available on Travis CI")
+
+ client := redis.NewUnixClient(&redis.Options{
+ Addr: "/tmp/redis.sock",
+ })
+ ping := client.Ping()
+ c.Check(ping.Err(), IsNil)
+ c.Check(ping.Val(), Equals, "PONG")
+ c.Assert(client.Close(), IsNil)
+}
+
+func (t *RedisConnectorTest) TestDialer(c *C) {
+ client := redis.NewClient(&redis.Options{
+ Dialer: func() (net.Conn, error) {
+ return net.Dial("tcp", redisAddr)
+ },
+ })
+ ping := client.Ping()
+ c.Check(ping.Err(), IsNil)
+ c.Check(ping.Val(), Equals, "PONG")
+ c.Assert(client.Close(), IsNil)
+}
+
+func (t *RedisConnectorTest) TestClose(c *C) {
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+ c.Assert(client.Close(), IsNil)
+
+ ping := client.Ping()
+ c.Assert(ping.Err(), Not(IsNil))
+ c.Assert(ping.Err().Error(), Equals, "redis: client is closed")
+
+ c.Assert(client.Close(), IsNil)
+}
+
+func (t *RedisConnectorTest) TestPubSubClose(c *C) {
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+
+ pubsub := client.PubSub()
+ c.Assert(pubsub.Close(), IsNil)
+
+ _, err := pubsub.Receive()
+ c.Assert(err, Not(IsNil))
+ c.Assert(err.Error(), Equals, "redis: client is closed")
+
+ ping := client.Ping()
+ c.Assert(ping.Err(), IsNil)
+
+ c.Assert(client.Close(), IsNil)
+}
+
+func (t *RedisConnectorTest) TestMultiClose(c *C) {
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+
+ multi := client.Multi()
+ c.Assert(multi.Close(), IsNil)
+
+ _, err := multi.Exec(func() error {
+ multi.Ping()
+ return nil
+ })
+ c.Assert(err, Not(IsNil))
+ c.Assert(err.Error(), Equals, "redis: client is closed")
+
+ ping := client.Ping()
+ c.Assert(ping.Err(), IsNil)
+
+ c.Assert(client.Close(), IsNil)
+}
+
+func (t *RedisConnectorTest) TestPipelineClose(c *C) {
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+
+ _, err := client.Pipelined(func(pipeline *redis.Pipeline) error {
+ c.Assert(pipeline.Close(), IsNil)
+ pipeline.Ping()
+ return nil
+ })
+ c.Assert(err, Not(IsNil))
+ c.Assert(err.Error(), Equals, "redis: client is closed")
+
+ ping := client.Ping()
+ c.Assert(ping.Err(), IsNil)
+
+ c.Assert(client.Close(), IsNil)
+}
+
+func (t *RedisConnectorTest) TestIdleTimeout(c *C) {
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ IdleTimeout: time.Nanosecond,
+ })
+ for i := 0; i < 10; i++ {
+ c.Assert(client.Ping().Err(), IsNil)
+ }
+}
+
+func (t *RedisConnectorTest) TestSelectDb(c *C) {
+ client1 := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ DB: 1,
+ })
+ c.Assert(client1.Set("key", "db1").Err(), IsNil)
+
+ client2 := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ DB: 2,
+ })
+ c.Assert(client2.Get("key").Err(), Equals, redis.Nil)
+}
+
+//------------------------------------------------------------------------------
+
+type RedisConnPoolTest struct {
+ client *redis.Client
+}
+
+var _ = Suite(&RedisConnPoolTest{})
+
+func (t *RedisConnPoolTest) SetUpTest(c *C) {
+ t.client = redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+}
+
+func (t *RedisConnPoolTest) TearDownTest(c *C) {
+ c.Assert(t.client.FlushDb().Err(), IsNil)
+ c.Assert(t.client.Close(), IsNil)
+}
+
+func (t *RedisConnPoolTest) TestConnPoolMaxSize(c *C) {
+ wg := &sync.WaitGroup{}
+ for i := 0; i < 1000; i++ {
+ wg.Add(1)
+ go func() {
+ ping := t.client.Ping()
+ c.Assert(ping.Err(), IsNil)
+ c.Assert(ping.Val(), Equals, "PONG")
+ wg.Done()
+ }()
+ }
+ wg.Wait()
+
+ c.Assert(t.client.Pool().Size(), Equals, 10)
+ c.Assert(t.client.Pool().Len(), Equals, 10)
+}
+
+func (t *RedisConnPoolTest) TestConnPoolMaxSizeOnPipelineClient(c *C) {
+ const N = 1000
+
+ wg := &sync.WaitGroup{}
+ wg.Add(N)
+ for i := 0; i < N; i++ {
+ go func() {
+ pipeline := t.client.Pipeline()
+ ping := pipeline.Ping()
+ cmds, err := pipeline.Exec()
+ c.Assert(err, IsNil)
+ c.Assert(cmds, HasLen, 1)
+ c.Assert(ping.Err(), IsNil)
+ c.Assert(ping.Val(), Equals, "PONG")
+
+ c.Assert(pipeline.Close(), IsNil)
+
+ wg.Done()
+ }()
+ }
+ wg.Wait()
+
+ c.Assert(t.client.Pool().Size(), Equals, 10)
+ c.Assert(t.client.Pool().Len(), Equals, 10)
+}
+
+func (t *RedisConnPoolTest) TestConnPoolMaxSizeOnMultiClient(c *C) {
+ const N = 1000
+
+ wg := &sync.WaitGroup{}
+ wg.Add(N)
+ for i := 0; i < N; i++ {
+ go func() {
+ multi := t.client.Multi()
+ var ping *redis.StatusCmd
+ cmds, err := multi.Exec(func() error {
+ ping = multi.Ping()
+ return nil
+ })
+ c.Assert(err, IsNil)
+ c.Assert(cmds, HasLen, 1)
+ c.Assert(ping.Err(), IsNil)
+ c.Assert(ping.Val(), Equals, "PONG")
+
+ c.Assert(multi.Close(), IsNil)
+
+ wg.Done()
+ }()
+ }
+ wg.Wait()
+
+ c.Assert(t.client.Pool().Size(), Equals, 10)
+ c.Assert(t.client.Pool().Len(), Equals, 10)
+}
+
+func (t *RedisConnPoolTest) TestConnPoolMaxSizeOnPubSub(c *C) {
+ const N = 10
+
+ wg := &sync.WaitGroup{}
+ wg.Add(N)
+ for i := 0; i < N; i++ {
+ go func() {
+ defer wg.Done()
+ pubsub := t.client.PubSub()
+ c.Assert(pubsub.Subscribe(), IsNil)
+ c.Assert(pubsub.Close(), IsNil)
+ }()
+ }
+ wg.Wait()
+
+ c.Assert(t.client.Pool().Size(), Equals, 0)
+ c.Assert(t.client.Pool().Len(), Equals, 0)
+}
+
+func (t *RedisConnPoolTest) TestConnPoolRemovesBrokenConn(c *C) {
+ cn, _, err := t.client.Pool().Get()
+ c.Assert(err, IsNil)
+ c.Assert(cn.Close(), IsNil)
+ c.Assert(t.client.Pool().Put(cn), IsNil)
+
+ ping := t.client.Ping()
+ c.Assert(ping.Err().Error(), Equals, "use of closed network connection")
+ c.Assert(ping.Val(), Equals, "")
+
+ ping = t.client.Ping()
+ c.Assert(ping.Err(), IsNil)
+ c.Assert(ping.Val(), Equals, "PONG")
+
+ c.Assert(t.client.Pool().Size(), Equals, 1)
+ c.Assert(t.client.Pool().Len(), Equals, 1)
+}
+
+func (t *RedisConnPoolTest) TestConnPoolReusesConn(c *C) {
+ for i := 0; i < 1000; i++ {
+ ping := t.client.Ping()
+ c.Assert(ping.Err(), IsNil)
+ c.Assert(ping.Val(), Equals, "PONG")
+ }
+
+ c.Assert(t.client.Pool().Size(), Equals, 1)
+ c.Assert(t.client.Pool().Len(), Equals, 1)
+}
+
+//------------------------------------------------------------------------------
+
+type RedisTest struct {
+ client *redis.Client
+}
+
+var _ = Suite(&RedisTest{})
+
+func Test(t *testing.T) { TestingT(t) }
+
+func (t *RedisTest) SetUpTest(c *C) {
+ t.client = redis.NewTCPClient(&redis.Options{
+ Addr: ":6379",
+ })
+
+ // This is much faster than Flushall.
+ c.Assert(t.client.Select(1).Err(), IsNil)
+ c.Assert(t.client.FlushDb().Err(), IsNil)
+ c.Assert(t.client.Select(0).Err(), IsNil)
+ c.Assert(t.client.FlushDb().Err(), IsNil)
+}
+
+func (t *RedisTest) TearDownTest(c *C) {
+ c.Assert(t.client.Close(), IsNil)
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestCmdStringMethod(c *C) {
+ set := t.client.Set("foo", "bar")
+ c.Assert(set.String(), Equals, "SET foo bar: OK")
+
+ get := t.client.Get("foo")
+ c.Assert(get.String(), Equals, "GET foo: bar")
+}
+
+func (t *RedisTest) TestCmdStringMethodError(c *C) {
+ get2 := t.client.Get("key_does_not_exists")
+ c.Assert(get2.String(), Equals, "GET key_does_not_exists: redis: nil")
+}
+
+func (t *RedisTest) TestRunWithouthCheckingErrVal(c *C) {
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ get := t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "hello")
+
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+}
+
+func (t *RedisTest) TestGetSpecChars(c *C) {
+ set := t.client.Set("key", "hello1\r\nhello2\r\n")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ get := t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "hello1\r\nhello2\r\n")
+}
+
+func (t *RedisTest) TestGetBigVal(c *C) {
+ val := string(bytes.Repeat([]byte{'*'}, 1<<16))
+
+ set := t.client.Set("key", val)
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ get := t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, val)
+}
+
+func (t *RedisTest) TestManyKeys(c *C) {
+ var n = 100000
+
+ for i := 0; i < n; i++ {
+ t.client.Set("keys.key"+strconv.Itoa(i), "hello"+strconv.Itoa(i))
+ }
+ keys := t.client.Keys("keys.*")
+ c.Assert(keys.Err(), IsNil)
+ c.Assert(len(keys.Val()), Equals, n)
+}
+
+func (t *RedisTest) TestManyKeys2(c *C) {
+ var n = 100000
+
+ keys := []string{"non-existent-key"}
+ for i := 0; i < n; i++ {
+ key := "keys.key" + strconv.Itoa(i)
+ t.client.Set(key, "hello"+strconv.Itoa(i))
+ keys = append(keys, key)
+ }
+ keys = append(keys, "non-existent-key")
+
+ mget := t.client.MGet(keys...)
+ c.Assert(mget.Err(), IsNil)
+ c.Assert(len(mget.Val()), Equals, n+2)
+ vals := mget.Val()
+ for i := 0; i < n; i++ {
+ c.Assert(vals[i+1], Equals, "hello"+strconv.Itoa(i))
+ }
+ c.Assert(vals[0], Equals, nil)
+ c.Assert(vals[n+1], Equals, nil)
+}
+
+func (t *RedisTest) TestStringCmdHelpers(c *C) {
+ set := t.client.Set("key", "10")
+ c.Assert(set.Err(), IsNil)
+
+ n, err := t.client.Get("key").Int64()
+ c.Assert(err, IsNil)
+ c.Assert(n, Equals, int64(10))
+
+ un, err := t.client.Get("key").Uint64()
+ c.Assert(err, IsNil)
+ c.Assert(un, Equals, uint64(10))
+
+ f, err := t.client.Get("key").Float64()
+ c.Assert(err, IsNil)
+ c.Assert(f, Equals, float64(10))
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestAuth(c *C) {
+ auth := t.client.Auth("password")
+ c.Assert(auth.Err(), ErrorMatches, "ERR Client sent AUTH, but no password is set")
+ c.Assert(auth.Val(), Equals, "")
+}
+
+func (t *RedisTest) TestEcho(c *C) {
+ echo := t.client.Echo("hello")
+ c.Assert(echo.Err(), IsNil)
+ c.Assert(echo.Val(), Equals, "hello")
+}
+
+func (t *RedisTest) TestPing(c *C) {
+ ping := t.client.Ping()
+ c.Assert(ping.Err(), IsNil)
+ c.Assert(ping.Val(), Equals, "PONG")
+}
+
+func (t *RedisTest) TestSelect(c *C) {
+ sel := t.client.Select(1)
+ c.Assert(sel.Err(), IsNil)
+ c.Assert(sel.Val(), Equals, "OK")
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestCmdKeysDel(c *C) {
+ set := t.client.Set("key1", "Hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+ set = t.client.Set("key2", "World")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ del := t.client.Del("key1", "key2", "key3")
+ c.Assert(del.Err(), IsNil)
+ c.Assert(del.Val(), Equals, int64(2))
+}
+
+func (t *RedisTest) TestCmdKeysDump(c *C) {
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ dump := t.client.Dump("key")
+ c.Assert(dump.Err(), IsNil)
+ c.Assert(dump.Val(), Equals, "\x00\x05hello\x06\x00\xf5\x9f\xb7\xf6\x90a\x1c\x99")
+}
+
+func (t *RedisTest) TestCmdKeysExists(c *C) {
+ set := t.client.Set("key1", "Hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ exists := t.client.Exists("key1")
+ c.Assert(exists.Err(), IsNil)
+ c.Assert(exists.Val(), Equals, true)
+
+ exists = t.client.Exists("key2")
+ c.Assert(exists.Err(), IsNil)
+ c.Assert(exists.Val(), Equals, false)
+}
+
+func (t *RedisTest) TestCmdKeysExpire(c *C) {
+ set := t.client.Set("key", "Hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ expire := t.client.Expire("key", 10*time.Second)
+ c.Assert(expire.Err(), IsNil)
+ c.Assert(expire.Val(), Equals, true)
+
+ ttl := t.client.TTL("key")
+ c.Assert(ttl.Err(), IsNil)
+ c.Assert(ttl.Val(), Equals, 10*time.Second)
+
+ set = t.client.Set("key", "Hello World")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ ttl = t.client.TTL("key")
+ c.Assert(ttl.Err(), IsNil)
+ c.Assert(ttl.Val() < 0, Equals, true)
+}
+
+func (t *RedisTest) TestCmdKeysExpireAt(c *C) {
+ set := t.client.Set("key", "Hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ exists := t.client.Exists("key")
+ c.Assert(exists.Err(), IsNil)
+ c.Assert(exists.Val(), Equals, true)
+
+ expireAt := t.client.ExpireAt("key", time.Now().Add(-time.Hour))
+ c.Assert(expireAt.Err(), IsNil)
+ c.Assert(expireAt.Val(), Equals, true)
+
+ exists = t.client.Exists("key")
+ c.Assert(exists.Err(), IsNil)
+ c.Assert(exists.Val(), Equals, false)
+}
+
+func (t *RedisTest) TestCmdKeysKeys(c *C) {
+ mset := t.client.MSet("one", "1", "two", "2", "three", "3", "four", "4")
+ c.Assert(mset.Err(), IsNil)
+ c.Assert(mset.Val(), Equals, "OK")
+
+ keys := t.client.Keys("*o*")
+ c.Assert(keys.Err(), IsNil)
+ c.Assert(sortStrings(keys.Val()), DeepEquals, []string{"four", "one", "two"})
+
+ keys = t.client.Keys("t??")
+ c.Assert(keys.Err(), IsNil)
+ c.Assert(keys.Val(), DeepEquals, []string{"two"})
+
+ keys = t.client.Keys("*")
+ c.Assert(keys.Err(), IsNil)
+ c.Assert(
+ sortStrings(keys.Val()),
+ DeepEquals,
+ []string{"four", "one", "three", "two"},
+ )
+}
+
+func (t *RedisTest) TestCmdKeysMigrate(c *C) {
+ migrate := t.client.Migrate("localhost", "6380", "key", 0, 0)
+ c.Assert(migrate.Err(), IsNil)
+ c.Assert(migrate.Val(), Equals, "NOKEY")
+
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ migrate = t.client.Migrate("localhost", "6380", "key", 0, 0)
+ c.Assert(migrate.Err(), ErrorMatches, "IOERR error or timeout writing to target instance")
+ c.Assert(migrate.Val(), Equals, "")
+}
+
+func (t *RedisTest) TestCmdKeysMove(c *C) {
+ move := t.client.Move("key", 1)
+ c.Assert(move.Err(), IsNil)
+ c.Assert(move.Val(), Equals, false)
+
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ move = t.client.Move("key", 1)
+ c.Assert(move.Err(), IsNil)
+ c.Assert(move.Val(), Equals, true)
+
+ get := t.client.Get("key")
+ c.Assert(get.Err(), Equals, redis.Nil)
+ c.Assert(get.Val(), Equals, "")
+
+ sel := t.client.Select(1)
+ c.Assert(sel.Err(), IsNil)
+ c.Assert(sel.Val(), Equals, "OK")
+
+ get = t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "hello")
+}
+
+func (t *RedisTest) TestCmdKeysObject(c *C) {
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ refCount := t.client.ObjectRefCount("key")
+ c.Assert(refCount.Err(), IsNil)
+ c.Assert(refCount.Val(), Equals, int64(1))
+
+ enc := t.client.ObjectEncoding("key")
+ c.Assert(enc.Err(), IsNil)
+ c.Assert(enc.Val(), Equals, "raw")
+
+ idleTime := t.client.ObjectIdleTime("key")
+ c.Assert(idleTime.Err(), IsNil)
+ c.Assert(idleTime.Val(), Equals, time.Duration(0))
+}
+
+func (t *RedisTest) TestCmdKeysPersist(c *C) {
+ set := t.client.Set("key", "Hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ expire := t.client.Expire("key", 10*time.Second)
+ c.Assert(expire.Err(), IsNil)
+ c.Assert(expire.Val(), Equals, true)
+
+ ttl := t.client.TTL("key")
+ c.Assert(ttl.Err(), IsNil)
+ c.Assert(ttl.Val(), Equals, 10*time.Second)
+
+ persist := t.client.Persist("key")
+ c.Assert(persist.Err(), IsNil)
+ c.Assert(persist.Val(), Equals, true)
+
+ ttl = t.client.TTL("key")
+ c.Assert(ttl.Err(), IsNil)
+ c.Assert(ttl.Val() < 0, Equals, true)
+}
+
+func (t *RedisTest) TestCmdKeysPExpire(c *C) {
+ set := t.client.Set("key", "Hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ expiration := 900 * time.Millisecond
+ pexpire := t.client.PExpire("key", expiration)
+ c.Assert(pexpire.Err(), IsNil)
+ c.Assert(pexpire.Val(), Equals, true)
+
+ ttl := t.client.TTL("key")
+ c.Assert(ttl.Err(), IsNil)
+ c.Assert(ttl.Val(), Equals, time.Second)
+
+ pttl := t.client.PTTL("key")
+ c.Assert(pttl.Err(), IsNil)
+ c.Assert(pttl.Val() <= expiration, Equals, true)
+ c.Assert(pttl.Val() >= expiration-time.Millisecond, Equals, true)
+}
+
+func (t *RedisTest) TestCmdKeysPExpireAt(c *C) {
+ set := t.client.Set("key", "Hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ expiration := 900 * time.Millisecond
+ pexpireat := t.client.PExpireAt("key", time.Now().Add(expiration))
+ c.Assert(pexpireat.Err(), IsNil)
+ c.Assert(pexpireat.Val(), Equals, true)
+
+ ttl := t.client.TTL("key")
+ c.Assert(ttl.Err(), IsNil)
+ c.Assert(ttl.Val(), Equals, time.Second)
+
+ pttl := t.client.PTTL("key")
+ c.Assert(pttl.Err(), IsNil)
+ c.Assert(pttl.Val() <= expiration, Equals, true)
+ c.Assert(pttl.Val() >= expiration-time.Millisecond, Equals, true)
+}
+
+func (t *RedisTest) TestCmdKeysPTTL(c *C) {
+ set := t.client.Set("key", "Hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ expiration := time.Second
+ expire := t.client.Expire("key", expiration)
+ c.Assert(expire.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ pttl := t.client.PTTL("key")
+ c.Assert(pttl.Err(), IsNil)
+ c.Assert(pttl.Val() <= expiration, Equals, true)
+ c.Assert(pttl.Val() >= expiration-time.Millisecond, Equals, true)
+}
+
+func (t *RedisTest) TestCmdKeysRandomKey(c *C) {
+ randomKey := t.client.RandomKey()
+ c.Assert(randomKey.Err(), Equals, redis.Nil)
+ c.Assert(randomKey.Val(), Equals, "")
+
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ randomKey = t.client.RandomKey()
+ c.Assert(randomKey.Err(), IsNil)
+ c.Assert(randomKey.Val(), Equals, "key")
+}
+
+func (t *RedisTest) TestCmdKeysRename(c *C) {
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ status := t.client.Rename("key", "key1")
+ c.Assert(status.Err(), IsNil)
+ c.Assert(status.Val(), Equals, "OK")
+
+ get := t.client.Get("key1")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "hello")
+}
+
+func (t *RedisTest) TestCmdKeysRenameNX(c *C) {
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ renameNX := t.client.RenameNX("key", "key1")
+ c.Assert(renameNX.Err(), IsNil)
+ c.Assert(renameNX.Val(), Equals, true)
+
+ get := t.client.Get("key1")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "hello")
+}
+
+func (t *RedisTest) TestCmdKeysRestore(c *C) {
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ dump := t.client.Dump("key")
+ c.Assert(dump.Err(), IsNil)
+
+ del := t.client.Del("key")
+ c.Assert(del.Err(), IsNil)
+
+ restore := t.client.Restore("key", 0, dump.Val())
+ c.Assert(restore.Err(), IsNil)
+ c.Assert(restore.Val(), Equals, "OK")
+
+ type_ := t.client.Type("key")
+ c.Assert(type_.Err(), IsNil)
+ c.Assert(type_.Val(), Equals, "string")
+
+ lRange := t.client.Get("key")
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), Equals, "hello")
+}
+
+func (t *RedisTest) TestCmdKeysSort(c *C) {
+ lPush := t.client.LPush("list", "1")
+ c.Assert(lPush.Err(), IsNil)
+ c.Assert(lPush.Val(), Equals, int64(1))
+ lPush = t.client.LPush("list", "3")
+ c.Assert(lPush.Err(), IsNil)
+ c.Assert(lPush.Val(), Equals, int64(2))
+ lPush = t.client.LPush("list", "2")
+ c.Assert(lPush.Err(), IsNil)
+ c.Assert(lPush.Val(), Equals, int64(3))
+
+ sort := t.client.Sort("list", redis.Sort{Offset: 0, Count: 2, Order: "ASC"})
+ c.Assert(sort.Err(), IsNil)
+ c.Assert(sort.Val(), DeepEquals, []string{"1", "2"})
+}
+
+func (t *RedisTest) TestCmdKeysSortBy(c *C) {
+ lPush := t.client.LPush("list", "1")
+ c.Assert(lPush.Err(), IsNil)
+ c.Assert(lPush.Val(), Equals, int64(1))
+ lPush = t.client.LPush("list", "3")
+ c.Assert(lPush.Err(), IsNil)
+ c.Assert(lPush.Val(), Equals, int64(2))
+ lPush = t.client.LPush("list", "2")
+ c.Assert(lPush.Err(), IsNil)
+ c.Assert(lPush.Val(), Equals, int64(3))
+
+ set := t.client.Set("weight_1", "5")
+ c.Assert(set.Err(), IsNil)
+ set = t.client.Set("weight_2", "2")
+ c.Assert(set.Err(), IsNil)
+ set = t.client.Set("weight_3", "8")
+ c.Assert(set.Err(), IsNil)
+
+ sort := t.client.Sort("list", redis.Sort{Offset: 0, Count: 2, Order: "ASC", By: "weight_*"})
+ c.Assert(sort.Err(), IsNil)
+ c.Assert(sort.Val(), DeepEquals, []string{"2", "1"})
+}
+
+func (t *RedisTest) TestCmdKeysTTL(c *C) {
+ ttl := t.client.TTL("key")
+ c.Assert(ttl.Err(), IsNil)
+ c.Assert(ttl.Val() < 0, Equals, true)
+
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ expire := t.client.Expire("key", 60*time.Second)
+ c.Assert(expire.Err(), IsNil)
+ c.Assert(expire.Val(), Equals, true)
+
+ ttl = t.client.TTL("key")
+ c.Assert(ttl.Err(), IsNil)
+ c.Assert(ttl.Val(), Equals, 60*time.Second)
+}
+
+func (t *RedisTest) TestCmdKeysType(c *C) {
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ type_ := t.client.Type("key")
+ c.Assert(type_.Err(), IsNil)
+ c.Assert(type_.Val(), Equals, "string")
+}
+
+func (t *RedisTest) TestCmdScan(c *C) {
+ for i := 0; i < 1000; i++ {
+ set := t.client.Set(fmt.Sprintf("key%d", i), "hello")
+ c.Assert(set.Err(), IsNil)
+ }
+
+ cursor, keys, err := t.client.Scan(0, "", 0).Result()
+ c.Assert(err, IsNil)
+ c.Assert(cursor > 0, Equals, true)
+ c.Assert(len(keys) > 0, Equals, true)
+}
+
+func (t *RedisTest) TestCmdSScan(c *C) {
+ for i := 0; i < 1000; i++ {
+ sadd := t.client.SAdd("myset", fmt.Sprintf("member%d", i))
+ c.Assert(sadd.Err(), IsNil)
+ }
+
+ cursor, keys, err := t.client.SScan("myset", 0, "", 0).Result()
+ c.Assert(err, IsNil)
+ c.Assert(cursor > 0, Equals, true)
+ c.Assert(len(keys) > 0, Equals, true)
+}
+
+func (t *RedisTest) TestCmdHScan(c *C) {
+ for i := 0; i < 1000; i++ {
+ sadd := t.client.HSet("myhash", fmt.Sprintf("key%d", i), "hello")
+ c.Assert(sadd.Err(), IsNil)
+ }
+
+ cursor, keys, err := t.client.HScan("myhash", 0, "", 0).Result()
+ c.Assert(err, IsNil)
+ c.Assert(cursor > 0, Equals, true)
+ c.Assert(len(keys) > 0, Equals, true)
+}
+
+func (t *RedisTest) TestCmdZScan(c *C) {
+ for i := 0; i < 1000; i++ {
+ sadd := t.client.ZAdd("myset", redis.Z{float64(i), fmt.Sprintf("member%d", i)})
+ c.Assert(sadd.Err(), IsNil)
+ }
+
+ cursor, keys, err := t.client.ZScan("myset", 0, "", 0).Result()
+ c.Assert(err, IsNil)
+ c.Assert(cursor > 0, Equals, true)
+ c.Assert(len(keys) > 0, Equals, true)
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestStringsAppend(c *C) {
+ exists := t.client.Exists("key")
+ c.Assert(exists.Err(), IsNil)
+ c.Assert(exists.Val(), Equals, false)
+
+ append := t.client.Append("key", "Hello")
+ c.Assert(append.Err(), IsNil)
+ c.Assert(append.Val(), Equals, int64(5))
+
+ append = t.client.Append("key", " World")
+ c.Assert(append.Err(), IsNil)
+ c.Assert(append.Val(), Equals, int64(11))
+
+ get := t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "Hello World")
+}
+
+func (t *RedisTest) TestStringsBitCount(c *C) {
+ set := t.client.Set("key", "foobar")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ bitCount := t.client.BitCount("key", nil)
+ c.Assert(bitCount.Err(), IsNil)
+ c.Assert(bitCount.Val(), Equals, int64(26))
+
+ bitCount = t.client.BitCount("key", &redis.BitCount{0, 0})
+ c.Assert(bitCount.Err(), IsNil)
+ c.Assert(bitCount.Val(), Equals, int64(4))
+
+ bitCount = t.client.BitCount("key", &redis.BitCount{1, 1})
+ c.Assert(bitCount.Err(), IsNil)
+ c.Assert(bitCount.Val(), Equals, int64(6))
+}
+
+func (t *RedisTest) TestStringsBitOpAnd(c *C) {
+ set := t.client.Set("key1", "1")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ set = t.client.Set("key2", "0")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ bitOpAnd := t.client.BitOpAnd("dest", "key1", "key2")
+ c.Assert(bitOpAnd.Err(), IsNil)
+ c.Assert(bitOpAnd.Val(), Equals, int64(1))
+
+ get := t.client.Get("dest")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "0")
+}
+
+func (t *RedisTest) TestStringsBitOpOr(c *C) {
+ set := t.client.Set("key1", "1")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ set = t.client.Set("key2", "0")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ bitOpOr := t.client.BitOpOr("dest", "key1", "key2")
+ c.Assert(bitOpOr.Err(), IsNil)
+ c.Assert(bitOpOr.Val(), Equals, int64(1))
+
+ get := t.client.Get("dest")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "1")
+}
+
+func (t *RedisTest) TestStringsBitOpXor(c *C) {
+ set := t.client.Set("key1", "\xff")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ set = t.client.Set("key2", "\x0f")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ bitOpXor := t.client.BitOpXor("dest", "key1", "key2")
+ c.Assert(bitOpXor.Err(), IsNil)
+ c.Assert(bitOpXor.Val(), Equals, int64(1))
+
+ get := t.client.Get("dest")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "\xf0")
+}
+
+func (t *RedisTest) TestStringsBitOpNot(c *C) {
+ set := t.client.Set("key1", "\x00")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ bitOpNot := t.client.BitOpNot("dest", "key1")
+ c.Assert(bitOpNot.Err(), IsNil)
+ c.Assert(bitOpNot.Val(), Equals, int64(1))
+
+ get := t.client.Get("dest")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "\xff")
+}
+
+func (t *RedisTest) TestStringsDecr(c *C) {
+ set := t.client.Set("key", "10")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ decr := t.client.Decr("key")
+ c.Assert(decr.Err(), IsNil)
+ c.Assert(decr.Val(), Equals, int64(9))
+
+ set = t.client.Set("key", "234293482390480948029348230948")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ decr = t.client.Decr("key")
+ c.Assert(decr.Err(), ErrorMatches, "ERR value is not an integer or out of range")
+ c.Assert(decr.Val(), Equals, int64(0))
+}
+
+func (t *RedisTest) TestStringsDecrBy(c *C) {
+ set := t.client.Set("key", "10")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ decrBy := t.client.DecrBy("key", 5)
+ c.Assert(decrBy.Err(), IsNil)
+ c.Assert(decrBy.Val(), Equals, int64(5))
+}
+
+func (t *RedisTest) TestStringsGet(c *C) {
+ get := t.client.Get("_")
+ c.Assert(get.Err(), Equals, redis.Nil)
+ c.Assert(get.Val(), Equals, "")
+
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ get = t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "hello")
+}
+
+func (t *RedisTest) TestStringsGetBit(c *C) {
+ setBit := t.client.SetBit("key", 7, 1)
+ c.Assert(setBit.Err(), IsNil)
+ c.Assert(setBit.Val(), Equals, int64(0))
+
+ getBit := t.client.GetBit("key", 0)
+ c.Assert(getBit.Err(), IsNil)
+ c.Assert(getBit.Val(), Equals, int64(0))
+
+ getBit = t.client.GetBit("key", 7)
+ c.Assert(getBit.Err(), IsNil)
+ c.Assert(getBit.Val(), Equals, int64(1))
+
+ getBit = t.client.GetBit("key", 100)
+ c.Assert(getBit.Err(), IsNil)
+ c.Assert(getBit.Val(), Equals, int64(0))
+}
+
+func (t *RedisTest) TestStringsGetRange(c *C) {
+ set := t.client.Set("key", "This is a string")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ getRange := t.client.GetRange("key", 0, 3)
+ c.Assert(getRange.Err(), IsNil)
+ c.Assert(getRange.Val(), Equals, "This")
+
+ getRange = t.client.GetRange("key", -3, -1)
+ c.Assert(getRange.Err(), IsNil)
+ c.Assert(getRange.Val(), Equals, "ing")
+
+ getRange = t.client.GetRange("key", 0, -1)
+ c.Assert(getRange.Err(), IsNil)
+ c.Assert(getRange.Val(), Equals, "This is a string")
+
+ getRange = t.client.GetRange("key", 10, 100)
+ c.Assert(getRange.Err(), IsNil)
+ c.Assert(getRange.Val(), Equals, "string")
+}
+
+func (t *RedisTest) TestStringsGetSet(c *C) {
+ incr := t.client.Incr("key")
+ c.Assert(incr.Err(), IsNil)
+ c.Assert(incr.Val(), Equals, int64(1))
+
+ getSet := t.client.GetSet("key", "0")
+ c.Assert(getSet.Err(), IsNil)
+ c.Assert(getSet.Val(), Equals, "1")
+
+ get := t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "0")
+}
+
+func (t *RedisTest) TestStringsIncr(c *C) {
+ set := t.client.Set("key", "10")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ incr := t.client.Incr("key")
+ c.Assert(incr.Err(), IsNil)
+ c.Assert(incr.Val(), Equals, int64(11))
+
+ get := t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "11")
+}
+
+func (t *RedisTest) TestStringsIncrBy(c *C) {
+ set := t.client.Set("key", "10")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ incrBy := t.client.IncrBy("key", 5)
+ c.Assert(incrBy.Err(), IsNil)
+ c.Assert(incrBy.Val(), Equals, int64(15))
+}
+
+func (t *RedisTest) TestIncrByFloat(c *C) {
+ set := t.client.Set("key", "10.50")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ incrByFloat := t.client.IncrByFloat("key", 0.1)
+ c.Assert(incrByFloat.Err(), IsNil)
+ c.Assert(incrByFloat.Val(), Equals, 10.6)
+
+ set = t.client.Set("key", "5.0e3")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ incrByFloat = t.client.IncrByFloat("key", 2.0e2)
+ c.Assert(incrByFloat.Err(), IsNil)
+ c.Assert(incrByFloat.Val(), Equals, float64(5200))
+}
+
+func (t *RedisTest) TestIncrByFloatOverflow(c *C) {
+ incrByFloat := t.client.IncrByFloat("key", 996945661)
+ c.Assert(incrByFloat.Err(), IsNil)
+ c.Assert(incrByFloat.Val(), Equals, float64(996945661))
+}
+
+func (t *RedisTest) TestStringsMSetMGet(c *C) {
+ mSet := t.client.MSet("key1", "hello1", "key2", "hello2")
+ c.Assert(mSet.Err(), IsNil)
+ c.Assert(mSet.Val(), Equals, "OK")
+
+ mGet := t.client.MGet("key1", "key2", "_")
+ c.Assert(mGet.Err(), IsNil)
+ c.Assert(mGet.Val(), DeepEquals, []interface{}{"hello1", "hello2", nil})
+}
+
+func (t *RedisTest) TestStringsMSetNX(c *C) {
+ mSetNX := t.client.MSetNX("key1", "hello1", "key2", "hello2")
+ c.Assert(mSetNX.Err(), IsNil)
+ c.Assert(mSetNX.Val(), Equals, true)
+
+ mSetNX = t.client.MSetNX("key2", "hello1", "key3", "hello2")
+ c.Assert(mSetNX.Err(), IsNil)
+ c.Assert(mSetNX.Val(), Equals, false)
+}
+
+func (t *RedisTest) TestStringsPSetEx(c *C) {
+ expiration := 50 * time.Millisecond
+ psetex := t.client.PSetEx("key", expiration, "hello")
+ c.Assert(psetex.Err(), IsNil)
+ c.Assert(psetex.Val(), Equals, "OK")
+
+ pttl := t.client.PTTL("key")
+ c.Assert(pttl.Err(), IsNil)
+ c.Assert(pttl.Val() <= expiration, Equals, true)
+ c.Assert(pttl.Val() >= expiration-time.Millisecond, Equals, true)
+
+ get := t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "hello")
+}
+
+func (t *RedisTest) TestStringsSetGet(c *C) {
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ get := t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "hello")
+}
+
+func (t *RedisTest) TestStringsSetEx(c *C) {
+ setEx := t.client.SetEx("key", 10*time.Second, "hello")
+ c.Assert(setEx.Err(), IsNil)
+ c.Assert(setEx.Val(), Equals, "OK")
+
+ ttl := t.client.TTL("key")
+ c.Assert(ttl.Err(), IsNil)
+ c.Assert(ttl.Val(), Equals, 10*time.Second)
+}
+
+func (t *RedisTest) TestStringsSetNX(c *C) {
+ setNX := t.client.SetNX("key", "hello")
+ c.Assert(setNX.Err(), IsNil)
+ c.Assert(setNX.Val(), Equals, true)
+
+ setNX = t.client.SetNX("key", "hello2")
+ c.Assert(setNX.Err(), IsNil)
+ c.Assert(setNX.Val(), Equals, false)
+
+ get := t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "hello")
+}
+
+func (t *RedisTest) TestStringsSetRange(c *C) {
+ set := t.client.Set("key", "Hello World")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ range_ := t.client.SetRange("key", 6, "Redis")
+ c.Assert(range_.Err(), IsNil)
+ c.Assert(range_.Val(), Equals, int64(11))
+
+ get := t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "Hello Redis")
+}
+
+func (t *RedisTest) TestStringsStrLen(c *C) {
+ set := t.client.Set("key", "hello")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ strLen := t.client.StrLen("key")
+ c.Assert(strLen.Err(), IsNil)
+ c.Assert(strLen.Val(), Equals, int64(5))
+
+ strLen = t.client.StrLen("_")
+ c.Assert(strLen.Err(), IsNil)
+ c.Assert(strLen.Val(), Equals, int64(0))
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestCmdHDel(c *C) {
+ hSet := t.client.HSet("hash", "key", "hello")
+ c.Assert(hSet.Err(), IsNil)
+
+ hDel := t.client.HDel("hash", "key")
+ c.Assert(hDel.Err(), IsNil)
+ c.Assert(hDel.Val(), Equals, int64(1))
+
+ hDel = t.client.HDel("hash", "key")
+ c.Assert(hDel.Err(), IsNil)
+ c.Assert(hDel.Val(), Equals, int64(0))
+}
+
+func (t *RedisTest) TestCmdHExists(c *C) {
+ hSet := t.client.HSet("hash", "key", "hello")
+ c.Assert(hSet.Err(), IsNil)
+
+ hExists := t.client.HExists("hash", "key")
+ c.Assert(hExists.Err(), IsNil)
+ c.Assert(hExists.Val(), Equals, true)
+
+ hExists = t.client.HExists("hash", "key1")
+ c.Assert(hExists.Err(), IsNil)
+ c.Assert(hExists.Val(), Equals, false)
+}
+
+func (t *RedisTest) TestCmdHGet(c *C) {
+ hSet := t.client.HSet("hash", "key", "hello")
+ c.Assert(hSet.Err(), IsNil)
+
+ hGet := t.client.HGet("hash", "key")
+ c.Assert(hGet.Err(), IsNil)
+ c.Assert(hGet.Val(), Equals, "hello")
+
+ hGet = t.client.HGet("hash", "key1")
+ c.Assert(hGet.Err(), Equals, redis.Nil)
+ c.Assert(hGet.Val(), Equals, "")
+}
+
+func (t *RedisTest) TestCmdHGetAll(c *C) {
+ hSet := t.client.HSet("hash", "key1", "hello1")
+ c.Assert(hSet.Err(), IsNil)
+ hSet = t.client.HSet("hash", "key2", "hello2")
+ c.Assert(hSet.Err(), IsNil)
+
+ hGetAll := t.client.HGetAll("hash")
+ c.Assert(hGetAll.Err(), IsNil)
+ c.Assert(hGetAll.Val(), DeepEquals, []string{"key1", "hello1", "key2", "hello2"})
+}
+
+func (t *RedisTest) TestCmdHGetAllMap(c *C) {
+ hSet := t.client.HSet("hash", "key1", "hello1")
+ c.Assert(hSet.Err(), IsNil)
+ hSet = t.client.HSet("hash", "key2", "hello2")
+ c.Assert(hSet.Err(), IsNil)
+
+ hGetAll := t.client.HGetAllMap("hash")
+ c.Assert(hGetAll.Err(), IsNil)
+ c.Assert(hGetAll.Val(), DeepEquals, map[string]string{"key1": "hello1", "key2": "hello2"})
+}
+
+func (t *RedisTest) TestCmdHIncrBy(c *C) {
+ hSet := t.client.HSet("hash", "key", "5")
+ c.Assert(hSet.Err(), IsNil)
+
+ hIncrBy := t.client.HIncrBy("hash", "key", 1)
+ c.Assert(hIncrBy.Err(), IsNil)
+ c.Assert(hIncrBy.Val(), Equals, int64(6))
+
+ hIncrBy = t.client.HIncrBy("hash", "key", -1)
+ c.Assert(hIncrBy.Err(), IsNil)
+ c.Assert(hIncrBy.Val(), Equals, int64(5))
+
+ hIncrBy = t.client.HIncrBy("hash", "key", -10)
+ c.Assert(hIncrBy.Err(), IsNil)
+ c.Assert(hIncrBy.Val(), Equals, int64(-5))
+}
+
+func (t *RedisTest) TestCmdHIncrByFloat(c *C) {
+ hSet := t.client.HSet("hash", "field", "10.50")
+ c.Assert(hSet.Err(), IsNil)
+ c.Assert(hSet.Val(), Equals, true)
+
+ hIncrByFloat := t.client.HIncrByFloat("hash", "field", 0.1)
+ c.Assert(hIncrByFloat.Err(), IsNil)
+ c.Assert(hIncrByFloat.Val(), Equals, 10.6)
+
+ hSet = t.client.HSet("hash", "field", "5.0e3")
+ c.Assert(hSet.Err(), IsNil)
+ c.Assert(hSet.Val(), Equals, false)
+
+ hIncrByFloat = t.client.HIncrByFloat("hash", "field", 2.0e2)
+ c.Assert(hIncrByFloat.Err(), IsNil)
+ c.Assert(hIncrByFloat.Val(), Equals, float64(5200))
+}
+
+func (t *RedisTest) TestCmdHKeys(c *C) {
+ hkeys := t.client.HKeys("hash")
+ c.Assert(hkeys.Err(), IsNil)
+ c.Assert(hkeys.Val(), DeepEquals, []string{})
+
+ hset := t.client.HSet("hash", "key1", "hello1")
+ c.Assert(hset.Err(), IsNil)
+ hset = t.client.HSet("hash", "key2", "hello2")
+ c.Assert(hset.Err(), IsNil)
+
+ hkeys = t.client.HKeys("hash")
+ c.Assert(hkeys.Err(), IsNil)
+ c.Assert(hkeys.Val(), DeepEquals, []string{"key1", "key2"})
+}
+
+func (t *RedisTest) TestCmdHLen(c *C) {
+ hSet := t.client.HSet("hash", "key1", "hello1")
+ c.Assert(hSet.Err(), IsNil)
+ hSet = t.client.HSet("hash", "key2", "hello2")
+ c.Assert(hSet.Err(), IsNil)
+
+ hLen := t.client.HLen("hash")
+ c.Assert(hLen.Err(), IsNil)
+ c.Assert(hLen.Val(), Equals, int64(2))
+}
+
+func (t *RedisTest) TestCmdHMGet(c *C) {
+ hSet := t.client.HSet("hash", "key1", "hello1")
+ c.Assert(hSet.Err(), IsNil)
+ hSet = t.client.HSet("hash", "key2", "hello2")
+ c.Assert(hSet.Err(), IsNil)
+
+ hMGet := t.client.HMGet("hash", "key1", "key2", "_")
+ c.Assert(hMGet.Err(), IsNil)
+ c.Assert(hMGet.Val(), DeepEquals, []interface{}{"hello1", "hello2", nil})
+}
+
+func (t *RedisTest) TestCmdHMSet(c *C) {
+ hMSet := t.client.HMSet("hash", "key1", "hello1", "key2", "hello2")
+ c.Assert(hMSet.Err(), IsNil)
+ c.Assert(hMSet.Val(), Equals, "OK")
+
+ hGet := t.client.HGet("hash", "key1")
+ c.Assert(hGet.Err(), IsNil)
+ c.Assert(hGet.Val(), Equals, "hello1")
+
+ hGet = t.client.HGet("hash", "key2")
+ c.Assert(hGet.Err(), IsNil)
+ c.Assert(hGet.Val(), Equals, "hello2")
+}
+
+func (t *RedisTest) TestCmdHSet(c *C) {
+ hSet := t.client.HSet("hash", "key", "hello")
+ c.Assert(hSet.Err(), IsNil)
+ c.Assert(hSet.Val(), Equals, true)
+
+ hGet := t.client.HGet("hash", "key")
+ c.Assert(hGet.Err(), IsNil)
+ c.Assert(hGet.Val(), Equals, "hello")
+}
+
+func (t *RedisTest) TestCmdHSetNX(c *C) {
+ hSetNX := t.client.HSetNX("hash", "key", "hello")
+ c.Assert(hSetNX.Err(), IsNil)
+ c.Assert(hSetNX.Val(), Equals, true)
+
+ hSetNX = t.client.HSetNX("hash", "key", "hello")
+ c.Assert(hSetNX.Err(), IsNil)
+ c.Assert(hSetNX.Val(), Equals, false)
+
+ hGet := t.client.HGet("hash", "key")
+ c.Assert(hGet.Err(), IsNil)
+ c.Assert(hGet.Val(), Equals, "hello")
+}
+
+func (t *RedisTest) TestCmdHVals(c *C) {
+ hSet := t.client.HSet("hash", "key1", "hello1")
+ c.Assert(hSet.Err(), IsNil)
+ hSet = t.client.HSet("hash", "key2", "hello2")
+ c.Assert(hSet.Err(), IsNil)
+
+ hVals := t.client.HVals("hash")
+ c.Assert(hVals.Err(), IsNil)
+ c.Assert(hVals.Val(), DeepEquals, []string{"hello1", "hello2"})
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestCmdListsBLPop(c *C) {
+ rPush := t.client.RPush("list1", "a", "b", "c")
+ c.Assert(rPush.Err(), IsNil)
+
+ bLPop := t.client.BLPop(0, "list1", "list2")
+ c.Assert(bLPop.Err(), IsNil)
+ c.Assert(bLPop.Val(), DeepEquals, []string{"list1", "a"})
+}
+
+func (t *RedisTest) TestCmdListsBLPopBlocks(c *C) {
+ started := make(chan bool)
+ done := make(chan bool)
+ go func() {
+ started <- true
+ bLPop := t.client.BLPop(0, "list")
+ c.Assert(bLPop.Err(), IsNil)
+ c.Assert(bLPop.Val(), DeepEquals, []string{"list", "a"})
+ done <- true
+ }()
+ <-started
+
+ select {
+ case <-done:
+ c.Error("BLPop is not blocked")
+ case <-time.After(time.Second):
+ // ok
+ }
+
+ rPush := t.client.RPush("list", "a")
+ c.Assert(rPush.Err(), IsNil)
+
+ select {
+ case <-done:
+ // ok
+ case <-time.After(time.Second):
+ c.Error("BLPop is still blocked")
+ // ok
+ }
+}
+
+func (t *RedisTest) TestCmdListsBLPopTimeout(c *C) {
+ bLPop := t.client.BLPop(1, "list1")
+ c.Assert(bLPop.Err(), Equals, redis.Nil)
+ c.Assert(bLPop.Val(), IsNil)
+}
+
+func (t *RedisTest) TestCmdListsBRPop(c *C) {
+ rPush := t.client.RPush("list1", "a", "b", "c")
+ c.Assert(rPush.Err(), IsNil)
+
+ bRPop := t.client.BRPop(0, "list1", "list2")
+ c.Assert(bRPop.Err(), IsNil)
+ c.Assert(bRPop.Val(), DeepEquals, []string{"list1", "c"})
+}
+
+func (t *RedisTest) TestCmdListsBRPopBlocks(c *C) {
+ started := make(chan bool)
+ done := make(chan bool)
+ go func() {
+ started <- true
+ brpop := t.client.BRPop(0, "list")
+ c.Assert(brpop.Err(), IsNil)
+ c.Assert(brpop.Val(), DeepEquals, []string{"list", "a"})
+ done <- true
+ }()
+ <-started
+
+ select {
+ case <-done:
+ c.Error("BRPop is not blocked")
+ case <-time.After(time.Second):
+ // ok
+ }
+
+ rPush := t.client.RPush("list", "a")
+ c.Assert(rPush.Err(), IsNil)
+
+ select {
+ case <-done:
+ // ok
+ case <-time.After(time.Second):
+ c.Error("BRPop is still blocked")
+ // ok
+ }
+}
+
+func (t *RedisTest) TestCmdListsBRPopLPush(c *C) {
+ rPush := t.client.RPush("list1", "a", "b", "c")
+ c.Assert(rPush.Err(), IsNil)
+
+ bRPopLPush := t.client.BRPopLPush("list1", "list2", 0)
+ c.Assert(bRPopLPush.Err(), IsNil)
+ c.Assert(bRPopLPush.Val(), Equals, "c")
+}
+
+func (t *RedisTest) TestCmdListsLIndex(c *C) {
+ lPush := t.client.LPush("list", "World")
+ c.Assert(lPush.Err(), IsNil)
+ lPush = t.client.LPush("list", "Hello")
+ c.Assert(lPush.Err(), IsNil)
+
+ lIndex := t.client.LIndex("list", 0)
+ c.Assert(lIndex.Err(), IsNil)
+ c.Assert(lIndex.Val(), Equals, "Hello")
+
+ lIndex = t.client.LIndex("list", -1)
+ c.Assert(lIndex.Err(), IsNil)
+ c.Assert(lIndex.Val(), Equals, "World")
+
+ lIndex = t.client.LIndex("list", 3)
+ c.Assert(lIndex.Err(), Equals, redis.Nil)
+ c.Assert(lIndex.Val(), Equals, "")
+}
+
+func (t *RedisTest) TestCmdListsLInsert(c *C) {
+ rPush := t.client.RPush("list", "Hello")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "World")
+ c.Assert(rPush.Err(), IsNil)
+
+ lInsert := t.client.LInsert("list", "BEFORE", "World", "There")
+ c.Assert(lInsert.Err(), IsNil)
+ c.Assert(lInsert.Val(), Equals, int64(3))
+
+ lRange := t.client.LRange("list", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"Hello", "There", "World"})
+}
+
+func (t *RedisTest) TestCmdListsLLen(c *C) {
+ lPush := t.client.LPush("list", "World")
+ c.Assert(lPush.Err(), IsNil)
+ lPush = t.client.LPush("list", "Hello")
+ c.Assert(lPush.Err(), IsNil)
+
+ lLen := t.client.LLen("list")
+ c.Assert(lLen.Err(), IsNil)
+ c.Assert(lLen.Val(), Equals, int64(2))
+}
+
+func (t *RedisTest) TestCmdListsLPop(c *C) {
+ rPush := t.client.RPush("list", "one")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "two")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "three")
+ c.Assert(rPush.Err(), IsNil)
+
+ lPop := t.client.LPop("list")
+ c.Assert(lPop.Err(), IsNil)
+ c.Assert(lPop.Val(), Equals, "one")
+
+ lRange := t.client.LRange("list", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"two", "three"})
+}
+
+func (t *RedisTest) TestCmdListsLPush(c *C) {
+ lPush := t.client.LPush("list", "World")
+ c.Assert(lPush.Err(), IsNil)
+ lPush = t.client.LPush("list", "Hello")
+ c.Assert(lPush.Err(), IsNil)
+
+ lRange := t.client.LRange("list", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"Hello", "World"})
+}
+
+func (t *RedisTest) TestCmdListsLPushX(c *C) {
+ lPush := t.client.LPush("list", "World")
+ c.Assert(lPush.Err(), IsNil)
+
+ lPushX := t.client.LPushX("list", "Hello")
+ c.Assert(lPushX.Err(), IsNil)
+ c.Assert(lPushX.Val(), Equals, int64(2))
+
+ lPushX = t.client.LPushX("list2", "Hello")
+ c.Assert(lPushX.Err(), IsNil)
+ c.Assert(lPushX.Val(), Equals, int64(0))
+
+ lRange := t.client.LRange("list", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"Hello", "World"})
+
+ lRange = t.client.LRange("list2", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{})
+}
+
+func (t *RedisTest) TestCmdListsLRange(c *C) {
+ rPush := t.client.RPush("list", "one")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "two")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "three")
+ c.Assert(rPush.Err(), IsNil)
+
+ lRange := t.client.LRange("list", 0, 0)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"one"})
+
+ lRange = t.client.LRange("list", -3, 2)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"one", "two", "three"})
+
+ lRange = t.client.LRange("list", -100, 100)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"one", "two", "three"})
+
+ lRange = t.client.LRange("list", 5, 10)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{})
+}
+
+func (t *RedisTest) TestCmdListsLRem(c *C) {
+ rPush := t.client.RPush("list", "hello")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "hello")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "key")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "hello")
+ c.Assert(rPush.Err(), IsNil)
+
+ lRem := t.client.LRem("list", -2, "hello")
+ c.Assert(lRem.Err(), IsNil)
+ c.Assert(lRem.Val(), Equals, int64(2))
+
+ lRange := t.client.LRange("list", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"hello", "key"})
+}
+
+func (t *RedisTest) TestCmdListsLSet(c *C) {
+ rPush := t.client.RPush("list", "one")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "two")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "three")
+ c.Assert(rPush.Err(), IsNil)
+
+ lSet := t.client.LSet("list", 0, "four")
+ c.Assert(lSet.Err(), IsNil)
+ c.Assert(lSet.Val(), Equals, "OK")
+
+ lSet = t.client.LSet("list", -2, "five")
+ c.Assert(lSet.Err(), IsNil)
+ c.Assert(lSet.Val(), Equals, "OK")
+
+ lRange := t.client.LRange("list", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"four", "five", "three"})
+}
+
+func (t *RedisTest) TestCmdListsLTrim(c *C) {
+ rPush := t.client.RPush("list", "one")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "two")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "three")
+ c.Assert(rPush.Err(), IsNil)
+
+ lTrim := t.client.LTrim("list", 1, -1)
+ c.Assert(lTrim.Err(), IsNil)
+ c.Assert(lTrim.Val(), Equals, "OK")
+
+ lRange := t.client.LRange("list", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"two", "three"})
+}
+
+func (t *RedisTest) TestCmdListsRPop(c *C) {
+ rPush := t.client.RPush("list", "one")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "two")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "three")
+ c.Assert(rPush.Err(), IsNil)
+
+ rPop := t.client.RPop("list")
+ c.Assert(rPop.Err(), IsNil)
+ c.Assert(rPop.Val(), Equals, "three")
+
+ lRange := t.client.LRange("list", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"one", "two"})
+}
+
+func (t *RedisTest) TestCmdListsRPopLPush(c *C) {
+ rPush := t.client.RPush("list", "one")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "two")
+ c.Assert(rPush.Err(), IsNil)
+ rPush = t.client.RPush("list", "three")
+ c.Assert(rPush.Err(), IsNil)
+
+ rPopLPush := t.client.RPopLPush("list", "list2")
+ c.Assert(rPopLPush.Err(), IsNil)
+ c.Assert(rPopLPush.Val(), Equals, "three")
+
+ lRange := t.client.LRange("list", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"one", "two"})
+
+ lRange = t.client.LRange("list2", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"three"})
+}
+
+func (t *RedisTest) TestCmdListsRPush(c *C) {
+ rPush := t.client.RPush("list", "Hello")
+ c.Assert(rPush.Err(), IsNil)
+ c.Assert(rPush.Val(), Equals, int64(1))
+
+ rPush = t.client.RPush("list", "World")
+ c.Assert(rPush.Err(), IsNil)
+ c.Assert(rPush.Val(), Equals, int64(2))
+
+ lRange := t.client.LRange("list", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"Hello", "World"})
+}
+
+func (t *RedisTest) TestCmdListsRPushX(c *C) {
+ rPush := t.client.RPush("list", "Hello")
+ c.Assert(rPush.Err(), IsNil)
+ c.Assert(rPush.Val(), Equals, int64(1))
+
+ rPushX := t.client.RPushX("list", "World")
+ c.Assert(rPushX.Err(), IsNil)
+ c.Assert(rPushX.Val(), Equals, int64(2))
+
+ rPushX = t.client.RPushX("list2", "World")
+ c.Assert(rPushX.Err(), IsNil)
+ c.Assert(rPushX.Val(), Equals, int64(0))
+
+ lRange := t.client.LRange("list", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{"Hello", "World"})
+
+ lRange = t.client.LRange("list2", 0, -1)
+ c.Assert(lRange.Err(), IsNil)
+ c.Assert(lRange.Val(), DeepEquals, []string{})
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestSAdd(c *C) {
+ sAdd := t.client.SAdd("set", "Hello")
+ c.Assert(sAdd.Err(), IsNil)
+ c.Assert(sAdd.Val(), Equals, int64(1))
+
+ sAdd = t.client.SAdd("set", "World")
+ c.Assert(sAdd.Err(), IsNil)
+ c.Assert(sAdd.Val(), Equals, int64(1))
+
+ sAdd = t.client.SAdd("set", "World")
+ c.Assert(sAdd.Err(), IsNil)
+ c.Assert(sAdd.Val(), Equals, int64(0))
+
+ sMembers := t.client.SMembers("set")
+ c.Assert(sMembers.Err(), IsNil)
+ c.Assert(sortStrings(sMembers.Val()), DeepEquals, []string{"Hello", "World"})
+}
+
+func (t *RedisTest) TestSCard(c *C) {
+ sAdd := t.client.SAdd("set", "Hello")
+ c.Assert(sAdd.Err(), IsNil)
+ c.Assert(sAdd.Val(), Equals, int64(1))
+
+ sAdd = t.client.SAdd("set", "World")
+ c.Assert(sAdd.Err(), IsNil)
+ c.Assert(sAdd.Val(), Equals, int64(1))
+
+ sCard := t.client.SCard("set")
+ c.Assert(sCard.Err(), IsNil)
+ c.Assert(sCard.Val(), Equals, int64(2))
+}
+
+func (t *RedisTest) TestSDiff(c *C) {
+ sAdd := t.client.SAdd("set1", "a")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "b")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "c")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sAdd = t.client.SAdd("set2", "c")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set2", "d")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set2", "e")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sDiff := t.client.SDiff("set1", "set2")
+ c.Assert(sDiff.Err(), IsNil)
+ c.Assert(sortStrings(sDiff.Val()), DeepEquals, []string{"a", "b"})
+}
+
+func (t *RedisTest) TestSDiffStore(c *C) {
+ sAdd := t.client.SAdd("set1", "a")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "b")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "c")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sAdd = t.client.SAdd("set2", "c")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set2", "d")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set2", "e")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sDiffStore := t.client.SDiffStore("set", "set1", "set2")
+ c.Assert(sDiffStore.Err(), IsNil)
+ c.Assert(sDiffStore.Val(), Equals, int64(2))
+
+ sMembers := t.client.SMembers("set")
+ c.Assert(sMembers.Err(), IsNil)
+ c.Assert(sortStrings(sMembers.Val()), DeepEquals, []string{"a", "b"})
+}
+
+func (t *RedisTest) TestSInter(c *C) {
+ sAdd := t.client.SAdd("set1", "a")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "b")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "c")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sAdd = t.client.SAdd("set2", "c")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set2", "d")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set2", "e")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sInter := t.client.SInter("set1", "set2")
+ c.Assert(sInter.Err(), IsNil)
+ c.Assert(sInter.Val(), DeepEquals, []string{"c"})
+}
+
+func (t *RedisTest) TestSInterStore(c *C) {
+ sAdd := t.client.SAdd("set1", "a")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "b")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "c")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sAdd = t.client.SAdd("set2", "c")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set2", "d")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set2", "e")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sInterStore := t.client.SInterStore("set", "set1", "set2")
+ c.Assert(sInterStore.Err(), IsNil)
+ c.Assert(sInterStore.Val(), Equals, int64(1))
+
+ sMembers := t.client.SMembers("set")
+ c.Assert(sMembers.Err(), IsNil)
+ c.Assert(sMembers.Val(), DeepEquals, []string{"c"})
+}
+
+func (t *RedisTest) TestIsMember(c *C) {
+ sAdd := t.client.SAdd("set", "one")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sIsMember := t.client.SIsMember("set", "one")
+ c.Assert(sIsMember.Err(), IsNil)
+ c.Assert(sIsMember.Val(), Equals, true)
+
+ sIsMember = t.client.SIsMember("set", "two")
+ c.Assert(sIsMember.Err(), IsNil)
+ c.Assert(sIsMember.Val(), Equals, false)
+}
+
+func (t *RedisTest) TestSMembers(c *C) {
+ sAdd := t.client.SAdd("set", "Hello")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set", "World")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sMembers := t.client.SMembers("set")
+ c.Assert(sMembers.Err(), IsNil)
+ c.Assert(sortStrings(sMembers.Val()), DeepEquals, []string{"Hello", "World"})
+}
+
+func (t *RedisTest) TestSMove(c *C) {
+ sAdd := t.client.SAdd("set1", "one")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "two")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sAdd = t.client.SAdd("set2", "three")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sMove := t.client.SMove("set1", "set2", "two")
+ c.Assert(sMove.Err(), IsNil)
+ c.Assert(sMove.Val(), Equals, true)
+
+ sMembers := t.client.SMembers("set1")
+ c.Assert(sMembers.Err(), IsNil)
+ c.Assert(sMembers.Val(), DeepEquals, []string{"one"})
+
+ sMembers = t.client.SMembers("set2")
+ c.Assert(sMembers.Err(), IsNil)
+ c.Assert(sortStrings(sMembers.Val()), DeepEquals, []string{"three", "two"})
+}
+
+func (t *RedisTest) TestSPop(c *C) {
+ sAdd := t.client.SAdd("set", "one")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set", "two")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set", "three")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sPop := t.client.SPop("set")
+ c.Assert(sPop.Err(), IsNil)
+ c.Assert(sPop.Val(), Not(Equals), "")
+
+ sMembers := t.client.SMembers("set")
+ c.Assert(sMembers.Err(), IsNil)
+ c.Assert(sMembers.Val(), HasLen, 2)
+}
+
+func (t *RedisTest) TestSRandMember(c *C) {
+ sAdd := t.client.SAdd("set", "one")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set", "two")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set", "three")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sRandMember := t.client.SRandMember("set")
+ c.Assert(sRandMember.Err(), IsNil)
+ c.Assert(sRandMember.Val(), Not(Equals), "")
+
+ sMembers := t.client.SMembers("set")
+ c.Assert(sMembers.Err(), IsNil)
+ c.Assert(sMembers.Val(), HasLen, 3)
+}
+
+func (t *RedisTest) TestSRem(c *C) {
+ sAdd := t.client.SAdd("set", "one")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set", "two")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set", "three")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sRem := t.client.SRem("set", "one")
+ c.Assert(sRem.Err(), IsNil)
+ c.Assert(sRem.Val(), Equals, int64(1))
+
+ sRem = t.client.SRem("set", "four")
+ c.Assert(sRem.Err(), IsNil)
+ c.Assert(sRem.Val(), Equals, int64(0))
+
+ sMembers := t.client.SMembers("set")
+ c.Assert(sMembers.Err(), IsNil)
+ c.Assert(
+ sortStrings(sMembers.Val()),
+ DeepEquals,
+ []string{"three", "two"},
+ )
+}
+
+func (t *RedisTest) TestSUnion(c *C) {
+ sAdd := t.client.SAdd("set1", "a")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "b")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "c")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sAdd = t.client.SAdd("set2", "c")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set2", "d")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set2", "e")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sUnion := t.client.SUnion("set1", "set2")
+ c.Assert(sUnion.Err(), IsNil)
+ c.Assert(sUnion.Val(), HasLen, 5)
+}
+
+func (t *RedisTest) TestSUnionStore(c *C) {
+ sAdd := t.client.SAdd("set1", "a")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "b")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set1", "c")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sAdd = t.client.SAdd("set2", "c")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set2", "d")
+ c.Assert(sAdd.Err(), IsNil)
+ sAdd = t.client.SAdd("set2", "e")
+ c.Assert(sAdd.Err(), IsNil)
+
+ sUnionStore := t.client.SUnionStore("set", "set1", "set2")
+ c.Assert(sUnionStore.Err(), IsNil)
+ c.Assert(sUnionStore.Val(), Equals, int64(5))
+
+ sMembers := t.client.SMembers("set")
+ c.Assert(sMembers.Err(), IsNil)
+ c.Assert(sMembers.Val(), HasLen, 5)
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestZAdd(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ c.Assert(zAdd.Val(), Equals, int64(1))
+
+ zAdd = t.client.ZAdd("zset", redis.Z{1, "uno"})
+ c.Assert(zAdd.Err(), IsNil)
+ c.Assert(zAdd.Val(), Equals, int64(1))
+
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ c.Assert(zAdd.Val(), Equals, int64(1))
+
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ c.Assert(zAdd.Val(), Equals, int64(0))
+
+ val, err := t.client.ZRangeWithScores("zset", 0, -1).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{1, "one"}, {1, "uno"}, {3, "two"}})
+}
+
+func (t *RedisTest) TestZCard(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zCard := t.client.ZCard("zset")
+ c.Assert(zCard.Err(), IsNil)
+ c.Assert(zCard.Val(), Equals, int64(2))
+}
+
+func (t *RedisTest) TestZCount(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zCount := t.client.ZCount("zset", "-inf", "+inf")
+ c.Assert(zCount.Err(), IsNil)
+ c.Assert(zCount.Val(), Equals, int64(3))
+
+ zCount = t.client.ZCount("zset", "(1", "3")
+ c.Assert(zCount.Err(), IsNil)
+ c.Assert(zCount.Val(), Equals, int64(2))
+}
+
+func (t *RedisTest) TestZIncrBy(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zIncrBy := t.client.ZIncrBy("zset", 2, "one")
+ c.Assert(zIncrBy.Err(), IsNil)
+ c.Assert(zIncrBy.Val(), Equals, float64(3))
+
+ val, err := t.client.ZRangeWithScores("zset", 0, -1).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{2, "two"}, {3, "one"}})
+}
+
+func (t *RedisTest) TestZInterStore(c *C) {
+ zAdd := t.client.ZAdd("zset1", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset1", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zAdd = t.client.ZAdd("zset2", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset2", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset3", redis.Z{3, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zInterStore := t.client.ZInterStore(
+ "out", redis.ZStore{Weights: []int64{2, 3}}, "zset1", "zset2")
+ c.Assert(zInterStore.Err(), IsNil)
+ c.Assert(zInterStore.Val(), Equals, int64(2))
+
+ val, err := t.client.ZRangeWithScores("out", 0, -1).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{5, "one"}, {10, "two"}})
+}
+
+func (t *RedisTest) TestZRange(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zRange := t.client.ZRange("zset", 0, -1)
+ c.Assert(zRange.Err(), IsNil)
+ c.Assert(zRange.Val(), DeepEquals, []string{"one", "two", "three"})
+
+ zRange = t.client.ZRange("zset", 2, 3)
+ c.Assert(zRange.Err(), IsNil)
+ c.Assert(zRange.Val(), DeepEquals, []string{"three"})
+
+ zRange = t.client.ZRange("zset", -2, -1)
+ c.Assert(zRange.Err(), IsNil)
+ c.Assert(zRange.Val(), DeepEquals, []string{"two", "three"})
+}
+
+func (t *RedisTest) TestZRangeWithScores(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ val, err := t.client.ZRangeWithScores("zset", 0, -1).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{1, "one"}, {2, "two"}, {3, "three"}})
+
+ val, err = t.client.ZRangeWithScores("zset", 2, 3).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{3, "three"}})
+
+ val, err = t.client.ZRangeWithScores("zset", -2, -1).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{2, "two"}, {3, "three"}})
+}
+
+func (t *RedisTest) TestZRangeByScore(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zRangeByScore := t.client.ZRangeByScore("zset", redis.ZRangeByScore{
+ Min: "-inf",
+ Max: "+inf",
+ })
+ c.Assert(zRangeByScore.Err(), IsNil)
+ c.Assert(zRangeByScore.Val(), DeepEquals, []string{"one", "two", "three"})
+
+ zRangeByScore = t.client.ZRangeByScore("zset", redis.ZRangeByScore{
+ Min: "1",
+ Max: "2",
+ })
+ c.Assert(zRangeByScore.Err(), IsNil)
+ c.Assert(zRangeByScore.Val(), DeepEquals, []string{"one", "two"})
+
+ zRangeByScore = t.client.ZRangeByScore("zset", redis.ZRangeByScore{
+ Min: "(1",
+ Max: "2",
+ })
+ c.Assert(zRangeByScore.Err(), IsNil)
+ c.Assert(zRangeByScore.Val(), DeepEquals, []string{"two"})
+
+ zRangeByScore = t.client.ZRangeByScore("zset", redis.ZRangeByScore{
+ Min: "(1",
+ Max: "(2",
+ })
+ c.Assert(zRangeByScore.Err(), IsNil)
+ c.Assert(zRangeByScore.Val(), DeepEquals, []string{})
+}
+
+func (t *RedisTest) TestZRangeByScoreWithScoresMap(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ val, err := t.client.ZRangeByScoreWithScores("zset", redis.ZRangeByScore{
+ Min: "-inf",
+ Max: "+inf",
+ }).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{1, "one"}, {2, "two"}, {3, "three"}})
+
+ val, err = t.client.ZRangeByScoreWithScores("zset", redis.ZRangeByScore{
+ Min: "1",
+ Max: "2",
+ }).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{1, "one"}, {2, "two"}})
+
+ val, err = t.client.ZRangeByScoreWithScores("zset", redis.ZRangeByScore{
+ Min: "(1",
+ Max: "2",
+ }).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{2, "two"}})
+
+ val, err = t.client.ZRangeByScoreWithScores("zset", redis.ZRangeByScore{
+ Min: "(1",
+ Max: "(2",
+ }).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{})
+}
+
+func (t *RedisTest) TestZRank(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zRank := t.client.ZRank("zset", "three")
+ c.Assert(zRank.Err(), IsNil)
+ c.Assert(zRank.Val(), Equals, int64(2))
+
+ zRank = t.client.ZRank("zset", "four")
+ c.Assert(zRank.Err(), Equals, redis.Nil)
+ c.Assert(zRank.Val(), Equals, int64(0))
+}
+
+func (t *RedisTest) TestZRem(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zRem := t.client.ZRem("zset", "two")
+ c.Assert(zRem.Err(), IsNil)
+ c.Assert(zRem.Val(), Equals, int64(1))
+
+ val, err := t.client.ZRangeWithScores("zset", 0, -1).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{1, "one"}, {3, "three"}})
+}
+
+func (t *RedisTest) TestZRemRangeByRank(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zRemRangeByRank := t.client.ZRemRangeByRank("zset", 0, 1)
+ c.Assert(zRemRangeByRank.Err(), IsNil)
+ c.Assert(zRemRangeByRank.Val(), Equals, int64(2))
+
+ val, err := t.client.ZRangeWithScores("zset", 0, -1).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{3, "three"}})
+}
+
+func (t *RedisTest) TestZRemRangeByScore(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zRemRangeByScore := t.client.ZRemRangeByScore("zset", "-inf", "(2")
+ c.Assert(zRemRangeByScore.Err(), IsNil)
+ c.Assert(zRemRangeByScore.Val(), Equals, int64(1))
+
+ val, err := t.client.ZRangeWithScores("zset", 0, -1).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{2, "two"}, {3, "three"}})
+}
+
+func (t *RedisTest) TestZRevRange(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zRevRange := t.client.ZRevRange("zset", "0", "-1")
+ c.Assert(zRevRange.Err(), IsNil)
+ c.Assert(zRevRange.Val(), DeepEquals, []string{"three", "two", "one"})
+
+ zRevRange = t.client.ZRevRange("zset", "2", "3")
+ c.Assert(zRevRange.Err(), IsNil)
+ c.Assert(zRevRange.Val(), DeepEquals, []string{"one"})
+
+ zRevRange = t.client.ZRevRange("zset", "-2", "-1")
+ c.Assert(zRevRange.Err(), IsNil)
+ c.Assert(zRevRange.Val(), DeepEquals, []string{"two", "one"})
+}
+
+func (t *RedisTest) TestZRevRangeWithScoresMap(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ val, err := t.client.ZRevRangeWithScores("zset", "0", "-1").Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{3, "three"}, {2, "two"}, {1, "one"}})
+
+ val, err = t.client.ZRevRangeWithScores("zset", "2", "3").Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{1, "one"}})
+
+ val, err = t.client.ZRevRangeWithScores("zset", "-2", "-1").Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{2, "two"}, {1, "one"}})
+}
+
+func (t *RedisTest) TestZRevRangeByScore(c *C) {
+ zadd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zadd.Err(), IsNil)
+ zadd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zadd.Err(), IsNil)
+ zadd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zadd.Err(), IsNil)
+
+ vals, err := t.client.ZRevRangeByScore(
+ "zset", redis.ZRangeByScore{Max: "+inf", Min: "-inf"}).Result()
+ c.Assert(err, IsNil)
+ c.Assert(vals, DeepEquals, []string{"three", "two", "one"})
+
+ vals, err = t.client.ZRevRangeByScore(
+ "zset", redis.ZRangeByScore{Max: "2", Min: "(1"}).Result()
+ c.Assert(err, IsNil)
+ c.Assert(vals, DeepEquals, []string{"two"})
+
+ vals, err = t.client.ZRevRangeByScore(
+ "zset", redis.ZRangeByScore{Max: "(2", Min: "(1"}).Result()
+ c.Assert(err, IsNil)
+ c.Assert(vals, DeepEquals, []string{})
+}
+
+func (t *RedisTest) TestZRevRangeByScoreWithScores(c *C) {
+ zadd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zadd.Err(), IsNil)
+ zadd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zadd.Err(), IsNil)
+ zadd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zadd.Err(), IsNil)
+
+ vals, err := t.client.ZRevRangeByScoreWithScores(
+ "zset", redis.ZRangeByScore{Max: "+inf", Min: "-inf"}).Result()
+ c.Assert(err, IsNil)
+ c.Assert(vals, DeepEquals, []redis.Z{{3, "three"}, {2, "two"}, {1, "one"}})
+}
+
+func (t *RedisTest) TestZRevRangeByScoreWithScoresMap(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ val, err := t.client.ZRevRangeByScoreWithScores(
+ "zset", redis.ZRangeByScore{Max: "+inf", Min: "-inf"}).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{3, "three"}, {2, "two"}, {1, "one"}})
+
+ val, err = t.client.ZRevRangeByScoreWithScores(
+ "zset", redis.ZRangeByScore{Max: "2", Min: "(1"}).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{2, "two"}})
+
+ val, err = t.client.ZRevRangeByScoreWithScores(
+ "zset", redis.ZRangeByScore{Max: "(2", Min: "(1"}).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{})
+}
+
+func (t *RedisTest) TestZRevRank(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zRevRank := t.client.ZRevRank("zset", "one")
+ c.Assert(zRevRank.Err(), IsNil)
+ c.Assert(zRevRank.Val(), Equals, int64(2))
+
+ zRevRank = t.client.ZRevRank("zset", "four")
+ c.Assert(zRevRank.Err(), Equals, redis.Nil)
+ c.Assert(zRevRank.Val(), Equals, int64(0))
+}
+
+func (t *RedisTest) TestZScore(c *C) {
+ zAdd := t.client.ZAdd("zset", redis.Z{1.001, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zScore := t.client.ZScore("zset", "one")
+ c.Assert(zScore.Err(), IsNil)
+ c.Assert(zScore.Val(), Equals, float64(1.001))
+}
+
+func (t *RedisTest) TestZUnionStore(c *C) {
+ zAdd := t.client.ZAdd("zset1", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset1", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zAdd = t.client.ZAdd("zset2", redis.Z{1, "one"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset2", redis.Z{2, "two"})
+ c.Assert(zAdd.Err(), IsNil)
+ zAdd = t.client.ZAdd("zset2", redis.Z{3, "three"})
+ c.Assert(zAdd.Err(), IsNil)
+
+ zUnionStore := t.client.ZUnionStore(
+ "out", redis.ZStore{Weights: []int64{2, 3}}, "zset1", "zset2")
+ c.Assert(zUnionStore.Err(), IsNil)
+ c.Assert(zUnionStore.Val(), Equals, int64(3))
+
+ val, err := t.client.ZRangeWithScores("out", 0, -1).Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, DeepEquals, []redis.Z{{5, "one"}, {9, "three"}, {10, "two"}})
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestPatternPubSub(c *C) {
+ pubsub := t.client.PubSub()
+ defer func() {
+ c.Assert(pubsub.Close(), IsNil)
+ }()
+
+ c.Assert(pubsub.PSubscribe("mychannel*"), IsNil)
+
+ pub := t.client.Publish("mychannel1", "hello")
+ c.Assert(pub.Err(), IsNil)
+ c.Assert(pub.Val(), Equals, int64(1))
+
+ c.Assert(pubsub.PUnsubscribe("mychannel*"), IsNil)
+
+ {
+ msgi, err := pubsub.ReceiveTimeout(time.Second)
+ c.Assert(err, IsNil)
+ subscr := msgi.(*redis.Subscription)
+ c.Assert(subscr.Kind, Equals, "psubscribe")
+ c.Assert(subscr.Channel, Equals, "mychannel*")
+ c.Assert(subscr.Count, Equals, 1)
+ }
+
+ {
+ msgi, err := pubsub.ReceiveTimeout(time.Second)
+ c.Assert(err, IsNil)
+ subscr := msgi.(*redis.PMessage)
+ c.Assert(subscr.Channel, Equals, "mychannel1")
+ c.Assert(subscr.Pattern, Equals, "mychannel*")
+ c.Assert(subscr.Payload, Equals, "hello")
+ }
+
+ {
+ msgi, err := pubsub.ReceiveTimeout(time.Second)
+ c.Assert(err, IsNil)
+ subscr := msgi.(*redis.Subscription)
+ c.Assert(subscr.Kind, Equals, "punsubscribe")
+ c.Assert(subscr.Channel, Equals, "mychannel*")
+ c.Assert(subscr.Count, Equals, 0)
+ }
+
+ {
+ msgi, err := pubsub.ReceiveTimeout(time.Second)
+ c.Assert(err.(net.Error).Timeout(), Equals, true)
+ c.Assert(msgi, IsNil)
+ }
+}
+
+func (t *RedisTest) TestPubSub(c *C) {
+ pubsub := t.client.PubSub()
+ defer func() {
+ c.Assert(pubsub.Close(), IsNil)
+ }()
+
+ c.Assert(pubsub.Subscribe("mychannel", "mychannel2"), IsNil)
+
+ pub := t.client.Publish("mychannel", "hello")
+ c.Assert(pub.Err(), IsNil)
+ c.Assert(pub.Val(), Equals, int64(1))
+
+ pub = t.client.Publish("mychannel2", "hello2")
+ c.Assert(pub.Err(), IsNil)
+ c.Assert(pub.Val(), Equals, int64(1))
+
+ c.Assert(pubsub.Unsubscribe("mychannel", "mychannel2"), IsNil)
+
+ {
+ msgi, err := pubsub.ReceiveTimeout(time.Second)
+ c.Assert(err, IsNil)
+ subscr := msgi.(*redis.Subscription)
+ c.Assert(subscr.Kind, Equals, "subscribe")
+ c.Assert(subscr.Channel, Equals, "mychannel")
+ c.Assert(subscr.Count, Equals, 1)
+ }
+
+ {
+ msgi, err := pubsub.ReceiveTimeout(time.Second)
+ c.Assert(err, IsNil)
+ subscr := msgi.(*redis.Subscription)
+ c.Assert(subscr.Kind, Equals, "subscribe")
+ c.Assert(subscr.Channel, Equals, "mychannel2")
+ c.Assert(subscr.Count, Equals, 2)
+ }
+
+ {
+ msgi, err := pubsub.ReceiveTimeout(time.Second)
+ c.Assert(err, IsNil)
+ subscr := msgi.(*redis.Message)
+ c.Assert(subscr.Channel, Equals, "mychannel")
+ c.Assert(subscr.Payload, Equals, "hello")
+ }
+
+ {
+ msgi, err := pubsub.ReceiveTimeout(time.Second)
+ c.Assert(err, IsNil)
+ msg := msgi.(*redis.Message)
+ c.Assert(msg.Channel, Equals, "mychannel2")
+ c.Assert(msg.Payload, Equals, "hello2")
+ }
+
+ {
+ msgi, err := pubsub.ReceiveTimeout(time.Second)
+ c.Assert(err, IsNil)
+ subscr := msgi.(*redis.Subscription)
+ c.Assert(subscr.Kind, Equals, "unsubscribe")
+ c.Assert(subscr.Channel, Equals, "mychannel")
+ c.Assert(subscr.Count, Equals, 1)
+ }
+
+ {
+ msgi, err := pubsub.ReceiveTimeout(time.Second)
+ c.Assert(err, IsNil)
+ subscr := msgi.(*redis.Subscription)
+ c.Assert(subscr.Kind, Equals, "unsubscribe")
+ c.Assert(subscr.Channel, Equals, "mychannel2")
+ c.Assert(subscr.Count, Equals, 0)
+ }
+
+ {
+ msgi, err := pubsub.ReceiveTimeout(time.Second)
+ c.Assert(err.(net.Error).Timeout(), Equals, true)
+ c.Assert(msgi, IsNil)
+ }
+}
+
+func (t *RedisTest) TestPubSubChannels(c *C) {
+ channels, err := t.client.PubSubChannels("mychannel*").Result()
+ c.Assert(err, IsNil)
+ c.Assert(channels, HasLen, 0)
+ c.Assert(channels, Not(IsNil))
+
+ pubsub := t.client.PubSub()
+ defer pubsub.Close()
+
+ c.Assert(pubsub.Subscribe("mychannel", "mychannel2"), IsNil)
+
+ channels, err = t.client.PubSubChannels("mychannel*").Result()
+ c.Assert(err, IsNil)
+ c.Assert(sortStrings(channels), DeepEquals, []string{"mychannel", "mychannel2"})
+
+ channels, err = t.client.PubSubChannels("").Result()
+ c.Assert(err, IsNil)
+ c.Assert(channels, HasLen, 0)
+
+ channels, err = t.client.PubSubChannels("*").Result()
+ c.Assert(err, IsNil)
+ c.Assert(len(channels) >= 2, Equals, true)
+}
+
+func (t *RedisTest) TestPubSubNumSub(c *C) {
+ pubsub := t.client.PubSub()
+ defer pubsub.Close()
+
+ c.Assert(pubsub.Subscribe("mychannel", "mychannel2"), IsNil)
+
+ channels, err := t.client.PubSubNumSub("mychannel", "mychannel2", "mychannel3").Result()
+ c.Assert(err, IsNil)
+ c.Assert(
+ channels,
+ DeepEquals,
+ []interface{}{"mychannel", int64(1), "mychannel2", int64(1), "mychannel3", int64(0)},
+ )
+}
+
+func (t *RedisTest) TestPubSubNumPat(c *C) {
+ num, err := t.client.PubSubNumPat().Result()
+ c.Assert(err, IsNil)
+ c.Assert(num, Equals, int64(0))
+
+ pubsub := t.client.PubSub()
+ defer pubsub.Close()
+
+ c.Assert(pubsub.PSubscribe("mychannel*"), IsNil)
+
+ num, err = t.client.PubSubNumPat().Result()
+ c.Assert(err, IsNil)
+ c.Assert(num, Equals, int64(1))
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestPipeline(c *C) {
+ set := t.client.Set("key2", "hello2")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ pipeline := t.client.Pipeline()
+ defer func() {
+ c.Assert(pipeline.Close(), IsNil)
+ }()
+
+ set = pipeline.Set("key1", "hello1")
+ get := pipeline.Get("key2")
+ incr := pipeline.Incr("key3")
+ getNil := pipeline.Get("key4")
+
+ cmds, err := pipeline.Exec()
+ c.Assert(err, Equals, redis.Nil)
+ c.Assert(cmds, HasLen, 4)
+
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "hello2")
+
+ c.Assert(incr.Err(), IsNil)
+ c.Assert(incr.Val(), Equals, int64(1))
+
+ c.Assert(getNil.Err(), Equals, redis.Nil)
+ c.Assert(getNil.Val(), Equals, "")
+}
+
+func (t *RedisTest) TestPipelineDiscardQueued(c *C) {
+ pipeline := t.client.Pipeline()
+
+ pipeline.Get("key")
+ pipeline.Discard()
+ cmds, err := pipeline.Exec()
+ c.Assert(err, IsNil)
+ c.Assert(cmds, HasLen, 0)
+
+ c.Assert(pipeline.Close(), IsNil)
+}
+
+func (t *RedisTest) TestPipelined(c *C) {
+ var get *redis.StringCmd
+ cmds, err := t.client.Pipelined(func(pipe *redis.Pipeline) error {
+ get = pipe.Get("foo")
+ return nil
+ })
+ c.Assert(err, Equals, redis.Nil)
+ c.Assert(cmds, HasLen, 1)
+ c.Assert(cmds[0], Equals, get)
+ c.Assert(get.Err(), Equals, redis.Nil)
+ c.Assert(get.Val(), Equals, "")
+}
+
+func (t *RedisTest) TestPipelineErrValNotSet(c *C) {
+ pipeline := t.client.Pipeline()
+ defer func() {
+ c.Assert(pipeline.Close(), IsNil)
+ }()
+
+ get := pipeline.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "")
+}
+
+func (t *RedisTest) TestPipelineRunQueuedOnEmptyQueue(c *C) {
+ pipeline := t.client.Pipeline()
+ defer func() {
+ c.Assert(pipeline.Close(), IsNil)
+ }()
+
+ cmds, err := pipeline.Exec()
+ c.Assert(err, IsNil)
+ c.Assert(cmds, HasLen, 0)
+}
+
+// TODO: make thread safe?
+func (t *RedisTest) TestPipelineIncr(c *C) {
+ const N = 20000
+ key := "TestPipelineIncr"
+
+ pipeline := t.client.Pipeline()
+
+ wg := &sync.WaitGroup{}
+ wg.Add(N)
+ for i := 0; i < N; i++ {
+ pipeline.Incr(key)
+ wg.Done()
+ }
+ wg.Wait()
+
+ cmds, err := pipeline.Exec()
+ c.Assert(err, IsNil)
+ c.Assert(len(cmds), Equals, 20000)
+ for _, cmd := range cmds {
+ if cmd.Err() != nil {
+ c.Errorf("got %v, expected nil", cmd.Err())
+ }
+ }
+
+ get := t.client.Get(key)
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, strconv.Itoa(N))
+
+ c.Assert(pipeline.Close(), IsNil)
+}
+
+func (t *RedisTest) TestPipelineEcho(c *C) {
+ const N = 1000
+
+ wg := &sync.WaitGroup{}
+ wg.Add(N)
+ for i := 0; i < N; i++ {
+ go func(i int) {
+ pipeline := t.client.Pipeline()
+
+ msg1 := "echo" + strconv.Itoa(i)
+ msg2 := "echo" + strconv.Itoa(i+1)
+
+ echo1 := pipeline.Echo(msg1)
+ echo2 := pipeline.Echo(msg2)
+
+ cmds, err := pipeline.Exec()
+ c.Assert(err, IsNil)
+ c.Assert(cmds, HasLen, 2)
+
+ c.Assert(echo1.Err(), IsNil)
+ c.Assert(echo1.Val(), Equals, msg1)
+
+ c.Assert(echo2.Err(), IsNil)
+ c.Assert(echo2.Val(), Equals, msg2)
+
+ c.Assert(pipeline.Close(), IsNil)
+
+ wg.Done()
+ }(i)
+ }
+ wg.Wait()
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestMultiExec(c *C) {
+ multi := t.client.Multi()
+ defer func() {
+ c.Assert(multi.Close(), IsNil)
+ }()
+
+ var (
+ set *redis.StatusCmd
+ get *redis.StringCmd
+ )
+ cmds, err := multi.Exec(func() error {
+ set = multi.Set("key", "hello")
+ get = multi.Get("key")
+ return nil
+ })
+ c.Assert(err, IsNil)
+ c.Assert(cmds, HasLen, 2)
+
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "hello")
+}
+
+func (t *RedisTest) TestMultiExecDiscard(c *C) {
+ multi := t.client.Multi()
+ defer func() {
+ c.Assert(multi.Close(), IsNil)
+ }()
+
+ cmds, err := multi.Exec(func() error {
+ multi.Set("key1", "hello1")
+ multi.Discard()
+ multi.Set("key2", "hello2")
+ return nil
+ })
+ c.Assert(err, IsNil)
+ c.Assert(cmds, HasLen, 1)
+
+ get := t.client.Get("key1")
+ c.Assert(get.Err(), Equals, redis.Nil)
+ c.Assert(get.Val(), Equals, "")
+
+ get = t.client.Get("key2")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "hello2")
+}
+
+func (t *RedisTest) TestMultiExecEmpty(c *C) {
+ multi := t.client.Multi()
+ defer func() {
+ c.Assert(multi.Close(), IsNil)
+ }()
+
+ cmds, err := multi.Exec(func() error { return nil })
+ c.Assert(err, IsNil)
+ c.Assert(cmds, HasLen, 0)
+
+ ping := multi.Ping()
+ c.Check(ping.Err(), IsNil)
+ c.Check(ping.Val(), Equals, "PONG")
+}
+
+func (t *RedisTest) TestMultiExecOnEmptyQueue(c *C) {
+ multi := t.client.Multi()
+ defer func() {
+ c.Assert(multi.Close(), IsNil)
+ }()
+
+ cmds, err := multi.Exec(func() error { return nil })
+ c.Assert(err, IsNil)
+ c.Assert(cmds, HasLen, 0)
+}
+
+func (t *RedisTest) TestMultiExecIncr(c *C) {
+ multi := t.client.Multi()
+ defer func() {
+ c.Assert(multi.Close(), IsNil)
+ }()
+
+ cmds, err := multi.Exec(func() error {
+ for i := int64(0); i < 20000; i++ {
+ multi.Incr("key")
+ }
+ return nil
+ })
+ c.Assert(err, IsNil)
+ c.Assert(len(cmds), Equals, 20000)
+ for _, cmd := range cmds {
+ if cmd.Err() != nil {
+ c.Errorf("got %v, expected nil", cmd.Err())
+ }
+ }
+
+ get := t.client.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Equals, "20000")
+}
+
+func (t *RedisTest) transactionalIncr(c *C) ([]redis.Cmder, error) {
+ multi := t.client.Multi()
+ defer func() {
+ c.Assert(multi.Close(), IsNil)
+ }()
+
+ watch := multi.Watch("key")
+ c.Assert(watch.Err(), IsNil)
+ c.Assert(watch.Val(), Equals, "OK")
+
+ get := multi.Get("key")
+ c.Assert(get.Err(), IsNil)
+ c.Assert(get.Val(), Not(Equals), redis.Nil)
+
+ v, err := strconv.ParseInt(get.Val(), 10, 64)
+ c.Assert(err, IsNil)
+
+ return multi.Exec(func() error {
+ multi.Set("key", strconv.FormatInt(v+1, 10))
+ return nil
+ })
+}
+
+func (t *RedisTest) TestWatchUnwatch(c *C) {
+ var n = 10000
+ if testing.Short() {
+ n = 1000
+ }
+
+ set := t.client.Set("key", "0")
+ c.Assert(set.Err(), IsNil)
+
+ wg := &sync.WaitGroup{}
+ for i := 0; i < n; i++ {
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ for {
+ cmds, err := t.transactionalIncr(c)
+ if err == redis.TxFailedErr {
+ continue
+ }
+ c.Assert(err, IsNil)
+ c.Assert(cmds, HasLen, 1)
+ c.Assert(cmds[0].Err(), IsNil)
+ break
+ }
+ }()
+ }
+ wg.Wait()
+
+ val, err := t.client.Get("key").Int64()
+ c.Assert(err, IsNil)
+ c.Assert(val, Equals, int64(n))
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestRaceEcho(c *C) {
+ var n = 10000
+ if testing.Short() {
+ n = 1000
+ }
+
+ wg := &sync.WaitGroup{}
+ wg.Add(n)
+ for i := 0; i < n; i++ {
+ go func(i int) {
+ msg := "echo" + strconv.Itoa(i)
+ echo := t.client.Echo(msg)
+ c.Assert(echo.Err(), IsNil)
+ c.Assert(echo.Val(), Equals, msg)
+ wg.Done()
+ }(i)
+ }
+ wg.Wait()
+}
+
+func (t *RedisTest) TestRaceIncr(c *C) {
+ var n = 10000
+ if testing.Short() {
+ n = 1000
+ }
+
+ wg := &sync.WaitGroup{}
+ wg.Add(n)
+ for i := 0; i < n; i++ {
+ go func() {
+ incr := t.client.Incr("TestRaceIncr")
+ if err := incr.Err(); err != nil {
+ panic(err)
+ }
+ wg.Done()
+ }()
+ }
+ wg.Wait()
+
+ val, err := t.client.Get("TestRaceIncr").Result()
+ c.Assert(err, IsNil)
+ c.Assert(val, Equals, strconv.Itoa(n))
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestCmdBgRewriteAOF(c *C) {
+ r := t.client.BgRewriteAOF()
+ c.Assert(r.Err(), IsNil)
+ c.Assert(r.Val(), Equals, "Background append only file rewriting started")
+}
+
+func (t *RedisTest) TestCmdBgSave(c *C) {
+ // workaround for "ERR Can't BGSAVE while AOF log rewriting is in progress"
+ time.Sleep(time.Second)
+
+ r := t.client.BgSave()
+ c.Assert(r.Err(), IsNil)
+ c.Assert(r.Val(), Equals, "Background saving started")
+}
+
+func (t *RedisTest) TestCmdClientKill(c *C) {
+ r := t.client.ClientKill("1.1.1.1:1111")
+ c.Assert(r.Err(), ErrorMatches, "ERR No such client")
+ c.Assert(r.Val(), Equals, "")
+}
+
+func (t *RedisTest) TestCmdConfigGet(c *C) {
+ r := t.client.ConfigGet("*")
+ c.Assert(r.Err(), IsNil)
+ c.Assert(len(r.Val()) > 0, Equals, true)
+}
+
+func (t *RedisTest) TestCmdConfigResetStat(c *C) {
+ r := t.client.ConfigResetStat()
+ c.Assert(r.Err(), IsNil)
+ c.Assert(r.Val(), Equals, "OK")
+}
+
+func (t *RedisTest) TestCmdConfigSet(c *C) {
+ configGet := t.client.ConfigGet("maxmemory")
+ c.Assert(configGet.Err(), IsNil)
+ c.Assert(configGet.Val(), HasLen, 2)
+ c.Assert(configGet.Val()[0], Equals, "maxmemory")
+
+ configSet := t.client.ConfigSet("maxmemory", configGet.Val()[1].(string))
+ c.Assert(configSet.Err(), IsNil)
+ c.Assert(configSet.Val(), Equals, "OK")
+}
+
+func (t *RedisTest) TestCmdDbSize(c *C) {
+ dbSize := t.client.DbSize()
+ c.Assert(dbSize.Err(), IsNil)
+ c.Assert(dbSize.Val(), Equals, int64(0))
+}
+
+func (t *RedisTest) TestCmdFlushAll(c *C) {
+ // TODO
+}
+
+func (t *RedisTest) TestCmdFlushDb(c *C) {
+ // TODO
+}
+
+func (t *RedisTest) TestCmdInfo(c *C) {
+ info := t.client.Info()
+ c.Assert(info.Err(), IsNil)
+ c.Assert(info.Val(), Not(Equals), "")
+}
+
+func (t *RedisTest) TestCmdLastSave(c *C) {
+ lastSave := t.client.LastSave()
+ c.Assert(lastSave.Err(), IsNil)
+ c.Assert(lastSave.Val(), Not(Equals), 0)
+}
+
+func (t *RedisTest) TestCmdSave(c *C) {
+ save := t.client.Save()
+ c.Assert(save.Err(), IsNil)
+ c.Assert(save.Val(), Equals, "OK")
+}
+
+func (t *RedisTest) TestSlaveOf(c *C) {
+ slaveOf := t.client.SlaveOf("localhost", "8888")
+ c.Assert(slaveOf.Err(), IsNil)
+ c.Assert(slaveOf.Val(), Equals, "OK")
+
+ slaveOf = t.client.SlaveOf("NO", "ONE")
+ c.Assert(slaveOf.Err(), IsNil)
+ c.Assert(slaveOf.Val(), Equals, "OK")
+}
+
+func (t *RedisTest) TestTime(c *C) {
+ time := t.client.Time()
+ c.Assert(time.Err(), IsNil)
+ c.Assert(time.Val(), HasLen, 2)
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestScriptingEval(c *C) {
+ eval := t.client.Eval(
+ "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}",
+ []string{"key1", "key2"},
+ []string{"first", "second"},
+ )
+ c.Assert(eval.Err(), IsNil)
+ c.Assert(eval.Val(), DeepEquals, []interface{}{"key1", "key2", "first", "second"})
+
+ eval = t.client.Eval(
+ "return redis.call('set',KEYS[1],'bar')",
+ []string{"foo"},
+ []string{},
+ )
+ c.Assert(eval.Err(), IsNil)
+ c.Assert(eval.Val(), Equals, "OK")
+
+ eval = t.client.Eval("return 10", []string{}, []string{})
+ c.Assert(eval.Err(), IsNil)
+ c.Assert(eval.Val(), Equals, int64(10))
+
+ eval = t.client.Eval("return {1,2,{3,'Hello World!'}}", []string{}, []string{})
+ c.Assert(eval.Err(), IsNil)
+ // DeepEquals can't compare nested slices.
+ c.Assert(
+ fmt.Sprintf("%#v", eval.Val()),
+ Equals,
+ `[]interface {}{1, 2, []interface {}{3, "Hello World!"}}`,
+ )
+}
+
+func (t *RedisTest) TestScriptingEvalSha(c *C) {
+ set := t.client.Set("foo", "bar")
+ c.Assert(set.Err(), IsNil)
+ c.Assert(set.Val(), Equals, "OK")
+
+ eval := t.client.Eval("return redis.call('get','foo')", nil, nil)
+ c.Assert(eval.Err(), IsNil)
+ c.Assert(eval.Val(), Equals, "bar")
+
+ evalSha := t.client.EvalSha("6b1bf486c81ceb7edf3c093f4c48582e38c0e791", nil, nil)
+ c.Assert(evalSha.Err(), IsNil)
+ c.Assert(evalSha.Val(), Equals, "bar")
+
+ evalSha = t.client.EvalSha("ffffffffffffffffffffffffffffffffffffffff", nil, nil)
+ c.Assert(evalSha.Err(), ErrorMatches, "NOSCRIPT No matching script. Please use EVAL.")
+ c.Assert(evalSha.Val(), Equals, nil)
+}
+
+func (t *RedisTest) TestScriptingScriptExists(c *C) {
+ scriptLoad := t.client.ScriptLoad("return 1")
+ c.Assert(scriptLoad.Err(), IsNil)
+ c.Assert(scriptLoad.Val(), Equals, "e0e1f9fabfc9d4800c877a703b823ac0578ff8db")
+
+ scriptExists := t.client.ScriptExists(
+ "e0e1f9fabfc9d4800c877a703b823ac0578ff8db",
+ "ffffffffffffffffffffffffffffffffffffffff",
+ )
+ c.Assert(scriptExists.Err(), IsNil)
+ c.Assert(scriptExists.Val(), DeepEquals, []bool{true, false})
+}
+
+func (t *RedisTest) TestScriptingScriptFlush(c *C) {
+ scriptFlush := t.client.ScriptFlush()
+ c.Assert(scriptFlush.Err(), IsNil)
+ c.Assert(scriptFlush.Val(), Equals, "OK")
+}
+
+func (t *RedisTest) TestScriptingScriptKill(c *C) {
+ scriptKill := t.client.ScriptKill()
+ c.Assert(scriptKill.Err(), ErrorMatches, ".*No scripts in execution right now.")
+ c.Assert(scriptKill.Val(), Equals, "")
+}
+
+func (t *RedisTest) TestScriptingScriptLoad(c *C) {
+ scriptLoad := t.client.ScriptLoad("return redis.call('get','foo')")
+ c.Assert(scriptLoad.Err(), IsNil)
+ c.Assert(scriptLoad.Val(), Equals, "6b1bf486c81ceb7edf3c093f4c48582e38c0e791")
+}
+
+func (t *RedisTest) TestScriptingNewScript(c *C) {
+ s := redis.NewScript("return 1")
+ run := s.Run(t.client, nil, nil)
+ c.Assert(run.Err(), IsNil)
+ c.Assert(run.Val(), Equals, int64(1))
+}
+
+func (t *RedisTest) TestScriptingEvalAndPipeline(c *C) {
+ pipeline := t.client.Pipeline()
+ s := redis.NewScript("return 1")
+ run := s.Eval(pipeline, nil, nil)
+ _, err := pipeline.Exec()
+ c.Assert(err, IsNil)
+ c.Assert(run.Err(), IsNil)
+ c.Assert(run.Val(), Equals, int64(1))
+}
+
+func (t *RedisTest) TestScriptingEvalShaAndPipeline(c *C) {
+ s := redis.NewScript("return 1")
+ c.Assert(s.Load(t.client).Err(), IsNil)
+
+ pipeline := t.client.Pipeline()
+ run := s.Eval(pipeline, nil, nil)
+ _, err := pipeline.Exec()
+ c.Assert(err, IsNil)
+ c.Assert(run.Err(), IsNil)
+ c.Assert(run.Val(), Equals, int64(1))
+}
+
+//------------------------------------------------------------------------------
+
+func (t *RedisTest) TestCmdDebugObject(c *C) {
+ {
+ debug := t.client.DebugObject("foo")
+ c.Assert(debug.Err(), Not(IsNil))
+ c.Assert(debug.Err().Error(), Equals, "ERR no such key")
+ }
+
+ {
+ t.client.Set("foo", "bar")
+ debug := t.client.DebugObject("foo")
+ c.Assert(debug.Err(), IsNil)
+ c.Assert(debug.Val(), FitsTypeOf, "")
+ c.Assert(debug.Val(), Not(Equals), "")
+ }
+}
+
+//------------------------------------------------------------------------------
+
+func BenchmarkRedisPing(b *testing.B) {
+ b.StopTimer()
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+ b.StartTimer()
+
+ for i := 0; i < b.N; i++ {
+ if err := client.Ping().Err(); err != nil {
+ panic(err)
+ }
+ }
+}
+
+func BenchmarkRedisSet(b *testing.B) {
+ b.StopTimer()
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+ b.StartTimer()
+
+ for i := 0; i < b.N; i++ {
+ if err := client.Set("key", "hello").Err(); err != nil {
+ panic(err)
+ }
+ }
+}
+
+func BenchmarkRedisGetNil(b *testing.B) {
+ b.StopTimer()
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+ if err := client.FlushDb().Err(); err != nil {
+ b.Fatal(err)
+ }
+ b.StartTimer()
+
+ for i := 0; i < b.N; i++ {
+ if err := client.Get("key").Err(); err != redis.Nil {
+ b.Fatal(err)
+ }
+ }
+}
+
+func BenchmarkRedisGet(b *testing.B) {
+ b.StopTimer()
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+ if err := client.Set("key", "hello").Err(); err != nil {
+ b.Fatal(err)
+ }
+ b.StartTimer()
+
+ for i := 0; i < b.N; i++ {
+ if err := client.Get("key").Err(); err != nil {
+ b.Fatal(err)
+ }
+ }
+}
+
+func BenchmarkRedisMGet(b *testing.B) {
+ b.StopTimer()
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+ if err := client.MSet("key1", "hello1", "key2", "hello2").Err(); err != nil {
+ b.Fatal(err)
+ }
+ b.StartTimer()
+
+ for i := 0; i < b.N; i++ {
+ if err := client.MGet("key1", "key2").Err(); err != nil {
+ b.Fatal(err)
+ }
+ }
+}
+
+func BenchmarkSetExpire(b *testing.B) {
+ b.StopTimer()
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+ b.StartTimer()
+
+ for i := 0; i < b.N; i++ {
+ if err := client.Set("key", "hello").Err(); err != nil {
+ b.Fatal(err)
+ }
+ if err := client.Expire("key", time.Second).Err(); err != nil {
+ b.Fatal(err)
+ }
+ }
+}
+
+func BenchmarkPipeline(b *testing.B) {
+ b.StopTimer()
+ client := redis.NewTCPClient(&redis.Options{
+ Addr: redisAddr,
+ })
+ b.StartTimer()
+
+ for i := 0; i < b.N; i++ {
+ _, err := client.Pipelined(func(pipe *redis.Pipeline) error {
+ pipe.Set("key", "hello")
+ pipe.Expire("key", time.Second)
+ return nil
+ })
+ if err != nil {
+ b.Fatal(err)
+ }
+ }
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/script.go b/Godeps/_workspace/src/gopkg.in/redis.v2/script.go
new file mode 100644
index 00000000000..96c35f5149e
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/script.go
@@ -0,0 +1,52 @@
+package redis
+
+import (
+ "crypto/sha1"
+ "encoding/hex"
+ "io"
+ "strings"
+)
+
+type scripter interface {
+ Eval(script string, keys []string, args []string) *Cmd
+ EvalSha(sha1 string, keys []string, args []string) *Cmd
+ ScriptExists(scripts ...string) *BoolSliceCmd
+ ScriptLoad(script string) *StringCmd
+}
+
+type Script struct {
+ src, hash string
+}
+
+func NewScript(src string) *Script {
+ h := sha1.New()
+ io.WriteString(h, src)
+ return &Script{
+ src: src,
+ hash: hex.EncodeToString(h.Sum(nil)),
+ }
+}
+
+func (s *Script) Load(c scripter) *StringCmd {
+ return c.ScriptLoad(s.src)
+}
+
+func (s *Script) Exists(c scripter) *BoolSliceCmd {
+ return c.ScriptExists(s.src)
+}
+
+func (s *Script) Eval(c scripter, keys []string, args []string) *Cmd {
+ return c.Eval(s.src, keys, args)
+}
+
+func (s *Script) EvalSha(c scripter, keys []string, args []string) *Cmd {
+ return c.EvalSha(s.hash, keys, args)
+}
+
+func (s *Script) Run(c *Client, keys []string, args []string) *Cmd {
+ r := s.EvalSha(c, keys, args)
+ if err := r.Err(); err != nil && strings.HasPrefix(err.Error(), "NOSCRIPT ") {
+ return s.Eval(c, keys, args)
+ }
+ return r
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/sentinel.go b/Godeps/_workspace/src/gopkg.in/redis.v2/sentinel.go
new file mode 100644
index 00000000000..d3ffeca9a59
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/sentinel.go
@@ -0,0 +1,291 @@
+package redis
+
+import (
+ "errors"
+ "log"
+ "net"
+ "strings"
+ "sync"
+ "time"
+)
+
+//------------------------------------------------------------------------------
+
+type FailoverOptions struct {
+ MasterName string
+ SentinelAddrs []string
+
+ Password string
+ DB int64
+
+ PoolSize int
+
+ DialTimeout time.Duration
+ ReadTimeout time.Duration
+ WriteTimeout time.Duration
+ IdleTimeout time.Duration
+}
+
+func (opt *FailoverOptions) getPoolSize() int {
+ if opt.PoolSize == 0 {
+ return 10
+ }
+ return opt.PoolSize
+}
+
+func (opt *FailoverOptions) getDialTimeout() time.Duration {
+ if opt.DialTimeout == 0 {
+ return 5 * time.Second
+ }
+ return opt.DialTimeout
+}
+
+func (opt *FailoverOptions) options() *options {
+ return &options{
+ DB: opt.DB,
+ Password: opt.Password,
+
+ DialTimeout: opt.getDialTimeout(),
+ ReadTimeout: opt.ReadTimeout,
+ WriteTimeout: opt.WriteTimeout,
+
+ PoolSize: opt.getPoolSize(),
+ IdleTimeout: opt.IdleTimeout,
+ }
+}
+
+func NewFailoverClient(failoverOpt *FailoverOptions) *Client {
+ opt := failoverOpt.options()
+ failover := &sentinelFailover{
+ masterName: failoverOpt.MasterName,
+ sentinelAddrs: failoverOpt.SentinelAddrs,
+
+ opt: opt,
+ }
+ return &Client{
+ baseClient: &baseClient{
+ opt: opt,
+ connPool: failover.Pool(),
+ },
+ }
+}
+
+//------------------------------------------------------------------------------
+
+type sentinelClient struct {
+ *baseClient
+}
+
+func newSentinel(clOpt *Options) *sentinelClient {
+ opt := clOpt.options()
+ opt.Password = ""
+ opt.DB = 0
+ dialer := func() (net.Conn, error) {
+ return net.DialTimeout("tcp", clOpt.Addr, opt.DialTimeout)
+ }
+ return &sentinelClient{
+ baseClient: &baseClient{
+ opt: opt,
+ connPool: newConnPool(newConnFunc(dialer), opt),
+ },
+ }
+}
+
+func (c *sentinelClient) PubSub() *PubSub {
+ return &PubSub{
+ baseClient: &baseClient{
+ opt: c.opt,
+ connPool: newSingleConnPool(c.connPool, false),
+ },
+ }
+}
+
+func (c *sentinelClient) GetMasterAddrByName(name string) *StringSliceCmd {
+ cmd := NewStringSliceCmd("SENTINEL", "get-master-addr-by-name", name)
+ c.Process(cmd)
+ return cmd
+}
+
+func (c *sentinelClient) Sentinels(name string) *SliceCmd {
+ cmd := NewSliceCmd("SENTINEL", "sentinels", name)
+ c.Process(cmd)
+ return cmd
+}
+
+type sentinelFailover struct {
+ masterName string
+ sentinelAddrs []string
+
+ opt *options
+
+ pool pool
+ poolOnce sync.Once
+
+ lock sync.RWMutex
+ _sentinel *sentinelClient
+}
+
+func (d *sentinelFailover) dial() (net.Conn, error) {
+ addr, err := d.MasterAddr()
+ if err != nil {
+ return nil, err
+ }
+ return net.DialTimeout("tcp", addr, d.opt.DialTimeout)
+}
+
+func (d *sentinelFailover) Pool() pool {
+ d.poolOnce.Do(func() {
+ d.pool = newConnPool(newConnFunc(d.dial), d.opt)
+ })
+ return d.pool
+}
+
+func (d *sentinelFailover) MasterAddr() (string, error) {
+ defer d.lock.Unlock()
+ d.lock.Lock()
+
+ // Try last working sentinel.
+ if d._sentinel != nil {
+ addr, err := d._sentinel.GetMasterAddrByName(d.masterName).Result()
+ if err != nil {
+ log.Printf("redis-sentinel: GetMasterAddrByName %q failed: %s", d.masterName, err)
+ d.resetSentinel()
+ } else {
+ addr := net.JoinHostPort(addr[0], addr[1])
+ log.Printf("redis-sentinel: %q addr is %s", d.masterName, addr)
+ return addr, nil
+ }
+ }
+
+ for i, sentinelAddr := range d.sentinelAddrs {
+ sentinel := newSentinel(&Options{
+ Addr: sentinelAddr,
+
+ DB: d.opt.DB,
+ Password: d.opt.Password,
+
+ DialTimeout: d.opt.DialTimeout,
+ ReadTimeout: d.opt.ReadTimeout,
+ WriteTimeout: d.opt.WriteTimeout,
+
+ PoolSize: d.opt.PoolSize,
+ IdleTimeout: d.opt.IdleTimeout,
+ })
+ masterAddr, err := sentinel.GetMasterAddrByName(d.masterName).Result()
+ if err != nil {
+ log.Printf("redis-sentinel: GetMasterAddrByName %q failed: %s", d.masterName, err)
+ sentinel.Close()
+ continue
+ }
+
+ // Push working sentinel to the top.
+ d.sentinelAddrs[0], d.sentinelAddrs[i] = d.sentinelAddrs[i], d.sentinelAddrs[0]
+
+ d.setSentinel(sentinel)
+ addr := net.JoinHostPort(masterAddr[0], masterAddr[1])
+ log.Printf("redis-sentinel: %q addr is %s", d.masterName, addr)
+ return addr, nil
+ }
+
+ return "", errors.New("redis: all sentinels are unreachable")
+}
+
+func (d *sentinelFailover) setSentinel(sentinel *sentinelClient) {
+ d.discoverSentinels(sentinel)
+ d._sentinel = sentinel
+ go d.listen()
+}
+
+func (d *sentinelFailover) discoverSentinels(sentinel *sentinelClient) {
+ sentinels, err := sentinel.Sentinels(d.masterName).Result()
+ if err != nil {
+ log.Printf("redis-sentinel: Sentinels %q failed: %s", d.masterName, err)
+ return
+ }
+ for _, sentinel := range sentinels {
+ vals := sentinel.([]interface{})
+ for i := 0; i < len(vals); i += 2 {
+ key := vals[i].(string)
+ if key == "name" {
+ sentinelAddr := vals[i+1].(string)
+ if !contains(d.sentinelAddrs, sentinelAddr) {
+ log.Printf(
+ "redis-sentinel: discovered new %q sentinel: %s",
+ d.masterName, sentinelAddr,
+ )
+ d.sentinelAddrs = append(d.sentinelAddrs, sentinelAddr)
+ }
+ }
+ }
+ }
+}
+
+func (d *sentinelFailover) listen() {
+ var pubsub *PubSub
+ for {
+ if pubsub == nil {
+ pubsub = d._sentinel.PubSub()
+ if err := pubsub.Subscribe("+switch-master"); err != nil {
+ log.Printf("redis-sentinel: Subscribe failed: %s", err)
+ d.lock.Lock()
+ d.resetSentinel()
+ d.lock.Unlock()
+ return
+ }
+ }
+
+ msgIface, err := pubsub.Receive()
+ if err != nil {
+ log.Printf("redis-sentinel: Receive failed: %s", err)
+ pubsub.Close()
+ return
+ }
+
+ switch msg := msgIface.(type) {
+ case *Message:
+ switch msg.Channel {
+ case "+switch-master":
+ parts := strings.Split(msg.Payload, " ")
+ if parts[0] != d.masterName {
+ log.Printf("redis-sentinel: ignore new %s addr", parts[0])
+ continue
+ }
+ addr := net.JoinHostPort(parts[3], parts[4])
+ log.Printf(
+ "redis-sentinel: new %q addr is %s",
+ d.masterName, addr,
+ )
+ d.pool.Filter(func(cn *conn) bool {
+ if cn.RemoteAddr().String() != addr {
+ log.Printf(
+ "redis-sentinel: closing connection to old master %s",
+ cn.RemoteAddr(),
+ )
+ return false
+ }
+ return true
+ })
+ default:
+ log.Printf("redis-sentinel: unsupported message: %s", msg)
+ }
+ case *Subscription:
+ // Ignore.
+ default:
+ log.Printf("redis-sentinel: unsupported message: %s", msgIface)
+ }
+ }
+}
+
+func (d *sentinelFailover) resetSentinel() {
+ d._sentinel.Close()
+ d._sentinel = nil
+}
+
+func contains(slice []string, str string) bool {
+ for _, s := range slice {
+ if s == str {
+ return true
+ }
+ }
+ return false
+}
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/sentinel_test.go b/Godeps/_workspace/src/gopkg.in/redis.v2/sentinel_test.go
new file mode 100644
index 00000000000..ede59bd51e2
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/sentinel_test.go
@@ -0,0 +1,185 @@
+package redis_test
+
+import (
+ "io/ioutil"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "testing"
+ "text/template"
+ "time"
+
+ "gopkg.in/redis.v2"
+)
+
+func startRedis(port string) (*exec.Cmd, error) {
+ cmd := exec.Command("redis-server", "--port", port)
+ if false {
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ }
+ if err := cmd.Start(); err != nil {
+ return nil, err
+ }
+ return cmd, nil
+}
+
+func startRedisSlave(port, slave string) (*exec.Cmd, error) {
+ cmd := exec.Command("redis-server", "--port", port, "--slaveof", "127.0.0.1", slave)
+ if false {
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ }
+ if err := cmd.Start(); err != nil {
+ return nil, err
+ }
+ return cmd, nil
+}
+
+func startRedisSentinel(port, masterName, masterPort string) (*exec.Cmd, error) {
+ dir, err := ioutil.TempDir("", "sentinel")
+ if err != nil {
+ return nil, err
+ }
+
+ sentinelConfFilepath := filepath.Join(dir, "sentinel.conf")
+ tpl, err := template.New("sentinel.conf").Parse(sentinelConf)
+ if err != nil {
+ return nil, err
+ }
+
+ data := struct {
+ Port string
+ MasterName string
+ MasterPort string
+ }{
+ Port: port,
+ MasterName: masterName,
+ MasterPort: masterPort,
+ }
+ if err := writeTemplateToFile(sentinelConfFilepath, tpl, data); err != nil {
+ return nil, err
+ }
+
+ cmd := exec.Command("redis-server", sentinelConfFilepath, "--sentinel")
+ if true {
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ }
+ if err := cmd.Start(); err != nil {
+ return nil, err
+ }
+
+ return cmd, nil
+}
+
+func writeTemplateToFile(path string, t *template.Template, data interface{}) error {
+ f, err := os.Create(path)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ return t.Execute(f, data)
+}
+
+func TestSentinel(t *testing.T) {
+ masterName := "mymaster"
+ masterPort := "8123"
+ slavePort := "8124"
+ sentinelPort := "8125"
+
+ masterCmd, err := startRedis(masterPort)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer masterCmd.Process.Kill()
+
+ // Wait for master to start.
+ time.Sleep(200 * time.Millisecond)
+
+ master := redis.NewTCPClient(&redis.Options{
+ Addr: ":" + masterPort,
+ })
+ if err := master.Ping().Err(); err != nil {
+ t.Fatal(err)
+ }
+
+ slaveCmd, err := startRedisSlave(slavePort, masterPort)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer slaveCmd.Process.Kill()
+
+ // Wait for slave to start.
+ time.Sleep(200 * time.Millisecond)
+
+ slave := redis.NewTCPClient(&redis.Options{
+ Addr: ":" + slavePort,
+ })
+ if err := slave.Ping().Err(); err != nil {
+ t.Fatal(err)
+ }
+
+ sentinelCmd, err := startRedisSentinel(sentinelPort, masterName, masterPort)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer sentinelCmd.Process.Kill()
+
+ // Wait for sentinel to start.
+ time.Sleep(200 * time.Millisecond)
+
+ sentinel := redis.NewTCPClient(&redis.Options{
+ Addr: ":" + sentinelPort,
+ })
+ if err := sentinel.Ping().Err(); err != nil {
+ t.Fatal(err)
+ }
+ defer sentinel.Shutdown()
+
+ client := redis.NewFailoverClient(&redis.FailoverOptions{
+ MasterName: masterName,
+ SentinelAddrs: []string{":" + sentinelPort},
+ })
+
+ if err := client.Set("foo", "master").Err(); err != nil {
+ t.Fatal(err)
+ }
+
+ val, err := master.Get("foo").Result()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if val != "master" {
+ t.Fatalf(`got %q, expected "master"`, val)
+ }
+
+ // Kill Redis master.
+ if err := masterCmd.Process.Kill(); err != nil {
+ t.Fatal(err)
+ }
+ if err := master.Ping().Err(); err == nil {
+ t.Fatalf("master was not killed")
+ }
+
+ // Wait for Redis sentinel to elect new master.
+ time.Sleep(5 * time.Second)
+
+ // Check that client picked up new master.
+ val, err = client.Get("foo").Result()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if val != "master" {
+ t.Fatalf(`got %q, expected "master"`, val)
+ }
+}
+
+var sentinelConf = `
+port {{ .Port }}
+
+sentinel monitor {{ .MasterName }} 127.0.0.1 {{ .MasterPort }} 1
+sentinel down-after-milliseconds {{ .MasterName }} 1000
+sentinel failover-timeout {{ .MasterName }} 2000
+sentinel parallel-syncs {{ .MasterName }} 1
+`
diff --git a/Godeps/_workspace/src/gopkg.in/redis.v2/testdata/sentinel.conf b/Godeps/_workspace/src/gopkg.in/redis.v2/testdata/sentinel.conf
new file mode 100644
index 00000000000..3da90b380f7
--- /dev/null
+++ b/Godeps/_workspace/src/gopkg.in/redis.v2/testdata/sentinel.conf
@@ -0,0 +1,6 @@
+port 26379
+
+sentinel monitor master 127.0.0.1 6379 1
+sentinel down-after-milliseconds master 2000
+sentinel failover-timeout master 5000
+sentinel parallel-syncs master 4
diff --git a/pkg/cmd/web.go b/pkg/cmd/web.go
index 8d7697b9871..1b6e9078f61 100644
--- a/pkg/cmd/web.go
+++ b/pkg/cmd/web.go
@@ -17,6 +17,7 @@ import (
"github.com/macaron-contrib/session"
_ "github.com/macaron-contrib/session/mysql"
_ "github.com/macaron-contrib/session/postgres"
+ _ "github.com/macaron-contrib/session/redis"
"github.com/grafana/grafana/pkg/api"
"github.com/grafana/grafana/pkg/api/static"
diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go
index 87d943cdd5c..24701c48d75 100644
--- a/pkg/setting/setting.go
+++ b/pkg/setting/setting.go
@@ -246,7 +246,7 @@ func NewConfigContext(config string) {
func readSessionConfig() {
sec := Cfg.Section("session")
SessionOptions = session.Options{}
- SessionOptions.Provider = sec.Key("provider").In("memory", []string{"memory", "file", "redis", "mysql"})
+ SessionOptions.Provider = sec.Key("provider").In("memory", []string{"memory", "file", "redis", "mysql", "postgres"})
SessionOptions.ProviderConfig = strings.Trim(sec.Key("provider_config").String(), "\" ")
SessionOptions.CookieName = sec.Key("cookie_name").MustString("grafana_sess")
SessionOptions.CookiePath = AppSubUrl
From 1f330d77534c403af7c3d579eaf47e69a6f1bb8b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Wed, 1 Apr 2015 15:23:26 +0200
Subject: [PATCH 031/181] Basic auth: Fixed issue when using basic auth proxy
infront of Grafana, Fixes #1673
---
CHANGELOG.md | 1 +
pkg/middleware/auth.go | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 165f7b40253..1c99d6efef3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@
- [Issue #1681](https://github.com/grafana/grafana/issues/1681). MySQL session: fixed problem using mysql as session store
- [Issue #1671](https://github.com/grafana/grafana/issues/1671). Data sources: Fixed issue with changing default data source (should not require full page load to take effect, now fixed)
- [Issue #1685](https://github.com/grafana/grafana/issues/1685). Search: Dashboard results should be sorted alphabetically
+- [Issue #1673](https://github.com/grafana/grafana/issues/1673). Basic auth: Fixed issue when using basic auth proxy infront of Grafana
# 2.0.0-Beta1 (2015-03-30)
diff --git a/pkg/middleware/auth.go b/pkg/middleware/auth.go
index 3d73b15c7f3..9fb09a5c395 100644
--- a/pkg/middleware/auth.go
+++ b/pkg/middleware/auth.go
@@ -28,7 +28,7 @@ func getRequestUserId(c *Context) int64 {
func getApiKey(c *Context) string {
header := c.Req.Header.Get("Authorization")
parts := strings.SplitN(header, " ", 2)
- if len(parts) == 2 || parts[0] == "Bearer" {
+ if len(parts) == 2 && parts[0] == "Bearer" {
key := parts[1]
return key
}
From 36110d097774d4db1dc6e5c8895b390d759e8673 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Wed, 1 Apr 2015 15:56:39 +0200
Subject: [PATCH 032/181] Updated migration docs
---
docs/sources/installation/migrating_to2.md | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/docs/sources/installation/migrating_to2.md b/docs/sources/installation/migrating_to2.md
index 6e561bc0424..b3d4dab62ce 100644
--- a/docs/sources/installation/migrating_to2.md
+++ b/docs/sources/installation/migrating_to2.md
@@ -8,9 +8,9 @@ page_keywords: grafana, installation, migration, documentation
Grafana 2.0 represents a major update to Grafana. It brings new capabilities, many of which are enabled by its new backend server and integrated database.
-The new backend lays a solid foundation that we hope to build on over the coming months. For the 2.0 release, it enables authentication as well as server-side sharing and rendering.
+The new backend lays a solid foundation that we hope to build on over the coming months. For the 2.0 release, it enables authentication as well as server-side sharing and rendering.
-We've attempted to provide a smooth migration path for V1.9 users to migrate to Grafana 2.0.
+We've attempted to provide a smooth migration path for V1.9 users to migrate to Grafana 2.0.
## Adding Data sources
@@ -18,9 +18,12 @@ The config.js file has been deprecated. Data sources are now managed via the UI
From here, you can add any Graphite, InfluxDB, elasticsearch, and OpenTSDB datasources that you were using with Grafana 1.x. Grafana 2.0 can be configured to communicate with your datasource using a backend mode which can eliminate many CORS-related issues, as well as provide more secure authentication to your datasources.
+> *Note* When you add your data sources please name them exacly as you named them in config.js in Grafana 1.x. That name is referenced by panels
+> , annotation and template queries. That way when you import your old dashboard they will work without any changes.
+
## Importing your existing dashboards
-Grafana 2.0 now has integrated dashboard storage engine that can be configured to use an internal sqlite database, MySQL, or Postgres. This eliminates the need to use Elasticsearch for dashboard storage for Graphite users. Grafana 2.0 does not support storing dashboards in InfluxDB.
+Grafana 2.0 now has integrated dashboard storage engine that can be configured to use an internal sqlite database, MySQL, or Postgres. This eliminates the need to use Elasticsearch for dashboard storage for Graphite users. Grafana 2.0 does not support storing dashboards in InfluxDB.
You can seamlessly import your existing dashboards.
@@ -47,7 +50,7 @@ and click the `Import` button.

-Your dashboards should be automatically imported into the Grafana 2.0 backend.
+Your dashboards should be automatically imported into the Grafana 2.0 backend.
Dashboards will no longer be stored in your previous elasticsearch or InfluxDB databases.
From a96e4a343c2853eb371e0a808d6d0464eb860387 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Wed, 1 Apr 2015 16:05:42 +0200
Subject: [PATCH 033/181] Only create admin user specified in config file when
there are no users in the database, Fixes #1680
---
pkg/services/sqlstore/sqlstore.go | 37 ++++++++++++++++++-------------
1 file changed, 21 insertions(+), 16 deletions(-)
diff --git a/pkg/services/sqlstore/sqlstore.go b/pkg/services/sqlstore/sqlstore.go
index 757953f5b4e..609a4d9fb9e 100644
--- a/pkg/services/sqlstore/sqlstore.go
+++ b/pkg/services/sqlstore/sqlstore.go
@@ -33,24 +33,29 @@ var (
)
func EnsureAdminUser() {
- adminQuery := m.GetUserByLoginQuery{LoginOrEmail: setting.AdminUser}
+ statsQuery := m.GetSystemStatsQuery{}
- if err := bus.Dispatch(&adminQuery); err == m.ErrUserNotFound {
- cmd := m.CreateUserCommand{}
- cmd.Login = setting.AdminUser
- cmd.Email = setting.AdminUser + "@localhost"
- cmd.Password = setting.AdminPassword
- cmd.IsAdmin = true
-
- if err = bus.Dispatch(&cmd); err != nil {
- log.Error(3, "Failed to create default admin user", err)
- return
- }
-
- log.Info("Created default admin user: %v", setting.AdminUser)
- } else if err != nil {
- log.Error(3, "Could not determine if admin user exists: %v", err)
+ if err := bus.Dispatch(&statsQuery); err != nil {
+ log.Fatal(3, "Could not determine if admin user exists: %v", err)
+ return
}
+
+ if statsQuery.Result.UserCount > 0 {
+ return
+ }
+
+ cmd := m.CreateUserCommand{}
+ cmd.Login = setting.AdminUser
+ cmd.Email = setting.AdminUser + "@localhost"
+ cmd.Password = setting.AdminPassword
+ cmd.IsAdmin = true
+
+ if err := bus.Dispatch(&cmd); err != nil {
+ log.Error(3, "Failed to create default admin user", err)
+ return
+ }
+
+ log.Info("Created default admin user: %v", setting.AdminUser)
}
func NewEngine() {
From fde5ba85a015c0be0dbcfb42631294447fe74faa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Wed, 1 Apr 2015 17:24:08 +0200
Subject: [PATCH 034/181] Docs: Updated configuration docs with port 80 tips
---
docs/sources/installation/configuration.md | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/docs/sources/installation/configuration.md b/docs/sources/installation/configuration.md
index b1bf879cc1d..7d30f61dce5 100644
--- a/docs/sources/installation/configuration.md
+++ b/docs/sources/installation/configuration.md
@@ -42,7 +42,16 @@ Then you can override that using:
The ip address to bind to, if empty will bind to all interfaces
### http_port
-The port to bind to, defaults to `3000`
+The port to bind to, defaults to `3000`. To use port 80 you need to either give the grafana binary permission for example:
+
+```
+$ sudo setcap 'cap_net_bind_service=+ep' /opt/grafana/current/grafana
+```
+
+Or redirect port 80 to the grafana port using:
+```
+$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
+```
### domain
This setting is only used in as a part of the root_url setting (see below). Important if you
From 00fa7f5e86c76e8c8704d75f8fcbb76175bb9892 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Thu, 2 Apr 2015 07:51:16 +0200
Subject: [PATCH 035/181] Removed unusued config, updated sample config with
session config
---
conf/defaults.ini | 4 ----
conf/sample.ini | 16 ++++++++++++++++
2 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/conf/defaults.ini b/conf/defaults.ini
index d328733abc9..ff159dc8531 100644
--- a/conf/defaults.ini
+++ b/conf/defaults.ini
@@ -57,10 +57,6 @@ cookie_name = grafana_sess
cookie_secure = false
; Session life time, default is 86400
session_life_time = 86400
-; session id hash func, Either "sha1", "sha256" or "md5" default is sha1
-session_id_hashfunc = sha1
-; Session hash key, default is use random string
-session_id_hashkey =
[security]
; default admin user, created on startup
diff --git a/conf/sample.ini b/conf/sample.ini
index 3d4f6cf8e57..e33938dbef7 100644
--- a/conf/sample.ini
+++ b/conf/sample.ini
@@ -42,6 +42,22 @@ ssl_mode = disable
; For "sqlite3" only
path = /opt/grafana/data/grafana.db
+[session]
+; Either "memory", "file", "redis", "mysql", default is "memory"
+provider = file
+; Provider config options
+; memory: not have any config yet
+; file: session file path, e.g. `data/sessions`
+; redis: config like redis server addr, poolSize, password, e.g. `127.0.0.1:6379,100,grafana`
+; mysql: go-sql-driver/mysql dsn config string, e.g. `user:password@tcp(127.0.0.1)/database_name`
+provider_config = /opt/grafana/data/sessions
+; Session cookie name
+cookie_name = grafana_sess
+; If you use session in https only, default is false
+cookie_secure = false
+; Session life time, default is 86400
+session_life_time = 86400
+
[security]
; default admin user, created on startup
admin_user = admin
From 3b737999d6fc92662527a74f7eed44ba5edc4819 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Thu, 2 Apr 2015 08:08:22 +0200
Subject: [PATCH 036/181] Unsaved changes: Do not show for users with role ,
Fixes #1703
---
CHANGELOG.md | 1 +
public/app/features/dashboard/unsavedChangesSrv.js | 12 ++++++++----
public/views/index.html | 4 ----
3 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1c99d6efef3..fdd384626dd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
# 2.0.0-RC1 (unreleased)
**FIxes**
+- [Issue #1703](https://github.com/grafana/grafana/issues/1703). Unsaved changes: Do not show for users with role `Viewer`
- [Issue #1675](https://github.com/grafana/grafana/issues/1675). Data source proxy: Fixed issue with Gzip enabled and data source proxy
- [Issue #1681](https://github.com/grafana/grafana/issues/1681). MySQL session: fixed problem using mysql as session store
- [Issue #1671](https://github.com/grafana/grafana/issues/1671). Data sources: Fixed issue with changing default data source (should not require full page load to take effect, now fixed)
diff --git a/public/app/features/dashboard/unsavedChangesSrv.js b/public/app/features/dashboard/unsavedChangesSrv.js
index 0e8f6b34e0d..ab933094799 100644
--- a/public/app/features/dashboard/unsavedChangesSrv.js
+++ b/public/app/features/dashboard/unsavedChangesSrv.js
@@ -12,7 +12,7 @@ function(angular, _, config) {
var module = angular.module('grafana.services');
- module.service('unsavedChangesSrv', function($rootScope, $modal, $q, $location, $timeout) {
+ module.service('unsavedChangesSrv', function($rootScope, $modal, $q, $location, $timeout, contextSrv) {
var self = this;
var modalScope = $rootScope.$new();
@@ -36,7 +36,11 @@ function(angular, _, config) {
self.originalPath = $location.path();
});
+ this.ignoreChangeCheck = function() {
+ };
+
window.onbeforeunload = function() {
+ if (contextSrv.hasRole('Viewer')) { return true; }
if (self.has_unsaved_changes()) {
return "There are unsaved changes to this dashboard";
}
@@ -44,9 +48,9 @@ function(angular, _, config) {
this.init = function() {
$rootScope.$on("$locationChangeStart", function(event, next) {
- if (self.originalPath === $location.path()) {
- return;
- }
+ // check if we should look for changes
+ if (self.originalPath === $location.path()) { return true; }
+ if (contextSrv.hasRole('Viewer')) { return true; }
if (self.has_unsaved_changes()) {
event.preventDefault();
diff --git a/public/views/index.html b/public/views/index.html
index 29a31d1eda3..d5dfab06a64 100644
--- a/public/views/index.html
+++ b/public/views/index.html
@@ -16,10 +16,6 @@
-
-
From e6492f7db9bd7332046118ccfd12eb2f31ac9756 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Torkel=20=C3=96degaard?=
Date: Thu, 2 Apr 2015 09:21:38 +0200
Subject: [PATCH 037/181] Share modal: Override UI theme via URL param for
Share link, rendered panel, or embedded panel, Closes #1701
---
CHANGELOG.md | 3 +
docs/sources/guides/whats-new-in-v2.md | 2 +-
pkg/api/index.go | 5 ++
.../dashboard/partials/shareModal.html | 81 ++++++++++++++-----
.../app/features/dashboard/shareModalCtrl.js | 8 +-
public/css/bootstrap.dark.min.css | 2 +-
public/css/bootstrap.light.min.css | 2 +-
public/css/grafana.dark.min.css | 2 +-
public/css/grafana.light.min.css | 2 +-
public/css/less/grafana.less | 17 ++--
public/test/specs/shareModalCtrl-specs.js | 14 +++-
11 files changed, 104 insertions(+), 34 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fdd384626dd..96a7f7ce0c1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,8 @@
# 2.0.0-RC1 (unreleased)
+**Enhancements**
+- [Issue #1701](https://github.com/grafana/grafana/issues/1701). Share modal: Override UI theme via URL param for Share link, rendered panel, or embedded panel
+
**FIxes**
- [Issue #1703](https://github.com/grafana/grafana/issues/1703). Unsaved changes: Do not show for users with role `Viewer`
- [Issue #1675](https://github.com/grafana/grafana/issues/1675). Data source proxy: Fixed issue with Gzip enabled and data source proxy
diff --git a/docs/sources/guides/whats-new-in-v2.md b/docs/sources/guides/whats-new-in-v2.md
index fc40506ef36..ed27cd9af42 100644
--- a/docs/sources/guides/whats-new-in-v2.md
+++ b/docs/sources/guides/whats-new-in-v2.md
@@ -68,7 +68,7 @@ You can embed a single panel on another web page using the panel share dialog. B
with a graph panel (taken from dashoard snapshot at [snapshot.raintank.io](http://snapshot.raintank.io). Try
hovering or zooming on the panel below!
-
+
## New dashboard top header
diff --git a/pkg/api/index.go b/pkg/api/index.go
index ceafc37b7c1..d9ecf65b699 100644
--- a/pkg/api/index.go
+++ b/pkg/api/index.go
@@ -28,6 +28,11 @@ func setIndexViewData(c *middleware.Context) error {
currentUser.Name = currentUser.Login
}
+ themeUrlParam := c.Query("theme")
+ if themeUrlParam == "light" {
+ currentUser.LightTheme = true
+ }
+
c.Data["User"] = currentUser
c.Data["Settings"] = settings
c.Data["AppUrl"] = setting.AppUrl
diff --git a/public/app/features/dashboard/partials/shareModal.html b/public/app/features/dashboard/partials/shareModal.html
index 6b9ff8aef16..75af7ee4c22 100644
--- a/public/app/features/dashboard/partials/shareModal.html
+++ b/public/app/features/dashboard/partials/shareModal.html
@@ -16,19 +16,25 @@
+
+