flipflop 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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