flipflop 2.2.0 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDk3OGYyZmJlYmFlNWMwM2EzOGE5YjY4MmI2ZGVhNTQ3N2JiM2E0Nw==
4
+ ZDQyZGU4ODNkZGVhNWMzYWM2OWZiNDYwM2ZmNDllNGY1YjZmOTM5NA==
5
5
  data.tar.gz: !binary |-
6
- Y2ZjNmQ0MGQ0NjllZTFiNjE3ZGQwYjZhNmUzMGYxNzg1NDU5ZWE4Yg==
6
+ ZDZkZjM2YTNhZDEwNjBjZDY3MDM0Y2FmZGQwNmIzMDY1MWRhOGE1OA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZWE3NTY1ZTk2YWQ5MmY5ZTMyMjE5YWM0ODg1NjYyYTU2ZjQ5M2JiMTI0ZWU5
10
- Mzk4ZjBmZWY3YmU0YTQ5ZjQyMjI1ZWQ4NTA1NmE0M2U5ODkyZDQyMDFjNGFk
11
- NjJmN2NiMjg4MTA1Y2M3MmNiYWUyZjI2MWRiZjY5Y2UyNTcxNDc=
9
+ MTQ2MWIxZjBiNGMxY2VlMDgyMzVlNWQ1MjY2NmRjOTZhNjY2YmI5NWRiYzQy
10
+ NTZlMzJhOWQ3MTliNTI3NjdiMjg1NDAwYzU0YWY2MzU1Mjc1YmQyZmQzNWZi
11
+ YWI5YTQ0Y2I3M2E4MTFiYjYwODE3NThmZTVjZjFkODZlZTNjMDA=
12
12
  data.tar.gz: !binary |-
13
- Mjk0MTBmYzVlNmQ2NWY5ZGM2MWY3ODkwOTYwYzMxMDIxN2FkMGRlOTQ0Nzg0
14
- NzE3MjM3MzhlMmNiZmE4M2Y1MzA2ZTBhZWMyMTQ3MjI5YjI5YmMyNzdjZWNl
15
- ZjczYWQ5ZGNlNTMwODY1N2M0ZmU3NjkwNzQ5ODk0NGFhOGI0ZGQ=
13
+ Njc0NTFiMGEwNmEzMmQ1YjdlN2EzNjhjMWQyM2ZlNDJlY2E3MzI3Mjk0ZGMz
14
+ ZmU5MTg3NTU1MzRmMzkxM2Y2ODkxODhkNWFkNDIyMjM1MGE2NThmNDI0MmY1
15
+ MWNiZWNhZjdhZGM5MzRhYzRlNTlmNTMxNTI4NTFmZTdmNjFmNjE=
data/Gemfile CHANGED
@@ -14,6 +14,7 @@ group :test do
14
14
  end
15
15
 
16
16
  gem "sqlite3", ">= 1.3", platform: :ruby
17
+ gem "fakeredis"
17
18
  gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
18
19
  gem "minitest", ">= 4.2"
19
20
  gem "capybara", ">= 2.6"
data/README.md CHANGED
@@ -8,7 +8,7 @@ application functionality at run-time. It is originally based on
8
8
  * an improved dashboard
9
9
  * thread safety
10
10
  * better database performance due to per-request caching, enabled by default
11
- * more strategies (query strings, sessions, custom code)
11
+ * more strategies (Redis, query strings, sessions, custom code)
12
12
  * more strategy options (cookie options, strategy names and descriptions, custom database models)
13
13
  * the ability to use the same strategy twice, with different options
14
14
  * configuration in a fixed location (`config/features.rb`) that is usable even if you don't use the database strategy
@@ -18,7 +18,7 @@ application functionality at run-time. It is originally based on
18
18
  You can configure strategy layers that will evaluate if a feature is currently
19
19
  enabled or disabled. Available strategies are:
20
20
  * a per-feature default setting
21
- * database (with Active Record), to flipflop features site-wide for all users
21
+ * database (with Active Record or Redis), to flipflop features site-wide for all users
22
22
  * cookie or session, to flipflop features for single users
23
23
  * query string parameters, to flipflop features occasionally (in development mode for example)
24
24
  * custom strategy code
@@ -82,15 +82,23 @@ The following strategies are provided:
82
82
  * `:httponly` – Whether the cookies are accessible via scripting or only HTTP. Default is `false`.
83
83
  * `:query_string` – Interpret query string parameters as features. This strategy is only used for resolving. It does not allow switching features on/off.
84
84
  * `:prefix` – String prefix for all query string parameters. Defaults to no prefix.
85
+ * `:redis` – Save feature settings in Redis.
86
+ * `:client` – Use the specified Redis client instead of `Redis.new`.
87
+ * `:prefix` – String prefix for all Redis keys. Defaults to no prefix.
85
88
  * `:session` – Save feature settings in the current user's application session.
86
89
  * `:prefix` – String prefix for all session variables. Defaults to no prefix.
87
90
  * `:default` – Not strictly needed, all feature defaults will be applied if no strategies match a feature. Include this strategy to determine the order of using the default value, and to make it appear in the dashboard.
91
+ * `:test` – Simple strategy that stores features in memory. Useful for testing. If you call `Flipflop::FeatureSet.current.test!` this strategy is enabled and replaces all configured strategies.
88
92
 
89
93
  All strategies support these options, to change the appearance of the dashboard:
90
94
  * `:name` – The name of the strategy. Defaults to the name of the selected strategy.
91
95
  * `:description` – The description of the strategy. Every strategy has a default description.
92
96
  * `:hidden` – Optionally hides the strategy from the dashboard. Default is `false`.
93
97
 
98
+ The same strategy type can be used multiple times, as long as the options are
99
+ different. To prevent subtle bugs, an error is raised if two identical
100
+ strategies are configured.
101
+
94
102
  ## Checking if a feature is enabled
95
103
 
96
104
  `Flipflop.enabled?` or the dynamic predicate methods can be used to check
@@ -150,7 +158,8 @@ Flipflop.configure do
150
158
  end
151
159
  ```
152
160
 
153
- You can define your own custom strategies by inheriting from `Flipflop::Strategies::AbstractStrategy`:
161
+ You can define your own custom strategies by inheriting from
162
+ `Flipflop::Strategies::AbstractStrategy`:
154
163
 
155
164
  ```ruby
156
165
  class UserPreferenceStrategy < Flipflop::Strategies::AbstractStrategy
@@ -201,6 +210,23 @@ Flipflop.configure do
201
210
  end
202
211
  ```
203
212
 
213
+ If you define your class inside `Flipflop::Strategies`, you can use the
214
+ shorthand name to refer to your strategy:
215
+
216
+ ```ruby
217
+ module Flipflop::Strategies
218
+ class UserPreferenceStrategy < AbstractStrategy
219
+ # ...
220
+ end
221
+ end
222
+ ```
223
+
224
+ ```ruby
225
+ Flipflop.configure do
226
+ strategy :user_preference
227
+ end
228
+ ```
229
+
204
230
  ## Dashboard access control
205
231
 
206
232
  The dashboard provides visibility and control over the features.
data/Rakefile CHANGED
@@ -20,7 +20,7 @@ namespace :assets do
20
20
  stylesheet_file = "flipflop.css"
21
21
  stylesheet_path = stylesheets_path + "/" + stylesheet_file
22
22
 
23
- task :compile do
23
+ task :compile => :clean do
24
24
  require "bundler/setup"
25
25
  require "flipflop"
26
26
  require "sprockets"
@@ -34,6 +34,6 @@ namespace :assets do
34
34
  end
35
35
 
36
36
  task :clean do
37
- FileUtils.rm(stylesheet_path)
37
+ FileUtils.rm(stylesheet_path) rescue nil
38
38
  end
39
39
  end
@@ -1 +1 @@
1
- /*! 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{outline:0}a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;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:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*,*::before,*::after{text-shadow:none !important;box-shadow:none !important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}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,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]>.caret,.dropup>.btn>.caret,section.flipflop table tbody td.toggle div.toolbar div.group .dropup>input[type=submit]>.caret{border-top-color:#000 !important}.label,section.flipflop table tbody td.status span{border:1px solid #000}.table,section.flipflop table{border-collapse:collapse !important}.table td,section.flipflop table td,.table th,section.flipflop table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}@-moz-viewport{width:device-width}@-ms-viewport{width:device-width}@-o-viewport{width:device-width}@-webkit-viewport{width:device-width}@viewport{width:device-width}html{font-size:16px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;font-size:1rem;line-height:1.5;color:#373a3c;background-color:#fff}[tabindex="-1"]:focus{outline:none !important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #818a91}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:bold}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#0275d8;text-decoration:none}a:focus,a:hover{color:#014c8c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}pre{margin-top:0;margin-bottom:1rem}figure{margin:0 0 1rem}img{vertical-align:middle}[role="button"]{cursor:pointer}a,area,button,[role="button"],input,label,select,summary,textarea{touch-action:manipulation}table{background-color:transparent}caption{padding-top:0.75rem;padding-bottom:0.75rem;color:#818a91;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,textarea{margin:0;line-height:inherit;border-radius:0}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type="search"]{box-sizing:inherit;-webkit-appearance:none}output{display:inline-block}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:0.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}.h1{font-size:2.5rem}.h2{font-size:2rem}.h3{font-size:1.75rem}.h4{font-size:1.5rem}.h5{font-size:1.25rem}.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300}.display-2{font-size:5.5rem;font-weight:300}.display-3{font-size:4.5rem;font-weight:300}.display-4{font-size:3.5rem;font-weight:300}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:normal}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.dl-horizontal{margin-right:-1.875rem;margin-left:-1.875rem}.dl-horizontal::after{content:"";display:table;clear:both}.initialism{font-size:90%;text-transform:uppercase}.blockquote{padding:0.5rem 1rem;margin-bottom:1rem;font-size:1.25rem;border-left:0.25rem solid #eceeef}.blockquote-footer{display:block;font-size:80%;line-height:1.5;color:#818a91}.blockquote-footer::before{content:"\2014 \00A0"}.blockquote-reverse{padding-right:1rem;padding-left:0;text-align:right;border-right:0.25rem solid #eceeef;border-left:0}.blockquote-reverse .blockquote-footer::before{content:""}.blockquote-reverse .blockquote-footer::after{content:"\00A0 \2014"}.container{margin-left:auto;margin-right:auto;padding-left:0.9375rem;padding-right:0.9375rem}.container::after{content:"";display:table;clear:both}@media (min-width: 544px){.container{max-width:576px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:940px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid,section.flipflop{margin-left:auto;margin-right:auto;padding-left:0.9375rem;padding-right:0.9375rem}.container-fluid::after,section.flipflop::after{content:"";display:table;clear:both}.row{margin-left:-0.9375rem;margin-right:-0.9375rem}.row::after{content:"";display:table;clear:both}.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,.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,.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,.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,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12{position:relative;min-height:1px;padding-left:0.9375rem;padding-right:0.9375rem}.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-1{width:8.33333%}.col-xs-2{width:16.66667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333%}.col-xs-5{width:41.66667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333%}.col-xs-8{width:66.66667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333%}.col-xs-11{width:91.66667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333%}.col-xs-pull-2{right:16.66667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333%}.col-xs-pull-5{right:41.66667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333%}.col-xs-pull-8{right:66.66667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333%}.col-xs-pull-11{right:91.66667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333%}.col-xs-push-2{left:16.66667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333%}.col-xs-push-5{left:41.66667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333%}.col-xs-push-8{left:66.66667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333%}.col-xs-push-11{left:91.66667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0%}.col-xs-offset-1{margin-left:8.33333%}.col-xs-offset-2{margin-left:16.66667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333%}.col-xs-offset-5{margin-left:41.66667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333%}.col-xs-offset-8{margin-left:66.66667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333%}.col-xs-offset-11{margin-left:91.66667%}.col-xs-offset-12{margin-left:100%}@media (min-width: 544px){.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-1{width:8.33333%}.col-sm-2{width:16.66667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333%}.col-sm-5{width:41.66667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333%}.col-sm-8{width:66.66667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333%}.col-sm-11{width:91.66667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333%}.col-sm-pull-2{right:16.66667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333%}.col-sm-pull-5{right:41.66667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333%}.col-sm-pull-8{right:66.66667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333%}.col-sm-pull-11{right:91.66667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333%}.col-sm-push-2{left:16.66667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333%}.col-sm-push-5{left:41.66667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333%}.col-sm-push-8{left:66.66667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333%}.col-sm-push-11{left:91.66667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0%}.col-sm-offset-1{margin-left:8.33333%}.col-sm-offset-2{margin-left:16.66667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333%}.col-sm-offset-5{margin-left:41.66667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333%}.col-sm-offset-8{margin-left:66.66667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333%}.col-sm-offset-11{margin-left:91.66667%}.col-sm-offset-12{margin-left:100%}}@media (min-width: 768px){.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-1{width:8.33333%}.col-md-2{width:16.66667%}.col-md-3{width:25%}.col-md-4{width:33.33333%}.col-md-5{width:41.66667%}.col-md-6{width:50%}.col-md-7{width:58.33333%}.col-md-8{width:66.66667%}.col-md-9{width:75%}.col-md-10{width:83.33333%}.col-md-11{width:91.66667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333%}.col-md-pull-2{right:16.66667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333%}.col-md-pull-5{right:41.66667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333%}.col-md-pull-8{right:66.66667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333%}.col-md-pull-11{right:91.66667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333%}.col-md-push-2{left:16.66667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333%}.col-md-push-5{left:41.66667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333%}.col-md-push-8{left:66.66667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333%}.col-md-push-11{left:91.66667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0%}.col-md-offset-1{margin-left:8.33333%}.col-md-offset-2{margin-left:16.66667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333%}.col-md-offset-5{margin-left:41.66667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333%}.col-md-offset-8{margin-left:66.66667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333%}.col-md-offset-11{margin-left:91.66667%}.col-md-offset-12{margin-left:100%}}@media (min-width: 992px){.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-1{width:8.33333%}.col-lg-2{width:16.66667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333%}.col-lg-5{width:41.66667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333%}.col-lg-8{width:66.66667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333%}.col-lg-11{width:91.66667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333%}.col-lg-pull-2{right:16.66667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333%}.col-lg-pull-5{right:41.66667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333%}.col-lg-pull-8{right:66.66667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333%}.col-lg-pull-11{right:91.66667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333%}.col-lg-push-2{left:16.66667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333%}.col-lg-push-5{left:41.66667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333%}.col-lg-push-8{left:66.66667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333%}.col-lg-push-11{left:91.66667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0%}.col-lg-offset-1{margin-left:8.33333%}.col-lg-offset-2{margin-left:16.66667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333%}.col-lg-offset-5{margin-left:41.66667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333%}.col-lg-offset-8{margin-left:66.66667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333%}.col-lg-offset-11{margin-left:91.66667%}.col-lg-offset-12{margin-left:100%}}@media (min-width: 1200px){.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12{float:left}.col-xl-1{width:8.33333%}.col-xl-2{width:16.66667%}.col-xl-3{width:25%}.col-xl-4{width:33.33333%}.col-xl-5{width:41.66667%}.col-xl-6{width:50%}.col-xl-7{width:58.33333%}.col-xl-8{width:66.66667%}.col-xl-9{width:75%}.col-xl-10{width:83.33333%}.col-xl-11{width:91.66667%}.col-xl-12{width:100%}.col-xl-pull-0{right:auto}.col-xl-pull-1{right:8.33333%}.col-xl-pull-2{right:16.66667%}.col-xl-pull-3{right:25%}.col-xl-pull-4{right:33.33333%}.col-xl-pull-5{right:41.66667%}.col-xl-pull-6{right:50%}.col-xl-pull-7{right:58.33333%}.col-xl-pull-8{right:66.66667%}.col-xl-pull-9{right:75%}.col-xl-pull-10{right:83.33333%}.col-xl-pull-11{right:91.66667%}.col-xl-pull-12{right:100%}.col-xl-push-0{left:auto}.col-xl-push-1{left:8.33333%}.col-xl-push-2{left:16.66667%}.col-xl-push-3{left:25%}.col-xl-push-4{left:33.33333%}.col-xl-push-5{left:41.66667%}.col-xl-push-6{left:50%}.col-xl-push-7{left:58.33333%}.col-xl-push-8{left:66.66667%}.col-xl-push-9{left:75%}.col-xl-push-10{left:83.33333%}.col-xl-push-11{left:91.66667%}.col-xl-push-12{left:100%}.col-xl-offset-0{margin-left:0%}.col-xl-offset-1{margin-left:8.33333%}.col-xl-offset-2{margin-left:16.66667%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-4{margin-left:33.33333%}.col-xl-offset-5{margin-left:41.66667%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-7{margin-left:58.33333%}.col-xl-offset-8{margin-left:66.66667%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-10{margin-left:83.33333%}.col-xl-offset-11{margin-left:91.66667%}.col-xl-offset-12{margin-left:100%}}.table,section.flipflop table{width:100%;max-width:100%;margin-bottom:1rem}.table th,section.flipflop table th,.table td,section.flipflop table td{padding:0.75rem;line-height:1.5;vertical-align:top;border-top:1px solid #eceeef}.table thead th,section.flipflop table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.table tbody+tbody,section.flipflop table tbody+tbody{border-top:2px solid #eceeef}.table .table,section.flipflop table .table,.table section.flipflop table,section.flipflop .table table,section.flipflop table table{background-color:#fff}.table-sm th,.table-sm td{padding:0.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered th,.table-bordered td{border:1px solid #eceeef}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd),section.flipflop table tbody tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover tbody tr:hover{background-color:#f5f5f5}.table-active,.table-active>th,.table-active>td{background-color:#f5f5f5}.table-hover .table-active:hover{background-color:#e8e8e8}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#e8e8e8}.table-success,.table-success>th,.table-success>td{background-color:#dff0d8}.table-hover .table-success:hover{background-color:#d0e9c6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#d0e9c6}.table-info,.table-info>th,.table-info>td{background-color:#d9edf7}.table-hover .table-info:hover{background-color:#c4e3f3}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c4e3f3}.table-warning,.table-warning>th,.table-warning>td{background-color:#fcf8e3}.table-hover .table-warning:hover{background-color:#faf2cc}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#faf2cc}.table-danger,.table-danger>th,.table-danger>td{background-color:#f2dede}.table-hover .table-danger:hover{background-color:#ebcccc}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ebcccc}.table-responsive{display:block;width:100%;min-height:0.01%;overflow-x:auto}.thead-inverse th,section.flipflop table thead th{color:#fff;background-color:#373a3c}.thead-default th{color:#55595c;background-color:#eceeef}.table-inverse{color:#eceeef;background-color:#373a3c}.table-inverse.table-bordered{border:0}.table-inverse th,.table-inverse td,.table-inverse thead th{border-color:#55595c}.table-reflow thead{float:left}.table-reflow tbody{display:block;white-space:nowrap}.table-reflow th,.table-reflow td{border-top:1px solid #eceeef;border-left:1px solid #eceeef}.table-reflow th:last-child,.table-reflow td:last-child{border-right:1px solid #eceeef}.table-reflow thead:last-child tr:last-child th,.table-reflow thead:last-child tr:last-child td,.table-reflow tbody:last-child tr:last-child th,.table-reflow tbody:last-child tr:last-child td,.table-reflow tfoot:last-child tr:last-child th,.table-reflow tfoot:last-child tr:last-child td{border-bottom:1px solid #eceeef}.table-reflow tr{float:left}.table-reflow tr th,.table-reflow tr td{display:block !important;border:1px solid #eceeef}.btn,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]{display:inline-block;font-weight:normal;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;user-select:none;border:1px solid transparent;padding:0.375rem 1rem;font-size:1rem;line-height:1.5;border-radius:0.25rem;transition:all 0.2s ease-in-out}.btn:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:focus,.btn.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.focus[type=submit],.btn:active:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active:focus,.btn:active.focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active.focus,.btn.active:focus,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]:focus,.btn.active.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.active.focus[type=submit]{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:focus,.btn:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:hover{text-decoration:none}.btn.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.focus[type=submit]{text-decoration:none}.btn:active,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active,.btn.active,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]{background-image:none;outline:0}.btn.disabled,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled[type=submit],.btn:disabled,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:disabled{cursor:not-allowed;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:hover{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:focus,.btn-primary.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.focus[type=submit].active{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary:active,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:active,.btn-primary.active,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit],.open>.btn-primary.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle[type=submit].active{color:#fff;background-color:#025aa5;border-color:#01549b;background-image:none}.btn-primary:active:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:active:hover,.btn-primary:active:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:active:focus,.btn-primary:active.focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:active.focus,.btn-primary.active:hover,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]:hover,.btn-primary.active:focus,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]:focus,.btn-primary.active.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.active.focus[type=submit],.open>.btn-primary.dropdown-toggle:hover,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle[type=submit].active:hover,.open>.btn-primary.dropdown-toggle:focus,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle[type=submit].active:focus,.open>.btn-primary.dropdown-toggle.focus,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle.focus[type=submit].active{color:#fff;background-color:#014682;border-color:#01315a}.btn-primary.disabled:focus,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled[type=submit].active:focus,.btn-primary.disabled.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled.focus[type=submit].active,.btn-primary:disabled:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:disabled:focus,.btn-primary:disabled.focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:disabled.focus{background-color:#0275d8;border-color:#0275d8}.btn-primary.disabled:hover,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled[type=submit].active:hover,.btn-primary:disabled:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:disabled:hover{background-color:#0275d8;border-color:#0275d8}.btn-secondary,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:not(.active){color:#373a3c;background-color:#fff;border-color:#ccc}.btn-secondary:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:hover:not(.active){color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:focus:not(.active),.btn-secondary.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.focus[type=submit]:not(.active){color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:active,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active:not(.active),.btn-secondary.active,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]:not(.active),.open>.btn-secondary.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle[type=submit]:not(.active){color:#373a3c;background-color:#e6e6e6;border-color:#adadad;background-image:none}.btn-secondary:active:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active:hover:not(.active),.btn-secondary:active:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active:focus:not(.active),.btn-secondary:active.focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active.focus:not(.active),.btn-secondary.active:hover,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]:hover:not(.active),.btn-secondary.active:focus,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]:focus:not(.active),.btn-secondary.active.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.active.focus[type=submit]:not(.active),.open>.btn-secondary.dropdown-toggle:hover,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle[type=submit]:hover:not(.active),.open>.btn-secondary.dropdown-toggle:focus,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle[type=submit]:focus:not(.active),.open>.btn-secondary.dropdown-toggle.focus,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle.focus[type=submit]:not(.active){color:#373a3c;background-color:#d4d4d4;border-color:#8c8c8c}.btn-secondary.disabled:focus,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled[type=submit]:focus:not(.active),.btn-secondary.disabled.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled.focus[type=submit]:not(.active),.btn-secondary:disabled:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:disabled:focus:not(.active),.btn-secondary:disabled.focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:disabled.focus:not(.active){background-color:#fff;border-color:#ccc}.btn-secondary.disabled:hover,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled[type=submit]:hover:not(.active),.btn-secondary:disabled:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:disabled:hover:not(.active){background-color:#fff;border-color:#ccc}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#2aabd2;background-image:none}.btn-info:active:hover,.btn-info:active:focus,.btn-info:active.focus,.btn-info.active:hover,.btn-info.active:focus,.btn-info.active.focus,.open>.btn-info.dropdown-toggle:hover,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info:disabled:focus,.btn-info:disabled.focus{background-color:#5bc0de;border-color:#5bc0de}.btn-info.disabled:hover,.btn-info:disabled:hover{background-color:#5bc0de;border-color:#5bc0de}.btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#419641}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#419641;background-image:none}.btn-success:active:hover,.btn-success:active:focus,.btn-success:active.focus,.btn-success.active:hover,.btn-success.active:focus,.btn-success.active.focus,.open>.btn-success.dropdown-toggle:hover,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success:disabled:focus,.btn-success:disabled.focus{background-color:#5cb85c;border-color:#5cb85c}.btn-success.disabled:hover,.btn-success:disabled:hover{background-color:#5cb85c;border-color:#5cb85c}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#eb9316;background-image:none}.btn-warning:active:hover,.btn-warning:active:focus,.btn-warning:active.focus,.btn-warning.active:hover,.btn-warning.active:focus,.btn-warning.active.focus,.open>.btn-warning.dropdown-toggle:hover,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning:disabled:focus,.btn-warning:disabled.focus{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.disabled:hover,.btn-warning:disabled:hover{background-color:#f0ad4e;border-color:#f0ad4e}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;border-color:#c12e2a;background-image:none}.btn-danger:active:hover,.btn-danger:active:focus,.btn-danger:active.focus,.btn-danger.active:hover,.btn-danger.active:focus,.btn-danger.active.focus,.open>.btn-danger.dropdown-toggle:hover,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle.focus{color:#fff;background-color:#ac2925;border-color:#8b211e}.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger:disabled:focus,.btn-danger:disabled.focus{background-color:#d9534f;border-color:#d9534f}.btn-danger.disabled:hover,.btn-danger:disabled:hover{background-color:#d9534f;border-color:#d9534f}.btn-primary-outline{color:#0275d8;background-image:none;background-color:transparent;border-color:#0275d8}.btn-primary-outline:focus,.btn-primary-outline.focus,.btn-primary-outline:active,.btn-primary-outline.active,.open>.btn-primary-outline.dropdown-toggle{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary-outline:hover{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary-outline.disabled:focus,.btn-primary-outline.disabled.focus,.btn-primary-outline:disabled:focus,.btn-primary-outline:disabled.focus{border-color:#43a7fd}.btn-primary-outline.disabled:hover,.btn-primary-outline:disabled:hover{border-color:#43a7fd}.btn-secondary-outline{color:#ccc;background-image:none;background-color:transparent;border-color:#ccc}.btn-secondary-outline:focus,.btn-secondary-outline.focus,.btn-secondary-outline:active,.btn-secondary-outline.active,.open>.btn-secondary-outline.dropdown-toggle{color:#fff;background-color:#ccc;border-color:#ccc}.btn-secondary-outline:hover{color:#fff;background-color:#ccc;border-color:#ccc}.btn-secondary-outline.disabled:focus,.btn-secondary-outline.disabled.focus,.btn-secondary-outline:disabled:focus,.btn-secondary-outline:disabled.focus{border-color:white}.btn-secondary-outline.disabled:hover,.btn-secondary-outline:disabled:hover{border-color:white}.btn-info-outline{color:#5bc0de;background-image:none;background-color:transparent;border-color:#5bc0de}.btn-info-outline:focus,.btn-info-outline.focus,.btn-info-outline:active,.btn-info-outline.active,.open>.btn-info-outline.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info-outline:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info-outline.disabled:focus,.btn-info-outline.disabled.focus,.btn-info-outline:disabled:focus,.btn-info-outline:disabled.focus{border-color:#b0e1ef}.btn-info-outline.disabled:hover,.btn-info-outline:disabled:hover{border-color:#b0e1ef}.btn-success-outline{color:#5cb85c;background-image:none;background-color:transparent;border-color:#5cb85c}.btn-success-outline:focus,.btn-success-outline.focus,.btn-success-outline:active,.btn-success-outline.active,.open>.btn-success-outline.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success-outline:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success-outline.disabled:focus,.btn-success-outline.disabled.focus,.btn-success-outline:disabled:focus,.btn-success-outline:disabled.focus{border-color:#a3d7a3}.btn-success-outline.disabled:hover,.btn-success-outline:disabled:hover{border-color:#a3d7a3}.btn-warning-outline{color:#f0ad4e;background-image:none;background-color:transparent;border-color:#f0ad4e}.btn-warning-outline:focus,.btn-warning-outline.focus,.btn-warning-outline:active,.btn-warning-outline.active,.open>.btn-warning-outline.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning-outline:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning-outline.disabled:focus,.btn-warning-outline.disabled.focus,.btn-warning-outline:disabled:focus,.btn-warning-outline:disabled.focus{border-color:#f8d9ac}.btn-warning-outline.disabled:hover,.btn-warning-outline:disabled:hover{border-color:#f8d9ac}.btn-danger-outline{color:#d9534f;background-image:none;background-color:transparent;border-color:#d9534f}.btn-danger-outline:focus,.btn-danger-outline.focus,.btn-danger-outline:active,.btn-danger-outline.active,.open>.btn-danger-outline.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger-outline:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger-outline.disabled:focus,.btn-danger-outline.disabled.focus,.btn-danger-outline:disabled:focus,.btn-danger-outline:disabled.focus{border-color:#eba5a3}.btn-danger-outline.disabled:hover,.btn-danger-outline:disabled:hover{border-color:#eba5a3}.btn-link{font-weight:normal;color:#0275d8;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#014c8c;text-decoration:underline;background-color:transparent}.btn-link:disabled:focus,.btn-link:disabled:hover{color:#818a91;text-decoration:none}.btn-lg,.btn-group-lg>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-lg>input[type=submit]{padding:0.75rem 1.25rem;font-size:1.25rem;line-height:1.33333;border-radius:0.3rem}.btn-sm,.btn-group-sm>.btn,section.flipflop table tbody td.toggle div.toolbar div.group>.btn,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]{padding:0.25rem 0.75rem;font-size:0.875rem;line-height:1.5;border-radius:0.2rem}.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%}.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,section.flipflop table tbody td.toggle div.toolbar div.group>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit],.btn-group-vertical>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]{position:relative;float:left}.btn-group>.btn:focus,section.flipflop table tbody td.toggle div.toolbar div.group>.btn:focus,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:focus,section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]:focus,.btn-group>.btn:active,section.flipflop table tbody td.toggle div.toolbar div.group>.btn:active,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:active,section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]:active,.btn-group>.btn.active,section.flipflop table tbody td.toggle div.toolbar div.group>.btn.active,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input.active[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group>input.active[type=submit],.btn-group-vertical>.btn:focus,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]:focus,.btn-group-vertical>.btn:active,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]:active,.btn-group-vertical>.btn.active,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input.active[type=submit]{z-index:2}.btn-group>.btn:hover,section.flipflop table tbody td.toggle div.toolbar div.group>.btn:hover,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:hover,section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]:hover,.btn-group-vertical>.btn:hover,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]:hover{z-index:2}.btn-group .btn+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group input[type=submit]+.btn,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group .btn+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group .btn+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group .btn-group input[type=submit]+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]+input[type=submit],.btn-group .btn+.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group .btn+.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group input[type=submit]+.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]+.btn-group,.btn-group section.flipflop table tbody td.toggle div.toolbar .btn+div.group,section.flipflop table tbody td.toggle div.toolbar .btn-group .btn+div.group,section.flipflop table tbody td.toggle div.toolbar div.group .btn+div.group,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group input[type=submit]+div.group,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]+div.group,.btn-group .btn-group+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group+.btn,.btn-group section.flipflop table tbody td.toggle div.toolbar div.group+.btn,section.flipflop table tbody td.toggle div.toolbar .btn-group div.group+.btn,section.flipflop table tbody td.toggle div.toolbar div.group div.group+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group .btn-group+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group .btn-group+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group .btn-group div.group+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group div.group+input[type=submit],.btn-group .btn-group+.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group+.btn-group,.btn-group section.flipflop table tbody td.toggle div.toolbar div.group+.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group div.group+.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group div.group+.btn-group,.btn-group section.flipflop table tbody td.toggle div.toolbar .btn-group+div.group,section.flipflop table tbody td.toggle div.toolbar .btn-group .btn-group+div.group,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group+div.group,.btn-group section.flipflop table tbody td.toggle div.toolbar div.group+div.group,section.flipflop table tbody td.toggle div.toolbar .btn-group div.group+div.group,section.flipflop table tbody td.toggle div.toolbar div.group div.group+div.group{margin-left:-1px}.btn-toolbar,section.flipflop table tbody td.toggle div.toolbar{margin-left:-5px}.btn-toolbar::after,section.flipflop table tbody td.toggle div.toolbar::after{content:"";display:table;clear:both}.btn-toolbar .btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group,section.flipflop table tbody td.toggle div.toolbar div.group,.btn-toolbar .input-group,section.flipflop table tbody td.toggle div.toolbar .input-group{float:left}.btn-toolbar>.btn,section.flipflop table tbody td.toggle div.toolbar>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-toolbar>input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group div.toolbar>input[type=submit],.btn-toolbar>.btn-group,section.flipflop table tbody td.toggle div.toolbar>.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-toolbar>div.group,section.flipflop table tbody td.toggle div.toolbar>div.group,.btn-toolbar>.input-group,section.flipflop table tbody td.toggle div.toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle),section.flipflop table tbody td.toggle div.toolbar div.group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle),section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:not(:first-child):not(:last-child):not(.dropdown-toggle),section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child,section.flipflop table tbody td.toggle div.toolbar div.group>.btn:first-child,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:first-child,section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle),section.flipflop table tbody td.toggle div.toolbar div.group>.btn:first-child:not(:last-child):not(.dropdown-toggle),section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:first-child:not(:last-child):not(.dropdown-toggle),section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]: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),section.flipflop table tbody td.toggle div.toolbar div.group>.btn:last-child:not(:first-child),section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:last-child:not(:first-child),section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child),section.flipflop table tbody td.toggle div.toolbar div.group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group,section.flipflop table tbody td.toggle div.toolbar div.group>div.group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody td.toggle div.toolbar div.group>div.group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>.btn-group:not(:first-child):not(:last-child)>input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:not(:first-child):not(:last-child)>input[type=submit],section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:not(:first-child):not(:last-child)>input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group>div.group:not(:first-child):not(:last-child)>input[type=submit]{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody td.toggle div.toolbar div.group>div.group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>.btn-group:first-child:not(:last-child)>input[type=submit]:last-child,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:first-child:not(:last-child)>input[type=submit]:last-child,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:first-child:not(:last-child)>input[type=submit]:last-child,section.flipflop table tbody td.toggle div.toolbar div.group>div.group:first-child:not(:last-child)>input[type=submit]:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:first-child:not(:last-child)>.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group>div.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,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody td.toggle div.toolbar div.group>div.group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>.btn-group:last-child:not(:first-child)>input[type=submit]:first-child,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:last-child:not(:first-child)>input[type=submit]:first-child,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:last-child:not(:first-child)>input[type=submit]:first-child,section.flipflop table tbody td.toggle div.toolbar div.group>div.group:last-child:not(:first-child)>input[type=submit]:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,section.flipflop table tbody td.toggle div.toolbar div.group .dropdown-toggle:active,.btn-group.open .dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.open.group .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group>.btn+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.btn-group-lg.group>.btn+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-lg.btn-group>input[type=submit]+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group div.btn-group-lg.group>input[type=submit]+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn .caret,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit] .caret{margin-left:0}.btn-lg .caret,.btn-group-lg>.btn .caret,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-lg>input[type=submit] .caret{border-width:0.3em 0.3em 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .caret,.dropup section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-lg>input[type=submit] .caret,section.flipflop table tbody td.toggle div.toolbar div.group .dropup .btn-group-lg>input[type=submit] .caret{border-width:0 0.3em 0.3em}.btn-group-vertical>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit],.btn-group-vertical>.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group,.btn-group-vertical>.btn-group>.btn,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn-group>input[type=submit],section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group>input[type=submit]{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group::after,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group::after{content:"";display:table;clear:both}.btn-group-vertical>.btn-group>.btn,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn-group>input[type=submit],section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group>input[type=submit]{float:none}.btn-group-vertical>.btn+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]+input[type=submit],.btn-group-vertical>.btn+.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]+.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>.btn+div.group,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]+div.group,.btn-group-vertical>.btn-group+.btn,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn-group+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>div.group+input[type=submit],.btn-group-vertical>.btn-group+.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group+.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>.btn-group+div.group,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group+div.group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child),section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]:first-child:not(:last-child){border-top-right-radius:0.25rem;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child),section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]:last-child:not(:first-child){border-bottom-left-radius:0.25rem;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>input[type=submit],section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group:not(:first-child):not(:last-child)>input[type=submit]{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn-group:first-child:not(:last-child)>input[type=submit]:last-child,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group:first-child:not(:last-child)>input[type=submit]:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.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,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn-group:last-child:not(:first-child)>input[type=submit]:first-child,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group:last-child:not(:first-child)>input[type=submit]:first-child{border-top-right-radius:0;border-top-left-radius:0}[data-toggle="buttons"]>.btn input[type="radio"],section.flipflop table tbody td.toggle div.toolbar div.group [data-toggle="buttons"]>input[type=submit] input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],section.flipflop table tbody td.toggle div.toolbar div.group [data-toggle="buttons"]>input[type=submit] input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],section.flipflop table tbody td.toggle div.toolbar [data-toggle="buttons"]>div.group>.btn input[type="radio"],section.flipflop table tbody td.toggle div.toolbar div.group [data-toggle="buttons"]>.btn-group>input[type=submit] input[type="radio"],section.flipflop table tbody td.toggle div.toolbar [data-toggle="buttons"]>div.group>input[type=submit] input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"],section.flipflop table tbody td.toggle div.toolbar [data-toggle="buttons"]>div.group>.btn input[type="checkbox"],section.flipflop table tbody td.toggle div.toolbar div.group [data-toggle="buttons"]>.btn-group>input[type=submit] input[type="checkbox"],section.flipflop table tbody td.toggle div.toolbar [data-toggle="buttons"]>div.group>input[type=submit] input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.label,section.flipflop table tbody td.status span{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:0.25rem}.label:empty,section.flipflop table tbody td.status span:empty{display:none}.btn .label,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit] .label,.btn section.flipflop table tbody td.status span,section.flipflop table tbody td.status .btn span,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit] td.status span,section.flipflop table tbody td.status td.toggle div.toolbar div.group input[type=submit] span{position:relative;top:-1px}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label-pill,section.flipflop table tbody td.status span{padding-right:.6em;padding-left:.6em;border-radius:10rem}.label-default,section.flipflop table tbody td.status span.off{background-color:#818a91}.label-default[href]:focus,section.flipflop table tbody td.status span[href].off:focus,.label-default[href]:hover,section.flipflop table tbody td.status span[href].off:hover{background-color:#687077}.label-primary{background-color:#0275d8}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#025aa5}.label-success,section.flipflop table tbody td.status span.on{background-color:#5cb85c}.label-success[href]:focus,section.flipflop table tbody td.status span[href].on:focus,.label-success[href]:hover,section.flipflop table tbody td.status span[href].on:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}section.flipflop{margin:5rem 0 0}section.flipflop table thead th{position:relative;cursor:default}section.flipflop table thead th[data-tooltip]:before,section.flipflop table thead th[data-tooltip]:after{transition:all 0.2s ease-out;transform:translateY(0.2rem) translateZ(0);opacity:0;display:block;position:absolute}section.flipflop table thead th[data-tooltip]:before{content:attr(data-tooltip);width:98%;left:0;bottom:3.75rem;margin:0;padding:0.5rem 0.75rem;background:#55595c;border-radius:0.2rem;font-size:0.875rem;font-weight:normal;pointer-events:none}section.flipflop table thead th[data-tooltip]:after{content:" ";width:0;height:0;left:1rem;bottom:3.25rem;border-left:solid transparent 0.5rem;border-right:solid transparent 0.5rem;border-top:solid #55595c 0.5rem}section.flipflop table thead th:hover[data-tooltip]:before,section.flipflop table thead th:hover[data-tooltip]:after{transform:translateY(0) translateZ(0);opacity:1}section.flipflop table tbody td.status{width:2rem;font-size:1.1rem}section.flipflop table tbody td.status span{width:2rem}section.flipflop table tbody td.name{min-width:11rem;padding-top:0.9rem;font-weight:bold}section.flipflop table tbody td.description{min-width:11rem;padding-top:0.9rem}section.flipflop table tbody td.toggle{min-width:11rem}section.flipflop table tbody td.toggle div.toolbar{margin-left:0}
1
+ /*! 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{outline:0}a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;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:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*,*::before,*::after{text-shadow:none !important;box-shadow:none !important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}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,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]>.caret,.dropup>.btn>.caret,section.flipflop table tbody td.toggle div.toolbar div.group .dropup>input[type=submit]>.caret{border-top-color:#000 !important}.label,section.flipflop table tbody td.status span{border:1px solid #000}.table,section.flipflop table{border-collapse:collapse !important}.table td,section.flipflop table td,.table th,section.flipflop table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}@-moz-viewport{width:device-width}@-ms-viewport{width:device-width}@-o-viewport{width:device-width}@-webkit-viewport{width:device-width}@viewport{width:device-width}html{font-size:16px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;font-size:1rem;line-height:1.5;color:#373a3c;background-color:#fff}[tabindex="-1"]:focus{outline:none !important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #818a91}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:bold}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#0275d8;text-decoration:none}a:focus,a:hover{color:#014c8c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}pre{margin-top:0;margin-bottom:1rem}figure{margin:0 0 1rem}img{vertical-align:middle}[role="button"]{cursor:pointer}a,area,button,[role="button"],input,label,select,summary,textarea{touch-action:manipulation}table{background-color:transparent}caption{padding-top:0.75rem;padding-bottom:0.75rem;color:#818a91;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,textarea{margin:0;line-height:inherit;border-radius:0}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type="search"]{box-sizing:inherit;-webkit-appearance:none}output{display:inline-block}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:0.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}.h1{font-size:2.5rem}.h2{font-size:2rem}.h3{font-size:1.75rem}.h4{font-size:1.5rem}.h5{font-size:1.25rem}.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300}.display-2{font-size:5.5rem;font-weight:300}.display-3{font-size:4.5rem;font-weight:300}.display-4{font-size:3.5rem;font-weight:300}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:normal}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.dl-horizontal{margin-right:-1.875rem;margin-left:-1.875rem}.dl-horizontal::after{content:"";display:table;clear:both}.initialism{font-size:90%;text-transform:uppercase}.blockquote{padding:0.5rem 1rem;margin-bottom:1rem;font-size:1.25rem;border-left:0.25rem solid #eceeef}.blockquote-footer{display:block;font-size:80%;line-height:1.5;color:#818a91}.blockquote-footer::before{content:"\2014 \00A0"}.blockquote-reverse{padding-right:1rem;padding-left:0;text-align:right;border-right:0.25rem solid #eceeef;border-left:0}.blockquote-reverse .blockquote-footer::before{content:""}.blockquote-reverse .blockquote-footer::after{content:"\00A0 \2014"}.table,section.flipflop table{width:100%;max-width:100%;margin-bottom:1rem}.table th,section.flipflop table th,.table td,section.flipflop table td{padding:0.75rem;line-height:1.5;vertical-align:top;border-top:1px solid #eceeef}.table thead th,section.flipflop table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.table tbody+tbody,section.flipflop table tbody+tbody{border-top:2px solid #eceeef}.table .table,section.flipflop table .table,.table section.flipflop table,section.flipflop .table table,section.flipflop table table{background-color:#fff}.table-sm th,.table-sm td{padding:0.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered th,.table-bordered td{border:1px solid #eceeef}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd),section.flipflop table tbody tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover tbody tr:hover{background-color:#f5f5f5}.table-active,.table-active>th,.table-active>td{background-color:#f5f5f5}.table-hover .table-active:hover{background-color:#e8e8e8}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#e8e8e8}.table-success,.table-success>th,.table-success>td{background-color:#dff0d8}.table-hover .table-success:hover{background-color:#d0e9c6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#d0e9c6}.table-info,.table-info>th,.table-info>td{background-color:#d9edf7}.table-hover .table-info:hover{background-color:#c4e3f3}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c4e3f3}.table-warning,.table-warning>th,.table-warning>td{background-color:#fcf8e3}.table-hover .table-warning:hover{background-color:#faf2cc}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#faf2cc}.table-danger,.table-danger>th,.table-danger>td{background-color:#f2dede}.table-hover .table-danger:hover{background-color:#ebcccc}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ebcccc}.table-responsive{display:block;width:100%;min-height:0.01%;overflow-x:auto}.thead-inverse th,section.flipflop table thead th{color:#fff;background-color:#373a3c}.thead-default th{color:#55595c;background-color:#eceeef}.table-inverse{color:#eceeef;background-color:#373a3c}.table-inverse.table-bordered{border:0}.table-inverse th,.table-inverse td,.table-inverse thead th{border-color:#55595c}.table-reflow thead{float:left}.table-reflow tbody{display:block;white-space:nowrap}.table-reflow th,.table-reflow td{border-top:1px solid #eceeef;border-left:1px solid #eceeef}.table-reflow th:last-child,.table-reflow td:last-child{border-right:1px solid #eceeef}.table-reflow thead:last-child tr:last-child th,.table-reflow thead:last-child tr:last-child td,.table-reflow tbody:last-child tr:last-child th,.table-reflow tbody:last-child tr:last-child td,.table-reflow tfoot:last-child tr:last-child th,.table-reflow tfoot:last-child tr:last-child td{border-bottom:1px solid #eceeef}.table-reflow tr{float:left}.table-reflow tr th,.table-reflow tr td{display:block !important;border:1px solid #eceeef}.btn,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]{display:inline-block;font-weight:normal;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;user-select:none;border:1px solid transparent;padding:0.375rem 1rem;font-size:1rem;line-height:1.5;border-radius:0.25rem;transition:all 0.2s ease-in-out}.btn:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:focus,.btn.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.focus[type=submit],.btn:active:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active:focus,.btn:active.focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active.focus,.btn.active:focus,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]:focus,.btn.active.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.active.focus[type=submit]{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:focus,.btn:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:hover{text-decoration:none}.btn.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.focus[type=submit]{text-decoration:none}.btn:active,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active,.btn.active,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]{background-image:none;outline:0}.btn.disabled,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled[type=submit],.btn:disabled,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:disabled{cursor:not-allowed;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:hover{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:focus,.btn-primary.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.focus[type=submit].active{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary:active,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:active,.btn-primary.active,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit],.open>.btn-primary.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle[type=submit].active{color:#fff;background-color:#025aa5;border-color:#01549b;background-image:none}.btn-primary:active:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:active:hover,.btn-primary:active:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:active:focus,.btn-primary:active.focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:active.focus,.btn-primary.active:hover,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]:hover,.btn-primary.active:focus,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]:focus,.btn-primary.active.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.active.focus[type=submit],.open>.btn-primary.dropdown-toggle:hover,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle[type=submit].active:hover,.open>.btn-primary.dropdown-toggle:focus,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle[type=submit].active:focus,.open>.btn-primary.dropdown-toggle.focus,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle.focus[type=submit].active{color:#fff;background-color:#014682;border-color:#01315a}.btn-primary.disabled:focus,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled[type=submit].active:focus,.btn-primary.disabled.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled.focus[type=submit].active,.btn-primary:disabled:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:disabled:focus,.btn-primary:disabled.focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:disabled.focus{background-color:#0275d8;border-color:#0275d8}.btn-primary.disabled:hover,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled[type=submit].active:hover,.btn-primary:disabled:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit].active:disabled:hover{background-color:#0275d8;border-color:#0275d8}.btn-secondary,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:not(.active){color:#373a3c;background-color:#fff;border-color:#ccc}.btn-secondary:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:hover:not(.active){color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:focus:not(.active),.btn-secondary.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.focus[type=submit]:not(.active){color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:active,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active:not(.active),.btn-secondary.active,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]:not(.active),.open>.btn-secondary.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle[type=submit]:not(.active){color:#373a3c;background-color:#e6e6e6;border-color:#adadad;background-image:none}.btn-secondary:active:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active:hover:not(.active),.btn-secondary:active:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active:focus:not(.active),.btn-secondary:active.focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:active.focus:not(.active),.btn-secondary.active:hover,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]:hover:not(.active),.btn-secondary.active:focus,section.flipflop table tbody td.toggle div.toolbar div.group input.active[type=submit]:focus:not(.active),.btn-secondary.active.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.active.focus[type=submit]:not(.active),.open>.btn-secondary.dropdown-toggle:hover,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle[type=submit]:hover:not(.active),.open>.btn-secondary.dropdown-toggle:focus,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle[type=submit]:focus:not(.active),.open>.btn-secondary.dropdown-toggle.focus,section.flipflop table tbody td.toggle div.toolbar div.group .open>input.dropdown-toggle.focus[type=submit]:not(.active){color:#373a3c;background-color:#d4d4d4;border-color:#8c8c8c}.btn-secondary.disabled:focus,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled[type=submit]:focus:not(.active),.btn-secondary.disabled.focus,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled.focus[type=submit]:not(.active),.btn-secondary:disabled:focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:disabled:focus:not(.active),.btn-secondary:disabled.focus,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:disabled.focus:not(.active){background-color:#fff;border-color:#ccc}.btn-secondary.disabled:hover,section.flipflop table tbody td.toggle div.toolbar div.group input.disabled[type=submit]:hover:not(.active),.btn-secondary:disabled:hover,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]:disabled:hover:not(.active){background-color:#fff;border-color:#ccc}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#2aabd2;background-image:none}.btn-info:active:hover,.btn-info:active:focus,.btn-info:active.focus,.btn-info.active:hover,.btn-info.active:focus,.btn-info.active.focus,.open>.btn-info.dropdown-toggle:hover,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info:disabled:focus,.btn-info:disabled.focus{background-color:#5bc0de;border-color:#5bc0de}.btn-info.disabled:hover,.btn-info:disabled:hover{background-color:#5bc0de;border-color:#5bc0de}.btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#419641}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#419641;background-image:none}.btn-success:active:hover,.btn-success:active:focus,.btn-success:active.focus,.btn-success.active:hover,.btn-success.active:focus,.btn-success.active.focus,.open>.btn-success.dropdown-toggle:hover,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success:disabled:focus,.btn-success:disabled.focus{background-color:#5cb85c;border-color:#5cb85c}.btn-success.disabled:hover,.btn-success:disabled:hover{background-color:#5cb85c;border-color:#5cb85c}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#eb9316;background-image:none}.btn-warning:active:hover,.btn-warning:active:focus,.btn-warning:active.focus,.btn-warning.active:hover,.btn-warning.active:focus,.btn-warning.active.focus,.open>.btn-warning.dropdown-toggle:hover,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning:disabled:focus,.btn-warning:disabled.focus{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.disabled:hover,.btn-warning:disabled:hover{background-color:#f0ad4e;border-color:#f0ad4e}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;border-color:#c12e2a;background-image:none}.btn-danger:active:hover,.btn-danger:active:focus,.btn-danger:active.focus,.btn-danger.active:hover,.btn-danger.active:focus,.btn-danger.active.focus,.open>.btn-danger.dropdown-toggle:hover,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle.focus{color:#fff;background-color:#ac2925;border-color:#8b211e}.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger:disabled:focus,.btn-danger:disabled.focus{background-color:#d9534f;border-color:#d9534f}.btn-danger.disabled:hover,.btn-danger:disabled:hover{background-color:#d9534f;border-color:#d9534f}.btn-primary-outline{color:#0275d8;background-image:none;background-color:transparent;border-color:#0275d8}.btn-primary-outline:focus,.btn-primary-outline.focus,.btn-primary-outline:active,.btn-primary-outline.active,.open>.btn-primary-outline.dropdown-toggle{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary-outline:hover{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary-outline.disabled:focus,.btn-primary-outline.disabled.focus,.btn-primary-outline:disabled:focus,.btn-primary-outline:disabled.focus{border-color:#43a7fd}.btn-primary-outline.disabled:hover,.btn-primary-outline:disabled:hover{border-color:#43a7fd}.btn-secondary-outline{color:#ccc;background-image:none;background-color:transparent;border-color:#ccc}.btn-secondary-outline:focus,.btn-secondary-outline.focus,.btn-secondary-outline:active,.btn-secondary-outline.active,.open>.btn-secondary-outline.dropdown-toggle{color:#fff;background-color:#ccc;border-color:#ccc}.btn-secondary-outline:hover{color:#fff;background-color:#ccc;border-color:#ccc}.btn-secondary-outline.disabled:focus,.btn-secondary-outline.disabled.focus,.btn-secondary-outline:disabled:focus,.btn-secondary-outline:disabled.focus{border-color:white}.btn-secondary-outline.disabled:hover,.btn-secondary-outline:disabled:hover{border-color:white}.btn-info-outline{color:#5bc0de;background-image:none;background-color:transparent;border-color:#5bc0de}.btn-info-outline:focus,.btn-info-outline.focus,.btn-info-outline:active,.btn-info-outline.active,.open>.btn-info-outline.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info-outline:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info-outline.disabled:focus,.btn-info-outline.disabled.focus,.btn-info-outline:disabled:focus,.btn-info-outline:disabled.focus{border-color:#b0e1ef}.btn-info-outline.disabled:hover,.btn-info-outline:disabled:hover{border-color:#b0e1ef}.btn-success-outline{color:#5cb85c;background-image:none;background-color:transparent;border-color:#5cb85c}.btn-success-outline:focus,.btn-success-outline.focus,.btn-success-outline:active,.btn-success-outline.active,.open>.btn-success-outline.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success-outline:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success-outline.disabled:focus,.btn-success-outline.disabled.focus,.btn-success-outline:disabled:focus,.btn-success-outline:disabled.focus{border-color:#a3d7a3}.btn-success-outline.disabled:hover,.btn-success-outline:disabled:hover{border-color:#a3d7a3}.btn-warning-outline{color:#f0ad4e;background-image:none;background-color:transparent;border-color:#f0ad4e}.btn-warning-outline:focus,.btn-warning-outline.focus,.btn-warning-outline:active,.btn-warning-outline.active,.open>.btn-warning-outline.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning-outline:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning-outline.disabled:focus,.btn-warning-outline.disabled.focus,.btn-warning-outline:disabled:focus,.btn-warning-outline:disabled.focus{border-color:#f8d9ac}.btn-warning-outline.disabled:hover,.btn-warning-outline:disabled:hover{border-color:#f8d9ac}.btn-danger-outline{color:#d9534f;background-image:none;background-color:transparent;border-color:#d9534f}.btn-danger-outline:focus,.btn-danger-outline.focus,.btn-danger-outline:active,.btn-danger-outline.active,.open>.btn-danger-outline.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger-outline:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger-outline.disabled:focus,.btn-danger-outline.disabled.focus,.btn-danger-outline:disabled:focus,.btn-danger-outline:disabled.focus{border-color:#eba5a3}.btn-danger-outline.disabled:hover,.btn-danger-outline:disabled:hover{border-color:#eba5a3}.btn-link{font-weight:normal;color:#0275d8;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#014c8c;text-decoration:underline;background-color:transparent}.btn-link:disabled:focus,.btn-link:disabled:hover{color:#818a91;text-decoration:none}.btn-lg,.btn-group-lg>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-lg>input[type=submit]{padding:0.75rem 1.25rem;font-size:1.25rem;line-height:1.33333;border-radius:0.3rem}.btn-sm,.btn-group-sm>.btn,section.flipflop table tbody td.toggle div.toolbar div.group>.btn,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]{padding:0.25rem 0.75rem;font-size:0.875rem;line-height:1.5;border-radius:0.2rem}.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%}.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,section.flipflop table tbody td.toggle div.toolbar div.group>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit],.btn-group-vertical>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]{position:relative;float:left}.btn-group>.btn:focus,section.flipflop table tbody td.toggle div.toolbar div.group>.btn:focus,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:focus,section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]:focus,.btn-group>.btn:active,section.flipflop table tbody td.toggle div.toolbar div.group>.btn:active,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:active,section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]:active,.btn-group>.btn.active,section.flipflop table tbody td.toggle div.toolbar div.group>.btn.active,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input.active[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group>input.active[type=submit],.btn-group-vertical>.btn:focus,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]:focus,.btn-group-vertical>.btn:active,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]:active,.btn-group-vertical>.btn.active,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input.active[type=submit]{z-index:2}.btn-group>.btn:hover,section.flipflop table tbody td.toggle div.toolbar div.group>.btn:hover,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:hover,section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]:hover,.btn-group-vertical>.btn:hover,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]:hover{z-index:2}.btn-group .btn+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group input[type=submit]+.btn,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group .btn+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group .btn+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group .btn-group input[type=submit]+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]+input[type=submit],.btn-group .btn+.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group .btn+.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group input[type=submit]+.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]+.btn-group,.btn-group section.flipflop table tbody td.toggle div.toolbar .btn+div.group,section.flipflop table tbody td.toggle div.toolbar .btn-group .btn+div.group,section.flipflop table tbody td.toggle div.toolbar div.group .btn+div.group,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group input[type=submit]+div.group,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit]+div.group,.btn-group .btn-group+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group+.btn,.btn-group section.flipflop table tbody td.toggle div.toolbar div.group+.btn,section.flipflop table tbody td.toggle div.toolbar .btn-group div.group+.btn,section.flipflop table tbody td.toggle div.toolbar div.group div.group+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group .btn-group+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group .btn-group+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group .btn-group div.group+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group div.group+input[type=submit],.btn-group .btn-group+.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group+.btn-group,.btn-group section.flipflop table tbody td.toggle div.toolbar div.group+.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group div.group+.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group div.group+.btn-group,.btn-group section.flipflop table tbody td.toggle div.toolbar .btn-group+div.group,section.flipflop table tbody td.toggle div.toolbar .btn-group .btn-group+div.group,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group+div.group,.btn-group section.flipflop table tbody td.toggle div.toolbar div.group+div.group,section.flipflop table tbody td.toggle div.toolbar .btn-group div.group+div.group,section.flipflop table tbody td.toggle div.toolbar div.group div.group+div.group{margin-left:-1px}.btn-toolbar,section.flipflop table tbody td.toggle div.toolbar{margin-left:-5px}.btn-toolbar::after,section.flipflop table tbody td.toggle div.toolbar::after{content:"";display:table;clear:both}.btn-toolbar .btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group,section.flipflop table tbody td.toggle div.toolbar div.group,.btn-toolbar .input-group,section.flipflop table tbody td.toggle div.toolbar .input-group{float:left}.btn-toolbar>.btn,section.flipflop table tbody td.toggle div.toolbar>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-toolbar>input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group div.toolbar>input[type=submit],.btn-toolbar>.btn-group,section.flipflop table tbody td.toggle div.toolbar>.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-toolbar>div.group,section.flipflop table tbody td.toggle div.toolbar>div.group,.btn-toolbar>.input-group,section.flipflop table tbody td.toggle div.toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle),section.flipflop table tbody td.toggle div.toolbar div.group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle),section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:not(:first-child):not(:last-child):not(.dropdown-toggle),section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child,section.flipflop table tbody td.toggle div.toolbar div.group>.btn:first-child,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:first-child,section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle),section.flipflop table tbody td.toggle div.toolbar div.group>.btn:first-child:not(:last-child):not(.dropdown-toggle),section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:first-child:not(:last-child):not(.dropdown-toggle),section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]: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),section.flipflop table tbody td.toggle div.toolbar div.group>.btn:last-child:not(:first-child),section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]:last-child:not(:first-child),section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child),section.flipflop table tbody td.toggle div.toolbar div.group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group,section.flipflop table tbody td.toggle div.toolbar div.group>div.group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody td.toggle div.toolbar div.group>div.group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>.btn-group:not(:first-child):not(:last-child)>input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:not(:first-child):not(:last-child)>input[type=submit],section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:not(:first-child):not(:last-child)>input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group>div.group:not(:first-child):not(:last-child)>input[type=submit]{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody td.toggle div.toolbar div.group>div.group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>.btn-group:first-child:not(:last-child)>input[type=submit]:last-child,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:first-child:not(:last-child)>input[type=submit]:last-child,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:first-child:not(:last-child)>input[type=submit]:last-child,section.flipflop table tbody td.toggle div.toolbar div.group>div.group:first-child:not(:last-child)>input[type=submit]:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:first-child:not(:last-child)>.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group>div.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,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody td.toggle div.toolbar div.group>div.group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>.btn-group:last-child:not(:first-child)>input[type=submit]:first-child,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-group:last-child:not(:first-child)>input[type=submit]:first-child,section.flipflop table tbody td.toggle div.toolbar .btn-group>div.group:last-child:not(:first-child)>input[type=submit]:first-child,section.flipflop table tbody td.toggle div.toolbar div.group>div.group:last-child:not(:first-child)>input[type=submit]:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,section.flipflop table tbody td.toggle div.toolbar div.group .dropdown-toggle:active,.btn-group.open .dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.open.group .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group>.btn+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group>input[type=submit]+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group>input[type=submit]+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.btn-group-lg.group>.btn+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-lg.btn-group>input[type=submit]+.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar div.group div.btn-group-lg.group>input[type=submit]+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn .caret,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit] .caret{margin-left:0}.btn-lg .caret,.btn-group-lg>.btn .caret,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-lg>input[type=submit] .caret{border-width:0.3em 0.3em 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .caret,.dropup section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-lg>input[type=submit] .caret,section.flipflop table tbody td.toggle div.toolbar div.group .dropup .btn-group-lg>input[type=submit] .caret{border-width:0 0.3em 0.3em}.btn-group-vertical>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit],.btn-group-vertical>.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group,.btn-group-vertical>.btn-group>.btn,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn-group>input[type=submit],section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group>input[type=submit]{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group::after,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group::after{content:"";display:table;clear:both}.btn-group-vertical>.btn-group>.btn,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn-group>input[type=submit],section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group>input[type=submit]{float:none}.btn-group-vertical>.btn+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]+input[type=submit],.btn-group-vertical>.btn+.btn-group,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]+.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>.btn+div.group,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]+div.group,.btn-group-vertical>.btn-group+.btn,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group+.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn-group+input[type=submit],section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>div.group+input[type=submit],.btn-group-vertical>.btn-group+.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group+.btn-group,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>.btn-group+div.group,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group+div.group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child),section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]:first-child:not(:last-child){border-top-right-radius:0.25rem;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child),section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>input[type=submit]:last-child:not(:first-child){border-bottom-left-radius:0.25rem;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group:not(:first-child):not(:last-child)>.btn,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>input[type=submit],section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group:not(:first-child):not(:last-child)>input[type=submit]{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group:first-child:not(:last-child)>.btn:last-child,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn-group:first-child:not(:last-child)>input[type=submit]:last-child,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group:first-child:not(:last-child)>input[type=submit]:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.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,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group:last-child:not(:first-child)>.btn:first-child,section.flipflop table tbody td.toggle div.toolbar div.group .btn-group-vertical>.btn-group:last-child:not(:first-child)>input[type=submit]:first-child,section.flipflop table tbody td.toggle div.toolbar .btn-group-vertical>div.group:last-child:not(:first-child)>input[type=submit]:first-child{border-top-right-radius:0;border-top-left-radius:0}[data-toggle="buttons"]>.btn input[type="radio"],section.flipflop table tbody td.toggle div.toolbar div.group [data-toggle="buttons"]>input[type=submit] input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],section.flipflop table tbody td.toggle div.toolbar div.group [data-toggle="buttons"]>input[type=submit] input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],section.flipflop table tbody td.toggle div.toolbar [data-toggle="buttons"]>div.group>.btn input[type="radio"],section.flipflop table tbody td.toggle div.toolbar div.group [data-toggle="buttons"]>.btn-group>input[type=submit] input[type="radio"],section.flipflop table tbody td.toggle div.toolbar [data-toggle="buttons"]>div.group>input[type=submit] input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"],section.flipflop table tbody td.toggle div.toolbar [data-toggle="buttons"]>div.group>.btn input[type="checkbox"],section.flipflop table tbody td.toggle div.toolbar div.group [data-toggle="buttons"]>.btn-group>input[type=submit] input[type="checkbox"],section.flipflop table tbody td.toggle div.toolbar [data-toggle="buttons"]>div.group>input[type=submit] input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.label,section.flipflop table tbody td.status span{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:0.25rem}.label:empty,section.flipflop table tbody td.status span:empty{display:none}.btn .label,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit] .label,.btn section.flipflop table tbody td.status span,section.flipflop table tbody td.status .btn span,section.flipflop table tbody td.toggle div.toolbar div.group input[type=submit] td.status span,section.flipflop table tbody td.status td.toggle div.toolbar div.group input[type=submit] span{position:relative;top:-1px}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label-pill,section.flipflop table tbody td.status span{padding-right:.6em;padding-left:.6em;border-radius:10rem}.label-default,section.flipflop table tbody td.status span.off{background-color:#818a91}.label-default[href]:focus,section.flipflop table tbody td.status span[href].off:focus,.label-default[href]:hover,section.flipflop table tbody td.status span[href].off:hover{background-color:#687077}.label-primary{background-color:#0275d8}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#025aa5}.label-success,section.flipflop table tbody td.status span.on{background-color:#5cb85c}.label-success[href]:focus,section.flipflop table tbody td.status span[href].on:focus,.label-success[href]:hover,section.flipflop table tbody td.status span[href].on:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}section.flipflop{margin-left:auto;margin-right:auto;padding-left:0.9375rem;padding-right:0.9375rem;margin:5rem 0 0}section.flipflop::after{content:"";display:table;clear:both}section.flipflop table thead th{position:relative;cursor:default}section.flipflop table thead th[data-tooltip]:before,section.flipflop table thead th[data-tooltip]:after{transition:all 0.2s ease-out;transform:translateY(0.2rem) translateZ(0);opacity:0;display:block;position:absolute}section.flipflop table thead th[data-tooltip]:before{content:attr(data-tooltip);width:98%;left:0;bottom:3.75rem;margin:0;padding:0.5rem 0.75rem;background:#55595c;border-radius:0.2rem;font-size:0.875rem;font-weight:normal;pointer-events:none}section.flipflop table thead th[data-tooltip]:after{content:" ";width:0;height:0;left:1rem;bottom:3.25rem;border-left:solid transparent 0.5rem;border-right:solid transparent 0.5rem;border-top:solid #55595c 0.5rem}section.flipflop table thead th:hover[data-tooltip]:before,section.flipflop table thead th:hover[data-tooltip]:after{transform:translateY(0) translateZ(0);opacity:1}section.flipflop table tbody td.status{width:2rem;font-size:1.1rem}section.flipflop table tbody td.status span{width:2rem}section.flipflop table tbody td.name{min-width:11rem;padding-top:0.9rem;font-weight:bold}section.flipflop table tbody td.description{min-width:11rem;padding-top:0.9rem}section.flipflop table tbody td.toggle{min-width:11rem}section.flipflop table tbody td.toggle div.toolbar{margin-left:0}
@@ -1,7 +1,5 @@
1
1
  module Flipflop
2
2
  class FeaturesController < ApplicationController
3
- include EnvironmentFilters
4
-
5
3
  layout "flipflop"
6
4
 
7
5
  def index
@@ -1,6 +1,5 @@
1
1
  module Flipflop
2
2
  class StrategiesController < ApplicationController
3
- include EnvironmentFilters
4
3
  include Engine.routes.url_helpers
5
4
 
6
5
  def update
@@ -1,2 +1,4 @@
1
- class Flipflop::Feature < ActiveRecord::Base
1
+ if defined?(ActiveRecord)
2
+ class Flipflop::Feature < ActiveRecord::Base
3
+ end
2
4
  end
@@ -8,7 +8,7 @@ module Flipflop
8
8
  end
9
9
 
10
10
  def initialize(**options)
11
- @class = options.delete(:class) || "Flipflop::Feature"
11
+ @class = options.delete(:class) || ::Flipflop::Feature
12
12
  if !@class.kind_of?(Class)
13
13
  @class = ActiveSupport::Inflector.constantize(@class.to_s)
14
14
  end
@@ -15,7 +15,7 @@ module Flipflop
15
15
  def enabled?(feature)
16
16
  return unless request?
17
17
  return unless request.params.has_key?(param_key(feature))
18
- request.params[param_key(feature)].to_s != "0"
18
+ request.params[param_key(feature)] != "0"
19
19
  end
20
20
 
21
21
  protected
@@ -0,0 +1,41 @@
1
+ module Flipflop
2
+ module Strategies
3
+ class RedisStrategy < AbstractStrategy
4
+ class << self
5
+ def default_description
6
+ "Stores features in Redis. Applies to all users."
7
+ end
8
+ end
9
+
10
+ def initialize(**options)
11
+ @client = options.delete(:client) || ::Redis.new
12
+ @prefix = options.delete(:prefix).to_s.freeze
13
+ super(**options)
14
+ end
15
+
16
+ def switchable?
17
+ true
18
+ end
19
+
20
+ def enabled?(feature)
21
+ redis_value = @client.get(redis_key(feature))
22
+ return if redis_value.nil?
23
+ redis_value === "1"
24
+ end
25
+
26
+ def switch!(feature, enabled)
27
+ @client.set(redis_key(feature), enabled ? "1" : "0")
28
+ end
29
+
30
+ def clear!(feature)
31
+ @client.del(redis_key(feature))
32
+ end
33
+
34
+ protected
35
+
36
+ def redis_key(feature)
37
+ @prefix + feature.to_s
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,3 +1,3 @@
1
1
  module Flipflop
2
- VERSION = "2.2.0"
2
+ VERSION = "2.2.1"
3
3
  end
data/lib/flipflop.rb CHANGED
@@ -18,6 +18,7 @@ require "flipflop/strategies/cookie_strategy"
18
18
  require "flipflop/strategies/default_strategy"
19
19
  require "flipflop/strategies/lambda_strategy"
20
20
  require "flipflop/strategies/query_string_strategy"
21
+ require "flipflop/strategies/redis_strategy"
21
22
  require "flipflop/strategies/session_strategy"
22
23
  require "flipflop/strategies/test_strategy"
23
24
 
@@ -6,8 +6,9 @@ Flipflop.configure do
6
6
 
7
7
  # Other strategies:
8
8
  #
9
- # strategy :session
10
9
  # strategy :query_string
10
+ # strategy :redis
11
+ # strategy :session
11
12
  #
12
13
  # strategy :my_strategy do |feature|
13
14
  # # ... your custom code here; return true/false/nil.
@@ -10,12 +10,27 @@ class Flipflop::InstallGenerator < Rails::Generators::Base
10
10
  end
11
11
 
12
12
  def configure_dashboard
13
- environment <<-CONFIG
14
- # Replace this with your own 'before_action' filter in ApplicationController
15
- # to implement access control for the Flipflop dashboard, or provide a
16
- # filter as lambda directly.
17
- config.flipflop.dashboard_access_filter = :require_development
13
+ comment = <<-RUBY
14
+ # Replace with a lambda or method name defined in ApplicationController
15
+ # to implement access control for the Flipflop dashboard.
16
+ RUBY
18
17
 
19
- CONFIG
18
+ forbidden = <<-RUBY
19
+ config.flipflop.dashboard_access_filter = -> { head :forbidden }
20
+ RUBY
21
+
22
+ allowed = <<-RUBY
23
+ config.flipflop.dashboard_access_filter = nil
24
+ RUBY
25
+
26
+ environment(indent(comment + forbidden + "\n", 4).lstrip)
27
+ environment(indent(comment + allowed + "\n", 2).lstrip, env: [:development, :test])
28
+ end
29
+
30
+ private
31
+
32
+ def indent(content, multiplier = 2)
33
+ spaces = " " * multiplier
34
+ content.each_line.map {|line| line.blank? ? line : "#{spaces}#{line}" }.join
20
35
  end
21
36
  end
@@ -17,18 +17,6 @@ describe Flipflop do
17
17
  Flipflop::Strategies::AbstractStrategy::RequestInterceptor.request = nil
18
18
  end
19
19
 
20
- describe "outside development and test" do
21
- before do
22
- Rails.env.stub(:test?, false) do
23
- visit "/flipflop"
24
- end
25
- end
26
-
27
- it "should be forbidden" do
28
- assert_equal 403, page.status_code
29
- end
30
- end
31
-
32
20
  describe "without features" do
33
21
  before do
34
22
  visit "/flipflop"
@@ -106,6 +94,24 @@ describe Flipflop do
106
94
  refute has_selector?("td[data-strategy=cookie] input.active[type=submit]")
107
95
  end
108
96
  end
97
+
98
+ it "should enable feature after in spite of redefinition and reordering" do
99
+ Flipflop::FeatureSet.current.instance_variable_set(:@strategies, {})
100
+ Module.new do
101
+ extend Flipflop::Configurable
102
+ strategy :active_record, description: "Store in database."
103
+ strategy :cookie, description: "Store in cookie."
104
+ end
105
+
106
+ within("tr[data-feature=world-domination] td[data-strategy=cookie]") do
107
+ click_on "on"
108
+ end
109
+
110
+ within("tr[data-feature=world-domination]") do
111
+ assert_equal "on", first("td.status").text
112
+ assert_equal "on", first("td[data-strategy=cookie] input.active[type=submit]").value
113
+ end
114
+ end
109
115
  end
110
116
 
111
117
  describe "with active record strategy" do
@@ -145,6 +151,24 @@ describe Flipflop do
145
151
  refute has_selector?("td[data-strategy=active-record] input.active[type=submit]")
146
152
  end
147
153
  end
154
+
155
+ it "should enable feature after in spite of redefinition and reordering" do
156
+ Flipflop::FeatureSet.current.instance_variable_set(:@strategies, {})
157
+ Module.new do
158
+ extend Flipflop::Configurable
159
+ strategy :active_record, description: "Store in database."
160
+ strategy :cookie, description: "Store in cookie."
161
+ end
162
+
163
+ within("tr[data-feature=world-domination] td[data-strategy=active-record]") do
164
+ click_on "on"
165
+ end
166
+
167
+ within("tr[data-feature=world-domination]") do
168
+ assert_equal "on", first("td.status").text
169
+ assert_equal "on", first("td[data-strategy=active-record] input.active[type=submit]").value
170
+ end
171
+ end
148
172
  end
149
173
  end
150
174
 
data/test/test_helper.rb CHANGED
@@ -89,8 +89,14 @@ class TestApp
89
89
  def migrate!
90
90
  ActiveRecord::Base.establish_connection
91
91
 
92
- ActiveRecord::Tasks::DatabaseTasks.create_current
92
+ silence_stdout { ActiveRecord::Tasks::DatabaseTasks.create_current }
93
93
  ActiveRecord::Migration.verbose = false
94
94
  ActiveRecord::Migrator.migrate(Rails.application.paths["db/migrate"].to_a)
95
95
  end
96
+
97
+ def silence_stdout
98
+ stdout, $stdout = $stdout, StringIO.new
99
+ yield rescue nil
100
+ $stdout = stdout
101
+ end
96
102
  end
@@ -0,0 +1,97 @@
1
+ require File.expand_path("../../../test_helper", __FILE__)
2
+
3
+ require "fakeredis"
4
+
5
+ describe Flipflop::Strategies::RedisStrategy do
6
+ before do
7
+ Redis.new.flushall
8
+ end
9
+
10
+ describe "with defaults" do
11
+ subject do
12
+ Flipflop::Strategies::RedisStrategy.new.freeze
13
+ end
14
+
15
+ it "should have default name" do
16
+ assert_equal "redis", subject.name
17
+ end
18
+
19
+ it "should have default description" do
20
+ assert_equal "Stores features in Redis. Applies to all users.",
21
+ subject.description
22
+ end
23
+
24
+ it "should be switchable" do
25
+ assert_equal true, subject.switchable?
26
+ end
27
+
28
+ it "should have unique key" do
29
+ assert_match /^\w+$/, subject.key
30
+ end
31
+
32
+ describe "with enabled feature" do
33
+ before do
34
+ Redis.new.set("one", 1)
35
+ end
36
+
37
+ it "should have feature enabled" do
38
+ assert_equal true, subject.enabled?(:one)
39
+ end
40
+
41
+ it "should be able to switch feature off" do
42
+ subject.switch!(:one, false)
43
+ assert_equal false, subject.enabled?(:one)
44
+ end
45
+
46
+ it "should be able to clear feature" do
47
+ subject.clear!(:one)
48
+ assert_nil subject.enabled?(:one)
49
+ end
50
+ end
51
+
52
+ describe "with disabled feature" do
53
+ before do
54
+ Redis.new.set("two", 0)
55
+ end
56
+
57
+ it "should not have feature enabled" do
58
+ assert_equal false, subject.enabled?(:two)
59
+ end
60
+
61
+ it "should be able to switch feature on" do
62
+ subject.switch!(:two, true)
63
+ assert_equal true, subject.enabled?(:two)
64
+ end
65
+
66
+ it "should be able to clear feature" do
67
+ subject.clear!(:two)
68
+ assert_nil subject.enabled?(:two)
69
+ end
70
+ end
71
+
72
+ describe "with unsaved feature" do
73
+ it "should not know feature" do
74
+ assert_nil subject.enabled?(:three)
75
+ end
76
+
77
+ it "should be able to switch feature on" do
78
+ subject.switch!(:three, true)
79
+ assert_equal true, subject.enabled?(:three)
80
+ end
81
+ end
82
+ end
83
+
84
+ describe "with options" do
85
+ subject do
86
+ Flipflop::Strategies::RedisStrategy.new(
87
+ client: Redis.new(db: 1),
88
+ prefix: "my_feature:",
89
+ ).freeze
90
+ end
91
+
92
+ it "should use prefix and database to resolve parameters" do
93
+ Redis.new(db: 1).set("my_feature:one", 1)
94
+ assert_equal true, subject.enabled?(:one)
95
+ end
96
+ end
97
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipflop
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Annesley
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-03-18 00:00:00.000000000 Z
13
+ date: 2016-05-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -43,7 +43,6 @@ files:
43
43
  - README.md
44
44
  - Rakefile
45
45
  - app/assets/stylesheets/flipflop.css
46
- - app/controllers/concerns/flipflop/environment_filters.rb
47
46
  - app/controllers/flipflop/features_controller.rb
48
47
  - app/controllers/flipflop/strategies_controller.rb
49
48
  - app/models/flipflop/feature.rb
@@ -65,6 +64,7 @@ files:
65
64
  - lib/flipflop/strategies/lambda_strategy.rb
66
65
  - lib/flipflop/strategies/options_hasher.rb
67
66
  - lib/flipflop/strategies/query_string_strategy.rb
67
+ - lib/flipflop/strategies/redis_strategy.rb
68
68
  - lib/flipflop/strategies/session_strategy.rb
69
69
  - lib/flipflop/strategies/test_strategy.rb
70
70
  - lib/flipflop/version.rb
@@ -93,6 +93,7 @@ files:
93
93
  - test/unit/strategies/lambda_strategy_test.rb
94
94
  - test/unit/strategies/options_hasher_test.rb
95
95
  - test/unit/strategies/query_string_strategy_test.rb
96
+ - test/unit/strategies/redis_strategy_test.rb
96
97
  - test/unit/strategies/session_strategy_test.rb
97
98
  - test/unit/strategies/test_strategy_test.rb
98
99
  homepage: https://github.com/voormedia/flipflop
@@ -1,5 +0,0 @@
1
- module Flipflop::EnvironmentFilters
2
- def require_development
3
- head :forbidden unless Rails.env.development? or Rails.env.test?
4
- end
5
- end