summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTommy Carpenter <tommy@research.att.com>2017-09-25 16:28:17 -0400
committerTommy Carpenter <tommy@research.att.com>2017-09-25 16:29:11 -0400
commit4d68a25267d0173b13e6238d76274dc874967872 (patch)
tree5a79bdd8b8c58f548a43ec6e6f1a3fbb6169b462
parentaebd63152eec0fc8eff7b8757330c27a90849f49 (diff)
Greatly increase unit tests
Issue-ID: DCAEGEN2-99 Change-Id: I03b62d8a54b8a6eb443f5ce648a92ff1f9953ade Signed-off-by: Tommy Carpenter <tommy@research.att.com>
-rw-r--r--Changelog.md3
-rw-r--r--rebar.config11
-rw-r--r--src/cdap_interface.erl121
-rw-r--r--src/cdap_interface_tests.erl160
-rw-r--r--src/cdapbroker.app.src2
-rw-r--r--src/httpabs.erl12
-rw-r--r--src/httpabs_tests.erl9
-rw-r--r--src/util.erl12
-rw-r--r--src/util_tests.erl60
-rw-r--r--swagger/swagger.html1899
-rw-r--r--swagger/swagger.json560
-rw-r--r--swagger/swagger.yaml2
12 files changed, 304 insertions, 2547 deletions
diff --git a/Changelog.md b/Changelog.md
index c0631f3..393f1ba 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
+## [4.0.8] - Sep 25 2017
+* Greatly increase unit tests, at 27% now
+
## [4.0.7] - Sep 12 2017
* Further unit testing
* Update dependency to a Leptus PR that fixes the CORS port issue
diff --git a/rebar.config b/rebar.config
index 34b28a6..91ed457 100644
--- a/rebar.config
+++ b/rebar.config
@@ -1,6 +1,6 @@
{relx, [
{release,
- {cdapbroker,"4.0.7"},
+ {cdapbroker,"4.0.8"},
[cdapbroker]
},
%{extend_start_script,true},
@@ -67,6 +67,15 @@
{cover_enabled, true}.
{cover_export_enabled, true}.
{cover_opts, [verbose]}.
+{cover_excl_mods, [cdap_interface_tests,
+ resource_handler_tests,
+ workflows_tests,
+ httpabs_tests,
+ util_tests,
+ %sup is out of the box OTP
+ cdapbroker_sup
+ ]}.
+
%% EUnit options
{eunit_compile_opts, [debug_info, export_all]}.
diff --git a/src/cdap_interface.erl b/src/cdap_interface.erl
index 7ce3b37..a1b0982 100644
--- a/src/cdap_interface.erl
+++ b/src/cdap_interface.erl
@@ -6,9 +6,9 @@
% 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.
@@ -19,12 +19,12 @@
% ECOMP is a trademark and service mark of AT&T Intellectual Property.
-module(cdap_interface).
--export([get_app_metrics/4,
- get_app_healthcheck/4,
- push_down_config/5,
- form_service_json_from_service_tuple/4,
- form_stream_url_from_streamname/3,
- exec_programs/6,
+-export([get_app_metrics/4,
+ get_app_healthcheck/4,
+ push_down_config/5,
+ form_service_json_from_service_tuple/4,
+ form_stream_url_from_streamname/3,
+ exec_programs/6,
push_down_program_preferences/5,
push_down_app_preferences/5,
deploy_app/8,
@@ -53,15 +53,15 @@
%%%INTERNAL
%%%
map_appname(Appname) ->
- %CDAP APIs do not allow app names with any special characters. Here we will map the
+ %CDAP APIs do not allow app names with any special characters. Here we will map the
%name to ensure it does not contain special characters using a regex whitelist
%see http://stackoverflow.com/questions/3303420/regex-to-remove-all-special-characters-from-string
re:replace(Appname, "[^0-9a-zA-Z]+", "", [{return, binary}, global]).
-get_metrics_list_for_app(XER, Appname, Namespace, CDAPURL) ->
+get_metrics_list_for_app(XER, Appname, Namespace, CDAPURL) ->
URL = ?SC([CDAPURL, "/v3/metrics/search?target=metric&tag=namespace:", Namespace, "&tag=app:", map_appname(Appname)]),
- {ReturnCode, RetBody} = httpabs:post(XER, URL, "application/json", ""),
- case ReturnCode of
+ {ReturnCode, RetBody} = httpabs:post(XER, URL, "application/json", ""),
+ case ReturnCode of
200 -> [ X || X <- jiffy:decode(RetBody),binary:match(X, <<"user.">>) /= nomatch];
_ -> 504 %must bubble this up
end.
@@ -71,7 +71,7 @@ get_app_healthcheck_program(XER, Appname, Namespace, CDAPURL, P) ->
%helper function: checks for a partocular program from an app
URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/apps/", map_appname(Appname), "/", P#program.type, "/", P#program.id]),
{RC, _} = httpabs:get(XER, URL),
- case RC of
+ case RC of
200 ->
%Next make sure it's status is running
{RC2, RB2} = httpabs:get(XER, ?SC([URL, "/status"])),
@@ -80,9 +80,9 @@ get_app_healthcheck_program(XER, Appname, Namespace, CDAPURL, P) ->
S = jiffy:decode(RB2, [return_maps]),
case maps:is_key(<<"status">>, S) andalso maps:get(<<"status">>, S) == <<"RUNNING">> of
true -> 200; %return 200
- false -> ?BAD_HEALTH_CODE %return
- end;
- _ -> ?BAD_HEALTH_CODE
+ false -> ?BAD_HEALTH_CODE %return
+ end;
+ _ -> ?BAD_HEALTH_CODE
end;
_ -> ?BAD_HEALTH_CODE
end.
@@ -99,41 +99,41 @@ push_down_program_preference(XER, Appname, Namespace, CDAPURL, {PT, PI, PP}) ->
deploy_pipeline_dependency(XER, Namespace, CDAPURL, {ArtExtendsHeader, ArtName, ArtVerHeader, ArtURL, _}) ->
%deploys a single dependency
- %TODO! I should really be using Erlang records more and not relying on positional arguments so much. For example, I could add a record that represents a Dependency instead of using a positionally-based tuple.
+ %TODO! I should really be using Erlang records more and not relying on positional arguments so much. For example, I could add a record that represents a Dependency instead of using a positionally-based tuple.
{200, JarBody} = httpabs:get(XER, ArtURL),
Headers = [{"Artifact-Extends", ArtExtendsHeader}, {"Artifact-Version", ArtVerHeader}],
- URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/artifacts/", ArtName]),
+ URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/artifacts/", ArtName]),
httpabs:post(XER, URL, Headers, "application/octet-stream", JarBody).
deploy_pipeline_dependency_property(XER, Namespace, CDAPURL, {_, ArtName, ArtVerHeader, _, UIPropertiesURL}) ->
- %TODO! I should really be using Erlang records more and not relying on positional arguments so much. For example, I could add a record that represents a Dependency instead of using a positionally-based tuple.
- case UIPropertiesURL of
+ %TODO! I should really be using Erlang records more and not relying on positional arguments so much. For example, I could add a record that represents a Dependency instead of using a positionally-based tuple.
+ case UIPropertiesURL of
none -> {200, ""}; %nothing to do
- _ ->
+ _ ->
{200, PropertiesJSON} = httpabs:get(XER, UIPropertiesURL),
- URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/artifacts/", ArtName, "/versions/", ArtVerHeader, "/properties"]),
+ URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/artifacts/", ArtName, "/versions/", ArtVerHeader, "/properties"]),
httpabs:put(XER, URL, "application/json", PropertiesJSON)
end.
%%%
%%%EXTERNAL
%%%
-get_app_metrics(XER, Appname, Namespace, CDAPURL) ->
+get_app_metrics(XER, Appname, Namespace, CDAPURL) ->
%Namespace should be a binary
MetricsList = get_metrics_list_for_app(XER, Appname, Namespace, CDAPURL), %assert 200 or bomb
- case MetricsList of
+ case MetricsList of
504 -> {504, []};
%TODO! cdap seems to return a {200, []} for above call even if the app is not deployed. Is that OK? for now return empty list but maybe we should determine this and error with a 404 or something
- [] -> {200, []};
+ [] -> {200, []};
_ ->
URL = ?SC([CDAPURL, "/v3/metrics/query"]),
Body = jiffy:encode(
- {[{<<"appmetrics">>,
+ {[{<<"appmetrics">>,
{[{<<"tags">>, {[{<<"namespace">>, Namespace}, {<<"app">>, map_appname(Appname)}]}},
{<<"metrics">>, MetricsList}]}
}]}),
{ReturnCode, RetBody} = httpabs:post(XER, URL, "application/json", Body), %even when app does not exist this seems to return a 200 so assert it!
- case ReturnCode of
+ case ReturnCode of
200 -> {200, jiffy:decode(RetBody)};
504 -> {504, []}
end
@@ -145,13 +145,13 @@ get_app_metrics(XER, Appname, Namespace, CDAPURL) ->
%So now this information is sourced from the initial PUT request, where those programs are saved as supplemntal state
%However, leaving it here because maybe one day it will be useful
%%%get_app_programs(Appname, Namespace, CDAPURL) ->
-%%% %fetch the list of programs from a running CDAP app.
+%%% %fetch the list of programs from a running CDAP app.
%%% %Parse this into a list of [{ProgramType, ProgramID}] tuples.
-%%% %Used as part of healthcheck, and also as part of undeploy so I don't have to keep Programs in MNesia pipeline.
+%%% %Used as part of healthcheck, and also as part of undeploy so I don't have to keep Programs in MNesia pipeline.
%%% %get informaation about application
%%% URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/apps/", map_appname(Appname)]),
%%% {ReturnCode, RetBody} = httpabs:http_get(URL),
-%%% case ReturnCode of
+%%% case ReturnCode of
%%% 504 -> 504;
%%% 404 -> 404;
%%% 400 -> 400;
@@ -164,16 +164,16 @@ get_app_metrics(XER, Appname, Namespace, CDAPURL) ->
%%% %All the uppercase ones are: Flow, MapReduce, Service, Spark, Worker, Workflow
%%% %From http://docs.cask.co/cdap/current/en/reference-manual/http-restful-api/lifecycle.html#details-of-a-program
%%% %All the lowercase ones are: flows, mapreduce, services, spark, workers, or workflows
-%%% program_type = case maps:get(<<"type">>, X) of
+%%% program_type = case maps:get(<<"type">>, X) of
%%% <<"Flow">> -> <<"flows">>; %cdap api fail man
%%% <<"Mapreduce">> -> <<"mapreduce">>;
%%% <<"Service">> -> <<"services">>;
%%% <<"Spark">> -> <<"spark">>;
%%% <<"Worker">> -> <<"workers">>;
%%% <<"Workflow">> -> <<"workflows">>
-%%% end,
+%%% end,
%%% program_id = maps:get(<<"id">>, X)
-%%% }
+%%% }
%%% end, Programs)
%%% end.
%%%
@@ -197,7 +197,7 @@ push_down_config(XER, Appname, Namespace, CDAPURL, ConfigJson) ->
%http://docs.cask.co/cdap/current/en/reference-manual/http-restful-api/lifecycle.html#update-an-application
URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/apps/", map_appname(Appname), "/update"]),
Body = jiffy:encode(
- {[
+ {[
{<<"config">>, ConfigJson}
]}),
httpabs:post(XER, URL, "application/json", Body). %returns {ReturnCode, ReturnBody}
@@ -209,7 +209,7 @@ push_down_program_preferences(XER, Appname, Namespace, CDAPURL, ParsedProgramPre
form_service_json_from_service_tuple(Appname, Namespace, CDAPURL, {SN, SE, EM}) ->
%transforms {SN, SE, EM} into {url: foo, method: bar}
URL = list_to_binary(?SC([CDAPURL, "/v3/namespaces/", Namespace, "/apps/", map_appname(Appname), "/services/", SN, "/methods/", SE])),
- {[{<<"url">>, URL},
+ {[{<<"url">>, URL},
{<<"method">>, EM}
]}.
@@ -230,17 +230,17 @@ push_down_app_preferences(XER, Appname, Namespace, CDAPURL, AppPreferences) ->
deploy_app(XER, Appname, Namespace, CDAPURL, JarBody, ArtifactName, ArtifactVersion, AppConfig) ->
%Create Artifact
%Deploy App
-
+
%post the artifact, OK if already exists, no check
%explicitly set artifact version becausme some JARS do not have it
httpabs:post(XER, ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/artifacts/", ArtifactName]), [{"Artifact-Version", erlang:binary_to_list(ArtifactVersion)}], "application/octet-stream", JarBody),
%deploy the application
- PutBody = jiffy:encode(
+ PutBody = jiffy:encode(
{[
{<<"artifact">>, {[
- {<<"name">>, ArtifactName},
- {<<"version">>, ArtifactVersion},
+ {<<"name">>, ArtifactName},
+ {<<"version">>, ArtifactVersion},
{<<"scope">>, <<"user">>}
]}},
{<<"config">>, AppConfig}
@@ -257,41 +257,42 @@ deploy_pipeline(XER, Appname, Namespace, CDAPURL, PipelineJson) ->
%Deploy a hydrator pipeline, assumes namespace has already been set up
URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/apps/", map_appname(Appname)]),
httpabs:put(XER, URL, "application/json", PipelineJson).
-
-exec_pipeline(XER, Appname, Namespace, CDAPURL, Exec) ->
+
+exec_pipeline(XER, Appname, Namespace, CDAPURL, Exec) ->
%Exec assumed to be: "resume" or "suspend"
%TODO! REVISIT WHETHER datapipelineschedule is a parameter
URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/apps/", map_appname(Appname), "/schedules/dataPipelineSchedule/", Exec]),
- httpabs:post(XER, URL, "application/json", ""). %this CDAP API is a POST but there is no body.
+ httpabs:post(XER, URL, "application/json", ""). %this CDAP API is a POST but there is no body.
-exec_pipeline_workflow(XER, Appname, Namespace, CDAPURL, Exec) ->
- %Exec assumed to be: "stop" or
+exec_pipeline_workflow(XER, Appname, Namespace, CDAPURL, Exec) ->
+ %Exec assumed to be: "stop" or
%TODO! REVISIT WHETHER DataPipelineWorkflow is a parameter
URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/apps/", map_appname(Appname), "/workflows/DataPipelineWorkflow/", Exec]),
- httpabs:post(XER, URL, "application/json", ""). %this CDAP API is a POST but there is no body.
+ httpabs:post(XER, URL, "application/json", ""). %this CDAP API is a POST but there is no body.
get_pipeline_healthcheck(XER, Appname, Namespace, CDAPURL, PipelineHealthLimit) ->
- URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/apps/", map_appname(Appname), "/schedules/dataPipelineSchedule/status"]),
+ URLRoot = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/apps/", map_appname(Appname)]),
+ URL = ?SC([URLRoot, "/schedules/dataPipelineSchedule/status"]),
{RC, RB} = httpabs:get(XER, URL),
case RC /= 200 of
- true -> ?BAD_HEALTH_CODE; %failed to even hit the status.
- false ->
+ true -> ?BAD_HEALTH_CODE; %failed to even hit the status.
+ false ->
Status = jiffy:decode(RB, [return_maps]),
- case maps:is_key(<<"status">>, Status) andalso maps:get(<<"status">>, Status) == <<"SCHEDULED">> of
+ case maps:is_key(<<"status">>, Status) andalso maps:get(<<"status">>, Status) == <<"SCHEDULED">> of
false -> ?BAD_HEALTH_CODE; %status is malformed or the pipeline is not scheduled, both not good
- true ->
+ true ->
%Next, check the last <LIMIT> number of runs, and report a failure if they were not sucessful, or report of more than one of them is running at the same time.
- %This logic came from Terry.
+ %This logic came from Terry.
%His logic is essentially that, if your application is running, but is failing, that should be interpeted as unhealthy and needs investigation.
- %His logic was also that if you have two runs running at the same time, that requires investigation as that should not happen.
+ %His logic was also that if you have two runs running at the same time, that requires investigation as that should not happen.
%RE list_to_binary(integer_to_list( see http://stackoverflow.com/questions/4010713/integer-to-binary-erlang
L = list_to_binary(integer_to_list(PipelineHealthLimit)),
- {RC2, RB2} = httpabs:get(XER, ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/apps/", map_appname(Appname), "/workflows/DataPipelineWorkflow/runs?limit=", L])),
- case RC2 /= 200 of
+ {RC2, RB2} = httpabs:get(XER, ?SC([URLRoot, "/workflows/DataPipelineWorkflow/runs?limit=", L])),
+ case RC2 /= 200 of
true -> RC2; %failed to even hit the status
- false ->
+ false ->
LRST = lists:map(fun(S) ->
- case maps:is_key(<<"status">>, S) of
+ case maps:is_key(<<"status">>, S) of
false -> critical;
true -> case maps:get(<<"status">>, S) of <<"COMPLETED">> -> ok; <<"RUNNING">> -> running; <<"FAILED">> -> critical end
end end, jiffy:decode(RB2, [return_maps])),
@@ -324,7 +325,7 @@ create_namespace(XER, Namespace, CDAPURL) ->
get_app_config(XER, Appname, Namespace, CDAPURL) ->
URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/apps/", map_appname(Appname)]),
{RC, RB} = httpabs:get(XER, URL),
- case RC of
+ case RC of
200 -> {200, maps:get(<<"configuration">>, jiffy:decode(RB, [return_maps]))};
_ -> {RC, RB}
end.
@@ -332,16 +333,16 @@ get_app_config(XER, Appname, Namespace, CDAPURL) ->
get_app_preferences(XER, Appname, Namespace, CDAPURL) ->
URL = ?SC([CDAPURL, "/v3/namespaces/", Namespace, "/apps/", map_appname(Appname), "/preferences"]),
{RC, RB} = httpabs:get(XER, URL),
- case RC of
+ case RC of
200 -> {200, jiffy:decode(RB, [return_maps])};
_ -> {RC, RB}
end.
get_cdap_cluster_version(XER, CDAPURL) ->
%CDAP decided to change their port numbers between release 3 and 4.
- %The broker works with both.
+ %The broker works with both.
%In order to add the correct GUI information into the broker "info endpoint", I have to know what CDAP version we are connected to.
- %The GUI information is a convinence function for component developers that hit the broker via the CLI tool.
+ %The GUI information is a convinence function for component developers that hit the broker via the CLI tool.
URL = ?SC([CDAPURL, "/v3/version"]),
{RC, RB} = httpabs:get(XER, URL),
case RC of
diff --git a/src/cdap_interface_tests.erl b/src/cdap_interface_tests.erl
index 37926a6..c1d1e6c 100644
--- a/src/cdap_interface_tests.erl
+++ b/src/cdap_interface_tests.erl
@@ -6,9 +6,9 @@
% 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.
@@ -21,14 +21,152 @@
-module(cdap_interface_tests).
-include_lib("eunit/include/eunit.hrl").
+-import(cdap_interface, [
+ get_cdap_gui_port_from_version/1,
+ map_appname/1,
+ get_cdap_cluster_version/2,
+ form_stream_url_from_streamname/3,
+ form_service_json_from_service_tuple/4,
+ get_app_preferences/4,
+ get_app_config/4,
+ get_pipeline_healthcheck/5
+ ]).
+
+get_pipeline_healthcheck_test() ->
+ FakeReturn = jiffy:encode({[{<<"status">>, <<"SCHEDULED">>}]}),
+ try meck:new(httpabs, [passthrough]) catch _:_ -> ok end,
+ %notfound
+ meck:expect(httpabs, get, fun(_XER, URL) -> case URL of
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/schedules/dataPipelineSchedule/status" -> {200, FakeReturn};
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234appNOTFOUND/schedules/dataPipelineSchedule/status" -> {404, ""}
+ end end),
+ ?assert(get_pipeline_healthcheck("", "1234%%%%^@#$%@#$%#$^@$.appNOTFOUND", "testns", "http://666.666.666.666:666", 666) == 400),
+
+ %bad status
+ FakeReturnBadStatus = jiffy:encode({[{<<"status">>, <<"nosoupforyou">>}]}),
+ meck:expect(httpabs, get, fun(_XER, URL) -> case URL of
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/schedules/dataPipelineSchedule/status" -> {200, FakeReturnBadStatus}
+ end end),
+ ?assert(get_pipeline_healthcheck("", "1234%%%%^@#$%@#$%#$^@$.app", "testns", "http://666.666.666.666:666", 666) == 400),
+
+ %good status but no status endpoint
+ meck:expect(httpabs, get, fun(_XER, URL) -> case URL of
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/schedules/dataPipelineSchedule/status" -> {200, FakeReturn};
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/workflows/DataPipelineWorkflow/runs?limit=666" -> {404, ""}
+ end end),
+ ?assert(get_pipeline_healthcheck("", "1234%%%%^@#$%@#$%#$^@$.app", "testns", "http://666.666.666.666:666", 666) == 404),
+
+ %good status but a bad malformed inner
+ MalformedRuns = jiffy:encode([
+ {[{<<"nostatus">>, <<"foryou">>}]},
+ {[{<<"status">>, <<"RUNNING">>}]}
+ ]),
+ meck:expect(httpabs, get, fun(_XER, URL) -> case URL of
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/schedules/dataPipelineSchedule/status" -> {200, FakeReturn};
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/workflows/DataPipelineWorkflow/runs?limit=666" -> {200, MalformedRuns}
+ end end),
+
+ ?assert(get_pipeline_healthcheck("", "1234%%%%^@#$%@#$%#$^@$.app", "testns", "http://666.666.666.666:666", 666) == 400),
+
+ %good status but a not good inner
+ BadRuns = jiffy:encode([
+ {[{<<"status">>, <<"FAILED">>}]},
+ {[{<<"status">>, <<"RUNNING">>}]}
+ ]),
+ meck:expect(httpabs, get, fun(_XER, URL) -> case URL of
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/schedules/dataPipelineSchedule/status" -> {200, FakeReturn};
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/workflows/DataPipelineWorkflow/runs?limit=666" -> {200, BadRuns}
+ end end),
+ ?assert(get_pipeline_healthcheck("", "1234%%%%^@#$%@#$%#$^@$.app", "testns", "http://666.666.666.666:666", 666) == 400),
+
+ %two running
+ TwoRunning = jiffy:encode([
+ {[{<<"status">>, <<"RUNNING">>}]},
+ {[{<<"status">>, <<"COMPLETED">>}]},
+ {[{<<"status">>, <<"RUNNING">>}]}
+ ]),
+ meck:expect(httpabs, get, fun(_XER, URL) -> case URL of
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/schedules/dataPipelineSchedule/status" -> {200, FakeReturn};
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/workflows/DataPipelineWorkflow/runs?limit=666" -> {200, TwoRunning}
+ end end),
+ ?assert(get_pipeline_healthcheck("", "1234%%%%^@#$%@#$%#$^@$.app", "testns", "http://666.666.666.666:666", 666) == 400),
+
+ %all good
+ %good status but a not good inner
+ GoodRuns = jiffy:encode([
+ {[{<<"status">>, <<"COMPLETED">>}]},
+ {[{<<"status">>, <<"RUNNING">>}]},
+ {[{<<"status">>, <<"COMPLETED">>}]}
+ ]),
+ meck:expect(httpabs, get, fun(_XER, URL) -> case URL of
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/schedules/dataPipelineSchedule/status" -> {200, FakeReturn};
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/workflows/DataPipelineWorkflow/runs?limit=666" -> {200, GoodRuns}
+ end end),
+ ?assert(get_pipeline_healthcheck("", "1234%%%%^@#$%@#$%#$^@$.app", "testns", "http://666.666.666.666:666", 666) == 200),
+
+ meck:unload(httpabs).
+
+
+
+get_app_config_test() ->
+ FakeReturn = jiffy:encode({[{<<"configuration">>, {[{<<"welcome">>, <<"toeternity">>}]}}]}),
+ try meck:new(httpabs, [passthrough]) catch _:_ -> ok end,
+ meck:expect(httpabs, get, fun(_XER, URL) ->
+ case URL of
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app" -> {200, FakeReturn};
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234appNOTFOUND" -> {404, ""}
+ end
+ end),
+ ?assert(get_app_config("", "1234%%%%^@#$%@#$%#$^@$.app", "testns", "http://666.666.666.666:666") ==
+ {200, #{<<"welcome">> => <<"toeternity">>}}),
+ ?assert(get_app_config("", "1234%%%%^@#$%@#$%#$^@$.appNOTFOUND", "testns", "http://666.666.666.666:666") == {404, ""}),
+ meck:unload(httpabs).
+
+get_app_preferences_test() ->
+ FakeReturn = jiffy:encode({[{<<"welcome">>, <<"toeternity">>}]}),
+ try meck:new(httpabs, [passthrough]) catch _:_ -> ok end,
+ meck:expect(httpabs, get, fun(_XER, URL) ->
+ case URL of
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234app/preferences" -> {200, FakeReturn};
+ "http://666.666.666.666:666/v3/namespaces/testns/apps/1234appNOTFOUND/preferences" -> {404, ""}
+ end
+ end),
+ ?assert(get_app_preferences("", "1234%%%%^@#$%@#$%#$^@$.app", "testns", "http://666.666.666.666:666") ==
+ {200, #{<<"welcome">> => <<"toeternity">>}}),
+ ?assert(get_app_preferences("", "1234%%%%^@#$%@#$%#$^@$.appNOTFOUND", "testns", "http://666.666.666.666:666") == {404, ""}),
+ meck:unload(httpabs).
+
+form_service_json_from_service_tuple_test() ->
+ ?assert(form_service_json_from_service_tuple(<<"amazin@)#$%@#)$%gapp">>, "amazingns", "http://666.666.666.666:666", {"seeme", "feelme", "PUT"})
+ == {[{<<"url">> ,<<"http://666.666.666.666:666/v3/namespaces/amazingns/apps/amazingapp/services/seeme/methods/feelme">>},
+ {<<"method">>, "PUT"}]}).
+
+form_stream_url_from_streamname_test() ->
+ ?assert(form_stream_url_from_streamname("666.666.666.666:666", "thevoid", "souls") == <<"666.666.666.666:666/v3/namespaces/thevoid/streams/souls">>).
+
get_cdap_gui_port_from_version_test() ->
- ?assert(9999 == cdap_interface:get_cdap_gui_port_from_version("3.0.0")),
- ?assert(9999 == cdap_interface:get_cdap_gui_port_from_version("3.10.0")),
- ?assert(9999 == cdap_interface:get_cdap_gui_port_from_version("3.0.10")),
- ?assert(9999 == cdap_interface:get_cdap_gui_port_from_version("3.10.10")),
- ?assert(11011 == cdap_interface:get_cdap_gui_port_from_version(<<"4.0.0">>)),
- ?assert(11011 == cdap_interface:get_cdap_gui_port_from_version(<<"4.10.0">>)),
- ?assert(11011 == cdap_interface:get_cdap_gui_port_from_version(<<"4.0.10">>)),
- ?assert(11011 == cdap_interface:get_cdap_gui_port_from_version(<<"4.10.10">>)),
- ?assert(<<"UNKNOWN CDAP VERSION">> == cdap_interface:get_cdap_gui_port_from_version("5.0.0")).
+ ?assert(9999 == get_cdap_gui_port_from_version("3.0.0")),
+ ?assert(9999 == get_cdap_gui_port_from_version("3.10.0")),
+ ?assert(9999 == get_cdap_gui_port_from_version("3.0.10")),
+ ?assert(9999 == get_cdap_gui_port_from_version("3.10.10")),
+ ?assert(11011 == get_cdap_gui_port_from_version(<<"4.0.0">>)),
+ ?assert(11011 == get_cdap_gui_port_from_version(<<"4.10.0">>)),
+ ?assert(11011 == get_cdap_gui_port_from_version(<<"4.0.10">>)),
+ ?assert(11011 == get_cdap_gui_port_from_version(<<"4.10.10">>)),
+ ?assert(<<"UNKNOWN CDAP VERSION">> == get_cdap_gui_port_from_version("5.0.0")).
+
+map_appname_test() ->
+ ?assert(map_appname(<<"foo">>) == <<"foo">>),
+ ?assert(map_appname(<<"fo.o">>) == <<"foo">>),
+ ?assert(map_appname(<<"f_oo">>) == <<"foo">>),
+ ?assert(map_appname(<<"._*#$%#*%$$#@#foo">>) == <<"foo">>).
+
+get_cdap_cluster_version_test() ->
+ FakeReturn = jiffy:encode({[{<<"version">>, <<"4.0.3">>}]}),
+ try meck:new(httpabs, [passthrough]) catch _:_ -> ok end,
+ meck:expect(httpabs, get, fun(_XER, _URL) -> {200, FakeReturn} end),
+ ?assert(get_cdap_cluster_version("","") == <<"4.0.3">>),
+ meck:expect(httpabs, get, fun(_XER, _URL) -> {404, ""} end),
+ ?assert(get_cdap_cluster_version("","") == <<"UNKNOWN CDAP VERSION">>),
+ meck:unload(httpabs).
diff --git a/src/cdapbroker.app.src b/src/cdapbroker.app.src
index eb39868..f5a1821 100644
--- a/src/cdapbroker.app.src
+++ b/src/cdapbroker.app.src
@@ -1,6 +1,6 @@
{application, cdapbroker,
[{description, "Interface between Consul and CDAP in DCAE"},
- {vsn, "4.0.7"},
+ {vsn, "4.0.8"},
{registered, []},
{mod, { cdapbroker_app, []}},
{applications,
diff --git a/src/httpabs.erl b/src/httpabs.erl
index 152621e..4a29f83 100644
--- a/src/httpabs.erl
+++ b/src/httpabs.erl
@@ -86,9 +86,8 @@ sanitize(URL) ->
-spec post(string(), string()|binary(), string(), any()) -> httpstat().
post(XER, URL, ContentType, Body) ->
%post that sends the XER, no headers signature
- Headers = [{"x-ecomp-requestid", XER}],
U = sanitize(URL),
- parse_response(httpc:request(post, {U, Headers, ContentType, Body}, [],[]), U).
+ parse_response(httpc:request(post, {U, [{"x-ecomp-requestid", XER}], ContentType, Body}, [],[]), U).
-spec post(string(), string()|binary(), list(), string(), any()) -> httpstat().
post(XER, URL, Headers, ContentType, Body) ->
@@ -100,19 +99,16 @@ post(XER, URL, Headers, ContentType, Body) ->
get(XER, URL) ->
%http get that always sends the XER.. even if the server doesn't want it; maybe this will blow up on me one day.
U = sanitize(URL),
- Headers = [{"x-ecomp-requestid", XER}],
- parse_response(httpc:request(get, {U, Headers}, [], []), U).
+ parse_response(httpc:request(get, {U, [{"x-ecomp-requestid", XER}]}, [], []), U).
-spec put(string(), string()|binary(), string(), any()) -> httpstat().
put(XER, URL, ContentType, Body) ->
%http put that always sends the XER
U = sanitize(URL),
- Headers = [{"x-ecomp-requestid", XER}],
- parse_response(httpc:request(put, {U, Headers, ContentType, Body}, [],[]), U).
+ parse_response(httpc:request(put, {U, [{"x-ecomp-requestid", XER}], ContentType, Body}, [],[]), U).
-spec delete(string(), string()|binary()) -> httpstat().
delete(XER, URL) ->
%http delete that always sends the XER
U = sanitize(URL),
- Headers = [{"x-ecomp-requestid", XER}],
- parse_response(httpc:request(delete, {U, Headers}, [],[]), U).
+ parse_response(httpc:request(delete, {U, [{"x-ecomp-requestid", XER}]}, [],[]), U).
diff --git a/src/httpabs_tests.erl b/src/httpabs_tests.erl
index 27b7116..14dc7e6 100644
--- a/src/httpabs_tests.erl
+++ b/src/httpabs_tests.erl
@@ -41,5 +41,12 @@ parse_response_test() ->
BadBody = {[{<<"config">>, ReconfigMap}]},
?assert(httpabs:put("testxer", "www.foo.com", "application/json", BadBody) == {400,"ERROR: The request Body is malformed"}),
?assert(parse_response({error,{bad_body_generator, BadBody}}, "www.foo.com") == {400,"ERROR: The request Body is malformed"}),
+ ?assert(parse_response({error,{bad_body, BadBody}}, "www.foo.com") == {400,"ERROR: The request Body is malformed"}),
+ ?assert(parse_response({error,{this_was, "not expected"}}, "www.fubar.com") == {504,<<"ERROR: The following URL is unreachable or the request was unable to be parsed due to an unknown error: www.fubar.com">>}),
+
+ %try a 200
+ ?assert(parse_response({ok,{{"HTTP/1.1",200,"OK"},[{"cache-control","private, max-age=0"},{"date","Mon, 11 Sep 2017 15:05:11 GMT"},{"accept-ranges","none"},{"server","gws"},{"vary","Accept-Encoding"},{"content-length","46376"},{"content-type","text/html; charset=ISO-8859-1"},{"expires","-1"},{"p3p","..."},{"x-xss-protection","1; mode=block"},{"x-frame-options","SAMEORIGIN"},{"set-cookie","NID=111=nGQHl8ljJ3nXHmGmIZmGaTgoq3WAdbgWaxAUOQJm-0AaOkS64iiXtm-HojIFSpqowj7Nr-KpqS8o-oDOROq-4AaDs0J4M92V7yBOAJQYPkuK7wtVav0BhpOOYgCHysUN; expires=Tue, 13-Mar-2018 15:05:11 GMT; path=/; domain=.google.com; HttpOnly"},{"alt-svc","quic=\":443\"; ma=2592000; v=\"39,38,37,35\""}],"<!doctype html>..."}}, "https://google.com") == {200, "<!doctype html>..."}),
+
+ % try a 404
+ ?assert(parse_response({ok,{{"HTTP/1.1",404,"OK"},[{"cache-control","private, max-age=0"},{"date","Mon, 11 Sep 2017 15:05:11 GMT"},{"accept-ranges","none"},{"server","gws"},{"vary","Accept-Encoding"},{"content-length","46376"},{"content-type","text/html; charset=ISO-8859-1"},{"expires","-1"},{"p3p","..."},{"x-xss-protection","1; mode=block"},{"x-frame-options","SAMEORIGIN"},{"set-cookie","NID=111=nGQHl8ljJ3nXHmGmIZmGaTgoq3WAdbgWaxAUOQJm-0AaOkS64iiXtm-HojIFSpqowj7Nr-KpqS8o-oDOROq-4AaDs0J4M92V7yBOAJQYPkuK7wtVav0BhpOOYgCHysUN; expires=Tue, 13-Mar-2018 15:05:11 GMT; path=/; domain=.google.com; HttpOnly"},{"alt-svc","quic=\":443\"; ma=2592000; v=\"39,38,37,35\""}],""}}, "https://google.com") == {404,"State: OK. Return Body: "}).
- ?assert(parse_response({ok,{{"HTTP/1.1",200,"OK"},[{"cache-control","private, max-age=0"},{"date","Mon, 11 Sep 2017 15:05:11 GMT"},{"accept-ranges","none"},{"server","gws"},{"vary","Accept-Encoding"},{"content-length","46376"},{"content-type","text/html; charset=ISO-8859-1"},{"expires","-1"},{"p3p","..."},{"x-xss-protection","1; mode=block"},{"x-frame-options","SAMEORIGIN"},{"set-cookie","NID=111=nGQHl8ljJ3nXHmGmIZmGaTgoq3WAdbgWaxAUOQJm-0AaOkS64iiXtm-HojIFSpqowj7Nr-KpqS8o-oDOROq-4AaDs0J4M92V7yBOAJQYPkuK7wtVav0BhpOOYgCHysUN; expires=Tue, 13-Mar-2018 15:05:11 GMT; path=/; domain=.google.com; HttpOnly"},{"alt-svc","quic=\":443\"; ma=2592000; v=\"39,38,37,35\""}],"<!doctype html>..."}}, "https://google.com") == {200, "<!doctype html>..."}).
diff --git a/src/util.erl b/src/util.erl
index 520b071..76f8bbf 100644
--- a/src/util.erl
+++ b/src/util.erl
@@ -34,7 +34,8 @@
to_str/1,
ip_to_str/1,
update_with_new_config_map/2,
- ejson_to_map/1
+ ejson_to_map/1,
+ get_envs/0
]).
%http://stackoverflow.com/questions/39757020/erlang-drying-up-stringbinary-concatenation
@@ -48,11 +49,14 @@ resolve_cbs(XER, ConsulURL) ->
{IP, Port} = consul_interface:consul_get_service_ip_port(XER, "config_binding_service", ConsulURL),
concat(["http://", IP, ":", integer_to_binary(Port)]).
+get_envs() ->
+ %breaking this out for mock testing of get_platform_envs_and_config()
+ {os:getenv("HOSTNAME"), os:getenv("CONSUL_HOST"), os:getenv("CDAP_CLUSTER_TO_MANAGE")}.
+
get_platform_envs_and_config() ->
%Get platform envs needed for broker operation, then fetch my config.
%If something critical fails, returns [], else [ConsulURL, CDAPUrl, BoundConfigMap]
- MyName = os:getenv("HOSTNAME"),
- ConsulHost = os:getenv("CONSUL_HOST"),
+ {MyName, ConsulHost, CDAPEnvName} = ?MODULE:get_envs(),
case MyName == false orelse ConsulHost == false of
true -> [];
false ->
@@ -69,7 +73,7 @@ get_platform_envs_and_config() ->
%First, we will check for environmnental variables for a cluster *NAME*
%If that is not found, then we will check out bound config for a fully bound URL
%If that is also not found, let it crash baby.
- CDAPURL = case os:getenv("CDAP_CLUSTER_TO_MANAGE") of
+ CDAPURL = case CDAPEnvName of
false ->
list_to_binary(concat(["http://", lists:nth(1, maps:get(<<"cdap_cluster_to_manage">>, BoundConfigMap))])); %cbs returns ip:port. need http:// or will get "no adaptors found" error
CDAPName ->
diff --git a/src/util_tests.erl b/src/util_tests.erl
index 78ca851..1774fb5 100644
--- a/src/util_tests.erl
+++ b/src/util_tests.erl
@@ -25,7 +25,9 @@
ip_to_str/1,
update_with_new_config_map/2,
ejson_to_map/1,
- to_str/1
+ to_str/1,
+ get_platform_envs_and_config/0,
+ resolve_cbs/2
]).
to_str_test() ->
@@ -57,3 +59,59 @@ ejson_to_map_test() ->
?assert(EJ1 /= EJ2), %HERE LIES THE PROBLEM HUDSON
?assert(M1 == M2). %GREAT SUCCESS!
+get_platform_envs_and_config_test() ->
+ try meck:new(util, [passthrough]) catch _:_ -> ok end,
+ try meck:new(consul_interface, [passthrough]) catch _:_ -> ok end,
+
+ %test no envs
+ meck:expect(util, get_envs, fun() -> {"", false, <<"cdap_test">>} end),
+ ?assert(get_platform_envs_and_config() == []),
+
+ %test good case where the env variable is passed
+ %needed monkeypatching
+ FakeConfig = {[
+ {<<"autoderegisterafter">>, <<"10m">>},
+ {<<"bindingttw">>,5},
+ {<<"pipelinehealthlimit">>, 2},
+ {<<"hcinterval">>, <<"60s">>}
+ ]},
+ FakeBrokerName = "cdap_broker_test",
+ FakeConsulName = "myconsuldotcom",
+ meck:expect(util, get_envs, fun() -> {FakeBrokerName, FakeConsulName, <<"cdap_test">>} end),
+ meck:expect(consul_interface, consul_bind_config, fun(_XER, _MyName, _ConsulURL) -> {200, FakeConfig} end),
+ meck:expect(consul_interface, consul_get_service_ip_port, fun(_XER, Appname, _ConsulURL) ->
+ case Appname of
+ <<"cdap_test">> -> {"666.666.666.666", 666}
+ end
+ end),
+
+ ?assert(get_platform_envs_and_config() == [FakeBrokerName, "http://myconsuldotcom:8500", <<"http://666.666.666.666:666">>, jiffy:decode(jiffy:encode(FakeConfig), [return_maps])]),
+
+ %test bad case where env is not passed
+ meck:expect(util, get_envs, fun() -> {FakeBrokerName, FakeConsulName, false} end),
+ FakeConfigwCDAP = {[
+ {<<"autoderegisterafter">>, <<"10m">>},
+ {<<"bindingttw">>,5},
+ {<<"pipelinehealthlimit">>, 2},
+ {<<"hcinterval">>, <<"60s">>},
+ {<<"cdap_cluster_to_manage">>, [<<"666.666.666.666:666">>]}
+ ]},
+ meck:expect(consul_interface, consul_bind_config, fun(_XER, _MyName, _ConsulURL) -> {200, FakeConfigwCDAP} end),
+ ?assert(get_platform_envs_and_config() == [FakeBrokerName, "http://myconsuldotcom:8500", <<"http://666.666.666.666:666">>, jiffy:decode(jiffy:encode(FakeConfigwCDAP), [return_maps])]),
+
+ meck:unload(util),
+ meck:unload(consul_interface).
+
+resolve_cbs_test() ->
+ try meck:new(consul_interface, [passthrough]) catch _:_ -> ok end,
+ meck:expect(consul_interface, consul_get_service_ip_port, fun(_XER, Appname, _ConsulURL) ->
+ case Appname of
+ "config_binding_service" -> {"666.666.666.666", 10000}
+ end
+ end),
+ ?assert(resolve_cbs("", "") == "http://666.666.666.666:10000"),
+ meck:unload(consul_interface).
+
+
+
+
diff --git a/swagger/swagger.html b/swagger/swagger.html
deleted file mode 100644
index 560157f..0000000
--- a/swagger/swagger.html
+++ /dev/null
@@ -1,1899 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <style>/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]: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}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#286090}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.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}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:800px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:900px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.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:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.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 dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;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:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.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:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.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;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{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{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.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{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.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{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform 0.6s ease-in-out;-moz-transition:-moz-transform 0.6s ease-in-out;-o-transition:-o-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.panel-definition{border-color:#a2a2a2}.panel-definition>.panel-heading{color:#000;background-color:#eee;border-color:#a2a2a2}.panel-definition>.panel-heading+.panel-collapse>.panel-body{border-top-color:#a2a2a2}.panel-definition>.panel-heading .badge{color:#eee;background-color:#000}.panel-definition>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#a2a2a2}.json-schema-description:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Description";padding-bottom:.5em;display:block}.json-schema-description:not(:last-child){padding-bottom:1.5em}.json-schema-properties:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Properties";padding-bottom:.5em;display:block}.json-schema-properties:not(:last-child){padding-bottom:1.5em}.json-schema-properties dd:not(:last-child){padding-bottom:1em}.json-schema-properties dl{margin:0}.json-schema-example:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Example";padding-bottom:.5em;display:block}.json-schema-example:not(:last-child){padding-bottom:1.5em}.json-schema-array-items:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Items";padding-bottom:.5em;display:block}.json-schema-array-items:not(:last-child){padding-bottom:1.5em}.json-schema-allOf-inherited:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Inherited";padding-bottom:.5em;display:block}.json-schema-allOf-inherited:not(:last-child){padding-bottom:1.5em}.json-schema-allOf-inherited ul{padding-left:0;list-style:none}.json-schema-anyOf>dl{border-left:2px solid #a2a2a2;padding-left:1em}.json-schema-anyOf>dl dt:not(:first-child):before{content:"or "}.json-schema-anyOf>dl dt:first-child:before{content:"either "}.json-schema-additionalProperties:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Additional properties";padding-bottom:.5em;display:block}.json-schema-additionalProperties:not(:last-child){padding-bottom:1.5em}.json-inner-schema .json-schema-properties,.json-inner-schema .json-schema-array-items,.json-inner-schema .json-schema-description,.json-inner-schema .json-schema-example{padding-left:1em;margin-top:.5em;padding-bottom:.5em;border-left:2px solid #a2a2a2}.json-property-discriminator:before{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em;background-color:#777;content:"discriminator"}a.json-property-discriminator:before:hover,a.json-property-discriminator:before:focus{color:#fff;text-decoration:none;cursor:pointer}.json-property-discriminator:before:empty{display:none}.btn .json-property-discriminator:before{position:relative;top:-1px}.json-property-discriminator:before[href]:hover,.json-property-discriminator:before[href]:focus{background-color:#5e5e5e}.json-property-required:before{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em;background-color:#777;content:"required"}a.json-property-required:before:hover,a.json-property-required:before:focus{color:#fff;text-decoration:none;cursor:pointer}.json-property-required:before:empty{display:none}.btn .json-property-required:before{position:relative;top:-1px}.json-property-required:before[href]:hover,.json-property-required:before[href]:focus{background-color:#5e5e5e}.json-property-read-only:before{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em;background-color:#777;content:"read only"}a.json-property-read-only:before:hover,a.json-property-read-only:before:focus{color:#fff;text-decoration:none;cursor:pointer}.json-property-read-only:before:empty{display:none}.btn .json-property-read-only:before{position:relative;top:-1px}.json-property-read-only:before[href]:hover,.json-property-read-only:before[href]:focus{background-color:#5e5e5e}.json-property-type{font-style:italic;font-weight:100}.json-property-format{font-size:smaller}.json-property-enum{font-weight:lighter;font-size:small}.json-property-default-value{font-weight:lighter;font-size:small}.json-property-default-value:before{content:'(default: "'}.json-property-default-value:after{content:'")'}.json-property-enum-item{font-weight:lighter;font-size:small}.json-property-enum-item:before,.json-property-enum-item:after{content:"\""}.json-schema--reference{font-size:90%}.table.swagger--summary>tbody>tr>td.swagger--summary-path{vertical-align:middle}.table.swagger--summary>tbody>tr>td p{margin:0}.swagger--panel-operation-post{border-color:#78cc94}.swagger--panel-operation-post>.panel-heading{color:#333;background-color:#e7f6ec;border-color:#78cc94}.swagger--panel-operation-post>.panel-heading+.panel-collapse>.panel-body{border-top-color:#78cc94}.swagger--panel-operation-post>.panel-heading .badge{color:#e7f6ec;background-color:#333}.swagger--panel-operation-post>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#78cc94}.swagger--panel-operation-post .operation-name{font-weight:bold}.swagger--panel-operation-post .operation-summary{float:right !important}.swagger--panel-operation-get{border-color:#74a8d1}.swagger--panel-operation-get>.panel-heading{color:#333;background-color:#e7f0f7;border-color:#74a8d1}.swagger--panel-operation-get>.panel-heading+.panel-collapse>.panel-body{border-top-color:#74a8d1}.swagger--panel-operation-get>.panel-heading .badge{color:#e7f0f7;background-color:#333}.swagger--panel-operation-get>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#74a8d1}.swagger--panel-operation-get .operation-name{font-weight:bold}.swagger--panel-operation-get .operation-summary{float:right !important}.swagger--panel-operation-put{border-color:#d8ab71}.swagger--panel-operation-put>.panel-heading{color:#333;background-color:#f9f2e9;border-color:#d8ab71}.swagger--panel-operation-put>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d8ab71}.swagger--panel-operation-put>.panel-heading .badge{color:#f9f2e9;background-color:#333}.swagger--panel-operation-put>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d8ab71}.swagger--panel-operation-put .operation-name{font-weight:bold}.swagger--panel-operation-put .operation-summary{float:right !important}.swagger--panel-operation-patch{border-color:#ed7c59}.swagger--panel-operation-patch>.panel-heading{color:#333;background-color:#FCE9E3;border-color:#ed7c59}.swagger--panel-operation-patch>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ed7c59}.swagger--panel-operation-patch>.panel-heading .badge{color:#FCE9E3;background-color:#333}.swagger--panel-operation-patch>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ed7c59}.swagger--panel-operation-patch .operation-name{font-weight:bold}.swagger--panel-operation-patch .operation-summary{float:right !important}.swagger--panel-operation-options{border-color:#74a8d1}.swagger--panel-operation-options>.panel-heading{color:#333;background-color:#e7f0f7;border-color:#74a8d1}.swagger--panel-operation-options>.panel-heading+.panel-collapse>.panel-body{border-top-color:#74a8d1}.swagger--panel-operation-options>.panel-heading .badge{color:#e7f0f7;background-color:#333}.swagger--panel-operation-options>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#74a8d1}.swagger--panel-operation-options .operation-name{font-weight:bold}.swagger--panel-operation-options .operation-summary{float:right !important}.swagger--panel-operation-delete{border-color:#c77d7d}.swagger--panel-operation-delete>.panel-heading{color:#333;background-color:#f5e8e8;border-color:#c77d7d}.swagger--panel-operation-delete>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c77d7d}.swagger--panel-operation-delete>.panel-heading .badge{color:#f5e8e8;background-color:#333}.swagger--panel-operation-delete>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c77d7d}.swagger--panel-operation-delete .operation-name{font-weight:bold}.swagger--panel-operation-delete .operation-summary{float:right !important}.swagger--panel-operation-head{border-color:#f3ff34}.swagger--panel-operation-head>.panel-heading{color:#333;background-color:#fcffcd;border-color:#f3ff34}.swagger--panel-operation-head>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f3ff34}.swagger--panel-operation-head>.panel-heading .badge{color:#fcffcd;background-color:#333}.swagger--panel-operation-head>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f3ff34}.swagger--panel-operation-head .operation-name{font-weight:bold}.swagger--panel-operation-head .operation-summary{float:right !important}.sw-operation-description:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Description";padding-bottom:.5em;display:block}.sw-operation-description:not(:last-child){padding-bottom:1.5em}.sw-request-params:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Request parameters";padding-bottom:.5em;display:block}.sw-request-params:not(:last-child){padding-bottom:1.5em}.sw-request-body:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Request body";padding-bottom:.5em;display:block}.sw-request-body:not(:last-child){padding-bottom:1.5em}.sw-responses:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Responses";padding-bottom:.5em;display:block}.sw-responses:not(:last-child){padding-bottom:1.5em}.swagger--global:before{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em;background-color:#777;content:'global'}a.swagger--global:before:hover,a.swagger--global:before:focus{color:#fff;text-decoration:none;cursor:pointer}.swagger--global:before:empty{display:none}.btn .swagger--global:before{position:relative;top:-1px}.swagger--global:before[href]:hover,.swagger--global:before[href]:focus{background-color:#5e5e5e}table.table th.sw-param-key{width:auto}table.table th.sw-param-key:before{content:"Key"}table.table th.sw-param-name{width:auto}table.table th.sw-param-name:before{content:"Name"}table.table th.sw-param-description{width:auto}table.table th.sw-param-description:before{content:"Description"}table.table th.sw-param-data-type{width:auto}table.table th.sw-param-data-type:before{content:"Data type"}table.table th.sw-param-type{width:auto}table.table th.sw-param-type:before{content:"Type"}table.table th.sw-request-security-schema{width:auto}table.table th.sw-request-security-schema:before{content:"Schema"}table.table th.sw-request-security-scopes{width:auto}table.table th.sw-request-security-scopes:before{content:"Scopes"}table.table th.sw-response-header-name{width:auto}table.table th.sw-response-header-name:before{content:"Header"}table.table th.sw-response-header-description{width:auto}table.table th.sw-response-header-description:before{content:"Description"}table.table th.sw-response-header-data-type{width:auto}table.table th.sw-response-header-data-type:before{content:"Data type"}.sw-response-name-value{font-weight:bold}.sw-response-description-text{padding-bottom:.5em}code.highlight{padding:0}.panel-security-definition{border-color:#a2a2a2}.panel-security-definition>.panel-heading{color:#000;background-color:#eee;border-color:#a2a2a2}.panel-security-definition>.panel-heading+.panel-collapse>.panel-body{border-top-color:#a2a2a2}.panel-security-definition>.panel-heading .badge{color:#eee;background-color:#000}.panel-security-definition>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#a2a2a2}.sw-request-security:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Security";padding-bottom:.5em;display:block}.sw-request-security:not(:last-child){padding-bottom:1.5em}.sw-security-definition-basic:before{color:#555;font-size:smaller;content:"(HTTP Basic Authentication)"}span.sw-default-value-header{font-weight:bold}.sw-info{font-weight:bold}.sw-info span{font-family:monospace;font-weight:normal;font-size:1.1em}</style>
- <meta charset="UTF-8">
- <title>CDAP Broker API</title>
-</head>
-<body>
-<div class="container">
- <h1>CDAP Broker API</h1>
- <p class="sw-info">Version: <span class="sw-info-version">4.0.7</span></p>
- <p></p>
-
-
- <div id="sw-schemes" class="sw-default-value">
- <span class="sw-default-value-header">Schemes:</span>
-
- </div>
-
- <h2 id="swagger--summary-no-tags">Summary</h2>
- <table class="table table-bordered table-condensed swagger--summary">
- <thead>
- <tr>
- <th>Path</th>
- <th>Operation</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td class="swagger--summary-path" rowspan="1">
- <a href="#path--">/</a>
- </td>
- <td>
- <a href="#operation---get">GET</a>
- </td>
- <td>
-
- </td>
- </tr>
- <tr>
- <td class="swagger--summary-path" rowspan="1">
- <a href="#path--application">/application</a>
- </td>
- <td>
- <a href="#operation--application-get">GET</a>
- </td>
- <td>
-
- </td>
- </tr>
- <tr>
- <td class="swagger--summary-path" rowspan="1">
- <a href="#path--application---appname-">/application*/{appname}</a>
- </td>
- <td>
- <a href="#operation--application---appname--put">PUT</a>
- </td>
- <td>
-
- </td>
- </tr>
- <tr>
- <td class="swagger--summary-path" rowspan="1">
- <a href="#path--application-delete">/application/delete</a>
- </td>
- <td>
- <a href="#operation--application-delete-post">POST</a>
- </td>
- <td>
-
- </td>
- </tr>
- <tr>
- <td class="swagger--summary-path" rowspan="3">
- <a href="#path--application--appname-">/application/{appname}</a>
- </td>
- <td>
- <a href="#operation--application--appname--delete">DELETE</a>
- </td>
- <td>
-
- </td>
- </tr>
- <tr>
- <td>
- <a href="#operation--application--appname--get">GET</a>
- </td>
- <td>
-
- </td>
- </tr>
- <tr>
- <td>
- <a href="#operation--application--appname--put">PUT</a>
- </td>
- <td>
-
- </td>
- </tr>
- <tr>
- <td class="swagger--summary-path" rowspan="1">
- <a href="#path--application--appname--healthcheck">/application/{appname}/healthcheck</a>
- </td>
- <td>
- <a href="#operation--application--appname--healthcheck-get">GET</a>
- </td>
- <td>
-
- </td>
- </tr>
- <tr>
- <td class="swagger--summary-path" rowspan="1">
- <a href="#path--application--appname--metrics">/application/{appname}/metrics</a>
- </td>
- <td>
- <a href="#operation--application--appname--metrics-get">GET</a>
- </td>
- <td>
-
- </td>
- </tr>
- <tr>
- <td class="swagger--summary-path" rowspan="1">
- <a href="#path--application--appname--reconfigure">/application/{appname}/reconfigure</a>
- </td>
- <td>
- <a href="#operation--application--appname--reconfigure-put">PUT</a>
- </td>
- <td>
-
- </td>
- </tr>
- </tbody>
- </table>
-
-
-
- <h2>Paths</h2>
-
-
- <span id="path--"></span>
- <div id="operation---get" class="swagger--panel-operation-get panel">
- <div class="panel-heading">
- <div class="operation-summary"></div>
- <h3 class="panel-title"><span class="operation-name">GET</span> <strong>/</strong></h3>
- </div>
- <div class="panel-body">
- <section class="sw-operation-description">
- <p>shows some information about this service</p>
-
- </section>
-
-
- <section class="sw-responses">
-
- <dl>
- <dt class="sw-response-200">
- 200 OK
-
- </dt>
- <dd class="sw-response-200">
- <div class="row">
- <div class="col-md-12">
- <p>successful response</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- <div class="panel panel-definition">
- <div class="panel-body">
- <a class="json-schema-ref" href="#/definitions/info">info</a>
- </div>
- </div></div>
-
- </div> </dd>
- </dl>
- </section>
- </div>
- </div>
- <span id="path--application"></span>
- <div id="operation--application-get" class="swagger--panel-operation-get panel">
- <div class="panel-heading">
- <div class="operation-summary"></div>
- <h3 class="panel-title"><span class="operation-name">GET</span> <strong>/application</strong></h3>
- </div>
- <div class="panel-body">
- <section class="sw-operation-description">
- <p>get all applications registered with this broker</p>
-
- </section>
-
-
- <section class="sw-responses">
-
- <dl>
- <dt class="sw-response-200">
- 200 OK
-
- </dt>
- <dd class="sw-response-200">
- <div class="row">
- <div class="col-md-12">
- <p>successful response</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- <div class="panel panel-definition">
- <div class="panel-body">
-
- <section class="json-schema-array-items">
- <span class="json-property-type"> <a class="json-schema-ref" href="#/definitions/appname">appname</a>
- </span>
- <span class="json-property-range" title="Value limits"></span>
-
- <div class="json-inner-schema">
-
- </div>
- </section> </div>
- </div></div>
-
- </div> </dd>
- </dl>
- </section>
- </div>
- </div>
- <span id="path--application---appname-"></span>
- <div id="operation--application---appname--put" class="swagger--panel-operation-put panel">
- <div class="panel-heading">
- <div class="operation-summary"></div>
- <h3 class="panel-title"><span class="operation-name">PUT</span> <strong>/application*/{appname}</strong></h3>
- </div>
- <div class="panel-body">
- <section class="sw-operation-description">
- <p>(This is a hacky way of supporting &quot;oneOf&quot; because Swagger does not support oneOf <a href="https://github.com/OAI/OpenAPI-Specification/issues/333">https://github.com/OAI/OpenAPI-Specification/issues/333</a>. This is the same endpoint as PUT /application/appname, except the PUT body is different.)</p>
- <p>Register a hydrator app for service and configuration discovery. This will light up a metrics and health endpoint for this app. <code>appname</code> is assumed to also be the key in consul.</p>
-
- </section>
-
- <section class="sw-request-body">
-
- <p><span class="label label-default">application/json</span>
- </p>
- <div class="row">
- <div class="col-md-6">
- <p><p>required put body</p>
- </p>
- </div>
- <div class="col-md-6 sw-request-model">
- <div class="panel panel-definition">
- <div class="panel-body">
- <a class="json-schema-ref" href="#/definitions/hydratorappput">hydratorappput</a>
- </div>
- </div></div>
- </div>
- </section>
- <section class="sw-request-params">
- <table class="table">
- <thead>
- <tr>
- <th class="sw-param-name"></th>
- <th class="sw-param-description"></th>
- <th class="sw-param-type"></th>
- <th class="sw-param-data-type"></th>
- <th class="sw-param-annotation"></th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- appname
- <td><p>Name of the application.</p>
- </td>
- <td>path</td>
- <td><span class="json-property-type">string</span> <span class="json-property-format">(text)</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </td>
- <td>
- <span class="json-property-required"></span>
- </td>
- </tr>
- </tbody>
- </table>
- </section>
-
- <section class="sw-responses">
- <p><span class="label label-default">application/json</span>
- </p>
-
- <dl>
- <dt class="sw-response-200">
- 200 OK
-
- </dt>
- <dd class="sw-response-200">
- <div class="row">
- <div class="col-md-12">
- <p>Successful response</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- <div class="panel panel-definition">
- <div class="panel-body">
- <a class="json-schema-ref" href="#/definitions/Application">Application</a>
- </div>
- </div></div>
-
- </div> </dd>
- <dt class="sw-response-400">
- 400 Bad Request
-
- </dt>
- <dd class="sw-response-400">
- <div class="row">
- <div class="col-md-12">
- <p>put was performed but the appname was already registered with the broker, or Invalid PUT body</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- </div>
-
- </div> </dd>
- </dl>
- </section>
- </div>
- </div>
- <span id="path--application-delete"></span>
- <div id="operation--application-delete-post" class="swagger--panel-operation-post panel">
- <div class="panel-heading">
- <div class="operation-summary"></div>
- <h3 class="panel-title"><span class="operation-name">POST</span> <strong>/application/delete</strong></h3>
- </div>
- <div class="panel-body">
- <section class="sw-operation-description">
- <p>endpoint to delete multiple applications at once. Returns an array of status codes, where statuscode[i] = response returned from DELETE(application/i)</p>
-
- </section>
-
- <section class="sw-request-body">
-
- <div class="row">
- <div class="col-md-6">
- <p><p>required post body</p>
- </p>
- </div>
- <div class="col-md-6 sw-request-model">
- <div class="panel panel-definition">
- <div class="panel-body">
- <a class="json-schema-ref" href="#/definitions/multideleteput">multideleteput</a>
- </div>
- </div></div>
- </div>
- </section>
-
- <section class="sw-responses">
-
- <dl>
- <dt class="sw-response-200">
- 200 OK
-
- </dt>
- <dd class="sw-response-200">
- <div class="row">
- <div class="col-md-12">
- <p>successful response</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- <div class="panel panel-definition">
- <div class="panel-body">
-
- <section class="json-schema-array-items">
- <span class="json-property-type"> <a class="json-schema-ref" href="#/definitions/returncode">returncode</a>
- </span>
- <span class="json-property-range" title="Value limits"></span>
-
- <div class="json-inner-schema">
-
- </div>
- </section> </div>
- </div></div>
-
- </div> </dd>
- </dl>
- </section>
- </div>
- </div>
- <span id="path--application--appname-"></span>
- <div id="operation--application--appname--delete" class="swagger--panel-operation-delete panel">
- <div class="panel-heading">
- <div class="operation-summary"></div>
- <h3 class="panel-title"><span class="operation-name">DELETE</span> <strong>/application/{appname}</strong></h3>
- </div>
- <div class="panel-body">
- <section class="sw-operation-description">
- <p>Remove an app for service and configuration discovery. This will remove the metrics and health endpoints for this app.</p>
-
- </section>
-
- <section class="sw-request-params">
- <table class="table">
- <thead>
- <tr>
- <th class="sw-param-name"></th>
- <th class="sw-param-description"></th>
- <th class="sw-param-type"></th>
- <th class="sw-param-data-type"></th>
- <th class="sw-param-annotation"></th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- appname
- <td><p>Name of the application.</p>
- </td>
- <td>path</td>
- <td><span class="json-property-type">string</span> <span class="json-property-format">(text)</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </td>
- <td>
- <span class="json-property-required"></span>
- </td>
- </tr>
- </tbody>
- </table>
- </section>
-
- <section class="sw-responses">
-
- <dl>
- <dt class="sw-response-200">
- 200 OK
-
- </dt>
- <dd class="sw-response-200">
- <div class="row">
- <div class="col-md-12">
- <p>Successful response</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- </div>
-
- </div> </dd>
- <dt class="sw-response-404">
- 404 Not Found
-
- </dt>
- <dd class="sw-response-404">
- <div class="row">
- <div class="col-md-12">
- <p>no app with name &#39;appname&#39; registered with this broker.</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- </div>
-
- </div> </dd>
- </dl>
- </section>
- </div>
- </div> <div id="operation--application--appname--get" class="swagger--panel-operation-get panel">
- <div class="panel-heading">
- <div class="operation-summary"></div>
- <h3 class="panel-title"><span class="operation-name">GET</span> <strong>/application/{appname}</strong></h3>
- </div>
- <div class="panel-body">
- <section class="sw-operation-description">
- <p>Returns the representation of the application resource, including the links for healthcheck and metrics.</p>
-
- </section>
-
- <section class="sw-request-params">
- <table class="table">
- <thead>
- <tr>
- <th class="sw-param-name"></th>
- <th class="sw-param-description"></th>
- <th class="sw-param-type"></th>
- <th class="sw-param-data-type"></th>
- <th class="sw-param-annotation"></th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- appname
- <td><p>Name of the application.</p>
- </td>
- <td>path</td>
- <td><span class="json-property-type">string</span> <span class="json-property-format">(text)</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </td>
- <td>
- <span class="json-property-required"></span>
- </td>
- </tr>
- </tbody>
- </table>
- </section>
-
- <section class="sw-responses">
-
- <dl>
- <dt class="sw-response-200">
- 200 OK
-
- </dt>
- <dd class="sw-response-200">
- <div class="row">
- <div class="col-md-12">
- <p>Successful response</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- <div class="panel panel-definition">
- <div class="panel-body">
- <a class="json-schema-ref" href="#/definitions/Application">Application</a>
- </div>
- </div></div>
-
- </div> </dd>
- <dt class="sw-response-404">
- 404 Not Found
-
- </dt>
- <dd class="sw-response-404">
- <div class="row">
- <div class="col-md-12">
- <p>no app with name &#39;appname&#39; registered with this broker.</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- </div>
-
- </div> </dd>
- </dl>
- </section>
- </div>
- </div> <div id="operation--application--appname--put" class="swagger--panel-operation-put panel">
- <div class="panel-heading">
- <div class="operation-summary"></div>
- <h3 class="panel-title"><span class="operation-name">PUT</span> <strong>/application/{appname}</strong></h3>
- </div>
- <div class="panel-body">
- <section class="sw-operation-description">
- <p>Register an app for service and configuration discovery. This will light up a metrics and health endpoint for this app. <code>appname</code> is assumed to also be the key in consul.</p>
-
- </section>
-
- <section class="sw-request-body">
-
- <p><span class="label label-default">application/json</span>
- </p>
- <div class="row">
- <div class="col-md-6">
- <p><p>required put body</p>
- </p>
- </div>
- <div class="col-md-6 sw-request-model">
- <div class="panel panel-definition">
- <div class="panel-body">
- <a class="json-schema-ref" href="#/definitions/appput">appput</a>
- </div>
- </div></div>
- </div>
- </section>
- <section class="sw-request-params">
- <table class="table">
- <thead>
- <tr>
- <th class="sw-param-name"></th>
- <th class="sw-param-description"></th>
- <th class="sw-param-type"></th>
- <th class="sw-param-data-type"></th>
- <th class="sw-param-annotation"></th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- appname
- <td><p>Name of the application.</p>
- </td>
- <td>path</td>
- <td><span class="json-property-type">string</span> <span class="json-property-format">(text)</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </td>
- <td>
- <span class="json-property-required"></span>
- </td>
- </tr>
- </tbody>
- </table>
- </section>
-
- <section class="sw-responses">
- <p><span class="label label-default">application/json</span>
- </p>
-
- <dl>
- <dt class="sw-response-200">
- 200 OK
-
- </dt>
- <dd class="sw-response-200">
- <div class="row">
- <div class="col-md-12">
- <p>Successful response</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- <div class="panel panel-definition">
- <div class="panel-body">
- <a class="json-schema-ref" href="#/definitions/Application">Application</a>
- </div>
- </div></div>
-
- </div> </dd>
- <dt class="sw-response-400">
- 400 Bad Request
-
- </dt>
- <dd class="sw-response-400">
- <div class="row">
- <div class="col-md-12">
- <p>put was performed but the appname was already registered with the broker, or Invalid PUT body</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- </div>
-
- </div> </dd>
- </dl>
- </section>
- </div>
- </div>
- <span id="path--application--appname--healthcheck"></span>
- <div id="operation--application--appname--healthcheck-get" class="swagger--panel-operation-get panel">
- <div class="panel-heading">
- <div class="operation-summary"></div>
- <h3 class="panel-title"><span class="operation-name">GET</span> <strong>/application/{appname}/healthcheck</strong></h3>
- </div>
- <div class="panel-body">
- <section class="sw-operation-description">
- <p>Perform a healthcheck on the running app appname.</p>
-
- </section>
-
- <section class="sw-request-params">
- <table class="table">
- <thead>
- <tr>
- <th class="sw-param-name"></th>
- <th class="sw-param-description"></th>
- <th class="sw-param-type"></th>
- <th class="sw-param-data-type"></th>
- <th class="sw-param-annotation"></th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- appname
- <td><p>Name of the application to get the healthcheck for.</p>
- </td>
- <td>path</td>
- <td><span class="json-property-type">string</span> <span class="json-property-format">(test)</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </td>
- <td>
- <span class="json-property-required"></span>
- </td>
- </tr>
- </tbody>
- </table>
- </section>
-
- <section class="sw-responses">
-
- <dl>
- <dt class="sw-response-200">
- 200 OK
-
- </dt>
- <dd class="sw-response-200">
- <div class="row">
- <div class="col-md-12">
- <p>Successful response, healthcheck pass</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- </div>
-
- </div> </dd>
- <dt class="sw-response-404">
- 404 Not Found
-
- </dt>
- <dd class="sw-response-404">
- <div class="row">
- <div class="col-md-12">
- <p>no app with name &#39;appname&#39; registered with this broker, or the healthcheck has failed (though I would like to disambiguiate from the first case, CDAP returns a 404 for this).</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- </div>
-
- </div> </dd>
- </dl>
- </section>
- </div>
- </div>
- <span id="path--application--appname--metrics"></span>
- <div id="operation--application--appname--metrics-get" class="swagger--panel-operation-get panel">
- <div class="panel-heading">
- <div class="operation-summary"></div>
- <h3 class="panel-title"><span class="operation-name">GET</span> <strong>/application/{appname}/metrics</strong></h3>
- </div>
- <div class="panel-body">
- <section class="sw-operation-description">
- <p>Get live (real-time) app specific metrics for the running app appname. Metrics are customized per each app by the component developer</p>
-
- </section>
-
- <section class="sw-request-params">
- <table class="table">
- <thead>
- <tr>
- <th class="sw-param-name"></th>
- <th class="sw-param-description"></th>
- <th class="sw-param-type"></th>
- <th class="sw-param-data-type"></th>
- <th class="sw-param-annotation"></th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- appname
- <td><p>Name of the application to get metrics for.</p>
- </td>
- <td>path</td>
- <td><span class="json-property-type">string</span> <span class="json-property-format">(test)</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </td>
- <td>
- <span class="json-property-required"></span>
- </td>
- </tr>
- </tbody>
- </table>
- </section>
-
- <section class="sw-responses">
-
- <dl>
- <dt class="sw-response-200">
- 200 OK
-
- </dt>
- <dd class="sw-response-200">
- <div class="row">
- <div class="col-md-12">
- <p>Successful response</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- <div class="panel panel-definition">
- <div class="panel-body">
- <a class="json-schema-ref" href="#/definitions/MetricsObject">MetricsObject</a>
- </div>
- </div></div>
-
- </div> </dd>
- <dt class="sw-response-404">
- 404 Not Found
-
- </dt>
- <dd class="sw-response-404">
- <div class="row">
- <div class="col-md-12">
- <p>no app with name &#39;appname&#39; registered with this broker.</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- </div>
-
- </div> </dd>
- </dl>
- </section>
- </div>
- </div>
- <span id="path--application--appname--reconfigure"></span>
- <div id="operation--application--appname--reconfigure-put" class="swagger--panel-operation-put panel">
- <div class="panel-heading">
- <div class="operation-summary"></div>
- <h3 class="panel-title"><span class="operation-name">PUT</span> <strong>/application/{appname}/reconfigure</strong></h3>
- </div>
- <div class="panel-body">
- <section class="sw-operation-description">
- <p>Reconfigures the application.</p>
-
- </section>
-
- <section class="sw-request-body">
-
- <div class="row">
- <div class="col-md-6">
- <p><p>required put body</p>
- </p>
- </div>
- <div class="col-md-6 sw-request-model">
- <div class="panel panel-definition">
- <div class="panel-body">
- <a class="json-schema-ref" href="#/definitions/reconfigput">reconfigput</a>
- </div>
- </div></div>
- </div>
- </section>
- <section class="sw-request-params">
- <table class="table">
- <thead>
- <tr>
- <th class="sw-param-name"></th>
- <th class="sw-param-description"></th>
- <th class="sw-param-type"></th>
- <th class="sw-param-data-type"></th>
- <th class="sw-param-annotation"></th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- appname
- <td><p>Name of the application.</p>
- </td>
- <td>path</td>
- <td><span class="json-property-type">string</span> <span class="json-property-format">(text)</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </td>
- <td>
- <span class="json-property-required"></span>
- </td>
- </tr>
- </tbody>
- </table>
- </section>
-
- <section class="sw-responses">
-
- <dl>
- <dt class="sw-response-200">
- 200 OK
-
- </dt>
- <dd class="sw-response-200">
- <div class="row">
- <div class="col-md-12">
- <p>Successful response</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- </div>
-
- </div> </dd>
- <dt class="sw-response-400">
- 400 Bad Request
-
- </dt>
- <dd class="sw-response-400">
- <div class="row">
- <div class="col-md-12">
- <p>Bad request. Can happen with 1) {appname} is not registered with the broker, 2) the required PUT body is wrong, or 3) the smart interface was chosen and none of the config keys match anything in app_config or app_preferences</p>
-
- </div>
- </div>
- <div class="row">
-
- <div class="col-md-6 sw-response-model">
- </div>
-
- </div> </dd>
- </dl>
- </section>
- </div>
- </div>
-
-
-
- <h2>Schema definitions</h2>
-
-
- <div id="definition-Application" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/Application"></a>Application:
- <span class="json-property-type"><span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
-
- <section class="json-schema-properties">
- <dl>
- <dt data-property-name="appname">
- <span class="json-property-name">appname:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>application name</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="healthcheckurl">
- <span class="json-property-name">healthcheckurl:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>fully qualified url to perform healthcheck</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="metricsurl">
- <span class="json-property-name">metricsurl:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>fully qualified url to get metrics from</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="url">
- <span class="json-property-name">url:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>fully qualified url of the resource</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="connectionurl">
- <span class="json-property-name">connectionurl:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>input URL that you can POST data into (URL of the CDAP stream)</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="serviceendpoints">
- <span class="json-property-name">serviceendpoints:</span>
- <span class="json-property-type">object[]</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>a list of HTTP services exposed by this CDAP application</p>
-
- <div class="json-inner-schema">
-
- <section class="json-schema-array-items">
- <span class="json-property-type"> <a class="json-schema-ref" href="#/definitions/service_method">service_method</a>
- </span>
- <span class="json-property-range" title="Value limits"></span>
-
- <div class="json-inner-schema">
-
- </div>
- </section> </div>
- </dd>
- </dl>
- </section>
- </div>
- </div>
- <div id="definition-appname" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/appname"></a>appname:
- <span class="json-property-type"><span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
- <section class="json-schema-description">
- <p>an application name</p>
-
- </section>
-
- </div>
- </div>
- <div id="definition-appput" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/appput"></a>appput:
- <span class="json-property-type"><span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
-
- <section class="json-schema-properties">
- <dl>
- <dt data-property-name="cdap_application_type">
- <span class="json-property-name">cdap_application_type:</span>
- <span class="json-property-type">string</span> <span class="json-property-enum" title="Possible values">, x &isin; {
- <span class="json-property-enum-item">program-flowlet</span>
-
- }
- </span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>denotes whether this is a program-flowlet style application or a hydrator pipeline. For program-flowlet style apps, this value must be &quot;program-flowlet&quot;</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="streamname">
- <span class="json-property-name">streamname:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>name of the CDAP stream to ingest data into this app. Should come from the developer and Tosca model.</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="namespace">
- <span class="json-property-name">namespace:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the cdap namespace this is deployed into</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="jar_url">
- <span class="json-property-name">jar_url:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the URL that the JAR you&#39;re deploying resides</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="artifact_name">
- <span class="json-property-name">artifact_name:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the name of the CDAP artifact to be added</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="artifact_ver">
- <span class="json-property-name">artifact_ver:</span>
- <span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the version of the artifact. Must be in X.Y.Z form</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="app_config">
- <span class="json-property-name">app_config:</span>
- <span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the application config JSON</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="app_preferences">
- <span class="json-property-name">app_preferences:</span>
- <span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the application preferences JSON</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="programs">
- <span class="json-property-name">programs:</span>
- <span class="json-property-type">object[]</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
-
- <div class="json-inner-schema">
-
- <section class="json-schema-array-items">
- <span class="json-property-type"> <a class="json-schema-ref" href="#/definitions/programs">programs</a>
- </span>
- <span class="json-property-range" title="Value limits"></span>
-
- <div class="json-inner-schema">
-
- </div>
- </section> </div>
- </dd>
- <dt data-property-name="program_preferences">
- <span class="json-property-name">program_preferences:</span>
- <span class="json-property-type">object[]</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
-
- <div class="json-inner-schema">
-
- <section class="json-schema-array-items">
- <span class="json-property-type"> <a class="json-schema-ref" href="#/definitions/programpref">programpref</a>
- </span>
- <span class="json-property-range" title="Value limits"></span>
-
- <div class="json-inner-schema">
-
- </div>
- </section> </div>
- </dd>
- <dt data-property-name="services">
- <span class="json-property-name">services:</span>
- <span class="json-property-type">object[]</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
-
- <div class="json-inner-schema">
-
- <section class="json-schema-array-items">
- <span class="json-property-type"> <a class="json-schema-ref" href="#/definitions/service_endpoint">service_endpoint</a>
- </span>
- <span class="json-property-range" title="Value limits"></span>
-
- <div class="json-inner-schema">
-
- </div>
- </section> </div>
- </dd>
- </dl>
- </section>
- </div>
- </div>
- <div id="definition-hydratorappput" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/hydratorappput"></a>hydratorappput:
- <span class="json-property-type"><span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
-
- <section class="json-schema-properties">
- <dl>
- <dt data-property-name="cdap_application_type">
- <span class="json-property-name">cdap_application_type:</span>
- <span class="json-property-type">string</span> <span class="json-property-enum" title="Possible values">, x &isin; {
- <span class="json-property-enum-item">hydrator-pipeline</span>
-
- }
- </span>
- <span class="json-property-range" title="Value limits"></span>
-
- <span class="json-property-required"></span>
- </dt>
- <dd>
- <p>denotes whether this is a program-flowlet style application or a hydrator pipeline. For hydrator, this value must be &quot;hydrator-pipeline&quot;</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="namespace">
- <span class="json-property-name">namespace:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- <span class="json-property-required"></span>
- </dt>
- <dd>
- <p>the cdap namespace this is deployed into</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="pipeline_config_json_url">
- <span class="json-property-name">pipeline_config_json_url:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- <span class="json-property-required"></span>
- </dt>
- <dd>
- <p>the URL of the config.json for this pipeline</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="streamname">
- <span class="json-property-name">streamname:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- <span class="json-property-required"></span>
- </dt>
- <dd>
- <p>name of the CDAP stream to ingest data into this app. Should come from the developer and Tosca model.</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="dependencies">
- <span class="json-property-name">dependencies:</span>
- <span class="json-property-type">object[]</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>represents a list of dependencies to be loaded for this pipeline. Not required.</p>
-
- <div class="json-inner-schema">
-
- <section class="json-schema-array-items">
- <span class="json-property-type"> <a class="json-schema-ref" href="#/definitions/hydratordep">hydratordep</a>
- </span>
- <span class="json-property-range" title="Value limits"></span>
-
- <div class="json-inner-schema">
-
- </div>
- </section> </div>
- </dd>
- </dl>
- </section>
- </div>
- </div>
- <div id="definition-hydratordep" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/hydratordep"></a>hydratordep:
- <span class="json-property-type"><span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
- <section class="json-schema-description">
- <p>represents a hydrator pipeline dependency. An equivelent to the following CURLs are formed with the below four params shown in CAPS &quot;curl -v -w&quot;\n&quot; -X POST <a href="http://cdapurl:11015/v3/namespaces/setelsewhere/artifacts/ARTIFACT_NAME">http://cdapurl:11015/v3/namespaces/setelsewhere/artifacts/ARTIFACT_NAME</a> -H &quot;Artifact-Extends:ARTIFACT_EXTENDS_HEADER&quot; -H “Artifact-Version:ARTIFACT_VERSION_HEADER” --data-binary @(DOWNLOADED FROM ARTIFACT_URL)&quot;,&quot;curl -v -w&quot;\n&quot; -X PUT <a href="http://cdapurl:11015/v3/namespaces/setelsewhere/artifacts/ARTIFACT_NAME/versions/ARTIFACT_VERSION_HEADER/properties">http://cdapurl:11015/v3/namespaces/setelsewhere/artifacts/ARTIFACT_NAME/versions/ARTIFACT_VERSION_HEADER/properties</a> -d (DOWNLOADED FROM UI_PROPERTIES_URL)&quot;</p>
-
- </section>
-
- <section class="json-schema-properties">
- <dl>
- <dt data-property-name="artifact_extends_header">
- <span class="json-property-name">artifact_extends_header:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- <span class="json-property-required"></span>
- </dt>
- <dd>
- <p>the value of the header that gets passed in for artifact-extends, e.g., &quot;Artifact-Extends:system:cdap-data-pipeline[4.0.1,5.0.0)&quot;</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="artifact_name">
- <span class="json-property-name">artifact_name:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- <span class="json-property-required"></span>
- </dt>
- <dd>
- <p>the name of the artifact</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="artifact_version_header">
- <span class="json-property-name">artifact_version_header:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- <span class="json-property-required"></span>
- </dt>
- <dd>
- <p>the value of the header that gets passed in for artifact-version, e.g., &quot;Artifact-Version:1.0.0-SNAPSHOT&quot;</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="artifact_url">
- <span class="json-property-name">artifact_url:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- <span class="json-property-required"></span>
- </dt>
- <dd>
- <p>the URL of the artifact JAR</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="ui_properties_url">
- <span class="json-property-name">ui_properties_url:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the URL of the properties.json if the custom artifact has UI properties. This is optional.</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- </dl>
- </section>
- </div>
- </div>
- <div id="definition-info" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/info"></a>info:
- <span class="json-property-type"><span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
- <section class="json-schema-description">
- <p>some broker information</p>
-
- </section>
-
- <section class="json-schema-properties">
- <dl>
- <dt data-property-name="managed-cdap-url">
- <span class="json-property-name">managed cdap url:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the url of the CDAP cluster API this broker is managing</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="number-of-applications-registered">
- <span class="json-property-name">number of applications registered:</span>
- <span class="json-property-type">integer</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="uptime--s-">
- <span class="json-property-name">uptime (s):</span>
- <span class="json-property-type">integer</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="cdap-GUI-port">
- <span class="json-property-name">cdap GUI port:</span>
- <span class="json-property-type">integer</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>The GUI port of the CDAP cluster this broker is managing. Mostly to help users of this API check their application in cdap. Note, will return UNKNOWN_CDAP_VERSION if it cannot be determined.</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="cdap-cluster-version">
- <span class="json-property-name">cdap cluster version:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the version of the CDAP cluster this broker is managing. Note, will return UKNOWN_CDAP_VERSION if it cannot be determined.</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="broker-API-version">
- <span class="json-property-name">broker API version:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the API version of this running broker</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- </dl>
- </section>
- </div>
- </div>
- <div id="definition-MetricsObject" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/MetricsObject"></a>MetricsObject:
- <span class="json-property-type"><span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
- <section class="json-schema-description">
- <p>key,value object where the key is &#39;appmetrics&#39; and the value is an app dependent json and specified by the component developer</p>
-
- </section>
-
- <section class="json-schema-properties">
- <dl>
- <dt data-property-name="appmetrics">
- <span class="json-property-name">appmetrics:</span>
- <span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- </dl>
- </section>
- </div>
- </div>
- <div id="definition-multideleteput" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/multideleteput"></a>multideleteput:
- <span class="json-property-type"><span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
-
- <section class="json-schema-properties">
- <dl>
- <dt data-property-name="appnames">
- <span class="json-property-name">appnames:</span>
- <span class="json-property-type">object[]</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
-
- <div class="json-inner-schema">
-
- <section class="json-schema-array-items">
- <span class="json-property-type"> <a class="json-schema-ref" href="#/definitions/appname">appname</a>
- </span>
- <span class="json-property-range" title="Value limits"></span>
-
- <div class="json-inner-schema">
-
- </div>
- </section> </div>
- </dd>
- </dl>
- </section>
- </div>
- </div>
- <div id="definition-programpref" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/programpref"></a>programpref:
- <span class="json-property-type"><span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
- <section class="json-schema-description">
- <p>the list of programs in this CDAP app</p>
-
- </section>
-
- <section class="json-schema-properties">
- <dl>
- <dt data-property-name="program_type">
- <span class="json-property-name">program_type:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>must be one of flows, mapreduce, schedules, spark, workflows, workers, or services</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="program_id">
- <span class="json-property-name">program_id:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the name of the program</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="program_pref">
- <span class="json-property-name">program_pref:</span>
- <span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the preference JSON to set for this program</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- </dl>
- </section>
- </div>
- </div>
- <div id="definition-programs" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/programs"></a>programs:
- <span class="json-property-type"><span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
- <section class="json-schema-description">
- <p>the list of programs in this CDAP app</p>
-
- </section>
-
- <section class="json-schema-properties">
- <dl>
- <dt data-property-name="program_type">
- <span class="json-property-name">program_type:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>must be one of flows, mapreduce, schedules, spark, workflows, workers, or services</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="program_id">
- <span class="json-property-name">program_id:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the name of the program</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- </dl>
- </section>
- </div>
- </div>
- <div id="definition-reconfigput" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/reconfigput"></a>reconfigput:
- <span class="json-property-type"><span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
-
- <section class="json-schema-properties">
- <dl>
- <dt data-property-name="reconfiguration_type">
- <span class="json-property-name">reconfiguration_type:</span>
- <span class="json-property-type">string</span> <span class="json-property-enum" title="Possible values">, x &isin; {
- <span class="json-property-enum-item">program-flowlet-app-config</span>
- ,
- <span class="json-property-enum-item">program-flowlet-app-preferences</span>
- ,
- <span class="json-property-enum-item">program-flowlet-smart</span>
-
- }
- </span>
- <span class="json-property-range" title="Value limits"></span>
-
- <span class="json-property-required"></span>
- </dt>
- <dd>
- <p>the type of reconfiguration</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="config">
- <span class="json-property-name">config:</span>
- <span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- <span class="json-property-required"></span>
- </dt>
- <dd>
- <p>the config JSON</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- </dl>
- </section>
- </div>
- </div>
- <div id="definition-returncode" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/returncode"></a>returncode:
- <span class="json-property-type"><span class="json-property-type">integer</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
- <section class="json-schema-description">
- <p>an httpreturncode</p>
-
- </section>
-
- </div>
- </div>
- <div id="definition-service_endpoint" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/service_endpoint"></a>service_endpoint:
- <span class="json-property-type"><span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
- <section class="json-schema-description">
- <p>descirbes a service endpoint, including the service name, the method name, and the method type (GET, PUT, etc, most of the time will be GET)</p>
-
- </section>
-
- <section class="json-schema-properties">
- <dl>
- <dt data-property-name="service_name">
- <span class="json-property-name">service_name:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the name of the service</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="service_endpoint">
- <span class="json-property-name">service_endpoint:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the name of the endpoint on the service</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="endpoint_method">
- <span class="json-property-name">endpoint_method:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>GET, POST, PUT, etc</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- </dl>
- </section>
- </div>
- </div>
- <div id="definition-service_method" class="panel panel-definition">
- <div class="panel-heading">
- <h3 class="panel-title"><a name="/definitions/service_method"></a>service_method:
- <span class="json-property-type"><span class="json-property-type">object</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </span>
- </h3>
- </div>
- <div class="panel-body">
- <section class="json-schema-description">
- <p>a URL and HTTP method exposed via a CDAP service</p>
-
- </section>
-
- <section class="json-schema-properties">
- <dl>
- <dt data-property-name="url">
- <span class="json-property-name">url:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>the fully qualified URL in CDAP for this service</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- <dt data-property-name="method">
- <span class="json-property-name">method:</span>
- <span class="json-property-type">string</span>
- <span class="json-property-range" title="Value limits"></span>
-
- </dt>
- <dd>
- <p>HTTP method you can perform on the URL, e.g., GET, PUT, etc</p>
-
- <div class="json-inner-schema">
-
- </div>
- </dd>
- </dl>
- </section>
- </div>
- </div>
-</div>
-</body>
-</html>
diff --git a/swagger/swagger.json b/swagger/swagger.json
deleted file mode 100644
index da4ddd6..0000000
--- a/swagger/swagger.json
+++ /dev/null
@@ -1,560 +0,0 @@
-{
- "swagger": "2.0",
- "info": {
- "version": "4.0.7",
- "title": "CDAP Broker API"
- },
- "paths": {
- "/": {
- "get": {
- "description": "shows some information about this service",
- "responses": {
- "200": {
- "description": "successful response",
- "schema": {
- "$ref": "#/definitions/info"
- }
- }
- }
- }
- },
- "/application": {
- "get": {
- "description": "get all applications registered with this broker",
- "responses": {
- "200": {
- "description": "successful response",
- "schema": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/appname"
- }
- }
- }
- }
- }
- },
- "/application/delete": {
- "post": {
- "description": "endpoint to delete multiple applications at once. Returns an array of status codes, where statuscode[i] = response returned from DELETE(application/i)",
- "parameters": [
- {
- "name": "postbody",
- "in": "body",
- "description": "required post body",
- "required": true,
- "schema": {
- "$ref": "#/definitions/multideleteput"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "successful response",
- "schema": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/returncode"
- }
- }
- }
- }
- }
- },
- "/application/{appname}": {
- "parameters": [
- {
- "name": "appname",
- "in": "path",
- "description": "Name of the application.",
- "required": true,
- "type": "string",
- "format": "text"
- }
- ],
- "get": {
- "description": "Returns the representation of the application resource, including the links for healthcheck and metrics.",
- "responses": {
- "200": {
- "description": "Successful response",
- "schema": {
- "$ref": "#/definitions/Application"
- }
- },
- "404": {
- "description": "no app with name 'appname' registered with this broker."
- }
- }
- },
- "put": {
- "description": "Register an app for service and configuration discovery. This will light up a metrics and health endpoint for this app. `appname` is assumed to also be the key in consul.",
- "consumes": [
- "application/json"
- ],
- "produces": [
- "application/json"
- ],
- "parameters": [
- {
- "name": "putbody",
- "in": "body",
- "description": "required put body",
- "required": true,
- "schema": {
- "$ref": "#/definitions/appput"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "schema": {
- "$ref": "#/definitions/Application"
- }
- },
- "400": {
- "description": "put was performed but the appname was already registered with the broker, or Invalid PUT body"
- }
- }
- },
- "delete": {
- "description": "Remove an app for service and configuration discovery. This will remove the metrics and health endpoints for this app.",
- "responses": {
- "200": {
- "description": "Successful response"
- },
- "404": {
- "description": "no app with name 'appname' registered with this broker."
- }
- }
- }
- },
- "/application*/{appname}": {
- "parameters": [
- {
- "name": "appname",
- "in": "path",
- "description": "Name of the application.",
- "required": true,
- "type": "string",
- "format": "text"
- }
- ],
- "put": {
- "description": "(This is a hacky way of supporting \"oneOf\" because Swagger does not support oneOf https://github.com/OAI/OpenAPI-Specification/issues/333. This is the same endpoint as PUT /application/appname, except the PUT body is different.)\n\nRegister a hydrator app for service and configuration discovery. This will light up a metrics and health endpoint for this app. `appname` is assumed to also be the key in consul.",
- "consumes": [
- "application/json"
- ],
- "produces": [
- "application/json"
- ],
- "parameters": [
- {
- "name": "putbody",
- "in": "body",
- "description": "required put body",
- "required": true,
- "schema": {
- "$ref": "#/definitions/hydratorappput"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "schema": {
- "$ref": "#/definitions/Application"
- }
- },
- "400": {
- "description": "put was performed but the appname was already registered with the broker, or Invalid PUT body"
- }
- }
- }
- },
- "/application/{appname}/metrics": {
- "get": {
- "description": "Get live (real-time) app specific metrics for the running app appname. Metrics are customized per each app by the component developer",
- "parameters": [
- {
- "name": "appname",
- "in": "path",
- "description": "Name of the application to get metrics for.",
- "required": true,
- "type": "string",
- "format": "test"
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "schema": {
- "$ref": "#/definitions/MetricsObject"
- }
- },
- "404": {
- "description": "no app with name 'appname' registered with this broker."
- }
- }
- }
- },
- "/application/{appname}/healthcheck": {
- "get": {
- "description": "Perform a healthcheck on the running app appname.",
- "parameters": [
- {
- "name": "appname",
- "in": "path",
- "description": "Name of the application to get the healthcheck for.",
- "required": true,
- "type": "string",
- "format": "test"
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response, healthcheck pass"
- },
- "404": {
- "description": "no app with name 'appname' registered with this broker, or the healthcheck has failed (though I would like to disambiguiate from the first case, CDAP returns a 404 for this)."
- }
- }
- }
- },
- "/application/{appname}/reconfigure": {
- "parameters": [
- {
- "name": "appname",
- "in": "path",
- "description": "Name of the application.",
- "required": true,
- "type": "string",
- "format": "text"
- }
- ],
- "put": {
- "description": "Reconfigures the application.",
- "parameters": [
- {
- "name": "putbody",
- "in": "body",
- "description": "required put body",
- "required": true,
- "schema": {
- "$ref": "#/definitions/reconfigput"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response"
- },
- "400": {
- "description": "Bad request. Can happen with 1) {appname} is not registered with the broker, 2) the required PUT body is wrong, or 3) the smart interface was chosen and none of the config keys match anything in app_config or app_preferences"
- }
- }
- }
- }
- },
- "definitions": {
- "MetricsObject": {
- "type": "object",
- "description": "key,value object where the key is 'appmetrics' and the value is an app dependent json and specified by the component developer",
- "properties": {
- "appmetrics": {
- "type": "object"
- }
- }
- },
- "Application": {
- "type": "object",
- "properties": {
- "appname": {
- "description": "application name",
- "type": "string"
- },
- "healthcheckurl": {
- "description": "fully qualified url to perform healthcheck",
- "type": "string"
- },
- "metricsurl": {
- "description": "fully qualified url to get metrics from",
- "type": "string"
- },
- "url": {
- "description": "fully qualified url of the resource",
- "type": "string"
- },
- "connectionurl": {
- "description": "input URL that you can POST data into (URL of the CDAP stream)",
- "type": "string"
- },
- "serviceendpoints": {
- "description": "a list of HTTP services exposed by this CDAP application",
- "type": "array",
- "items": {
- "$ref": "#/definitions/service_method"
- }
- }
- }
- },
- "reconfigput": {
- "type": "object",
- "properties": {
- "reconfiguration_type": {
- "description": "the type of reconfiguration",
- "type": "string",
- "enum": [
- "program-flowlet-app-config",
- "program-flowlet-app-preferences",
- "program-flowlet-smart"
- ]
- },
- "config": {
- "description": "the config JSON",
- "type": "object"
- }
- },
- "required": [
- "reconfiguration_type",
- "config"
- ]
- },
- "multideleteput": {
- "type": "object",
- "properties": {
- "appnames": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/appname"
- }
- }
- }
- },
- "appname": {
- "description": "an application name",
- "type": "string"
- },
- "hydratorappput": {
- "type": "object",
- "properties": {
- "cdap_application_type": {
- "description": "denotes whether this is a program-flowlet style application or a hydrator pipeline. For hydrator, this value must be \"hydrator-pipeline\"",
- "type": "string",
- "enum": [
- "hydrator-pipeline"
- ]
- },
- "namespace": {
- "description": "the cdap namespace this is deployed into",
- "type": "string"
- },
- "pipeline_config_json_url": {
- "description": "the URL of the config.json for this pipeline",
- "type": "string"
- },
- "streamname": {
- "description": "name of the CDAP stream to ingest data into this app. Should come from the developer and Tosca model.",
- "type": "string"
- },
- "dependencies": {
- "description": "represents a list of dependencies to be loaded for this pipeline. Not required.",
- "type": "array",
- "items": {
- "$ref": "#/definitions/hydratordep"
- }
- }
- },
- "required": [
- "cdap_application_type",
- "namespace",
- "pipeline_config_json_url",
- "streamname"
- ]
- },
- "appput": {
- "type": "object",
- "properties": {
- "cdap_application_type": {
- "description": "denotes whether this is a program-flowlet style application or a hydrator pipeline. For program-flowlet style apps, this value must be \"program-flowlet\"",
- "type": "string",
- "enum": [
- "program-flowlet"
- ]
- },
- "streamname": {
- "description": "name of the CDAP stream to ingest data into this app. Should come from the developer and Tosca model.",
- "type": "string"
- },
- "namespace": {
- "description": "the cdap namespace this is deployed into",
- "type": "string"
- },
- "jar_url": {
- "description": "the URL that the JAR you're deploying resides",
- "type": "string"
- },
- "artifact_name": {
- "description": "the name of the CDAP artifact to be added",
- "type": "string"
- },
- "artifact_ver": {
- "description": "the version of the artifact. Must be in X.Y.Z form"
- },
- "app_config": {
- "description": "the application config JSON",
- "type": "object"
- },
- "app_preferences": {
- "description": "the application preferences JSON",
- "type": "object"
- },
- "programs": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/programs"
- }
- },
- "program_preferences": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/programpref"
- }
- },
- "services": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/service_endpoint"
- }
- }
- }
- },
- "service_endpoint": {
- "description": "descirbes a service endpoint, including the service name, the method name, and the method type (GET, PUT, etc, most of the time will be GET)",
- "type": "object",
- "properties": {
- "service_name": {
- "type": "string",
- "description": "the name of the service"
- },
- "service_endpoint": {
- "type": "string",
- "description": "the name of the endpoint on the service"
- },
- "endpoint_method": {
- "type": "string",
- "description": "GET, POST, PUT, etc"
- }
- }
- },
- "service_method": {
- "description": "a URL and HTTP method exposed via a CDAP service",
- "type": "object",
- "properties": {
- "url": {
- "type": "string",
- "description": "the fully qualified URL in CDAP for this service"
- },
- "method": {
- "type": "string",
- "description": "HTTP method you can perform on the URL, e.g., GET, PUT, etc"
- }
- }
- },
- "programs": {
- "description": "the list of programs in this CDAP app",
- "type": "object",
- "properties": {
- "program_type": {
- "description": "must be one of flows, mapreduce, schedules, spark, workflows, workers, or services",
- "type": "string"
- },
- "program_id": {
- "description": "the name of the program",
- "type": "string"
- }
- }
- },
- "returncode": {
- "description": "an httpreturncode",
- "type": "integer"
- },
- "hydratordep": {
- "description": "represents a hydrator pipeline dependency. An equivelent to the following CURLs are formed with the below four params shown in CAPS \"curl -v -w\"\\n\" -X POST http://cdapurl:11015/v3/namespaces/setelsewhere/artifacts/ARTIFACT_NAME -H \"Artifact-Extends:ARTIFACT_EXTENDS_HEADER\" -H “Artifact-Version:ARTIFACT_VERSION_HEADER” --data-binary @(DOWNLOADED FROM ARTIFACT_URL)\",\"curl -v -w\"\\n\" -X PUT http://cdapurl:11015/v3/namespaces/setelsewhere/artifacts/ARTIFACT_NAME/versions/ARTIFACT_VERSION_HEADER/properties -d (DOWNLOADED FROM UI_PROPERTIES_URL)\"",
- "properties": {
- "artifact_extends_header": {
- "description": "the value of the header that gets passed in for artifact-extends, e.g., \"Artifact-Extends:system:cdap-data-pipeline[4.0.1,5.0.0)\"",
- "type": "string"
- },
- "artifact_name": {
- "description": "the name of the artifact",
- "type": "string"
- },
- "artifact_version_header": {
- "description": "the value of the header that gets passed in for artifact-version, e.g., \"Artifact-Version:1.0.0-SNAPSHOT\"",
- "type": "string"
- },
- "artifact_url": {
- "description": "the URL of the artifact JAR",
- "type": "string"
- },
- "ui_properties_url": {
- "description": "the URL of the properties.json if the custom artifact has UI properties. This is optional.",
- "type": "string"
- }
- },
- "required": [
- "artifact_extends_header",
- "artifact_name",
- "artifact_version_header",
- "artifact_url"
- ]
- },
- "programpref": {
- "description": "the list of programs in this CDAP app",
- "type": "object",
- "properties": {
- "program_type": {
- "description": "must be one of flows, mapreduce, schedules, spark, workflows, workers, or services",
- "type": "string"
- },
- "program_id": {
- "description": "the name of the program",
- "type": "string"
- },
- "program_pref": {
- "description": "the preference JSON to set for this program",
- "type": "object"
- }
- }
- },
- "info": {
- "description": "some broker information",
- "type": "object",
- "properties": {
- "managed cdap url": {
- "description": "the url of the CDAP cluster API this broker is managing",
- "type": "string"
- },
- "number of applications registered": {
- "type": "integer"
- },
- "uptime (s)": {
- "type": "integer"
- },
- "cdap GUI port": {
- "type": "integer",
- "description": "The GUI port of the CDAP cluster this broker is managing. Mostly to help users of this API check their application in cdap. Note, will return UNKNOWN_CDAP_VERSION if it cannot be determined."
- },
- "cdap cluster version": {
- "type": "string",
- "description": "the version of the CDAP cluster this broker is managing. Note, will return UKNOWN_CDAP_VERSION if it cannot be determined."
- },
- "broker API version": {
- "type": "string",
- "description": "the API version of this running broker"
- }
- }
- }
- }
-}
diff --git a/swagger/swagger.yaml b/swagger/swagger.yaml
index 6449088..736fc66 100644
--- a/swagger/swagger.yaml
+++ b/swagger/swagger.yaml
@@ -5,7 +5,7 @@ swagger: '2.0'
# This is your document metadata
info:
- version: "4.0.7"
+ version: "4.0.8"
title: CDAP Broker API
paths: