From 35bf3ca68eb518fdd397b6b4442d164c7bc5916f Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Mon, 12 Jul 2021 17:33:15 +0200 Subject: [PATCH] [Project] Removed website, after moving to github pages --- li.strolch.website/.gitignore | 5 - li.strolch.website/LICENSE | 201 - li.strolch.website/README.md | 4 - li.strolch.website/pom.xml | 30 - li.strolch.website/www.strolch.li/api.html | 511 -- li.strolch.website/www.strolch.li/blog.html | 707 -- .../www.strolch.li/css/blog.css | 124 - .../www.strolch.li/css/bootstrap-theme.css | 347 - .../css/bootstrap-theme.css.map | 1 - .../css/bootstrap-theme.min.css | 7 - .../www.strolch.li/css/bootstrap.css | 5785 ----------------- .../www.strolch.li/css/bootstrap.css.map | 1 - .../www.strolch.li/css/bootstrap.min.css | 7 - .../www.strolch.li/css/custom.css | 49 - .../www.strolch.li/css/downloads.css | 14 - .../www.strolch.li/development.html | 199 - .../documentation-architecture.html | 159 - .../documentation-components.html | 209 - .../documentation-do-and-dont.html | 123 - .../www.strolch.li/documentation-model.html | 391 -- .../documentation-observers.html | 151 - .../documentation-policies.html | 179 - .../documentation-privileges.html | 211 - .../www.strolch.li/documentation-queries.html | 202 - .../www.strolch.li/documentation-realms.html | 205 - .../www.strolch.li/documentation-reports.html | 367 -- .../www.strolch.li/documentation-runtime.html | 395 -- .../documentation-searches.html | 183 - .../documentation-services-and-commands.html | 213 - .../documentation-transactions.html | 191 - .../documentation-versioning.html | 149 - .../www.strolch.li/documentation.html | 121 - .../www.strolch.li/downloads.html | 114 - .../fonts/glyphicons-halflings-regular.eot | Bin 20335 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 229 - .../fonts/glyphicons-halflings-regular.ttf | Bin 41280 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23320 -> 0 bytes .../google052dbec2d053a4e1.html | 1 - .../www.strolch.li/history.html | 265 - .../www.strolch.li/ico/favicon.ico | Bin 5430 -> 0 bytes .../images/Strolch-Bird-View.svg | 2 - .../Strolch-PLC-Architecture-Overview.png | Bin 34401 -> 0 bytes .../images/Strolch-PLC-Architecture.png | Bin 39995 -> 0 bytes .../images/Strolch-Plc-Example.png | Bin 84635 -> 0 bytes .../images/Strolch-Squirrel-View.svg | 2 - .../images/strolch-model-example.png | Bin 20086 -> 0 bytes li.strolch.website/www.strolch.li/index.html | 176 - .../www.strolch.li/js/bootstrap.js | 1951 ------ .../www.strolch.li/js/bootstrap.min.js | 6 - li.strolch.website/www.strolch.li/plc.html | 617 -- .../tutorial-configuration.html | 893 --- .../www.strolch.li/tutorial-crud-book.html | 623 -- .../www.strolch.li/tutorial-model.html | 276 - .../www.strolch.li/tutorial.html | 122 - .../www.strolch.li/xsd/StrolchModel-1.6.xsd | 201 - 55 files changed, 16919 deletions(-) delete mode 100644 li.strolch.website/.gitignore delete mode 100644 li.strolch.website/LICENSE delete mode 100644 li.strolch.website/README.md delete mode 100644 li.strolch.website/pom.xml delete mode 100644 li.strolch.website/www.strolch.li/api.html delete mode 100644 li.strolch.website/www.strolch.li/blog.html delete mode 100644 li.strolch.website/www.strolch.li/css/blog.css delete mode 100644 li.strolch.website/www.strolch.li/css/bootstrap-theme.css delete mode 100644 li.strolch.website/www.strolch.li/css/bootstrap-theme.css.map delete mode 100644 li.strolch.website/www.strolch.li/css/bootstrap-theme.min.css delete mode 100644 li.strolch.website/www.strolch.li/css/bootstrap.css delete mode 100644 li.strolch.website/www.strolch.li/css/bootstrap.css.map delete mode 100644 li.strolch.website/www.strolch.li/css/bootstrap.min.css delete mode 100644 li.strolch.website/www.strolch.li/css/custom.css delete mode 100644 li.strolch.website/www.strolch.li/css/downloads.css delete mode 100644 li.strolch.website/www.strolch.li/development.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-architecture.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-components.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-do-and-dont.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-model.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-observers.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-policies.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-privileges.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-queries.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-realms.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-reports.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-runtime.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-searches.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-services-and-commands.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-transactions.html delete mode 100644 li.strolch.website/www.strolch.li/documentation-versioning.html delete mode 100644 li.strolch.website/www.strolch.li/documentation.html delete mode 100644 li.strolch.website/www.strolch.li/downloads.html delete mode 100644 li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.eot delete mode 100644 li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.svg delete mode 100644 li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.ttf delete mode 100644 li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.woff delete mode 100644 li.strolch.website/www.strolch.li/google052dbec2d053a4e1.html delete mode 100644 li.strolch.website/www.strolch.li/history.html delete mode 100644 li.strolch.website/www.strolch.li/ico/favicon.ico delete mode 100644 li.strolch.website/www.strolch.li/images/Strolch-Bird-View.svg delete mode 100644 li.strolch.website/www.strolch.li/images/Strolch-PLC-Architecture-Overview.png delete mode 100644 li.strolch.website/www.strolch.li/images/Strolch-PLC-Architecture.png delete mode 100644 li.strolch.website/www.strolch.li/images/Strolch-Plc-Example.png delete mode 100644 li.strolch.website/www.strolch.li/images/Strolch-Squirrel-View.svg delete mode 100644 li.strolch.website/www.strolch.li/images/strolch-model-example.png delete mode 100644 li.strolch.website/www.strolch.li/index.html delete mode 100644 li.strolch.website/www.strolch.li/js/bootstrap.js delete mode 100644 li.strolch.website/www.strolch.li/js/bootstrap.min.js delete mode 100644 li.strolch.website/www.strolch.li/plc.html delete mode 100644 li.strolch.website/www.strolch.li/tutorial-configuration.html delete mode 100644 li.strolch.website/www.strolch.li/tutorial-crud-book.html delete mode 100644 li.strolch.website/www.strolch.li/tutorial-model.html delete mode 100644 li.strolch.website/www.strolch.li/tutorial.html delete mode 100644 li.strolch.website/www.strolch.li/xsd/StrolchModel-1.6.xsd diff --git a/li.strolch.website/.gitignore b/li.strolch.website/.gitignore deleted file mode 100644 index 1e97e93ea..000000000 --- a/li.strolch.website/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -target/ -.project -.settings -.classpath -*.iml \ No newline at end of file diff --git a/li.strolch.website/LICENSE b/li.strolch.website/LICENSE deleted file mode 100644 index ad410e113..000000000 --- a/li.strolch.website/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/li.strolch.website/README.md b/li.strolch.website/README.md deleted file mode 100644 index c29ffacf2..000000000 --- a/li.strolch.website/README.md +++ /dev/null @@ -1,4 +0,0 @@ -li.strolch.website -================== - -This project contains the sources to create Strolch's website at www.strolch.li diff --git a/li.strolch.website/pom.xml b/li.strolch.website/pom.xml deleted file mode 100644 index 4129b8b13..000000000 --- a/li.strolch.website/pom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - 4.0.0 - - - li.strolch - li.strolch - 1.6.0-SNAPSHOT - ../pom.xml - - - li.strolch.website - pom - li.strolch.website - Strolch's Website - - - - - org.sonatype.plugins - nexus-staging-maven-plugin - - true - - - - - - diff --git a/li.strolch.website/www.strolch.li/api.html b/li.strolch.website/www.strolch.li/api.html deleted file mode 100644 index 07946f7df..000000000 --- a/li.strolch.website/www.strolch.li/api.html +++ /dev/null @@ -1,511 +0,0 @@ - - - - - - - - - - - - Strolch: API - - - - - - - - - - - - -
- - - -
- -

Overview

- -

The Strolch API revolves around the StrolchTransaction object. The main concept is to implement your - use cases in Service implementations. You open a transaction using the openTx(String)-method - and then perform the use case by adding your Command instances to the transaction.

- -

Transactions are opened on a StrolchRealm. The realms are used to separate mandates in a single - runtime instance of Strolch. Each realm has its own ResourceMap, OrderMap, ActivityMap - instances from which the TX retrieves the elements.

- -

Model

- -

The Strolch model is implemented in the project li.strolch.model.

- -

The Strolch model consists of three root level elements: Resource, Order and Activity. - Each element has at least the following attributes:

-
    -
  • Id → the element's id
  • -
  • Name → the element's name
  • -
  • Type → the element's type
  • -
- -

Each root element can have any number of ParameterBag instances on it, which in turn can have any - number of Parameters on it. Accessing these objects is always done by their IDs. Strolch root elements - are always stored in the respective ElementMaps in their Strolch realm. Thus accessing a certain - parameter from a Resource would look like this:

-
-try (StrolchTransaction tx = openTx(realmName)) {
-  Resource resource = tx.getResourceBy("TestType", "MyTestResource");
-  DateParameter dateP = resource.getParameter("@bag01", "@param6");
-  Date date = dateP.getValue();
-  logger.info("@param6 date is " + date);
-}
- - XML Presentation of Strolch's top level elements of Resources: -
-<!-- Resource instance -->
-<Resource Id="MyTestResource" Name="Test Name" Type="TestType">
-  <ParameterBag Id="@bag01" Name="Test Bag" Type="TestBag">
-    <Parameter Id="@param7" Name="StringList Param" Type="StringList" Value="Hello;World" />
-    <Parameter Id="@param6" Name="Date Param" Type="Date" Value="2012-11-30T18:12:05.628+01:00" />
-    <Parameter Id="@param5" Name="String Param" Type="String" Value="Strolch" />
-  </ParameterBag>
-  <ParameterBag Id="@bag02" Name="Test Bag" Type="TestBag">
-    <Parameter Id="@param4" Name="Long Param" Type="Long" Value="4453234566" />
-    <Parameter Id="@param3" Name="Integer Param" Type="Integer" Value="77" />
-    <Parameter Id="@param2" Name="Float Param" Type="Float" Value="44.3" />
-    <Parameter Id="@param1" Name="Boolean Param" Type="Boolean" Value="true" />
-  </ParameterBag>
-  <TimedState Id="@integerState" Name="Integer State" Type="IntegerState">
-    <Value Time="0" Value="1" />
-    <Value Time="1" Value="2" />
-    <Value Time="2" Value="3" />
-  <TimedState>
-</Resource>
- - XML Presentation of Strolch's top level elements of Orders: -
-<!-- Order instance -->
-<Order Id="MyTestOrder" Name="Test Name" Type="TestType" Date="2013-11-20T07:42:57.699Z" State="CREATED">
-  <ParameterBag Id="@bag01" Name="Test Bag" Type="TestBag">
-    <Parameter Id="@param7" Name="StringList Param" Type="StringList" Value="Hello;World" />
-    <Parameter Id="@param6" Name="Date Param" Type="Date" Value="2012-11-30T18:12:05.628+01:00" />
-    <Parameter Id="@param5" Name="String Param" Type="String" Value="Strolch" />
-  </ParameterBag>
-  <ParameterBag Id="@bag02" Name="Test Bag" Type="TestBag">
-    <Parameter Id="@param4" Name="Long Param" Type="Long" Value="4453234566" />
-    <Parameter Id="@param3" Name="Integer Param" Type="Integer" Value="77" />
-    <Parameter Id="@param2" Name="Float Param" Type="Float" Value="44.3" />
-    <Parameter Id="@param1" Name="Boolean Param" Type="Boolean" Value="true" />
-  </ParameterBag>
-</Order>
- - XML Presentation of Strolch's top level elements of Activities: -
-<!-- Activity instance -->
-<Activity Id="bicycleProduction" Name="Bicycle Production" Type="Series">
-
-  <Activity Id="componentProduction" Name="Production of components" Type="Series">
-
-    <Action Id="consumeGears" Name="Gears"
-                    ResourceId="gears" ResourceType="Article" Type="Consume">
-      <ParameterBag Id="objectives" Name="Production goals" Type="Objectives">
-        <Parameter Id="quantity" Name="Quantity" Type="Float" Value="1" />
-        <Parameter Id="duration" Name="Duration" Type="Duration" Value="PT0S" />
-      </ParameterBag>
-    </Action>
-
-    <Activity Id="frameProduction" Name="Production frame" Type="Series">
-      <Action Id="produce" Name="Production frame"
-                    ResourceId="frameProduction" ResourceType="Machine" Type="Use">
-        <ParameterBag Id="objectives" Name="Production goals" Type="Objectives">
-          <Parameter Id="quantity" Name="Quantity" Type="Float" Value="1" />
-          <Parameter Id="duration" Name="Duration" Type="Duration" Value="PT5M" />
-        </ParameterBag>
-      </Action>
-      <Action Id="toStock" Name="Frame ToStock"
-                    ResourceId="frame" ResourceType="Article" Type="Produce">
-        <ParameterBag Id="objectives" Name="Production goals" Type="Objectives">
-          <Parameter Id="quantity" Name="Quantity" Type="Float" Value="1" />
-          <Parameter Id="duration" Name="Duration" Type="Duration" Value="PT1M" />
-        </ParameterBag>
-      </Action>
-    </Activity>
-
-    <Activity Id="brakeProduction" Type="Series" Name="Herstellen Bremsen" TimeOrdering="Series">
-      <Action Id="produce" Name="Production saddle"
-                    ResourceId="saddleProduction" ResourceType="Machine" Type="Use">
-        <ParameterBag Id="objectives" Name="Production goals" Type="Objectives">
-          <Parameter Id="quantity" Name="Quantity" Type="Float" Value="1" />
-          <Parameter Id="duration" Name="Duration" Type="Duration" Value="PT5M" />
-        </ParameterBag>
-      </Action>
-      <Action Id="toStock" Name="Saddle ToStock"
-                    ResourceId="frame" ResourceType="Article" Type="Produce">
-        <ParameterBag Id="objectives" Name="Production goals" Type="Objectives">
-          <Parameter Id="quantity" Name="Quantity" Type="Float" Value="1" />
-          <Parameter Id="duration" Name="Duration" Type="Duration" Value="PT1M" />
-        </ParameterBag>
-      </Action>
-    </Activity>
-
-  </Activity>
-
-  <Action Id="assembly" Name="Bicycle assemble"
-                    ResourceId="bicycleAssembly" ResourceType="Assembly" Type="Use">
-    <ParameterBag Id="objectives" Name="Production goals" Type="Objectives">
-      <Parameter Id="quantity" Name="Quantity" Type="Float" Value="1" />
-      <Parameter Id="duration" Name="Duration" Type="Duration" Value="PT5M" />
-    </ParameterBag>
-  </Action>
-
-  <Action Id="toStock" Name="Bicycle to stock"
-                    ResourceId="bicycle" ResourceType="Product" Type="Produce">
-    <ParameterBag Id="objectives" Name="Production goals" Type="Objectives">
-      <Parameter Id="quantity" Name="Quantity" Type="Float" Value="1" />
-      <Parameter Id="duration" Name="Duration" Type="Duration" Value="PT1M" />
-    </ParameterBag>
-  </Action>
-</Activity>
- - -

Realms

- Strolch realms implement the multi-client capability which is thus baked right into the Strolch runtime. When - configuring a Strolch runtime, realms are configured and for each realm the data store mode is set. Each realm - has its own persistence configuration and can thus run in one of the 4 modes that the Strolch agent implements: -
    -
  • EMPTY -

    This is a transient data store mode, where no model changes are persisted, but they are only kept in - memory. When the Strolch agent is started, this realm stays empty as no data is loaded.

  • -
  • TRANSIENT -

    This is the same as EMPTY, but with the difference that when the Strolch agent is started, an XML - file is parsed and the in memory realm is populated with the elements parsed from that XML file.

    -
  • -
  • CACHED -

    In this mode, all data is stored in memory, and any changes made are written back to the persistence - layer. This allows for fast in-memory quries, but makes sure no data is lost when the agent is - restarted.

  • -
- -

Strolch Realms are also responsible for opening Transactions, as these are bound to the persistence layer - configured for this realm. At runtime, a realm is then accessed from the ComponentContainer:

-
-ComponentContainer container = getAgent().getContainer();
-StrolchRealm realm = container.getRealm(StrolchConstants.DEFAULT_REALM);
-try(StrolchTransaction tx = realm.openTx()) {
-  Resource resource = tx.getResourceBy("TestType", "MyTestResource");
-  ...
-}
- In a Service implementation there is a convenience method, so that this is as simple as calling openTx(String). - -

Services and Commands

- -

In the motivation section, it was discusses that writing business logic is what developing is about and a - reason why Strolch is a different approach to the Java EE ecosystem. So this is where Services and Commands - come into play, and tries to make writing business logic a first class citizen.

- -

Services are to be used once for each use case. Services are not re-used or called by other services. - Services open transactions are implement the calling of the re-usable commands. Thus when writing projects - using Strolch, the first thing to do after configuring the runtime environment for your situation, Services - will be implemented.

- -

Commands on the other hand are re-usable and should be implemented in such a way, that they encapsulate the - use case's different actions. Commands are then passed to a transaction for execution and, when the - transaction is committed, will be executed. Commands also implement undoing its operation in the case of - exceptions. Strolch transactions handle the life-cycle of a command. A further function of Commands is to - lock the relevant Strolch elements before execution.

- -

A typical Service and Command implementation would look as follows:

-
-public class SetParameterService extends AbstractService<SetParameterArg, ServiceResult> {
-
-  public static final long serialVersionUID = 1L;
-
-  @Override
-  protected ServiceResult internalDoService(SetParameterArg arg) {
-
-    // open a new transaction
-    try (StrolchTransaction tx = openTx(arg.realm)) {
-
-      // find parameter to modify
-      Parameter<?> parameter = tx.findElement(arg.locator);
-
-      // instantiate the command
-      SetParameterCommand command = new SetParameterCommand(tx);
-      
-      // set the arguments
-      command.setParameter(parameter);
-      command.setName(arg.name);
-      command.setInterpretation(arg.interpretation);
-      command.setUom(arg.uom);
-      command.setHidden(arg.hidden);
-      command.setIndex(arg.index);
-      command.setValueAsString(arg.valueAsString);
-
-      // add the command to the transaction
-      tx.addCommand(command);
-
-      // only now do we say we want to commit so that a rollback works nicely
-      tx.commitOnClose();
-    }
-
-    // return the execution result of the service
-    return ServiceResult.success();
-  }
-
-  /**
-   * The argument class for this service
-   */
-  public static class SetParameterArg extends ServiceArgument {
-    public static final long serialVersionUID = 1L;
-    public Locator locator;
-
-    public String name;
-    public String interpretation;
-    public String uom;
-    public Boolean hidden;
-    public Integer index;
-
-    public String valueAsString;
-  }
-
-  @Override
-  protected ServiceResult getResultInstance() {
-    return new ServiceResult();
-  }
-}
-                
- -
-public class SetParameterCommand extends Command {
-
-  // input fields
-  private Parameter<?> parameter;
-  private String valueAsString;
-
-  // undo fields
-  private String oldValueAsString;
-
-  private StrolchRootElement replacedElement;
-
-  /**
-   * @param container
-   * @param tx
-   */
-  public SetParameterCommand(StrolchTransaction tx) {
-    super(tx);
-  }
-
-  // setters for input ...
-  // getters for output ...
-
-  @Override
-  public void validate() {
-    DBC.PRE.assertNotNull("Parameter may not be null!", this.parameter);
-  }
-
-  @Override
-  public void doCommand() {
-
-    // lock the element to be modified
-    StrolchRootElement rootElement = this.parameter.getRootElement();
-    tx().lock(rootElement);
-
-    // perform changes
-    if (this.valueAsString != null) {
-      this.oldValueAsString = this.parameter.getValueAsString();
-      SetParameterValueVisitor visitor = new SetParameterValueVisitor();
-      visitor.setValue(this.parameter, this.valueAsString);
-    }
-
-    // update root element
-    if (hasChanges()) {
-      replacedElement = new UpdateElementVisitor(tx()).update(rootElement);
-    }
-  }
-
-  private boolean hasChanges() {
-    return this.oldValueAsString != null || this.oldName != null || this.oldInterpretation != null
-        || this.oldUom != null || this.oldHidden != null || this.oldIndex != null;
-  }
-
-  @Override
-  public void undo() {
-
-      // undo changes
-      if (this.oldValueAsString != null) {
-        SetParameterValueVisitor visitor = new SetParameterValueVisitor();
-        visitor.setValue(this.parameter, this.oldValueAsString);
-      }
-
-      // update root element
-      if (hasChanges()
-                    && this.replacedElement != null
-                    && this.replacedElement != this.parameter.getRootElement()) {
-        new UpdateElementVisitor(tx()).update(replacedElement);
-      }
-    }
-  }
-}
- -

Code

- -

The Strolch code can be retrieved from GitHub, where the code is hosted. Each commit triggers a continuous - integration build, so that we are sure no tests are broken. The CI is viewable at - 4trees CI Server.

- -

Strolch is divided up into different projects on GitHub so that these projects can be developed, or bugfixed - independently and not all parts are required in every context.

- -

Strolch on GitHub

- -

Main Strolch components

-
    -
  • li.strolch.model - -

    This project implements the Strolch model. This is where you will find the different elements that - can store data at runtime e.g. Resources, Orders and Activities

  • -
  • li.strolch.agent - -

    The agent is the Strolch runtime and is the component which implements the core Agent functionality. - That is:

    -
      -
    • Provide the Agent instance which loads the configuration and is the entry point to the runtime -
    • -
    • Provide the ComponentContainer instance from which the registered components can be accessed -
    • -
    • Configure and maintain the realms, which implement the multi-client capability
    • -
    • Provide a default ServiceHandler to perform Services at runtime
    • -
    • Implements the realms which each can operate in different modes data store modes: CACHED, - TRANSIENT -
    • -
    -
  • -
  • li.strolch.service - -

    Implements the basic Services and the re-usable Commands:

    -
      -
    • CRUD Services and Commands to modify the model
    • -
    • Commands to import and export the model to XML
    • -
    • Further services and commands...
    • -
    -
  • -
- -

Additional components

-
    -
  • li.strolch.persistence.postgresql - -

    Implements a PostgreSQL persistence layer so that the Strolch model can be persisted to a PostgreSQL - RDBMS when the realm is configured to have a data store mode of CACHED.

    -
  • -
  • li.strolch.persistence.xml - -

    Implements an XML persistence layer so that the Strolch model can be persisted to XML files when the - realm is configured to have a data store mode of CACHED.

    -
  • -
  • li.strolch.rest - -

    Implements a Restful API to communicate with the Strolch runtime from clients and external - systems.

    -
  • -
- -

Meta projects

-
    -
  • li.strolch.bom - -

    This bill of material is a Maven project which, when imported in one's own Strolch project, pulls in - all required dependencies needed to set up a minimal working Strolch environment.

    -
  • -
  • li.strolch.testbase - -

    Implements a test base so that writing tests for Strolch is easy. It provides a RuntimeMock, which - handles setting up and tearing down Strolch runtimes during tests.

    -
  • -
- -

Example projects

-
    -
  • strolch_minimal_rest - -

    A minimal project to get started using REST with Strolch.

    -
  • -
  • Strolch Bookshop - -

    An example implentation of services etc. where we show how to use Strolch by implementing a simple - book shop.

    -
  • -
- -

Development

- -

To start getting involved with Strolch Development, or create your own applications using Strolch, then see - the development page

- -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/blog.html b/li.strolch.website/www.strolch.li/blog.html deleted file mode 100644 index 71567debe..000000000 --- a/li.strolch.website/www.strolch.li/blog.html +++ /dev/null @@ -1,707 +0,0 @@ - - - - - - - - - - - - Strolch: Blog - - - - - - - - - - - - - -
- - - - -
- - -
- - -
-

Strolch Reports

- - - -

Strolch can do reports!

-
-

A feature we haven't written about yet is the report API. Strolch has it's own API to generate - reports of data, and since we have a generic model, we use Resource of type - Report to define them.

- -

Go check out the documentation and then enjoy using this - easy way to deliver the reports your peers require.

- -
- - - -
-

Strolch Searches

- - - -

Strolch queries are deprecated!

-
-

Strolch has had once again many changes, and fixes etc. One important thing to note is that we have - removed support for transactional mode and have rewritten how models are searched. Thus the search - API was born.

- -

Go check out the Strolch Search documentation and then go - rewrite your searches =)).

- -

Strolch tag 1.6.51 - has all those juicy changes!

- -
- - - -
-

Wow, the many changes!

- - - -

So many changes, and so long no update - not good!

-
-

Oh boy, have we forgotten to update you all on the latest awesome features in Strolch! There are over - 123 commits since the last - tag 1.3.0, so that alone merits a new blog post.

-

Currently the latest tag is 1.5.5, but this version is actually already quite old, as it was created - on 31. January 2017 and there are 53 new commits ahead of the tag.

- -

Enough of all the commits, lets get to the new features:

-
    -
  • Added new generic report creator
  • -
  • Added Activity.TimeOrdering and updated Model XSD
  • -
  • Implemented State Model on Activity/Actions
  • -
  • Implemented execution of Activities
  • -
  • Implemented EventBasedExecutionHandler
  • -
  • Added StrolchXmlParser to quickly parse from a file
  • -
  • Add Activity.remove(String) to remove an element
  • -
  • Refactored LockHandler to use Locator
  • -
  • Added Activity.getActionsWithState(State)
  • -
  • Moved *ToFlat and *FromFlat Json Visitors to strolch model
  • -
  • Added StrolchElementQuery.internal()
  • -
  • Added Parameter.clearValue() and list parameters use , as sep
  • -
  • Json Tags are now in Tags.Json and are drinking camel-case
  • -
  • Moved PrivilegeAddUserService to command, added tests
  • -
  • Lots of JavaDoc updates
  • -
  • Refactored code for REST Inspector to use gson
  • -
  • Added inspector REST api for activities
  • -
  • Inspector now has offset/limit for queries
  • -
  • Added new StringMapArgument for StrolchServices
  • -
  • Added missing activity observer calls in AbstractTransaction
  • -
  • Added StringMapResult to use as a ServiceResult
  • -
  • Removed many visitors and implemented proper visitor pattern...
  • -
  • Don't log stack trace if certificate does not exist
  • -
  • SmtpMailer now understands whitelists for override
  • -
  • Fixed locator finding for Activity and Action
  • -
  • Fixed undo logic for general commands
  • -
- -

To summarize, execution and reporting are the two new features that make Strolch really - awesome! We use execution to perform a number of actions on a remote device connected to a Strolch - agent through WebSockets. This allows serial and parallel execution of actions and of course locking - of concurrently used resources.

- -

In an enterprise world reports can never be missed, so we needed an API to create reports. Of course - that API was created in a way that all things are done in Strolch: generically. Thus a report is - created as a Resource, defining the report object, columns and any relevant joins.

- -

And one of the really cool things is that we have started with a UI for Strolch. There is now an Inspector with which the entire data - model of a running agent can be seen. This inspector is built using Polymer and WebComponents and - thus can be easily embedded in your application.

-

To facilitate the authentication of a user for the inspector, an - authentication component was created as - well. And of course i18n can't be forgotten, so there is a component for - that too.

-

To simplify tasks in a web project, there is also a StrolchJs - repository where certain Strolch specific things are handled e.g. querying the authenticated user's - roles etc.

- -

The release of the next Strolch version isn't defined yet, as we are internally building a project on - all these changes and with the release 1.0.0 of that project (which will be soon), we shall perform - the next release of Strolch.

- -

Until then, happy coding!

-
- - - -
-

Strolch now on Maven Central

- - - -

Release Version 1.3.0 released and deployed to Maven Central

-
-

We have released a new version of Strolch so that you can now go and use the the latest features in - Strolch.

-

Further we have now deployed Strolch to Maven Central, so it is easier than ever to use Strolch in - your projects. No need to download first or use a special repository - just define the dependencies - as you would any other dependency.

- -

Some of the new features:

-
    -
  • Marshallers for JSON
  • -
  • Versioning built into Strolch
  • -
  • Implemented password reset API for Privilege
  • -
  • New Component MailHandler
  • -
  • New ToFlatJsonVisitor for simple marshalling in REST APIs
  • -
  • Added CRUD Commands and Services for Activities
  • -
  • Further additional bugfixes
  • -
- -

Strolch has also been moved to another organisation - on GitHub, so if you're compiling Strolch from source, please update your GIT remote configurations. -

- -

Have fun using the latest and greatest version of Strolch!

-
- - - -
-

Versioning of objects

- - - -

Opt-In versioning of objects

-
-

A major new feature has landed in Strolch. Now, using opt-in, it is possible to have all changes to - the object model be versioned. This means that any change to Order, - Resource or Activity is automatically versioned and one can then revert to - this version later on.

- -

This will make it far easier to implement undo operations in applications since it is an inherent - part of the lifecycle of objects in Strolch.

- -

Since Strolch is supposed to be used also in small footprint hardware, this option is opt-in.

- -

A side affect of this new feature is that we have for the time being not ported the XML persistence - layer. If this is required, then someone drop us a note and we'll check on it.

- -

So now go ahead and add <enableVersioning>true</enableVersioning> to your - Realm so that versioning is enabled.

- -
- - - -
-

Release 1.2.0

- - - -

Release of Strolch 1.2.0

-
-

A few months ago we informed of the soon to be released version 1.1.0. Well, we decided to jump to - 1.2.0 because we did some refactorings. All the eitchnet projects have been melted into Strolch and - thus now it's all one nice package. This will result in simpler development and less constraints on - APIs between the two projects.

-

Other than that, not much changed, but we are continually working on Strolch, so go grab your latest - copy and have fun coding!

- -
- - - -
-

Strolch Update

- - - -

Long due update on Strolch development.

-
-

Although we have been rather quiet in the last couple of months, anyone viewing Strolch's commit log, - will see that we certainly didn't halt Strolch development.

-

We have been hard at work, using Strolch in projects, which required many new features and fixes. The - commit log shows as of today over 180 commits since the release tag 1.0.0.

-

Some of the most exciting changes are:

-
    -
  • REST API to query model, incl. privilege management.
  • -
  • JSON marshalling of all elements.
  • -
  • Added Policies
  • -
  • Added persisting of user sessions.
  • -
  • New JavaScript based UI to view Strolch's model. This is an initial version and more UI elements - and functions will follow. -
  • -
  • Basic planning engine functionality.
  • -
- -

Further new features and changes are:

-
    -
  • Implemented a REST API to the privilege management - Now users can be added, changed, etc. via - call to the appropriate URL under ../strolch/privilege/*. -
  • -
  • Implemented a REST API to query the user sessions. Incl. invalidating sessions to forcefully - logout users. -
  • -
  • Implemented a REST API to query Audits.
  • -
  • Implemented REST API to query Orders, Resources and - Activities/Actions
  • -
  • Implemented REST API to update Resources and Orders from XML
  • -
  • REST API to authenticate now adds a cookie, so authorization is much simpler.
  • -
  • Added convenience methods in Service and Command to easily perform - system user actions. -
  • -
  • Added audits for login/logout of users.
  • -
  • Added audits for changes to privilege management.
  • -
  • PostgreSQL persistence layer now uses HikariCP - for connection pooling. -
  • -
  • Implemented a performance test project
  • -
  • Added new Parameters of type IntegerList, FloatList and - LongList. -
  • -
  • Added feature to ignore a realm on DB init.
  • -
  • Implemented core planning functionality.
  • -
  • Added strolch_minimal and strolch_minimal_rest projects to easily get - started. -
  • -
  • Query API now has built in ordering.
  • -
  • Added Policy to all root elements.
  • -
  • Added new planning web app project. This is a test application for demoing the planning engine - functionality of Strolch. -
  • -
  • Adding the persisting and reloading of user sessions, so that a new start of Strolch does not - logout users. -
  • -
  • Implemented to JSON visitors for all root elements.
  • -
- -

So, although we've been rather quiet on the blog and on social media, we have not been quiet in - Strolch's development. We are planning to release version 1.1.0 soon, so stay tuned!

- -
- - -
-

Activities: Beginning of the planning engine

- - - -

The ground work of the Strolch planning engine has been laid.

-
-

One of the core ideas in building Strolch was to create a planning engine. The planning engine would - work in combination of Order objects representing customer orders, Resource - objects representing machines, human resources, etc., and Activity/Action - hierarchies defining a workflow.

- -

With the latest couple of commits to Strolch we have now added Activities and a basic planning of - Actions onto Resources. Activities have an ordered list of IActivityElement which allows - creating an arbitrary deep tree structure of Activity and Action elements.

- -

Action objects have a list of IValueChange objects which define the start, end and - further value changes over time on a referenced Resource. Thus planning an Activity is done by - iterating the Activity hierarchy and for every Action selecting a relevant Resource and then then - applying the changes of the Action on to the referenced TimeState on the Resource.

- -

This implementation is currently very simple as it ignores all constraints which a Resource might - have. In further development we shall implement a Violation model so that UIs can be - built to visualize the over-use of Resources.

- -

In even further steps we would then start implementing algorithms to not just apply the changes onto - a Resource, but to actually search the Resource for time slots when the value changes would not - violate any constraints applied to the resource.

- -

We are very much looking forward to these new features. Stay tuned for your updates - even though - they do take their time to arrive =).

- -
- - - -
-

Strolch Documentation

- - - -

Any good software has some decent documentation explaining concepts, best practices and gives - examples.

-
-

So this post is to announce that there is now a new page on Strolch's website with a bit of - documentation. This first documentation explains the Strolch runtime and some of the do and don't in - Strolch code.

- -

Bear with us, writing documentation takes time and can be outdated quickly, so we will make an effort - to keep everything up to date and add more documentation, but this is a start.

- -

So go ahead and read the documentation , and if you haven't already, - also read the rest of the website which should give some more insight into the what, - why and how of Strolch.

- -
- - - -
-

Strolch Release 1.0.0

- - - -

Finally Version 1.0.0 of Strolch has been released and can be downloaded - immediately.

-
-

Before 1.0.0 could be released, some major changes were decided, all driven by the first big project - using Strolch as its underlying stack. Those changes were minor, and really major, but should make - Strolch better and was important for the first release.

- -

Here is a list of the most interesting changes:

-
    -
  • Java 8 - Strolch was ported to Java 8. This gives a lot of cool features: The stream API, - lambdas, the new time API, etc. -
  • -
  • TX refactoring: Strolch transactions are instances of Closeable so that they are - closed using a try-with-resource block in Java7. The change that was required was to not auto - commit. Now a TX is read-only and one has to set the auto commit as the last statement. See this - commit for more information. -
  • -
  • Added a tx.flush() to allow an implementation to flush part of a transaction, this - feature is vital to perform parts of a transaction before deciding if the TX should be - committed. -
  • -
  • Fixed the issue where data store mode CACHED performed TRANSACTIONAL - queries, instead of staying in-memory. -
  • -
  • ParameterSelection.stringListSelection() uses a StringMatchMode - instead of just equals()
  • -
  • ParameterSelection.dateRangeSelection() uses a DateRange instead of - just equals()
  • -
  • Added the MigrationsHandler to use to perform code migrations of production data - bases where data shouldn't go lost. -
  • -
  • And many more...
  • -
- -

Strolch 1.1.0 is already in development and can also be downloaded from the download page. Here you - can see the current change list on - GitHub. For instance heavy - work has been done to implement privilege management by adding a REST API. Looking forward to a - wonderful next Strolch release.

- -
- - - -
-

DurationParameter and other minor changes: Release 1.0.0-RC4

- - - -

New DurationParameter and additional minor changes: Release of 1.0.0-RC4 which can be - downloaded on the download page.

-
-

While implementing a use case in a Strolch based application it was detected that an essential - parameter type was missing, the DurationParameter. This parameter currently stores the - value as a long in memory and serializes to - ISO8601. As soon as we move Strolch to - Java8, we will change this to use the Period class in the new Java8 date and time API. -

- -

In addition to the new parameter, a couple of other changes were made:

-
    -
  • 32c1785 [Major] Added Session timeout handling
  • -
  • d55371e [Minor] fixed component version descriptions
  • -
  • c1cdfbb [Bugfix] added missing cloning of StringSetTimedState in Resources
  • -
  • 8f50a15 [Major] changed XML format of time value of TimedStates to be ISO8601
  • -
  • 5fbbe50 [Bugfix] fix NPE when cloning Resources with no state vars
  • -
  • b77f4b2 [New] added TimeVariable.clear()-method
  • -
  • Updated sub-module ch.eitchnet.utils to 906d24d
  • -
  • Updated sub-module ch.eitchnet.privilege to aa16887
  • -
- -

So, Strolch 1.0.0-RC4 is out the door, go ahead and try it out.

- -
- - - -
-

DB Initialization: Release 1.0.0-RC3

- - - -

Important feature Database Initialization added: Release of 1.0.0-RC3 which can be downloaded - on the download page.

-
-

When living continuous integration and continuous delivery, it is vital that things - like database migrations and initialization are performed in a controlled, but automatic way.

- -

A Strolch-based application is using the PostgreSQL persistence layer. The implementation understands - the concepts of migration, and validating the database schema, but currently a mechanism to - automatically initialize the database with a minimal set of data was missing.

- -

Migrating a database for Strolch is mostly a one time thing. The object model in Strolch is quite - static, so there is seldom a need to migrate the database. Domain specific changes, i.e. new - Resources, or adding Parameters to Resources, is not a schema change. Thus, instead of going the way - other frameworks go, e.g. Ruby on Rails, we built the data initialization right into the PersistenceHandler. -

- -

Now if the PostgreSQL PersistenceHandler creates the schema, then it might also - initialize the minimal set of data. For this to work, the PersistenceHandler checks if - the flags allowSchemaCreation, allowSchemaDrop and allowDbInitOnSchemaCreate. - If those flags are enabled, and the schema was created during initialization, then the database is - also initialized with the contents of the XML file configured under key dataStoreFile of - the relevant Realm.

- -

The database initialization is done as a system user action which must have the name db_initializer. - This is another fail-safe, so that on a production system, this user can simply be deleted.

- -

So, Strolch 1.0.0-RC3 is out the door, go ahead and try it out.

- -
- - - -
-

Release 1.0.0-RC2

- - - -

Scratch that RC1, here is the brand new 1.0.0-RC2 which can be downloaded on the - download page.

-
-

So, as expected there were a few bugs, for instance the Strolch tutorial apps didn't start, so now i - fixed those and released an RC2. Go get it and give it a try!

- -
- - - -
-

Release 1.0.0-RC1

- - - -

With the Go-Live of a Strolch-based application around the corner, it is time to release Version - 1.0.0 of Strolch. To this affect we have now released version 1.0.0-RC1 which can be downloaded on - the download page.

-
-

Story

- -

Strolch as a component based software agent has been two years in the making. The concepts in Strolch - have been taken from a proprietary planning, scheduling and controlling software agent, which was, - and is been, used in industrial automation, logistics and production. Strolch was created to bring - the concepts, which were working well for small teams to go-live with large projects in short to - medium time-frames to the open source world.

- -

Strolch was completely rewritten using the key concepts of a parameterized object model and a - component based agent but remembering which clutches the original implementation had, thus trying to - eradicate those without bringing in new ones. It might not be perfect in version 1.0.0, but it is a - starting point form which to carry on from.

- -

Features

- -

Strolch isn't feature complete by a long shot, but it sure has got many features which make it - useable in a concrete project, thus making sure it is not vaporware =)

- -

The following is a list of key features, many of which were driven by concrete project - requirements:

-
    -
  • Separate containers for models (mandates)
  • -
  • Parameterized model with full - CRUD for Resource and - Order objects -
  • -
  • Timed values on Resources to map values by time
  • -
  • Built-in versioning of model - configurable by Realm
  • -
  • Transparent runtime modes: TRANSIENT, CACHED, TRANSACTIONAL*
  • -
  • Service and Command pattern for reusing functionality
  • -
  • XML File based persistence - layer*
  • -
  • PostgreSQL persistence layer*
  • -
  • Querying using a fluent API
  • -
  • Services to import and export a model to XML
  • -
  • Integrated authentication and authorization to validate user privileges using - Privilege
  • -
  • Ready to use Observer pattern
  • -
  • (currently) Read-only REST API to access the - agent model remotely -
  • -
  • Configurable environments
  • -
  • Opt-in audit trail (including read access, and the audits themselves)
  • -
  • Basic components required to - communicate - with external devices using TCP/IP -
  • -
-

With the light weight implementation, where there are basically no third party libraries required for - the normal runtime, Strolch has a minimal foot print which allows it to run on small devices for - instance a BeagleBone Black. Using the - in-memory mode, it is an easy feat to set up test environments with little to no further requirements - than the JVM.

- -

Future

- -

So what is planned for the future? Although Strolch has quite a few interesting features, it is by no - way feature complete. The greatest wish is for Strolch to become a community driven platform, so many - new features will arise in the future, but at least one major future feature which will be tackled in - the near future and will certainly drive the next major release is a planning and scheduling engine - using a Gantt chart to visualize the schedule. -

- -

The planning engine will use the timed values on Resources extensively to create a planning engine on - which Workflows can be placed and allowing to detect violations and bottlenecks.

- -

An extension of the planning of the scheduling engine will allow more than just placing Workflows on - Resources, but actually searching groups of Resources for a time slot of when to place tasks. This - will allow to use capacity constraints to plan and schedule workflows using different algorithms, and - respecting calendars etc.

- -

Further time will be spent on giving Strolch it's own UI. Currently the idea is to use - Google's Polymer to implement the UI, thus creating - reusable widgets that can be used in projects.

- -

Take it for a spin

- -

So, now the important part is for new users to start using Strolch for their own projects. Go ahead, - check out the Downloads page for the latest release and then checkout - the two tutorial applications to get yourself up to speed!

- -

Don't hesitate to send us feedback or questions, we will be delighted to help you get your - Strolch-based application up and running, or provide feedback to your concerns!

- -

Developers

- -

Robert von Burg
Reto Breitenmoser
Dr. Martin Smock

- -

* Currently Transactional mode is missing concrete implementation for querying for the XML - persistence

- -
- - - - - -
- - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/css/blog.css b/li.strolch.website/www.strolch.li/css/blog.css deleted file mode 100644 index 7cabe0aa5..000000000 --- a/li.strolch.website/www.strolch.li/css/blog.css +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Globals - */ - -/* - * Override Bootstrap's default container. - */ - -/* - * Masthead for nav - */ - -.blog-masthead { - background-color: #428bca; - -webkit-box-shadow: inset 0 -2px 5px rgba(0,0,0,.1); - box-shadow: inset 0 -2px 5px rgba(0,0,0,.1); -} - -/* Nav links */ -.blog-nav-item { - position: relative; - display: inline-block; - padding: 10px; - font-weight: 500; - color: #cdddeb; -} -.blog-nav-item:hover, -.blog-nav-item:focus { - color: #fff; - text-decoration: none; -} - -/* Active state gets a caret at the bottom */ -.blog-nav .active { - color: #fff; -} -.blog-nav .active:after { - position: absolute; - bottom: 0; - left: 50%; - width: 0; - height: 0; - margin-left: -5px; - vertical-align: middle; - content: " "; - border-right: 5px solid transparent; - border-bottom: 5px solid; - border-left: 5px solid transparent; -} - -/* - * Main column and sidebar layout - */ - -.blog-main { - line-height: 1.5; -} - -.blog-sidebar { - margin-top: 100px; -} - -/* Sidebar modules for boxing content */ -.sidebar-module { - padding: 15px; - margin: 0 -15px 15px; -} -.sidebar-module-inset { - padding: 15px; - background-color: #f5f5f5; - border-radius: 4px; -} -.sidebar-module-inset p:last-child, -.sidebar-module-inset ul:last-child, -.sidebar-module-inset ol:last-child { - margin-bottom: 0; -} - - - -/* Pagination */ -.pager { - margin-bottom: 60px; - text-align: left; -} -.pager > li > a { - width: 140px; - padding: 10px 20px; - text-align: center; - border-radius: 30px; -} - - -/* - * Blog posts - */ - -.blog-post { - margin-bottom: 60px; -} -.blog-post-title { - margin-bottom: 5px; - font-size: 2.0em; -} -.blog-post-meta { - margin-bottom: 20px; - color: #999; -} - - -/* - * Footer - */ - -.blog-footer { - padding: 40px 0; - color: #999; - text-align: center; - background-color: #f9f9f9; - border-top: 1px solid #e5e5e5; -} -.blog-footer p:last-child { - margin-bottom: 0; -} diff --git a/li.strolch.website/www.strolch.li/css/bootstrap-theme.css b/li.strolch.website/www.strolch.li/css/bootstrap-theme.css deleted file mode 100644 index a4069929b..000000000 --- a/li.strolch.website/www.strolch.li/css/bootstrap-theme.css +++ /dev/null @@ -1,347 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); -} -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn:active, -.btn.active { - background-image: none; -} -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; -} -.btn-default:active, -.btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; -} -.btn-primary { - background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #2b669a; -} -.btn-primary:hover, -.btn-primary:focus { - background-color: #2d6ca2; - background-position: 0 -15px; -} -.btn-primary:active, -.btn-primary.active { - background-color: #2d6ca2; - border-color: #2b669a; -} -.btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #3e8f3e; -} -.btn-success:hover, -.btn-success:focus { - background-color: #419641; - background-position: 0 -15px; -} -.btn-success:active, -.btn-success.active { - background-color: #419641; - border-color: #3e8f3e; -} -.btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #28a4c9; -} -.btn-info:hover, -.btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; -} -.btn-info:active, -.btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; -} -.btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #e38d13; -} -.btn-warning:hover, -.btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; -} -.btn-warning:active, -.btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; -} -.btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #b92c28; -} -.btn-danger:hover, -.btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; -} -.btn-danger:active, -.btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; -} -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.navbar-default { - background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); -} -.navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); -} -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, .25); -} -.navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; -} -.navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); - background-image: linear-gradient(to bottom, #222 0%, #282828 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); -} -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); -} -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); -} -.alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); - background-repeat: repeat-x; - border-color: #b2dba1; -} -.alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); - background-repeat: repeat-x; - border-color: #9acfea; -} -.alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); - background-repeat: repeat-x; - border-color: #f5e79e; -} -.alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); - background-repeat: repeat-x; - border-color: #dca7a7; -} -.progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar { - background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); - background-repeat: repeat-x; -} -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); - background-repeat: repeat-x; - border-color: #3278b3; -} -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: 0 1px 2px rgba(0, 0, 0, .05); -} -.panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); - background-repeat: repeat-x; -} -.panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); - background-repeat: repeat-x; -} -.panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); - background-repeat: repeat-x; -} -.panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); - background-repeat: repeat-x; -} -.well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; - border-color: #dcdcdc; - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); -} -/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/li.strolch.website/www.strolch.li/css/bootstrap-theme.css.map b/li.strolch.website/www.strolch.li/css/bootstrap-theme.css.map deleted file mode 100644 index b36fc9a49..000000000 --- a/li.strolch.website/www.strolch.li/css/bootstrap-theme.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["less/theme.less","less/mixins.less"],"names":[],"mappings":"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","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","//\n// Mixins\n// --------------------------------------------------\n\n\n// Utilities\n// -------------------------\n\n// Clearfix\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n\n// WebKit-style focus\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n\n// Center-align a block level element\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\n// Sizing shortcuts\n.size(@width; @height) {\n width: @width;\n height: @height;\n}\n.square(@size) {\n .size(@size; @size);\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Text overflow\n// Requires inline-block or block for proper styling\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note\n// that we cannot chain the mixins together in Less, so they are repeated.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n\n\n\n// CSS3 PROPERTIES\n// --------------------------------------------------\n\n// Single side border-radius\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support the\n// standard `box-shadow` property.\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Transitions\n.transition(@transition) {\n -webkit-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n// Transformations\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n transform: rotate(@degrees);\n}\n.scale(@ratio; @ratio-y...) {\n -webkit-transform: scale(@ratio, @ratio-y);\n -ms-transform: scale(@ratio, @ratio-y); // IE9 only\n transform: scale(@ratio, @ratio-y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n transform: translate(@x, @y);\n}\n.skew(@x; @y) {\n -webkit-transform: skew(@x, @y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n transform: skew(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// User select\n// For selecting text on the page\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n\n// Resize anything\n.resizable(@direction) {\n resize: @direction; // Options: horizontal, vertical, both\n overflow: auto; // Safari fix\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Opacity\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n\n\n\n// GRADIENTS\n// --------------------------------------------------\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n\n// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n\n\n\n// Retina images\n//\n// Short retina mixin for setting background-image and -size\n\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// COMPONENT MIXINS\n// --------------------------------------------------\n\n// Horizontal dividers\n// -------------------------\n// Dividers (basically an hr) within dropdowns and nav lists\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n\n// Panels\n// -------------------------\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse .panel-body {\n border-top-color: @border;\n }\n }\n & > .panel-footer {\n + .panel-collapse .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n\n// Alerts\n// -------------------------\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n\n// Tables\n// -------------------------\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n\n// List Groups\n// -------------------------\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading { color: inherit; }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n\n// Button variants\n// -------------------------\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &:active,\n &.active,\n .open .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 8%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n// -------------------------\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n\n// Pagination\n// -------------------------\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n\n// Labels\n// -------------------------\n.label-variant(@color) {\n background-color: @color;\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n\n// Contextual backgrounds\n// -------------------------\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n\n// Typography\n// -------------------------\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n\n// Navbar vertical align\n// -------------------------\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n\n// Progress bars\n// -------------------------\n.progress-bar-variant(@color) {\n background-color: @color;\n .progress-striped & {\n #gradient > .striped();\n }\n}\n\n// Responsive utilities\n// -------------------------\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n\n\n// Grid System\n// -----------\n\n// Centered container element\n.container-fixed() {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n @media (min-width: @screen-xs-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-push(@columns) {\n @media (min-width: @screen-xs-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-pull(@columns) {\n @media (min-width: @screen-xs-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n\n// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-focus-border` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. ``\n// element gets special love because it's special, and that's a fact!\n\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-darker: lighten(#000, 13.5%); // #222\n@gray-dark: lighten(#000, 20%); // #333\n@gray: lighten(#000, 33.5%); // #555\n@gray-light: lighten(#000, 60%); // #999\n@gray-lighter: lighten(#000, 93.5%); // #eee\n\n@brand-primary: #428bca;\n@brand-success: #5cb85c;\n@brand-info: #5bc0de;\n@brand-warning: #f0ad4e;\n@brand-danger: #d9534f;\n\n\n//== Scaffolding\n//\n// ## Settings for some of the most global styles.\n\n//** Background color for ``.\n@body-bg: #fff;\n//** Global text color on ``.\n@text-color: @gray-dark;\n\n//** Global textual link color.\n@link-color: @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color: darken(@link-color, 15%);\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif: Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for ``, ``, and `
`.\n@font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          14px;\n@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5:            @font-size-base;\n@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base:        1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the ``.\n@headings-font-family:    inherit;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n//-- Iconography\n//\n//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n@icon-font-path:          \"../fonts/\";\n@icon-font-name:          \"glyphicons-halflings-regular\";\n@icon-font-svg-id:        \"glyphicons_halflingsregular\";\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical:     6px;\n@padding-base-horizontal:   12px;\n\n@padding-large-vertical:    10px;\n@padding-large-horizontal:  16px;\n\n@padding-small-vertical:    5px;\n@padding-small-horizontal:  10px;\n\n@padding-xs-vertical:       1px;\n@padding-xs-horizontal:     5px;\n\n@line-height-large:         1.33;\n@line-height-small:         1.5;\n\n@border-radius-base:        4px;\n@border-radius-large:       6px;\n@border-radius-small:       3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color:    #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg:       @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base:          4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large:         5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for ``s and ``s.\n@table-cell-padding:            8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding:  5px;\n\n//** Default background color used for all tables.\n@table-bg:                      transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent:               #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover:                #f5f5f5;\n@table-bg-active:               @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color:            #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #333;\n@btn-default-bg:                 #fff;\n@btn-default-border:             #ccc;\n\n@btn-primary-color:              #fff;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\n\n@btn-success-color:              #fff;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             darken(@btn-success-bg, 5%);\n\n@btn-info-color:                 #fff;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                darken(@btn-info-bg, 5%);\n\n@btn-warning-color:              #fff;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\n\n@btn-danger-color:               #fff;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color:        @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `` background color\n@input-bg:                       #fff;\n//** `` background color\n@input-bg-disabled:              @gray-lighter;\n\n//** Text color for ``s\n@input-color:                    @gray;\n//** `` border color\n@input-border:                   #ccc;\n//** `` border radius\n@input-border-radius:            @border-radius-base;\n//** Border color for inputs on focus\n@input-border-focus:             #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder:        @gray-light;\n\n//** Default `.form-control` height\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color:                   @gray-dark;\n@legend-border-color:            #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg:           @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg:                    #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border:                rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border:       #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg:            #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color:            @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color:      darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg:         #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color:     @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg:        @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color:   @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color:          @gray-light;\n\n// Note: Deprecated @dropdown-caret-color as of v3.1.0\n@dropdown-caret-color:           #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1010;\n@zindex-tooltip:           1030;\n@zindex-navbar-fixed:      1030;\n@zindex-modal-background:  1040;\n@zindex-modal:             1050;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n// Note: Deprecated @screen-xs and @screen-phone as of v3.0.1\n@screen-xs:                  480px;\n@screen-xs-min:              @screen-xs;\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n// Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n// Note: Deprecated @screen-md and @screen-desktop as of v3.0.1\n@screen-md:                  992px;\n@screen-md-min:              @screen-md;\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n// Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\n@screen-lg-desktop:          @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm-min - 1);\n@screen-sm-max:              (@screen-md-min - 1);\n@screen-md-max:              (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns:              12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width:         30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint:     @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet:             ((720px + @grid-gutter-width));\n//** For `@screen-sm-min` and up.\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            ((940px + @grid-gutter-width));\n//** For `@screen-md-min` and up.\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      ((1140px + @grid-gutter-width));\n//** For `@screen-lg-min` and up.\n@container-lg:                 @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height:       340px;\n\n@navbar-default-color:             #777;\n@navbar-default-bg:                #f8f8f8;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color:                #777;\n@navbar-default-link-hover-color:          #333;\n@navbar-default-link-hover-bg:             transparent;\n@navbar-default-link-active-color:         #555;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           #ddd;\n@navbar-default-toggle-icon-bar-bg:        #888;\n@navbar-default-toggle-border-color:       #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color:                      @gray-light;\n@navbar-inverse-bg:                         #222;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 @gray-light;\n@navbar-inverse-link-hover-color:           #fff;\n@navbar-inverse-link-hover-bg:              transparent;\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color:        #444;\n@navbar-inverse-link-disabled-bg:           transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color:          #fff;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            #333;\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\n@navbar-inverse-toggle-border-color:        #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n@nav-open-link-hover-color:                 #fff;\n\n//== Tabs\n@nav-tabs-border-color:                     #ddd;\n\n@nav-tabs-link-hover-border-color:          @gray-lighter;\n\n@nav-tabs-active-link-hover-bg:             @body-bg;\n@nav-tabs-active-link-hover-color:          @gray;\n@nav-tabs-active-link-hover-border-color:   #ddd;\n\n@nav-tabs-justified-link-border-color:            #ddd;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n//== Pills\n@nav-pills-border-radius:                   @border-radius-base;\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color:                     @link-color;\n@pagination-bg:                        #fff;\n@pagination-border:                    #ddd;\n\n@pagination-hover-color:               @link-hover-color;\n@pagination-hover-bg:                  @gray-lighter;\n@pagination-hover-border:              #ddd;\n\n@pagination-active-color:              #fff;\n@pagination-active-bg:                 @brand-primary;\n@pagination-active-border:             @brand-primary;\n\n@pagination-disabled-color:            @gray-light;\n@pagination-disabled-bg:               #fff;\n@pagination-disabled-border:           #ddd;\n\n\n//== Pager\n//\n//##\n\n@pager-bg:                             @pagination-bg;\n@pager-border:                         @pagination-border;\n@pager-border-radius:                  15px;\n\n@pager-hover-bg:                       @pagination-hover-bg;\n\n@pager-active-bg:                      @pagination-active-bg;\n@pager-active-color:                   @pagination-active-color;\n\n@pager-disabled-color:                 @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text:             #3c763d;\n@state-success-bg:               #dff0d8;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #31708f;\n@state-info-bg:                  #d9edf7;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text:             #8a6d3b;\n@state-warning-bg:               #fcf8e3;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text:              #a94442;\n@state-danger-bg:                #f2dede;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width:           200px;\n//** Tooltip text color\n@tooltip-color:               #fff;\n//** Tooltip background color\n@tooltip-bg:                  #000;\n@tooltip-opacity:             .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width:         5px;\n//** Tooltip arrow color\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg:                          #fff;\n//** Popover maximum width\n@popover-max-width:                   276px;\n//** Popover border color\n@popover-border-color:                rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color:       #ccc;\n\n//** Popover title background color\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width:                 10px;\n//** Popover arrow color\n@popover-arrow-color:                 #fff;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg:            @gray-light;\n//** Primary label background color\n@label-primary-bg:            @brand-primary;\n//** Success label background color\n@label-success-bg:            @brand-success;\n//** Info label background color\n@label-info-bg:               @brand-info;\n//** Warning label background color\n@label-warning-bg:            @brand-warning;\n//** Danger label background color\n@label-danger-bg:             @brand-danger;\n\n//** Default label text color\n@label-color:                 #fff;\n//** Default text color of a linked label\n@label-link-hover-color:      #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding:         20px;\n\n//** Padding applied to the modal title\n@modal-title-padding:         15px;\n//** Modal title line-height\n@modal-title-line-height:     @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg:                             #fff;\n//** Modal content border color\n@modal-content-border-color:                   rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color:          #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg:           #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity:      .5;\n//** Modal header border color\n@modal-header-border-color:   #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color:   @modal-header-border-color;\n\n@modal-lg:                    900px;\n@modal-md:                    600px;\n@modal-sm:                    300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg:                 #f5f5f5;\n//** Progress bar text color\n@progress-bar-color:          #fff;\n\n//** Default progress bar color\n@progress-bar-bg:             @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg:     @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg:     @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg:      @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg:        @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg:                 #fff;\n//** `.list-group-item` border color\n@list-group-border:             #ddd;\n//** List group border radius\n@list-group-border-radius:      @border-radius-base;\n\n//** Background color of single list elements on hover\n@list-group-hover-bg:           #f5f5f5;\n//** Text color of active list elements\n@list-group-active-color:       @component-active-color;\n//** Background color of active list elements\n@list-group-active-bg:          @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border:      @list-group-active-bg;\n@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);\n\n@list-group-link-color:         #555;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg:                    #fff;\n@panel-body-padding:          15px;\n@panel-border-radius:         @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border:          #ddd;\n@panel-footer-bg:             #f5f5f5;\n\n@panel-default-text:          @gray-dark;\n@panel-default-border:        #ddd;\n@panel-default-heading-bg:    #f5f5f5;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @state-info-border;\n@panel-info-heading-bg:       @state-info-bg;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding:           4px;\n//** Thumbnail background color\n@thumbnail-bg:                @body-bg;\n//** Thumbnail border color\n@thumbnail-border:            #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius:     @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color:     @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding:   9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg:                     #f5f5f5;\n@well-border:                 darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color:                 #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color:          @link-color;\n//** Badge background color in active nav link\n@badge-active-bg:             #fff;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical:   8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg:                 #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color:              #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color:       @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator:          \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@kbd-color:                   #fff;\n@kbd-bg:                      #333;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n\n//== Type\n//\n//##\n\n//** Text muted color\n@text-muted:                  @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color:           @gray-light;\n//** Headings small color\n@headings-small-color:        @gray-light;\n//** Blockquote small color\n@blockquote-small-color:      @gray-light;\n//** Blockquote font size\n@blockquote-font-size:        (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color:     @gray-lighter;\n//** Page header border color\n@page-header-border-color:    @gray-lighter;\n\n\n//== Miscellaneous\n//\n//##\n\n//** Horizontal line color.\n@hr-border:                   @gray-lighter;\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: @thumbnail-padding;\n  margin-bottom: @line-height-computed;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  > img,\n  a > img {\n    &:extend(.img-responsive);\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // Add a hover state for linked versions only\n  a&:hover,\n  a&:focus,\n  a&.active {\n    border-color: @link-color;\n  }\n\n  // Image captions\n  .caption {\n    padding: @thumbnail-caption-padding;\n    color: @thumbnail-caption-color;\n  }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      &:extend(.img-responsive);\n      line-height: 1;\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev { display: block; }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: none;\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    margin-left: -10px;\n    font-family: serif;\n  }\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: 30px;\n      height: 30px;\n      margin-top: -15px;\n      margin-left: -15px;\n      font-size: 30px;\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  color: @headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: floor((@font-size-base * 1.15));\n  font-weight: 200;\n  line-height: 1.4;\n\n  @media (min-width: @screen-sm-min) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: 14px base font * 85% = about 12px\nsmall,\n.small  { font-size: 85%; }\n\n// Undo browser default styling\ncite    { font-style: normal; }\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n\n// Contextual colors\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n  .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n  .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n  .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n  .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n  .bg-variant(@brand-primary);\n}\n.bg-success {\n  .bg-variant(@state-success-bg);\n}\n.bg-info {\n  .bg-variant(@state-info-bg);\n}\n.bg-warning {\n  .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n  .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// --------------------------------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n@media (min-width: @grid-float-breakpoint) {\n  .dl-horizontal {\n    dt {\n      float: left;\n      width: (@component-offset-horizontal - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @component-offset-horizontal;\n      &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n    }\n  }\n}\n\n// MISC\n// ----\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  font-size: @blockquote-font-size;\n  border-left: 5px solid @blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid @blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  white-space: nowrap;\n  border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @kbd-color;\n  background-color: @kbd-bg;\n  border-radius: @border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  max-width: 100%;\n  background-color: @table-bg;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-child(odd) {\n    > td,\n    > th {\n      background-color: @table-bg-accent;\n    }\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    > td,\n    > th {\n      background-color: @table-bg-hover;\n    }\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n@media (max-width: @screen-xs-max) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    overflow-x: scroll;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n    -webkit-overflow-scrolling: touch;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; /* IE8-9 */\n  line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS date input\n//\n// In Mobile Safari, date inputs require a pixel line-height that matches the\n// given height of the input.\n\ninput[type=\"date\"] {\n  line-height: @input-height-base;\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: @line-height-computed; // clear the floating input if there is no label text\n  margin-top: 10px;\n  margin-bottom: 10px;\n  padding-left: 20px;\n  label {\n    display: inline;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"],\n.radio,\n.radio-inline,\n.checkbox,\n.checkbox-inline {\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: (@input-height-base * 1.25);\n  }\n\n  // Feedback icon (requires .glyphicon classes)\n  .form-control-feedback {\n    position: absolute;\n    top: (@line-height-computed + 5); // Height of the `label` and its margin\n    right: 0;\n    display: block;\n    width: @input-height-base;\n    height: @input-height-base;\n    line-height: @input-height-base;\n    text-align: center;\n  }\n}\n\n// Feedback states\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  margin-bottom: 0; // Remove default margin from `p`\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match (which also avoids\n    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      padding-left: 0;\n      vertical-align: middle;\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      float: none;\n      margin-left: 0;\n    }\n\n    // Validation states\n    //\n    // Reposition the icon because it's now within a grid column and columns have\n    // `position: relative;` on them. Also accounts for the grid gutter padding.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of labels, radios, and checkboxes\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: (@line-height-computed + (@padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  .form-control-static {\n    padding-top: (@padding-base-vertical + 1);\n  }\n\n  // Only right align form labels here when the columns stop stacking\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    top: 0;\n    right: (@grid-gutter-width / 2);\n  }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: @btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n  .user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus {\n      .tab-focus();\n    }\n  }\n\n  &:hover,\n  &:focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  cursor: pointer;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n    &:focus {\n      // Remove focus outline when dropdown JS adds it after closing the menu\n      outline: none;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  &:extend(.clearfix all);\n\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    .box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    &:extend(.clearfix all);\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n}\n\n\n// Checkbox and radio options\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n  &.in {\n    display: block;\n  }\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition(height .35s ease);\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n//  Star\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: ~\"url('@{icon-font-path}@{icon-font-name}.eot')\";\n  src: ~\"url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.woff') format('woff')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg')\";\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\2a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\2b\"; } }\n.glyphicon-euro                   { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base solid;\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: not-allowed;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: @caret-width-base solid;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .dropdown-menu-right();\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      .dropdown-menu-left();\n    }\n  }\n}\n\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn { .input-lg(); }\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn { .input-sm(); }\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: @input-color;\n  text-align: center;\n  background-color: @input-group-addon-bg;\n  border: 1px solid @input-group-addon-border-color;\n  border-radius: @border-radius-base;\n\n  // Sizing\n  &.input-sm {\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    border-radius: @border-radius-small;\n  }\n  &.input-lg {\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    border-radius: @border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  &:extend(.clearfix all);\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: not-allowed;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n     > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: @border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid @nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: @nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  max-height: @navbar-collapse-max-height;\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  &:extend(.clearfix all);\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -@navbar-padding-horizontal;\n    margin-left:  -@navbar-padding-horizontal;\n\n    @media (min-width: @grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: @zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  height: @navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: none;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    @navbar-padding-vertical;\n        padding-bottom: @navbar-padding-vertical;\n      }\n    }\n\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.btn-sm {\n    .navbar-vertical-align(@input-height-small);\n  }\n  &.btn-xs {\n    .navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: 0;\n    }\n  }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        .divider {\n          background-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.center-block {\n  .center-block();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      color: @pagination-color;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      color: @pagination-hover-color;\n      background-color: @pagination-hover-bg;\n      border-color: @pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-disabled-bg;\n      border-color: @pagination-disabled-border;\n      cursor: not-allowed;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  &:extend(.clearfix all);\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pager-bg;\n      border: 1px solid @pager-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pager-bg;\n      cursor: not-allowed;\n    }\n  }\n\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  &[href] {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  .label-variant(@label-default-bg);\n}\n\n.label-primary {\n  .label-variant(@label-primary-bg);\n}\n\n.label-success {\n  .label-variant(@label-success-bg);\n}\n\n.label-info {\n  .label-variant(@label-info-bg);\n}\n\n.label-warning {\n  .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n  .label-variant(@label-danger-bg);\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base classes\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n  .btn-xs & {\n    top: 0;\n    padding: 1px 5px;\n  }\n}\n\n// Hover state, but only for links\na.badge {\n  &:hover,\n  &:focus {\n    color: @badge-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Account for counters in navs\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: @badge-active-color;\n  background-color: @badge-active-bg;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: @jumbotron-padding;\n  margin-bottom: @jumbotron-padding;\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: @jumbotron-heading-color;\n  }\n  p {\n    margin-bottom: (@jumbotron-padding / 2);\n    font-size: @jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  .container & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: @screen-sm-min) {\n    padding-top:    (@jumbotron-padding * 1.6);\n    padding-bottom: (@jumbotron-padding * 1.6);\n\n    .container & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: (@font-size-base * 4.5);\n    }\n  }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headings-color\n    color: inherit;\n  }\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissable alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable {\n padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  line-height: @line-height-computed;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n.progress-striped .progress-bar {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n.progress.active .progress-bar {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n  display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n  > .pull-left {\n    margin-right: 10px;\n  }\n  > .pull-right {\n    margin-left: 10px;\n  }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on 
    ,
      , or
      .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n\n // Align badges within list items\n > .badge {\n float: right;\n }\n > .badge + .badge {\n margin-right: 5px;\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @list-group-hover-bg;\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: 10px 15px;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table {\n margin-bottom: 0;\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n overflow: hidden; // crop contents when collapsed\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n + .panel-collapse .panel-body {\n border-top: 1px solid @panel-inner-border;\n }\n }\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: auto;\n overflow-y: scroll;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0)}\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: none;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n margin-top: 15px;\n padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n visibility: visible;\n font-size: @font-size-small;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n text-align: left; // Reset given new insertion method\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 18px;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#browsers\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n"]} \ No newline at end of file diff --git a/li.strolch.website/www.strolch.li/css/bootstrap.min.css b/li.strolch.website/www.strolch.li/css/bootstrap.min.css deleted file mode 100644 index 679272d25..000000000 --- a/li.strolch.website/www.strolch.li/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! normalize.css v3.0.0 | MIT License | git.io/normalize */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,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:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;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;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/li.strolch.website/www.strolch.li/css/custom.css b/li.strolch.website/www.strolch.li/css/custom.css deleted file mode 100644 index 728267f79..000000000 --- a/li.strolch.website/www.strolch.li/css/custom.css +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Globals - */ - -/* - * Override Bootstrap's default container. - */ - -.content { - padding: 0px 2em 3em; -} - -blockquote { - font-size: 1.0em; -} - -@media (min-width: 1200px) { - .container { - width: 970px; - } -} - -.page-header { - padding-top: 20px; -} - -.page-title { - margin-top: 30px; - margin-bottom: 0; - font-size: 2.2em; - font-weight: normal; -} - -.page-description { - padding-top: 20px; - font-size: 1.6em; - color: #999; -} - -#footer { - font-size: 0.8em; -} - -.image { - display: block; - margin-left: auto; - margin-right: auto; - margin-bottom: 10px; -} \ No newline at end of file diff --git a/li.strolch.website/www.strolch.li/css/downloads.css b/li.strolch.website/www.strolch.li/css/downloads.css deleted file mode 100644 index b232e94f0..000000000 --- a/li.strolch.website/www.strolch.li/css/downloads.css +++ /dev/null @@ -1,14 +0,0 @@ -.release, .snapshot { - float: left; - padding: 20px; -} -.release { - width: 350px; -} -.snapshot { - width: 350px; -} - -.previousRelease { - clear: both; -} \ No newline at end of file diff --git a/li.strolch.website/www.strolch.li/development.html b/li.strolch.website/www.strolch.li/development.html deleted file mode 100644 index 2efe67013..000000000 --- a/li.strolch.website/www.strolch.li/development.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - Strolch: Development - - - - - - - - - - - - -
      - - - -
      -

      Prerequisites

      - To start developing Strolch you need an installed: -
        -
      • Java JDK 8
      • -
      • Apache Maven 3
      • -
      - -

      Building Strolch

      -

      Setting up Strolch is just a few lines:

      -
      -git clone https://github.com/4treesCH/strolch.git
      -cd strolch
      -mvn clean install -DskipTests
      - -

      Note: To run the tests you will need to configure the PostgreSQL Databases. See the README in the - module.

      - -

      After running the Maven build, you will have a full build of all Strolch projects. Now you can start - modifying the projects, and add your own features, or, far more interesting, start developing your projects - using the Strolch agent.

      - -

      Creating a Strolch App

      -

      To create your own Strolch App, you can use Maven's archetype generation. There are two versions, one is a - simple Java App which you can use to directly access the Strolch runtime, and the second is to create a Java - Web App, which is the usual way to run Strolch runtimes.

      - -

      Note: you need to have installed Strolch to your local maven repo, otherwise the archetype won't be - available.

      - -

      Creating a simple Java Strolch App

      -

      The following shows the maven command to create the new maven project. Note that you should replace the - placeholders in the brackets:

      -
      -mvn archetype:generate \
      -  -DarchetypeGroupId=li.strolch \
      -  -DarchetypeArtifactId=li.strolch.mvn.archetype.main \
      -  -DarchetypeVersion=1.6.0-SNAPSHOT \
      -  -DgroupId=<my.groupid> \
      -  -DartifactId=<my-artifactId> \
      -  -Dversion=<my.version> \
      -  -DappName="<my app name>"
      - -

      You change into the directory of the new project and then build the project by calling:

      -
      -cd <my-artifactId>
      -mvn clean package
      - -

      Start the program using:

      -
      -mvn exec:java
      - -

      Happy coding =))

      - -

      Creating a Java Strolch Web App

      -

      The following shows the maven command to create the new maven project. Note that you should replace the - placeholders in the brackets:

      -
      -mvn archetype:generate \
      -  -DarchetypeGroupId=li.strolch \
      -  -DarchetypeArtifactId=li.strolch.mvn.archetype.webapp \
      -  -DarchetypeVersion=1.6.0-SNAPSHOT \
      -  -DgroupId=<my.groupid> \
      -  -DartifactId=<my-artifactId> \
      -  -Dversion=<my.version> \
      -  -DappName="<my app name>"
      - -

      Install the web dependencies

      -

      The Strolch Web App uses NodeJS v11.x to build - the web dependencies. Please download the relevant platform's package, unpack it, and add the - bin directory to your path variable.

      -

      Once NodeJS is installed, then you can prepare the web dependencies:

      -
      -cd src/main/webapp/
      -npm install gulp -g
      -npm install
      -gulp
      - -

      Note: Whenever the bower.json is changed then you should again call npm - install - inside the webapp folder.

      - -

      Building the WAR

      -

      Building the WAR uses the package maven goal, but to have the optimized WAR use the release - profile:

      -
      -mvn clean package -Prelease
      - -

      Happy coding =))

      - - - -

      Tools used

      - The following tools are used to develop Strolch and Strolch-based projects: -
        -
      • IntelliJ IDEA
      • -
      • Apache Maven 3.0
      • -
      • git scm
      • -
      - -
      - - - -
      - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-architecture.html b/li.strolch.website/www.strolch.li/documentation-architecture.html deleted file mode 100644 index bcd4ff32d..000000000 --- a/li.strolch.website/www.strolch.li/documentation-architecture.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - Strolch: Architecture - - - - - - - - - - - - -
      - - - -
      - -

      Birds View

      - -

      A Strolch agent's architecture can be seen as a simple three-tier architecture. The presentation layer is - mostly a web frontend, where the communication with the agent is done via REST API calls.

      - -

      The agent itself implements the business logic using Services, Commands, Queries etc.

      - -

      The agent can communicate with other 3rd systems using any API, where it is preferred to use JSON over - REST.

      - -

      The agent can use a standard RDBMS as a storage system, where currently DAOs have been implemented only for - PostgreSQL. Should it be required, then any JDBC cabable RDBMS can be used, as no PostgreSQL specific SQL - commands are used.

      - -

      The following diagram helps visualize this:

      - - Strolch Agent Bird View - -
      - -

      Squirrel View

      - -

      The following diagram shows a more detailed view of the architecture of a Strolch Agent.

      - - Strolch Agent Squirrel View - -
      - -

      A Strolch agent consists of the following main parts:

      -
        -
      • REST Endpoints → expose an API to access the Strolch agent outside of the Java VM
      • -
      • Services and Commands → implements business logic
      • -
      • Searches → implements specific queries against the Strolch model
      • -
      • Components → Implements additional logic, which is best implement as a component. E.g. active - components which have threads, etc. -
      • -
      • Realms → implements multi-tenant capabilities
      • -
      - -

      In addition to the main parts, Strolch contains inherit capabilities, which gives Strolch unique features - when compared to other Java Frameworks:

      -
        -
      • Policies → Policies allow injecting different algorithms. All root elements can store Policy - definitions, so that a service can delegate to a Policy and thus behave differently, depending on the - element being accessed. -
      • -
      • Transactions → Transactions handle locking/unlocking of objects, updating the model and are the - central API for the developer. -
      • -
      • Privileges → Strolch is user agnostic and any action, i.e. Service, Query, etc. is authorized - against the authenticated user. -
      • -
      • Observers → modifications to the model are propagated to listeners using the observer pattern.
      • -
      • Audits → Every access (read, modify) of the model are audited
      • -
      • Versioning → modifications to objects are versioned and thus can be rolled back at a later time. -
      • - -
      - - - - -
      - - - - -
      - - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-components.html b/li.strolch.website/www.strolch.li/documentation-components.html deleted file mode 100644 index 2281ec1cb..000000000 --- a/li.strolch.website/www.strolch.li/documentation-components.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - - - - - - Strolch: Components - - - - - - - - - - - - -
      - - - -
      - -

      A Strolch agent can be easily extended with arbitrary components. An agent is basically a container for - classes extending StrolchComponent. Theses classes mostly implement an interface which describes - the operations that are supported by the component.

      - -

      The following represents a list of the most used components:

      -
        -
      • RealmHandler: li.strolch.agent.impl.DefaultRealmHandler
      • -
      • PrivilegeHandler: li.strolch.runtime.privilege.DefaultStrolchPrivilegeHandler
      • -
      • EnumHandler: li.strolch.runtime.query.enums.DefaultEnumHandler
      • -
      • PolicyHandler: li.strolch.policy.DefaultPolicyHandler
      • -
      • ServiceHandler: li.strolch.service.api.DefaultServiceHandler
      • -
      • StrolchSessionHandler: li.strolch.rest.DefaultStrolchSessionHandler
      • -
      • PersistenceHandler: multiple implementations
      • -
      • PostInitializer: project specific implementation
      • -
      • MailHandler: li.strolch.handler.mail.SmtpMailHandler
      • -
      - -

      A component has a life-cycle, which is governed by the Agent's own life-cycle. The life-cycle is as - follows:

      - -
      -    setup -> initialize -> start <-> stop -> destroy
      - -

      The setup step is used to instantiate the component, the initialize step is used to validate configuration - parameters, and the run step is used to start the component, i.e. start threads, etc. The stop step stops - these threads and also allows the component to be started again. The destroy step destroys the instance and - makes it unusable anymore, i.e. shutdown of the agent.

      - -

      Each component has its own configuration parameters. A component is registered in the StrolchConfiguration.xml - file with a

      -
        -
      • name
      • -
      • api class name
      • -
      • implementation class name
      • -
      • configuration parameters
      • -
      • any required dependencies
      • -
      - -

      The dependencies is an important feature as the dependencies of a component are always started before the - actual component.

      - -

      By example of the MailHandler we shall show how a strolch component would be implemented.

      - -

      First define an interface:

      -
      -    public interface MailHandler {
      -      public void sendMail(String subject, String text, String recipient);
      -    }
      -        
      - - -

      Then implement a concrete MailHandler:

      - -
      -public class SmtpMailHandler extends StrolchComponent implements MailHandler {
      -
      -  // instance fields with configuration properties to send the mail
      -
      -  public SmtpMailHandler(ComponentContainer container, String componentName) {
      -    super(container, componentName);
      -  }
      -
      -  @Override
      -  public void initialize(ComponentConfiguration configuration) throws Exception {
      -
      -    // store any properties needed from the configuration
      -
      -    super.initialize(configuration);
      -  }
      -
      -  @Override
      -  public void sendMail(String subject, String text, String recipient) {
      -
      -    // send the e-mail using SMTP, or store in stack to send by thread
      -  }
      -}
      -        
      - -

      Now that the component is written, it must be registered on the component, so that it is loaded when the - agent is started. For this the StrolchConfiguration.xml file must be modified to include a - component element:

      - -
      -<StrolchConfiguration>
      -  <env id="dev">
      -    ...
      -    <Component>
      -      <name>MailHandler</name>
      -      <api>li.strolch.handler.mail.MailHandler</api>
      -      <impl>li.strolch.handler.mail.SmtpMailHandler</impl>
      -      <Properties>
      -        <username>test</username>
      -        <password>test</password>
      -        <hostName>localhost</hostName>
      -        ...
      -      </Properties>
      -    </Component>
      -    ...
      -  </env>
      -</StrolchConfiguration>
      -
      - -

      Now when the agent is started, the component can be retrieved and used. E.g from inside a - Service:

      - -
      -MailHandler mailHandler = getComponent(MailHandler.class);
      -mailHandler.sendMail("My Subject", "Hello World", "test@test.ch");
      -        
      -
- - - - - - - - - - - - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-do-and-dont.html b/li.strolch.website/www.strolch.li/documentation-do-and-dont.html deleted file mode 100644 index 2d54e1744..000000000 --- a/li.strolch.website/www.strolch.li/documentation-do-and-dont.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - Strolch: Do and Don't - - - - - - - - - - - - -
- - - -
-

Dos and Don'ts

-
    -
  • 1 Service per use-case, should mostly delegate to Commands.
  • -
  • Commands implement use-cases or parts of it, and are thus reusable.
  • -
  • Subclass ResourceSearch, OrderSearch and ActivitySearch when - implementing use-case specific search - this allows privilege checking. -
  • -
  • One Transaction at a time - no TX inside of another TX.
  • -
  • Commands are added to TXs and performed on close: tx.addCommand(Command) and then tx.commitOnClose() -
  • -
  • Use tx.flush() if you need to perform first some work and then as late as possible call tx.commitOnClose() -
  • -
  • Only access ElementMaps if really no other way, mostly use tx.get*By(), tx.findBy() - and queries - if a specific get is missing, then add the method to StrolchTransaction and - send a pull request! -
  • -
  • Use tx.stream*() methods to iterate over all elements, if you don't want to use a search. -
  • -
  • Don't write logic in REST API beans. Delegate to other services, making your code reusable!
  • -
  • Transform to JSON using the StrolchElementToJsonVisitor.
  • -
  • References between objects is done by adding a ParameterBag with the id - relations to the object and then StringParameters with the value being the ID, - the UOM set to the type of element being referenced and the Interpretation set to the class type being - referenced. -
  • -
- - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-model.html b/li.strolch.website/www.strolch.li/documentation-model.html deleted file mode 100644 index feac3b550..000000000 --- a/li.strolch.website/www.strolch.li/documentation-model.html +++ /dev/null @@ -1,391 +0,0 @@ - - - - - - - - - - - - Strolch: Model - - - - - - - - - - - - -
- - - -
- -

Before we dive into the entire model, let's show an example and how it would be modelled in Strolch and use - in Strolch:

- Strolch model example -

A possible model would look as follows:

-
-<?xml version="1.0" encoding="UTF-8" ?>
-<StrolchModel xmlns="https://strolch.li/xsd/StrolchModel-1.6.xsd">
-
-    <Resource Id="Product" Name="Product Template" Type="Template">
-        <ParameterBag Id="parameters" Name="Parameters" Type="Parameters">
-            <Parameter Id="description" Name="Description" Type="String" Value=""/>
-            <Parameter Id="color" Name="Color" Type="String" Value=""/>
-            <Parameter Id="form" Name="Form" Type="String" Value=""/>
-        </ParameterBag>
-        <ParameterBag Id="relations" Name="Relations" Type="Relations">
-            <Parameter Id="articles" Name="Articles" Type="StringList" Interpretation="Resource-Ref" Uom="Article" Value=""/>
-        </ParameterBag>
-    </Resource>
-
-    <Resource Id="Article" Name="Article Template" Type="Template">
-        <ParameterBag Id="parameters" Name="Parameters" Type="Parameters">
-            <Parameter Id="description" Name="Description" Type="String" Value=""/>
-            <Parameter Id="barcode" Name="Barcode" Type="String" Value=""/>
-        </ParameterBag>
-        <ParameterBag Id="relations" Name="Relations" Type="Relations">
-            <Parameter Id="product" Name="Product" Type="String" Interpretation="Resource-Ref" Uom="Product" Value=""/>
-        </ParameterBag>
-    </Resource>
-
-    <Resource Id="Customer" Name="Customer Template" Type="Template">
-        <ParameterBag Id="address" Name="Address" Type="Address">
-            <Parameter Id="street" Name="Street" Type="String" Value=""/>
-            <Parameter Id="zip" Name="Zip" Type="String" Value=""/>
-            <Parameter Id="city" Name="City" Type="String" Value=""/>
-            <Parameter Id="country" Name="Country" Type="String" Value=""/>
-        </ParameterBag>
-    </Resource>
-
-    <Order Id="Order" Name="Order" Type="Template">
-        <ParameterBag Id="quantities" Name="Quantities per Article Id" Type="Quantities">
-            <Parameter Id="quantity" Name="Quantity" Type="Float" Value="0"/>
-        </ParameterBag>
-        <ParameterBag Id="relations" Name="Relations" Type="Relations">
-            <Parameter Id="articles" Name="Articles" Type="StringList" Interpretation="Resource-Ref" Uom="Article" Value=""/>
-            <Parameter Id="customer" Name="Customer" Type="String" Interpretation="Resource-Ref" Uom="Customer" Value=""/>
-        </ParameterBag>
-    </Order>
-
-</StrolchModel>
-

Let's go through this model:

-
    -
  • In the above model we see that the id and name fields are always on the - element, and thus aren't added as parameters. Further most elements have a parameters - ParameterBag, with one or more parameters, modelling the fields.

  • -
  • Note that in this example the Type of all the elements is Template. Strolch - has API support to create a clone of these elements, so that they have a unique ID, and the proper - type for persistence.

    -
  • -
  • The Product element has three parameters: description, color - and form. In this case they are all of type String. Further the relations - ParameterBag defines the relationships, i.e. the product knows its articles. Note how the relation is - first defined in a relations ParameterBag and that the Parameter has Interpretation="Resource-Ref" - Uom="Product" - attributes. Strolch has API support for this, making it trivial to retrieve a dependency.

  • -
  • The Article element has two parameters description and barcode. - Further it has a reference to its Product.

  • -
  • The Order element doesn't model the date and state fields as - parameters, as these are inherently part of an Order element. The Order does define two references to - customer and articles. A special case is the quantities - ParameterBag. This bag of parameters is used to store the per article quantity for this order. With - ParameterBags, you can eliminate the use of simple aggregate classes, as is commonly used in - object-oriented programming. -
  • -
  • The Customer element models a address ParameterBag to store the address of a - customer. Using a separate bag allows for further more direct fields to stored on the default parameters - bag. -
  • -
- -

Now that we have a basic understanding of te model, it is of far more interest in how to create and interact - with these elements at runtime. The following listing will perform simple operations:

-
-try (StrolchTransaction tx = runtimeMock.openUserTx(certificate, false)) {
-
-    /*
-     * create a new product
-     */
-    Resource dafalgan = tx.getResourceTemplate("Product", true);
-    dafalgan.setName("Dafalgan 100mg");
-    dafalgan.getParameter("description", true).setValue("Dafalgan is for pain.");
-    dafalgan.getParameter("color", true).setValue("Yellow");
-    dafalgan.getParameter("form", true).setValue("flat");
-
-    StringListParameter articlesP = dafalgan.getRelationsParam("articles", true);
-
-    /*
-     * create articles
-     */
-    Resource dafalgan1 = tx.getResourceTemplate("Article", true);
-    dafalgan1.setName("Dafalgan 100mg 10 pce");
-    dafalgan1.getParameter("description", true).setValue("This is pack with 10 pieces.");
-    dafalgan1.getParameter("barcode", true).setValue("654654");
-
-    Resource dafalgan2 = tx.getResourceTemplate("Article", true);
-    dafalgan2.setName("Dafalgan 100mg 20 pce");
-    dafalgan2.getParameter("description", true).setValue("This is pack with 20 pieces.");
-    dafalgan2.getParameter("barcode", true).setValue("654655");
-
-    /*
-     * add reference to product
-     */
-    dafalgan1.getRelationParam("product").setValue(dafalgan.getId());
-    articlesP.addValue(dafalgan1.getId());
-    dafalgan2.getRelationParam("product").setValue(dafalgan.getId());
-    articlesP.addValue(dafalgan2.getId());
-
-    /*
-     * create a new customer
-     */
-    Resource customer1 = tx.getResourceTemplate("Customer", true);
-    customer1.setName("John Doe");
-
-    // set address
-    ParameterBag addressBag = customer1.getParameterBag("address", true);
-    addressBag.getParameter("street", true).setValue("Main Str. 1");
-    addressBag.getParameter("zip", true).setValue("1234");
-    addressBag.getParameter("city", true).setValue("Hometown");
-    addressBag.getParameter("country", true).setValue("Switzerland");
-
-    /*
-     * create a new order
-     */
-    Order order = tx.getOrderTemplate("Order", true);
-    order.setName("Order for " + customer1.getName());
-    order.setDate(LocalDate.of(2021, 2, 1));
-    order.setState(State.PLANNED);
-
-    // store reference to customer
-    order.getRelationParam("customer", true).setValue(customer1.getId());
-
-    StringListParameter orderArticlesP = order.getRelationsParam("articles", true);
-    ParameterBag quantitiesBag = order.getParameterBag("quantities", true);
-    FloatParameter quantityT = quantitiesBag.removeParameter("quantity");
-
-    // order quantity of 20 for Dafalgan 1
-    FloatParameter q1P = quantityT.getClone();
-    q1P.setId(dafalgan1.getId());
-    q1P.setValue(20);
-    quantitiesBag.addParameter(q1P);
-    orderArticlesP.addValue(dafalgan1.getId());
-
-    // set order quantity of 10 for Dafalgan 2
-    FloatParameter q2P = quantityT.getClone();
-    orderArticlesP.addValue(dafalgan2.getId());
-    q2P.setId(dafalgan2.getId());
-    q2P.setValue(20);
-    quantitiesBag.addParameter(q2P);
-
-    // keep IDs for later use
-    dafalganId = dafalgan.getId();
-    dafalgan1Id = dafalgan1.getId();
-    dafalgan2Id = dafalgan2.getId();
-    customerId = customer1.getId();
-    orderId = order.getId();
-
-    /*
-     * persist
-     */
-    tx.add(dafalgan);
-    tx.add(dafalgan1);
-    tx.add(dafalgan2);
-    tx.add(customer1);
-    tx.add(order);
-
-    // commit
-    tx.commitOnClose();
-}
-
-try (StrolchTransaction tx = runtimeMock.openUserTx(certificate, true)) {
-
-    // get order
-    Order order = tx.getOrderBy("Order", orderId, true);
-    assertNotNull(orderId);
-    assertEquals("Order for John Doe", order.getName());
-
-    // get customer
-    Resource customer = tx.getResourceByRelation(order, "customer", true);
-    assertNotNull(customer);
-    assertEquals("John Doe", customer.getName());
-
-    // get articles
-    List<Resource> articles = tx.getResourcesByRelation(order, "articles", true);
-    assertEquals(2, articles.size());
-
-    // get products
-    List<Resource> products = articles.stream().map(a -> tx.getResourceByRelation(a, "product", true))
-            .distinct().collect(Collectors.toList());
-    assertEquals(1, products.size());
-
-    // search for all orders in state PLANNED and with customer
-    List<Order> orders = new OrderSearch().types("Order").stateIsIn(State.PLANNED)
-            .where(ExpressionsSupport.relationParam("customer").isEqualTo(customerId)).search(tx).toList();
-    assertEquals(1, orders.size());
-}
- -

Note: Checkout - example-model.xml - and - SimpleModelTest.java - for these examples.

- -

There is a XML Schema which defines the model in XML: - StrolchModel-1.6.xsd -

- - Here is an example of all the possible elements in Strolch: -
-<StrolchModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-            xmlns="https://strolch.li/xsd/StrolchModel-1.6.xsd"
-            xsi:schemaLocation="https://strolch.li/xsd/StrolchModel-1.6.xsd StrolchModel-1.6.xsd">
-
-  <IncludeFile file="Include1.xml"/>
-
-  <Order Id="@test1" Name="Test Order" Type="Order">
-    <Version Version="0" CreatedBy="test" CreatedAt="2012-11-30T18:12:05.628+01:00" Deleted="false"/>
-    <ParameterBag Id="@bag01" Name="Test Bag" Type="TestBag">
-      <Parameter Id="@param1" Name="Boolean Param" Type="Boolean" Value="true"/>
-    </ParameterBag>
-    <ParameterBag Id="@bag01" Name="Test Bag" Type="TestBag">
-      <Parameter Id="@param1" Name="Boolean Param" Type="Boolean" Value="true"/>
-    </ParameterBag>
-    <Policies>
-      <Policy Type="PlanningPolicy" Value="key:SimplePlanning"/>
-      <Policy Type="ConfirmationPolicy" Value="key:NoConfirmation"/>
-    </Policies>
-  </Order>
-
-  <Resource Id="MyTestResource" Name="Test Name" Type="TestType">
-    <Version Version="0" CreatedBy="test" CreatedAt="2012-11-30T18:12:05.628+01:00" Deleted="false"/>
-    <ParameterBag Id="@bag01" Name="Test Bag 01" Type="TestBag">
-      <Parameter Id="@param1" Name="Boolean Param" Type="Boolean" Value="true"/>
-    </ParameterBag>
-    <ParameterBag Id="@bag02" Name="Test Bag 02" Type="TestBag">
-      <Parameter Id="@param1" Name="Boolean Param" Type="Boolean" Value="true"/>
-    </ParameterBag>
-    <TimedState Id="@booleanState" Name="Boolean State" Type="Boolean">
-      <Value Time="1970-01-01T00:02:00.000+01:00" Value="false"/>
-    </TimedState>
-    <Policies>
-      <Policy Type="PlanningPolicy" Value="key:SimplePlanning"/>
-      <Policy Type="ConfirmationPolicy" Value="key:NoConfirmation"/>
-    </Policies>
-  </Resource>
-
-  <Activity Id="activity_1" Name="Activity" Type="parentType" TimeOrdering="Series">
-    <Version Version="0" CreatedBy="test" CreatedAt="2012-11-30T18:12:05.628+01:00" Deleted="false"/>
-    <ParameterBag Id="@bag01" Name="Test Bag" Type="TestBag">
-      <Parameter Id="@param1" Name="Boolean Param" Type="Boolean" Value="true"/>
-    </ParameterBag>
-    <Policies>
-      <Policy Type="PlanningPolicy" Value="key:SimplePlanning"/>
-      <Policy Type="ConfirmationPolicy" Value="key:NoConfirmation"/>
-    </Policies>
-    <Action Id="action_1" Name="Action 1" ResourceId="dummyId" ResourceType="dummyType" State="Created" Type="Use">
-      <ParameterBag Id="@bag01" Name="Test Bag" Type="TestBag">
-        <Parameter Id="@param1" Name="Boolean Param" Type="Boolean" Value="true"/>
-      </ParameterBag>
-      <Policies>
-        <Policy Type="PlanningPolicy" Value="key:SimplePlanning"/>
-        <Policy Type="ConfirmationPolicy" Value="key:NoConfirmation"/>
-      </Policies>
-      <ValueChange StateId="dummyId" Time="2012-11-30T18:12:05.628+01:00" Value="5" Type="Integer"/>
-      <ValueChange StateId="dummyId" Time="2012-11-30T18:12:06.628+01:00" Value="6" Type="Integer"/>
-    </Action>
-    <Activity Id="child_activity" Name="Child Activity" Type="childType" TimeOrdering="Series">
-      <ParameterBag Id="@bag01" Name="Test Bag" Type="TestBag">
-        <Parameter Id="@param1" Name="Boolean Param" Type="Boolean" Value="true"/>
-      </ParameterBag>
-      <Policies>
-        <Policy Type="PlanningPolicy" Value="key:SimplePlanning"/>
-        <Policy Type="ConfirmationPolicy" Value="key:NoConfirmation"/>
-      </Policies>
-      <Action Id="action_2" Name="Action 2" ResourceId="dummyId" ResourceType="dummyType" State="Planned"
-          Type="Use">
-        <ValueChange StateId="dummyId" Time="2012-11-30T18:12:05.628+01:00" Value="5" Type="Integer"/>
-        <ValueChange StateId="dummyId" Time="2012-11-30T18:12:06.628+01:00" Value="6" Type="Integer"/>
-      </Action>
-      <Action Id="action_3" Name="Action 3" ResourceId="dummyId" ResourceType="dummyType" State="Created"
-          Type="Use"/>
-    </Activity>
-  </Activity>
-
-</StrolchModel>
- - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-observers.html b/li.strolch.website/www.strolch.li/documentation-observers.html deleted file mode 100644 index 21d4d95bd..000000000 --- a/li.strolch.website/www.strolch.li/documentation-observers.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - - - - - Strolch: Observers - - - - - - - - - - - - -
- - - -
- -

All changes done in a Strolch transaction are recorded and then propagated to any registered observers.

- -

The observer feature is opt-in and is configured for each realm. In the StrolchConfiguration.xml - file enable observers by adding the enableObserverUpdates propery per realm:

-
-<StrolchConfiguration>
-  <env id="dev">
-    ...
-    <Component>
-      <name>RealmHandler</name>
-      <api>li.strolch.agent.api.RealmHandler</api>
-      <impl>li.strolch.agent.impl.DefaultRealmHandler</impl>
-      <depends>PrivilegeHandler</depends>
-      <Properties>
-        <realms>defaultRealm, otherRealm</realms>
-        <enableObserverUpdates>true</enableObserverUpdates>
-        <dataStoreMode>TRANSIENT</dataStoreMode>
-        <dataStoreFile>StrolchModel.xml</dataStoreFile>
-        <enableObserverUpdates.otherRealm>true</enableObserverUpdates.otherRealm>
-        <dataStoreMode.otherRealm>TRANSIENT</dataStoreMode.otherRealm>
-        <dataStoreFile.otherRealm>StrolchModel.xml</dataStoreFile.otherRealm>
-      </Properties>
-    </Component>
-  </env>
-  ...
-</StrolchConfiguration>
- -
-

Registering for updates is done by registering an Observer on the ObserverHandler - of the realm itself:

-
-ObserverHandler observerHandler = container.getRealm(StrolchConstants.DEFAULT_REALM).getObserverHandler();
-observerHandler.registerObserver(Tags.RESOURCE, new Observer() {
-
-  @Override
-  public void update(String key, List<StrolchRootElement> elements) {
-    logger.info(elements.size() + " resources were updated!");
-  }
-
-  @Override
-  public void remove(String key, List<StrolchRootElement> elements) {
-    logger.info(elements.size() + " resources were removed!");
-  }
-
-  @Override
-  public void add(String key, List<StrolchRootElement> elements) {
-    logger.info(elements.size() + " resources were added!");
-  }
-});
- -
-

Observer updates can be suppressed on the transaction by calling tx.setSuppressUpdates()

- - - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-policies.html b/li.strolch.website/www.strolch.li/documentation-policies.html deleted file mode 100644 index d17f43389..000000000 --- a/li.strolch.website/www.strolch.li/documentation-policies.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - - - Strolch: Policies - - - - - - - - - - - - -
- - - -
- -

Policies are an integral part when writing business logic in Strolch. In many cases it would suffice to write - all such logic in Services and Commands, but as soon as behaviour can change, - depending on the element being accessed, then this would quickly lead to many if/else blocks.

- -

Since writing large if/else blocks is not maintanable in the long run, Strolch offers a different approach. - All Strolch elements can store Policy definitions. This is a simple key/value store where the key defines the - type of policy, and the value references the policy to use.

- -

Currently there are two ways to reference a policy in Strolch, either via a key which defines a further - lookup in the PolicyHandler, or directly as the name of the class to instantiate.

- -

Using policies in Strolch gives the additional possibility of easily changing the behaviour at runtime, as a - Service and/or Command would delegate the behaviour to the currently configured policy on the releveant - element.

- -

Policies are implemented by defining an abstract class and extends StrolchPolicy. This abstract - class then defines the API of the actual policy. A concrete class then extends this abstract class and - implements the concrete methods.

- -

Policies are registered on Resources, Orders, Activities and Actions. The following shows defining two - policies on a Resource, a PlanningPolicy, an ExecutionPolicy in XML:

-
-<Resource ...>
-  ...
-  <Policies>
-    <Policy Type="PlanningPolicy" Value="key:SimplePlanning" />
-    <Policy Type="ExecutionPolicy" Value="java:li.strolch.policytest.TestSimulatedExecutionPolicy" />
-  </Policies>
-</Resource>
- -

Note how the PlanningPolicy has a value of key:SimplePlanning and the ExecutionPolicy - defines a reference to an actual class.

- -
-

To use the PolicyHandler, it must be configured in the StrolchConfiguration.xml as follows:

-
-<Component>
-  <name>PolicyHandler</name>
-  <api>li.strolch.policy.PolicyHandler</api>
-  <impl>li.strolch.policy.DefaultPolicyHandler</impl>
-  <Properties>
-    <readPolicyFile>true</readPolicyFile>
-    <policyConfigFile>StrolchPolicies.xml</policyConfigFile>
-  </Properties>
-</Component>
- -
-

And this policy handler implementation requires a file where the lookups for the policies is defined, - e.g.:

-
-<StrolchPolicies>
-
-  <PolicyType Type="PlanningPolicy" Api="li.strolch.policytest.TestPlanningPolicy">
-    <Policy Key="SimplePlanning" Class="li.strolch.policytest.TestSimplePlanningPolicy" />
-  </PolicyType>
-
-  <PolicyType Type="ConfirmationPolicy" Api="li.strolch.policytest.TestConfirmationPolicy">
-    <Policy Key="NoConfirmation" Class="li.strolch.policytest.TestNoConfirmationPolicy" />
-  </PolicyType>
-
-</StrolchPolicies>
- -
-

Now at runtime we can access the policies:

-
-PolicyHandler policyHandler = getComponent(PolicyHandler.class);
-
-try (StrolchTransaction tx = openTx()) {
-
-  Resource res = tx.getResourceBy("TestType", "MyTestResource");
-  PolicyDefs policyDefs = res.getPolicyDefs();
-
-  PolicyDef planningPolicyDef = policyDefs.getPolicyDef("PlanningPolicy");
-  PlanningPolicy planningPolicy = policyHandler.getPolicy(planningPolicyDef, tx);
-  planningPolicy.plan(...);
-
-  PolicyDef executionPolicyDef = res.getPolicyDefs().getPolicyDef("ExecutionPolicy");
-  ExecutionPolicy executionPolicy = policyHandler.getPolicy(executionPolicyDef, tx);
-  executionPolicy.execute(...);
-}
- - - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-privileges.html b/li.strolch.website/www.strolch.li/documentation-privileges.html deleted file mode 100644 index 514e50b0d..000000000 --- a/li.strolch.website/www.strolch.li/documentation-privileges.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - - - - - Strolch: Privileges - - - - - - - - - - - - -
- - - -
- - -

No framework is complete without user management and privilege validation. The basic form would be Users and - Roles, and then validating that an authenticated user has a given role. In Strolch we go a step further: A - User has roles assigned, and each role has a set of Privileges. The privileges can overlap, a validation is - performed to make sure that the one role doesn't deny and another role allows a specific action.

- -

As explained in the Privilege Configuration section, - users are defined in the PrivilegeUsers.xml file, and roles are defined in the PrivilegeRoles.xml - file.

- -

Let's assume the following user and role definition:

- -
-<Users>
-  <User userId="1" username="jill" password="$PBKDF2WithHmacSHA512,10000,256$61646d696e$cb69962946617da006a2f95776d78b49e5ec7941d2bdb2d25cdb05f957f64344">
-    <Firstname>Jill</Firstname>
-    <Lastname>Someone</Lastname>
-    <State>ENABLED</State>
-    <Locale>en-GB</Locale>
-    <Roles>
-      <Role>AppUser</Role>
-    </Roles>
-    <Properties>
-      <Property name="realm" value="execution" />
-    </Properties>
-  </User>
-</Users>
-
-<Roles>
-  <Role name="AppUser">
-    <Privilege name="li.strolch.service.api.Service" policy="DefaultPrivilege">
-      <AllAllowed>true</AllAllowed>
-    </Privilege>
-    <Privilege name="li.strolch.model.query.StrolchQuery" policy="DefaultPrivilege">
-      <AllAllowed>true</AllAllowed>
-    </Privilege>
-    <Privilege name="li.strolch.search.StrolchSearch" policy="DefaultPrivilege">
-      <AllAllowed>true</AllAllowed>
-    </Privilege>
-  <Role>
-<Roles>
-
- -

This configuration contains one user and one role. The user jill has the role - AppUser and the role AppUser has three privileges assigned.

- -

Note how the user's password is configured similar to a unix password definition: Using the dollar sign - & first the hashing algorithm is configured (algorithm, iterations, key length), then the - salt, followed by the password hash.

- -

Note: The password can also still be saved using two separate fields: a salt and password field. - This configuration will be immediately changed to the unix form, so won't be described - further here.

- -

Further a user always has a firstname and last name. Optionally a locale can be set, otherwise the system - locale is used. The user's state must be defined as one of NEW, ENABLED, DISABLED, - EXPIRED or SYSTEM. A user can only authenticate/login with the state - ENABLED. A user can have any number of properties, which can then be used at runtime. A user - can also reference any number of roles, the assigned privilege can overlap, a global configuration mode - defines how duplicate privileges are handled.

- -

Roles have a name and any number of Privilege definitions. A Privilege has a name, which in many - cases is the name of Java class/interface on which an action is being invoked. The policy value - defines which policy to use when evaluating the privilege access. The privilege definition is defined in the - PrivilegeConfig.xml and is the name of a class to call for privilege validation.

- -

Further the privilege definitions can have a AllAllowed boolean flag, or any number of Allow - or Deny values. How these values are interpreted is defined in the policy implementation. A - policy takes three input parameters:

-
    -
  • PrivilegeContext → supplied by privilege and gives access to the - Certificate, thus identifying the user for which privilege access is to be validated. -
  • -
  • IPrivilege → Contains the privilege values: AllAllowed, - Allow and Deny
  • -
  • Restrictable → An interface from which the privilege name is retrieved, and the - associated value. The value is an object, and is cast to the relevant input in - the concrete privilege policy. -
  • -
- -

The following privilege policies are already implemented:

-
    - -
  • DefaultPrivilege → simple policy where the passed Restrictable is expected to return a - String value, which is compared with allow and deny values. -
  • - - -
  • Internal: RoleAccessPrivilege → policy used for the internal - privileges PrivilegeGetRole, PrivilegeAddRole, - PrivilegeModifyRole or PrivilegeModifyRole
  • -
  • Internal: UserAccessPrivilege → policy used for the internal privileges PrivilegeGetUser, - PrivilegeAddUser, PrivilegeRemoveUser, PrivilegeModifyUser, - PrivilegeAddRoleToUser, PrivilegeRemoveRoleFromUser, PrivilegeSetUserState, - PrivilegeSetUserLocale or PrivilegeSetUserPassword
  • -
  • Internal: UserAccessWithSameOrganisationPrivilege → Same as the - UserAccessPrivilege but expects the authenticated user to have a property organisation - and validates that the user being modified is in the same organisation. -
  • -
  • Internal: UsernameFromCertificatePrivilege → This policy expects a Restrictable - to return the certificate of another authenticated user and is used when modifying an - authenticated user, i.e. killing a session, or modifying its current state, e.g. locale - etc. -
  • -
  • Internal: UsernameFromCertificateWithSameOrganisationPrivilege → Same as UsernameFromCertificatePrivilege - but expects the authenticated user to have a property organisation and - validates that the user being modified is in the same organisation. -
  • -
- -

Note: As a rule, the sequence is AllAllowedAllow → - Denydefault deny

- -

- -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-queries.html b/li.strolch.website/www.strolch.li/documentation-queries.html deleted file mode 100644 index 7f5b5b3fb..000000000 --- a/li.strolch.website/www.strolch.li/documentation-queries.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - Strolch: Queries - - - - - - - - - - - - -
- - - -
- -

The Query API is deprecated and the search API should be used instead. -

- -

As is custom for every framework, querying the model must be possible. Strolch queries are implemented using - the StrolchQuery interface and one of its concrete implementations: ResourceQuery, - OrderQuery, ActivityQuery.

- -

A Strolch element always has two identifiers: Type and Id. The type is important as - it classifies an element. So if a car and a house would be modelled in Strolch, then those would both be a - Resource, but one of type Car and the other of type House. Both would - have different parameters.

- -

Thus one of the inputs for every query is it's type, which is defined as the navigation. It is said that we - navigate to the Cars, or Houses. Thus when instantiating a ResourceQuery, pass the navigation to the type of - Resource as well. Same applies for Orders and Activities.

- -

Further input for a StrolchQuery are the selections. These selections get translated into RDBMS - WHERE clauses. Selections support boolean operations thus allowing for complex querying.

- -

StrolchQueries also support Ordering and object transformation. Following classes provide the most used - scenarios:

-
    -
  • OrderById
  • -
  • OrderByName
  • -
  • OrderByParameter
  • -
  • *ToDomVisitor
  • -
  • *ToSaxVisitor
  • -
  • *ToJsonVisitor
  • -
  • *ToFlatJsonVisitor
  • -
- -
-

Example: Query all resources of type Car:

-
-try (StrolchTransaction tx = openTx()) {
-  ResourceQuery<Resource> query = ResourceQuery.query("Car");
-  query.withAny();
-  List<Resource> cars = tx.doQuery(query);
-}
- -
-

Example: Query all resources of type Car, order by Name and transform to JSON:

-
-try (StrolchTransaction tx = openTx()) {
-  ResourceQuery<JsonObject> query = ResourceQuery.query("Car", new ResourceToJsonVisitor(),
-      new OrderByName());
-  query.withAny();
-  List<JsonObject> cars = tx.doQuery(query);
-}
- -
-

the previous example can also be written as follows:

-
-try (StrolchTransaction tx = openTx()) {
-  ResourceQuery<JsonObject> query = new ResourceQuery<>();
-  query.setNavigation(new StrolchTypeNavigation("Car"));
-  query.setResourceVisitor(new ResourceToJsonVisitor());
-  query.withAny();
-  List<JsonObject> cars = tx.doQuery(query);
-}
- -
-

Example: Query all resources of type Car with color blue:

-
-try (StrolchTransaction tx = openTx()) {
-    ResourceQuery<Resource> query = ResourceQuery.query("Car");
-    query.with(ParameterSelection.stringSelection("parameters", "color", "blue", StringMatchMode.es()));
-    List<Resource> cars = tx.doQuery(query);
-}
- -
-

Example: Query all resources of type Car which are not blue:

-
-try (StrolchTransaction tx = openTx()) {
-  ResourceQuery<Resource> query = ResourceQuery.query("Car");
-  query.not(ParameterSelection.stringSelection("parameters", "color", "blue", StringMatchMode.es()));
-  List<Resource> cars = tx.doQuery(query);
-}
- -
-

Example: Query all resources of type Car with color blue or yellow:

-
-try (StrolchTransaction tx = openTx()) {
-  ResourceQuery<Resource> query = ResourceQuery.query("Car");
-  query.or().with(
-      ParameterSelection.stringSelection("parameters", "color", "blue", StringMatchMode.es()),
-      ParameterSelection.stringSelection("parameters", "color", "yellow", StringMatchMode.es()));
-  List<Resource> cars = tx.doQuery(query);
-}
- -
-

Example: Query all resources of type Car with color blue or yellow owned by Jill:

-
-try (StrolchTransaction tx = openTx()) {
-  ResourceQuery<Resource> query = ResourceQuery.query("Car");
-
-  StringParameterSelection owner = ParameterSelection.stringSelection("parameters", "owner", "Jill", StringMatchMode.es());
-  OrSelection colors = new OrSelection().with(
-      ParameterSelection.stringSelection("parameters", "color", "blue", StringMatchMode.es()),
-      ParameterSelection.stringSelection("parameters", "color", "yellow", StringMatchMode.es()));
-
-  query.and().with(owner, colors);
-
-  List<Resource> cars = tx.doQuery(query);
-}
- - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-realms.html b/li.strolch.website/www.strolch.li/documentation-realms.html deleted file mode 100644 index 52212e59b..000000000 --- a/li.strolch.website/www.strolch.li/documentation-realms.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - - - - - - - Strolch: Realms - - - - - - - - - - - - -
- - - -
- -

Realms implement multi-tenant capabilities. A Strolch agent can have an arbitrary number of realms configured - and each realm has its own persistence configuration, allowing to separate mandates completely.

- - A realm can run in one of the following modes: -
    -
  • EMPTY
    This is a transient data store mode, where no model changes are persisted - they are only - kept in memory. When the Strolch agent is started, this realm is empty as no data is loaded. -
  • -
  • TRANSIENT
    This is the same as EMPTY, but with the difference that when the Strolch agent is - started, a model file is parsed and the in-memory realm is populated with the elements parsed from the - model file. -
  • -
  • CACHED
    In this mode, all data is stored in-memory, and any changes made are written back to the - persistence layer. This allows for fast in-memory qeuries, but makes sure no data is lost when the agent - is restarted. -
  • -
- -

Realms are mostly hidden from a developer as a StrolchTransaction exposes all important - operations needed to access Strolch objects. A developer will however need to configure the realms for their - specific project. If the project only requires one realm, then the defaultRealm can be used, - where the developer only is required to configure the mode and any relevant model file.

- -

If the mode is CACHED, then the PersistenceHandler component is required to be configured, so - that the DAOs know how to access the underlying database.

- -

The configuration in the StrolchConfiguration.xml file is as follows:

- -
-<StrolchConfiguration>
-  <env id="dev">
-    ...
-    <Component>
-      <name>RealmHandler</name>
-      <api>li.strolch.agent.api.RealmHandler</api>
-      <impl>li.strolch.agent.impl.DefaultRealmHandler</impl>
-      <depends>PrivilegeHandler</depends>
-      <!-- if CACHED: -->
-      <!--depends>PersistenceHandler</depends-->
-      <Properties>
-        <dataStoreMode>EMPTY|TRANSIENT|CACHED</dataStoreMode>
-        <dataStoreFile>StrolchModel.xml</dataStoreFile>
-      </Properties>
-    </Component>
-    ...
-  </env>
-</StrolchConfiguration>
-
- -

A multi-realm configuration would be as follows. Note how the defaultRealm is still enabled, and - has its configuration as before. Further the PostgreSQL PersistenceHandler is configured to show - how the realms are connected to the persistence handler:

- -
-<StrolchConfiguration>
-  <env id="dev">
-    ...
-    <Component>
-      <name>RealmHandler</name>
-      <api>li.strolch.agent.api.RealmHandler</api>
-      <impl>li.strolch.agent.impl.DefaultRealmHandler</impl>
-      <depends>PrivilegeHandler</depends>
-      <depends>PersistenceHandler</depends>
-      <Properties>
-        <realms>defaultRealm, cachedRealm</realms>
-        <dataStoreMode>TRANSIENT</dataStoreMode>
-        <dataStoreFile>DefaultRealm.xml</dataStoreFile>
-        <dataStoreMode.cachedRealm>CACHED</dataStoreMode.cachedRealm>
-        <dataStoreMode.emptyRealm>EMPTY</dataStoreMode.emptyRealm>
-      </Properties>
-    </Component>
-
-    <Component>
-      <name>PersistenceHandler</name>
-      <api>li.strolch.persistence.api.PersistenceHandler</api>
-      <impl>li.strolch.persistence.postgresql.PostgreSqlPersistenceHandler</impl>
-      <Properties>
-        <allowSchemaCreation>true</allowSchemaCreation>
-        <allowSchemaDrop>true</allowSchemaDrop>
-
-        <db.url.cachedRealm>jdbc:postgresql://localhost/testdb2</db.url.cachedRealm>
-        <db.username.cachedRealm>testuser2</db.username.cachedRealm>
-        <db.password.cachedRealm>test</db.password.cachedRealm>
-        <db.pool.maximumPoolSize.cachedRealm>1</db.pool.maximumPoolSize.cachedRealm>
-        <db.pool.keepaliveTime.cachedRealm>600000</db.pool.keepaliveTime.cachedRealm>
-      </Properties>
-    </Component>
-    ...
-  </env>
-</StrolchConfiguration>
-        
- -

Accessing a realm is done in multiple ways. Important is to note, that a user should use the StrolchTransaction - object, instead of accessing the Realm directly.

- -

Opening a transaction is done from a Service by calling one of the openTx()-methods. - Nevertheless, the realm can be accessed as follows:

- -
-ComponentContainer container = getAgent().getContainer();
-StrolchRealm realm = container.getRealm(StrolchConstants.DEFAULT_REALM);
-try(StrolchTransaction tx = realm.openTx()) {
-  Resource resource = tx.getResourceBy("TestType", "MyTestResource");
-  ...
-}
-
- - - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-reports.html b/li.strolch.website/www.strolch.li/documentation-reports.html deleted file mode 100644 index a6ac5606a..000000000 --- a/li.strolch.website/www.strolch.li/documentation-reports.html +++ /dev/null @@ -1,367 +0,0 @@ - - - - - - - - - - - - Strolch: Reports - - - - - - - - - - - - -
- - - -
- -

Since Strolch has a generic model, it was rather straight forward to create a simple API for writing reports. - In Strolch a report is defined by using its own model, i.e. a Report is a Resource of type - Report.

- -

A report consists of the following parts:

-
    -
  • policy definition, thus allowing extensions
  • -
  • basic configuration like base object type, order direction, etc.
  • -
  • column definitions
  • -
  • joins
  • -
  • ordering definition
  • -
  • filters
  • -
- -

An example of a report is as follows:

-
-<Resource Id="stockReport" Name="Stock Report" Type="Report">
-
-  <ParameterBag Id="parameters" Name="parameters" Type="Parameters">
-    <Parameter Id="objectType" Index="20" Hidden="false" Name="Object Type" Type="String" Interpretation="Resource-Ref" Uom="Player" Value="Player"/>
-    <Parameter Id="descending" Name="Descending order" Type="Boolean" Value="true"/>
-  </ParameterBag>
-
-  <ParameterBag Id="ordering" Name="Ordering" Type="Ordering">
-    <Parameter Id="name" Name="Name" Type="String" Interpretation="Resource-Ref" Uom="Player" Value="$name"/>
-  </ParameterBag>
-
-  <ParameterBag Id="noTeamFilter" Name="Filter" Type="Filter">
-    <Parameter Id="policy" Name="Filter Policy" Type="String" Interpretation="ReportFilterPolicy" Uom="key:Equals" Value="!"/>
-    <Parameter Id="fieldRef" Name="Field reference" Type="String" Interpretation="Resource-Ref" Uom="Slot" Value="Bags/relations/team"/>
-  </ParameterBag>
-
-  <ParameterBag Id="columns" Name="Display Columns" Type="Display">
-    <Parameter Id="name" Name="Player" Type="String" Interpretation="Resource-Ref" Uom="Player" Value="$name"/>
-    <Parameter Id="birthDate" Name="Birth date" Type="String" Interpretation="Resource-Ref" Uom="Player" Value="Bags/parameters/birthDate"/>
-    <Parameter Id="team" Name="Team" Type="String" Interpretation="Resource-Ref" Uom="Team" Value="$name"/>
-  </ParameterBag>
-
-  <ParameterBag Id="joins" Name="Joins" Type="Joins">
-    <Parameter Id="Team" Index="10" Hidden="false" Name="Team" Type="String" Interpretation="Resource-Ref" Uom="Team" Value="Player"/>
-  </ParameterBag>
-
-  <Policies>
-    <Policy Type="ReportPolicy" Value="java:li.strolch.report.policy.GenericReport"/>
-  </Policies>
-
-</Resource>
- -

This report

-
    -
  • shows all Resources of type player (parameter objectType) → marks the object type to - be show in the filter criteria (default), and that its sorting index is at 20. -
  • -
  • orders the report by player's name (parameter bag ordering)
  • -
  • filters out all players with no team assigned (parameter bag noTeamFilter)
  • -
  • defines three columns: Player, Birth date, Team (paramger bag columns)
  • -
  • joins in the resource of type Team
  • -
  • Uses the GenericReport class to generate the report
  • -
- -

GenericReport

- - The default generic report implemented in Strolch has the following features and options: - -

Parameters

-

The parameters bag can contain the following parameters:

-
    -
  • objectType → the base type of object to get the input for the report. This means that - the Interpretation is set to one of: -
      -
    • Resource-Ref
    • -
    • Order-Ref
    • -
    • Activity-Ref
    • -
    - and that the UOM and value of the parameter is set to - the type of element with which to retrieve the elements from the strolch model. -
    Note: that the attributes Hidden and Index define the visibility - and sorting index as filter criteria respectively. -
  • -
  • descending → boolean flag to define if sorting is in descending order
  • -
  • allowMissingColumns → flag to define if no exception should be thrown if a column is - missing -
  • -
  • dateRangeSel → defines a lookup parameter to use as a date range selector. This - requires input when executing the report -
  • -
- -

Lookups

-

Many of the features of the generic report rely on looking up a value on the referenced element. The - following shows the ways that a lookup can be performed:

-
    -
  • $id → lookup the ID of the element
  • -
  • $name → lookup the name of the element
  • -
  • $type → lookup the type of the element
  • -
  • $date → lookup the date of the element (only possible on Order and Activity - elements) -
  • -
  • $state → lookup the state of the element (only possible on Order and - Activity elements) -
  • -
  • Bags/<bag_id>/<param_id>
  • -
  • $search:<parent_ref_id>:Bags/<bag_id>/<param_id> → searches for a - parameter with the given - bag and parameter, and - if it does not exist, - looks for the parent - with the given parent_ref_id - on the element. This - allows a recursive - search up a tree of - elements which all have - the same parameter - referencing a parent. - relations bag -
  • -
- -

Note: these definitions are set as the value of a Parameter, and the Interpretation and - UOM of the parameter is used to find the element on which to perform the lookup. I.e. the - following definition:

-
<Parameter Id="name" Name="Player" Type="String" Interpretation="Resource-Ref" Uom="Player" Value="$name"/>
-

defines that we want to lookup the name of the resource of type Player.

- -

Ordering

-

Ordering, i.e sorting is done by adding the parameter bag with the id ordering and each - parameter defines a column to order by. The sequence of the ordering is defined by the index value assigned - to each parameter.

- -

Filtering

-

Filtering use additional Strolch Policies which implement the operator function. I.e. performing an equals, - etc. The following ReportFilterPolicy are available and should be added in your StrolchPolicies.xml - file:

-
-<StrolchPolicies>
-  ...
-  <PolicyType Type="ReportFilterPolicy" Api="li.strolch.report.policy.ReportFilterPolicy">
-    <Policy Key="GreaterThan" Class="li.strolch.report.policy.GreaterThanReportFilter" />
-    <Policy Key="LessThan" Class="li.strolch.report.policy.LessThanReportFilter" />
-    <Policy Key="Equals" Class="li.strolch.report.policy.EqualsReportFilter" />
-  </PolicyType>
-  ...
-<StrolchPolicies>
- -

From this we can see that we can perform a GreaterThan, LessThan and - Equals filtering. These filters can also be negated by prefixing the filter value with an - exclamation mark (!).

- -

A special case for the filter values are filters on dates. If you are filtering on a date, then you can use - the special operator now(). This filter will use the current date and time and will add/subtract - the ISO8601 period passed as an argument to the operator.

- -

The following shows examples of these filters:

-
-<ParameterBag Id="minQtyFilter" Name="Filter" Type="Filter">
-  <Parameter Id="policy" Name="Filter Policy" Type="String" Interpretation="ReportFilterPolicy" Uom="key:GreaterThan" Value="10"/>
-  <Parameter Id="fieldRef" Name="Field reference" Type="String" Interpretation="Resource-Ref" Uom="Product" Value="Bags/parameters/quantity"/>
-</ParameterBag>
-
-<ParameterBag Id="notEmptyFilter" Name="Filter" Type="Filter">
-  <Parameter Id="policy" Name="Filter Policy" Type="String" Interpretation="ReportFilterPolicy" Uom="key:Equals" Value="!"/>
-  <Parameter Id="fieldRef" Name="Field reference" Type="String" Interpretation="Resource-Ref" Uom="Team" Value="Bags/relations/team"/>
-</ParameterBag>
-
-<ParameterBag Id="threeMonthsAgoFilter" Name="Filter" Type="Filter">
-  <Parameter Id="policy" Name="Filter Policy" Type="String" Interpretation="ReportFilterPolicy" Uom="key:LessThan" Value="now(-P3M)"/>
-  <Parameter Id="fieldRef" Name="Field reference" Type="String" Interpretation="Resource-Ref" Uom="FromStock" Value="$date"/>
-</ParameterBag>
- -

Note: One parameter defines which policy gets used and the key:<name> value - references a policy defined in the StrolchPolicies.xml file. Further the lookup is - defined in the fieldRef parameter.

- -

Joins

-

To add columns from data which is not on the element denoted by the base object type, we can join further - elements. This is done by adding the parameter bag joins and then each parameter references an - element to join. The joining is done as follows:

-
    -
  • The Intepretation and UOM define which object we want to join, i.e. resource - of type foo -
  • -
  • The value of the parameter defines the type of element on which to find the reference
  • -
  • The join ordering is not relevant, as the tree is traversed accordingly
  • -
  • At least one join must reference the base object type
  • -
  • The lookup of the join is done by finding a parameter with any ID, which has the same Interpretation - and UOM as the join definition -
  • -
  • The attributes Hidden and Index define the visibility and sorting index as - filter criteria respectively. -
  • -
- -

Thus the following:

- -
-<ParameterBag Id="joins" Name="Joins" Type="Joins">
-  <Parameter Id="Team" Index="10" Hidden="false" Name="Team" Type="String" Interpretation="Resource-Ref" Uom="Team" Value="Player"/>
-  <Parameter Id="Country" Index="5" Hidden="false" Name="Team" Type="String" Interpretation="Resource-Ref" Uom="Country" Value="Team"/>
-</ParameterBag>
- -

Performs two joins: First we join a resource of type Team by finding the relevant parameter on - the Player resource, and then we lookup a resource of type Country on the - previously joined Team resource.

- - -

Execution of Reports

-

To execute a reports, we must instantiate the Report and can then directly generate a JsonObject stream, - which we can then pipe to a browser, file, etc.:

-
-Stream<JsonObject> jsonObjectStream = new Report(tx, reportId).doReportAsJson();
- -

If you prefer a CSV report:

-
-try (CSVPrinter csvP = new CSVPrinter(new OutputStreamWriter(out),
-        CSVFormat.DEFAULT.withHeader(headers).withDelimiter(';'))) {
-
-  // do report without AsJson, and then iterating each row and sending to a CSV writer
-  report.doReport().forEach(row -> {
-    try {
-      csvP.printRecord(row.valueStream().collect(Collectors.toList())); // add to CSV
-    } catch (Exception e) {
-      logger.error("Could not write CSV row", e);
-    }
-  });
-}
-
- -

Filter Criteria

-

Predefining filters is a good start, but in some case you only want a portion of the actual filtered data. - For instance if you make a stock report, you might only want one location. This information is dynamic and - thus not stored on the report definition.

- -

To perform these dynamic filterings, one would call the filter() method on the report, passing - the type of element to be filtered, and to which element IDs to reduce the report data to. The following - reduces the report to only return the rows with the product01 Product and - location02 Location elements:

-
-new Report(tx, "stockReport")
-        .filter("Product", "product01")
-        .filter("Location", "location02")
-        .doReportAsJson()
- -

It is possible to find the possible filter criteria dynamically using the - generateFilterCriteria() method.

- - -

Date Range Filtering

- -

The last option to filter dynamically is using a date range selector. Define the dateRangeSel - lookup parameter, and then set the date range on the instantiated report:

-
-<ParameterBag Id="parameters" Name="parameters" Type="Parameters">
-    ...
-    <Parameter Id="dateRangeSel" Name="Date Range Selector" Type="String" Interpretation="Resource-Ref" Uom="Product" Value="Bags/parameters/expirationDate"/>
-    ...
-</ParameterBag>
-
-Date from = new Date(LocalDate.of(2016, 1, 1).toEpochDay() * 86400000);
-Date to = new Date(LocalDate.of(2017, 1, 1).toEpochDay() * 86400000);
-DateRange dateRange = new DateRange().from(from, true).to(to, false);
-List<JsonObject> result = new Report(tx, "stockReport") //
-    .filter("Product", "product01") //
-    .dateRange(dateRange) //
-    .doReportAsJson()
-
- -

Note: See the - GenericReportTest for examples.

- - - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-runtime.html b/li.strolch.website/www.strolch.li/documentation-runtime.html deleted file mode 100644 index 6cd59334a..000000000 --- a/li.strolch.website/www.strolch.li/documentation-runtime.html +++ /dev/null @@ -1,395 +0,0 @@ - - - - - - - - - - - - Strolch: Runtime Configuration - - - - - - - - - - - - -
- - - -
-

A Strolch runtime configuration comprises two parts: a configuration part, and a model part. The - configuration are files located in the ..config/ folder, and the model are files located in the - ../data folder.

- - -

In an absolute minimal configuration, the Strolch runtime requires the following folder structure:

-
    -
  • ../config/ -
    -
    StrolchConfiguration.xml
    -
    → configures the Strolch agent
    -
    PrivilegeConfig.xml
    -
    → configures user management
    -
    PrivilegeUsers.xml
    -
    → contains the users in an XML based user management file
    -
    PrivilegeRoles.xml
    -
    → contains the roles and privileges in an XML based user management
    -
    -
  • -
- -

StrolchConfiguration.xml

- -

The StrolchConfiguration.xml file configures the Strolch agent. The StrolchConfiguration.xml - defines the following:

-
    -
  • <StrolchConfiguration> root element
  • - -
  • <env id="xxx"> different environments with the possibility of having a global - environment for configuration valid in multiple environments. -
      -
    • <Runtime> element which defines the agents name and a few other properties - e.g. locale and verbose: -
        -
      • <applicationName> the agent's name
      • - -
      • <Properties>
      • - -
      • <locale> the agent's internal locale for log messages etc.
      • -
      • <verbose> the logging level for some internal logging. (Logging is - mostly done using log4j over slf4j) -
      • -
      -
    • -
    -
  • - -
  • <Component> elements for each component used in the agent. A component is configured - by defining the following child elements: -
      -
    • <name> the name of the component, use when defining dependencies between - components. The name is mostly set to the simple name of the interface - of the component -
    • - -
    • <api> the full class name to the interface of the component. During runtime - this interface will be used to access the component e.g.: ServiceHandler - svcHandler - = - agent.getContainer().getComponent(ServiceHandler.class); -
    • - -
    • <impl> the full class name of the concrete implementation of the component. - During initialization this class will be instantiated and registered - under the component name and interface. This class must extend the - class li.strolch.agent.api.StrolchComponent -
    • - -
    • <depends> any number of these elements, where the content is the name of - another component, on which this component depends. Depending - components are initialized and started after the component they - depend on and are stopped and destroyed before -
    • - -
    • <Properties> -
        -
      • <...> any number of properties which the component requires. The - element's name will be the key with which the value can be - accessed at runtime. -
      • -
      -
    • -
    -
  • -
- -

Note: When a property is missing, and the component has a hard coded default value, then when the - component is initialized, the use of the default value and its key is logged. This makes it easy - to see which new properties can be configured. Should the component not define a default value, - then the component will thrown an exception on initialization. In this case it can be a good - moment to read the JavaDoc (or source code) for the component in question to see how it is - configured.

- -

Privilege Configuration

- -

In Strolch authentication and authorization is baked in. To open a transaction, and thus access the Strolch - model, a Certificate object is required, which means the user has been authenticated and possibly - authorized.

- -

The PrivilegeConfig.xml defines the following:

-
    -
  • <Privilege> root element -
      -
    • <Container> configures the individual Privilege components -
        -
      • <Parameters> base configuration properties for Privilege
      • -
      • <EncryptionHandler> configures the hashing algorithms and other - encryption specific configuration -
      • -
      • <PersistenceHandler> configures the persistence of the roles and - users -
      • -
      • <UserChallengeHandler> configures a challenge handler so that a user - can reset their password. The default - challenge handler is the li.strolch.privilege.handler.MailUserChallengeHandler - which sends a challenge to the user's defined - e-mail address. -
      • -
      • <SsoHandler> the SSO Handler is used to implement a SingleSignOn and - can be used to start a session using a LDAP token, etc. - There is no default implementation as this is project - specific. -
      • -
      -
    • -
    • <Policies> configures the available privilege policies at runtime, the name - is referenced from the model file -
    • -
    -
  • -
- -

The PrivilegeUsers.xml and PrivilegeRoles.xml define the users and roles and is - used when in PrvilegeConfig.xml the PersistenceHandler is set to ch.eitchnet.privilege.handler.XmlPersistenceHandler: -

-
    -
  • <Users> configures all users -
      -
    • <User> configures a specific user -
        -
      • <Firstname> configures a user's first name
      • -
      • <Lastname> configure a user's last name
      • -
      • <State> configures the user's state, see ch.eitchnet.privilege.model.UserState -
      • -
      • <Locale> configure the user's locale
      • -
      • <Roles> configures the user's roles -
          -
        • <Role> adds a role to the user
        • -
        -
      • -
      • <Properties> configures user specific properties. What properties are - used is not specified and is dependent on the concrete - agent -
          -
        • <Property> defines a single property
        • -
        -
      • -
      -
    • -
    -
  • - -
  • <Roles> configures all roles -
      -
    • <Role> configures a specific role -
        -
      • <Privilege> configures a specific privilege for this role -
          -
        • <AllAllowed> if set to true, then defines that all values - associated with this privilege are allowed -
        • -
        • <Allow> defines one allowed value for this privilege -
        • -
        • <Deny> defines one denied value for this privilege -
        • -
        -
      • -
      -
    • -
    -
  • -
- -

Implementing a StrolchComponent

- -

Implementing a strolch component requires an interface, which defines the component's API and a concrete - class which implements the interface and extends the class StrolchComponent.

- -

The StrolchComponent class adds the state model to the class, which transitions as follows:
UNDEFINED - => - SETUP - => - INITIALIZED - => - STARTED - <=> - STOPPED - => - DESTROYED -

- -

Components can switch between STARTED and STOPPED, but once DESTROYED - no further state change is possible. The component's state is changed by changes to the agent's lifecycle. -

- -

A component's state is changed by a call to the appropriate method on the component, override the methods as - necessary. Note that it is good practice that the initialize()-method is used to get all the - configuration properties, and that they should there be evaluated and that the method so return quickly. The - start()-method is called after the agent's initialization and should be where additional - threads are started. Correctly implementing these methods allows to quickly detect a wrongly configured - agent, which might take longer to start for whatever reason.

- -

The following shows a basic implementation of a component on the basis of a post initializer (a component - which performs some actions in its start()-method which should be done after everything else is - started in the agent).

- -
-public class SimplePostInitializer
-        extends StrolchComponent
-        implements PostInitializer {
-
-  public SimplePostInitializer(ComponentContainer container,
-        String componentName) {
-    super(container, componentName);
-  }
-
-  @Override
-  public void initialize(ComponentConfiguration configuration) {
-    // do some initialization, validate configuration values, etc.
-    // now call super, to update state
-    super.initialize(configuration);
-  }
-
-  @Override
-  public void start() {
-    // start any threads, or perform long running start work
-    // now call super, to update state
-    super.start();
-  }
-
-  @Override
-  public void stop() {
-    // stop threads and timers, but be ready to start again
-    // now call super, to update state
-    super.stop();
-  }
-
-  @Override
-  public void destroy() {
-    // destroy this component, release all resources and don't worry about
-    // being called to start again now call super, to update state
-    super.destroy();
-  }
-}
-
- -

The new component would then be registered in the StrolchConfiguration.xml as follows:

-
-<StrolchConfiguration>
-  <env id="...">
-    ...
-    <Component>
-      <name>SimplePostInitializer</name>
-      <api>li.strolch.agent.api.PostInitializer</api>
-      <impl>li.strolch.documentation.SimplePostInitializer</impl>
-    </Component>
-    ...
-  </env>
-</StrolchConfiguration>
-
- -

And can be access at runtime using:

-
-PostInitializer postInitializer = getContainer().getComponent(PostInitializer.class);
-
- -

Starting the agent

- -

When a Strolch runtime is started, then the root path to the runtime configuration must be passed. In Java - this is done by calling:

-
-StrolchAgent agent = new StrolchAgent();
-agent.setup(environment, rootPath);
-agent.initialize();
-agent.start();
-
- -

In Servlet 3.0 applications one would implement the javax.servlet.ServletContextListener - interface, add the @WebListener annotation to the class and in the - contextInitialized()-method start Strolch:

-
-String realPath = sce.getServletContext().getRealPath("/WEB-INF");
-String environment = StrolchEnvironment.getEnvironmentFromEnvProperties(pathF);
-this.agent = new StrolchAgent();
-this.agent.setup(environment, new File(realPath));
-this.agent.initialize();
-this.agent.start();
-
- - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-searches.html b/li.strolch.website/www.strolch.li/documentation-searches.html deleted file mode 100644 index c0f81b3da..000000000 --- a/li.strolch.website/www.strolch.li/documentation-searches.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - - Strolch: Searches - - - - - - - - - - - - -
- - - -
- -

As is custom for every framework, querying, or searching, the model must be possible. Strolch searches are - implemented using the StrolchSearch class and one of its concrete implementations: ResourceSearch, - OrderSearch, ActivitySearch.

- -

A Strolch element always has two identifiers: Type and Id. The type is important as - it classifies an element. So if a car and a house would be modelled in Strolch, then those would both be a - Resource, but one of type Car and the other of type House. Both would - have different parameters. Thus when searching for objects, the first thing to do is define the type of - object being searched.

- -

The Strolch search API is very expressive and offers multiple ways to perform the same search. The search API - consists of three components: The search classes, the search expressions and the search predicates. The - concept was taken from the Apache Camel project.

- -

There are four main search classes:

-
    -
  • RootElementSearch - search for any of Resource, Order or Activity - elements -
  • -
  • ResourceSearch - search for Resources
  • -
  • OrderSearch - search for Orders
  • -
  • ActivitySearch - search for Activities
  • -
- -

No search is useful without a where clause, which are called search expressions. When writing a - search, there are multiple ways to add such where clauses. Either

-
    -
  • override the define() method in your sub class and add the where clauses by calling the - where() method, or -
  • -
  • define special methods on the class e.g. byColor() which also calls the - where() method to add a search expression, or -
  • -
  • directly call the where() method after instantiating a search.
  • -
- -

When extending the class, then the search expressions are available as methods on the super class, otherwise - you can statically import them from - ExpressionsSupport.

- -

And of course a where clause needs operators, which are called search predicates. Just as search expressions - are available in sub classes, so are search predicates and can also be statically imported through - PredicatesSupport.

- -

Examples of search expressions with search predicates follow:

-
-ResourceSearch search = new ResourceSearch();
-
-// predicate either as parameter, or chained
-search.where(id().isEqualTo("myId"));
-search.where(id(isEqualTo("myId")));
-
-// negating
-search.where(id(isEqualTo("myId")).not());
-
-search.where(param("bagId", "paramId").isIn(Arrays.asList("red", "blue", "green")));
-
-search.where(paramNull("bagId", "paramId")));
-
-// boolean operations
-search.where(id(isEqualTo("myId")) //
-		.or(name(isEqualTo("myName"))));
-        
- -

Note how the predicates can be chained to the search expression, or passed as a parameter to the - expression.

- -

In addition to using predefined search search expressions, one can also just pass a lambda expression which - performs a custom filter:

-
-personSearch.where(person -> person.getName().length() == 3);
- -

See the - StrolchSearchTest for many ways in which you can implement tests.

- -

Note that strolch searches requires privileges. Thus when you use a strolch search, add it to the role of the - user in PrivilegeRoles.xml:

-
-<Privilege name="li.strolch.search.StrolchSearch" policy="DefaultPrivilege">
-    <Allow>internal</Allow> <!-- internal used for when the search is done in an internal service -->
-    <Allow>li.strolch.bookshop.search.BookSearch</Allow>
-</Privilege>
- - - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-services-and-commands.html b/li.strolch.website/www.strolch.li/documentation-services-and-commands.html deleted file mode 100644 index 8d84fd85c..000000000 --- a/li.strolch.website/www.strolch.li/documentation-services-and-commands.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - Strolch: Services and Commands - - - - - - - - - - - - -
- - - -
- -

Services are written to implement a specific use-case. Commands are written to - implemente re-usable parts of a use-case. The use-case can be abstract e.g. AddResourceService - or very specific e.g. CreatePatientService.

- -

Should the use-case be re-usable in different scenarios, then commands should implement the logic, and the - services should then execute the commands. E.g. The CreatePatientService would use a CreatePatientResourceCommand - and then use an AddResourceCommand in a single transaction, so that the task of creating the - actual Patient Resource can be re-used somewhere else.

- -

Services extend the abstract class AbstractService and then implement the method internalDoService(ServiceArgument). - AbstractService defines generic template arguments with which the concrete service can define a specific - input ServiceArgument class and output ServiceResult class.

- -

The AbstractService class has multiple helper methods:

-
    -
  • openTx():StrolchTransaction - to open a transaction
  • -
  • runPrivileged() - to perform a SystemUserAction
  • -
  • getComponent():V - to retrieve a specific StrolchComponent
  • -
-

there are more - check the JavaDocs

- - -

Commands extend the Command class and then implement the method doCommand(). - Commands have helper methods:

-
    -
  • tx() - to get the current transaction
  • -
  • getPolicy() - to retrieve a policy instance
  • -
  • runPrivileged() - to perform a SystemUserAction
  • -
-

there are more - check the JavaDocs

- -

The following code snippets shows how a Service and Command are used to perform the task of adding a new - Order. Note how:

-
    -
  • the Service opens the transaction
  • -
  • adds the command to the TX
  • -
  • calls tx.commitOnClose()
  • -
  • the command validates its input
  • -
  • locks the object
  • -
  • performs the work
  • -
  • and implements an undo
  • -
- -

AddOrderService:

-
-public class AddOrderService extends AbstractService<AddOrderService.AddOrderArg, ServiceResult> {
-
-  @Override
-  protected ServiceResult getResultInstance() {
-    return new ServiceResult();
-  }
-
-  @Override
-  protected ServiceResult internalDoService(AddOrderArg arg) {
-
-    try (StrolchTransaction tx = openTx(arg.realm)) {
-      AddOrderCommand command = new AddOrderCommand(tx);
-      command.setOrder(arg.order);
-      tx.addCommand(command);
-      tx.commitOnClose();
-    }
-
-    return ServiceResult.success();
-  }
-
-  public static class AddOrderArg extends ServiceArgument {
-    public Order order;
-  }
-}
-        
- -

AddOrderCommand:

-
-public class AddOrderCommand extends Command {
-
-  private Order order;
-
-  public AddOrderCommand(StrolchTransaction tx) {
-    super(tx);
-  }
-
-  public void setOrder(Order order) {
-    this.order = order;
-  }
-
-  @Override
-  public void validate() {
-    DBC.PRE.assertNotNull("Order may not be null!", this.order);
-  }
-
-  @Override
-  public void doCommand() {
-
-    tx().lock(this.order);
-
-    OrderMap orderMap = tx().getOrderMap();
-    if (orderMap.hasElement(tx(), this.order.getType(), this.order.getId())) {
-      String msg = MessageFormat.format("The Order {0} already exists!", this.order.getLocator());
-      throw new StrolchException(msg);
-    }
-
-    orderMap.add(tx(), this.order);
-  }
-
-  @Override
-  public void undo() {
-    if (this.order != null && tx().isRollingBack()) {
-      OrderMap orderMap = tx().getOrderMap();
-      if (orderMap.hasElement(tx(), this.order.getType(), this.order.getId()))
-        orderMap.remove(tx(), this.order);
-    }
-  }
-}
-            
- - - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-transactions.html b/li.strolch.website/www.strolch.li/documentation-transactions.html deleted file mode 100644 index 0839f305a..000000000 --- a/li.strolch.website/www.strolch.li/documentation-transactions.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - Strolch: Transactions - - - - - - - - - - - - -
- - - -
- -

Strolch Transactions play a central role in a Strolch agent. A transaction is opened for a realm, and grants - access to the model of the agent. Transactions are implemented as a Java try-with-resources by - implementing the AutoCloseable interface. This makes it trivial to understand the scope of a - transaction.

- -

Transactions handle the following:

-
    -
  • Opening and closing database connections
  • -
  • Releasing locks to strolch elements, if tx.lock(StrolchRootElement) or tx.lock(Locator) - was called -
  • -
  • Performing Commands by executing them in the added order, and validating them first.
  • -
  • Exception handling
  • -
  • Auditing
  • -
  • Updating observers
  • -
- -

When a transaction is opened, it is by default read-only, i.e. does not perform any commands when it is - closed. Should the TX perform commands, then it is important to call tx.commitOnClose(), but - only at the end of the work, so that exception handling can properly work if something goes wrong.

- -

StrolchTransaction offers a myriad of methods:

-
    -
  • find element by its Locator
  • -
  • get methods for elements by type and id, or using a StringParameter or StringListParameter - references -
  • -
  • methods to add, update or remove elements
  • -
  • assert privilege access
  • -
  • get a new element by its template
  • -
  • check if an element exists by type and id
  • -
  • get streams for elements
  • -
  • add commands for execution
  • -
- -

Transactions are opened by accessing the realm, but there are convenience methods depending on the - use-case:

-
    -
  • In Services: by calling one of the openTx()-methods
  • -
  • In Commands: Transactions are already open, use method tx() to get instance. Note: - don't open a new TX inside a TX for the same realm! -
  • -
  • REST API: RestfulStrolchComponent.openTx()
  • -
- -

Important is to always open the transaction as a try-with-resource block and to define if the TX should - commit, or not:

-
-try (StrolchTransaction tx = openTx(...)) {
-
-  // read lock our object
-  Locator ferrariLoc = Resource.locatorFor("Car", "ferrari");
-  tx.lock(ferrariLoc);
-
-  // find a car by locator
-  Resource ferrari = tx.findElement(ferrariLoc);
-
-  // get a car by ID
-  Resource opel = tx.getResourceBy("Car", "opel", true);
-
-  // modify ball
-  opel.setName("Opel Corsa");
-  tx.update(opel);
-
-  // get by string reference
-  StringParameter ownerP = ferrari.getParameter("relations", "owner", true);
-  Resource owner = tx.getResourceBy(ownerP, true);
-
-  // get by string list reference
-  StringListParameter previousOwnersP = opel.getParameter("relations", "previousOwners", true);
-  List<Resource> previousOwners = tx.getResourcesBy(previousOwnersP, true);
-
-  // check resource exists
-  if (tx.hasResource("Car", "audi")) {
-    Resource audi = tx.getResourceBy("Car", "audi", true);
-
-    // assert has privilege to remove a car
-    tx.assertHasPrivilege(Operation.REMOVE, audi);
-
-    // remove the car
-    tx.remove(audi);
-  }
-
-  // iterate all cars
-  tx.streamResources("Car").forEach(car -> {
-  	logger.info("Car: " + car.getId());
-  });
-
-  // commit if TX was changed
-  if (tx.needsCommit())
-    tx.commitOnClose();
-}
- - - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation-versioning.html b/li.strolch.website/www.strolch.li/documentation-versioning.html deleted file mode 100644 index 01d33f344..000000000 --- a/li.strolch.website/www.strolch.li/documentation-versioning.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - Strolch: Versioning - - - - - - - - - - - - -
- - - -
- -

One of Strolch's features that sets it apart from other frameworks, is that versioning is baked into - Strolch's fabric. The feature is opt-in, as it is not required in all projects, but it only needs enabling, - for all modifications to objects to be versioned, so that rollbacks can be done when needed.

- -

The feature is enabled for each realm. In the StrolchConfiguration.xml file enable it by adding - the enableVersioning propery per realm:

-
-<StrolchConfiguration>
-  <env id="dev">
-    ...
-    <Component>
-      <name>RealmHandler</name>
-      <api>li.strolch.agent.api.RealmHandler</api>
-      <impl>li.strolch.agent.impl.DefaultRealmHandler</impl>
-      <depends>PrivilegeHandler</depends>
-      <Properties>
-        <realms>defaultRealm, otherRealm</realms>
-        <enableVersioning>true</enableVersioning>
-        <dataStoreMode>TRANSIENT</dataStoreMode>
-        <dataStoreFile>StrolchModel.xml</dataStoreFile>
-        <enableVersioning.otherRealm>true</enableVersioning.otherRealm>
-        <dataStoreMode.otherRealm>TRANSIENT</dataStoreMode.otherRealm>
-        <dataStoreFile.otherRealm>StrolchModel.xml</dataStoreFile.otherRealm>
-      </Properties>
-    </Component>
-  </env>
-  ...
-</StrolchConfiguration>
- -
-

Once versioning is enabled, versioning is handled automatically. The API for versioning is implemented on the - ElementMaps.

- -

Example: Revert to previous version of a Resource:

-
-Resource res = tx.getResourceBy("TestType", "MyTestResource");
-ResourceMap resourceMap = tx.getResourceMap();
-Resource previousVersion = resourceMap.revertToVersion(tx, res);
-// or
-Resource previousVersion = resourceMap.revertToVersion(tx, "TestType", "MyTestResource", 1);
- -

Example: Retrieve all versions of a Resource:

-
-List<Resource> versions = resourceMap.getVersionsFor(tx, "TestType", "MyTestResource");
- -
-

Note: When reverting to a previous version, it is important to remember, that any references on an - element to other elements will also be restored. As long as the relationship is to the same - element, then this is not an issue, but should the relationship have changed, then it this must - be handled and the user performing a revert be allowed to decided which element to reference in - the reverted version.

- - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/documentation.html b/li.strolch.website/www.strolch.li/documentation.html deleted file mode 100644 index cbdc7ea93..000000000 --- a/li.strolch.website/www.strolch.li/documentation.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - Strolch: Documentation - - - - - - - - - - - - -
- - - -
-

Strolch's documentation has only just begun, but as more and more details of the implementation in Strolch - are fixed, more documentation can be created and will be available here.

- -

Currently we have the following topics of discussion:

- - - - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/downloads.html b/li.strolch.website/www.strolch.li/downloads.html deleted file mode 100644 index 95d0916a1..000000000 --- a/li.strolch.website/www.strolch.li/downloads.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - Strolch: Downloads - - - - - - - - - - - - - -
- - - -
-
- -

Strolch is on Maven central, but if the - latest version is not there, then build it locally. A guide can be found on the - development page.

- -

Strolch is also built on Jenkins, so you can see if the latest - version passes all tests.

- - -
-
- - - -
- - -
 
- - - - - - - - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.eot b/li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 4a4ca865d67e86f961bc6e2ef00bffa4e34bb9ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20335 zcma%iRa9Lu*X_aGIXLtH2X}XOcXxM};>BGK?k>gMi@Uo+afec%&=$Y_zI(@iAMVRd zMzYtMnVHGh`(bBgBrYld0G2WU0R1n+0{)ZW{#ye8Pyh%N;2)-_`hS4`dHjR_o8s?3 z%Kr!aAA=Sk15gC$0aO9906BmJKn0)-&;Wq`d1e4dfc3v(2XF@106hNnKnJJ;tp3?v z|4=i4`#;17p#2YV|JP~t*4IuDO^FK=e+xx$$?LVd`z~aAr@Bit+ z4B+|46aYB=Q+D{L`5%t;Kdt|aZw_GpXL0?v@B%pgd3^uI=KcSkIq3hHHvk~6A@l#d zDHwovCxFWvz!d;sGQ^&}h@CLq(3!MVaFhSyL!rg*&d8F%X_&hML`QYBTiRZ}i=N8C zfX|m2SCm$2B^?XKJ=3POS}r1sVM9Nj*l5q`5#S% zQ}FD^zy1Pj*xUGOm4;*C;l80oktO?~%SdX8H^8@@idBFWyOINSr_!xo{REWRlXgw| z3-(h5XcHaEdPKzyy2-P+Rljn4lR?IelEOtWLiC?_9FW&x@kpuRtfsn*-QLS4EoN{{q0u8pt_^hD_!V);D{hen z-XpV~5QeQTYTIl1+B^5r72`!7FRQQ$Jh74=Gm*OkaIoNUC7!wk7rRZVuVK6urnp@}QDpB~9*S zkVWg8LyXz8-%53>GXb$%*H0(bqkUIN`Oz8g=bse?bAumC8`5XqA+(_y{fV^j(1$BZ za*@mJ(&?Dl2k;8tW}O6OaavJE|17u#1t>M^0!@SDJc2)cLZL`m7!-)74CQUXoksM* z9m|Sjh}@dm-Tnc8<77&TfjT6H{3)kXMM774`D!eA0|(RuQz@iQO(4-7lX|aK*M`Y=f%R{_&<*A? zB(AZUl6JXgz^9c9q7ZW~Lpncpv1I^6O4mGX@3P^Q)?jBgx(f#RD_4y0q5aC_beGG> zn%RbEy_vdx`sL?|Jvlgyxal-}XM^FDQYp|Euiu=%8o(=wic+XSimJ4(Adn3`QH6^D zQ}H@oBN{|Zg^2u|@8c~h7Kv&HCx??xy^J$3{B0{XnlrThDaoQqjXjXHi#b!KIjA7( z$hT;Ah_VP&j)(Z6&(xn;KF3rHsF^A#il?$)q4Pp#sly?|%OmoRG|MiNW3+)?3Wd9= zgbUjzTLX+!G&oYj9P;jnHmT91qKPzxkj@>rsqi|=M5$PfrRCY%E7${xLDZFtYcC%k zorpLj$T65dN+HV@=yRlKSS8W~SMxFkK1~U-XW2@DXcG`4-V)z|605uD4Q{MP10fD5 zc!T#)n57))zXXfg=dwnZuD_`DCJc3cHE6HuA(>36o_neqgoF0pRK0eEc~{rD8%Pfh z@dtE6ovkazKj3fd{)*&tB0YA^1d^^?2oeNyB7u(P+O4$@lCNc~%mb5iP)dLGM|z;x zEkRYM_^U`g%s5jiH=8Q2h zlS%BdC6DaYEWi0UNhnc*zFT$fV`4_VMNU~nH;q(Ld?!#lIvm)K;W_4C(l3+4TZ=QI zD%siB%cY+Y7vMFM_KAg?sxm(^nJsMIV?v|vAS8l;zotv$#Ml-Y!n7|X5Y5C)=TiGZ zQ+=(9%lk0&L&hDtwRD=Ua6wQeS{g2mvwc>^|4$ot-2Hi`z)|V$N{mNAEZC3gw_8%z zq(L3Bcwr2gin62dXM8cG-D-auD7HayLz zJI2|m=8$F?Ko>v@P4{(W5g=}-b$%tJgfywp`6&A96|Zx{9N;1@_>hto7TQf3EIMm+ zJ`;@@4ycXnHM>|iJ?FXkWGc8YuGviO&L*^ajd+vyLIxAAT{isADQQM5S;YP+jAYp7 z3E1Nm1HDd%SXi``NR*so7XidvRPj#BM7A`S{cU%VISQOhrMLr08;N36AYg9}40Ml# zU)GUxQy(D1%P`@`HDaXn&%m8`hOu~_2a`%P{v7w2;KUNhll)N(y4wD#p#{+($uLOB z!X;K=sci1erRm1=Qcx#ja(r=E8*89RNH8`C7T4|#uVRc=Kaf}0Xw)>8g0(4H!ZrK^ zh-Kf(V#NQcMU79on9bk?`U7eI{Nu-CdboLYH-7lJI|7VCob2872$p->3n)-J>N|b% zIn3vzKet~nvHB=bP6rDRV|&&4LL}S7`iu2ok&r8ecw~yUROul?44VSV3;z7qSQWl+y^cX=$j~OQ;o~0+_)5WDRF0^JbuD_umr4Mn$EPEyB-_eog^1*P#Ui}dCDH6-GndXgi$XV2SNHe#HHQoU z`2f{kT*~Y-Gtyd}I#v=*PbShJzp4hgaK>cr++;2GSGr7^2gA_3H1F;=06B{L4@fTs zD?F!vb_51Hnzb3BJlYiI4qZ5fDt|CaKX-N&2aP_DVX`bH*FN93cV*3fPvociz|dFF zDI@_;;4`*j9yW7pmnXjEwqe@BEQw*5Kcl$=zJxCo$}$5>0aU8*UXir zlo6vuHSn81M=rz-M|tYukSa7I2M$#Q-7`8&2-+UvW25@8gOf1VSR}3RdVFr|-&}4T zky0u`XuQc%0#b=LJWu5hm&cbB$Zk2FeYD~v-Cc92u|%sIUh-65dJR zZ3)g?oGWe-H6(Dl5E)k2)Hal?$9R73FM9`l`qB^<^f4kuce&|T)yCo{^=_a`TY*c$ zRRh_284jJjLoW$Wjv_@n$8LbXuW0pZw;g`-3$XUHD0Me!pbdD8z$3+L^KKYOabFdl zZW8&J8yRWfjLh?e7QJEkgl<&QwDnZ2^WwgBH0{AjxI^@Q)51nlGRVgj8j^jL0%{L5 zg~N&QybX0(ldaaot?}x4%vuVeTbZ96fpg*k(_p?a+IFGn!YUuS;~_Z0CLyGFeQ=ow zhS}^5R4dLfu9Q@MFw7c5_Tg`%mq$XF81YXSFD~rt=E6o|lVBQmHpMG(*<)M(E(4f* zifS(;Yjenr?~y*l>F20zQ%mciliU45f-wznJZdw(tS7t6>004*2#X3Ej3pco3fi`a z?|gM_ckVQxZ*D!nTeU+|gbdPEj(!rKUXu)| zkLqUGanZqn25Ek?PHa9%4W|%Ad_2AJ^C4ZsK(9AW?d?fe_y54j#ceCX7%ZMmS`{x=_0fcCjb0L>U_D>5f4kNy zHQQg5@4aYV)6gpTnv`z06M5a}w7=9Zxp`bcn&i(EOAPWj!?Z(2O?^DESnGfRDGcs1 z?IvJ*{LKonl7#robcFc@OJ<~_Nrt1&v@ePe#wEFKMxfTA!AwJm2~n9HG8Q3?YR-Yz z9Qm3kx|c48;)6Kyoo?<`!|@@xwp~u#ofuQm>ip4bLvO_8W)9{2phqI7{WR9NLgJ5S zHO8hXtJ(CY)mUG&o(gGo!3Qk!=#XUS13O&o{vweBJ4o1y<~#&5^$s69ECV9xM}=+2 z3!NJW8%Q`f_Ja)nexErX5!VB@V=TLVghSEjRt5vdJ8zuRg0R+Y>(Wb*7ED)es#R7< zyyj>az=m}1XQ+E7Z@KG=Cs|{!+EejQ_B-7_Z_Y;kETxVVJOayFzr&scDu#RzsdT7?ZD( zjt$GiPqMQDN##jNA(UuHMgjopqE;pkUTep+3YhG2G!BnK?~X#v(Hh{G+w3pu5aBF+5$)Hq);#9CbG zsE7UhKwvg;w*V(0K7kvgnm5CXt2oMK#y!&dqW6^CO`o-9h;rpe8sX@M7vdNHrSI)y z9KlvS+@+-`CzlS3h}P)VbJn)MN&1rZJDgsR=F2FHZMpd&S1VRKi;7W;=|X`v`iwr; z6={w%x(Bj(^(a<%?7PB*S%}>sft}U!!qdscsQgT@3X5WihmLBxuS7?1$@SvvJ3<<| zt}Y%yqH_W&6!_(na-jr#Zv7W*Cu#c6Hqr$o{eMTHmIWfcuI+rsXc1x$ibc)|lxs`| z^lhQp&^b^BTL(xEI!6k8bxom-D8C}+6_a%`?CYjSuFcEh5J1&Y`Z-6Dj-I`%()n$9 zg*b<&Zs^xdC{p2ab~}fxiuobr7XT7pIefDq+B0S-e*#Ncv}xLJi{{yPWu)?Esyu0; z1qsK_FAEg-C+$p0cp*xgs1s4btkM&3lqqeQRpD2eomd(OP0Q@*e&Xas38amh5^boC zOw$(pnvN$4MdoQ_u*a%EGU#34!L8h;hCq2qu>vma`dr@6OJ$uR*Uy0|v+9(q#{vUE z-6#WJn9K=D1b|=3z9t2tlyis<332BeH7r+zY@~b=^WA5yuvSMiyU=H97SQ7PJ=xDq8^5h@!5s)7NwIC(^9c}UqFKh>XnFPu|+L@P;S z3sSA!`G>+GcF}A^nfl|n_2P=oi#0>A$BphJo^niV$39q>jBn7=yG3jodFC|0-)C$R z@AvsPawzRcdI+N@#+XCUhE-bV6R(fb0#L8<{kZo-bBF0d_eb2=Oq%CRy|M%BGBmTi z*(vF=mDqfB)Ffbr1WObL5rtaXXn7h$vMIMyd!!E!)5Fe{yHa{ZKHpGwQ9J-@cQ$OX z8Bux&6WJ%|zF+jJZ&(g-&u~QV-Y_~q?DJ>#3~9WiBeIU_uh)eb{b{VUn_K9kFfYXL z#W?5L8z;XrA?Kc&ua35Hi_uhWghl9)h*)J}%wG+Xnnp2ZOl*YtK3VQxUMfBM+z>E2 zeI`!tBDijjXYxlLEZu7t_T<~!mR0{o>6W*Ejr z6v8z^G$W!dDq*^y$WbyhI)x}-s>tdk0{-;A z91U?k6Rg*%T*U)Uv_PP_}4jhJ6|~ z)$B}m4(d`YtCBcrVbz?cQGo|NhMK(@OnGsU7OAKgUBJLh?E@OO@sfUG8M``oQbcDgDKEy^t6!AhE@HqgSG<3Q{ND7tH!G1 zQFCZgl=Ykxr~0pdq)`n2y3~Y0cvkO5i!CLTAc68-9cOMi2c29BTcg!W5=XzHR68tT zH%o4w$B?>YF0Aq0w*Q@DIf|UyjajcxO2`!Av{p;s2#z_Xfp*{$2fM>65~br|rCyhX zcrN@r4!w~3imlj-eew7qq8d&vtYnSAT9&|&Y&=~}zF5=-5at@Gr1s6~`eBk{nJh+@ z#(=xEI>c6xXU(ucS*a_!ww@WYvo?~@3dBjqAUH~h9mW5q!R#);8l%8+oJnb+-ydqv)LHQJSgY=p%{@~Fk(V6=o{<5fV>)fPWOyXSo|G?G=*~> z?z><)(Ss@lE|vU-2vhORxCM>@LEx4O{!kmzI5 zFUOuOX^BHASj%#FATqS(FnqPTp^|Sq;eg3wKvIzUJ%FNpoCY`^OPv(^>&j{V#RFzE z@3Y)bA(4m_iaS`J&gG(v^)Jth;W$iESCeCBA1#B(N63V{dggoJ%RQn}c>a@^%gazJ zI$Shg5yVpcpnJOOWY^dBUI=3iC>#a1p2NQs|b zgZHukR9HwV8Sgp{#+jN7ZB3DI6~hIHv@&% z=$?K2gzM;xC?K<9N0|-BMSk4bLI)uB*!ugfY0qP3R%y5O?&{Xfzojfbw?zj^P+_;e zRVm>&GsN)=HBH+0BHxJo&ckuL8w0=_w~q6R{ghxeMmsDh;9@n%VFE`Zx%pQglC=A4 zmJFxIgNwqP)8^b#RwBGP+eI;wi}{^pYMTtQ4h21k5DL#G?TZ4VCjrqHlXx z5GWyy1)M+9Im*H1Nb!*p1miCdMHEs>^!0KnPX60;FztLJwN}7vh;E>|7i^aSKwZPp zbmc@;Z{n(|)caxrl1Z94YDTS$mif`TC>B#m4S#$l?uReS>1@v!TRjv$vg^osFiop z3Ec1yBx|_DM8|$B+gdt2+Wo8>VSiOZMk{KxbsETEqXrMe43bz3J;k2|bk1|VfW}}N ziBRxsE0VSSOf}i%^gY0FFMldwBHt78EjW?Hs`TiH)s0WX#E(VMU>!x(pRNEl0?(%d z(09!|c3J9g+xi&)MKNr%Lz~VacC(%gKWoY@ID6_>a>(E=mVmuqrKtH5d$d}xX&NeD z5RiuBXo9`O{xL>+V-49mRc(3kT+>qNP814Xc&F=6k?M%@t6NOb@@_X`d3htI>|zGN z&z3d$7^TV;cV+eyHCzB+pyNz1atbYX3gZfiSjHB<0Ehv&M)7xxzlJu32@Iosx5?qd z-7Ka#WS9+1pr}6b%d2z-ZT+Fzpf`63fy)jTb-|y39hX-WFKTi7kn^+4(;QJI%l!pK ze2L!7r+ad0PfD2bsar6XgD>XWJxwwoHCORf9r0VEIM_qM zCzw=0@8aB8TV{tjzE5zvR&0MR>so`xq~rHSLBuI)mS!Dh1{CI~)~Nb^?^R@Gb*0A1 z=&MnM%PG*qmrKBjp8ZIYS@DFDNwe5Ww=2e65vs{7e0?Ou*xB{?A9P$i{y zM|4xJ3)%!G%8d{u-AC5&>)0?3EeMgln4Yut1`I~s-Cl*~G*Ri1k>5}JY295;&pq@- z#Lm^4Hp$Vz)X?2y^sW@;*ClyG-%gBU|LBB2+bG$zX%YcrI$cSa$$Sdz2EBDDiX$!I z{_-)%I3e)hC3KOBqNUpTOsPtReVV3GD|?sDzlEY;lsV>UYEWf_58h)t*RN0JkrGu0p9p8L{s_RPwvTR zXR9)eJN*RNMO^RZbZOXGNdieWgVSs&xvqTIv}1x>vCDtEk6_WWAVXu?Nu7sREv!;U zh%KMgdA}u72`Xz6{1nx8ud@3we5$9_>x#f2Ci}@h{1$Fh&}3CiF{d z+}gjEHbU-5+06vi&lbqcVU4dKyM_2lgko*2LU$@58M9ER0>@8%8{Q`H zM^pmfKp*!)YkLi|P(GT%H`-^=EmrEUhQ4I?ux{(gb8Cfs3Y;=$r!4-O%2yn10(6sR zU6xmo^&_$SnfCEbTemLPST3#%z3J!5Y}po{ihZicg?6_ADfUcz?o1} zmJxCzhnNT~o!=vhmRTEXGQ4OT$Zvhr5{5Midj2y-p}oGVqRFwQiNxp#2-*sjF6fsF zV6XhhsSL>wR!QmL`QcBPeEpof>)1LNkZE`AL+G5)@6qC>qR! z8+){akxki?kaFfX6i}pXp_`Xlck94~S-?9*q=QqL2z=I4B@Zvi@4?yJho3QIdNI8l z#4QKGd<)2;6Vy;X#e*x_gP*hHWyFFgqukOJH7ndQUKry!7s+}S>|FP?VT3DlK1qQQ zk=oA%rP%@u3Q)BH2;)Li&oL3#M*r$!{Ih zASM=(#VCobo1BhR#*@dO*~PX)#gN9<0l;rNRKG4|p!^Nocw@Iy>-~ZJ?0T#CqSxD+ zevj?m@H}89TT2L<6HsC#BB(?}DykVK9k*1%F~}N9y4KadeB)RvJq;@3pmQntjRuyp zd+bH2w#~~?gnNl>cBMwx5@vUCsl~4k*^~r4aR!EORAjW02r1eGW<}-vIl3BCwVUEw zh(xbpj>h?!;M4gDxV}8^il-Ur;r34S_`LeD#vXa-JKk@`B;%!=m}ILfo6GCRP-vnwGMvS1TCwL(fwPc-To}O1cyV3K?4x z{_{-2*jZ}zOd{hm(Z%1afi9LPcXUtDSf?C9Eh3I80lt-6uc=&~q`FuW) zKHDvFXfegSj8LcxD#zUuFPYuggI{ZvI5 zj|TJPpX&$cTSpufZ23uYl>m#4Uva-%N<10wTI1Mav~)-=p+fo(j6RRxz{*!Z9U-)C z9>Fg)gf&-?LrVVy@(_wx>%nb~#fWvMjZ~3snIE4PjYc%6*#^HD>*h`@M=No(8gEO?tGG;DGL! zIknN6VVIpLepd7%^9kPQ=@m~$#G`d&22uBd7N`xiP7nd~8%zL8zY7$6HJXuC?e(YU zo|ZhfFlXWkh}8`aNOTEuicNS}80_)bI`FU)e}Gw)H(>SGZcAB2IjJ%f(xjS0D3g$f zpKWvE6C}I95gE5ucsGJw!I(^u@Qq2m!}b62JC2|pO%)yPHM(i^a4hL6s!^uhSYDQ( zs6-SU+3-3w$KoVN{lR=H^hVSP#EnRfCNooS9%oP_bri+sHqLwpN!J;gB#HbCT*wP$kPMWfp>3s$!F>BG0nI}(tOBcS z`;|a~gZLF43#h#S#h9K-xNW62tdPsD6m#K0iM?V&GbYaL+Tv1R7X)gj~#SmUb78qLnlqoP^ zSe`gkIP@zojM0&GO=h@|U1Brj_A5+?CK^Vl?qgjE)=Mo|Man|gckYv`pkbSNoKK!l zI{10#kbR9{p%uRJ4wx<2MtMI>or0N#cP<&(WR_(NRzrNObQ6E4VtUzc?fH?Q`SmTe ze9vOyJ~XZ1o3+9UPw0YlgJEIwL%gBxaQO=tjEqDxu@8q>P<_RrX#GyAh7*w=e!%zM zvmm+X4>-{%3kZ>L>`>A9e(Oe^W8*8imEKjvrX~B9Z?mF4pdgAW0GcqQ8K?PWbOtli z6v1wXRcjUM?UkNSiRv~-lG&n=6 z$-Xti>!AZ`H4B7vrP6?>0{7UrywB2v>KcE_pW4LIO&E1X8z-=JL#R3C|YNnMkc!*60bMHvnH<`ilEG%{J&Fe*%+ zjTZG$y6;1$L>`qR_sp}wV!83lNr^{s08V1fY$}RtDBk_ zY{PKqIRP(E+njlJ>;-Ne9DTE9Yc-7W#!7e7F3YVtOg2yK#&M<)w#4K*c(bn^FnHGi zOO53p1ce|18`isRiPy2)Cp&cXWCMewS7U(<3?fr$6<2fP(VAkoOk?Mn;n6cy6eoEN zcTNR*-IloNR3v5#qTkK~&Q92!hff@mt5?U>fQ)(sn9?kZ zoELH=@&o-m=!`QtVP*4!Zq3MI*C)c*169O@A6{Sw1BrU77bX<7)o+B=OKOT3M_qUu z)G%1v*Dw$3!{WTWe}2o~d*W7}{itvohqK!zI4HNk!NALAmrWckmSUmNsWC3}z589I z?(Ph?T0sx*T5P5eOv%MYbRzUJ)6Kn!@@StdaavA^up>Bu#v(VH%nlM5iNgY!YUrMi ze_F{-tA~K?Z+>D_Z`ea`+x(I5S4rc!$&2G#xZi5!P+od8TU36$-U+2lUz(G)^M=`)XHCub}p+?s<^N%UM4vVLX!W z3!0^;2XT5crok6h1={vUZ6hmQ4N20z`>5mfN}W4i2ah$KgcnPPpEs_(#;Q{)27f<( z*y2iflq`qB-OJXu(8w@R=)->-a6|4bNxNMnft?20HkuCy$6$L09kd)G)W4O=9BM|{ z0njynOnyNaTVrFARb&?Wz)KO0c=aeIrmJGdj2T21U*d{=r&%WGB_fB}!Crdq%$!h6 zTYHZU91PZ_u6~E*gTy3XA#JV7W1QF6sjN;@hLE{nCX07QHTpvH15PaG$-!bfNO#d# zLz-yQ&tSY!D@K{1sPCqy(XopWKKD^Su(X0yAdtrAPbwvb;0KzwfBiTWK|Q z=@~d0^<3M_hSR&Ce?AW}16N8iRRYrnJD8B8G!k~7@GQoI<#32mT-zRtY2CpF2f(XA zMU6CkH@0EN1UN@jBxhBao0Y7;t{jc1e4a+0fB6N7b2yPo(8A@@2haBnasAf%nJCjH zql`!qJ9zbokA$A+Li$D^=r%*k928%W0a#oK{oyi-%i#({q!i0)WJ1(aFJgY*$gn{8I=(Ww04qI1{H zye0i*Mr`~uq|h*1yj(Kb6ltw^K@0am&(EmI`#hR*0ct8#{B~3BSz88+3Bzg4k81*^8%KE#*02QR*UK z2M-^JFu#z+ux)Gj9-Ypn7I{$oQ)oL1`l&|nToNk4Tamb^hRS)nuoZIEjHOtFqfhay zZUTan1jXVWhNrTYA$UlLl2*5w4DdkB`Zffs@;~cY=26uyjz?2T9bVi&2sRpcJQEc} zswq*+P- zDN^CmeDw%s_1+%}Im49+!#OjZ;j(Q*hfk#Bm}vcixtLUk-l>q@`BV7ppOrG2W#Z%& zW()~2c*wbgWlG&}uVkUND;LEy@?#C{}77N~WYzz)?Az@B@SyxF&QfwgRVOOn%0aye75&&}>S zzXc$D2{D5sKzp?kZ^aDn`*nF+3|f|e(o$M#yR)s_4THwu&3vi*JPwOBR)%9|cQ^)g z4XHCFEsKY{w1K@z=AIAvPKl3~tb_^UIhBwmBDl`00~fq=Sz&xh<>PA2hJCH!hGwUW zSgtprf2*L$jmE;I<{4F(Ggnc%YAXfr=SqhudnSKgbgU~un2Z{YIR{ZU&6?3OUcSLAaY@eW`eEgpt7 zlUlHem*R=;T?P@87+ei=K*i)c(`M7rgYp~;1v3UAroT0zo2b1J>$(E72e7wJRJ^j+ zfwa{lP}teWV2Cat(t`GRp|FvPh+q_fqDrDbm_Mgv ze11tcDh~Zxw+#nx2(x{He?+>B8}7!V`sarmVDe6{$$s5`AD)NF!*)Lkxhe86X@8YJ zUKj5XynC5Tkh`933miE2XeIrq#2DMX^k7QLZ zL|1DDSCs` zP~b8wgEc_AKuOkS68=kJJcC!LEhv(jc*PJc+JDJEZntc9XnDeon^R1KS8VypEKVS=!F?4_G(KTNE3yww1& z<<4Fsm#(W&-EE|$ep#8R2{KX@^9n+)nbR_CuKu2`y-?j&_Et#qL+_J4;tN=2WAJ?_ z>GAwa1Ld2`rz_J{-N+hUE`7D?$vACB{U+#Df4rK7HY2#|H7ad3`gquCdhAM5`64&^ zml&N+{;t8*A@sURFNd(28=x_y`ZPiZmZ*JTwE@14fXfD|h6GL5)jmGBn&D0L=Vf@m zCfsvhVa?!2*QXbkyXRHMlvIPVI=myUYfFf`Kvx;HNNg+~nfLnniq{U32A~2`%1Vz|wmTEs2e$)WSRz z)ul1TY;;WAQl)z-Kdg2cN`8In{^lIY0O)kQ^I2SoQWf~F>*MJp!pVm!TB9y-tC8z^ zo;bCQ?{j%6p6`I;Hk8t!SYr(BA&>}DrGxg2UYggV|Zk#`Og7%@FQAPviijGoxn3uBn010T08 zQ!nFZtP~|hjSMd!(1+p*Ez!^!t-}`5!O{-R&*GB$6p41JkhO#U#f{uNj#66xGL$#dz~=tSkpT%4i1 zgjkQKiEant8(H)O7-+8ZSoA)7^JvjbKP-NF5#si838FETR9 z{>F}aEty|AxCF?_9K2a!PCD&{mLIaLn~rY9PkVlT{$&jW-^9L(DZPjb!3!(?6gP

!oRptb@n+ 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 diff --git a/li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.svg b/li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index e3e2dc739..000000000 --- a/li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.ttf b/li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 67fa00bf83801d2fa568546b982c80d27f6ef74e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41280 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

PBK;&Wcg|NX{>QR@W3{K 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 diff --git a/li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.woff b/li.strolch.website/www.strolch.li/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 8c54182aa5d4d1ab3c9171976b615c1dcb1dc187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23320 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 mX4Rts - - - - - - - - - - - Strolch: Overview - - - - - - - - - - -

- -
- - - -
- -

Overview

- -

Strolch is an open source component based software agent written in Java and can be compared, in a light - sense, with the Java EE stack: Strolch takes care of persistence, implements Services for use cases, Commands - as re-usable algorithms and has a parameterized data model.

- -

Strolch has an intrinsic understanding for mandates, which are called realms so that a single agent can be - used to implement applications with multiple users/customers for instance in SaaS environments.

- -

The parameterized data model consists of three top level objects, Resources, Orders and Activities. These - objects can have any number of ParameterBags which in turn can have any number of Parameters on them. This - allows for a very dynamic modelling of data structures including modification at run time. Multiple ready to - use Parameter types are already implemented which handle the primitive types in Java including ListParameters - for collections of these primitive types.

- -

One of the main features of the Strolch agent, is that persistence is handled transparently and the user must - not be worried about databases and the likes. Currently there are two implementations for persisting the - Strolch model, a PostgreSQL and an XML file persistence. Currently both persistence layers persist the data - by converting to XML and storing it into the database. The XML file persistence stores each object in its own - file.

- -

The agent itself has a small memory footprint and requires very few components to start. For the agent to be - useful it needs additional functionality which is implemented in StrolchComponents. Each component is - registered via its Java interface on the agent and is bound to the life cycle of the agent. When the agent is - started, these components can be retrieved and used to perform any number of functionalities. This is the - preferred way to extend the Strolch agent. There are a number of components already implemented, e.g. the - ServiceHandler which executes Services in a controlled fashion and can validate authorized access to these - services.

- -

No software product is complete without a system for authentication and authorization. Strolch implements - this by using the Privilege framework which has been written by Robert von Burg. The standard ServiceHandler - detects the existence of the PrivilegeHandler and then validates that the user has authorization to perform - the service. This framework is implemented as its own Strolch component, thus can be retrieved at any time - during execution to perform fine grained and special authorization validation.

- -

Motivation

- -

A question often asked is why create Strolch. What are its benefits in contrast to using Java SE with an - OR-Mapper like Hibernate, or using Java EE on JBoss or Glassfish? Especially since many of the features - existing in those stacks needed to be re-created in Strolch.

- -

The first answer to this question is that those systems are often overly complicated and bloated. Java SE - with Hibernate certainly is a viable option when it comes to being light-weightier but Hibernate, even though - it is supposed to, often fails to truly help remove the need to really understand an RDBMS. Often enough - Hibernate will just get in the way of the most important part of development: writing the business code. - Being an OR-Mapper which is supposed to implement all the nitty-gritty details of an RDBMS system, Hibernate, - and JPA for that matter, still often has the developer go back to understanding these details.

- -

Strolch tries a different approach to persistence. Instead of writing pojos/entities, Strolch's model has the - concept that each element's attributes are part of a composition pattern: each attribute is its own object - and thus can be dynamically changed at runtime, but also makes persistence of such an element generic. - Instead of having fixed attributes for a concrete class, these parameters are stored in a map and are - accessed through the parameter's ID.

- -

Assigning an ID to an attribute for accessing of course brings its own downsides, i.e. the parameter might - simply not be there, when being accessed. This is certainly an issue that the developer must handle, when - implementing a project using Strolch, but allows the developer to not need to worry about persistence, as - this is generically handled.

- -

Since the persistence is generically handled, and Strolch stays lightweight on its requirements at runtime, - the developer can quickly get down to what is important for business value: Writing the business logic and - the presentation layer. Here too Strolch tries to help the developer by bringing in concepts which are easy - to follow: Use cases are implemented as Services, and re-usable business logic is put into Commands.

- -

There will be reasons against using Strolch, as there will be against using the Java EE stack, or an - OR-Mapper or even the Java ecosystem for that fact. Important is to note, that the concepts behind Strolch - are nothing new, but have been implemented in at least two previous proprietary products. Since those - products are not accessible to the public, it was decided that a re-implementation might be of use to the - programming community at large.

- -

Currently there is at least one company using Strolch in a commercial project which helps drive Strolch's - development and further motivates its existence.

- -

Strolch is an open source project and licensed under the Apache License 2.0.

- -

Technologoy

- -

Strolch is written in Java and is programmed against the JDK 8. Strolch runs on any JRE 8 compliant - environment. Strolch is tested on the Oracle JRE 8.

- -

Dependencies

- -

Strolch strives to use as few external dependencies as possible, so that the Strolch runtime is not bloated - unnecessarily. The following list of Strolch dependencies is a summary and was created using mvn - dependency:tree on the strolch_minimal project for release 1.6.47.

- -

Logging

-
    -
  • org.slf4j:slf4j-api:jar:1.7.25
  • -
  • ch.qos.logback:logback-classic:jar:1.2.3
  • -
  • ch.qos.logback:logback-core:jar:1.2.3
  • -
- -

Utils

-
    -
  • javax.mail:javax.mail-api:jar:1.6.0
  • -
  • com.sun.mail:javax.mail:jar:1.6.0
  • -
  • javax.activation:activation:jar:1.1
  • -
- -

Testing

-
    -
  • junit:junit:jar:4.12
  • -
  • org.hamcrest:hamcrest-core:jar:1.3
  • -
  • org.hamcrest:hamcrest-library:jar:1.3
  • -
  • org.mockito:mockito-core:jar:2.0.8-beta
  • -
  • org.objenesis:objenesis:jar:2.1
  • -
- -

Model

-
    -
  • com.google.code.gson:gson:jar:2.8.2
  • -
- -

SOQL

-
    -
  • org.abego.treelayout:org.abego.treelayout.core:jar:1.0.3
  • -
  • org.antlr:antlr-runtime:jar:3.5.2
  • -
  • org.antlr:antlr4-runtime:jar:4.7
  • -
  • org.antlr:antlr4:jar:4.7
  • -
  • org.antlr:ST4:jar:4.0.8
  • -
  • org.glassfish:javax.json:jar:1.0.4
  • -
  • com.ibm.icu:icu4j:jar:58.2
  • -
- -

PostgreSQL

-
    -
  • com.zaxxer:HikariCP:jar:2.7.1
  • -
  • org.postgresql:postgresql:jar:42.1.4
  • -
- -

REST

-
    -
  • javax.annotation:javax.annotation-api:jar:1.3.1
  • -
  • javax.servlet:javax.servlet-api:jar:3.1.0
  • -
  • javax.ws.rs:javax.ws.rs-api:jar:2.1
  • -
- -

REST testing

-
    -
  • javax.validation:validation-api:jar:1.1.0.Final
  • -
  • org.glassfish.grizzly:grizzly-framework:jar:2.3.28
  • -
  • org.glassfish.grizzly:grizzly-http-server:jar:2.3.28
  • -
  • org.glassfish.grizzly:grizzly-http-servlet:jar:2.3.28
  • -
  • org.glassfish.grizzly:grizzly-http:jar:2.3.28
  • -
  • org.glassfish.hk2:hk2-api:jar:2.5.0-b32
  • -
  • org.glassfish.hk2:hk2-locator:jar:2.5.0-b32
  • -
  • org.glassfish.hk2:hk2-utils:jar:2.5.0-b32
  • -
  • org.glassfish.hk2:osgi-resource-locator:jar:1.0.1
  • -
  • org.glassfish.hk2.external:aopalliance-repackaged:jar:2.5.0-b32
  • -
  • org.glassfish.hk2.external:javax.inject:jar:2.5.0-b32
  • -
  • org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.25.1
  • -
  • org.glassfish.jersey.containers:jersey-container-grizzly2-http:jar:2.25.1
  • -
  • org.glassfish.jersey.containers:jersey-container-grizzly2-servlet:jar:2.25.1
  • -
  • org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.25.1
  • -
  • org.glassfish.jersey.containers:jersey-container-servlet:jar:2.25.1
  • -
  • org.glassfish.jersey.core:jersey-client:jar:2.25.1
  • -
  • org.glassfish.jersey.core:jersey-common:jar:2.25.1
  • -
  • org.glassfish.jersey.core:jersey-server:jar:2.25.1
  • -
  • org.glassfish.jersey.media:jersey-media-jaxb:jar:2.25.1
  • -
  • org.glassfish.jersey.test-framework:jersey-test-framework-core:jar:2.25.1
  • -
  • org.javassist:javassist:jar:3.20.0-GA
  • -
- - -

API

- -

Check out the API page to see how to use Strolch.

- -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/ico/favicon.ico b/li.strolch.website/www.strolch.li/ico/favicon.ico deleted file mode 100644 index f576a4696364b93ad7312109601e2c12da0b4d4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmc&&`%~0a6knSD0Dt$z`b6cafV@;xN>LY91XM751iJYEO(g^}t(c@Sv{VF?AS_WQ z$4BI~-%^Q@Hqk1jp-eECRpM6dDfWzYa$_j$5Cc;c?FS!(x5z zp)rr$L!%*^FeDnXhD0%3gCjv=-rxyf;4!{^2xo5iL>~ec437h}g@^^Thll~RsqAGN z_Ob>?Y4#$03r8gMA|T%x4|&c>kQ+`wdzwvQFP81;Hj!g*!RRC?7&RFdBNmNJgzW_$ zIJUb{;pnbLXnnm7%4X%+ax5B~3eOS7q`;Cf$#DFggJAdc_4UD9r4`Ik@Dvw>%tNq`>pF1b0nK`-7myE1D@y%SQR}JRz}T))Ag-9_XqFS zaB^P@+q-q+CXb!i-@+V;r&xCitc{xuYvN|Xn%HMyHR8AuAA0e7C#rtCe4A;Ntv*2VkUgjaERx>|Jp9LNBqA1_#BVbdCHmN z%BUH*?&-Yl7ZY7T*pM&})+0V`{D9}4X*vWoi#$+UR0>zm|Hxx)+jc6Oo|p_?_vR!w zY);CCO_Q@>yI=T@7as9)Yt5 z+8G`AZmq0^%8bQ|<9b?iJgs>SRHo+kZb{9BEvXBjB87mq44Y)HJZV1iBaUvxabseZ zv1V6q^^|;HRazbpDjB(ClkN4lDL9tz7>2x>% z{tc+kgd@@svd(Pd+JpnzgZmLiz_Xm~9v0)pbKFB`S=Ah^_UQG;t`7O@Q6$zQf~rgM za}SPr5iaSM-dLY%WR3FIDWg^y^(qi2$wPlj9{OAGF>$IP-&oUJs;+6Z&7P0Heg@+6 zgfVjEIpe)lwbuS*3 zsA{jQzr;u9gfUX_kv0CwVuW{8fEbB-oy7MP-Bt3wA}-8lq~N0S`Ojj6oak;VB;egq zNOz{hC_g96(~zF47cRl6wst5<%T)Juuzgea>{z;ICCr>ca;{B!*wX{AmXzY21=%;$ zB}*=9j!NOq@OV#3bZ`xch)es<$X_D zr#O`nQWwYwd1$WZD0{Teh>V zE26x{Jks|}=-L$4O{DKgkFjPX-Dqei$w~Jg>StQJHIM9aTj@;Fnh4?|AvuNWljhyK za~Ilb-?ojB-M+0e^eJmUL;tNcxJW*_|3^I!q4VMu+y_6%r~VvoXn~RdxkOrC<~8wQ zoor}E(v7T_Eu3`QE+sbwD7oi(YiNxKUDDm1Ln?t+hQxbxB# z*2vZv5f}Zr`2Bg2M*(u1<_3%5c*qaaKT6PAG+b&zjQ(K)>_04XvSWS`ngk0@4@YxUHUYj_1ndW_bgVNHR7du z0Haqi@i91=42Sroedj(1CAYa3F?t-?KUg`1=u%Dl>Z1;o*Loh=<+kdJEd7?~k=)oP zxs~04KHR{(IM;px_Lfz1KSp_^a%q6vre4b5Pl-Ow%*p7jg2c#f-(+rYNDz6X_!zlO zXTLH{@5B84ou5;VzjquUMsm+&KS_K{oVd5_pWE0EcAI)k;)4*qt9%EGQ4aUWDwm8t zRC3xBIJdj8FZEh`Q-6<2y|3USdS5f2fHC4Yg|u(v+eQAZ(0gTDJ^}Vk^!j#rWE&&y zL(zAQ)xX{Mpq%*s12RVR*7r^1k(S%sf8v?q{u}*K94H>NC;j4KHx`sn{}^>6Coe+v M-`c+d{+Ew`0}&iFivR!s diff --git a/li.strolch.website/www.strolch.li/images/Strolch-Bird-View.svg b/li.strolch.website/www.strolch.li/images/Strolch-Bird-View.svg deleted file mode 100644 index df7f1c50f..000000000 --- a/li.strolch.website/www.strolch.li/images/Strolch-Bird-View.svg +++ /dev/null @@ -1,2 +0,0 @@ - -
Browser / Other
Browser / Other
Strolch Agent
Strolch Agent
REST API (JSON / XML)
REST API (JSON / XML)
JDBC (JSON / XML)
JDBC (JSON / XML)
Presentation
Presentation
Business
Business
Database
Database
External Systems
(Agents, ERP, etc.)
[Not supported by viewer]
Any API, preferred REST with JSON
Any API, preferred REST with JSON
System
System
\ No newline at end of file diff --git a/li.strolch.website/www.strolch.li/images/Strolch-PLC-Architecture-Overview.png b/li.strolch.website/www.strolch.li/images/Strolch-PLC-Architecture-Overview.png deleted file mode 100644 index 67592f64a30164dfbeaff3c705c85784a6195a18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34401 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 DygzHQ diff --git a/li.strolch.website/www.strolch.li/images/Strolch-PLC-Architecture.png b/li.strolch.website/www.strolch.li/images/Strolch-PLC-Architecture.png deleted file mode 100644 index 8913eddb9768717fa1ab2c46fc5fcc343fdfa311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39995 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 diff --git a/li.strolch.website/www.strolch.li/images/Strolch-Squirrel-View.svg b/li.strolch.website/www.strolch.li/images/Strolch-Squirrel-View.svg deleted file mode 100644 index b07099282..000000000 --- a/li.strolch.website/www.strolch.li/images/Strolch-Squirrel-View.svg +++ /dev/null @@ -1,2 +0,0 @@ - -
Strolch Agent
Strolch Agent
Services
Services
Commands
Commands
REST Endpoints
REST Endpoints
DAOs
DAOs
ResourceMap
ResourceMap
ActivityMap
ActivityMap
OrderMap
OrderMap
Realm n
Realm n
Component X
Component X
Component Y
Component Y
Component Z
Component Z
Search API
Search API
Privileges
Privileges
Transactions
Transactions
Observers
Observers
Versioning
Versioning
Policies
Policies
Audits
Audits
\ No newline at end of file diff --git a/li.strolch.website/www.strolch.li/images/strolch-model-example.png b/li.strolch.website/www.strolch.li/images/strolch-model-example.png deleted file mode 100644 index f88f79bc7a41fc2ce27ff8db06ac5431de7c9bef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20086 zcma*O2RN1u-#>my*_D}$NXRN8DO<7$A$w)-J+q~<$xJp`*;_Ul84(h)ce3~9_dW0X zxu5s_zwh%N$N#vG)^%U5>m1+lS!aN}toUUdavT&2by-qEL;;1m;0}M!#KM5zg@zQk zP$>M3mrAM*3NM^*+SpkenOYd$ba1sXylLoSYJ@_${K}6rkI?vR=Xb78qJ3e4@eXD$ z)_P;te(cSRxV~ts;VY2}599eT!#?G8-}#<+e$=~s_DVdIzFPCcpmy%!JGV94jpmcZ z&BGh+o`RF%BV0PF!Wy5}I zU*dyWVZ+dfa|*HG`rGx%0Aet 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 - - - - - - - - - - - Strolch: Overview - - - - - - - - - - -

- -
- - - -
- -

Strolch in short

- -

Strolch is framework for developing Software. It's main features are:

- - - -

Strolch Intro

- -

It is a different framework to Spring and other similar type of Java frameworks, as the model is defined as - an abstract model, where you always have the same three types of objects: Resources, Orders and Activities. - The fields are mapped as Parameter objects, of which the important primitives are available.

- -

The nice part about this framework is, that you can be up and ready in a matter of minutes, and start - building your project immediately in that you open your favourite XML editor and start modelling your - data.

- -

Once your data is defined, you write your business logic in the form of Services, Commands and Searches. - There are many predefined services and commands to manipulate the object model, so that you write your own - services when you need to enforce special business rules.

- -

Through the use of Policy objects, you decouple algorithms from your object model, so that at runtime you can - change the behaviour, or easily implement different behaviour depending on your use-case. For instance you - might have a simple billing service which performs a few preparatory steps, and then calls the configured - billing policy to execute the billing depending on the customer, the warehouse, etc.

- -

And of course persistence is as simple as configuring the persistence handler, pointing to your RDBMS and - then setting the mode to CACHED. For you as a developer there is no more thinking in terms of SQL etc., as - this is completely hidden from the developer. There is even a simple file persistence layer if you are - running IoT devices.

- -

The runtime can be just about anything. Usually it is run inside an Apache Tomcat instance as a webapp, as a - WEB UI has been required for all current Strolch projects. You could just as well use a main class. Accessing - the Strolch Agent remotely is usually done through REST.

- -

Strolch is being actively developed, and customers constantly give us reasons to improve and extend the - framework. There is a Polymer Inspector component which makes it easy to see and manipulate the actual data. - The new Search API makes it really easy to query your data.

- -

Yes, Strolch is different, but the concept has come out of the planning and execution segment, and has been - refined over the years until it has become what it is today.

- -

API

- -

Check out the API page to see how to use Strolch.

- - More to motivation etc. - -
- - - - -
- - - - - - - - - - - - - - diff --git a/li.strolch.website/www.strolch.li/js/bootstrap.js b/li.strolch.website/www.strolch.li/js/bootstrap.js deleted file mode 100644 index 8ae571b6d..000000000 --- a/li.strolch.website/www.strolch.li/js/bootstrap.js +++ /dev/null @@ -1,1951 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } - -/* ======================================================================== - * Bootstrap: transition.js v3.1.1 - * http://getbootstrap.com/javascript/#transitions - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd', - 'MozTransition' : 'transitionend', - 'OTransition' : 'oTransitionEnd otransitionend', - 'transition' : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false, $el = this - $(this).one($.support.transition.end, function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.1.1 - * http://getbootstrap.com/javascript/#alerts - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent.trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one($.support.transition.end, removeElement) - .emulateTransitionEnd(150) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.1.1 - * http://getbootstrap.com/javascript/#buttons - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state = state + 'Text' - - if (!data.resetText) $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d) - } - }, this), 0) - } - - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked') && this.$element.hasClass('active')) changed = false - else $parent.find('.active').removeClass('active') - } - if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') - } - - if (changed) this.$element.toggleClass('active') - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - e.preventDefault() - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.1.1 - * http://getbootstrap.com/javascript/#carousel - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = - this.sliding = - this.interval = - this.$active = - this.$items = null - - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.DEFAULTS = { - interval: 5000, - pause: 'hover', - wrap: true - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getActiveIndex = function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - - return this.$items.index(this.$active) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getActiveIndex() - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - if ($next.hasClass('active')) return this.sliding = false - - var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - - this.sliding = true - - isCycling && this.pause() - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid.bs.carousel', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0) - }) - .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) - } else { - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid.bs.carousel') - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - $carousel.carousel($carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.1.1 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing') - [dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in') - [dimension]('auto') - this.transitioning = 0 - this.$element.trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - [dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element - [dimension](this.$element[dimension]()) - [0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data && options.toggle && option == 'show') option = !option - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - $target.collapse(option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.1.1 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle=dropdown]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $('