You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ja...@apache.org on 2018/10/09 09:09:05 UTC
[01/27] lucene-solr:solr7896-login-page: WIP testing HTTP interceptors
Repository: lucene-solr
Updated Branches:
refs/heads/solr7896-login-page [created] 954cbf127
WIP testing HTTP interceptors
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/0fc0ff23
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/0fc0ff23
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/0fc0ff23
Branch: refs/heads/solr7896-login-page
Commit: 0fc0ff23ae91509cc135dfa425df469559dd76a0
Parents: 1c8ab33
Author: Jan Høydahl <ja...@apache.org>
Authored: Thu Apr 19 11:23:43 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Thu Apr 19 11:23:43 2018 +0200
----------------------------------------------------------------------
solr/bin/solr.in.sh | 8 ++++++++
solr/webapp/web/js/angular/app.js | 24 ++++++++++++++++++++++++
2 files changed, 32 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/0fc0ff23/solr/bin/solr.in.sh
----------------------------------------------------------------------
diff --git a/solr/bin/solr.in.sh b/solr/bin/solr.in.sh
index 7cf6a84..04ac46c 100644
--- a/solr/bin/solr.in.sh
+++ b/solr/bin/solr.in.sh
@@ -171,3 +171,11 @@
#SOLR_RECOMMENDED_MAX_PROCESSES=
#SOLR_ULIMIT_CHECKS=
+
+# The following lines added by ./solr for enabling BasicAuth
+# SOLR_AUTH_TYPE="basic"
+# SOLR_AUTHENTICATION_OPTS="-Dsolr.httpclient.config=/Users/janhoy/git/lucene-solr/solr/server/solr/basicAuth.conf"
+
+# The following lines added by ./solr for enabling BasicAuth
+SOLR_AUTH_TYPE="basic"
+SOLR_AUTHENTICATION_OPTS="-Dsolr.httpclient.config=/Users/janhoy/git/lucene-solr/solr/server/solr/basicAuth.conf"
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/0fc0ff23/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index ad96ce0..ee420d3 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -369,8 +369,32 @@ solrAdminApp.config([
return {request: started, response: ended, responseError: failed};
})
+.factory('authInterceptor', function($q, $rootScope, $timeout, $injector) {
+ var started = function(config) {
+ config.headers['Authorization'] = "Basic c29scjpTb2xyUm9ja3M="; // solr / solrRocks
+ console.log("Added authorization header");
+ return config || $q.when(config);
+ };
+
+ var ended = function(response) {
+ if (response.headers['WWW-Authenticate'] != null) {
+ console.log("Got WWW-Authenticate header");
+ alert("WWW-Authenticate: " + response.headers['WWW-Authenticate']);
+ }
+ return response || $q.when(response);
+ };
+
+ var failed = function(rejection) {
+ console.log("Failed with rejection " + rejection);
+ $rootScope.$broadcast('loadingStatusInactive');
+ return $q.reject(rejection);
+ };
+
+ return {request: started, response: ended, responseError: failed};
+})
.config(function($httpProvider) {
$httpProvider.interceptors.push("httpInterceptor");
+ $httpProvider.interceptors.push("authInterceptor");
})
.directive('fileModel', function ($parse) {
return {
[10/27] lucene-solr:solr7896-login-page: Enable auth interceptor and
hardcoded pw
Posted by ja...@apache.org.
Enable auth interceptor and hardcoded pw
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/d531b923
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/d531b923
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/d531b923
Branch: refs/heads/solr7896-login-page
Commit: d531b92358ceb6317bfe2ad041e53c9d1d04a6c6
Parents: 4457de3
Author: Jan Høydahl <ja...@apache.org>
Authored: Wed Aug 8 16:24:47 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Wed Aug 8 16:24:47 2018 +0200
----------------------------------------------------------------------
solr/webapp/web/js/angular/app.js | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d531b923/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index 9be1ee5..3f781cd 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -371,7 +371,7 @@ solrAdminApp.config([
})
.factory('authInterceptor', function($q, $rootScope, $timeout, $injector) {
var started = function(config) {
- var ah = "Basic c29scjpzb2xyUm9ja3M="; // solr / solrRocks
+ var ah = "Basic c29scjpTb2xyUm9ja3M="; // solr / SolrRocks
config.headers['Authorization'] = ah;
console.log("Added authorization header " + ah);
return config || $q.when(config);
@@ -389,6 +389,8 @@ solrAdminApp.config([
console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
if (rejection.status === 401) {
console.log("Status code is 401");
+ } else {
+ console.log("Rejection status is " + rejection.status)
}
$rootScope.$broadcast('loadingStatusInactive');
return $q.reject(rejection);
@@ -398,7 +400,7 @@ solrAdminApp.config([
})
.config(function($httpProvider) {
$httpProvider.interceptors.push("httpInterceptor");
- //$httpProvider.interceptors.push("authInterceptor");
+ $httpProvider.interceptors.push("authInterceptor");
// Tell the BasicAuth plugin that we are Admin UI so it can serve us a 'Authorization: xBasic xxxx' header
// so that the browser will not intercept the login dialogue
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
[09/27] lucene-solr:solr7896-login-page: Merge branch 'master' into
solr7896-login-page
Posted by ja...@apache.org.
Merge branch 'master' into solr7896-login-page
# Conflicts:
# solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/4457de36
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/4457de36
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/4457de36
Branch: refs/heads/solr7896-login-page
Commit: 4457de36b1d5795cb774621afd6358c8c41ee62b
Parents: 5728c9b 6845bbf
Author: Jan Høydahl <ja...@apache.org>
Authored: Wed Aug 8 16:02:19 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Wed Aug 8 16:02:19 2018 +0200
----------------------------------------------------------------------
build.xml | 4 +-
dev-tools/doap/lucene.rdf | 28 +
dev-tools/doap/solr.rdf | 28 +
dev-tools/idea/.idea/ant.xml | 2 -
dev-tools/idea/.idea/modules.xml | 2 -
dev-tools/idea/.idea/workspace.xml | 18 -
.../idea/lucene/analysis/uima/analysis-uima.iml | 30 -
dev-tools/idea/solr/contrib/uima/uima.iml | 36 -
.../maven/lucene/analysis/pom.xml.template | 1 -
.../maven/lucene/analysis/uima/pom.xml.template | 74 -
dev-tools/maven/solr/contrib/pom.xml.template | 1 -
.../maven/solr/contrib/uima/pom.xml.template | 83 -
dev-tools/scripts/SOLR-2452.patch.hack.pl | 15 -
dev-tools/scripts/addVersion.py | 1 -
dev-tools/scripts/jenkins.build.ref.guide.sh | 6 +-
dev-tools/scripts/reproduceJenkinsFailures.py | 12 +-
.../test-patch/lucene-solr-yetus-personality.sh | 2 +-
lucene/CHANGES.txt | 325 +-
lucene/MIGRATE.txt | 56 +
lucene/analysis/README.txt | 6 -
lucene/analysis/build.xml | 7 +-
lucene/analysis/common/build.xml | 1 +
.../lucene/analysis/bg/BulgarianAnalyzer.java | 10 +-
.../lucene/analysis/bn/BengaliAnalyzer.java | 17 +-
.../lucene/analysis/br/BrazilianAnalyzer.java | 8 +-
.../lucene/analysis/ca/CatalanAnalyzer.java | 11 +-
.../lucene/analysis/ckb/SoraniAnalyzer.java | 9 +-
.../commongrams/CommonGramsFilterFactory.java | 8 +-
.../lucene/analysis/core/StopAnalyzer.java | 12 -
.../lucene/analysis/core/StopFilterFactory.java | 7 +-
.../lucene/analysis/custom/CustomAnalyzer.java | 208 +-
.../lucene/analysis/cz/CzechAnalyzer.java | 13 +-
.../lucene/analysis/da/DanishAnalyzer.java | 10 +-
.../lucene/analysis/de/GermanAnalyzer.java | 9 +-
.../lucene/analysis/el/GreekAnalyzer.java | 8 +-
.../lucene/analysis/en/EnglishAnalyzer.java | 42 +-
.../lucene/analysis/es/SpanishAnalyzer.java | 10 +-
.../lucene/analysis/eu/BasqueAnalyzer.java | 10 +-
.../lucene/analysis/fa/PersianAnalyzer.java | 4 +-
.../lucene/analysis/fi/FinnishAnalyzer.java | 10 +-
.../lucene/analysis/fr/FrenchAnalyzer.java | 11 +-
.../lucene/analysis/ga/IrishAnalyzer.java | 9 +-
.../lucene/analysis/gl/GalicianAnalyzer.java | 10 +-
.../lucene/analysis/hi/HindiAnalyzer.java | 4 +-
.../lucene/analysis/hu/HungarianAnalyzer.java | 10 +-
.../lucene/analysis/hunspell/Dictionary.java | 8 +-
.../lucene/analysis/hy/ArmenianAnalyzer.java | 10 +-
.../lucene/analysis/id/IndonesianAnalyzer.java | 10 +-
.../lucene/analysis/it/ItalianAnalyzer.java | 9 +-
.../lucene/analysis/lt/LithuanianAnalyzer.java | 10 +-
.../lucene/analysis/lv/LatvianAnalyzer.java | 10 +-
.../miscellaneous/ConcatenateGraphFilter.java | 375 +
.../ConcatenateGraphFilterFactory.java | 70 +
.../miscellaneous/ConditionalTokenFilter.java | 233 +
.../ConditionalTokenFilterFactory.java | 85 +
.../miscellaneous/FingerprintFilter.java | 4 +-
.../miscellaneous/ProtectedTermFilter.java | 53 +
.../ProtectedTermFilterFactory.java | 163 +
.../miscellaneous/WordDelimiterFilter.java | 20 +-
.../miscellaneous/WordDelimiterGraphFilter.java | 19 +-
.../analysis/ngram/EdgeNGramFilterFactory.java | 10 +-
.../analysis/ngram/EdgeNGramTokenFilter.java | 91 +-
.../analysis/ngram/NGramFilterFactory.java | 10 +-
.../lucene/analysis/ngram/NGramTokenFilter.java | 99 +-
.../lucene/analysis/nl/DutchAnalyzer.java | 12 +-
.../lucene/analysis/no/NorwegianAnalyzer.java | 10 +-
.../lucene/analysis/pt/PortugueseAnalyzer.java | 10 +-
.../lucene/analysis/ro/RomanianAnalyzer.java | 10 +-
.../lucene/analysis/ru/RussianAnalyzer.java | 10 +-
.../analysis/shingle/FixedShingleFilter.java | 1 +
.../analysis/standard/ASCIITLD.jflex-macro | 263 +-
.../analysis/standard/ClassicAnalyzer.java | 4 +-
.../standard/StandardFilterFactory.java | 50 -
.../standard/UAX29URLEmailAnalyzer.java | 10 +-
.../standard/UAX29URLEmailTokenizerImpl.java | 47679 +++++++++--------
.../standard/UAX29URLEmailTokenizerImpl.jflex | 26 +-
.../lucene/analysis/standard/package.html | 6 +-
.../lucene/analysis/sv/SwedishAnalyzer.java | 10 +-
.../lucene/analysis/synonym/SynonymFilter.java | 4 +-
.../analysis/synonym/WordnetSynonymParser.java | 7 +-
.../lucene/analysis/tr/TurkishAnalyzer.java | 10 +-
.../analysis/util/AbstractAnalysisFactory.java | 20 +-
.../lucene/analysis/util/UnicodeProps.java | 6 +-
...ache.lucene.analysis.util.TokenFilterFactory | 3 +-
.../lucene/analysis/core/TestAnalyzers.java | 9 +-
.../analysis/core/TestBugInSomething.java | 2 +-
.../lucene/analysis/core/TestRandomChains.java | 86 +-
.../lucene/analysis/core/TestStopAnalyzer.java | 5 +-
.../analysis/core/TestStopFilterFactory.java | 3 +-
.../analysis/custom/TestCustomAnalyzer.java | 56 +-
.../TestConcatenateGraphFilter.java | 168 +
.../TestConcatenateGraphFilterFactory.java | 83 +
.../TestConditionalTokenFilter.java | 468 +
.../miscellaneous/TestFingerprintFilter.java | 9 +
.../miscellaneous/TestProtectedTermFilter.java | 48 +
.../TestProtectedTermFilterFactory.java | 128 +
.../miscellaneous/TestWordDelimiterFilter.java | 71 +-
.../TestWordDelimiterGraphFilter.java | 80 +-
.../analysis/miscellaneous/protected-1.txt | 17 +
.../analysis/miscellaneous/protected-2.txt | 17 +
.../ngram/EdgeNGramTokenFilterTest.java | 132 +-
.../analysis/ngram/NGramTokenFilterTest.java | 139 +-
.../analysis/ngram/NGramTokenizerTest.java | 3 +-
.../lucene/analysis/ngram/TestNGramFilters.java | 18 +-
.../analysis/sinks/TestTeeSinkTokenFilter.java | 11 +-
.../standard/TestStandardFactories.java | 5 -
.../standard/TestUAX29URLEmailTokenizer.java | 158 +
.../lucene/analysis/th/TestThaiAnalyzer.java | 4 +-
.../TestWikipediaTokenizerFactory.java | 6 +-
.../standard/GenerateJflexTLDMacros.java | 148 +-
lucene/analysis/icu/src/data/uax29/Default.rbbi | 46 +-
.../icu/src/data/utr30/DiacriticFolding.txt | 4 +
.../icu/src/data/utr30/NativeDigitFolding.txt | 20 +
.../icu/segmentation/BreakIteratorWrapper.java | 12 +-
lucene/analysis/icu/src/java/overview.html | 2 +-
.../analysis/icu/segmentation/Default.brk | Bin 50760 -> 43176 bytes
.../icu/segmentation/MyanmarSyllable.brk | Bin 21272 -> 21808 bytes
.../org/apache/lucene/analysis/icu/utr30.nrm | Bin 59056 -> 59232 bytes
.../Latin-dont-break-on-hyphens.rbbi | 187 +-
.../icu/segmentation/TestICUTokenizer.java | 15 +
.../analysis/ja/TestJapaneseAnalyzer.java | 2 +-
.../analysis/ja/TestJapaneseTokenizer.java | 12 +-
.../analysis/morfologik/MorfologikAnalyzer.java | 11 +-
.../uk/UkrainianMorfologikAnalyzer.java | 9 +-
.../morfologik/TestMorfologikAnalyzer.java | 4 +-
...ache.lucene.analysis.util.TokenFilterFactory | 1 +
lucene/analysis/opennlp/build.xml | 16 +-
lucene/analysis/opennlp/ivy.xml | 1 -
.../lucene/analysis/opennlp/en-test-chunker.bin | Bin 89915 -> 89914 bytes
.../analysis/opennlp/en-test-lemmatizer.bin | Bin 7370 -> 7370 bytes
.../analysis/opennlp/en-test-ner-person.bin | Bin 1700 -> 0 bytes
.../lucene/analysis/opennlp/en-test-ner.bin | Bin 0 -> 2049 bytes
.../analysis/opennlp/en-test-pos-maxent.bin | Bin 18424 -> 18494 bytes
.../lucene/analysis/opennlp/en-test-sent.bin | Bin 1050 -> 1051 bytes
.../analysis/opennlp/en-test-tokenizer.bin | Bin 15096 -> 15100 bytes
.../opennlp/src/tools/test-model-data/ner.txt | 143 +
.../src/tools/test-model-data/ner_flashman.txt | 143 -
.../lucene/analysis/cn/smart/CharType.java | 5 +
.../lucene/analysis/cn/smart/Utility.java | 4 +
.../analysis/cn/smart/hhmm/HHMMSegmenter.java | 18 +-
.../cn/smart/TestSmartChineseAnalyzer.java | 53 +-
.../lucene/analysis/pl/PolishAnalyzer.java | 10 +-
.../src/java/org/egothor/stemmer/Trie.java | 16 +-
lucene/analysis/uima/build.xml | 50 -
lucene/analysis/uima/ivy.xml | 30 -
.../lucene/analysis/uima/BaseUIMATokenizer.java | 96 -
.../analysis/uima/UIMAAnnotationsTokenizer.java | 90 -
.../uima/UIMAAnnotationsTokenizerFactory.java | 47 -
.../lucene/analysis/uima/UIMABaseAnalyzer.java | 44 -
.../analysis/uima/UIMATypeAwareAnalyzer.java | 44 -
.../uima/UIMATypeAwareAnnotationsTokenizer.java | 113 -
...IMATypeAwareAnnotationsTokenizerFactory.java | 50 -
.../lucene/analysis/uima/ae/AEProvider.java | 34 -
.../analysis/uima/ae/AEProviderFactory.java | 76 -
.../analysis/uima/ae/BasicAEProvider.java | 87 -
.../uima/ae/OverridingParamsAEProvider.java | 69 -
.../lucene/analysis/uima/ae/package-info.java | 21 -
.../lucene/analysis/uima/package-info.java | 21 -
lucene/analysis/uima/src/java/overview.html | 29 -
...apache.lucene.analysis.util.TokenizerFactory | 17 -
.../src/resources/uima/AggregateSentenceAE.xml | 70 -
.../test-files/uima/TestAggregateSentenceAE.xml | 55 -
.../test-files/uima/TestEntityAnnotatorAE.xml | 66 -
.../src/test-files/uima/TestPoSTaggerAE.xml | 44 -
.../src/test-files/uima/TestWSTokenizerAE.xml | 78 -
.../analysis/uima/UIMABaseAnalyzerTest.java | 137 -
.../uima/UIMATypeAwareAnalyzerTest.java | 70 -
.../analysis/uima/ae/AEProviderFactoryTest.java | 44 -
.../analysis/uima/ae/BasicAEProviderTest.java | 36 -
.../uima/ae/OverridingParamsAEProviderTest.java | 59 -
.../analysis/uima/an/SampleEntityAnnotator.java | 64 -
.../analysis/uima/an/SamplePoSTagger.java | 57 -
.../uima/an/SampleWSTokenizerAnnotator.java | 66 -
.../index/TestBackwardsCompatibility.java | 16 +-
.../org/apache/lucene/index/index.7.3.1-cfs.zip | Bin 0 -> 15652 bytes
.../apache/lucene/index/index.7.3.1-nocfs.zip | Bin 0 -> 15640 bytes
.../org/apache/lucene/index/index.7.4.0-cfs.zip | Bin 0 -> 15484 bytes
.../apache/lucene/index/index.7.4.0-nocfs.zip | Bin 0 -> 15493 bytes
.../org/apache/lucene/index/sorted.7.3.1.zip | Bin 0 -> 80784 bytes
.../org/apache/lucene/index/sorted.7.4.0.zip | Bin 0 -> 158939 bytes
.../lucene/index/unsupported.6.6.4-cfs.zip | Bin 0 -> 15782 bytes
.../lucene/index/unsupported.6.6.4-nocfs.zip | Bin 0 -> 15771 bytes
.../lucene/index/unsupported.6.6.5-cfs.zip | Bin 0 -> 15765 bytes
.../lucene/index/unsupported.6.6.5-nocfs.zip | Bin 0 -> 15763 bytes
.../conf/english-porter-comparison.alg | 6 +-
.../lucene/benchmark/byTask/tasks/ReadTask.java | 18 +-
.../byTask/tasks/SearchWithCollectorTask.java | 2 +-
.../byTask/tasks/SearchWithSortTask.java | 18 -
.../lucene/benchmark/byTask/utils/Config.java | 2 +-
.../benchmark/byTask/feeds/DocMakerTest.java | 2 +-
.../byTask/feeds/LineDocSourceTest.java | 2 +-
lucene/build.xml | 1 -
.../lucene/classification/BM25NBClassifier.java | 4 +-
.../classification/KNearestFuzzyClassifier.java | 2 +-
.../KNearestNeighborClassifier.java | 2 +-
.../classification/utils/DatasetSplitter.java | 4 +-
.../classification/BM25NBClassifierTest.java | 2 +-
.../CachingNaiveBayesClassifierTest.java | 2 +-
.../SimpleNaiveBayesClassifierTest.java | 2 +-
.../codecs/blockterms/BlockTermsReader.java | 7 +-
.../codecs/blockterms/BlockTermsWriter.java | 10 +-
.../blocktreeords/OrdsIntersectTermsEnum.java | 5 +-
.../blocktreeords/OrdsSegmentTermsEnum.java | 5 +-
.../bloom/BloomFilteringPostingsFormat.java | 7 +-
.../codecs/memory/DirectPostingsFormat.java | 9 +-
.../lucene/codecs/memory/FSTOrdTermsReader.java | 7 +-
.../lucene/codecs/memory/FSTTermsReader.java | 5 +-
.../codecs/memory/MemoryDocValuesConsumer.java | 539 -
.../codecs/memory/MemoryDocValuesFormat.java | 72 -
.../codecs/memory/MemoryDocValuesProducer.java | 878 -
.../codecs/memory/MemoryPostingsFormat.java | 1038 -
.../codecs/simpletext/SimpleTextBKDWriter.java | 10 +-
.../simpletext/SimpleTextFieldInfosFormat.java | 11 +-
.../simpletext/SimpleTextFieldsReader.java | 5 +-
.../simpletext/SimpleTextLiveDocsFormat.java | 43 +-
.../simpletext/SimpleTextSegmentInfoFormat.java | 3 +-
.../simpletext/SimpleTextTermVectorsReader.java | 7 +-
.../org.apache.lucene.codecs.DocValuesFormat | 1 -
.../org.apache.lucene.codecs.PostingsFormat | 2 +-
.../memory/TestMemoryDocValuesFormat.java | 39 -
.../codecs/memory/TestMemoryPostingsFormat.java | 35 -
.../TestSimpleTextLiveDocsFormat.java | 29 +
lucene/common-build.xml | 2 -
.../org/apache/lucene/analysis/Analyzer.java | 2 -
.../lucene/analysis/FilteringTokenFilter.java | 2 -
.../lucene/analysis/TokenStreamToAutomaton.java | 8 +-
.../analysis/standard/StandardAnalyzer.java | 38 +-
.../analysis/standard/StandardFilter.java | 39 -
.../lucene/analysis/standard/package-info.java | 1 -
.../codecs/CompetitiveFreqNormAccumulator.java | 163 -
.../codecs/CompetitiveImpactAccumulator.java | 127 +
.../apache/lucene/codecs/LiveDocsFormat.java | 9 +-
.../lucene/codecs/PostingsReaderBase.java | 3 +-
.../codecs/blocktree/IntersectTermsEnum.java | 5 +-
.../codecs/blocktree/SegmentTermsEnum.java | 5 +-
.../CompressingStoredFieldsIndexReader.java | 25 +-
.../CompressingStoredFieldsWriter.java | 5 +-
.../CompressingTermVectorsReader.java | 6 +-
.../CompressingTermVectorsWriter.java | 8 +-
.../lucene50/Lucene50FieldInfosFormat.java | 2 +-
.../codecs/lucene50/Lucene50LiveDocsFormat.java | 42 +-
.../codecs/lucene50/Lucene50PostingsReader.java | 39 +-
.../codecs/lucene50/Lucene50PostingsWriter.java | 4 +-
.../lucene50/Lucene50ScoreSkipReader.java | 141 +-
.../codecs/lucene50/Lucene50SkipReader.java | 3 +-
.../codecs/lucene50/Lucene50SkipWriter.java | 36 +-
.../lucene60/Lucene60FieldInfosFormat.java | 8 +-
.../lucene70/Lucene70DocValuesProducer.java | 3 +-
.../apache/lucene/document/FeatureField.java | 107 +-
.../apache/lucene/document/FeatureQuery.java | 37 +-
.../document/LatLonDocValuesBoxQuery.java | 153 +
.../document/LatLonDocValuesDistanceQuery.java | 140 +
.../lucene/document/LatLonDocValuesField.java | 181 +
.../org/apache/lucene/document/LatLonPoint.java | 255 +
.../document/LatLonPointDistanceComparator.java | 229 +
.../document/LatLonPointDistanceQuery.java | 390 +
.../document/LatLonPointInPolygonQuery.java | 214 +
.../lucene/document/LatLonPointSortField.java | 100 +
.../lucene/document/NumericDocValuesField.java | 12 +-
.../java/org/apache/lucene/geo/GeoUtils.java | 38 +
.../src/java/org/apache/lucene/geo/Polygon.java | 79 +-
.../java/org/apache/lucene/geo/Polygon2D.java | 169 +-
.../index/BinaryDocValuesFieldUpdates.java | 174 +-
.../lucene/index/BinaryDocValuesWriter.java | 5 +
.../apache/lucene/index/BufferedUpdates.java | 62 +-
.../lucene/index/BufferedUpdatesStream.java | 134 +-
.../org/apache/lucene/index/CheckIndex.java | 265 +-
.../lucene/index/DefaultIndexingChain.java | 68 +
.../org/apache/lucene/index/DocConsumer.java | 9 +
.../lucene/index/DocValuesFieldUpdates.java | 328 +-
.../apache/lucene/index/DocValuesUpdate.java | 116 +-
.../apache/lucene/index/DocValuesWriter.java | 3 +
.../apache/lucene/index/DocumentsWriter.java | 270 +-
.../index/DocumentsWriterDeleteQueue.java | 7 +-
.../index/DocumentsWriterFlushControl.java | 4 +-
.../lucene/index/DocumentsWriterFlushQueue.java | 180 +-
.../lucene/index/DocumentsWriterPerThread.java | 74 +-
.../java/org/apache/lucene/index/FieldInfo.java | 18 +-
.../org/apache/lucene/index/FieldInfos.java | 53 +-
.../apache/lucene/index/FilterCodecReader.java | 23 +
.../apache/lucene/index/FilterLeafReader.java | 10 +-
.../apache/lucene/index/FilterMergePolicy.java | 24 +-
.../apache/lucene/index/FilteredTermsEnum.java | 5 +-
.../lucene/index/FlushByRamOrCountsPolicy.java | 5 +-
.../org/apache/lucene/index/FreqProxFields.java | 3 +-
.../lucene/index/FreqProxTermsWriter.java | 4 +-
.../lucene/index/FrozenBufferedUpdates.java | 252 +-
.../java/org/apache/lucene/index/Impact.java | 61 +
.../java/org/apache/lucene/index/Impacts.java | 54 +
.../org/apache/lucene/index/ImpactsEnum.java | 30 +-
.../org/apache/lucene/index/ImpactsSource.java | 54 +
.../apache/lucene/index/IndexFileDeleter.java | 8 +-
.../org/apache/lucene/index/IndexWriter.java | 1158 +-
.../apache/lucene/index/LeafReaderContext.java | 4 +-
.../lucene/index/LogByteSizeMergePolicy.java | 4 +-
.../apache/lucene/index/LogDocMergePolicy.java | 4 +-
.../org/apache/lucene/index/LogMergePolicy.java | 134 +-
.../org/apache/lucene/index/MergePolicy.java | 135 +-
.../org/apache/lucene/index/MergeTrigger.java | 2 +-
.../org/apache/lucene/index/MultiFields.java | 6 +-
.../org/apache/lucene/index/MultiTermsEnum.java | 5 +-
.../org/apache/lucene/index/NoMergePolicy.java | 14 +-
.../index/NumericDocValuesFieldUpdates.java | 155 +-
.../lucene/index/NumericDocValuesWriter.java | 5 +
.../index/OneMergeWrappingMergePolicy.java | 12 +-
.../apache/lucene/index/ParallelLeafReader.java | 7 +-
.../org/apache/lucene/index/PendingDeletes.java | 121 +-
.../apache/lucene/index/PendingSoftDeletes.java | 111 +-
.../org/apache/lucene/index/PointValues.java | 3 +-
.../org/apache/lucene/index/PostingsEnum.java | 9 -
.../org/apache/lucene/index/ReaderPool.java | 412 +
.../apache/lucene/index/ReadersAndUpdates.java | 437 +-
.../apache/lucene/index/SegmentCommitInfo.java | 34 +-
.../org/apache/lucene/index/SegmentInfos.java | 19 +-
.../org/apache/lucene/index/SegmentMerger.java | 1 +
.../org/apache/lucene/index/SegmentReader.java | 70 +-
.../apache/lucene/index/SegmentWriteState.java | 10 +-
.../apache/lucene/index/SlowImpactsEnum.java | 39 +-
.../SoftDeletesDirectoryReaderWrapper.java | 70 +-
.../index/SoftDeletesRetentionMergePolicy.java | 60 +-
.../lucene/index/SortedDocValuesTermsEnum.java | 3 +-
.../lucene/index/SortedDocValuesWriter.java | 5 +
.../index/SortedNumericDocValuesWriter.java | 5 +
.../index/SortedSetDocValuesTermsEnum.java | 3 +-
.../lucene/index/SortedSetDocValuesWriter.java | 6 +-
.../apache/lucene/index/SortingLeafReader.java | 6 +-
.../index/SortingStoredFieldsConsumer.java | 6 +-
.../index/SortingTermVectorsConsumer.java | 6 +-
.../lucene/index/StandardDirectoryReader.java | 20 +-
.../java/org/apache/lucene/index/TermsEnum.java | 7 +-
.../apache/lucene/index/TieredMergePolicy.java | 638 +-
.../lucene/index/UpgradeIndexMergePolicy.java | 23 +-
.../apache/lucene/search/BlendedTermQuery.java | 8 +-
.../search/BlockMaxConjunctionScorer.java | 17 +
.../org/apache/lucene/search/BlockMaxDISI.java | 94 +
.../lucene/search/Boolean2ScorerSupplier.java | 2 +-
.../org/apache/lucene/search/BooleanWeight.java | 2 +-
.../apache/lucene/search/CachingCollector.java | 9 +-
.../search/DisjunctionMatchesIterator.java | 19 +-
.../lucene/search/DisjunctionMaxQuery.java | 2 +-
.../lucene/search/DisjunctionMaxScorer.java | 71 +-
.../apache/lucene/search/DisjunctionScorer.java | 22 +-
.../lucene/search/DisjunctionSumScorer.java | 22 +-
.../apache/lucene/search/DocIdSetIterator.java | 41 +
.../lucene/search/DocValuesRewriteMethod.java | 2 +-
.../lucene/search/ExactPhraseMatcher.java | 152 +
.../apache/lucene/search/ExactPhraseScorer.java | 191 -
.../lucene/search/FieldValueHitQueue.java | 4 +-
.../apache/lucene/search/FuzzyTermsEnum.java | 5 +-
.../java/org/apache/lucene/search/HitQueue.java | 20 +-
.../org/apache/lucene/search/ImpactsDISI.java | 149 +
.../org/apache/lucene/search/IndexSearcher.java | 60 +-
.../org/apache/lucene/search/LeafSimScorer.java | 15 +-
.../java/org/apache/lucene/search/Matches.java | 13 +-
.../apache/lucene/search/MatchesIterator.java | 22 +-
.../org/apache/lucene/search/MaxScoreCache.java | 126 +
.../apache/lucene/search/MultiCollector.java | 14 +
.../apache/lucene/search/MultiPhraseQuery.java | 320 +-
.../MultiTermQueryConstantScoreWrapper.java | 2 +-
.../org/apache/lucene/search/PhraseMatcher.java | 92 +
.../org/apache/lucene/search/PhraseQuery.java | 213 +-
.../org/apache/lucene/search/PhraseScorer.java | 102 +
.../org/apache/lucene/search/PhraseWeight.java | 144 +
.../apache/lucene/search/PointInSetQuery.java | 2 +-
.../apache/lucene/search/PointRangeQuery.java | 5 +-
.../lucene/search/QueryCachingPolicy.java | 13 -
.../org/apache/lucene/search/QueryRescorer.java | 2 +-
.../org/apache/lucene/search/ReqExclScorer.java | 5 +
.../apache/lucene/search/ReqOptSumScorer.java | 9 +
.../java/org/apache/lucene/search/Scorer.java | 4 +-
.../lucene/search/SloppyPhraseMatcher.java | 599 +
.../lucene/search/SloppyPhraseScorer.java | 591 -
.../org/apache/lucene/search/SortRescorer.java | 26 +-
.../org/apache/lucene/search/SynonymQuery.java | 314 +-
.../apache/lucene/search/TermInSetQuery.java | 2 +-
.../lucene/search/TermMatchesIterator.java | 16 +-
.../org/apache/lucene/search/TermQuery.java | 32 +-
.../org/apache/lucene/search/TermScorer.java | 96 +-
.../java/org/apache/lucene/search/TopDocs.java | 48 +-
.../apache/lucene/search/TopDocsCollector.java | 9 +-
.../apache/lucene/search/TopFieldCollector.java | 286 +-
.../org/apache/lucene/search/TopFieldDocs.java | 5 +-
.../lucene/search/TopScoreDocCollector.java | 106 +-
.../org/apache/lucene/search/TotalHits.java | 71 +
.../org/apache/lucene/search/WANDScorer.java | 1 +
.../search/similarities/BM25Similarity.java | 5 +-
.../search/similarities/BooleanSimilarity.java | 5 +-
.../search/similarities/MultiSimilarity.java | 5 +-
.../lucene/search/similarities/Similarity.java | 12 +-
.../search/similarities/SimilarityBase.java | 3 +-
.../search/similarities/TFIDFSimilarity.java | 5 +-
.../lucene/search/spans/SpanPositionQueue.java | 2 +-
.../lucene/search/spans/SpanTermQuery.java | 7 +
.../apache/lucene/search/spans/SpanWeight.java | 146 +-
.../java/org/apache/lucene/store/Directory.java | 201 +-
.../org/apache/lucene/store/FSDirectory.java | 32 +-
.../lucene/store/FileSwitchDirectory.java | 15 +
.../apache/lucene/store/FilterDirectory.java | 5 +
.../org/apache/lucene/store/IndexOutput.java | 13 +-
.../java/org/apache/lucene/util/ArrayUtil.java | 200 +-
.../src/java/org/apache/lucene/util/BitSet.java | 5 +-
.../java/org/apache/lucene/util/BitUtil.java | 2 +-
.../java/org/apache/lucene/util/BytesRef.java | 9 +-
.../org/apache/lucene/util/BytesRefBuilder.java | 4 +-
.../org/apache/lucene/util/BytesRefHash.java | 4 +-
.../java/org/apache/lucene/util/CharsRef.java | 3 +-
.../org/apache/lucene/util/CharsRefBuilder.java | 4 +-
.../org/apache/lucene/util/DocIdSetBuilder.java | 5 +-
.../org/apache/lucene/util/FixedBitSet.java | 39 +-
.../java/org/apache/lucene/util/FixedBits.java | 47 +
.../java/org/apache/lucene/util/IntsRef.java | 4 +-
.../java/org/apache/lucene/util/LongsRef.java | 4 +-
.../org/apache/lucene/util/MutableBits.java | 31 -
.../java/org/apache/lucene/util/PagedBytes.java | 7 +-
.../org/apache/lucene/util/PriorityQueue.java | 117 +-
.../org/apache/lucene/util/QueryBuilder.java | 4 +-
.../org/apache/lucene/util/RoaringDocIdSet.java | 3 +-
.../apache/lucene/util/SparseFixedBitSet.java | 3 +-
.../org/apache/lucene/util/StringHelper.java | 2 +-
.../java/org/apache/lucene/util/Version.java | 14 +
.../automaton/DaciukMihovAutomatonBuilder.java | 16 +-
.../org/apache/lucene/util/bkd/BKDWriter.java | 10 +-
.../apache/lucene/util/bkd/HeapPointWriter.java | 7 +-
.../lucene/util/fst/PositiveIntOutputs.java | 3 +-
.../util/packed/DeltaPackedLongValues.java | 9 +-
.../lucene/util/packed/MonotonicLongValues.java | 11 +-
.../lucene/util/packed/PackedLongValues.java | 6 +-
.../src/test/org/apache/lucene/TestDemo.java | 6 +-
.../org/apache/lucene/TestExternalCodecs.java | 19 +-
.../lucene/analysis/TestCharArraySet.java | 4 +-
.../lucene/analysis/TestCharacterUtils.java | 4 +-
.../TestCompetitiveFreqNormAccumulator.java | 44 +-
.../AbstractTestCompressionMode.java | 11 +-
.../lucene50/TestBlockPostingsFormat.java | 57 +-
.../lucene/codecs/lucene50/TestForUtil.java | 14 +-
.../lucene50/TestLucene50LiveDocsFormat.java | 30 +
.../perfield/TestPerFieldDocValuesFormat.java | 6 +-
.../perfield/TestPerFieldPostingsFormat2.java | 26 +-
.../lucene/document/TestFeatureField.java | 47 +-
.../org/apache/lucene/document/TestField.java | 2 +-
.../document/TestLatLonDocValuesField.java | 30 +
.../apache/lucene/document/TestLatLonPoint.java | 37 +
.../document/TestLatLonPointDistanceSort.java | 264 +
.../org/apache/lucene/geo/TestPolygon2D.java | 43 +
.../lucene/index/Test2BBinaryDocValues.java | 2 +-
.../org/apache/lucene/index/Test2BDocs.java | 2 +-
.../lucene/index/Test2BNumericDocValues.java | 2 +-
.../org/apache/lucene/index/Test2BPoints.java | 2 +-
.../apache/lucene/index/Test2BPositions.java | 2 +-
.../org/apache/lucene/index/Test2BPostings.java | 2 +-
.../lucene/index/Test2BPostingsBytes.java | 2 +-
.../index/Test2BSortedDocValuesFixedSorted.java | 2 +-
.../lucene/index/Test2BSortedDocValuesOrds.java | 2 +-
.../org/apache/lucene/index/Test2BTerms.java | 4 +-
.../org/apache/lucene/index/TestAddIndexes.java | 53 +-
.../apache/lucene/index/TestBagOfPositions.java | 2 +-
.../apache/lucene/index/TestBagOfPostings.java | 2 +-
.../index/TestBinaryDocValuesUpdates.java | 5 +-
.../apache/lucene/index/TestBinaryTerms.java | 2 +-
.../org/apache/lucene/index/TestCodecs.java | 7 +-
.../index/TestCrashCausesCorruptIndex.java | 2 +-
.../index/TestDemoParallelLeafReader.java | 16 +-
.../lucene/index/TestDirectoryReaderReopen.java | 8 +-
.../test/org/apache/lucene/index/TestDoc.java | 4 +-
.../org/apache/lucene/index/TestDocValues.java | 17 +
.../lucene/index/TestDocValuesFieldUpdates.java | 72 +
.../lucene/index/TestDuelingCodecsAtNight.java | 2 +-
.../apache/lucene/index/TestFieldsReader.java | 2 +-
.../lucene/index/TestFilterLeafReader.java | 22 +
.../lucene/index/TestFilterMergePolicy.java | 4 +-
.../lucene/index/TestForTooMuchCloning.java | 2 +-
.../lucene/index/TestForceMergeForever.java | 2 +-
.../apache/lucene/index/TestIndexSorting.java | 67 +-
.../apache/lucene/index/TestIndexWriter.java | 476 +-
.../lucene/index/TestIndexWriterCommit.java | 1 -
.../lucene/index/TestIndexWriterDelete.java | 28 +-
.../lucene/index/TestIndexWriterExceptions.java | 73 +-
.../lucene/index/TestIndexWriterMaxDocs.java | 6 +-
.../lucene/index/TestIndexWriterOnDiskFull.java | 1 -
.../TestIndexWriterOutOfFileDescriptors.java | 2 -
.../lucene/index/TestIndexWriterReader.java | 15 +-
.../index/TestIndexWriterThreadsToSegments.java | 2 +-
.../index/TestIndexWriterWithThreads.java | 62 +
.../apache/lucene/index/TestIndexableField.java | 6 +-
.../index/TestIndexingSequenceNumbers.java | 12 +-
.../org/apache/lucene/index/TestInfoStream.java | 8 +-
.../lucene/index/TestLazyProxSkipping.java | 1 -
.../apache/lucene/index/TestLogMergePolicy.java | 17 +
.../apache/lucene/index/TestLongPostings.java | 2 +-
.../org/apache/lucene/index/TestManyFields.java | 2 +-
.../lucene/index/TestMaxTermFrequency.java | 2 +-
.../lucene/index/TestMixedDocValuesUpdates.java | 304 +-
.../org/apache/lucene/index/TestNRTThreads.java | 2 +-
.../apache/lucene/index/TestNoMergePolicy.java | 25 +
.../test/org/apache/lucene/index/TestNorms.java | 5 +-
.../index/TestNumericDocValuesUpdates.java | 3 +-
.../index/TestOneMergeWrappingMergePolicy.java | 8 +-
.../apache/lucene/index/TestPendingDeletes.java | 16 +-
.../lucene/index/TestPendingSoftDeletes.java | 215 +-
.../lucene/index/TestPerSegmentDeletes.java | 17 +-
.../apache/lucene/index/TestReadOnlyIndex.java | 6 +-
.../org/apache/lucene/index/TestReaderPool.java | 313 +
.../apache/lucene/index/TestRollingUpdates.java | 8 +-
.../apache/lucene/index/TestSegmentInfos.java | 6 +-
.../apache/lucene/index/TestSegmentMerger.java | 4 +-
.../TestSoftDeletesDirectoryReaderWrapper.java | 5 +-
.../TestSoftDeletesRetentionMergePolicy.java | 266 +-
.../apache/lucene/index/TestStressDeletes.java | 4 +-
.../org/apache/lucene/index/TestStressNRT.java | 10 +-
.../org/apache/lucene/index/TestTermsEnum.java | 2 +-
.../lucene/index/TestTieredMergePolicy.java | 396 +-
.../org/apache/lucene/index/TestTryDelete.java | 16 +-
.../index/TestUpgradeIndexMergePolicy.java | 21 +-
.../lucene/search/MultiCollectorTest.java | 3 +
.../lucene/search/TermInSetQueryTest.java | 2 +-
.../lucene/search/TestAutomatonQuery.java | 2 +-
.../search/TestAutomatonQueryUnicode.java | 2 +-
.../lucene/search/TestBlendedTermQuery.java | 2 +-
.../org/apache/lucene/search/TestBoolean2.java | 27 +-
.../search/TestBooleanMinShouldMatch.java | 8 +-
.../org/apache/lucene/search/TestBooleanOr.java | 2 +-
.../apache/lucene/search/TestBooleanQuery.java | 16 +-
.../search/TestBooleanQueryVisitSubscorers.java | 4 +-
.../lucene/search/TestBooleanRewrites.java | 2 +-
.../apache/lucene/search/TestBooleanScorer.java | 4 +-
.../apache/lucene/search/TestConjunctions.java | 4 +-
.../lucene/search/TestConstantScoreQuery.java | 4 +-
.../TestControlledRealTimeReopenThread.java | 14 +-
.../lucene/search/TestDisjunctionMaxQuery.java | 79 +-
.../lucene/search/TestDocIdSetIterator.java | 55 +
.../lucene/search/TestDocValuesQueries.java | 2 +-
.../lucene/search/TestDoubleValuesSource.java | 9 +-
.../lucene/search/TestElevationComparator.java | 2 +-
.../lucene/search/TestFieldValueQuery.java | 8 +-
.../apache/lucene/search/TestFuzzyQuery.java | 2 +-
.../apache/lucene/search/TestIndexSearcher.java | 38 +-
.../apache/lucene/search/TestLRUQueryCache.java | 71 +-
.../search/TestLatLonDocValuesQueries.java | 62 +
.../lucene/search/TestLatLonPointQueries.java | 91 +
.../lucene/search/TestLiveFieldValues.java | 4 +-
.../lucene/search/TestLongValuesSource.java | 9 +-
.../lucene/search/TestMatchesIterator.java | 319 +-
.../lucene/search/TestMinShouldMatch2.java | 2 +-
.../lucene/search/TestMultiCollector.java | 74 +-
.../lucene/search/TestMultiPhraseQuery.java | 16 +-
.../apache/lucene/search/TestNeedsScores.java | 10 +-
.../search/TestNormsFieldExistsQuery.java | 8 +-
.../apache/lucene/search/TestPhraseQuery.java | 13 +-
.../search/TestPositiveScoresOnlyCollector.java | 4 +-
.../lucene/search/TestPrefixInBooleanQuery.java | 8 +-
.../apache/lucene/search/TestPrefixQuery.java | 4 +-
.../apache/lucene/search/TestQueryRescorer.java | 24 +-
.../apache/lucene/search/TestRegexpQuery.java | 4 +-
.../apache/lucene/search/TestRegexpRandom.java | 2 +-
.../lucene/search/TestReqOptSumScorer.java | 8 +-
.../search/TestSameScoresWithThreads.java | 2 +-
.../apache/lucene/search/TestSearchAfter.java | 15 +-
.../lucene/search/TestSearchWithThreads.java | 2 +-
.../lucene/search/TestSearcherManager.java | 5 +-
.../lucene/search/TestShardSearching.java | 12 +-
.../lucene/search/TestSimilarityProvider.java | 8 +-
.../TestSimpleExplanationsWithFillerDocs.java | 5 +-
.../lucene/search/TestSloppyPhraseQuery.java | 19 +-
.../test/org/apache/lucene/search/TestSort.java | 50 +-
.../apache/lucene/search/TestSortRandom.java | 2 +-
.../apache/lucene/search/TestSortRescorer.java | 8 +-
.../search/TestSortedNumericSortField.java | 22 +-
.../lucene/search/TestSortedSetSelector.java | 32 +-
.../lucene/search/TestSortedSetSortField.java | 18 +-
.../lucene/search/TestSubScorerFreqs.java | 8 +-
.../apache/lucene/search/TestSynonymQuery.java | 238 +-
.../org/apache/lucene/search/TestTermQuery.java | 30 +
.../lucene/search/TestTermRangeQuery.java | 12 +-
.../apache/lucene/search/TestTermScorer.java | 29 +-
.../lucene/search/TestTopDocsCollector.java | 124 +-
.../apache/lucene/search/TestTopDocsMerge.java | 47 +-
.../lucene/search/TestTopFieldCollector.java | 288 +-
.../TestTopFieldCollectorEarlyTermination.java | 15 +-
.../lucene/search/TestWildcardRandom.java | 2 +-
.../similarities/TestBooleanSimilarity.java | 10 +-
.../similarities/TestClassicSimilarity.java | 18 +-
.../search/similarities/TestSimilarity2.java | 14 +-
.../search/similarities/TestSimilarityBase.java | 2 +-
.../lucene/search/spans/TestSpanFirstQuery.java | 4 +-
.../spans/TestSpanMultiTermQueryWrapper.java | 56 +-
.../apache/lucene/search/spans/TestSpans.java | 4 +-
.../lucene/store/TestFilterDirectory.java | 2 +-
.../lucene/store/TestSimpleFSDirectory.java | 53 +
.../apache/lucene/util/BaseSortTestCase.java | 4 +-
.../lucene/util/StressRamUsageEstimator.java | 5 +-
.../org/apache/lucene/util/TestArrayUtil.java | 87 +
.../org/apache/lucene/util/TestBytesRef.java | 8 +
.../org/apache/lucene/util/TestCharsRef.java | 8 +
.../org/apache/lucene/util/TestFixedBitSet.java | 51 +
.../org/apache/lucene/util/TestIntsRef.java | 8 +
.../apache/lucene/util/TestLSBRadixSorter.java | 4 +-
.../org/apache/lucene/util/TestLongsRef.java | 47 +
.../apache/lucene/util/TestMSBRadixSorter.java | 4 +-
.../apache/lucene/util/TestPriorityQueue.java | 171 +-
.../org/apache/lucene/util/TestSetOnce.java | 10 +-
.../lucene/util/TestStringMSBRadixSorter.java | 4 +-
.../TestDaciukMihovAutomatonBuilder.java | 39 +
.../org/apache/lucene/util/bkd/TestBKD.java | 7 +-
.../org/apache/lucene/util/fst/TestFSTs.java | 6 +-
.../lucene/util/packed/TestPackedInts.java | 5 +-
lucene/demo/build.xml | 20 -
lucene/demo/ivy.xml | 7 -
.../org/apache/lucene/demo/SearchFiles.java | 2 +-
.../demo/xmlparser/FormBasedXmlQueryDemo.java | 162 -
.../lucene/demo/xmlparser/package-info.java | 21 -
.../lucene/demo/xmlparser/META-INF/MANIFEST.MF | 3 -
.../lucene/demo/xmlparser/WEB-INF/data.tsv | 5 -
.../lucene/demo/xmlparser/WEB-INF/query.xsl | 74 -
.../lucene/demo/xmlparser/WEB-INF/web.xml | 49 -
.../org/apache/lucene/demo/xmlparser/index.jsp | 145 -
.../apache/lucene/demo/xmlparser/stylesheet.css | 23 -
.../demo/facet/TestDistanceFacetsExample.java | 2 +-
.../demo/facet/TestRangeFacetsExample.java | 2 +-
.../lucene/expressions/TestDemoExpressions.java | 10 +-
.../expressions/TestExpressionRescorer.java | 4 +-
.../lucene/expressions/TestExpressionSorts.java | 9 +-
.../org/apache/lucene/facet/DrillSideways.java | 22 +-
.../apache/lucene/facet/FacetsCollector.java | 32 +-
.../org/apache/lucene/facet/FacetsConfig.java | 37 +-
.../lucene/facet/TopOrdAndFloatQueue.java | 2 +-
.../apache/lucene/facet/TopOrdAndIntQueue.java | 2 +-
.../apache/lucene/facet/range/DoubleRange.java | 16 +
.../apache/lucene/facet/range/LongRange.java | 16 +
.../facet/taxonomy/SearcherTaxonomyManager.java | 12 +-
.../directory/DirectoryTaxonomyWriter.java | 5 +
.../writercache/LruTaxonomyWriterCache.java | 3 +-
.../writercache/NameHashIntCacheLRU.java | 4 +-
.../writercache/UTF8TaxonomyWriterCache.java | 30 +-
.../apache/lucene/facet/TestDrillDownQuery.java | 54 +-
.../apache/lucene/facet/TestDrillSideways.java | 37 +-
.../org/apache/lucene/facet/TestFacetQuery.java | 4 +-
.../facet/range/TestRangeFacetCounts.java | 40 +-
.../sortedset/TestSortedSetDocValuesFacets.java | 2 +-
.../taxonomy/TestSearcherTaxonomyManager.java | 26 +
.../TestTaxonomyFacetSumValueSource.java | 2 +-
.../directory/TestDirectoryTaxonomyWriter.java | 58 +-
.../TestUTF8TaxonomyWriterCache.java | 12 +-
.../search/grouping/BlockGroupingCollector.java | 27 +-
.../grouping/FirstPassGroupingCollector.java | 11 +-
.../lucene/search/grouping/GroupDocs.java | 5 +-
.../lucene/search/grouping/GroupingSearch.java | 33 +-
.../lucene/search/grouping/TopGroups.java | 13 +-
.../search/grouping/TopGroupsCollector.java | 103 +-
.../grouping/DistinctValuesCollectorTest.java | 4 +-
.../lucene/search/grouping/TestGrouping.java | 108 +-
.../search/highlight/TermVectorLeafReader.java | 2 +-
.../highlight/TokenStreamFromTermVector.java | 8 -
.../search/uhighlight/FieldOffsetStrategy.java | 2 +-
.../lucene/search/uhighlight/PhraseHelper.java | 4 +-
.../search/highlight/HighlighterPhraseTest.java | 12 +-
.../search/highlight/HighlighterTest.java | 68 +-
.../search/highlight/TokenSourcesTest.java | 8 +-
.../uhighlight/TestUnifiedHighlighter.java | 56 +-
.../uhighlight/TestUnifiedHighlighterMTQ.java | 60 +-
.../TestUnifiedHighlighterRanking.java | 4 +-
.../TestUnifiedHighlighterStrictPhrases.java | 37 +-
.../TestUnifiedHighlighterTermVec.java | 2 +-
.../FastVectorHighlighterTest.java | 2 +-
lucene/ivy-ignore-conflicts.properties | 1 -
lucene/ivy-versions.properties | 49 +-
.../search/join/ToChildBlockJoinQuery.java | 2 +-
.../search/join/ToParentBlockJoinQuery.java | 8 +-
.../lucene/search/join/TestBlockJoin.java | 62 +-
.../search/join/TestBlockJoinSorting.java | 8 +-
.../apache/lucene/search/join/TestJoinUtil.java | 37 +-
.../join/TestParentChildrenBlockJoinQuery.java | 3 +-
lucene/licenses/Tagger-2.3.1.jar.sha1 | 1 -
lucene/licenses/Tagger-LICENSE-ASL.txt | 202 -
lucene/licenses/Tagger-NOTICE.txt | 7 -
.../licenses/WhitespaceTokenizer-2.3.1.jar.sha1 | 1 -
.../WhitespaceTokenizer-LICENSE-ASL.txt | 202 -
lucene/licenses/WhitespaceTokenizer-NOTICE.txt | 7 -
lucene/licenses/commons-compress-1.14.jar.sha1 | 1 -
.../licenses/commons-compress-1.16.1.jar.sha1 | 1 +
lucene/licenses/hppc-0.7.3.jar.sha1 | 1 -
lucene/licenses/hppc-0.8.1.jar.sha1 | 1 +
lucene/licenses/icu4j-61.1.jar.sha1 | 1 -
lucene/licenses/icu4j-62.1.jar.sha1 | 1 +
...jetty-continuation-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-continuation-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-http-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-http-9.4.8.v20171121.jar.sha1 | 1 -
.../licenses/jetty-io-9.4.11.v20180605.jar.sha1 | 1 +
.../licenses/jetty-io-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-server-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-server-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-servlet-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-servlet-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-util-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-util-9.4.8.v20171121.jar.sha1 | 1 -
lucene/licenses/morfologik-fsa-2.1.1.jar.sha1 | 1 -
lucene/licenses/morfologik-fsa-2.1.5.jar.sha1 | 1 +
.../licenses/morfologik-polish-2.1.1.jar.sha1 | 1 -
.../licenses/morfologik-polish-2.1.5.jar.sha1 | 1 +
.../licenses/morfologik-stemming-2.1.1.jar.sha1 | 1 -
.../licenses/morfologik-stemming-2.1.5.jar.sha1 | 1 +
lucene/licenses/opennlp-maxent-3.0.3.jar.sha1 | 1 -
lucene/licenses/opennlp-maxent-LICENSE-ASL.txt | 202 -
lucene/licenses/opennlp-maxent-NOTICE.txt | 6 -
lucene/licenses/opennlp-tools-1.8.3.jar.sha1 | 1 -
lucene/licenses/opennlp-tools-1.9.0.jar.sha1 | 1 +
.../randomizedtesting-runner-2.5.3.jar.sha1 | 1 -
.../randomizedtesting-runner-2.6.0.jar.sha1 | 1 +
lucene/licenses/servlet-api-2.4.jar.sha1 | 1 -
lucene/licenses/servlet-api-LICENSE-CDDL.txt | 126 -
lucene/licenses/servlet-api-NOTICE.txt | 2 -
lucene/licenses/uimaj-core-2.3.1.jar.sha1 | 1 -
lucene/licenses/uimaj-core-LICENSE-ASL.txt | 202 -
lucene/licenses/uimaj-core-NOTICE.txt | 13 -
.../apache/lucene/index/memory/MemoryIndex.java | 9 +-
.../memory/TestMemoryIndexAgainstRAMDir.java | 4 +-
.../org/apache/lucene/index/IndexSplitter.java | 2 +-
.../search/DiversifiedTopDocsCollector.java | 16 +-
.../util/fst/UpToTwoPositiveIntOutputs.java | 2 +
.../search/TestInetAddressRangeQueries.java | 2 +
.../store/TestHardLinkCopyDirectoryWrapper.java | 36 +
lucene/module-build.xml | 22 -
.../queries/function/FunctionScoreQuery.java | 22 +
.../function/valuesource/NormValueSource.java | 2 +-
.../apache/lucene/queries/mlt/MoreLikeThis.java | 8 +-
.../lucene/queries/CommonTermsQueryTest.java | 28 +-
.../queries/function/TestFieldScoreQuery.java | 2 +-
.../function/TestFunctionMatchQuery.java | 2 +-
.../function/TestFunctionQueryExplanations.java | 2 +-
.../function/TestFunctionScoreQuery.java | 18 +-
.../function/TestIndexReaderFunctions.java | 2 +-
.../queries/function/TestValueSources.java | 2 +-
.../queries/payloads/TestPayloadTermQuery.java | 10 +-
.../complexPhrase/ComplexPhraseQueryParser.java | 7 +
.../queryparser/xml/QueryTemplateManager.java | 202 -
.../queryparser/classic/TestQueryParser.java | 2 +-
.../complexPhrase/TestComplexPhraseQuery.java | 2 +
.../flexible/standard/TestQPHelper.java | 2 +-
.../queryparser/util/QueryParserTestBase.java | 2 +-
.../lucene/queryparser/xml/TestCoreParser.java | 6 +-
.../xml/TestQueryTemplateManager.java | 163 -
.../queryparser/xml/albumBooleanQuery.xsl | 48 -
.../queryparser/xml/albumFilteredQuery.xsl | 47 -
.../queryparser/xml/albumLuceneClassicQuery.xsl | 29 -
.../lucene/replicator/nrt/ReplicaNode.java | 5 +-
.../nrt/SegmentInfosSearcherManager.java | 2 +-
.../IndexAndTaxonomyReplicationClientTest.java | 2 +-
.../lucene/replicator/nrt/SimpleServer.java | 2 +-
.../replicator/nrt/TestNRTReplication.java | 2 +-
.../nrt/TestStressNRTReplication.java | 2 +-
.../idversion/IDVersionPostingsReader.java | 5 +-
.../idversion/IDVersionSegmentTermsEnum.java | 5 +-
.../document/FloatPointNearestNeighbor.java | 3 +-
.../document/LatLonDocValuesBoxQuery.java | 153 -
.../document/LatLonDocValuesDistanceQuery.java | 140 -
.../lucene/document/LatLonDocValuesField.java | 181 -
.../org/apache/lucene/document/LatLonPoint.java | 335 -
.../document/LatLonPointDistanceComparator.java | 229 -
.../document/LatLonPointDistanceQuery.java | 390 -
.../document/LatLonPointInPolygonQuery.java | 214 -
.../lucene/document/LatLonPointSortField.java | 100 -
.../org/apache/lucene/document/LatLonShape.java | 170 +
.../document/LatLonShapeBoundingBoxQuery.java | 422 +
.../document/LatLonShapePolygonQuery.java | 341 +
.../apache/lucene/document/NearestNeighbor.java | 328 -
.../src/java/org/apache/lucene/geo/Line.java | 139 +
.../java/org/apache/lucene/geo/Tessellator.java | 916 +
.../src/java/org/apache/lucene/geo/package.html | 31 +
.../search/LatLonPointPrototypeQueries.java | 111 +
.../apache/lucene/search/NearestNeighbor.java | 329 +
.../lucene/search/TermAutomatonQuery.java | 2 +-
.../lucene/search/TermAutomatonScorer.java | 6 +-
.../search/intervals/IntervalFunction.java | 62 +-
.../lucene/search/intervals/IntervalQuery.java | 6 +-
.../lucene/search/intervals/Intervals.java | 23 +-
.../document/BaseLatLonShapeTestCase.java | 473 +
.../document/TestFloatPointNearestNeighbor.java | 3 +-
.../lucene/document/TestHalfFloatPoint.java | 2 +-
.../document/TestLatLonDocValuesField.java | 30 -
.../document/TestLatLonLineShapeQueries.java | 94 +
.../apache/lucene/document/TestLatLonPoint.java | 37 -
.../document/TestLatLonPointDistanceSort.java | 264 -
.../document/TestLatLonPointShapeQueries.java | 70 +
.../document/TestLatLonPolygonShapeQueries.java | 82 +
.../apache/lucene/document/TestLatLonShape.java | 202 +
.../org/apache/lucene/document/TestNearest.java | 253 -
.../org/apache/lucene/geo/TestTessellator.java | 45 +
.../search/TestDocValuesNumbersQuery.java | 2 +-
.../lucene/search/TestDocValuesTermsQuery.java | 2 +-
.../search/TestLatLonDocValuesQueries.java | 62 -
.../lucene/search/TestLatLonPointQueries.java | 91 -
.../org/apache/lucene/search/TestNearest.java | 253 +
.../lucene/search/TestTermAutomatonQuery.java | 28 +-
.../search/intervals/TestIntervalQuery.java | 12 +
.../lucene/search/intervals/TestIntervals.java | 71 +-
.../spatial/prefix/tree/QuadPrefixTree.java | 4 +-
.../spatial/spatial4j/Geo3dShapeFactory.java | 10 +-
.../lucene/spatial/DistanceStrategyTest.java | 4 +-
.../apache/lucene/spatial/SpatialExample.java | 4 +-
.../apache/lucene/spatial/SpatialTestCase.java | 2 +-
.../lucene/spatial/prefix/JtsPolygonTest.java | 2 +-
.../prefix/tree/SpatialPrefixTreeTest.java | 2 +-
.../lucene/spatial/spatial4j/Geo3dRptTest.java | 23 +-
.../spatial3d/geom/GeoComplexPolygon.java | 941 +-
.../spatial3d/geom/GeoDegeneratePath.java | 2 +-
.../spatial3d/geom/GeoPolygonFactory.java | 20 +-
.../lucene/spatial3d/geom/GeoStandardPath.java | 2 +-
.../org/apache/lucene/spatial3d/geom/Plane.java | 15 +-
.../apache/lucene/spatial3d/geom/XYZBounds.java | 12 +-
.../apache/lucene/spatial3d/TestGeo3DPoint.java | 2 +-
.../lucene/spatial3d/geom/GeoPolygonTest.java | 298 +-
.../apache/lucene/spatial3d/geom/PlaneTest.java | 2 +-
.../spatial3d/geom/RandomGeoPolygonTest.java | 252 +-
.../analyzing/AnalyzingInfixSuggester.java | 4 +-
.../analyzing/SuggestStopFilterFactory.java | 8 +-
.../suggest/document/CompletionAnalyzer.java | 21 +-
.../suggest/document/CompletionQuery.java | 2 +-
.../suggest/document/CompletionTokenStream.java | 297 +-
.../search/suggest/document/ContextQuery.java | 15 +-
.../suggest/document/ContextSuggestField.java | 1 +
.../suggest/document/FuzzyCompletionQuery.java | 7 +-
.../suggest/document/NRTSuggesterBuilder.java | 3 +-
.../suggest/document/PrefixCompletionQuery.java | 5 +-
.../suggest/document/RegexCompletionQuery.java | 9 +-
.../search/suggest/document/SuggestField.java | 3 +-
.../search/suggest/document/TopSuggestDocs.java | 9 +-
.../document/TopSuggestDocsCollector.java | 3 +-
.../jaspell/JaspellTernarySearchTrie.java | 6 +-
.../analyzing/AnalyzingSuggesterTest.java | 31 +-
.../analyzing/TestSuggestStopFilterFactory.java | 4 +-
.../document/CompletionTokenStreamTest.java | 177 -
.../suggest/document/TestContextQuery.java | 3 +-
.../document/TestContextSuggestField.java | 13 +-
.../document/TestPrefixCompletionQuery.java | 183 +-
.../document/TestRegexCompletionQuery.java | 47 +
.../suggest/document/TestSuggestField.java | 41 +-
.../analysis/BaseTokenStreamTestCase.java | 8 +-
.../lucene/analysis/ValidatingTokenFilter.java | 17 +-
.../asserting/AssertingLiveDocsFormat.java | 61 +-
.../codecs/cranky/CrankyLiveDocsFormat.java | 13 +-
.../codecs/ramonly/RAMOnlyPostingsFormat.java | 5 +-
.../apache/lucene/geo/BaseGeoPointTestCase.java | 23 +-
.../java/org/apache/lucene/geo/GeoTestUtil.java | 39 +-
.../lucene/index/AlcoholicMergePolicy.java | 2 +-
.../lucene/index/AssertingLeafReader.java | 55 +-
.../index/BaseDocValuesFormatTestCase.java | 38 +-
.../index/BaseFieldInfoFormatTestCase.java | 14 +-
.../index/BaseIndexFileFormatTestCase.java | 2 +-
.../index/BaseLiveDocsFormatTestCase.java | 139 +
.../lucene/index/BaseMergePolicyTestCase.java | 359 +-
.../index/BaseStoredFieldsFormatTestCase.java | 10 +-
.../apache/lucene/index/ForceMergePolicy.java | 6 +-
.../lucene/index/MismatchedLeafReader.java | 3 +-
.../lucene/index/MockRandomMergePolicy.java | 18 +-
.../org/apache/lucene/index/RandomCodec.java | 7 +-
.../apache/lucene/index/RandomIndexWriter.java | 12 +-
.../lucene/index/RandomPostingsTester.java | 245 +-
.../ThreadedIndexingAndSearchingTestCase.java | 26 +-
.../org/apache/lucene/mockfile/ExtrasFS.java | 18 +-
.../org/apache/lucene/mockfile/WindowsFS.java | 66 +-
.../lucene/search/AssertingMatchesIterator.java | 12 +-
.../apache/lucene/search/AssertingScorer.java | 7 +-
.../lucene/search/BlockScoreQueryWrapper.java | 10 +-
.../org/apache/lucene/search/CheckHits.java | 6 +-
.../search/SearchEquivalenceTestBase.java | 4 +-
.../similarities/AssertingSimilarity.java | 2 +-
.../lucene/store/BaseDirectoryTestCase.java | 1654 +-
.../lucene/store/BaseLockFactoryTestCase.java | 13 +-
.../lucene/store/MockDirectoryWrapper.java | 53 +-
.../org/apache/lucene/util/LuceneTestCase.java | 98 +-
.../java/org/apache/lucene/util/TestUtil.java | 20 +-
.../util/automaton/AutomatonTestUtil.java | 4 +-
.../lucene/analysis/TestMockAnalyzer.java | 8 +-
.../lucene/index/TestAssertingLeafReader.java | 2 +-
.../apache/lucene/mockfile/TestWindowsFS.java | 25 +-
.../lucene/store/TestMockDirectoryWrapper.java | 9 +-
lucene/tools/forbiddenApis/base.txt | 18 +
lucene/tools/forbiddenApis/lucene.txt | 24 +
lucene/tools/junit4/cached-timehints.txt | 1164 -
lucene/tools/junit4/tests.policy | 3 +-
.../src/groovy/check-source-patterns.groovy | 7 +
.../dependencies/InterpolatedProperties.java | 133 +-
.../lucene/validation/LibVersionsCheckTask.java | 4 +-
solr/CHANGES.txt | 555 +-
solr/NOTICE.txt | 26 +
solr/bin-test/test_auth.sh | 40 +
solr/bin-test/utils/assert.sh | 30 +-
solr/bin/solr | 73 +-
solr/bin/solr.cmd | 116 +-
solr/bin/solr.in.cmd | 12 +-
solr/bin/solr.in.sh | 16 +-
solr/common-build.xml | 3 +-
solr/contrib/analysis-extras/ivy.xml | 1 -
...ractNamedEntitiesUpdateProcessorFactory.java | 20 +-
.../collection1/conf/en-test-ner-person.bin | Bin 1700 -> 0 bytes
.../solr/collection1/conf/en-test-ner.bin | Bin 0 -> 2049 bytes
.../solr/collection1/conf/en-test-sent.bin | Bin 1050 -> 1051 bytes
.../solr/collection1/conf/en-test-tokenizer.bin | Bin 15096 -> 15100 bytes
.../conf/solrconfig-opennlp-extract.xml | 30 +-
...ractNamedEntitiesUpdateProcessorFactory.java | 9 +-
.../analytics/function/field/DoubleField.java | 3 +-
.../analytics/function/field/FloatField.java | 3 +-
.../analytics/util/FacetRangeGenerator.java | 8 +-
.../field/AbstractAnalyticsFieldTest.java | 75 +-
.../mapping/FillMissingFunctionTest.java | 18 +-
.../function/mapping/FilterFunctionTest.java | 10 +-
.../function/mapping/IfFunctionTest.java | 26 +-
.../function/mapping/RemoveFunctionTest.java | 22 +-
.../function/mapping/ReplaceFunctionTest.java | 22 +-
.../analytics/legacy/LegacyNoFacetTest.java | 8 +-
.../legacy/facet/LegacyFieldFacetTest.java | 10 +-
.../legacy/facet/LegacyQueryFacetTest.java | 6 +-
.../value/CastingBooleanValueStreamTest.java | 2 +-
.../value/CastingBooleanValueTest.java | 6 +-
.../value/CastingDoubleValueStreamTest.java | 2 +-
.../analytics/value/CastingDoubleValueTest.java | 6 +-
.../value/CastingFloatValueStreamTest.java | 2 +-
.../analytics/value/CastingFloatValueTest.java | 6 +-
.../value/CastingIntValueStreamTest.java | 2 +-
.../analytics/value/CastingIntValueTest.java | 6 +-
.../value/CastingLongValueStreamTest.java | 2 +-
.../analytics/value/CastingLongValueTest.java | 6 +-
.../solr/analytics/value/ConstantValueTest.java | 24 +-
solr/contrib/clustering/README.txt | 2 +-
.../handler/clustering/ClusteringComponent.java | 2 +-
.../carrot2/CarrotClusteringEngine.java | 2 +-
.../carrot2/LuceneCarrot2StemmerFactory.java | 8 +-
.../carrot2/LuceneCarrot2TokenizerFactory.java | 4 +-
.../clustering/src/test-files/log4j2.xml | 37 -
.../clustering/ClusteringComponentTest.java | 11 +-
.../carrot2/CarrotClusteringEngineTest.java | 16 +-
.../handler/dataimport/SolrEntityProcessor.java | 2 +-
.../dataimporthandler/src/test-files/log4j2.xml | 36 -
.../dataimport/AbstractDIHCacheTestCase.java | 16 +-
.../dataimport/TestBuiltInEvaluators.java | 2 +-
.../dataimport/TestHierarchicalDocBuilder.java | 2 +-
.../dataimport/TestNumberFormatTransformer.java | 10 +-
.../TestSolrEntityProcessorEndToEnd.java | 3 +-
.../dataimport/TestSortedMapBackedCache.java | 12 +-
solr/contrib/extraction/ivy.xml | 2 +-
.../handler/extraction/ParseContextConfig.java | 12 +-
.../extraction/TestExtractionDateUtil.java | 1 +
...anguageIdentifierUpdateProcessorFactory.java | 8 +-
...OpenNLPLangDetectUpdateProcessorFactory.java | 8 +-
...anguageIdentifierUpdateProcessorFactory.java | 8 +-
.../langid/solr/collection1/conf/schema.xml | 1 -
.../java/org/apache/solr/ltr/LTRRescorer.java | 10 +-
.../org/apache/solr/ltr/model/AdapterModel.java | 2 +
.../org/apache/solr/ltr/model/LinearModel.java | 2 +-
.../ltr/model/MultipleAdditiveTreesModel.java | 4 +-
.../LTRFeatureLoggerTransformerFactory.java | 2 +-
solr/contrib/ltr/src/test-files/log4j2.xml | 40 -
.../org/apache/solr/ltr/TestLTROnSolrCloud.java | 2 +
.../solr/ltr/TestLTRReRankingPipeline.java | 10 +-
.../apache/solr/ltr/TestLTRScoringQuery.java | 2 +-
.../solr/ltr/TestSelectiveWeightCreation.java | 2 +-
...stFeatureExtractionFromMultipleSegments.java | 36 +-
.../prometheus-exporter/bin/solr-exporter | 2 +-
.../prometheus-exporter/bin/solr-exporter.cmd | 10 +-
.../contrib/prometheus-exporter/conf/log4j2.xml | 53 -
.../prometheus/collector/SolrCollector.java | 24 +-
.../solr/prometheus/exporter/SolrExporter.java | 6 +-
.../solr/prometheus/scraper/SolrScraper.java | 10 +-
.../src/test-files/conf/log4j2.xml | 35 -
.../configsets/collection1/conf/managed-schema | 2 +-
.../configsets/collection1/conf/solrconfig.xml | 20 +-
solr/contrib/uima/README.txt | 109 -
solr/contrib/uima/build.xml | 63 -
solr/contrib/uima/ivy.xml | 35 -
.../uima/processor/FieldMappingException.java | 27 -
.../uima/processor/SolrUIMAConfiguration.java | 117 -
.../processor/SolrUIMAConfigurationReader.java | 116 -
.../solr/uima/processor/UIMAToSolrMapper.java | 87 -
.../processor/UIMAUpdateRequestProcessor.java | 189 -
.../UIMAUpdateRequestProcessorFactory.java | 72 -
.../solr/uima/processor/package-info.java | 25 -
solr/contrib/uima/src/java/overview.html | 21 -
.../apache/uima/desc/AggregateSentenceAE.xml | 41 -
.../org/apache/uima/desc/HmmTagger.xml | 121 -
.../apache/uima/desc/OpenCalaisAnnotator.xml | 194 -
.../uima/desc/OverridingParamsExtServicesAE.xml | 147 -
.../desc/TextCategorizationAEDescriptor.xml | 102 -
.../desc/TextConceptTaggingAEDescriptor.xml | 196 -
.../desc/TextKeywordExtractionAEDescriptor.xml | 107 -
.../desc/TextLanguageDetectionAEDescriptor.xml | 107 -
.../TextRankedEntityExtractionAEDescriptor.xml | 403 -
.../apache/uima/desc/WhitespaceTokenizer.xml | 115 -
.../desc/baseAlchemyTypeSystemDescriptor.xml | 41 -
.../collection1/conf/aggregate-uima-config.xml | 48 -
.../solr/collection1/conf/uima-fields.xml | 9 -
.../src/test-files/uima/AggregateSentenceAE.xml | 70 -
.../test-files/uima/DummyEntityAEDescriptor.xml | 68 -
.../uima/DummyExceptionAEDescriptor.xml | 40 -
.../uima/DummySentimentAnalysisAEDescriptor.xml | 60 -
.../contrib/uima/src/test-files/uima/TestAE.xml | 72 -
.../src/test-files/uima/TestExceptionAE.xml | 54 -
.../uima/solr/collection1/conf/protwords.txt | 21 -
.../uima/solr/collection1/conf/schema.xml | 612 -
.../uima/solr/collection1/conf/solrconfig.xml | 773 -
.../uima/solr/collection1/conf/spellings.txt | 2 -
.../uima/solr/collection1/conf/stopwords.txt | 58 -
.../uima/solr/collection1/conf/synonyms.txt | 31 -
.../uima/src/test-files/uima/stoptypes.txt | 25 -
.../test-files/uima/uima-tokenizers-schema.xml | 613 -
.../uima/uima-tokenizers-solrconfig.xml | 653 -
.../UIMATokenizersSolrIntegrationTest.java | 72 -
.../UIMAUpdateRequestProcessorTest.java | 186 -
.../uima/processor/an/DummyEntityAnnotator.java | 47 -
.../processor/an/DummyExceptionAnnotator.java | 30 -
.../processor/an/DummySentimentAnnotator.java | 60 -
.../solr/uima/ts/DummySentimentAnnotation.java | 81 -
.../uima/ts/DummySentimentAnnotation_Type.java | 80 -
.../apache/solr/uima/ts/EntityAnnotation.java | 99 -
.../solr/uima/ts/EntityAnnotation_Type.java | 102 -
solr/contrib/velocity/ivy.xml | 1 -
.../solr/response/VelocityResponseWriter.java | 6 +
.../velocity/VelocityResponseWriterTest.java | 6 +
solr/core/ivy.xml | 3 +-
.../src/java/org/apache/solr/api/ApiBag.java | 6 +-
.../java/org/apache/solr/api/V2HttpCall.java | 45 +-
.../solrj/embedded/EmbeddedSolrServer.java | 54 +-
.../client/solrj/embedded/JettySolrRunner.java | 10 +-
.../org/apache/solr/cloud/ElectionContext.java | 4 +-
.../java/org/apache/solr/cloud/Overseer.java | 37 +-
.../solr/cloud/OverseerTaskProcessor.java | 8 +-
.../org/apache/solr/cloud/RecoveryStrategy.java | 45 +-
.../apache/solr/cloud/ReplicateFromLeader.java | 2 +-
.../org/apache/solr/cloud/SyncStrategy.java | 5 +-
.../org/apache/solr/cloud/ZkController.java | 60 +
.../org/apache/solr/cloud/ZkShardTerms.java | 18 +-
.../cloud/api/collections/AddReplicaCmd.java | 55 +-
.../solr/cloud/api/collections/Assign.java | 2 +-
.../solr/cloud/api/collections/BackupCmd.java | 2 +-
.../api/collections/CreateCollectionCmd.java | 145 +-
.../api/collections/DeleteCollectionCmd.java | 66 +-
.../cloud/api/collections/DeleteReplicaCmd.java | 1 +
.../api/collections/MaintainRoutedAliasCmd.java | 2 +-
.../solr/cloud/api/collections/MigrateCmd.java | 8 +-
.../cloud/api/collections/MoveReplicaCmd.java | 40 +-
.../OverseerCollectionMessageHandler.java | 30 +-
.../solr/cloud/api/collections/RestoreCmd.java | 37 +-
.../cloud/api/collections/SetAliasPropCmd.java | 45 +-
.../cloud/api/collections/SplitShardCmd.java | 274 +-
.../cloud/api/collections/TimeRoutedAlias.java | 2 +
.../cloud/autoscaling/AutoScalingHandler.java | 6 +-
.../cloud/autoscaling/ComputePlanAction.java | 19 +-
.../cloud/autoscaling/IndexSizeTrigger.java | 90 +-
.../autoscaling/OverseerTriggerThread.java | 12 +-
.../cloud/autoscaling/SearchRateTrigger.java | 487 +-
.../cloud/overseer/ClusterStateMutator.java | 4 +-
.../solr/cloud/overseer/CollectionMutator.java | 28 +-
.../solr/cloud/overseer/ReplicaMutator.java | 47 +-
.../org/apache/solr/core/BlobRepository.java | 16 +-
.../org/apache/solr/core/ConfigSetService.java | 15 +-
.../org/apache/solr/core/CoreContainer.java | 154 +-
.../apache/solr/core/CorePropertiesLocator.java | 22 +-
.../apache/solr/core/HdfsDirectoryFactory.java | 15 +-
.../apache/solr/core/MMapDirectoryFactory.java | 2 +-
.../org/apache/solr/core/MetricsConfig.java | 17 +-
.../solr/core/NRTCachingDirectoryFactory.java | 2 +-
.../java/org/apache/solr/core/NodeConfig.java | 17 +-
.../java/org/apache/solr/core/PluginBag.java | 12 +-
.../java/org/apache/solr/core/SolrConfig.java | 45 +-
.../src/java/org/apache/solr/core/SolrCore.java | 154 +-
.../apache/solr/core/SolrResourceLoader.java | 12 +-
.../org/apache/solr/core/SolrXmlConfig.java | 7 +
.../org/apache/solr/handler/BlobHandler.java | 8 +-
.../apache/solr/handler/CdcrRequestHandler.java | 8 +-
.../org/apache/solr/handler/ExportHandler.java | 1 +
.../org/apache/solr/handler/ExportWriter.java | 1764 -
.../org/apache/solr/handler/GraphHandler.java | 4 +-
.../org/apache/solr/handler/IndexFetcher.java | 44 +-
.../solr/handler/MoreLikeThisHandler.java | 42 +-
.../apache/solr/handler/ReplicationHandler.java | 27 +-
.../apache/solr/handler/RequestHandlerBase.java | 16 +-
.../org/apache/solr/handler/SQLHandler.java | 4 +-
.../org/apache/solr/handler/SnapShooter.java | 7 +-
.../apache/solr/handler/SolrConfigHandler.java | 11 +-
.../solr/handler/SolrDefaultStreamFactory.java | 53 +
.../org/apache/solr/handler/StreamHandler.java | 15 +-
.../solr/handler/UpdateRequestHandler.java | 2 +-
.../solr/handler/admin/AdminHandlersProxy.java | 128 +
.../admin/AutoscalingHistoryHandler.java | 2 +-
.../handler/admin/CollectionHandlerApi.java | 56 +-
.../solr/handler/admin/CollectionsHandler.java | 228 +-
.../solr/handler/admin/ConfigSetsHandler.java | 23 +-
.../solr/handler/admin/CoreAdminHandler.java | 6 +
.../solr/handler/admin/CoreAdminOperation.java | 46 +-
.../solr/handler/admin/CreateSnapshotOp.java | 9 +-
.../handler/admin/MetricsCollectorHandler.java | 2 +-
.../solr/handler/admin/MetricsHandler.java | 81 +-
.../handler/admin/MetricsHistoryHandler.java | 964 +
.../solr/handler/admin/RequestSyncShardOp.java | 2 +-
.../admin/SegmentsInfoRequestHandler.java | 8 +-
.../org/apache/solr/handler/admin/SplitOp.java | 24 +-
.../solr/handler/admin/SystemInfoHandler.java | 11 +-
.../handler/admin/ZookeeperStatusHandler.java | 222 +
.../solr/handler/component/ExpandComponent.java | 61 +-
.../solr/handler/component/FacetComponent.java | 2 +-
.../handler/component/HttpShardHandler.java | 2 +-
.../component/HttpShardHandlerFactory.java | 7 +-
.../solr/handler/component/QueryComponent.java | 1 +
.../component/QueryElevationComponent.java | 1314 +-
.../handler/component/RangeFacetRequest.java | 8 +-
.../handler/component/RealTimeGetComponent.java | 35 +-
.../solr/handler/component/SearchHandler.java | 21 +-
.../handler/component/SpatialHeatmapFacets.java | 405 +-
.../handler/component/SpellCheckComponent.java | 8 +-
.../solr/handler/component/StatsComponent.java | 2 +-
.../handler/component/TermVectorComponent.java | 91 +-
.../solr/handler/export/BoolFieldWriter.java | 52 +
.../solr/handler/export/DateFieldWriter.java | 46 +
.../apache/solr/handler/export/DoubleCmp.java | 43 +
.../solr/handler/export/DoubleFieldWriter.java | 45 +
.../apache/solr/handler/export/DoubleValue.java | 81 +
.../solr/handler/export/ExportWriter.java | 448 +
.../apache/solr/handler/export/FieldWriter.java | 27 +
.../apache/solr/handler/export/FloatCmp.java | 44 +
.../solr/handler/export/FloatFieldWriter.java | 45 +
.../apache/solr/handler/export/FloatValue.java | 78 +
.../org/apache/solr/handler/export/IntComp.java | 45 +
.../solr/handler/export/IntFieldWriter.java | 45 +
.../apache/solr/handler/export/IntValue.java | 77 +
.../org/apache/solr/handler/export/LongCmp.java | 45 +
.../solr/handler/export/LongFieldWriter.java | 45 +
.../apache/solr/handler/export/LongValue.java | 78 +
.../solr/handler/export/MultiFieldWriter.java | 104 +
.../solr/handler/export/PriorityQueue.java | 218 +
.../org/apache/solr/handler/export/SortDoc.java | 114 +
.../apache/solr/handler/export/SortQueue.java | 52 +
.../apache/solr/handler/export/SortValue.java | 30 +
.../solr/handler/export/StringFieldWriter.java | 52 +
.../apache/solr/handler/export/StringValue.java | 99 +
.../solr/handler/export/package-info.java | 23 +
.../apache/solr/handler/loader/JsonLoader.java | 167 +-
.../apache/solr/handler/loader/XMLLoader.java | 18 +-
.../apache/solr/handler/sql/SolrEnumerator.java | 4 +-
.../solr/handler/tagger/OffsetCorrector.java | 178 +
.../solr/handler/tagger/TagClusterReducer.java | 103 +
.../org/apache/solr/handler/tagger/TagLL.java | 176 +
.../org/apache/solr/handler/tagger/Tagger.java | 230 +
.../handler/tagger/TaggerRequestHandler.java | 397 +
.../solr/handler/tagger/TaggingAttribute.java | 65 +
.../handler/tagger/TaggingAttributeImpl.java | 79 +
.../solr/handler/tagger/TermPrefixCursor.java | 189 +
.../solr/handler/tagger/XmlOffsetCorrector.java | 113 +
.../solr/handler/tagger/package-info.java | 27 +
.../solr/highlight/HighlightingPluginBase.java | 2 +-
.../apache/solr/logging/MDCLoggingContext.java | 8 +-
.../apache/solr/metrics/SolrMetricManager.java | 18 +-
.../metrics/reporters/SolrSlf4jReporter.java | 63 +-
.../reporters/solr/SolrClusterReporter.java | 13 +-
.../reporters/solr/SolrShardReporter.java | 2 +-
.../apache/solr/metrics/rrd/SolrRrdBackend.java | 138 +
.../solr/metrics/rrd/SolrRrdBackendFactory.java | 451 +
.../apache/solr/metrics/rrd/package-info.java | 22 +
.../org/apache/solr/query/SolrRangeQuery.java | 7 +-
.../solr/request/LocalSolrQueryRequest.java | 10 +-
.../org/apache/solr/request/SimpleFacets.java | 35 +-
.../solr/request/json/JsonQueryConverter.java | 49 +-
.../apache/solr/response/CSVResponseWriter.java | 2 +-
.../solr/response/GeoJSONResponseWriter.java | 11 +-
.../solr/response/GraphMLResponseWriter.java | 5 -
.../solr/response/JSONResponseWriter.java | 602 +-
.../org/apache/solr/response/JSONWriter.java | 181 +
.../apache/solr/response/PHPResponseWriter.java | 4 +-
.../response/PHPSerializedResponseWriter.java | 2 +-
.../solr/response/QueryResponseWriterUtil.java | 2 +-
.../solr/response/RetrieveFieldsOptimizer.java | 8 +-
.../solr/response/RubyResponseWriter.java | 4 +-
.../solr/response/SmileResponseWriter.java | 4 +-
.../solr/response/TextResponseWriter.java | 222 +-
.../apache/solr/response/WriteableValue.java | 25 -
.../solr/response/XSLTResponseWriter.java | 2 +-
.../transform/BaseEditorialTransformer.java | 19 +-
.../transform/ChildDocTransformerFactory.java | 11 +-
.../transform/ElevatedMarkerFactory.java | 6 +-
.../transform/ExcludedMarkerFactory.java | 6 +-
.../transform/RawValueTransformerFactory.java | 9 +-
.../response/transform/WriteableGeoJSON.java | 6 +-
.../apache/solr/schema/AbstractEnumField.java | 101 +-
.../apache/solr/schema/CurrencyFieldType.java | 18 +-
.../solr/schema/FileExchangeRateProvider.java | 106 +-
.../org/apache/solr/schema/IndexSchema.java | 7 +-
.../solr/schema/LatLonPointSpatialField.java | 2 +-
.../solr/schema/ManagedIndexSchemaFactory.java | 2 +-
.../apache/solr/search/AbstractReRankQuery.java | 7 +-
.../solr/search/CollapsingQParserPlugin.java | 27 +-
.../java/org/apache/solr/search/DocSetUtil.java | 4 +-
.../apache/solr/search/ExportQParserPlugin.java | 33 +-
.../solr/search/GraphTermsQParserPlugin.java | 27 +-
.../java/org/apache/solr/search/Grouping.java | 73 +-
.../apache/solr/search/HashQParserPlugin.java | 4 +-
.../java/org/apache/solr/search/Insanity.java | 2 +-
.../apache/solr/search/JoinQParserPlugin.java | 4 +-
.../apache/solr/search/MaxScoreCollector.java | 55 +
.../java/org/apache/solr/search/QParser.java | 30 +-
.../org/apache/solr/search/QParserPlugin.java | 80 +-
.../apache/solr/search/QueryWrapperFilter.java | 106 -
.../org/apache/solr/search/ReRankCollector.java | 30 +-
.../search/SignificantTermsQParserPlugin.java | 32 +-
.../apache/solr/search/SolrIndexSearcher.java | 90 +-
.../apache/solr/search/TermsQParserPlugin.java | 22 +-
.../apache/solr/search/ValueSourceParser.java | 22 +
.../apache/solr/search/facet/FacetField.java | 13 +-
.../solr/search/facet/FacetFieldMerger.java | 8 +-
.../solr/search/facet/FacetFieldProcessor.java | 53 +-
.../facet/FacetFieldProcessorByArray.java | 27 +-
.../facet/FacetFieldProcessorByArrayDV.java | 4 +-
.../FacetFieldProcessorByEnumTermsStream.java | 25 +-
.../facet/FacetFieldProcessorByHashDV.java | 10 +-
.../apache/solr/search/facet/FacetHeatmap.java | 520 +
.../apache/solr/search/facet/FacetMerger.java | 14 +-
.../apache/solr/search/facet/FacetModule.java | 33 +-
.../solr/search/facet/FacetProcessor.java | 125 +-
.../apache/solr/search/facet/FacetRange.java | 389 +-
.../solr/search/facet/FacetRangeMerger.java | 68 +-
.../apache/solr/search/facet/FacetRequest.java | 333 +-
.../search/facet/FacetRequestSortedMerger.java | 82 +-
.../org/apache/solr/search/facet/HLLAgg.java | 3 +-
.../org/apache/solr/search/facet/MinMaxAgg.java | 9 +-
.../apache/solr/search/facet/PercentileAgg.java | 3 +-
.../solr/search/facet/RelatednessAgg.java | 504 +
.../org/apache/solr/search/facet/SlotAcc.java | 60 +-
.../solr/search/facet/UnInvertedField.java | 10 +-
.../org/apache/solr/search/facet/UniqueAgg.java | 3 +-
.../solr/search/facet/UniqueBlockAgg.java | 91 +
.../solr/search/facet/UniqueMultiDvSlotAcc.java | 3 +-
.../search/facet/UniqueMultivaluedSlotAcc.java | 5 +-
.../search/facet/UniqueSinglevaluedSlotAcc.java | 19 +-
.../apache/solr/search/grouping/Command.java | 7 +
.../solr/search/grouping/CommandHandler.java | 8 +-
.../distributed/command/QueryCommand.java | 36 +-
.../distributed/command/QueryCommandResult.java | 8 +-
.../command/SearchGroupsFieldCommand.java | 4 +-
.../command/TopGroupsFieldCommand.java | 44 +-
.../SearchGroupShardResponseProcessor.java | 2 +-
.../TopGroupsShardResponseProcessor.java | 16 +-
.../TopGroupsResultTransformer.java | 20 +-
.../GroupedEndResultTransformer.java | 13 +-
.../apache/solr/search/join/FiltersQParser.java | 38 +-
.../solr/search/mlt/SimpleMLTQParser.java | 4 +-
.../solr/security/PKIAuthenticationPlugin.java | 49 +-
.../solr/security/PermissionNameProvider.java | 1 +
.../apache/solr/security/PublicKeyHandler.java | 47 +
...tContinuesRecorderAuthenticationHandler.java | 2 +-
.../org/apache/solr/servlet/HttpSolrCall.java | 14 +-
.../apache/solr/servlet/LoadAdminUiServlet.java | 10 +-
.../solr/servlet/ServletInputStreamWrapper.java | 2 +-
.../servlet/ServletOutputStreamWrapper.java | 2 +-
.../apache/solr/servlet/SolrDispatchFilter.java | 185 +-
.../apache/solr/servlet/SolrRequestParsers.java | 8 +-
.../solr/spelling/DirectSolrSpellChecker.java | 2 +-
.../solr/spelling/SpellCheckCollator.java | 4 +-
.../solr/store/hdfs/HdfsLocalityReporter.java | 8 +-
.../apache/solr/uninverting/DocTermOrds.java | 5 +-
.../solr/uninverting/UninvertingReader.java | 2 +-
.../apache/solr/update/AddUpdateCommand.java | 204 +-
.../apache/solr/update/CdcrTransactionLog.java | 20 +-
.../org/apache/solr/update/CdcrUpdateLog.java | 5 +-
.../org/apache/solr/update/CommitTracker.java | 66 +-
.../apache/solr/update/CommitUpdateCommand.java | 2 +-
.../solr/update/DefaultSolrCoreState.java | 5 +-
.../solr/update/DirectUpdateHandler2.java | 151 +-
.../org/apache/solr/update/DocumentBuilder.java | 37 +-
.../apache/solr/update/HdfsTransactionLog.java | 18 +-
.../org/apache/solr/update/HdfsUpdateLog.java | 85 +-
.../java/org/apache/solr/update/PeerSync.java | 796 +-
.../apache/solr/update/PeerSyncWithLeader.java | 372 +
.../apache/solr/update/SolrCmdDistributor.java | 238 +-
.../org/apache/solr/update/SolrCoreState.java | 9 +
.../org/apache/solr/update/SolrIndexConfig.java | 4 +
.../apache/solr/update/SolrIndexSplitter.java | 469 +-
.../apache/solr/update/SplitIndexCommand.java | 22 +-
.../solr/update/StreamingSolrClients.java | 16 +-
.../org/apache/solr/update/TransactionLog.java | 67 +-
.../java/org/apache/solr/update/UpdateLog.java | 408 +-
.../apache/solr/update/UpdateShardHandler.java | 92 +-
.../ClassificationUpdateProcessorFactory.java | 2 +-
.../processor/DistributedUpdateProcessor.java | 78 +-
.../DocBasedVersionConstraintsProcessor.java | 19 +-
...BasedVersionConstraintsProcessorFactory.java | 20 +-
...oreCommitOptimizeUpdateProcessorFactory.java | 2 +-
.../IgnoreLargeDocumentProcessorFactory.java | 175 +
.../processor/LogUpdateProcessorFactory.java | 2 +-
.../processor/NestedUpdateProcessorFactory.java | 137 +
.../ParseDateFieldUpdateProcessorFactory.java | 82 +-
.../processor/RegexpBoostProcessorFactory.java | 2 +-
.../SignatureUpdateProcessorFactory.java | 2 +-
.../TimeRoutedAliasUpdateProcessor.java | 34 +-
.../processor/URLClassifyProcessorFactory.java | 2 +-
.../processor/UpdateRequestProcessorChain.java | 39 +
.../java/org/apache/solr/util/FastWriter.java | 157 -
.../java/org/apache/solr/util/IOFunction.java | 29 +
.../org/apache/solr/util/OrderedExecutor.java | 116 +
.../org/apache/solr/util/SafeXMLParsing.java | 120 +
.../src/java/org/apache/solr/util/SolrCLI.java | 28 +-
.../org/apache/solr/util/SystemIdResolver.java | 14 +-
.../org/apache/solr/util/TestInjection.java | 68 +-
.../src/test-files/runtimecode/TestURP.java | 30 +
.../test-files/runtimecode/runtimeurp.jar.bin | Bin 0 -> 753 bytes
.../conf/bad-solrconfig-no-autocommit-tag.xml | 52 +
.../solr/collection1/conf/protected-1.txt | 17 +
.../solr/collection1/conf/protected-2.txt | 17 +
.../collection1/conf/schema-copyfield-test.xml | 4 -
.../solr/collection1/conf/schema-hash.xml | 4 -
.../conf/schema-luceneMatchVersion.xml | 2 -
.../conf/schema-not-required-unique-key.xml | 1 -
.../collection1/conf/schema-protected-term.xml | 86 +
.../collection1/conf/schema-required-fields.xml | 4 -
.../solr/collection1/conf/schema-rest.xml | 3 -
.../collection1/conf/schema-sortingresponse.xml | 5 +-
.../collection1/conf/schema-spellchecker.xml | 3 -
.../solr/collection1/conf/schema-sql.xml | 4 -
.../solr/collection1/conf/schema-tagger.xml | 187 +
.../test-files/solr/collection1/conf/schema.xml | 8 +-
.../solr/collection1/conf/schema11.xml | 1 -
.../solr/collection1/conf/schema12.xml | 3 -
.../solr/collection1/conf/schema15.xml | 6 +-
.../solr/collection1/conf/schema_codec.xml | 5 +-
.../solr/collection1/conf/schema_latest.xml | 2 +-
.../solr/collection1/conf/schemasurround.xml | 3 -
...dd-schema-fields-update-processor-chains.xml | 20 +-
.../solrconfig-concurrentmergescheduler.xml | 37 +
.../solrconfig-externalversionconstraint.xml | 25 +
...lrconfig-parsing-update-processor-chains.xml | 49 +-
.../collection1/conf/solrconfig-schemaless.xml | 20 +-
.../solr/collection1/conf/solrconfig-tagger.xml | 59 +
.../solr/collection1/conf/solrconfig-tlog.xml | 4 +
.../conf/solrconfig-update-processor-chains.xml | 5 +
.../configsets/_default/conf/managed-schema | 2 +-
.../configsets/_default/conf/solrconfig.xml | 22 +-
.../cloud-minimal/conf/solrconfig.xml | 3 +
.../test-files/solr/crazy-path-to-schema.xml | 1 -
solr/core/src/test-files/solr/solr-50-all.xml | 1 +
.../src/test-files/solr/solr-slf4jreporter.xml | 7 +
.../org/apache/solr/BasicFunctionalityTest.java | 2 +-
.../org/apache/solr/TestDistributedSearch.java | 50 +-
.../ProtectedTermFilterFactoryTest.java | 84 +
.../apache/solr/cloud/ActionThrottleTest.java | 6 +
.../org/apache/solr/cloud/AddReplicaTest.java | 2 +-
.../apache/solr/cloud/AliasIntegrationTest.java | 82 +-
.../cloud/AssignBackwardCompatibilityTest.java | 1 +
.../solr/cloud/BasicDistributedZkTest.java | 56 +-
.../cloud/ChaosMonkeyNothingIsSafeTest.java | 4 +-
.../solr/cloud/ChaosMonkeySafeLeaderTest.java | 2 +-
...aosMonkeySafeLeaderWithPullReplicasTest.java | 2 +-
.../solr/cloud/ChaosMonkeyShardSplitTest.java | 11 +-
.../org/apache/solr/cloud/CloudTestUtils.java | 21 +-
.../solr/cloud/CollectionsAPISolrJTest.java | 99 +
.../cloud/ConcurrentCreateRoutedAliasTest.java | 1 +
.../solr/cloud/CreateRoutedAliasTest.java | 39 +-
.../apache/solr/cloud/DeleteReplicaTest.java | 4 +-
.../solr/cloud/DocValuesNotIndexedTest.java | 7 +-
.../org/apache/solr/cloud/ForceLeaderTest.java | 2 +-
.../cloud/FullSolrCloudDistribCmdsTest.java | 2 +
.../apache/solr/cloud/HttpPartitionTest.java | 4 +-
.../solr/cloud/LIRRollingUpdatesTest.java | 4 +
.../cloud/LeaderElectionIntegrationTest.java | 3 +
.../cloud/LeaderFailoverAfterPartitionTest.java | 2 +-
.../solr/cloud/LeaderTragicEventTest.java | 197 +
.../solr/cloud/LeaderVoteWaitTimeoutTest.java | 2 +
.../solr/cloud/LegacyCloudClusterPropTest.java | 2 +-
.../cloud/MetricsHistoryIntegrationTest.java | 194 +
.../apache/solr/cloud/MigrateRouteKeyTest.java | 18 +
.../solr/cloud/MissingSegmentRecoveryTest.java | 2 +-
.../apache/solr/cloud/MoveReplicaHDFSTest.java | 5 +-
.../org/apache/solr/cloud/MoveReplicaTest.java | 4 +-
.../apache/solr/cloud/MultiThreadedOCPTest.java | 2 +-
.../apache/solr/cloud/OverseerRolesTest.java | 1 +
.../solr/cloud/OverseerTaskQueueTest.java | 3 +-
.../solr/cloud/PeerSyncReplicationTest.java | 2 +-
.../org/apache/solr/cloud/RecoveryZkTest.java | 1 +
.../solr/cloud/ReplaceNodeNoTargetTest.java | 2 +-
.../solr/cloud/ReplicationFactorTest.java | 4 +-
.../solr/cloud/RestartWhileUpdatingTest.java | 2 +-
.../apache/solr/cloud/RollingRestartTest.java | 11 +-
.../solr/cloud/SaslZkACLProviderTest.java | 1 +
.../cloud/SegmentTerminateEarlyTestState.java | 22 +-
.../cloud/SharedFSAutoReplicaFailoverTest.java | 5 +-
.../apache/solr/cloud/SolrCloudExampleTest.java | 11 +-
.../apache/solr/cloud/TestCloudConsistency.java | 5 +-
.../cloud/TestCloudJSONFacetJoinDomain.java | 92 +-
.../solr/cloud/TestCloudJSONFacetSKG.java | 677 +
.../apache/solr/cloud/TestCloudPivotFacet.java | 45 +-
.../apache/solr/cloud/TestCloudRecovery.java | 36 +-
.../solr/cloud/TestCloudSearcherWarming.java | 41 +-
.../apache/solr/cloud/TestConfigSetsAPI.java | 58 +-
.../solr/cloud/TestLeaderElectionZkExpiry.java | 1 -
.../solr/cloud/TestMiniSolrCloudClusterSSL.java | 61 +
.../org/apache/solr/cloud/TestPrepRecovery.java | 4 +-
.../org/apache/solr/cloud/TestPullReplica.java | 5 +-
.../cloud/TestPullReplicaErrorHandling.java | 3 +-
.../apache/solr/cloud/TestSegmentSorting.java | 4 +-
.../cloud/TestSolrCloudWithKerberosAlt.java | 3 +-
.../TestStressCloudBlindAtomicUpdates.java | 3 +-
.../org/apache/solr/cloud/TestTlogReplica.java | 19 +-
.../apache/solr/cloud/TestWithCollection.java | 611 +
.../solr/cloud/UnloadDistributedZkTest.java | 1 +
.../org/apache/solr/cloud/ZkShardTermsTest.java | 50 +
.../AbstractCloudBackupRestoreTestCase.java | 141 +-
.../CollectionsAPIAsyncDistributedZkTest.java | 4 +-
.../CollectionsAPIDistributedZkTest.java | 2 +-
.../api/collections/CustomCollectionTest.java | 1 +
.../HdfsCollectionsAPIDistributedZkTest.java | 2 +
.../cloud/api/collections/ShardSplitTest.java | 252 +-
.../api/collections/TestCollectionAPI.java | 120 +
.../TestCollectionsAPIViaSolrCloudCluster.java | 2 +-
.../collections/TestHdfsCloudBackupRestore.java | 5 +-
.../TestLocalFSCloudBackupRestore.java | 2 +
.../AutoAddReplicasIntegrationTest.java | 4 +-
.../autoscaling/AutoScalingHandlerTest.java | 35 +-
.../autoscaling/ComputePlanActionTest.java | 6 +-
.../HdfsAutoAddReplicasIntegrationTest.java | 1 +
.../cloud/autoscaling/IndexSizeTriggerTest.java | 70 +-
.../MetricTriggerIntegrationTest.java | 2 +
.../cloud/autoscaling/NodeAddedTriggerTest.java | 27 +-
.../cloud/autoscaling/NodeLostTriggerTest.java | 1 +
.../ScheduledTriggerIntegrationTest.java | 3 +-
.../cloud/autoscaling/ScheduledTriggerTest.java | 3 +-
.../SearchRateTriggerIntegrationTest.java | 594 +-
.../autoscaling/SearchRateTriggerTest.java | 215 +-
.../solr/cloud/autoscaling/TestPolicyCloud.java | 27 +-
.../cloud/autoscaling/sim/LiveNodesSet.java | 8 +-
.../cloud/autoscaling/sim/SimCloudManager.java | 250 +-
.../sim/SimClusterStateProvider.java | 313 +-
.../autoscaling/sim/SimNodeStateProvider.java | 128 +-
.../autoscaling/sim/SimSolrCloudTestCase.java | 56 +-
.../sim/TestClusterStateProvider.java | 6 +-
.../autoscaling/sim/TestComputePlanAction.java | 8 +-
.../autoscaling/sim/TestExecutePlanAction.java | 2 +
.../sim/TestGenericDistributedQueue.java | 3 +-
.../cloud/autoscaling/sim/TestLargeCluster.java | 133 +-
.../cloud/autoscaling/sim/TestPolicyCloud.java | 6 +-
.../sim/TestSimDistributedQueue.java | 1 +
.../autoscaling/sim/TestTriggerIntegration.java | 17 +-
.../cloud/cdcr/BaseCdcrDistributedZkTest.java | 2 +-
.../solr/cloud/cdcr/CdcrBootstrapTest.java | 4 +-
.../cdcr/CdcrReplicationDistributedZkTest.java | 9 +
.../cloud/hdfs/HdfsBasicDistributedZk2Test.java | 3 +-
.../cloud/hdfs/HdfsBasicDistributedZkTest.java | 1 +
.../hdfs/HdfsChaosMonkeySafeLeaderTest.java | 2 +
.../solr/cloud/hdfs/HdfsNNFailoverTest.java | 2 +
.../hdfs/HdfsRestartWhileUpdatingTest.java | 3 +-
.../solr/cloud/hdfs/HdfsSyncSliceTest.java | 2 +
...HdfsTlogReplayBufferedWhileIndexingTest.java | 3 +-
.../cloud/hdfs/HdfsUnloadDistributedZkTest.java | 2 +
.../HdfsWriteToMultipleCollectionsTest.java | 2 +
.../apache/solr/cloud/hdfs/StressHdfsTest.java | 1 +
.../apache/solr/core/ResourceLoaderTest.java | 10 +-
.../org/apache/solr/core/TestCodecSupport.java | 34 +-
.../test/org/apache/solr/core/TestConfig.java | 36 +
.../apache/solr/core/TestDynamicLoading.java | 3 +-
.../org/apache/solr/core/TestDynamicURP.java | 110 +
.../org/apache/solr/core/TestLazyCores.java | 15 +
.../apache/solr/core/TestMergePolicyConfig.java | 16 +-
.../test/org/apache/solr/core/TestNRTOpen.java | 72 +-
.../solr/core/TestQuerySenderListener.java | 45 +-
.../solr/core/TestQuerySenderNoQuery.java | 25 +-
.../apache/solr/core/TestSimpleTextCodec.java | 10 +-
.../apache/solr/core/TestSolrConfigHandler.java | 38 +
.../test/org/apache/solr/core/TestSolrXml.java | 1 +
.../handler/AnalysisRequestHandlerTestBase.java | 6 +-
.../DocumentAnalysisRequestHandlerTest.java | 47 +-
.../FieldAnalysisRequestHandlerTest.java | 62 +-
.../org/apache/solr/handler/JsonLoaderTest.java | 318 +-
.../solr/handler/MoreLikeThisHandlerTest.java | 163 +-
.../solr/handler/TestReplicationHandler.java | 38 +-
.../handler/TestReplicationHandlerBackup.java | 2 +-
.../org/apache/solr/handler/TestSQLHandler.java | 3 +
.../handler/admin/AdminHandlersProxyTest.java | 119 +
.../admin/AutoscalingHistoryHandlerTest.java | 32 +-
.../admin/MetricsHistoryHandlerTest.java | 127 +
.../solr/handler/admin/TestCollectionAPIs.java | 36 +-
.../admin/ZookeeperStatusHandlerTest.java | 85 +
.../component/CustomHighlightComponentTest.java | 7 +-
.../component/DistributedMLTComponentTest.java | 2 +
.../handler/component/InfixSuggestersTest.java | 33 +-
.../component/QueryElevationComponentTest.java | 343 +-
.../handler/component/SearchHandlerTest.java | 134 +
.../component/SpatialHeatmapFacetsTest.java | 215 -
.../component/SpellCheckComponentTest.java | 2 +-
.../component/TermVectorComponentTest.java | 340 +-
.../handler/component/TestPivotHelperCode.java | 2 +
.../solr/handler/export/TestExportWriter.java | 747 +
.../tagger/EmbeddedSolrNoSerializeTest.java | 154 +
.../handler/tagger/RandomizedTaggerTest.java | 150 +
.../apache/solr/handler/tagger/Tagger2Test.java | 176 +
.../apache/solr/handler/tagger/TaggerTest.java | 296 +
.../solr/handler/tagger/TaggerTestCase.java | 251 +
.../handler/tagger/TaggingAttributeTest.java | 73 +
.../handler/tagger/WordLengthTaggingFilter.java | 110 +
.../tagger/WordLengthTaggingFilterFactory.java | 67 +
.../handler/tagger/XmlInterpolationTest.java | 224 +
.../solr/index/hdfs/CheckHdfsIndexTest.java | 2 +
.../org/apache/solr/legacy/TestLegacyTerms.java | 8 +-
.../TestMultiValuedNumericRangeQuery.java | 2 +-
.../solr/legacy/TestNumericRangeQuery32.java | 10 +-
.../solr/legacy/TestNumericRangeQuery64.java | 10 +-
.../reporters/SolrJmxReporterCloudTest.java | 2 +
.../reporters/SolrSlf4jReporterTest.java | 5 +-
.../reporters/solr/SolrCloudReportersTest.java | 3 +
.../metrics/rrd/SolrRrdBackendFactoryTest.java | 200 +
.../apache/solr/request/SimpleFacetsTest.java | 12 +-
.../org/apache/solr/request/TestFaceting.java | 12 +-
.../solr/request/TestIntervalFaceting.java | 13 +-
.../apache/solr/response/JSONWriterTest.java | 53 +-
.../apache/solr/response/TestExportWriter.java | 370 -
.../solr/rest/schema/TestFieldTypeResource.java | 1 -
.../solr/schema/SchemaApiFailureTest.java | 4 -
.../apache/solr/schema/TestCloudSchemaless.java | 1 +
.../org/apache/solr/schema/TestPointFields.java | 32 +-
.../search/CurrencyRangeFacetCloudTest.java | 9 +-
.../org/apache/solr/search/LargeFieldTest.java | 9 +-
.../apache/solr/search/QueryEqualityTest.java | 14 +-
.../SignificantTermsQParserPluginTest.java | 35 +
.../solr/search/TestFilteredDocIdSet.java | 8 +-
.../org/apache/solr/search/TestFiltering.java | 12 +-
.../solr/search/TestHashQParserPlugin.java | 30 +-
.../org/apache/solr/search/TestLFUCache.java | 31 +-
.../apache/solr/search/TestNoOpRegenerator.java | 20 +-
.../org/apache/solr/search/TestQueryTypes.java | 4 +-
.../solr/search/TestQueryWrapperFilter.java | 241 -
.../apache/solr/search/TestRankQueryPlugin.java | 5 +-
.../org/apache/solr/search/TestRecovery.java | 143 +-
.../apache/solr/search/TestRecoveryHdfs.java | 48 +-
.../apache/solr/search/TestSolr4Spatial2.java | 5 +-
.../test/org/apache/solr/search/TestSort.java | 4 +-
.../solr/search/TestStandardQParsers.java | 10 +-
.../apache/solr/search/TestStressRecovery.java | 1 +
.../org/apache/solr/search/facet/DebugAgg.java | 93 +-
...ibutedFacetSimpleRefinementLongTailTest.java | 19 +-
.../solr/search/facet/RangeFacetCloudTest.java | 786 +
.../search/facet/SpatialHeatmapFacetsTest.java | 349 +
.../search/facet/TestJsonFacetRefinement.java | 1263 +-
.../solr/search/facet/TestJsonFacets.java | 440 +
.../facet/TestJsonFacetsStatsParsing.java | 106 +
.../facet/TestJsonFacetsWithNestedObjects.java | 26 +
.../function/TestMinMaxOnMultiValuedField.java | 2 +-
.../solr/search/function/TestOrdValues.java | 2 +-
.../function/TestSortByMinMaxFunction.java | 2 +-
.../apache/solr/search/join/BJQParserTest.java | 61 +-
.../search/join/BlockJoinFacetDistribTest.java | 77 +-
.../solr/search/json/TestJsonRequest.java | 167 +-
.../similarities/BaseSimilarityTestCase.java | 16 +-
.../solr/search/stats/TestDistribIDF.java | 2 +
.../solr/security/BasicAuthIntegrationTest.java | 1 +
.../security/TestPKIAuthenticationPlugin.java | 7 +-
.../hadoop/TestDelegationWithHadoopAuth.java | 2 +
.../TestSolrCloudWithHadoopAuthPlugin.java | 1 +
.../solr/servlet/HttpSolrCallGetCoreTest.java | 2 +
.../spelling/DirectSolrSpellCheckerTest.java | 33 +-
.../spelling/FileBasedSpellCheckerTest.java | 112 +-
.../spelling/IndexBasedSpellCheckerTest.java | 263 +-
.../solr/spelling/SpellCheckCollatorTest.java | 2 +-
.../spelling/WordBreakSolrSpellCheckerTest.java | 15 +-
.../TestHighFrequencyDictionaryFactory.java | 10 +-
.../solr/store/blockcache/BlockCacheTest.java | 1 +
.../store/blockcache/BlockDirectoryTest.java | 2 +
.../solr/store/hdfs/HdfsDirectoryTest.java | 2 +-
.../TestDocTermOrdsUninvertLimit.java | 2 +-
.../solr/uninverting/TestFieldCacheSort.java | 138 +-
.../uninverting/TestFieldCacheSortRandom.java | 6 +-
.../uninverting/TestFieldCacheVsDocValues.java | 111 +-
.../solr/uninverting/TestNumericTerms32.java | 2 +-
.../solr/uninverting/TestNumericTerms64.java | 2 +-
.../apache/solr/update/AddBlockUpdateTest.java | 321 +-
.../update/DirectUpdateHandlerOptimizeTest.java | 101 -
.../solr/update/DirectUpdateHandlerTest.java | 2 +-
.../solr/update/MaxSizeAutoCommitTest.java | 401 +
.../solr/update/MockStreamingSolrClients.java | 27 +-
.../update/PeerSyncWithBufferUpdatesTest.java | 223 +
...ithLeaderAndIndexFingerprintCachingTest.java | 36 +
.../solr/update/PeerSyncWithLeaderTest.java | 39 +
.../solr/update/SolrCmdDistributorTest.java | 370 +-
.../apache/solr/update/SolrIndexConfigTest.java | 24 +
.../solr/update/SolrIndexSplitterTest.java | 122 +-
.../update/TestDocBasedVersionConstraints.java | 44 +
.../apache/solr/update/TestHdfsUpdateLog.java | 1 +
.../solr/update/TestInPlaceUpdatesDistrib.java | 3 +
.../update/TestInPlaceUpdatesStandalone.java | 16 +-
.../solr/update/TestNestedUpdateProcessor.java | 195 +
.../apache/solr/update/TransactionLogTest.java | 44 +
...dSchemaFieldsUpdateProcessorFactoryTest.java | 23 +-
.../update/processor/AtomicUpdatesTest.java | 16 +-
.../DistributedUpdateProcessorTest.java | 54 +
.../FieldMutatingUpdateProcessorTest.java | 40 +-
...ommitOptimizeUpdateProcessorFactoryTest.java | 2 +-
...IgnoreLargeDocumentProcessorFactoryTest.java | 181 +
.../ParsingFieldUpdateProcessorsTest.java | 157 +-
.../solr/update/processor/RuntimeUrp.java | 3 +
.../SignatureUpdateProcessorFactoryTest.java | 4 +-
...atelessScriptUpdateProcessorFactoryTest.java | 12 +-
.../processor/TestNamedUpdateProcessors.java | 1 +
.../TimeRoutedAliasUpdateProcessorTest.java | 235 +-
.../TrackingUpdateProcessorFactory.java | 226 +
.../org/apache/solr/util/CircularListTest.java | 12 +-
.../solr/util/MockSearchableSolrClient.java | 117 +
.../apache/solr/util/OrderedExecutorTest.java | 105 +
.../apache/solr/util/SolrPluginUtilsTest.java | 2 +-
.../org/apache/solr/util/TestFastWriter.java | 124 -
.../apache/solr/util/TestSafeXMLParsing.java | 99 +
.../apache/solr/util/TestSystemIdResolver.java | 41 +-
.../test/org/apache/solr/util/TestUtils.java | 36 +-
solr/example/README.txt | 4 +-
solr/example/files/conf/solrconfig.xml | 20 +-
solr/example/resources/log4j2.xml | 54 -
.../licenses/AlchemyAPIAnnotator-2.3.1.jar.sha1 | 1 -
.../AlchemyAPIAnnotator-LICENSE-ASL.txt | 202 -
solr/licenses/AlchemyAPIAnnotator-NOTICE.txt | 7 -
.../licenses/OpenCalaisAnnotator-2.3.1.jar.sha1 | 1 -
.../OpenCalaisAnnotator-LICENSE-ASL.txt | 202 -
solr/licenses/OpenCalaisAnnotator-NOTICE.txt | 7 -
solr/licenses/Tagger-2.3.1.jar.sha1 | 1 -
solr/licenses/Tagger-LICENSE-ASL.txt | 202 -
solr/licenses/Tagger-NOTICE.txt | 7 -
.../licenses/WhitespaceTokenizer-2.3.1.jar.sha1 | 1 -
.../WhitespaceTokenizer-LICENSE-ASL.txt | 202 -
solr/licenses/WhitespaceTokenizer-NOTICE.txt | 7 -
solr/licenses/attributes-binder-1.3.1.jar.sha1 | 1 -
solr/licenses/attributes-binder-1.3.3.jar.sha1 | 1 +
solr/licenses/carrot2-mini-3.15.0.jar.sha1 | 1 -
solr/licenses/carrot2-mini-3.16.0.jar.sha1 | 1 +
solr/licenses/commons-beanutils-1.8.3.jar.sha1 | 1 -
solr/licenses/commons-beanutils-LICENSE-ASL.txt | 202 -
solr/licenses/commons-beanutils-NOTICE.txt | 2 -
solr/licenses/commons-compress-1.14.jar.sha1 | 1 -
solr/licenses/commons-compress-1.16.1.jar.sha1 | 1 +
solr/licenses/commons-digester-2.1.jar.sha1 | 1 -
solr/licenses/fontbox-2.0.8.jar.sha1 | 1 -
solr/licenses/fontbox-2.0.9.jar.sha1 | 1 +
solr/licenses/hppc-0.7.3.jar.sha1 | 1 -
solr/licenses/hppc-0.8.1.jar.sha1 | 1 +
solr/licenses/icu4j-61.1.jar.sha1 | 1 -
solr/licenses/icu4j-62.1.jar.sha1 | 1 +
solr/licenses/jackcess-2.1.10.jar.sha1 | 1 +
solr/licenses/jackcess-2.1.8.jar.sha1 | 1 -
.../licenses/jackson-annotations-2.5.4.jar.sha1 | 1 -
.../licenses/jackson-annotations-2.9.5.jar.sha1 | 1 +
solr/licenses/jackson-core-2.5.4.jar.sha1 | 1 -
solr/licenses/jackson-core-2.9.5.jar.sha1 | 1 +
solr/licenses/jackson-databind-2.5.4.jar.sha1 | 1 -
solr/licenses/jackson-databind-2.9.5.jar.sha1 | 1 +
.../jackson-dataformat-smile-2.5.4.jar.sha1 | 1 -
.../jackson-dataformat-smile-2.9.5.jar.sha1 | 1 +
solr/licenses/jdom-2.0.2.jar.sha1 | 1 -
solr/licenses/jdom-LICENSE-BSD_LIKE.txt | 56 -
solr/licenses/jdom-NOTICE.txt | 6 -
solr/licenses/jdom2-2.0.6.jar.sha1 | 1 +
solr/licenses/jdom2-LICENSE-BSD_LIKE.txt | 56 +
solr/licenses/jdom2-NOTICE.txt | 6 +
...jetty-continuation-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-continuation-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-deploy-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-deploy-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-http-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-http-9.4.8.v20171121.jar.sha1 | 1 -
.../licenses/jetty-io-9.4.11.v20180605.jar.sha1 | 1 +
solr/licenses/jetty-io-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-jmx-9.4.11.v20180605.jar.sha1 | 1 +
.../licenses/jetty-jmx-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-rewrite-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-rewrite-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-security-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-security-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-server-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-server-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-servlet-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-servlet-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-servlets-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-servlets-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-util-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-util-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-webapp-9.4.11.v20180605.jar.sha1 | 1 +
.../jetty-webapp-9.4.8.v20171121.jar.sha1 | 1 -
.../jetty-xml-9.4.11.v20180605.jar.sha1 | 1 +
.../licenses/jetty-xml-9.4.8.v20171121.jar.sha1 | 1 -
solr/licenses/joda-time-2.2.jar.sha1 | 1 -
solr/licenses/joda-time-LICENSE-ASL.txt | 202 -
solr/licenses/joda-time-NOTICE.txt | 5 -
solr/licenses/jsoup-1.11.2.jar.sha1 | 1 +
solr/licenses/jsoup-1.8.2.jar.sha1 | 1 -
solr/licenses/junit4-ant-2.5.3.jar.sha1 | 1 -
solr/licenses/junit4-ant-2.6.0.jar.sha1 | 1 +
solr/licenses/metrics-core-3.2.2.jar.sha1 | 1 -
solr/licenses/metrics-core-3.2.6.jar.sha1 | 1 +
solr/licenses/metrics-ganglia-3.2.2.jar.sha1 | 1 -
solr/licenses/metrics-ganglia-3.2.6.jar.sha1 | 1 +
solr/licenses/metrics-graphite-3.2.2.jar.sha1 | 1 -
solr/licenses/metrics-graphite-3.2.6.jar.sha1 | 1 +
solr/licenses/metrics-jetty9-3.2.2.jar.sha1 | 1 -
solr/licenses/metrics-jetty9-3.2.6.jar.sha1 | 1 +
solr/licenses/metrics-jvm-3.2.2.jar.sha1 | 1 -
solr/licenses/metrics-jvm-3.2.6.jar.sha1 | 1 +
solr/licenses/morfologik-fsa-2.1.1.jar.sha1 | 1 -
solr/licenses/morfologik-fsa-2.1.5.jar.sha1 | 1 +
solr/licenses/morfologik-polish-2.1.1.jar.sha1 | 1 -
solr/licenses/morfologik-polish-2.1.5.jar.sha1 | 1 +
.../licenses/morfologik-stemming-2.1.1.jar.sha1 | 1 -
.../licenses/morfologik-stemming-2.1.5.jar.sha1 | 1 +
solr/licenses/opennlp-maxent-3.0.3.jar.sha1 | 1 -
solr/licenses/opennlp-maxent-LICENSE-ASL.txt | 202 -
solr/licenses/opennlp-maxent-NOTICE.txt | 6 -
solr/licenses/opennlp-tools-1.8.3.jar.sha1 | 1 -
solr/licenses/opennlp-tools-1.9.0.jar.sha1 | 1 +
solr/licenses/pdfbox-2.0.8.jar.sha1 | 1 -
solr/licenses/pdfbox-2.0.9.jar.sha1 | 1 +
solr/licenses/pdfbox-tools-2.0.8.jar.sha1 | 1 -
solr/licenses/pdfbox-tools-2.0.9.jar.sha1 | 1 +
.../randomizedtesting-runner-2.5.3.jar.sha1 | 1 -
.../randomizedtesting-runner-2.6.0.jar.sha1 | 1 +
solr/licenses/rrd4j-3.2.jar.sha1 | 1 +
solr/licenses/rrd4j-LICENSE-ASL.txt | 202 +
solr/licenses/rrd4j-NOTICE.txt | 2 +
solr/licenses/start.jar.sha1 | 2 +-
solr/licenses/tika-core-1.17.jar.sha1 | 1 -
solr/licenses/tika-core-1.18.jar.sha1 | 1 +
solr/licenses/tika-java7-1.17.jar.sha1 | 1 -
solr/licenses/tika-java7-1.18.jar.sha1 | 1 +
solr/licenses/tika-parsers-1.17.jar.sha1 | 1 -
solr/licenses/tika-parsers-1.18.jar.sha1 | 1 +
solr/licenses/tika-xmp-1.17.jar.sha1 | 1 -
solr/licenses/tika-xmp-1.18.jar.sha1 | 1 +
solr/licenses/uimaj-core-2.3.1.jar.sha1 | 1 -
solr/licenses/uimaj-core-LICENSE-ASL.txt | 202 -
solr/licenses/uimaj-core-NOTICE.txt | 13 -
solr/licenses/xz-1.6.jar.sha1 | 1 -
solr/licenses/xz-1.8.jar.sha1 | 1 +
solr/server/README.txt | 2 +-
solr/server/ivy.xml | 7 +-
solr/server/resources/log4j2-console.xml | 39 +
solr/server/resources/log4j2.xml | 22 +
solr/server/scripts/cloud-scripts/log4j2.xml | 37 -
.../scripts/cloud-scripts/snapshotscli.sh | 2 +-
solr/server/scripts/cloud-scripts/zkcli.bat | 4 +-
solr/server/scripts/cloud-scripts/zkcli.sh | 2 +-
.../configsets/_default/conf/managed-schema | 2 +-
.../configsets/_default/conf/solrconfig.xml | 22 +-
solr/solr-ref-guide/README.adoc | 3 +-
solr/solr-ref-guide/src/_includes/head.html | 1 -
solr/solr-ref-guide/src/_layouts/home.html | 31 +
solr/solr-ref-guide/src/_layouts/page.html | 12 -
solr/solr-ref-guide/src/about-filters.adoc | 3 +-
solr/solr-ref-guide/src/about-this-guide.adoc | 2 +
solr/solr-ref-guide/src/analyzers.adoc | 1 -
.../src/basic-authentication-plugin.adoc | 2 +
solr/solr-ref-guide/src/blob-store-api.adoc | 96 +-
solr/solr-ref-guide/src/blockjoin-faceting.adoc | 3 +-
solr/solr-ref-guide/src/cdcr-config.adoc | 66 +-
solr/solr-ref-guide/src/cloud-screens.adoc | 38 +-
solr/solr-ref-guide/src/collections-api.adoc | 97 +-
.../src/colocating-collections.adoc | 76 +
solr/solr-ref-guide/src/config-api.adoc | 720 +-
solr/solr-ref-guide/src/config-sets.adoc | 36 +-
solr/solr-ref-guide/src/configsets-api.adoc | 246 +-
.../solr-ref-guide/src/configuring-logging.adoc | 2 +-
.../src/configuring-solrconfig-xml.adoc | 42 +-
solr/solr-ref-guide/src/css/comments.css | 160 -
solr/solr-ref-guide/src/css/customstyles.css | 31 +-
solr/solr-ref-guide/src/css/ref-guide.css | 1 +
.../src/distributed-requests.adoc | 40 +-
solr/solr-ref-guide/src/dsp.adoc | 719 +
solr/solr-ref-guide/src/enabling-ssl.adoc | 23 +-
.../src/exporting-result-sets.adoc | 3 +-
.../solr-ref-guide/src/filter-descriptions.adoc | 112 +-
solr/solr-ref-guide/src/format-of-solr-xml.adoc | 5 +
solr/solr-ref-guide/src/how-to-contribute.adoc | 4 +-
.../src/images/cloud-screens/cloud-graph.png | Bin 54929 -> 94496 bytes
.../src/images/cloud-screens/cloud-hover.png | Bin 0 -> 83343 bytes
.../src/images/cloud-screens/cloud-nodes.png | Bin 0 -> 185805 bytes
.../src/images/cloud-screens/cloud-radial.png | Bin 62572 -> 102878 bytes
.../src/images/cloud-screens/cloud-tree.png | Bin 105371 -> 122158 bytes
.../src/images/cloud-screens/cloud-zkstatus.png | Bin 0 -> 175359 bytes
.../src/images/diagrams/splitshard-seq.png | Bin 0 -> 98871 bytes
.../src/images/diagrams/splitshard-seq.puml | 115 +
.../hidden-signal-autocorrelation.png | Bin 0 -> 258831 bytes
.../math-expressions/hidden-signal-fft.png | Bin 0 -> 215981 bytes
.../images/math-expressions/hidden-signal.png | Bin 0 -> 319100 bytes
.../math-expressions/noise-autocorrelation.png | Bin 0 -> 204511 bytes
.../src/images/math-expressions/noise-fft.png | Bin 0 -> 319551 bytes
.../src/images/math-expressions/noise.png | Bin 0 -> 375565 bytes
.../math-expressions/signal-autocorrelation.png | Bin 0 -> 322164 bytes
.../src/images/math-expressions/signal-fft.png | Bin 0 -> 140111 bytes
.../src/images/math-expressions/signal.png | Bin 0 -> 365018 bytes
.../src/images/metrics-history/loadAvg-60s.png | Bin 0 -> 7101 bytes
.../src/images/metrics-history/memHeap-60s.png | Bin 0 -> 7559 bytes
.../metrics-history/query-graph-10min.png | Bin 0 -> 5678 bytes
.../images/metrics-history/query-graph-60s.png | Bin 0 -> 6916 bytes
.../images/metrics-history/update-graph-60s.png | Bin 0 -> 6473 bytes
.../src/implicit-requesthandlers.adoc | 374 +-
solr/solr-ref-guide/src/index-replication.adoc | 4 +-
solr/solr-ref-guide/src/index.adoc | 91 +-
.../src/indexconfig-in-solrconfig.adoc | 5 +-
.../src/indexing-and-basic-data-operations.adoc | 4 +-
solr/solr-ref-guide/src/json-facet-api.adoc | 534 +-
solr/solr-ref-guide/src/json-query-dsl.adoc | 17 +
solr/solr-ref-guide/src/json-request-api.adoc | 6 +-
.../src/kerberos-authentication-plugin.adoc | 6 +-
solr/solr-ref-guide/src/language-analysis.adoc | 2 +-
solr/solr-ref-guide/src/learning-to-rank.adoc | 4 +-
solr/solr-ref-guide/src/managed-resources.adoc | 2 +-
solr/solr-ref-guide/src/math-expressions.adoc | 4 +-
solr/solr-ref-guide/src/meta-docs/jekyll.adoc | 4 +-
solr/solr-ref-guide/src/meta-docs/publish.adoc | 165 +-
solr/solr-ref-guide/src/metrics-history.adoc | 485 +
solr/solr-ref-guide/src/metrics-reporting.adoc | 85 +-
solr/solr-ref-guide/src/monitoring-solr.adoc | 4 +-
.../src/near-real-time-searching.adoc | 2 +-
solr/solr-ref-guide/src/other-parsers.adoc | 2 +-
.../src/parallel-sql-interface.adoc | 4 -
.../src/requestdispatcher-in-solrconfig.adoc | 2 +-
solr/solr-ref-guide/src/result-clustering.adoc | 2 +-
solr/solr-ref-guide/src/result-grouping.adoc | 9 +-
.../src/running-solr-on-hdfs.adoc | 2 +-
solr/solr-ref-guide/src/schemaless-mode.adoc | 24 +-
solr/solr-ref-guide/src/searching.adoc | 33 +-
...tting-up-an-external-zookeeper-ensemble.adoc | 405 +-
.../src/solr-control-script-reference.adoc | 85 +-
solr/solr-ref-guide/src/solr-tutorial.adoc | 4 +-
solr/solr-ref-guide/src/solr-upgrade-notes.adoc | 26 +
.../src/solrcloud-autoscaling-api.adoc | 2 +-
...olrcloud-autoscaling-policy-preferences.adoc | 108 +-
.../src/solrcloud-autoscaling-triggers.adoc | 121 +-
...rcloud-query-routing-and-read-tolerance.adoc | 67 +-
solr/solr-ref-guide/src/solrcloud.adoc | 3 +-
solr/solr-ref-guide/src/spatial-search.adoc | 18 +-
.../src/stream-evaluator-reference.adoc | 35 +
.../src/streaming-expressions.adoc | 7 +-
solr/solr-ref-guide/src/suggester.adoc | 1 -
.../src/the-extended-dismax-query-parser.adoc | 4 +-
.../src/the-query-elevation-component.adoc | 11 +
solr/solr-ref-guide/src/the-tagger-handler.adoc | 268 +
.../solr-ref-guide/src/time-routed-aliases.adoc | 33 +-
solr/solr-ref-guide/src/tokenizers.adoc | 2 +-
.../src/transforming-result-documents.adoc | 1 +
solr/solr-ref-guide/src/uima-integration.adoc | 122 -
.../src/update-request-processors.adoc | 8 +-
.../src/updatehandlers-in-solrconfig.adoc | 6 +-
.../src/updating-parts-of-documents.adoc | 20 +-
.../src/uploading-data-with-index-handlers.adoc | 8 +-
...zookeeper-to-manage-configuration-files.adoc | 2 +
solr/solr-ref-guide/src/v2-api.adoc | 2 +-
.../cloud/autoscaling/AddReplicaSuggester.java | 9 +-
.../client/solrj/cloud/autoscaling/Cell.java | 5 +-
.../client/solrj/cloud/autoscaling/Clause.java | 414 +-
.../solrj/cloud/autoscaling/ComputedType.java | 99 +
.../solrj/cloud/autoscaling/Condition.java | 122 +
.../solrj/cloud/autoscaling/CoresVariable.java | 115 +
.../autoscaling/DelegatingCloudManager.java | 2 +-
.../cloud/autoscaling/DeleteNodeSuggester.java | 46 +
.../autoscaling/DeleteReplicaSuggester.java | 74 +
.../cloud/autoscaling/FreeDiskVariable.java | 135 +
.../cloud/autoscaling/MoveReplicaSuggester.java | 32 +-
.../solrj/cloud/autoscaling/NodeVariable.java | 45 +
.../client/solrj/cloud/autoscaling/Operand.java | 101 +-
.../client/solrj/cloud/autoscaling/Policy.java | 452 +-
.../solrj/cloud/autoscaling/PolicyHelper.java | 42 +-
.../solrj/cloud/autoscaling/Preference.java | 5 +-
.../solrj/cloud/autoscaling/RangeVal.java | 54 +
.../solrj/cloud/autoscaling/ReplicaCount.java | 28 +-
.../solrj/cloud/autoscaling/ReplicaInfo.java | 20 +
.../cloud/autoscaling/ReplicaVariable.java | 135 +
.../client/solrj/cloud/autoscaling/Row.java | 87 +-
.../solrj/cloud/autoscaling/SealedClause.java | 29 +
.../cloud/autoscaling/SplitShardSuggester.java | 6 +
.../solrj/cloud/autoscaling/Suggester.java | 160 +-
.../solrj/cloud/autoscaling/Suggestion.java | 337 +-
.../solrj/cloud/autoscaling/Variable.java | 366 +
.../solrj/cloud/autoscaling/VariableBase.java | 205 +
.../solrj/cloud/autoscaling/Violation.java | 118 +-
.../autoscaling/WithCollectionVariable.java | 165 +
.../solr/client/solrj/impl/CloudSolrClient.java | 33 +-
.../solr/client/solrj/impl/HttpClientUtil.java | 59 +-
.../solrj/impl/SolrClientCloudManager.java | 2 +-
.../solrj/impl/SolrClientNodeStateProvider.java | 126 +-
.../org/apache/solr/client/solrj/io/Lang.java | 14 +-
.../client/solrj/io/eval/CanberraEvaluator.java | 49 +
.../solrj/io/eval/ChebyshevEvaluator.java | 49 +
.../solrj/io/eval/ConvolutionEvaluator.java | 2 +-
.../client/solrj/io/eval/DistanceEvaluator.java | 118 +-
.../solrj/io/eval/EarthMoversEvaluator.java | 49 +
.../solrj/io/eval/EuclideanEvaluator.java | 49 +
.../solr/client/solrj/io/eval/FFTEvaluator.java | 73 +
.../client/solrj/io/eval/GetValueEvaluator.java | 50 +
.../client/solrj/io/eval/IFFTEvaluator.java | 71 +
.../solr/client/solrj/io/eval/KnnEvaluator.java | 45 +-
.../solrj/io/eval/ManhattanEvaluator.java | 49 +
.../client/solrj/io/eval/MemsetEvaluator.java | 167 +
.../solrj/io/eval/NormalizeEvaluator.java | 2 +-
.../client/solrj/io/eval/OnesEvaluator.java | 47 +
.../client/solrj/io/eval/PolyFitEvaluator.java | 7 +-
.../client/solrj/io/eval/RankEvaluator.java | 2 +-
.../solrj/io/eval/RecursiveEvaluator.java | 13 +
.../client/solrj/io/eval/ScaleEvaluator.java | 2 +-
.../client/solrj/io/eval/SetValueEvaluator.java | 58 +
.../client/solrj/io/eval/ZerosEvaluator.java | 47 +
.../solrj/io/graph/GatherNodesStream.java | 20 +-
.../solr/client/solrj/io/stream/EvalStream.java | 5 -
.../client/solrj/io/stream/FacetStream.java | 6 +-
.../client/solrj/io/stream/HashJoinStream.java | 12 +-
.../solr/client/solrj/io/stream/LetStream.java | 11 +-
.../solrj/io/stream/OuterHashJoinStream.java | 2 +-
.../client/solrj/io/stream/PriorityStream.java | 5 -
.../solrj/io/stream/SignificantTermsStream.java | 18 +-
.../solr/client/solrj/io/stream/SolrStream.java | 5 -
.../solr/client/solrj/io/stream/SqlStream.java | 3 +-
.../solrj/io/stream/TimeSeriesStream.java | 4 +-
.../client/solrj/io/stream/TopicStream.java | 5 -
.../client/solrj/io/stream/TupleStream.java | 5 -
.../io/stream/expr/DefaultStreamFactory.java | 2 +
.../solrj/request/AbstractUpdateRequest.java | 3 +-
.../solrj/request/CollectionAdminRequest.java | 181 +-
.../solrj/request/CollectionApiMapping.java | 4 +
.../request/ContentStreamUpdateRequest.java | 26 +-
.../request/JavaBinUpdateRequestCodec.java | 6 +-
.../solrj/request/StreamingUpdateRequest.java | 76 +
.../solr/client/solrj/request/V2Request.java | 4 +-
.../request/schema/AbstractSchemaRequest.java | 8 -
.../solrj/request/schema/SchemaRequest.java | 86 +-
.../solrj/response/AnalysisResponseBase.java | 29 +-
.../response/DocumentAnalysisResponse.java | 12 +-
.../solrj/response/FieldAnalysisResponse.java | 14 +-
.../solr/client/solrj/util/ClientUtils.java | 20 +-
.../java/org/apache/solr/common/MapWriter.java | 14 +-
.../org/apache/solr/common/SolrDocument.java | 1 -
.../apache/solr/common/SolrDocumentBase.java | 10 +
.../org/apache/solr/common/SolrException.java | 2 +-
.../apache/solr/common/SolrInputDocument.java | 8 +-
.../org/apache/solr/common/SolrInputField.java | 4 +-
.../org/apache/solr/common/cloud/Aliases.java | 6 +-
.../solr/common/cloud/ClusterProperties.java | 36 +-
.../apache/solr/common/cloud/DocCollection.java | 21 +-
.../org/apache/solr/common/cloud/Replica.java | 2 +
.../apache/solr/common/cloud/SolrZkClient.java | 33 +
.../apache/solr/common/cloud/ZkStateReader.java | 62 +-
.../common/params/CollectionAdminParams.java | 32 +-
.../solr/common/params/CommonAdminParams.java | 2 +
.../apache/solr/common/params/CommonParams.java | 11 +
.../solr/common/params/CoreAdminParams.java | 4 +-
.../common/params/QueryElevationParams.java | 9 +-
.../apache/solr/common/params/ShardParams.java | 28 +-
.../apache/solr/common/params/SolrParams.java | 22 +-
.../apache/solr/common/params/UpdateParams.java | 2 +-
.../solr/common/util/ContentStreamBase.java | 6 +-
.../apache/solr/common/util/ExecutorUtil.java | 29 +-
.../org/apache/solr/common/util/FastWriter.java | 157 +
.../solr/common/util/JsonRecordReader.java | 32 +-
.../solr/common/util/JsonSchemaValidator.java | 5 +-
.../apache/solr/common/util/JsonTextWriter.java | 499 +
.../org/apache/solr/common/util/NamedList.java | 30 +
.../apache/solr/common/util/SolrJSONWriter.java | 114 +
.../org/apache/solr/common/util/TextWriter.java | 231 +
.../org/apache/solr/common/util/TimeSource.java | 27 +
.../java/org/apache/solr/common/util/Utils.java | 54 +
.../apache/solr/common/util/WriteableValue.java | 25 +
.../java/org/apache/solr/common/util/XML.java | 98 +-
.../src/resources/apispec/cluster.Commands.json | 43 +
.../apispec/cluster.configs.Commands.json | 12 +-
.../apispec/cluster.configs.delete.json | 2 +-
.../src/resources/apispec/cluster.configs.json | 2 +-
.../resources/apispec/collections.Commands.json | 3 +-
.../collections.collection.Commands.modify.json | 4 +-
.../src/resources/apispec/metrics.history.json | 23 +
solr/solrj/src/test-files/log4j2.xml | 39 -
.../solrj/solr/collection1/conf/schema-sql.xml | 4 -
.../solrj/solr/collection1/conf/schema.xml | 4 -
.../solr/configsets/shared/conf/schema.xml | 4 -
.../solr/configsets/streaming/conf/schema.xml | 4 -
.../solrj/solr/crazy-path-to-schema.xml | 1 -
...ollectionAdminRequestRequiredParamsTest.java | 6 +-
.../solr/client/solrj/SolrExampleTests.java | 23 +-
.../solr/client/solrj/SolrExampleTestsBase.java | 2 +-
.../solrj/cloud/autoscaling/TestPolicy.java | 1613 +-
.../solrj/cloud/autoscaling/TestPolicy2.java | 291 +
.../solrj/embedded/LargeVolumeJettyTest.java | 2 +
.../client/solrj/impl/CloudSolrClientTest.java | 5 +-
.../client/solrj/impl/HttpClientUtilTest.java | 108 +
.../apache/solr/client/solrj/io/TestLang.java | 3 +-
.../solrj/io/graph/GraphExpressionTest.java | 45 +-
.../solr/client/solrj/io/graph/GraphTest.java | 1 +
.../solrj/io/stream/MathExpressionTest.java | 292 +-
.../solrj/io/stream/StreamDecoratorTest.java | 88 +
.../solrj/io/stream/StreamExpressionTest.java | 3 +-
.../io/stream/eval/NormalizeEvaluatorTest.java | 6 +-
.../client/solrj/request/TestV2Request.java | 8 +-
.../solrj/response/AnlysisResponseBaseTest.java | 13 +
.../response/DocumentAnalysisResponseTest.java | 2 +-
.../response/FieldAnalysisResponseTest.java | 2 +-
.../response/TestDelegationTokenResponse.java | 2 +-
.../apache/solr/common/SolrDocumentTest.java | 8 +-
.../cloud/TestCollectionStateWatchers.java | 10 +-
.../solr/common/params/ShardParamsTest.java | 32 +-
.../solr/common/params/SolrParamTest.java | 44 +-
.../solr/common/util/JsonValidatorTest.java | 8 +
.../apache/solr/common/util/TestFastWriter.java | 125 +
.../solr/common/util/TestJsonRecordReader.java | 10 +-
.../solr/common/util/TestNamedListCodec.java | 4 +-
.../solr/common/util/TestSolrJsonWriter.java | 60 +
.../apache/solr/common/util/TestTimeSource.java | 27 +-
.../solr/common/util/TestValidatingJsonMap.java | 2 +-
.../solr/BaseDistributedSearchTestCase.java | 17 +-
.../java/org/apache/solr/SolrTestCaseJ4.java | 27 +-
.../cloud/AbstractFullDistribZkTestBase.java | 2 +-
.../org/apache/solr/cloud/ConfigRequest.java | 55 +
.../apache/solr/cloud/MiniSolrCloudCluster.java | 6 +-
.../solr/core/MockConcurrentMergeScheduler.java | 35 +
.../apache/solr/core/MockDirectoryFactory.java | 6 +-
.../org/apache/solr/util/BaseTestHarness.java | 23 +-
.../org/apache/solr/util/SSLTestConfig.java | 89 +-
...estConfig.hostname-and-ip-missmatch.keystore | Bin 0 -> 2246 bytes
.../resources/SSLTestConfig.testing.keystore | Bin 2208 -> 2207 bytes
.../src/resources/create-keystores.sh | 37 +
solr/test-framework/src/test-files/log4j2.xml | 39 -
solr/webapp/web/css/angular/cloud.css | 275 +
solr/webapp/web/css/angular/collections.css | 4 -
solr/webapp/web/css/angular/common.css | 4 +-
solr/webapp/web/css/angular/cores.css | 8 -
solr/webapp/web/css/angular/jquery-ui.min.css | 28 +
.../web/css/angular/jquery-ui.structure.min.css | 24 +
solr/webapp/web/css/angular/menu.css | 3 +-
solr/webapp/web/index.html | 8 +-
solr/webapp/web/js/angular/controllers/cloud.js | 586 +-
.../web/js/angular/controllers/segments.js | 2 +-
solr/webapp/web/js/angular/services.js | 13 +-
solr/webapp/web/libs/jquery-ui.min.js | 30 +
solr/webapp/web/partials/cloud.html | 192 +
solr/webapp/web/partials/cores.html | 2 -
2027 files changed, 97040 insertions(+), 66897 deletions(-)
----------------------------------------------------------------------
[22/27] lucene-solr:solr7896-login-page: Merge branch 'master' into
solr7896-login-page
Posted by ja...@apache.org.
Merge branch 'master' into solr7896-login-page
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/44fa134c
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/44fa134c
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/44fa134c
Branch: refs/heads/solr7896-login-page
Commit: 44fa134c58b72d04c789202ea62805f895997359
Parents: 7c96458 49285e8
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Oct 8 12:49:11 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Oct 8 12:49:11 2018 +0200
----------------------------------------------------------------------
solr/CHANGES.txt | 14 ++-
.../org/apache/solr/cloud/ZkController.java | 3 +-
.../solr/handler/component/ExpandComponent.java | 17 ++-
.../UninvertDocValuesMergePolicyFactory.java | 5 +-
.../org/apache/solr/schema/IndexSchema.java | 53 ++++------
.../solr/search/CollapsingQParserPlugin.java | 18 ++--
.../java/org/apache/solr/search/Insanity.java | 5 +-
.../apache/solr/search/SolrIndexSearcher.java | 17 +--
.../solr/uninverting/UninvertingReader.java | 103 +++++++++++--------
.../solr/update/DeleteByQueryWrapper.java | 2 +-
.../solr/uninverting/TestUninvertingReader.java | 18 ++--
.../solrj/impl/ConcurrentUpdateSolrClient.java | 6 +-
.../org/apache/solr/common/StringUtils.java | 10 ++
...rentUpdateSolrClientMultiCollectionTest.java | 94 +++++++++++++++++
14 files changed, 237 insertions(+), 128 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/44fa134c/solr/CHANGES.txt
----------------------------------------------------------------------
[16/27] lucene-solr:solr7896-login-page: Testing new approach
Posted by ja...@apache.org.
Testing new approach
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/5bb585c3
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/5bb585c3
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/5bb585c3
Branch: refs/heads/solr7896-login-page
Commit: 5bb585c38b7ab31bd83f020ff45d58d81f16af0b
Parents: c31d8df
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Sep 24 23:33:33 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Sep 24 23:33:33 2018 +0200
----------------------------------------------------------------------
solr/webapp/templates/loginDialog.html | 30 ----
solr/webapp/templates/logoutLink.html | 1 -
.../web/css/bootstrap-3.3/bootstrap.min.css | 6 +
solr/webapp/web/css/bootstrap.min.css | 7 -
solr/webapp/web/index.html | 5 +-
solr/webapp/web/js/angular/app.js | 115 +++++++++-------
solr/webapp/web/js/angular/controllers/login.js | 36 +++++
solr/webapp/web/js/angular/directives.js | 68 ----------
.../web/js/angular/http-auth-interceptor.js | 122 -----------------
solr/webapp/web/js/angular/login-controllers.js | 37 -----
solr/webapp/web/js/angular/services.js | 136 ++++++++++++++++++-
solr/webapp/web/partials/login.html | 44 ++++++
12 files changed, 293 insertions(+), 314 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/templates/loginDialog.html
----------------------------------------------------------------------
diff --git a/solr/webapp/templates/loginDialog.html b/solr/webapp/templates/loginDialog.html
deleted file mode 100644
index a217daa..0000000
--- a/solr/webapp/templates/loginDialog.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<div class="modal fade" id="loginModal" tabindex="-1" role="dialog" aria-labelledby="loginModalLabel" aria-hidden="true" data-backdrop="static">
- <div class="modal-dialog">
- <div class="modal-content">
- <form ng-submit="submit()" name="loginCredentialsForm" role="form">
- <div class="modal-header">
- <h4 class="modal-title" id="loginModalLabel">Enter credentials</h4>
- </div>
- <div class="modal-body">
- <div class="form-horizontal">
- <div class="form-group">
- <label class="col-lg-4 control-label" for="userName">User name</label>
- <div class="col-lg-4">
- <input type="text" class="form-control" ng-model="credentials.userName" id="userName" placeholder="User name">
- </div>
- </div>
- <div class="form-group">
- <label class="col-lg-4 control-label" for="password">Password</label>
- <div class="col-lg-4">
- <input type="password" class="form-control" ng-model="credentials.password" id="password" placeholder="Password">
- </div>
- </div>
- </div>
- </div>
- <div class="modal-footer">
- <input type="submit" class="btn btn-primary" value="Log in"></input>
- </div>
- </form>
- </div>
- </div>
-</div>
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/templates/logoutLink.html
----------------------------------------------------------------------
diff --git a/solr/webapp/templates/logoutLink.html b/solr/webapp/templates/logoutLink.html
deleted file mode 100644
index 0796ed9..0000000
--- a/solr/webapp/templates/logoutLink.html
+++ /dev/null
@@ -1 +0,0 @@
-<p ng-show="isLoggedIn()" class="navbar-text navbar-right"><a href="" ng-click="logOut()">Log out</a></p>
[13/27] lucene-solr:solr7896-login-page: Testing new approach
Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index a98a30da..f36dc13 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -23,6 +23,7 @@ limitations under the License.
<link rel="icon" type="image/x-icon" href="img/favicon.ico?_=${version}">
<link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico?_=${version}">
+ <link rel="stylesheet" type="text/css" href="css/bootstrap-3.3/bootstrap.min.css?_=${version}">
<link rel="stylesheet" type="text/css" href="css/angular/common.css?_=${version}">
<link rel="stylesheet" type="text/css" href="css/angular/analysis.css?_=${version}">
<link rel="stylesheet" type="text/css" href="css/angular/cloud.css?_=${version}">
@@ -67,6 +68,7 @@ limitations under the License.
<script src="js/angular/http-auth-interceptor.js"></script>
<script src="js/angular/login-controllers.js"></script>
<script src="js/angular/controllers/index.js"></script>
+ <script src="js/angular/controllers/login.js"></script>
<script src="js/angular/controllers/logging.js"></script>
<script src="js/angular/controllers/cloud.js"></script>
<script src="js/angular/controllers/collections.js"></script>
@@ -142,7 +144,8 @@ limitations under the License.
<div>
<ul id="menu">
-
+ <li id="login" class="global" ng-class="{active:page=='login'}"><p><a href="#/login">Logout</a></p></li>
+
<li id="index" class="global" ng-class="{active:page=='index'}"><p><a href="#/">Dashboard</a></p></li>
<li id="logging" class="global" ng-class="{active:page=='logging'}"><p><a href="#/~logging">Logging</a></p>
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index fe686fe..a0bc4ab 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -31,6 +31,10 @@ solrAdminApp.config([
templateUrl: 'partials/index.html',
controller: 'IndexController'
}).
+ when('/login', {
+ templateUrl: 'partials/login.html',
+ controller: 'LoginController'
+ }).
when('/~logging', {
templateUrl: 'partials/logging.html',
controller: 'LoggingController'
@@ -369,56 +373,73 @@ solrAdminApp.config([
return {request: started, response: ended, responseError: failed};
})
-.factory('authInterceptor', function($q, $rootScope, $timeout, $injector) {
- var started = function(config) {
- var ah = "Basic c29scjpTb2xyUm9ja3M="; // solr / SolrRocks
- config.headers['Authorization'] = ah;
- console.log("Added authorization header " + ah);
- return config || $q.when(config);
- };
-
- var ended = function(response) {
- console.log("Response headers: " + JSON.stringify(response.headers, undefined, 2));
- if (response.headers['WWW-Authenticate'] != null) {
- console.log("Got WWW-Authenticate header: " + response.headers['WWW-Authenticate']);
- }
- return response || $q.when(response);
- };
-
- var failed = function(rejection) {
- console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
- if (rejection.status === 401) {
- console.log("Status code is 401");
- } else {
- console.log("Rejection status is " + rejection.status)
- }
- $rootScope.$broadcast('loadingStatusInactive');
- return $q.reject(rejection);
- };
-
- return {request: started, response: ended, responseError: failed};
-})
+// NOCOMMIT First iteration
+// .factory('authInterceptor', function($q, $rootScope, $timeout, $injector) {
+// var started = function(config) {
+// var ah = "Basic c29scjpyb2Nrcw=="; // solr / SolrRocks
+// config.headers['Authorization'] = ah;
+// console.log("Added authorization header " + ah);
+// return config || $q.when(config);
+// };
+//
+// var ended = function(response) {
+// console.log("Response headers: " + JSON.stringify(response.headers, undefined, 2));
+// if (response.headers['WWW-Authenticate'] != null) {
+// console.log("Got WWW-Authenticate header: " + response.headers['WWW-Authenticate']);
+// }
+// return response || $q.when(response);
+// };
+//
+// var failed = function(rejection) {
+// console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
+// if (rejection.status === 401) {
+// console.log("Status code is 401");
+// } else {
+// console.log("Rejection status is " + rejection.status)
+// }
+// $rootScope.$broadcast('loadingStatusInactive');
+// return $q.reject(rejection);
+// };
+//
+// return {request: started, response: ended, responseError: failed};
+// })
.config(function($httpProvider) {
$httpProvider.interceptors.push("httpInterceptor");
- $httpProvider.interceptors.push("authInterceptor");
+ // NOCOMMIT $httpProvider.interceptors.push("authInterceptor");
// Tell the BasicAuth plugin that we are Admin UI so it can serve us a 'Authorization: xBasic xxxx' header
// so that the browser will not interfer with the login dialogue
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
})
+// NOCOMMIT: just for testing
+.run(['$rootScope', '$location', '$cookieStore', '$http',
+ function ($rootScope, $location, $cookieStore, $http) {
+ // keep user logged in after page refresh
+ $rootScope.globals = $cookieStore.get('globals') || {};
+ if ($rootScope.globals.currentUser) {
+ $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
+ }
+
+ $rootScope.$on('$locationChangeStart', function (event, next, current) {
+ // redirect to login page if not logged in
+ if ($location.path() !== '/login' && !$rootScope.globals.currentUser) {
+ $location.path('/login');
+ }
+ });
+ }])
.directive('fileModel', function ($parse) {
- return {
- restrict: 'A',
- link: function(scope, element, attrs) {
- var model = $parse(attrs.fileModel);
- var modelSetter = model.assign;
+ return {
+ restrict: 'A',
+ link: function(scope, element, attrs) {
+ var model = $parse(attrs.fileModel);
+ var modelSetter = model.assign;
- element.bind('change', function(){
- scope.$apply(function(){
- modelSetter(scope, element[0].files[0]);
- });
- });
- }
- };
+ element.bind('change', function(){
+ scope.$apply(function(){
+ modelSetter(scope, element[0].files[0]);
+ });
+ });
+ }
+ };
});
solrAdminApp.controller('MainController', function($scope, $route, $rootScope, $location, Cores, Collections, System, Ping, Constants) {
@@ -432,7 +453,7 @@ solrAdminApp.controller('MainController', function($scope, $route, $rootScope, $
$scope.refresh = function() {
$scope.cores = [];
$scope.collections = [];
- }
+ };
$scope.refresh();
$scope.resetMenu = function(page, pageType) {
@@ -462,7 +483,7 @@ solrAdminApp.controller('MainController', function($scope, $route, $rootScope, $
for (key in data.collections) {
var collection = {name: data.collections[key]};
$scope.collections.push(collection);
- if (pageType == Constants.IS_COLLECTION_PAGE && collection.name == currentCollectionName) {
+ if (pageType === Constants.IS_COLLECTION_PAGE && collection.name === currentCollectionName) {
$scope.currentCollection = collection;
}
}
@@ -486,15 +507,15 @@ solrAdminApp.controller('MainController', function($scope, $route, $rootScope, $
$scope.dumpCloud = function() {
$scope.$broadcast("cloud-dump");
- }
+ };
$scope.showCore = function(core) {
$location.url("/" + core.name);
- }
+ };
$scope.showCollection = function(collection) {
$location.url("/" + collection.name + "/collection-overview")
- }
+ };
$scope.$on('$routeChangeStart', function() {
$rootScope.exceptions = {};
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/js/angular/controllers/login.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/controllers/login.js b/solr/webapp/web/js/angular/controllers/login.js
new file mode 100644
index 0000000..b0b7096
--- /dev/null
+++ b/solr/webapp/web/js/angular/controllers/login.js
@@ -0,0 +1,36 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+*/
+
+solrAdminApp.controller('LoginController',
+ ['$scope', '$rootScope', '$location', 'AuthenticationService',
+ function ($scope, $rootScope, $location, AuthenticationService) {
+ // reset login status
+ AuthenticationService.ClearCredentials();
+
+ $scope.login = function () {
+ $scope.dataLoading = true;
+ AuthenticationService.Login($scope.username, $scope.password, function (response) {
+ if (response.success) {
+ AuthenticationService.SetCredentials($scope.username, $scope.password);
+ $location.path('/');
+ } else {
+ $scope.error = response.message;
+ $scope.dataLoading = false;
+ }
+ });
+ };
+ }]);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/js/angular/directives.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/directives.js b/solr/webapp/web/js/angular/directives.js
deleted file mode 100644
index ba6e701..0000000
--- a/solr/webapp/web/js/angular/directives.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-'use strict';
-
-angular.module('loginDirectives', []).
-directive('loginDialog', function($timeout) {
- return {
- templateUrl: '/templates/loginDialog.html',
- restrict: 'E',
- replace: true,
- controller: CredentialsController,
- link: function(scope, element, attributes, controller) {
- var isShowing = false;
-
- element.on('shown.bs.modal', function(e) {
- element.find('#userName').focus();
- });
-
- scope.$on('event:auth-loginRequired', function() {
- if (isShowing) {
- return;
- }
-
- // If we're in the process of hiding the modal, we need to wait for
- // all CSS animations to complete before showing the modal again.
- // Otherwise, we might end up with an invisible modal, making the whole
- // view rather unusable. I've been unable to control the transitions
- // between "showing", "shown", "hiding", and "hidden" tightly using
- // JQuery notifications without collecting more and more modal backdrops
- // in the DOM, so the dirty solution here is to simply wait a second
- // before showing the log-in dialog.
- isShowing = true;
- $timeout(function() {
- element.modal('show');
- isShowing = false;
- }, 1000);
- });
-
- scope.$on('event:auth-loginConfirmed', function() {
- element.modal('hide');
- scope.credentials.password = '';
- });
- }
- }
-}).
-directive('logoutLink', function() {
- return {
- templateUrl: '/templates/logoutLink.html',
- restrict: 'E',
- replace: true,
- controller: LoginController
- }
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/js/angular/http-auth-interceptor.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/http-auth-interceptor.js b/solr/webapp/web/js/angular/http-auth-interceptor.js
deleted file mode 100644
index 2f34861..0000000
--- a/solr/webapp/web/js/angular/http-auth-interceptor.js
+++ /dev/null
@@ -1,122 +0,0 @@
-/*global angular:true, browser:true */
-
-/**
- * @license HTTP Auth Interceptor Module for AngularJS
- * (c) 2012 Witold Szczerba
- * License: MIT
- */
-(function () {
- 'use strict';
-
- angular.module('http-auth-interceptor', ['http-auth-interceptor-buffer'])
-
- .factory('authService', ['$rootScope','httpBuffer', function($rootScope, httpBuffer) {
- return {
- /**
- * Call this function to indicate that authentication was successfull and trigger a
- * retry of all deferred requests.
- * @param data an optional argument to pass on to $broadcast which may be useful for
- * example if you need to pass through details of the user that was logged in
- */
- loginConfirmed: function(data, configUpdater) {
- var updater = configUpdater || function(config) {return config;};
- $rootScope.$broadcast('event:auth-loginConfirmed', data);
- httpBuffer.retryAll(updater);
- },
-
- /**
- * Call this function to indicate that authentication should not proceed.
- * All deferred requests will be abandoned or rejected (if reason is provided).
- * @param data an optional argument to pass on to $broadcast.
- * @param reason if provided, the requests are rejected; abandoned otherwise.
- */
- loginCancelled: function(data, reason) {
- httpBuffer.rejectAll(reason);
- $rootScope.$broadcast('event:auth-loginCancelled', data);
- }
- };
- }])
-
- /**
- * $http interceptor.
- * On 401 response (without 'ignoreAuthModule' option) stores the request
- * and broadcasts 'event:angular-auth-loginRequired'.
- */
- .config(['$httpProvider', function($httpProvider) {
- $httpProvider.interceptors.push(['$rootScope', '$q', 'httpBuffer', function($rootScope, $q, httpBuffer) {
- return {
- responseError: function(rejection) {
- if (rejection.status === 401 && !rejection.config.ignoreAuthModule) {
- var deferred = $q.defer();
- httpBuffer.append(rejection.config, deferred);
- $rootScope.$broadcast('event:auth-loginRequired', rejection);
- return deferred.promise;
- }
- // otherwise, default behaviour
- return $q.reject(rejection);
- }
- };
- }]);
- }]);
-
- /**
- * Private module, a utility, required internally by 'http-auth-interceptor'.
- */
- angular.module('http-auth-interceptor-buffer', [])
-
- .factory('httpBuffer', ['$injector', function($injector) {
- /** Holds all the requests, so they can be re-requested in future. */
- var buffer = [];
-
- /** Service initialized later because of circular dependency problem. */
- var $http;
-
- function retryHttpRequest(config, deferred) {
- // Make room for new 'Authenticate' header value
- delete config.headers['Authorization'];
-
- function successCallback(response) {
- deferred.resolve(response);
- }
- function errorCallback(response) {
- deferred.reject(response);
- }
- $http = $http || $injector.get('$http');
- $http(config).then(successCallback, errorCallback);
- }
-
- return {
- /**
- * Appends HTTP request configuration object with deferred response attached to buffer.
- */
- append: function(config, deferred) {
- buffer.push({
- config: config,
- deferred: deferred
- });
- },
-
- /**
- * Abandon or reject (if reason provided) all the buffered requests.
- */
- rejectAll: function(reason) {
- if (reason) {
- for (var i = 0; i < buffer.length; ++i) {
- buffer[i].deferred.reject(reason);
- }
- }
- buffer = [];
- },
-
- /**
- * Retries all the buffered requests clears the buffer.
- */
- retryAll: function(updater) {
- for (var i = 0; i < buffer.length; ++i) {
- retryHttpRequest(updater(buffer[i].config), buffer[i].deferred);
- }
- buffer = [];
- }
- };
- }]);
-})();
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/js/angular/login-controllers.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/login-controllers.js b/solr/webapp/web/js/angular/login-controllers.js
deleted file mode 100644
index 819ccb3..0000000
--- a/solr/webapp/web/js/angular/login-controllers.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-'use strict';
-
-function CredentialsController($scope, loginService) {
- $scope.credentials = { userName: '', password: '' };
-
- $scope.submit = function() {
- loginService.setUserNameAndPassword($scope.credentials.userName, $scope.credentials.password);
- }
-}
-
-function LoginController($scope, $location, loginService) {
- $scope.isLoggedIn = function() {
- return loginService.isLoggedIn();
- }
-
- $scope.logOut = function() {
- loginService.logOut();
- $location.path('/about');
- }
-}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/js/angular/services.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/services.js b/solr/webapp/web/js/angular/services.js
index e3dcd3f..ffd7135 100644
--- a/solr/webapp/web/js/angular/services.js
+++ b/solr/webapp/web/js/angular/services.js
@@ -262,4 +262,138 @@ solrAdminServices.factory('System',
return $resource(':core/config', {wt: 'json', core: '@core', _:Date.now()}, {
get: {method: "GET"}
})
-}]);
+}])
+.factory('AuthenticationService',
+ ['Base64', '$http', '$cookieStore', '$rootScope', '$timeout',
+ function (Base64, $http, $cookieStore, $rootScope, $timeout) {
+ var service = {};
+
+ service.Login = function (username, password, callback) {
+
+ /* NOCOMMIT Dummy authentication for testing, uses $timeout to simulate api call
+ ----------------------------------------------*/
+ $timeout(function () {
+ var response = { success: username === 'test' && password === 'test' };
+ if (!response.success) {
+ response.message = 'Username or password is incorrect';
+ }
+ callback(response);
+ }, 1000);
+
+
+ /* Use this for real authentication
+ ----------------------------------------------*/
+ //$http.post('/api/authenticate', { username: username, password: password })
+ // .success(function (response) {
+ // callback(response);
+ // });
+
+ };
+
+ service.SetCredentials = function (username, password) {
+ var authdata = Base64.encode(username + ':' + password);
+
+ $rootScope.globals = {
+ currentUser: {
+ username: username,
+ authdata: authdata
+ }
+ };
+
+ $http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; // jshint ignore:line
+ $cookieStore.put('globals', $rootScope.globals);
+ };
+
+ service.ClearCredentials = function () {
+ $rootScope.globals = {};
+ $cookieStore.remove('globals');
+ $http.defaults.headers.common.Authorization = 'Basic ';
+ };
+
+ return service;
+ }])
+.factory('Base64', function () {
+ /* jshint ignore:start */
+
+ var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+ return {
+ encode: function (input) {
+ var output = "";
+ var chr1, chr2, chr3 = "";
+ var enc1, enc2, enc3, enc4 = "";
+ var i = 0;
+
+ do {
+ chr1 = input.charCodeAt(i++);
+ chr2 = input.charCodeAt(i++);
+ chr3 = input.charCodeAt(i++);
+
+ enc1 = chr1 >> 2;
+ enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+ enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+ enc4 = chr3 & 63;
+
+ if (isNaN(chr2)) {
+ enc3 = enc4 = 64;
+ } else if (isNaN(chr3)) {
+ enc4 = 64;
+ }
+
+ output = output +
+ keyStr.charAt(enc1) +
+ keyStr.charAt(enc2) +
+ keyStr.charAt(enc3) +
+ keyStr.charAt(enc4);
+ chr1 = chr2 = chr3 = "";
+ enc1 = enc2 = enc3 = enc4 = "";
+ } while (i < input.length);
+
+ return output;
+ },
+
+ decode: function (input) {
+ var output = "";
+ var chr1, chr2, chr3 = "";
+ var enc1, enc2, enc3, enc4 = "";
+ var i = 0;
+
+ // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
+ var base64test = /[^A-Za-z0-9\+\/\=]/g;
+ if (base64test.exec(input)) {
+ window.alert("There were invalid base64 characters in the input text.\n" +
+ "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
+ "Expect errors in decoding.");
+ }
+ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+
+ do {
+ enc1 = keyStr.indexOf(input.charAt(i++));
+ enc2 = keyStr.indexOf(input.charAt(i++));
+ enc3 = keyStr.indexOf(input.charAt(i++));
+ enc4 = keyStr.indexOf(input.charAt(i++));
+
+ chr1 = (enc1 << 2) | (enc2 >> 4);
+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+ chr3 = ((enc3 & 3) << 6) | enc4;
+
+ output = output + String.fromCharCode(chr1);
+
+ if (enc3 != 64) {
+ output = output + String.fromCharCode(chr2);
+ }
+ if (enc4 != 64) {
+ output = output + String.fromCharCode(chr3);
+ }
+
+ chr1 = chr2 = chr3 = "";
+ enc1 = enc2 = enc3 = enc4 = "";
+
+ } while (i < input.length);
+
+ return output;
+ }
+ };
+
+ /* jshint ignore:end */
+});
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/partials/login.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/partials/login.html b/solr/webapp/web/partials/login.html
new file mode 100644
index 0000000..cae1cc8
--- /dev/null
+++ b/solr/webapp/web/partials/login.html
@@ -0,0 +1,44 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+-->
+<div id="login" class="jumbotron">
+
+ <div class="col-xs-offset-2 col-xs-8">
+ <div class="alert alert-info">
+ Username: test<br />
+ Password: test
+ </div>
+ <div ng-show="error" class="alert alert-danger">{{error}}</div>
+ <form name="form" ng-submit="login()" role="form">
+ <div class="form-group">
+ <label for="username">Username</label>
+ <i class="fa fa-key"></i>
+ <input type="text" name="username" id="username" class="form-control" ng-model="username" required />
+ <span ng-show="form.username.$dirty && form.username.$error.required" class="help-block">Username is required</span>
+ </div>
+ <div class="form-group">
+ <label for="password">Password</label>
+ <i class="fa fa-lock"></i>
+ <input type="password" name="password" id="password" class="form-control" ng-model="password" required />
+ <span ng-show="form.password.$dirty && form.password.$error.required" class="help-block">Password is required</span>
+ </div>
+ <div class="form-actions">
+ <button type="submit" ng-disabled="form.$invalid || dataLoading" class="btn btn-danger">Login</button>
+ <img ng-if="dataLoading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
+ </div>
+ </form>
+ </div>
+</div>
[06/27] lucene-solr:solr7896-login-page: WIP add login page with
bootstrap
Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/css/bootstrap.min.css
----------------------------------------------------------------------
diff --git a/solr/webapp/web/css/bootstrap.min.css b/solr/webapp/web/css/bootstrap.min.css
new file mode 100644
index 0000000..c547283
--- /dev/null
+++ b/solr/webapp/web/css/bootstrap.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{paddi
ng:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!impo
rtant}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}@page{margin:2cm .5cm}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}}*,*: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.428571429;
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}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.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;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;co
lor:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .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-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-
danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.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}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizon
tal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}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;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:aft
er{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;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{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970p
x}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.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-right:15px;padding-left: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.66666666666666%}.col-x
s-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-
5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.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.66666666666666%}.col-sm-10{width:83.33333333333334%}.c
ol-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-s
m-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.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.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{wid
th:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333
%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.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.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-
7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col
-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.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.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;bord
er-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;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table
>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-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-respon
sive>.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}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:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}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}input[type="n
umber"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;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,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-inp
ut-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}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{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;font-weight:normal;vertical-align:middle;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{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{height:auto}.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,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#665
12c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-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,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.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,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.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}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .che
ckbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-use
r-select:none;user-select:none}.btn: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{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;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:#fff}.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,.b
tn-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-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:#d9
534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;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{colo
r:#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-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webk
it-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{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left: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';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.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-do
wnload: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-tex
t-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"}.gl
yphicon-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{conten
t:"\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;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px
rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding
:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left: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{right:0;left: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-grou
p .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-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-top-right-radius:0;border-bottom-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>.dropdo
wn-toggle{border-top-right-radius:0;border-bottom-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-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-grou
p-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:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.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-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-rad
ius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;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-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-gro
up-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{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{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-c
hild),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-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>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.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:hov
er,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.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.428571429;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;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-j
ustified>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{margin-bottom:5px;text-align:center}.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}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border
-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.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-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margi
n-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.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{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;pa
dding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border: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-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.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-right:15px;margin-left: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;backg
round-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:#ccc}.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{color:#555;background-colo
r:#e7e7e7}@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;backgrou
nd-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{color:#fff;background-color:#
080808}@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{padding:0 5px;color:#ccc;content:"/\00a0"}.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;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.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-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagi
nation>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.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-top-right-radius:6px;border-bottom-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-top-right-radius:3p
x;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.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;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.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:#808080}.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:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{dis
play:none}.btn .badge{position:relative;top:-1px}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;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.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-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;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{display:
block;height:auto;max-width:100%;margin-right:auto;margin-left: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:bold}.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{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.aler
t-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.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{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,2
55,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-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,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.1
5) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.
15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.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{padding-left:0;margin-bottom:20px}.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-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;cont
ent:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody: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>.ta
ble-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-c
hild,.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:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.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,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.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{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.d
ropdown .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-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{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-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}.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}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.c
lose{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.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;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;le
ft:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.too
ltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.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-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5p
x 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-co
lor:#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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin
-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;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%}.car
ousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity
<TRUNCATED>
[03/27] lucene-solr:solr7896-login-page: Revert changes in solr.in.sh
Posted by ja...@apache.org.
Revert changes in solr.in.sh
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/2ac10e44
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/2ac10e44
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/2ac10e44
Branch: refs/heads/solr7896-login-page
Commit: 2ac10e44661b521cdb308d867e04bb2cf8523898
Parents: f70371b
Author: Jan Høydahl <ja...@apache.org>
Authored: Fri Apr 20 13:03:38 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Fri Apr 20 13:03:38 2018 +0200
----------------------------------------------------------------------
solr/CHANGES.txt | 2 ++
solr/bin/solr.in.sh | 8 --------
2 files changed, 2 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2ac10e44/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 298abad..4feb537 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -99,6 +99,8 @@ New Features
* SOLR-11913: SolrJ SolrParams now implements Iterable<Map.Entry<String, String[]>> and also has a stream() method
using it for convenience. (David Smiley, Tapan Vaishnav)
+* SOLR-7896: Add a login page to Admin UI (janhoy)
+
* SOLR-11924: Added the ability to listen to changes in the set of active collections in a cloud
in the ZkStateReader, through the CloudCollectionsListener. (Houston Putman, Dennis Gove)
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2ac10e44/solr/bin/solr.in.sh
----------------------------------------------------------------------
diff --git a/solr/bin/solr.in.sh b/solr/bin/solr.in.sh
index 04ac46c..7cf6a84 100644
--- a/solr/bin/solr.in.sh
+++ b/solr/bin/solr.in.sh
@@ -171,11 +171,3 @@
#SOLR_RECOMMENDED_MAX_PROCESSES=
#SOLR_ULIMIT_CHECKS=
-
-# The following lines added by ./solr for enabling BasicAuth
-# SOLR_AUTH_TYPE="basic"
-# SOLR_AUTHENTICATION_OPTS="-Dsolr.httpclient.config=/Users/janhoy/git/lucene-solr/solr/server/solr/basicAuth.conf"
-
-# The following lines added by ./solr for enabling BasicAuth
-SOLR_AUTH_TYPE="basic"
-SOLR_AUTHENTICATION_OPTS="-Dsolr.httpclient.config=/Users/janhoy/git/lucene-solr/solr/server/solr/basicAuth.conf"
[08/27] lucene-solr:solr7896-login-page: Merge branch 'master' into
solr7896-login-page
Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4457de36/solr/CHANGES.txt
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4457de36/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
index 5f8097c,78e58d0..d5689a8
--- a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
+++ b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
@@@ -375,19 -371,7 +359,19 @@@ public class SolrDispatchFilter extend
}
}
+ AtomicReference<HttpServletRequest> wrappedRequest = new AtomicReference<>();
+ if (!authenticateRequest(request, response, wrappedRequest)) { // the response and status code have already been sent
+ return;
+ }
+ if (wrappedRequest.get() != null) {
+ request = wrappedRequest.get();
+ }
+
+ if (cores.getAuthenticationPlugin() != null) {
+ log.debug("User principal: {}", request.getUserPrincipal());
+ }
+
- HttpSolrCall call = getHttpSolrCall(closeShield(request, retry), closeShield(response, retry), retry);
+ HttpSolrCall call = getHttpSolrCall(request, response, retry);
ExecutorUtil.setServerThreadFlag(Boolean.TRUE);
try {
Action result = call.call();
@@@ -453,22 -437,11 +437,22 @@@
if (authenticationPlugin == null) {
return true;
} else {
- // /admin/info/key must be always open. see SOLR-9188
+ // /admin/info/key and /solr/ (Admin UI) must be always open. see SOLR-9188
// tests work only w/ getPathInfo
//otherwise it's just enough to have getServletPath()
- if (PublicKeyHandler.PATH.equals(request.getServletPath()) ||
- PublicKeyHandler.PATH.equals(request.getPathInfo())) return true;
+ String requestPath = request.getPathInfo();
+ if (requestPath == null)
+ requestPath = request.getServletPath();
- if (PKIAuthenticationPlugin.PATH.equals(requestPath)) {
++ if (PublicKeyHandler.PATH.equals(requestPath)) {
+ if (log.isDebugEnabled())
+ log.debug("Pass through PKI authentication endpoint");
+ return true;
+ }
+ if ("/solr/".equals(requestPath) || "/".equals(requestPath)) {
+ if (log.isDebugEnabled())
+ log.debug("Pass through Admin UI entry point");
+ return true;
+ }
String header = request.getHeader(PKIAuthenticationPlugin.HEADER);
if (header != null && cores.getPkiAuthenticationPlugin() != null)
authenticationPlugin = cores.getPkiAuthenticationPlugin();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4457de36/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --cc solr/webapp/web/index.html
index 779f672,0663805..a98a30da
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@@ -58,11 -60,9 +60,12 @@@ limitations under the License
<script src="libs/ngtimeago.js"></script>
<script src="libs/highlight.js"></script>
<script src="libs/d3.js"></script>
+ <script src="libs/jquery-ui.min.js"></script>
<script src="js/angular/app.js"></script>
<script src="js/angular/services.js"></script>
+ <script src="js/angular/directives.js"></script>
+ <script src="js/angular/http-auth-interceptor.js"></script>
+ <script src="js/angular/login-controllers.js"></script>
<script src="js/angular/controllers/index.js"></script>
<script src="js/angular/controllers/logging.js"></script>
<script src="js/angular/controllers/cloud.js"></script>
[23/27] lucene-solr:solr7896-login-page: Working for basic auth
Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/libs/bootstrap.min.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/libs/bootstrap.min.js b/solr/webapp/web/libs/bootstrap.min.js
deleted file mode 100644
index 1a6258e..0000000
--- a/solr/webapp/web/libs/bootstrap.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Bootstrap v3.0.3 (http://getbootstrap.com)
- * Copyright 2013 Twitter, Inc.
- * Licensed under http://www.apache.org/licenses/LICENSE-2.0
- */
-
-if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert"
)),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b
=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.
options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this
.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeC
lass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data(
)),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.remov
eClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTra
nsitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function
(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled
")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this
.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&
!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.rem
ove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal
",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigg
er:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefau
lts();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade")
;var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a
,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transitio
n&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeo
f c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tool
tip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getConte
nt=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.of
fsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarge
t=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.
find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [d
ata-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unp
in&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/partials/login.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/partials/login.html b/solr/webapp/web/partials/login.html
index 37768cf..89dd427 100644
--- a/solr/webapp/web/partials/login.html
+++ b/solr/webapp/web/partials/login.html
@@ -14,16 +14,18 @@ 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.
-->
-<div id="login">
+<div id="login" class="clearfix">
- <div class="col-xs-offset-2 col-xs-8" ng-show="authType === 'Basic'">
+ <div ng-show="authScheme === 'Basic'">
<h1>Basic Authentication</h1>
- <p>Type: {{authType}}</p>
+ <p>Scheme: {{authScheme}}</p>
+ <p>Realm: {{authRealm}}</p>
<p>WWW-Header: {{wwwAuthHeader}}</p>
<p>Config: {{authConfig}}</p>
<p>Redirect: {{authLocation}}</p>
<p>LoggedinUser: {{authLoggedinUser}}</p>
+ <p>AuthHeader: {{authHeader}}</p>
<div ng-show="error" class="alert alert-danger">{{error}}</div>
<form name="form" ng-submit="login()" role="form" ng-show="!isLoggedIn()">
@@ -53,10 +55,10 @@ limitations under the License.
</div>
- <div class="col-xs-offset-2 col-xs-8" ng-show="authType === 'unknown'">
+ <div ng-show="authScheme === 'unknown'">
<h1>Authentication type not supported</h1>
- <p>Type: {{authType}}</p>
+ <p>Type: {{authScheme}}</p>
<p>WWW-Header: {{wwwAuthHeader}}</p>
<p>Config: {{authConfig}}</p>
<p>Redirect: {{authLocation}}</p>
[24/27] lucene-solr:solr7896-login-page: Working for basic auth
Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index 0f1478f..3729aaf 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -23,7 +23,6 @@ limitations under the License.
<link rel="icon" type="image/x-icon" href="img/favicon.ico?_=${version}">
<link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico?_=${version}">
- <!--<link rel="stylesheet" type="text/css" href="css/bootstrap-3.3/bootstrap.min.css?_=${version}">-->
<link rel="stylesheet" type="text/css" href="css/angular/common.css?_=${version}">
<link rel="stylesheet" type="text/css" href="css/angular/analysis.css?_=${version}">
<link rel="stylesheet" type="text/css" href="css/angular/cloud.css?_=${version}">
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index 3c29fc4..e7fb0b2 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -373,51 +373,41 @@ solrAdminApp.config([
return {request: started, response: ended, responseError: failed};
})
-// NOCOMMIT First iteration
+// Intercept authentication request from Solr and forward to /solr/#/login
.factory('authInterceptor', function($q, $rootScope, $location, $timeout, $injector) {
var started = function(config) {
- console.log("Request config headers: " + JSON.stringify(config.headers, undefined, 2));
- if (sessionStorage.getItem("auth.header") && !config.headers['Authorization']) {
+ if (sessionStorage.getItem("auth.header")) {
config.headers['Authorization'] = sessionStorage.getItem("auth.header");
- console.log("We have a logged in user with header " + sessionStorage.getItem("auth.username") + ", appending header " + sessionStorage.getItem("auth.header"));
- } else {
- console.log("Not adding headers. Have auth.username=" + sessionStorage.getItem("auth.username") + ", auth.header=" + sessionStorage.getItem("auth.header") + ", config.headers=" + config.headers['Authorization']);
+ console.log("Added Authorization header for user " + sessionStorage.getItem("auth.username"));
}
return config || $q.when(config);
};
var ended = function(response) {
- // console.log("Response headers: " + JSON.stringify(response.headers(), undefined, 2));
return response || $q.when(response);
};
var failed = function(rejection) {
- console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
if (rejection.status === 401) {
- console.log("Status code is 401");
var headers = rejection.headers();
- console.log("Headers are " + JSON.stringify(headers, undefined, 2));
var wwwAuthHeader = headers['www-authenticate'];
sessionStorage.setItem("auth.wwwAuthHeader", wwwAuthHeader);
var authDataHeader = headers['X-Solr-AuthData'];
if (authDataHeader !== null) {
sessionStorage.setItem("auth.config", authDataHeader);
}
- console.log("Got WWW-Authenticate header: " + wwwAuthHeader + " and X-Solr-AuthData: " + authDataHeader);
- var authType = wwwAuthHeader.split(" ")[0];
- console.log("AuthType is: " + authType);
- sessionStorage.setItem("auth.type", authType);
if ($location.path() === '/login') {
sessionStorage.setItem("auth.location", "/");
} else {
sessionStorage.setItem("auth.location", $location.path());
}
+ sessionStorage.removeItem("auth.scheme");
+ sessionStorage.removeItem("auth.realm");
sessionStorage.removeItem("auth.username");
sessionStorage.removeItem("auth.header");
- // $http.defaults.headers.common.Authorization = null;
+ console.log("Solr is asking for authentication: " + wwwAuthHeader);
$location.path('/login');
} else {
- console.log("Rejection status is " + rejection.status)
$rootScope.$broadcast('loadingStatusInactive');
return $q.reject(rejection); }
};
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/js/angular/controllers/login.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/controllers/login.js b/solr/webapp/web/js/angular/controllers/login.js
index 174a491..0c983d0 100644
--- a/solr/webapp/web/js/angular/controllers/login.js
+++ b/solr/webapp/web/js/angular/controllers/login.js
@@ -18,35 +18,127 @@
solrAdminApp.controller('LoginController',
['$scope', '$routeParams', '$rootScope', '$location', 'AuthenticationService',
function ($scope, $routeParams, $rootScope, $location, AuthenticationService) {
- var authType = sessionStorage.getItem("auth.type");
- var basicTypes = ['Basic', 'xBasic'];
- if (authType !== null && basicTypes.includes(authType)) {
- if (authType === 'xBasic') authType = 'Basic';
- $scope.authType = authType;
- } else {
- $scope.authType = 'unknown';
- }
+ // Session variables set in app.js 401 interceptor
+ var wwwAuthHeader = sessionStorage.getItem("auth.wwwAuthHeader");
+ var authDataHeader = sessionStorage.getItem("auth.config");
+ console.log("Have scheme=" + sessionStorage.getItem("auth.scheme"));
+ console.log("Have realm=" + sessionStorage.getItem("auth.realm"));
+ console.log("Have header=" + sessionStorage.getItem("auth.header"));
+ // Parse www-authenticate header
+ var m= wwwAuthHeader.match(/(\w+)\s+(.*)/);
+ var authScheme= m[1];
+ var authParams= www_auth_parse_params(m[2]);
+ if (typeof authParams === 'string' || authParams instanceof String) {
+ alert("Handle error " + authParams);
+ }
+ var realm = authParams['realm'];
+ sessionStorage.setItem("auth.realm", realm);
+ $scope.authRealm = realm;
+ // console.log("Got WWW-Authenticate header: " + wwwAuthHeader + " and X-Solr-AuthData: " + authDataHeader);
+ if (authScheme === 'Basic' || authScheme === 'xBasic') {
+ authScheme = 'Basic';
+ } else {
+ authScheme = 'unknown';
+ }
+ sessionStorage.setItem("auth.scheme", authScheme);
+
+ $scope.authScheme = sessionStorage.getItem("auth.scheme");
$scope.wwwAuthHeader = sessionStorage.getItem("auth.wwwAuthHeader");
$scope.authConfig = sessionStorage.getItem("auth.config");
$scope.authLocation = sessionStorage.getItem("auth.location");
$scope.authLoggedinUser = sessionStorage.getItem("auth.username");
$scope.authHeader = sessionStorage.getItem("auth.header");
-
+
$scope.login = function () {
AuthenticationService.SetCredentials($scope.username, $scope.password);
console.log("Redirecting back to " + $scope.authLocation);
$location.path($scope.authLocation); // Redirect to the location that caused the login prompt
};
-
+
$scope.logout = function() {
// reset login status
AuthenticationService.ClearCredentials();
console.log("Logged out user and cleared creds");
$location.path("/");
};
-
+
$scope.isLoggedIn = function() {
return (sessionStorage.getItem("auth.username") !== null);
};
- }]);
\ No newline at end of file
+ }]);
+
+// This function is copied and adapted from MIT-licensed https://github.com/randymized/www-authenticate/blob/master/lib/parsers.js
+www_auth_parse_params= function (header) {
+ // This parser will definitely fail if there is more than one challenge
+ var params = {};
+ var tok, last_tok, _i, _len, key, value;
+ var state= 0; //0: token,
+ var m= header.split(/([",=])/);
+ for (_i = 0, _len = m.length; _i < _len; _i++) {
+ last_tok= tok;
+ tok = m[_i];
+ if (!tok.length) continue;
+ switch (state) {
+ case 0: // token
+ key= tok.trim();
+ state= 1; // expect equals
+ continue;
+ case 1: // expect equals
+ if ('=' != tok) return 'Equal sign was expected after '+key;
+ state= 2;
+ continue;
+ case 2: // expect value
+ if ('"' == tok) {
+ value= '';
+ state= 3; // expect quoted
+ continue;
+ }
+ else {
+ params[key]= value= tok.trim();
+ state= 9; // expect comma or end
+ continue;
+ }
+ case 3: // handling quoted string
+ if ('"' == tok) {
+ state= 8; // end quoted
+ continue;
+ }
+ else {
+ value+= tok;
+ state= 3; // continue accumulating quoted string
+ continue;
+ }
+ case 8: // end quote encountered
+ if ('"' == tok) {
+ // double quoted
+ value+= '"';
+ state= 3; // back to quoted string
+ continue;
+ }
+ if (',' == tok) {
+ params[key]= value;
+ state= 0;
+ continue;
+ }
+ else {
+ return 'Unexpected token ('+tok+') after '+value+'"';
+ }
+ continue;
+ case 9: // expect commma
+ if (',' != tok) return 'Comma expected after '+value;
+ state= 0;
+ continue;
+ }
+ }
+ switch (state) { // terminal state
+ case 0: // Empty or ignoring terminal comma
+ case 9: // Expecting comma or end of header
+ return params;
+ case 8: // Last token was end quote
+ params[key]= value;
+ return params;
+ default:
+ return 'Unexpected end of www-authenticate value.';
+ }
+};
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/js/angular/services.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/services.js b/solr/webapp/web/js/angular/services.js
index 8f2d443..a055c4b 100644
--- a/solr/webapp/web/js/angular/services.js
+++ b/solr/webapp/web/js/angular/services.js
@@ -301,9 +301,9 @@ solrAdminServices.factory('System',
// };
//
sessionStorage.setItem('globals', $rootScope.globals);
- sessionStorage.setItem("auth.header", authdata);
+ sessionStorage.setItem("auth.header", "Basic " + authdata);
sessionStorage.setItem("auth.username", username);
- // $http.defaults.headers.common.Authorization = authdata;
+ // $http.defaults.headers.common.Authorization = "Basic " + authdata;
console.log("Stored auth data on session storage");
};
@@ -311,6 +311,8 @@ solrAdminServices.factory('System',
$rootScope.globals = {};
sessionStorage.removeItem('globals');
sessionStorage.removeItem("auth.header");
+ sessionStorage.removeItem("auth.scheme");
+ sessionStorage.removeItem("auth.realm");
sessionStorage.removeItem("auth.username");
sessionStorage.removeItem("auth.wwwAuthHeader");
// $http.defaults.headers.common.Authorization = null;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/libs/bootstrap.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/libs/bootstrap.js b/solr/webapp/web/libs/bootstrap.js
deleted file mode 100644
index 850e6e5..0000000
--- a/solr/webapp/web/libs/bootstrap.js
+++ /dev/null
@@ -1,2006 +0,0 @@
-/*!
- * Bootstrap v3.0.3 (http://getbootstrap.com)
- * Copyright 2013 Twitter, Inc.
- * Licensed under http://www.apache.org/licenses/LICENSE-2.0
- */
-
-if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") }
-
-/* ========================================================================
- * Bootstrap: transition.js v3.0.3
- * http://getbootstrap.com/javascript/#transitions
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * 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.
- * ======================================================================== */
-
-
-+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] }
- }
- }
- }
-
- // 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.0.3
- * http://getbootstrap.com/javascript/#alerts
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * 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.
- * ======================================================================== */
-
-
-+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.0.3
- * http://getbootstrap.com/javascript/#buttons
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * 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.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
- // BUTTON PUBLIC CLASS DEFINITION
- // ==============================
-
- var Button = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, Button.DEFAULTS, options)
- }
-
- 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(function () {
- state == 'loadingText' ?
- $el.addClass(d).attr(d, d) :
- $el.removeClass(d).removeAttr(d);
- }, 0)
- }
-
- Button.prototype.toggle = function () {
- var $parent = this.$element.closest('[data-toggle="buttons"]')
- var changed = true
-
- if ($parent.length) {
- var $input = this.$element.find('input')
- if ($input.prop('type') === 'radio') {
- // see if clicking on current one
- 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.0.3
- * http://getbootstrap.com/javascript/#carousel
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * 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.
- * ======================================================================== */
-
-
-+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.end) {
- 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]()
- }
-
- this.sliding = true
-
- isCycling && this.pause()
-
- var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
-
- if ($next.hasClass('active')) return
-
- 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')) {
- this.$element.trigger(e)
- if (e.isDefaultPrevented()) return
- $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(600)
- } else {
- this.$element.trigger(e)
- if (e.isDefaultPrevented()) return
- $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.0.3
- * http://getbootstrap.com/javascript/#collapse
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * 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.
- * ======================================================================== */
-
-
-+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('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) $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.0.3
- * http://getbootstrap.com/javascript/#dropdowns
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * 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.
- * ======================================================================== */
-
-
-+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
- $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
- }
-
- $parent.trigger(e = $.Event('show.bs.dropdown'))
-
- if (e.isDefaultPrevented()) return
-
- $parent
- .toggleClass('open')
- .trigger('shown.bs.dropdown')
-
- $this.focus()
- }
-
- return false
- }
-
- Dropdown.prototype.keydown = function (e) {
- if (!/(38|40|27)/.test(e.keyCode)) return
-
- var $this = $(this)
-
- e.preventDefault()
- e.stopPropagation()
-
- if ($this.is('.disabled, :disabled')) return
-
- var $parent = getParent($this)
- var isActive = $parent.hasClass('open')
-
- if (!isActive || (isActive && e.keyCode == 27)) {
- if (e.which == 27) $parent.find(toggle).focus()
- return $this.click()
- }
-
- var $items = $('[role=menu] li:not(.divider):visible a', $parent)
-
- if (!$items.length) return
-
- var index = $items.index($items.filter(':focus'))
-
- if (e.keyCode == 38 && index > 0) index-- // up
- if (e.keyCode == 40 && index < $items.length - 1) index++ // down
- if (!~index) index=0
-
- $items.eq(index).focus()
- }
-
- function clearMenus() {
- $(backdrop).remove()
- $(toggle).each(function (e) {
- var $parent = getParent($(this))
- if (!$parent.hasClass('open')) return
- $parent.trigger(e = $.Event('hide.bs.dropdown'))
- if (e.isDefaultPrevented()) return
- $parent.removeClass('open').trigger('hidden.bs.dropdown')
- })
- }
-
- function getParent($this) {
- var selector = $this.attr('data-target')
-
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
- }
-
- var $parent = selector && $(selector)
-
- return $parent && $parent.length ? $parent : $this.parent()
- }
-
-
- // DROPDOWN PLUGIN DEFINITION
- // ==========================
-
- var old = $.fn.dropdown
-
- $.fn.dropdown = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.dropdown')
-
- if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
- if (typeof option == 'string') data[option].call($this)
- })
- }
-
- $.fn.dropdown.Constructor = Dropdown
-
-
- // DROPDOWN NO CONFLICT
- // ====================
-
- $.fn.dropdown.noConflict = function () {
- $.fn.dropdown = old
- return this
- }
-
-
- // APPLY TO STANDARD DROPDOWN ELEMENTS
- // ===================================
-
- $(document)
- .on('click.bs.dropdown.data-api', clearMenus)
- .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
- .on('click.bs.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
- .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: modal.js v3.0.3
- * http://getbootstrap.com/javascript/#modals
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * 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.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
- // MODAL CLASS DEFINITION
- // ======================
-
- var Modal = function (element, options) {
- this.options = options
- this.$element = $(element)
- this.$backdrop =
- this.isShown = null
-
- if (this.options.remote) this.$element.load(this.options.remote)
- }
-
- Modal.DEFAULTS = {
- backdrop: true
- , keyboard: true
- , show: true
- }
-
- Modal.prototype.toggle = function (_relatedTarget) {
- return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
- }
-
- Modal.prototype.show = function (_relatedTarget) {
- var that = this
- var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
-
- this.$element.trigger(e)
-
- if (this.isShown || e.isDefaultPrevented()) return
-
- this.isShown = true
-
- this.escape()
-
- this.$element.on('click.dismiss.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
-
- this.backdrop(function () {
- var transition = $.support.transition && that.$element.hasClass('fade')
-
- if (!that.$element.parent().length) {
- that.$element.appendTo(document.body) // don't move modals dom position
- }
-
- that.$element.show()
-
- if (transition) {
- that.$element[0].offsetWidth // force reflow
- }
-
- that.$element
- .addClass('in')
- .attr('aria-hidden', false)
-
- that.enforceFocus()
-
- var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
-
- transition ?
- that.$element.find('.modal-dialog') // wait for modal to slide in
- .one($.support.transition.end, function () {
- that.$element.focus().trigger(e)
- })
- .emulateTransitionEnd(300) :
- that.$element.focus().trigger(e)
- })
- }
-
- Modal.prototype.hide = function (e) {
- if (e) e.preventDefault()
-
- e = $.Event('hide.bs.modal')
-
- this.$element.trigger(e)
-
- if (!this.isShown || e.isDefaultPrevented()) return
-
- this.isShown = false
-
- this.escape()
-
- $(document).off('focusin.bs.modal')
-
- this.$element
- .removeClass('in')
- .attr('aria-hidden', true)
- .off('click.dismiss.modal')
-
- $.support.transition && this.$element.hasClass('fade') ?
- this.$element
- .one($.support.transition.end, $.proxy(this.hideModal, this))
- .emulateTransitionEnd(300) :
- this.hideModal()
- }
-
- Modal.prototype.enforceFocus = function () {
- $(document)
- .off('focusin.bs.modal') // guard against infinite focus loop
- .on('focusin.bs.modal', $.proxy(function (e) {
- if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
- this.$element.focus()
- }
- }, this))
- }
-
- Modal.prototype.escape = function () {
- if (this.isShown && this.options.keyboard) {
- this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
- e.which == 27 && this.hide()
- }, this))
- } else if (!this.isShown) {
- this.$element.off('keyup.dismiss.bs.modal')
- }
- }
-
- Modal.prototype.hideModal = function () {
- var that = this
- this.$element.hide()
- this.backdrop(function () {
- that.removeBackdrop()
- that.$element.trigger('hidden.bs.modal')
- })
- }
-
- Modal.prototype.removeBackdrop = function () {
- this.$backdrop && this.$backdrop.remove()
- this.$backdrop = null
- }
-
- Modal.prototype.backdrop = function (callback) {
- var that = this
- var animate = this.$element.hasClass('fade') ? 'fade' : ''
-
- if (this.isShown && this.options.backdrop) {
- var doAnimate = $.support.transition && animate
-
- this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
- .appendTo(document.body)
-
- this.$element.on('click.dismiss.modal', $.proxy(function (e) {
- if (e.target !== e.currentTarget) return
- this.options.backdrop == 'static'
- ? this.$element[0].focus.call(this.$element[0])
- : this.hide.call(this)
- }, this))
-
- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
-
- this.$backdrop.addClass('in')
-
- if (!callback) return
-
- doAnimate ?
- this.$backdrop
- .one($.support.transition.end, callback)
- .emulateTransitionEnd(150) :
- callback()
-
- } else if (!this.isShown && this.$backdrop) {
- this.$backdrop.removeClass('in')
-
- $.support.transition && this.$element.hasClass('fade')?
- this.$backdrop
- .one($.support.transition.end, callback)
- .emulateTransitionEnd(150) :
- callback()
-
- } else if (callback) {
- callback()
- }
- }
-
-
- // MODAL PLUGIN DEFINITION
- // =======================
-
- var old = $.fn.modal
-
- $.fn.modal = function (option, _relatedTarget) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.modal')
- var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
-
- if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
- if (typeof option == 'string') data[option](_relatedTarget)
- else if (options.show) data.show(_relatedTarget)
- })
- }
-
- $.fn.modal.Constructor = Modal
-
-
- // MODAL NO CONFLICT
- // =================
-
- $.fn.modal.noConflict = function () {
- $.fn.modal = old
- return this
- }
-
-
- // MODAL DATA-API
- // ==============
-
- $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
- var $this = $(this)
- var href = $this.attr('href')
- var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
- var option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
-
- e.preventDefault()
-
- $target
- .modal(option, this)
- .one('hide', function () {
- $this.is(':visible') && $this.focus()
- })
- })
-
- $(document)
- .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
- .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tooltip.js v3.0.3
- * http://getbootstrap.com/javascript/#tooltip
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * 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.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
- // TOOLTIP PUBLIC CLASS DEFINITION
- // ===============================
-
- var Tooltip = function (element, options) {
- this.type =
- this.options =
- this.enabled =
- this.timeout =
- this.hoverState =
- this.$element = null
-
- this.init('tooltip', element, options)
- }
-
- Tooltip.DEFAULTS = {
- animation: true
- , placement: 'top'
- , selector: false
- , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
- , trigger: 'hover focus'
- , title: ''
- , delay: 0
- , html: false
- , container: false
- }
-
- Tooltip.prototype.init = function (type, element, options) {
- this.enabled = true
- this.type = type
- this.$element = $(element)
- this.options = this.getOptions(options)
-
- var triggers = this.options.trigger.split(' ')
-
- for (var i = triggers.length; i--;) {
- var trigger = triggers[i]
-
- if (trigger == 'click') {
- this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
- } else if (trigger != 'manual') {
- var eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
- var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
-
- this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
- this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
- }
- }
-
- this.options.selector ?
- (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
- this.fixTitle()
- }
-
- Tooltip.prototype.getDefaults = function () {
- return Tooltip.DEFAULTS
- }
-
- Tooltip.prototype.getOptions = function (options) {
- options = $.extend({}, this.getDefaults(), this.$element.data(), options)
-
- if (options.delay && typeof options.delay == 'number') {
- options.delay = {
- show: options.delay
- , hide: options.delay
- }
- }
-
- return options
- }
-
- Tooltip.prototype.getDelegateOptions = function () {
- var options = {}
- var defaults = this.getDefaults()
-
- this._options && $.each(this._options, function (key, value) {
- if (defaults[key] != value) options[key] = value
- })
-
- return options
- }
-
- Tooltip.prototype.enter = function (obj) {
- var self = obj instanceof this.constructor ?
- obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
-
- clearTimeout(self.timeout)
-
- self.hoverState = 'in'
-
- if (!self.options.delay || !self.options.delay.show) return self.show()
-
- self.timeout = setTimeout(function () {
- if (self.hoverState == 'in') self.show()
- }, self.options.delay.show)
- }
-
- Tooltip.prototype.leave = function (obj) {
- var self = obj instanceof this.constructor ?
- obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
-
- clearTimeout(self.timeout)
-
- self.hoverState = 'out'
-
- if (!self.options.delay || !self.options.delay.hide) return self.hide()
-
- self.timeout = setTimeout(function () {
- if (self.hoverState == 'out') self.hide()
- }, self.options.delay.hide)
- }
-
- Tooltip.prototype.show = function () {
- var e = $.Event('show.bs.'+ this.type)
-
- if (this.hasContent() && this.enabled) {
- this.$element.trigger(e)
-
- if (e.isDefaultPrevented()) return
-
- var $tip = this.tip()
-
- this.setContent()
-
- if (this.options.animation) $tip.addClass('fade')
-
- var placement = typeof this.options.placement == 'function' ?
- this.options.placement.call(this, $tip[0], this.$element[0]) :
- this.options.placement
-
- var autoToken = /\s?auto?\s?/i
- var autoPlace = autoToken.test(placement)
- if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
-
- $tip
- .detach()
- .css({ top: 0, left: 0, display: 'block' })
- .addClass(placement)
-
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
-
- var pos = this.getPosition()
- var actualWidth = $tip[0].offsetWidth
- var actualHeight = $tip[0].offsetHeight
-
- if (autoPlace) {
- var $parent = this.$element.parent()
-
- var orgPlacement = placement
- var docScroll = document.documentElement.scrollTop || document.body.scrollTop
- var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()
- var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
- var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
-
- placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
- placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
- placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
- placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
- placement
-
- $tip
- .removeClass(orgPlacement)
- .addClass(placement)
- }
-
- var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
-
- this.applyPlacement(calculatedOffset, placement)
- this.$element.trigger('shown.bs.' + this.type)
- }
- }
-
- Tooltip.prototype.applyPlacement = function(offset, placement) {
- var replace
- var $tip = this.tip()
- var width = $tip[0].offsetWidth
- var height = $tip[0].offsetHeight
-
- // manually read margins because getBoundingClientRect includes difference
- var marginTop = parseInt($tip.css('margin-top'), 10)
- var marginLeft = parseInt($tip.css('margin-left'), 10)
-
- // we must check for NaN for ie 8/9
- if (isNaN(marginTop)) marginTop = 0
- if (isNaN(marginLeft)) marginLeft = 0
-
- offset.top = offset.top + marginTop
- offset.left = offset.left + marginLeft
-
- $tip
- .offset(offset)
- .addClass('in')
-
- // check to see if placing tip in new offset caused the tip to resize itself
- var actualWidth = $tip[0].offsetWidth
- var actualHeight = $tip[0].offsetHeight
-
- if (placement == 'top' && actualHeight != height) {
- replace = true
- offset.top = offset.top + height - actualHeight
- }
-
- if (/bottom|top/.test(placement)) {
- var delta = 0
-
- if (offset.left < 0) {
- delta = offset.left * -2
- offset.left = 0
-
- $tip.offset(offset)
-
- actualWidth = $tip[0].offsetWidth
- actualHeight = $tip[0].offsetHeight
- }
-
- this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
- } else {
- this.replaceArrow(actualHeight - height, actualHeight, 'top')
- }
-
- if (replace) $tip.offset(offset)
- }
-
- Tooltip.prototype.replaceArrow = function(delta, dimension, position) {
- this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
- }
-
- Tooltip.prototype.setContent = function () {
- var $tip = this.tip()
- var title = this.getTitle()
-
- $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
- $tip.removeClass('fade in top bottom left right')
- }
-
- Tooltip.prototype.hide = function () {
- var that = this
- var $tip = this.tip()
- var e = $.Event('hide.bs.' + this.type)
-
- function complete() {
- if (that.hoverState != 'in') $tip.detach()
- }
-
- this.$element.trigger(e)
-
- if (e.isDefaultPrevented()) return
-
- $tip.removeClass('in')
-
- $.support.transition && this.$tip.hasClass('fade') ?
- $tip
- .one($.support.transition.end, complete)
- .emulateTransitionEnd(150) :
- complete()
-
- this.$element.trigger('hidden.bs.' + this.type)
-
- return this
- }
-
- Tooltip.prototype.fixTitle = function () {
- var $e = this.$element
- if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
- $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
- }
- }
-
- Tooltip.prototype.hasContent = function () {
- return this.getTitle()
- }
-
- Tooltip.prototype.getPosition = function () {
- var el = this.$element[0]
- return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
- width: el.offsetWidth
- , height: el.offsetHeight
- }, this.$element.offset())
- }
-
- Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
- return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
- placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
- placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
- /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
- }
-
- Tooltip.prototype.getTitle = function () {
- var title
- var $e = this.$element
- var o = this.options
-
- title = $e.attr('data-original-title')
- || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
-
- return title
- }
-
- Tooltip.prototype.tip = function () {
- return this.$tip = this.$tip || $(this.options.template)
- }
-
- Tooltip.prototype.arrow = function () {
- return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
- }
-
- Tooltip.prototype.validate = function () {
- if (!this.$element[0].parentNode) {
- this.hide()
- this.$element = null
- this.options = null
- }
- }
-
- Tooltip.prototype.enable = function () {
- this.enabled = true
- }
-
- Tooltip.prototype.disable = function () {
- this.enabled = false
- }
-
- Tooltip.prototype.toggleEnabled = function () {
- this.enabled = !this.enabled
- }
-
- Tooltip.prototype.toggle = function (e) {
- var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
- self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
- }
-
- Tooltip.prototype.destroy = function () {
- this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
- }
-
-
- // TOOLTIP PLUGIN DEFINITION
- // =========================
-
- var old = $.fn.tooltip
-
- $.fn.tooltip = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.tooltip')
- var options = typeof option == 'object' && option
-
- if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.tooltip.Constructor = Tooltip
-
-
- // TOOLTIP NO CONFLICT
- // ===================
-
- $.fn.tooltip.noConflict = function () {
- $.fn.tooltip = old
- return this
- }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: popover.js v3.0.3
- * http://getbootstrap.com/javascript/#popovers
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * 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.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
- // POPOVER PUBLIC CLASS DEFINITION
- // ===============================
-
- var Popover = function (element, options) {
- this.init('popover', element, options)
- }
-
- if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
-
- Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {
- placement: 'right'
- , trigger: 'click'
- , content: ''
- , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
- })
-
-
- // NOTE: POPOVER EXTENDS tooltip.js
- // ================================
-
- Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
-
- Popover.prototype.constructor = Popover
-
- Popover.prototype.getDefaults = function () {
- return Popover.DEFAULTS
- }
-
- Popover.prototype.setContent = function () {
- var $tip = this.tip()
- var title = this.getTitle()
- var content = this.getContent()
-
- $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
- $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
-
- $tip.removeClass('fade top bottom left right in')
-
- // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
- // this manually by checking the contents.
- if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
- }
-
- Popover.prototype.hasContent = function () {
- return this.getTitle() || this.getContent()
- }
-
- Popover.prototype.getContent = function () {
- var $e = this.$element
- var o = this.options
-
- return $e.attr('data-content')
- || (typeof o.content == 'function' ?
- o.content.call($e[0]) :
- o.content)
- }
-
- Popover.prototype.arrow = function () {
- return this.$arrow = this.$arrow || this.tip().find('.arrow')
- }
-
- Popover.prototype.tip = function () {
- if (!this.$tip) this.$tip = $(this.options.template)
- return this.$tip
- }
-
-
- // POPOVER PLUGIN DEFINITION
- // =========================
-
- var old = $.fn.popover
-
- $.fn.popover = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.popover')
- var options = typeof option == 'object' && option
-
- if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.popover.Constructor = Popover
-
-
- // POPOVER NO CONFLICT
- // ===================
-
- $.fn.popover.noConflict = function () {
- $.fn.popover = old
- return this
- }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: scrollspy.js v3.0.3
- * http://getbootstrap.com/javascript/#scrollspy
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * 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.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
- // SCROLLSPY CLASS DEFINITION
- // ==========================
-
- function ScrollSpy(element, options) {
- var href
- var process = $.proxy(this.process, this)
-
- this.$element = $(element).is('body') ? $(window) : $(element)
- this.$body = $('body')
- this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
- this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
- this.selector = (this.options.target
- || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
- || '') + ' .nav li > a'
- this.offsets = $([])
- this.targets = $([])
- this.activeTarget = null
-
- this.refresh()
- this.process()
- }
-
- ScrollSpy.DEFAULTS = {
- offset: 10
- }
-
- ScrollSpy.prototype.refresh = function () {
- var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
-
- this.offsets = $([])
- this.targets = $([])
-
- var self = this
- var $targets = this.$body
- .find(this.selector)
- .map(function () {
- var $el = $(this)
- var href = $el.data('target') || $el.attr('href')
- var $href = /^#\w/.test(href) && $(href)
-
- return ($href
- && $href.length
- && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
- })
- .sort(function (a, b) { return a[0] - b[0] })
- .each(function () {
- self.offsets.push(this[0])
- self.targets.push(this[1])
- })
- }
-
- ScrollSpy.prototype.process = function () {
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
- var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
- var maxScroll = scrollHeight - this.$scrollElement.height()
- var offsets = this.offsets
- var targets = this.targets
- var activeTarget = this.activeTarget
- var i
-
- if (scrollTop >= maxScroll) {
- return activeTarget != (i = targets.last()[0]) && this.activate(i)
- }
-
- for (i = offsets.length; i--;) {
- activeTarget != targets[i]
- && scrollTop >= offsets[i]
- && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
- && this.activate( targets[i] )
- }
- }
-
- ScrollSpy.prototype.activate = function (target) {
- this.activeTarget = target
-
- $(this.selector)
- .parents('.active')
- .removeClass('active')
-
- var selector = this.selector
- + '[data-target="' + target + '"],'
- + this.selector + '[href="' + target + '"]'
-
- var active = $(selector)
- .parents('li')
- .addClass('active')
-
- if (active.parent('.dropdown-menu').length) {
- active = active
- .closest('li.dropdown')
- .addClass('active')
- }
-
- active.trigger('activate.bs.scrollspy')
- }
-
-
- // SCROLLSPY PLUGIN DEFINITION
- // ===========================
-
- var old = $.fn.scrollspy
-
- $.fn.scrollspy = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.scrollspy')
- var options = typeof option == 'object' && option
-
- if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.scrollspy.Constructor = ScrollSpy
-
-
- // SCROLLSPY NO CONFLICT
- // =====================
-
- $.fn.scrollspy.noConflict = function () {
- $.fn.scrollspy = old
- return this
- }
-
-
- // SCROLLSPY DATA-API
- // ==================
-
- $(window).on('load', function () {
- $('[data-spy="scroll"]').each(function () {
- var $spy = $(this)
- $spy.scrollspy($spy.data())
- })
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tab.js v3.0.3
- * http://getbootstrap.com/javascript/#tabs
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * 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.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
- // TAB CLASS DEFINITION
- // ====================
-
- var Tab = function (element) {
- this.element = $(element)
- }
-
- Tab.prototype.show = function () {
- var $this = this.element
- var $ul = $this.closest('ul:not(.dropdown-menu)')
- var selector = $this.data('target')
-
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
- }
-
- if ($this.parent('li').hasClass('active')) return
-
- var previous = $ul.find('.active:last a')[0]
- var e = $.Event('show.bs.tab', {
- relatedTarget: previous
- })
-
- $this.trigger(e)
-
- if (e.isDefaultPrevented()) return
-
- var $target = $(selector)
-
- this.activate($this.parent('li'), $ul)
- this.activate($target, $target.parent(), function () {
- $this.trigger({
- type: 'shown.bs.tab'
- , relatedTarget: previous
- })
- })
- }
-
- Tab.prototype.activate = function (element, container, callback) {
- var $active = container.find('> .active')
- var transition = callback
- && $.support.transition
- && $active.hasClass('fade')
-
- function next() {
- $active
- .removeClass('active')
- .find('> .dropdown-menu > .active')
- .removeClass('active')
-
- element.addClass('active')
-
- if (transition) {
- element[0].offsetWidth // reflow for transition
- element.addClass('in')
- } else {
- element.removeClass('fade')
- }
-
- if (element.parent('.dropdown-menu')) {
- element.closest('li.dropdown').addClass('active')
- }
-
- callback && callback()
- }
-
- transition ?
- $active
- .one($.support.transition.end, next)
- .emulateTransitionEnd(150) :
- next()
-
- $active.removeClass('in')
- }
-
-
- // TAB PLUGIN DEFINITION
- // =====================
-
- var old = $.fn.tab
-
- $.fn.tab = function ( option ) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.tab')
-
- if (!data) $this.data('bs.tab', (data = new Tab(this)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.tab.Constructor = Tab
-
-
- // TAB NO CONFLICT
- // ===============
-
- $.fn.tab.noConflict = function () {
- $.fn.tab = old
- return this
- }
-
-
- // TAB DATA-API
- // ============
-
- $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
- e.preventDefault()
- $(this).tab('show')
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: affix.js v3.0.3
- * http://getbootstrap.com/javascript/#affix
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * 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.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
- // AFFIX CLASS DEFINITION
- // ======================
-
- var Affix = function (element, options) {
- this.options = $.extend({}, Affix.DEFAULTS, options)
- this.$window = $(window)
- .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
- .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
-
- this.$element = $(element)
- this.affixed =
- this.unpin = null
-
- this.checkPosition()
- }
-
- Affix.RESET = 'affix affix-top affix-bottom'
-
- Affix.DEFAULTS = {
- offset: 0
- }
-
- Affix.prototype.checkPositionWithEventLoop = function () {
- setTimeout($.proxy(this.checkPosition, this), 1)
- }
-
- Affix.prototype.checkPosition = function () {
- if (!this.$element.is(':visible')) return
-
- var scrollHeight = $(document).height()
- var scrollTop = this.$window.scrollTop()
- var position = this.$element.offset()
- var offset = this.options.offset
- var offsetTop = offset.top
- var offsetBottom = offset.bottom
-
- if (typeof offset != 'object') offsetBottom = offsetTop = offset
- if (typeof offsetTop == 'function') offsetTop = offset.top()
- if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
-
- var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
- offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
- offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
-
- if (this.affixed === affix) return
- if (this.unpin) this.$element.css('top', '')
-
- this.affixed = affix
- this.unpin = affix == 'bottom' ? position.top - scrollTop : null
-
- this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))
-
- if (affix == 'bottom') {
- this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })
- }
- }
-
-
- // AFFIX PLUGIN DEFINITION
- // =======================
-
- var old = $.fn.affix
-
- $.fn.affix = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.affix')
- var options = typeof option == 'object' && option
-
- if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.affix.Constructor = Affix
-
-
- // AFFIX NO CONFLICT
- // =================
-
- $.fn.affix.noConflict = function () {
- $.fn.affix = old
- return this
- }
-
-
- // AFFIX DATA-API
- // ==============
-
- $(window).on('load', function () {
- $('[data-spy="affix"]').each(function () {
- var $spy = $(this)
- var data = $spy.data()
-
- data.offset = data.offset || {}
-
- if (data.offsetBottom) data.offset.bottom = data.offsetBottom
- if (data.offsetTop) data.offset.top = data.offsetTop
-
- $spy.affix(data)
- })
- })
-
-}(jQuery);
[02/27] lucene-solr:solr7896-login-page: Hard coded authentication
with solr:solrRocks
Posted by ja...@apache.org.
Hard coded authentication with solr:solrRocks
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/f70371ba
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/f70371ba
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/f70371ba
Branch: refs/heads/solr7896-login-page
Commit: f70371bab49e3838955dbab9d2e8b85589817afe
Parents: 0fc0ff2
Author: Jan Høydahl <ja...@apache.org>
Authored: Fri Apr 20 12:36:35 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Fri Apr 20 12:36:35 2018 +0200
----------------------------------------------------------------------
.../apache/solr/security/BasicAuthPlugin.java | 35 +++++++++++++----
.../apache/solr/servlet/SolrDispatchFilter.java | 41 +++++++++++++-------
solr/webapp/web/WEB-INF/web.xml | 2 +-
solr/webapp/web/js/angular/app.js | 17 +++++---
4 files changed, 66 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f70371ba/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
index eab89e3..3533b9e 100644
--- a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
@@ -34,12 +34,13 @@ import java.util.StringTokenizer;
import com.google.common.collect.ImmutableSet;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.Header;
+import org.apache.http.HttpHeaders;
import org.apache.http.auth.BasicUserPrincipal;
import org.apache.http.message.BasicHeader;
import org.apache.solr.common.SolrException;
-import org.apache.solr.common.util.ValidatingJsonMap;
-import org.apache.solr.common.util.CommandOperation;
import org.apache.solr.common.SpecProvider;
+import org.apache.solr.common.util.CommandOperation;
+import org.apache.solr.common.util.ValidatingJsonMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -47,6 +48,7 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private AuthenticationProvider authenticationProvider;
private final static ThreadLocal<Header> authHeader = new ThreadLocal<>();
+ private static final String X_REQUESTED_WITH_HEADER = "X-Requested-With";
private boolean blockUnknown = false;
public boolean authenticate(String username, String pwd) {
@@ -94,9 +96,17 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
return provider;
}
- private void authenticationFailure(HttpServletResponse response, String message) throws IOException {
+ private void authenticationFailure(HttpServletResponse response, boolean isAjaxRequest, String message) throws IOException {
for (Map.Entry<String, String> entry : authenticationProvider.getPromptHeaders().entrySet()) {
- response.setHeader(entry.getKey(), entry.getValue());
+ String value = entry.getValue();
+ // Prevent browser from intercepting basic authentication header when reqeust from Admin UI
+ if (isAjaxRequest && HttpHeaders.WWW_AUTHENTICATE.equalsIgnoreCase(entry.getKey()) && value != null) {
+ if (value.startsWith("Basic ")) {
+ value = "x" + value;
+ log.debug("Prefixing {} header for Basic Auth with 'x' to prevent browser basic auth popup", HttpHeaders.WWW_AUTHENTICATE);
+ }
+ }
+ response.setHeader(entry.getKey(), value);
}
response.sendError(401, message);
}
@@ -108,6 +118,8 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
HttpServletResponse response = (HttpServletResponse) servletResponse;
String authHeader = request.getHeader("Authorization");
+ boolean isAjaxRequest = isAjaxRequest(request);
+
if (authHeader != null) {
BasicAuthPlugin.authHeader.set(new BasicHeader("Authorization", authHeader));
StringTokenizer st = new StringTokenizer(authHeader);
@@ -122,7 +134,7 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
String pwd = credentials.substring(p + 1).trim();
if (!authenticate(username, pwd)) {
log.debug("Bad auth credentials supplied in Authorization header");
- authenticationFailure(response, "Bad credentials");
+ authenticationFailure(response, isAjaxRequest, "Bad credentials");
} else {
HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(request) {
@Override
@@ -135,7 +147,7 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
}
} else {
- authenticationFailure(response, "Invalid authentication token");
+ authenticationFailure(response, isAjaxRequest, "Invalid authentication token");
}
} catch (UnsupportedEncodingException e) {
throw new Error("Couldn't retrieve authentication", e);
@@ -144,7 +156,7 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
}
} else {
if (blockUnknown) {
- authenticationFailure(response, "require authentication");
+ authenticationFailure(response, isAjaxRequest, "require authentication");
} else {
request.setAttribute(AuthenticationPlugin.class.getName(), authenticationProvider.getPromptHeaders());
filterChain.doFilter(request, response);
@@ -183,5 +195,12 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
public static final String BLOCK_UNKNOWN = "blockUnknown";
private static final Set<String> PROPS = ImmutableSet.of(BLOCK_UNKNOWN);
-
+ /**
+ * Check if the request is an AJAX request, i.e. from the Admin UI or other SPA front
+ * @param request the servlet request
+ * @return true if the request is AJAX request
+ */
+ private boolean isAjaxRequest(HttpServletRequest request) {
+ return "XMLHttpRequest".equalsIgnoreCase(request.getHeader(X_REQUESTED_WITH_HEADER));
+ }
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f70371ba/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
index fc0c28f..5f8097c 100644
--- a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
+++ b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
@@ -358,18 +358,6 @@ public class SolrDispatchFilter extends BaseSolrFilter {
}
}
- AtomicReference<HttpServletRequest> wrappedRequest = new AtomicReference<>();
- if (!authenticateRequest(request, response, wrappedRequest)) { // the response and status code have already been sent
- return;
- }
- if (wrappedRequest.get() != null) {
- request = wrappedRequest.get();
- }
-
- if (cores.getAuthenticationPlugin() != null) {
- log.debug("User principal: {}", request.getUserPrincipal());
- }
-
// No need to even create the HttpSolrCall object if this path is excluded.
if (excludePatterns != null) {
String requestPath = request.getServletPath();
@@ -387,6 +375,18 @@ public class SolrDispatchFilter extends BaseSolrFilter {
}
}
+ AtomicReference<HttpServletRequest> wrappedRequest = new AtomicReference<>();
+ if (!authenticateRequest(request, response, wrappedRequest)) { // the response and status code have already been sent
+ return;
+ }
+ if (wrappedRequest.get() != null) {
+ request = wrappedRequest.get();
+ }
+
+ if (cores.getAuthenticationPlugin() != null) {
+ log.debug("User principal: {}", request.getUserPrincipal());
+ }
+
HttpSolrCall call = getHttpSolrCall(closeShield(request, retry), closeShield(response, retry), retry);
ExecutorUtil.setServerThreadFlag(Boolean.TRUE);
try {
@@ -453,11 +453,22 @@ public class SolrDispatchFilter extends BaseSolrFilter {
if (authenticationPlugin == null) {
return true;
} else {
- // /admin/info/key must be always open. see SOLR-9188
+ // /admin/info/key and /solr/ (Admin UI) must be always open. see SOLR-9188
// tests work only w/ getPathInfo
//otherwise it's just enough to have getServletPath()
- if (PKIAuthenticationPlugin.PATH.equals(request.getServletPath()) ||
- PKIAuthenticationPlugin.PATH.equals(request.getPathInfo())) return true;
+ String requestPath = request.getPathInfo();
+ if (requestPath == null)
+ requestPath = request.getServletPath();
+ if (PKIAuthenticationPlugin.PATH.equals(requestPath)) {
+ if (log.isDebugEnabled())
+ log.debug("Pass through PKI authentication endpoint");
+ return true;
+ }
+ if ("/solr/".equals(requestPath) || "/".equals(requestPath)) {
+ if (log.isDebugEnabled())
+ log.debug("Pass through Admin UI entry point");
+ return true;
+ }
String header = request.getHeader(PKIAuthenticationPlugin.HEADER);
if (header != null && cores.getPkiAuthenticationPlugin() != null)
authenticationPlugin = cores.getPkiAuthenticationPlugin();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f70371ba/solr/webapp/web/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/solr/webapp/web/WEB-INF/web.xml b/solr/webapp/web/WEB-INF/web.xml
index 8d86269..22082c8 100644
--- a/solr/webapp/web/WEB-INF/web.xml
+++ b/solr/webapp/web/WEB-INF/web.xml
@@ -56,7 +56,7 @@
-->
<init-param>
<param-name>excludePatterns</param-name>
- <param-value>/partials/.+,/libs/.+,/css/.+,/js/.+,/img/.+,/tpl/.+</param-value>
+ <param-value>/partials/.+,/libs/.+,/css/.+,/js/.+,/img/.+</param-value>
</init-param>
</filter>
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f70371ba/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index ee420d3..3a2009a 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -371,21 +371,25 @@ solrAdminApp.config([
})
.factory('authInterceptor', function($q, $rootScope, $timeout, $injector) {
var started = function(config) {
- config.headers['Authorization'] = "Basic c29scjpTb2xyUm9ja3M="; // solr / solrRocks
- console.log("Added authorization header");
+ var ah = "Basic c29scjpzb2xyUm9ja3M="; // solr / solrRocks
+ config.headers['Authorization'] = ah;
+ console.log("Added authorization header " + ah);
return config || $q.when(config);
};
var ended = function(response) {
+ console.log("Response headers: " + JSON.stringify(response.headers, undefined, 2));
if (response.headers['WWW-Authenticate'] != null) {
- console.log("Got WWW-Authenticate header");
- alert("WWW-Authenticate: " + response.headers['WWW-Authenticate']);
+ console.log("Got WWW-Authenticate header: " + response.headers['WWW-Authenticate']);
}
return response || $q.when(response);
};
var failed = function(rejection) {
- console.log("Failed with rejection " + rejection);
+ console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
+ if (rejection.status === 401) {
+ console.log("Status code is 401");
+ }
$rootScope.$broadcast('loadingStatusInactive');
return $q.reject(rejection);
};
@@ -395,6 +399,9 @@ solrAdminApp.config([
.config(function($httpProvider) {
$httpProvider.interceptors.push("httpInterceptor");
$httpProvider.interceptors.push("authInterceptor");
+ // Tell the BasicAuth plugin that we are Admin UI so it can serve us a 'Authorization: xBasic xxxx' header
+ // so that the browser will not intercept the login dialogue
+ $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
})
.directive('fileModel', function ($parse) {
return {
[15/27] lucene-solr:solr7896-login-page: Testing new approach
Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css
----------------------------------------------------------------------
diff --git a/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css b/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css
new file mode 100644
index 0000000..ed3905e
--- /dev/null
+++ b/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;fo
nt-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}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{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;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-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:
auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!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:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px so
lid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.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:bef
ore{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:b
efore{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:befo
re{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{con
tent:"\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-bu
llhorn: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{co
ntent:"\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"}.gly
phicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}
.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\
e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hambu
rger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon
-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6
px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.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;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weigh
t:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,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,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-c
apitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px
;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height
:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#3
33;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;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{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{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{rig
ht:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6
{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{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.33
333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offs
et-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-
push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.666666
67%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667
%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{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>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;di
splay:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{bac
kground-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>t
d,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin
-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr
>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{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[ty
pe=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.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-p
laceholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-g
roup-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disable
d],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .f
orm-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-con
trol-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{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;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color
:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{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;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error
.radio-inline label{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;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-
inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-ali
gn:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-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;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-def
ault:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggl
e.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;bo
rder-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.b
tn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;
border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning
:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-dang
er.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm
{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;wid
th:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{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;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;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)}.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:focus,.dropdown-menu>li>a:hover{color:#262626;text-deco
ration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bott
om:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last
-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.b
tn-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-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-chi
ld){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle
=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.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}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn: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=checkbox],.input-group-addon input[type=radio]{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-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-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:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:no
t(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-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:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-dec
oration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.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-ta
bs.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:focus,.nav-tabs.nav-justified>.active>a:hover{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:focus,.nav-tabs.nav-justified>.active>a:hover{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:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.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:focus,.nav-tabs-justified>.active>a:hover{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:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-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{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent
;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;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-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.
container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{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-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{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;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;bord
er-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;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15
px;margin-bottom:8px;margin-left:-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)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .rad
io label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left
;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{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:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd
}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{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:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:f
ocus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>
.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{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:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .na
vbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color
:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pag
ination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3p
x;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.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:focus,.pager li>a:hover{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:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.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}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{posit
ion:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-
1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;paddin
g:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9ed
f7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.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}}@-o-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{height:20px;margin-bottom:20px;overflow:hidden;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:ce
nter;background-color:#337ab7;-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;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.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:-o-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);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:prog
ress-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:-o-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-i
mage:-o-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:-o-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-dang
er{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:-o-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{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{ver
tical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.l
<TRUNCATED>
[18/27] lucene-solr:solr7896-login-page: Merge branch 'master' into
solr7896-login-page
Posted by ja...@apache.org.
Merge branch 'master' into solr7896-login-page
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/ae8a7e3c
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/ae8a7e3c
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/ae8a7e3c
Branch: refs/heads/solr7896-login-page
Commit: ae8a7e3c2e9c110474960aa82f6ef2044e8aced1
Parents: 90dcf6e 86e0040
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Oct 1 15:19:04 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Oct 1 15:19:04 2018 +0200
----------------------------------------------------------------------
dev-tools/scripts/prep-solr-ref-guide-rc.sh | 4 +-
dev-tools/scripts/smokeTestRelease.py | 13 +-
lucene/CHANGES.txt | 5 +
lucene/common-build.xml | 1 -
.../org/apache/lucene/index/IndexWriter.java | 27 +-
.../org/apache/lucene/index/MergeState.java | 44 +-
.../apache/lucene/search/TermInSetQuery.java | 2 +-
.../apache/lucene/index/TestIndexSorting.java | 49 +-
.../document/BaseLatLonShapeTestCase.java | 2 +-
.../document/TestLatLonPolygonShapeQueries.java | 8 +-
solr/CHANGES.txt | 17 +
.../extraction/ExtractingRequestHandler.java | 33 +-
.../handler/extraction/ExtractionDateUtil.java | 178 -----
.../handler/extraction/SolrContentHandler.java | 41 +-
.../extraction/SolrContentHandlerFactory.java | 10 +-
.../ExtractingRequestHandlerTest.java | 6 +-
.../extraction/TestExtractionDateUtil.java | 62 --
.../org/apache/solr/cloud/RecoveryStrategy.java | 206 +++---
.../org/apache/solr/cloud/ZkShardTerms.java | 8 +-
.../cloud/api/collections/AddReplicaCmd.java | 45 +-
.../solr/cloud/api/collections/Assign.java | 362 ++++++----
.../api/collections/CreateCollectionCmd.java | 34 +-
.../cloud/api/collections/ReplaceNodeCmd.java | 33 +-
.../solr/cloud/api/collections/RestoreCmd.java | 16 +-
.../cloud/api/collections/SplitShardCmd.java | 17 +-
.../cloud/autoscaling/ComputePlanAction.java | 8 +-
.../cloud/autoscaling/IndexSizeTrigger.java | 12 +-
.../solr/cloud/overseer/ReplicaMutator.java | 4 +-
.../java/org/apache/solr/core/SolrConfig.java | 2 +-
.../solr/handler/admin/MetricsHandler.java | 4 +-
.../handler/admin/MetricsHistoryHandler.java | 4 +-
.../apache/solr/metrics/SolrMetricManager.java | 67 +-
.../metrics/reporters/SolrSlf4jReporter.java | 4 +-
.../reporters/solr/SolrClusterReporter.java | 8 +-
.../solr/search/ExtendedDismaxQParser.java | 89 ++-
.../configsets/_default/conf/managed-schema | 8 +-
.../configsets/_default/conf/solrconfig.xml | 1 -
.../org/apache/solr/cloud/AddReplicaTest.java | 10 +-
.../org/apache/solr/cloud/CloudTestUtils.java | 6 +-
.../solr/cloud/CollectionsAPISolrJTest.java | 13 +-
.../org/apache/solr/cloud/ZkShardTermsTest.java | 14 +-
.../CollectionTooManyReplicasTest.java | 8 +-
.../cloud/autoscaling/IndexSizeTriggerTest.java | 10 +-
.../solr/cloud/autoscaling/TestPolicyCloud.java | 1 +
.../cloud/autoscaling/sim/SimCloudManager.java | 66 +-
.../sim/SimClusterStateProvider.java | 706 ++++++++++++++-----
.../autoscaling/sim/SimDistribStateManager.java | 7 +
.../autoscaling/sim/SimNodeStateProvider.java | 21 +-
.../sim/TestSimExecutePlanAction.java | 4 +-
.../autoscaling/sim/TestSimExtremeIndexing.java | 163 +++++
.../autoscaling/sim/TestSimNodeLostTrigger.java | 2 +-
.../autoscaling/sim/TestSimPolicyCloud.java | 11 +-
.../sim/TestSimTriggerIntegration.java | 8 +-
.../solr/metrics/SolrMetricManagerTest.java | 14 -
.../solr/search/TestExtendedDismaxParser.java | 33 +-
.../configsets/_default/conf/managed-schema | 8 +-
.../configsets/_default/conf/solrconfig.xml | 1 -
solr/solr-ref-guide/src/meta-docs/publish.adoc | 7 +-
...g-data-with-solr-cell-using-apache-tika.adoc | 111 +--
.../cloud/autoscaling/FreeDiskVariable.java | 12 +-
.../client/solrj/cloud/autoscaling/Policy.java | 35 +-
.../solrj/cloud/autoscaling/PolicyHelper.java | 91 ++-
.../solrj/cloud/autoscaling/ReplicaInfo.java | 4 +-
.../client/solrj/cloud/autoscaling/Row.java | 2 +-
.../solrj/cloud/autoscaling/Suggester.java | 2 +-
.../solrj/cloud/autoscaling/Suggestion.java | 5 +
.../org/apache/solr/client/solrj/io/Lang.java | 5 +
.../solrj/io/eval/ConvexHullEvaluator.java | 62 ++
.../client/solrj/io/eval/GetAreaEvaluator.java | 43 ++
.../solrj/io/eval/GetBaryCenterEvaluator.java | 50 ++
.../solrj/io/eval/GetBoundarySizeEvaluator.java | 43 ++
.../solrj/io/eval/GetVerticesEvaluator.java | 51 ++
.../solr/common/ConditionalMapWriter.java | 2 +-
.../org/apache/solr/common/IteratorWriter.java | 9 +
.../java/org/apache/solr/common/MapWriter.java | 30 +
.../solr/common/cloud/ReplicaPosition.java | 2 +-
.../org/apache/solr/common/util/NamedList.java | 10 +-
.../java/org/apache/solr/common/util/Utils.java | 78 +-
.../collections.collection.Commands.json | 3 +-
.../testMoveReplicasInMultipleCollections.json | 88 +++
.../autoscaling/testSuggestionsRebalance2.json | 130 ++++
.../testSuggestionsRebalanceOnly.json | 105 +++
.../solrj/cloud/autoscaling/TestPolicy.java | 206 ++----
.../solrj/cloud/autoscaling/TestPolicy2.java | 45 +-
.../apache/solr/client/solrj/io/TestLang.java | 3 +-
.../solrj/io/stream/MathExpressionTest.java | 71 ++
86 files changed, 2549 insertions(+), 1296 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ae8a7e3c/solr/CHANGES.txt
----------------------------------------------------------------------
[20/27] lucene-solr:solr7896-login-page: New iteration. Intercepts
WWW-authenticate header and allows separate screens per type WORK IN PROGRESS
Posted by ja...@apache.org.
New iteration. Intercepts WWW-authenticate header and allows separate screens per type
WORK IN PROGRESS
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/9012e40a
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/9012e40a
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/9012e40a
Branch: refs/heads/solr7896-login-page
Commit: 9012e40a5c2afd8bd8f482ea208d255da1af6e76
Parents: 9ee3506
Author: Jan Høydahl <ja...@apache.org>
Authored: Fri Oct 5 16:41:25 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Fri Oct 5 16:41:25 2018 +0200
----------------------------------------------------------------------
.../apache/solr/security/BasicAuthPlugin.java | 6 +
solr/webapp/web/index.html | 5 +-
solr/webapp/web/js/angular/app.js | 117 +++++++++++--------
solr/webapp/web/js/angular/controllers/login.js | 38 ++++--
solr/webapp/web/js/angular/services.js | 22 +++-
solr/webapp/web/partials/login.html | 33 +++++-
6 files changed, 151 insertions(+), 70 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9012e40a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
index 3533b9e..597df7c 100644
--- a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
@@ -108,6 +108,12 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
}
response.setHeader(entry.getKey(), value);
}
+ // NOCOMMIT - which headers to set?
+ // Need to explicitly allow Admin UI to read these headers from the 401 response
+// response.setHeader("Access-Control-Expose-Headers", "WWW-Authenticate, X-Solr-AuthData");
+// response.setHeader("Access-Control-Allow-Origin", "*");
+// response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
+// response.setHeader("Access-Control-Max-Age", "3600");
response.sendError(401, message);
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9012e40a/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index d832155..4b83533 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -64,9 +64,6 @@ limitations under the License.
<script src="libs/jquery-ui.min.js"></script>
<script src="js/angular/app.js"></script>
<script src="js/angular/services.js"></script>
- <script src="js/angular/directives.js"></script>
- <script src="js/angular/http-auth-interceptor.js"></script>
- <script src="js/angular/login-controllers.js"></script>
<script src="js/angular/controllers/index.js"></script>
<script src="js/angular/controllers/login.js"></script>
<script src="js/angular/controllers/logging.js"></script>
@@ -144,7 +141,7 @@ limitations under the License.
<div>
<ul id="menu">
- <li id="login" class="global" ng-class="{active:page=='login'}"><p><a href="#/login">Logout</a></p></li>
+ <li id="login" class="global" ng-class="{active:page=='login'}"><p><a href="#/login">Logout {{username}}</a></p></li>
<li id="index" class="global" ng-class="{active:page=='index'}"><p><a href="#/">Dashboard</a></p></li>
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9012e40a/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index 71dd98b..36dd07c 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -369,66 +369,85 @@ solrAdminApp.config([
$rootScope.exceptions[rejection.config.url] = rejection.data.error;
}
return $q.reject(rejection);
- }
+ };
return {request: started, response: ended, responseError: failed};
})
// NOCOMMIT First iteration
-// .factory('authInterceptor', function($q, $rootScope, $timeout, $injector) {
-// var started = function(config) {
-// var ah = "Basic c29scjpyb2Nrcw=="; // solr / SolrRocks
-// config.headers['Authorization'] = ah;
-// console.log("Added authorization header " + ah);
-// return config || $q.when(config);
-// };
-//
-// var ended = function(response) {
-// console.log("Response headers: " + JSON.stringify(response.headers, undefined, 2));
-// if (response.headers['WWW-Authenticate'] != null) {
-// console.log("Got WWW-Authenticate header: " + response.headers['WWW-Authenticate']);
-// }
-// return response || $q.when(response);
-// };
-//
-// var failed = function(rejection) {
-// console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
-// if (rejection.status === 401) {
-// console.log("Status code is 401");
-// } else {
-// console.log("Rejection status is " + rejection.status)
-// }
-// $rootScope.$broadcast('loadingStatusInactive');
-// return $q.reject(rejection);
-// };
-//
-// return {request: started, response: ended, responseError: failed};
-// })
+.factory('authInterceptor', function($q, $rootScope, $location, $timeout, $injector) {
+ var started = function(config) {
+ console.log("Request config: " + JSON.stringify(config, undefined, 2));
+ // var ah = "Basic c29scjpyb2Nrcw=="; // solr / SolrRocks
+ // config.headers['Authorization'] = ah;
+ // console.log("Added authorization header " + ah);
+ if (sessionStorage.getItem("auth.header") !== null) {
+ if (config.headers['Authorization'] === null) {
+ config.headers['Authorization'] = sessionStorage.getItem("auth.header");
+ console.log("We have a logged in user with header " + sessionStorage.getItem("auth.username") + ", appending header");
+ }
+ }
+ return config || $q.when(config);
+ };
+
+ var ended = function(response) {
+ console.log("Response headers: " + JSON.stringify(response.headers(), undefined, 2));
+ return response || $q.when(response);
+ };
+
+ var failed = function(rejection) {
+ console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
+ if (rejection.status === 401) {
+ console.log("Status code is 401");
+ var headers = rejection.headers();
+ console.log("Headers are " + JSON.stringify(headers, undefined, 2));
+ var wwwAuthHeader = headers['www-authenticate'];
+ sessionStorage.setItem("auth.wwwAuthHeader", wwwAuthHeader);
+ var authDataHeader = headers['X-Solr-AuthData'];
+ if (authDataHeader !== null) {
+ sessionStorage.setItem("auth.config", authDataHeader);
+ }
+ console.log("Got WWW-Authenticate header: " + wwwAuthHeader + " and X-Solr-AuthData: " + authDataHeader);
+ var authType = wwwAuthHeader.split(" ")[0];
+ console.log("AuthType is: " + authType);
+ sessionStorage.setItem("auth.type", authType);
+ sessionStorage.setItem("auth.location", $location.path());
+ sessionStorage.removeItem("auth.username");
+ sessionStorage.removeItem("auth.header");
+ $location.path('/login');
+ } else {
+ console.log("Rejection status is " + rejection.status)
+ }
+ $rootScope.$broadcast('loadingStatusInactive');
+ return $q.reject(rejection);
+ };
+
+ return {request: started, response: ended, responseError: failed};
+})
.config(function($httpProvider) {
$httpProvider.interceptors.push("httpInterceptor");
- // NOCOMMIT $httpProvider.interceptors.push("authInterceptor");
- // Tell the BasicAuth plugin that we are Admin UI so it can serve us a 'Authorization: xBasic xxxx' header
- // so that the browser will not interfer with the login dialogue
+ $httpProvider.interceptors.push("authInterceptor");
+ // Force BasicAuth plugin to serve us a 'Authorization: xBasic xxxx' header so browser will not pop up login dialogue
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
})
// NOCOMMIT: just for testing
-.run(['$rootScope', '$location', '$cookieStore', '$http',
- function ($rootScope, $location, $cookieStore, $http) {
- // keep user logged in after page refresh
- // Replace with interceptor
- $rootScope.globals = $cookieStore.get('globals') || {};
- if ($rootScope.globals.currentUser) {
- $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
- }
-
- $rootScope.$on('$locationChangeStart', function (event, next, current) {
- // redirect to login page if not logged in
- if ($location.path() !== '/login' && !$rootScope.globals.currentUser) {
- $location.path('/login');
- }
- });
- }])
+// .run(['$rootScope', '$location', '$cookieStore', '$http',
+// function ($rootScope, $location, $cookieStore, $http) {
+// // keep user logged in after page refresh
+// // Replace with interceptor
+// $rootScope.globals = $cookieStore.get('globals') || {};
+// if ($rootScope.globals.currentUser) {
+// $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
+// }
+//
+// // $rootScope.$on('$locationChangeStart', function (event, next, current) {
+// // // redirect to login page if not logged in
+// // if ($location.path() !== '/login' && !$rootScope.globals.currentUser) {
+// // $location.path('/login');
+// // }
+// // });
+// }])
.directive('fileModel', function ($parse) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9012e40a/solr/webapp/web/js/angular/controllers/login.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/controllers/login.js b/solr/webapp/web/js/angular/controllers/login.js
index 653ca14..a67119c8 100644
--- a/solr/webapp/web/js/angular/controllers/login.js
+++ b/solr/webapp/web/js/angular/controllers/login.js
@@ -16,15 +16,28 @@
*/
solrAdminApp.controller('LoginController',
- ['$scope', '$rootScope', '$location', 'AuthenticationService',
- function ($scope, $rootScope, $location, AuthenticationService) {
- // reset login status
- AuthenticationService.ClearCredentials();
-
+ ['$scope', '$routeParams', '$rootScope', '$location', 'AuthenticationService',
+ function ($scope, $routeParams, $rootScope, $location, AuthenticationService) {
+ var authType = sessionStorage.getItem("auth.type");
+ var basicTypes = ['Basic', 'xBasic'];
+ if (authType !== null && basicTypes.includes(authType)) {
+ if (authType === 'xBasic') authType = 'Basic';
+ $scope.authType = authType;
+ } else {
+ $scope.authType = 'unknown';
+ }
+
+ $scope.wwwAuthHeader = sessionStorage.getItem("auth.wwwAuthHeader");
+ $scope.authConfig = sessionStorage.getItem("auth.config");
+ $scope.authLocation = sessionStorage.getItem("auth.location");
+ $scope.authLoggedinUser = sessionStorage.getItem("auth.username");
+ $scope.authHeader = sessionStorage.getItem("auth.header");
+
$scope.login = function () {
- $scope.dataLoading = true;
AuthenticationService.SetCredentials($scope.username, $scope.password);
- $location.path('/');
+ console.log("Redirecting back to " + $scope.authLocation);
+ $location.path($scope.authLocation); // Redirect to the location that caused the login prompt
+
// TODO: "login" by hitting the failing URL again
// AuthenticationService.Login($scope.username, $scope.password, function (response) {
// if (response.success) {
@@ -36,4 +49,15 @@ solrAdminApp.controller('LoginController',
// }
// });
};
+
+ $scope.logout = function() {
+ // reset login status
+ AuthenticationService.ClearCredentials();
+ console.log("Logged out user and cleared creds");
+ $location.path("/");
+ };
+
+ $scope.isLoggedIn = function() {
+ return (sessionStorage.getItem("auth.username") !== null);
+ };
}]);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9012e40a/solr/webapp/web/js/angular/services.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/services.js b/solr/webapp/web/js/angular/services.js
index b6df864..323bc8e 100644
--- a/solr/webapp/web/js/angular/services.js
+++ b/solr/webapp/web/js/angular/services.js
@@ -264,8 +264,8 @@ solrAdminServices.factory('System',
})
}])
.factory('AuthenticationService',
- ['Base64', '$http', '$cookieStore', '$rootScope', '$timeout',
- function (Base64, $http, $cookieStore, $rootScope, $timeout) {
+ ['Base64', '$http', '$rootScope', '$timeout',
+ function (Base64, $http, $rootScope, $timeout) {
var service = {};
service.Login = function (username, password, callback) {
@@ -293,6 +293,9 @@ solrAdminServices.factory('System',
service.SetCredentials = function (username, password) {
var authdata = Base64.encode(username + ':' + password);
+ sessionStorage.setItem("auth.username", username);
+ $rootScope.username = username;
+
$rootScope.globals = {
currentUser: {
username: username,
@@ -300,14 +303,21 @@ solrAdminServices.factory('System',
}
};
- $http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; // jshint ignore:line
- $cookieStore.put('globals', $rootScope.globals);
+ // $http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; // jshint ignore:line
+ $http.defaults.headers.common.Authorization = 'Basic ' + authdata;
+ // sessionStorage.setItem('globals', $rootScope.globals);
+ sessionStorage.setItem("auth.header", authdata);
+ console.log("Stored auth data on session storage");
};
service.ClearCredentials = function () {
$rootScope.globals = {};
- $cookieStore.remove('globals');
- $http.defaults.headers.common.Authorization = 'Basic ';
+ // sessionStorage.removeItem('globals');
+ sessionStorage.removeItem("auth.header");
+ sessionStorage.removeItem("auth.username");
+ sessionStorage.removeItem("auth.wwwAuthHeader");
+ $http.defaults.headers.common.Authorization = null;
+ console.log("Cleared stored auth data");
};
return service;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9012e40a/solr/webapp/web/partials/login.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/partials/login.html b/solr/webapp/web/partials/login.html
index 65be563..37768cf 100644
--- a/solr/webapp/web/partials/login.html
+++ b/solr/webapp/web/partials/login.html
@@ -15,12 +15,18 @@ See the License for the specific language governing permissions and
limitations under the License.
-->
<div id="login">
- <div class="col-xs-offset-2 col-xs-8">
- <h1>Please log in</h1>
- Basic Authentication
+
+ <div class="col-xs-offset-2 col-xs-8" ng-show="authType === 'Basic'">
+ <h1>Basic Authentication</h1>
+ <p>Type: {{authType}}</p>
+ <p>WWW-Header: {{wwwAuthHeader}}</p>
+ <p>Config: {{authConfig}}</p>
+ <p>Redirect: {{authLocation}}</p>
+ <p>LoggedinUser: {{authLoggedinUser}}</p>
+
<div ng-show="error" class="alert alert-danger">{{error}}</div>
- <form name="form" ng-submit="login()" role="form">
+ <form name="form" ng-submit="login()" role="form" ng-show="!isLoggedIn()">
<div class="form-group">
<label for="username">Username</label>
<i class="fa fa-key"></i>
@@ -38,5 +44,24 @@ limitations under the License.
<img ng-if="dataLoading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
</div>
</form>
+ <form name="logoutForm" ng-submit="logout()" role="form" ng-show="isLoggedIn()">
+ <div class="form-actions">
+ <button type="submit" class="btn btn-danger">Logout</button>
+ </div>
+ </form>
+
+ </div>
+
+
+ <div class="col-xs-offset-2 col-xs-8" ng-show="authType === 'unknown'">
+ <h1>Authentication type not supported</h1>
+
+ <p>Type: {{authType}}</p>
+ <p>WWW-Header: {{wwwAuthHeader}}</p>
+ <p>Config: {{authConfig}}</p>
+ <p>Redirect: {{authLocation}}</p>
+ <p>LoggedinUser: {{authLoggedinUser}}</p>
+
+ You cannot use Solr's Admin UI for this operation. Please use another client that supports this type.
</div>
</div>
[19/27] lucene-solr:solr7896-login-page: Merge branch 'master' into
solr7896-login-page
Posted by ja...@apache.org.
Merge branch 'master' into solr7896-login-page
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/9ee35061
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/9ee35061
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/9ee35061
Branch: refs/heads/solr7896-login-page
Commit: 9ee3506194f7109eb31220e2b4e3a2456afdf12d
Parents: ae8a7e3 98b057c
Author: Jan Høydahl <ja...@apache.org>
Authored: Fri Oct 5 11:22:36 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Fri Oct 5 11:22:36 2018 +0200
----------------------------------------------------------------------
lucene/CHANGES.txt | 10 +-
.../benchmark/byTask/TestPerfTasksLogic.java | 9 +-
.../codecs/perfield/PerFieldPostingsFormat.java | 14 +-
.../org/apache/lucene/index/MultiFields.java | 68 +-----
.../org/apache/lucene/util/QueryBuilder.java | 10 +
.../lucene/index/TestDirectoryReader.java | 11 +-
.../org/apache/lucene/index/TestDocCount.java | 6 +-
.../lucene/index/TestIndexWriterMaxDocs.java | 5 +-
.../index/TestParallelCompositeReader.java | 27 +--
.../apache/lucene/index/TestSegmentReader.java | 4 +-
.../lucene/index/TestStressIndexing2.java | 26 +-
.../org/apache/lucene/index/TestSumDocFreq.java | 7 +-
.../apache/lucene/util/TestQueryBuilder.java | 28 +++
.../memory/TestMemoryIndexAgainstRAMDir.java | 2 +-
.../org/apache/lucene/misc/HighFreqTerms.java | 20 +-
.../index/BaseIndexFileFormatTestCase.java | 22 +-
.../org/apache/lucene/util/LuceneTestCase.java | 67 +++--
solr/CHANGES.txt | 43 ++++
.../java/org/apache/solr/cloud/CloudUtil.java | 48 +++-
.../solr/cloud/api/collections/Assign.java | 3 +-
.../api/collections/CreateCollectionCmd.java | 4 +-
.../cloud/autoscaling/IndexSizeTrigger.java | 34 ++-
.../solr/handler/admin/CollectionsHandler.java | 10 +-
.../solr/index/SlowCompositeReaderWrapper.java | 46 ++--
.../apache/solr/update/SolrCmdDistributor.java | 8 +-
.../processor/DistributedUpdateProcessor.java | 106 +++-----
.../ParseDateFieldUpdateProcessorFactory.java | 28 ++-
.../org/apache/solr/cloud/CloudTestUtils.java | 4 +-
.../solr/cloud/CollectionsAPISolrJTest.java | 138 ++++++++++-
.../apache/solr/cloud/HttpPartitionTest.java | 103 +-------
.../apache/solr/cloud/MoveReplicaHDFSTest.java | 6 +
.../solr/cloud/ReplicationFactorTest.java | 61 +++--
.../org/apache/solr/cloud/TestCryptoKeys.java | 13 +-
.../solr/cloud/autoscaling/CapturedEvent.java | 2 +-
.../cloud/autoscaling/IndexSizeTriggerTest.java | 141 +++++++++++
.../SearchRateTriggerIntegrationTest.java | 19 +-
.../cloud/autoscaling/sim/SimCloudManager.java | 3 +-
.../sim/SimClusterStateProvider.java | 112 +++++----
.../autoscaling/sim/SimSolrCloudTestCase.java | 6 +-
.../autoscaling/sim/TestSimLargeCluster.java | 2 +-
.../sim/TestSimTriggerIntegration.java | 25 +-
.../solr/cloud/cdcr/CdcrBidirectionalTest.java | 1 +
.../apache/solr/core/TestDynamicLoading.java | 22 +-
.../apache/solr/core/TestSolrConfigHandler.java | 175 +++++++-------
.../apache/solr/handler/TestBlobHandler.java | 45 ++--
.../apache/solr/handler/TestConfigReload.java | 19 +-
.../handler/TestSolrConfigHandlerCloud.java | 3 +-
.../TestSolrConfigHandlerConcurrent.java | 44 ++--
.../index/TestSlowCompositeReaderWrapper.java | 29 ++-
.../solr/update/SolrCmdDistributorTest.java | 4 +-
.../test/org/apache/solr/util/TestUtils.java | 73 +++++-
solr/solr-ref-guide/src/collections-api.adoc | 41 ++--
.../src/performance-statistics-reference.adoc | 12 +-
.../src/solrcloud-autoscaling-triggers.adoc | 6 +
...olrcloud-recoveries-and-write-tolerance.adoc | 6 +-
.../client/solrj/cloud/autoscaling/Policy.java | 27 ++-
.../solrj/cloud/autoscaling/PolicyHelper.java | 53 +++-
.../solrj/cloud/autoscaling/Preference.java | 8 +
.../solrj/cloud/autoscaling/ReplicaCount.java | 13 +-
.../solrj/cloud/autoscaling/Suggester.java | 6 +-
.../solrj/cloud/autoscaling/Suggestion.java | 7 +-
.../solrj/impl/SolrClientNodeStateProvider.java | 2 +-
.../org/apache/solr/client/solrj/io/Lang.java | 10 +-
.../solrj/io/eval/EnclosingDiskEvaluator.java | 64 +++++
.../solrj/io/eval/GetAmplitudeEvaluator.java | 42 ++++
.../io/eval/GetAngularFrequencyEvaluator.java | 42 ++++
.../solrj/io/eval/GetCenterEvaluator.java | 52 ++++
.../client/solrj/io/eval/GetPhaseEvaluator.java | 42 ++++
.../solrj/io/eval/GetRadiusEvaluator.java | 44 ++++
.../io/eval/GetSupportPointsEvaluator.java | 56 +++++
.../solrj/io/eval/HarmonicFitEvaluator.java | 11 +-
.../solrj/io/eval/OscillateEvaluator.java | 57 +++++
.../client/solrj/request/UpdateRequest.java | 4 +
.../client/solrj/response/SolrResponseBase.java | 12 +-
.../apache/solr/common/LinkedHashMapWriter.java | 60 +++++
.../java/org/apache/solr/common/MapWriter.java | 20 +-
.../org/apache/solr/common/MapWriterMap.java | 53 ++++
.../solr/common/cloud/ClusterProperties.java | 41 +++-
.../apache/solr/common/cloud/DocCollection.java | 9 +
.../apache/solr/common/cloud/ZkStateReader.java | 7 +-
.../common/params/CollectionAdminParams.java | 5 +
.../solr/common/params/CollectionParams.java | 2 +-
.../java/org/apache/solr/common/util/Utils.java | 86 +++++--
.../src/resources/apispec/cluster.Commands.json | 34 ++-
.../solr/autoscaling/testAddMissingReplica.json | 123 ++++++++++
.../solrj/cloud/autoscaling/TestPolicy.java | 242 +++++++++++++++++++
.../solrj/cloud/autoscaling/TestPolicy2.java | 34 +++
.../apache/solr/client/solrj/io/TestLang.java | 6 +-
.../solrj/io/stream/MathExpressionTest.java | 85 ++++++-
.../solr/BaseDistributedSearchTestCase.java | 2 +
.../cloud/AbstractFullDistribZkTestBase.java | 1 -
91 files changed, 2408 insertions(+), 735 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9ee35061/solr/CHANGES.txt
----------------------------------------------------------------------
[11/27] lucene-solr:solr7896-login-page: Merge branch 'master' into
solr7896-login-page
Posted by ja...@apache.org.
Merge branch 'master' into solr7896-login-page
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/08f7e670
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/08f7e670
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/08f7e670
Branch: refs/heads/solr7896-login-page
Commit: 08f7e67090d0078d52f4f69425c281dd9356876f
Parents: d531b92 baf40d5
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Sep 24 14:00:40 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Sep 24 14:00:40 2018 +0200
----------------------------------------------------------------------
dev-tools/doap/lucene.rdf | 7 +
dev-tools/doap/solr.rdf | 9 +-
dev-tools/idea/solr/core/src/java/solr-core.iml | 1 +
dev-tools/scripts/buildAndPushRelease.py | 79 +-
dev-tools/scripts/smokeTestRelease.py | 53 +-
lucene/CHANGES.txt | 133 +-
lucene/MIGRATE.txt | 47 +-
.../analysis/core/LowerCaseTokenizer.java | 72 -
.../core/LowerCaseTokenizerFactory.java | 75 -
.../lucene/analysis/core/SimpleAnalyzer.java | 4 +-
.../lucene/analysis/core/StopAnalyzer.java | 6 +-
.../miscellaneous/LimitTokenCountAnalyzer.java | 2 +-
.../query/QueryAutoStopWordAnalyzer.java | 2 +-
.../shingle/ShingleAnalyzerWrapper.java | 2 +-
.../analysis/standard/ClassicAnalyzer.java | 11 +-
.../standard/UAX29URLEmailAnalyzer.java | 13 +-
.../lucene/analysis/util/CharTokenizer.java | 86 +-
.../apache/lucene/collation/package-info.java | 21 +-
...apache.lucene.analysis.util.TokenizerFactory | 1 -
.../analysis/br/TestBrazilianAnalyzer.java | 7 +-
.../lucene/analysis/core/TestAnalyzers.java | 8 -
.../analysis/custom/TestCustomAnalyzer.java | 13 +-
.../lucene/analysis/de/TestGermanAnalyzer.java | 8 +-
.../TestPerFieldAnalyzerWrapper.java | 2 +-
.../standard/TestStandardFactories.java | 16 -
.../analysis/util/TestCharTokenizers.java | 122 +-
lucene/analysis/icu/src/java/overview.html | 21 +-
.../ko/KoreanPartOfSpeechStopFilterFactory.java | 17 +-
.../ko/KoreanReadingFormFilterFactory.java | 8 +
.../analysis/ko/KoreanTokenizerFactory.java | 22 +
.../lucene/analysis/ko/dict/UserDictionary.java | 6 +-
.../lucene/codecs/lucene70/Lucene70Codec.java | 133 ++
.../apache/lucene/codecs/lucene70/package.html | 25 +
.../services/org.apache.lucene.codecs.Codec | 1 +
.../index/TestBackwardsCompatibility.java | 7 +-
.../org/apache/lucene/index/index.7.5.0-cfs.zip | Bin 0 -> 15615 bytes
.../apache/lucene/index/index.7.5.0-nocfs.zip | Bin 0 -> 15629 bytes
.../org/apache/lucene/index/sorted.7.5.0.zip | Bin 0 -> 82239 bytes
.../benchmark/byTask/tasks/CreateIndexTask.java | 4 +-
lucene/build.xml | 15 +-
.../codecs/simpletext/SimpleTextBKDWriter.java | 18 +-
lucene/common-build.xml | 33 +-
.../org/apache/lucene/analysis/Analyzer.java | 42 +-
.../analysis/standard/StandardAnalyzer.java | 13 +-
.../java/org/apache/lucene/codecs/Codec.java | 2 +-
.../codecs/blocktree/BlockTreeTermsReader.java | 10 -
.../lucene/codecs/blocktree/FieldReader.java | 3 +-
.../codecs/blocktree/IntersectTermsEnum.java | 220 +--
.../blocktree/IntersectTermsEnumFrame.java | 15 -
.../codecs/blocktree/SegmentTermsEnum.java | 5 +-
.../apache/lucene/codecs/blocktree/Stats.java | 2 -
.../lucene/codecs/lucene70/Lucene70Codec.java | 175 ---
.../lucene/codecs/lucene80/Lucene80Codec.java | 177 +++
.../lucene/codecs/lucene80/package-info.java | 409 ++++++
.../java/org/apache/lucene/document/Field.java | 30 +-
.../org/apache/lucene/document/LatLonPoint.java | 24 +
.../document/LatLonPointDistanceComparator.java | 7 +-
.../LatLonPointDistanceFeatureQuery.java | 480 +++++++
.../document/LatLonPointDistanceQuery.java | 42 +-
.../document/LatLonPointInPolygonQuery.java | 10 +-
.../document/LongDistanceFeatureQuery.java | 438 ++++++
.../org/apache/lucene/document/LongPoint.java | 26 +
.../apache/lucene/document/RangeFieldQuery.java | 38 +-
.../org/apache/lucene/document/StoredField.java | 23 +-
.../org/apache/lucene/index/CheckIndex.java | 92 +-
.../apache/lucene/index/DocumentsWriter.java | 9 +
.../index/DocumentsWriterFlushControl.java | 8 +-
.../apache/lucene/index/FilterCodecReader.java | 18 +-
.../lucene/index/FilterDirectoryReader.java | 16 +-
.../apache/lucene/index/FilterLeafReader.java | 2 +-
.../lucene/index/FrozenBufferedUpdates.java | 23 +-
.../org/apache/lucene/index/IndexWriter.java | 8 +
.../org/apache/lucene/index/MultiFields.java | 27 +-
.../org/apache/lucene/index/PendingDeletes.java | 13 +-
.../apache/lucene/index/PendingSoftDeletes.java | 7 +-
.../org/apache/lucene/index/PointValues.java | 6 +-
.../apache/lucene/index/ReadersAndUpdates.java | 3 +
.../SoftDeletesDirectoryReaderWrapper.java | 14 +
.../index/SoftDeletesRetentionMergePolicy.java | 2 +-
.../java/org/apache/lucene/index/Sorter.java | 27 -
.../src/java/org/apache/lucene/index/Terms.java | 8 +-
.../org/apache/lucene/index/package-info.java | 278 ++--
.../search/BlockMaxConjunctionScorer.java | 9 +-
.../lucene/search/Boolean2ScorerSupplier.java | 6 +-
.../org/apache/lucene/search/BooleanScorer.java | 18 +-
.../org/apache/lucene/search/BooleanWeight.java | 6 +-
.../apache/lucene/search/CachingCollector.java | 20 +-
.../apache/lucene/search/ConjunctionScorer.java | 10 +-
.../lucene/search/ConstantScoreQuery.java | 14 +-
.../lucene/search/DisjunctionMaxQuery.java | 2 +-
.../apache/lucene/search/DisjunctionScorer.java | 6 +-
.../lucene/search/DocValuesRewriteMethod.java | 2 +-
.../lucene/search/DoubleValuesSource.java | 6 +-
.../org/apache/lucene/search/FakeScorer.java | 62 -
.../apache/lucene/search/FieldComparator.java | 10 +-
.../lucene/search/FilterLeafCollector.java | 2 +-
.../lucene/search/FilterMatchesIterator.java | 74 +
.../apache/lucene/search/FilterScorable.java | 58 +
.../org/apache/lucene/search/LRUQueryCache.java | 4 +-
.../org/apache/lucene/search/LeafCollector.java | 2 +-
.../lucene/search/LeafFieldComparator.java | 2 +-
.../apache/lucene/search/LongValuesSource.java | 2 +-
.../apache/lucene/search/MatchAllDocsQuery.java | 2 +-
.../java/org/apache/lucene/search/Matches.java | 96 --
.../org/apache/lucene/search/MatchesUtils.java | 132 ++
.../lucene/search/MaxScoreSumPropagator.java | 102 +-
.../lucene/search/MinShouldMatchSumScorer.java | 6 +-
.../apache/lucene/search/MultiCollector.java | 9 +-
.../lucene/search/MultiCollectorManager.java | 6 +-
.../lucene/search/MultiLeafFieldComparator.java | 2 +-
.../MultiTermQueryConstantScoreWrapper.java | 2 +-
.../org/apache/lucene/search/PhraseWeight.java | 2 +-
.../apache/lucene/search/PointInSetQuery.java | 6 +-
.../apache/lucene/search/PointRangeQuery.java | 30 +-
.../search/PositiveScoresOnlyCollector.java | 4 +-
.../org/apache/lucene/search/ReqExclScorer.java | 6 +-
.../apache/lucene/search/ReqOptSumScorer.java | 191 ++-
.../java/org/apache/lucene/search/Scorable.java | 86 ++
.../org/apache/lucene/search/ScoreAndDoc.java | 35 +
.../search/ScoreCachingWrappingScorer.java | 24 +-
.../java/org/apache/lucene/search/Scorer.java | 77 +-
.../apache/lucene/search/SimpleCollector.java | 2 +-
.../lucene/search/SimpleFieldComparator.java | 2 +-
.../org/apache/lucene/search/SortRescorer.java | 10 +-
.../org/apache/lucene/search/SynonymQuery.java | 2 +-
.../apache/lucene/search/TermInSetQuery.java | 2 +-
.../org/apache/lucene/search/TermQuery.java | 4 +-
.../apache/lucene/search/TermRangeQuery.java | 4 +
.../apache/lucene/search/TopFieldCollector.java | 45 +-
.../lucene/search/TopScoreDocCollector.java | 8 +-
.../org/apache/lucene/search/WANDScorer.java | 9 +-
.../java/org/apache/lucene/search/Weight.java | 4 +-
.../org/apache/lucene/search/package-info.java | 127 +-
.../search/similarities/package-info.java | 52 +-
.../apache/lucene/search/spans/SpanWeight.java | 3 +-
.../lucene/store/ByteArrayIndexInput.java | 107 +-
.../lucene/store/ByteBuffersDataInput.java | 323 +++++
.../lucene/store/ByteBuffersDataOutput.java | 541 +++++++
.../lucene/store/ByteBuffersDirectory.java | 274 ++++
.../lucene/store/ByteBuffersIndexInput.java | 200 +++
.../lucene/store/ByteBuffersIndexOutput.java | 171 +++
.../org/apache/lucene/store/RAMDirectory.java | 5 +
.../java/org/apache/lucene/store/RAMFile.java | 8 +-
.../org/apache/lucene/store/RAMInputStream.java | 12 +-
.../apache/lucene/store/RAMOutputStream.java | 4 +
.../apache/lucene/util/RamUsageEstimator.java | 51 +-
.../org/apache/lucene/util/StringHelper.java | 11 -
.../java/org/apache/lucene/util/Version.java | 7 +
.../org/apache/lucene/util/bkd/BKDReader.java | 70 +-
.../org/apache/lucene/util/bkd/BKDWriter.java | 76 +-
.../util/bkd/MutablePointsReaderUtils.java | 8 +-
.../org/apache/lucene/util/packed/Direct16.java | 2 +-
.../org/apache/lucene/util/packed/Direct32.java | 2 +-
.../org/apache/lucene/util/packed/Direct64.java | 2 +-
.../org/apache/lucene/util/packed/Direct8.java | 2 +-
.../lucene/util/packed/Packed16ThreeBlocks.java | 2 +-
.../lucene/util/packed/Packed64SingleBlock.java | 2 +-
.../lucene/util/packed/Packed8ThreeBlocks.java | 2 +-
lucene/core/src/java/overview.html | 25 +-
.../services/org.apache.lucene.codecs.Codec | 2 +-
.../src/test/org/apache/lucene/TestDemo.java | 69 +-
.../lucene/analysis/TestAnalyzerWrapper.java | 58 +
...cene50StoredFieldsFormatHighCompression.java | 8 +-
.../lucene60/TestLucene60PointsFormat.java | 10 +-
.../lucene70/TestLucene70NormsFormat.java | 4 +-
.../TestLatLonPointDistanceFeatureQuery.java | 411 ++++++
.../document/TestLongDistanceFeatureQuery.java | 350 +++++
.../org/apache/lucene/index/Test2BPoints.java | 2 +-
.../org/apache/lucene/index/TestAddIndexes.java | 2 +
.../lucene/index/TestFilterCodecReader.java | 18 +
.../index/TestFlushByRamOrCountsPolicy.java | 14 +-
.../apache/lucene/index/TestIndexSorting.java | 60 +
.../org/apache/lucene/index/TestOmitTf.java | 18 +-
.../lucene/index/TestPendingSoftDeletes.java | 8 +-
.../apache/lucene/index/TestPointValues.java | 8 +-
.../TestSoftDeletesDirectoryReaderWrapper.java | 51 +
.../TestSoftDeletesRetentionMergePolicy.java | 121 +-
.../apache/lucene/search/JustCompileSearch.java | 2 +-
.../lucene/search/MultiCollectorTest.java | 28 +-
.../org/apache/lucene/search/TestBoolean2.java | 8 +-
.../search/TestBoolean2ScorerSupplier.java | 80 +-
.../org/apache/lucene/search/TestBooleanOr.java | 4 +-
.../apache/lucene/search/TestBooleanQuery.java | 4 +-
.../search/TestBooleanQueryVisitSubscorers.java | 19 +-
.../apache/lucene/search/TestBooleanScorer.java | 2 +-
.../lucene/search/TestCachingCollector.java | 23 +-
.../lucene/search/TestConjunctionDISI.java | 50 +-
.../apache/lucene/search/TestConjunctions.java | 8 +-
.../lucene/search/TestConstantScoreQuery.java | 30 +-
.../lucene/search/TestDoubleValuesSource.java | 6 +-
.../lucene/search/TestElevationComparator.java | 2 +-
.../search/TestMaxScoreSumPropagator.java | 230 +++
.../lucene/search/TestMultiCollector.java | 22 +-
.../apache/lucene/search/TestPointQueries.java | 14 +-
.../apache/lucene/search/TestQueryRescorer.java | 2 +-
.../lucene/search/TestReqExclBulkScorer.java | 4 +-
.../lucene/search/TestReqOptSumScorer.java | 241 +++-
.../search/TestScoreCachingWrappingScorer.java | 4 +-
.../apache/lucene/search/TestSimilarity.java | 16 +-
.../lucene/search/TestSloppyPhraseQuery.java | 14 +-
.../lucene/search/TestSubScorerFreqs.java | 22 +-
.../apache/lucene/search/TestTermScorer.java | 4 +-
.../search/TestTimeLimitingCollector.java | 2 +-
.../lucene/search/TestTopDocsCollector.java | 24 +-
.../lucene/search/TestTopFieldCollector.java | 21 +-
.../lucene/store/BaseDataOutputTestCase.java | 181 +++
.../lucene/store/TestByteBuffersDataInput.java | 206 +++
.../lucene/store/TestByteBuffersDataOutput.java | 157 +++
.../lucene/store/TestByteBuffersDirectory.java | 86 ++
.../org/apache/lucene/util/bkd/TestBKD.java | 24 +-
.../util/bkd/TestMutablePointsReaderUtils.java | 10 +-
.../apache/lucene/expressions/FakeScorer.java | 53 -
.../lucene/facet/DrillSidewaysScorer.java | 28 +-
.../apache/lucene/facet/FacetsCollector.java | 6 +-
.../facet/taxonomy/SearcherTaxonomyManager.java | 14 +
.../directory/DirectoryTaxonomyReader.java | 8 +-
.../taxonomy/directory/TaxonomyIndexArrays.java | 2 +-
.../facet/AssertingSubDocsAtOnceCollector.java | 11 +-
.../taxonomy/TestSearcherTaxonomyManager.java | 14 +
.../search/grouping/AllGroupHeadsCollector.java | 24 +-
.../search/grouping/AllGroupsCollector.java | 4 +-
.../search/grouping/BlockGroupingCollector.java | 24 +-
.../lucene/search/grouping/FakeScorer.java | 52 -
.../grouping/FirstPassGroupingCollector.java | 4 +-
.../search/grouping/GroupFacetCollector.java | 4 +-
.../lucene/search/grouping/GroupReducer.java | 4 +-
.../grouping/SecondPassGroupingCollector.java | 4 +-
.../search/grouping/TopGroupsCollector.java | 6 +-
.../uhighlight/AnalysisOffsetStrategy.java | 16 +-
.../uhighlight/DefaultPassageFormatter.java | 25 +-
.../search/uhighlight/FieldHighlighter.java | 5 +-
.../search/uhighlight/FieldOffsetStrategy.java | 121 +-
.../uhighlight/MemoryIndexOffsetStrategy.java | 51 +-
.../search/uhighlight/NoOpOffsetStrategy.java | 8 +-
.../lucene/search/uhighlight/OffsetsEnum.java | 220 ++-
.../OverlaySingleDocTermsLeafReader.java | 113 ++
.../lucene/search/uhighlight/Passage.java | 11 +-
.../uhighlight/PostingsOffsetStrategy.java | 24 +-
.../PostingsWithTermVectorsOffsetStrategy.java | 26 +-
.../TermVectorFilteredLeafReader.java | 11 +-
.../uhighlight/TermVectorOffsetStrategy.java | 23 +-
.../uhighlight/TokenStreamOffsetStrategy.java | 20 +-
.../lucene/search/uhighlight/UHComponents.java | 80 ++
.../search/uhighlight/UnifiedHighlighter.java | 73 +-
.../search/vectorhighlight/FieldTermStack.java | 11 +-
.../search/highlight/HighlighterPhraseTest.java | 5 +-
.../uhighlight/TestUnifiedHighlighter.java | 154 +-
.../uhighlight/TestUnifiedHighlighterMTQ.java | 2 +-
.../TestUnifiedHighlighterRanking.java | 20 +
.../TestUnifiedHighlighterStrictPhrases.java | 146 +-
.../TestUnifiedHighlighterTermVec.java | 34 +-
.../TestUnifiedHighlighterExtensibility.java | 36 +-
lucene/ivy-versions.properties | 4 +-
.../apache/lucene/search/join/FakeScorer.java | 52 -
.../search/join/GlobalOrdinalsCollector.java | 6 +-
.../join/GlobalOrdinalsWithScoreCollector.java | 14 +-
.../org/apache/lucene/search/join/JoinUtil.java | 10 +-
.../search/join/TermsWithScoreCollector.java | 6 +-
.../search/join/ToChildBlockJoinQuery.java | 4 +-
.../search/join/ToParentBlockJoinQuery.java | 7 +-
.../apache/lucene/search/join/TestJoinUtil.java | 10 +-
.../licenses/commons-compress-1.16.1.jar.sha1 | 1 -
lucene/licenses/commons-compress-1.18.jar.sha1 | 1 +
.../randomizedtesting-runner-2.6.0.jar.sha1 | 1 -
.../randomizedtesting-runner-2.6.4.jar.sha1 | 1 +
.../apache/lucene/index/memory/MemoryIndex.java | 12 +-
.../lucene/document/InetAddressPoint.java | 4 +-
.../lucene/document/InetAddressRange.java | 4 +-
.../search/DiversifiedTopDocsCollector.java | 4 +-
.../lucene/search/DocValuesStatsCollector.java | 4 +-
.../search/TestInetAddressRangeQueries.java | 22 +-
.../queries/function/FunctionRangeQuery.java | 4 +-
.../lucene/queries/function/FunctionValues.java | 15 +-
.../lucene/queries/function/ValueSource.java | 26 +-
.../queries/function/ValueSourceScorer.java | 8 +-
.../docvalues/DocTermsIndexDocValues.java | 5 +-
.../function/docvalues/DoubleDocValues.java | 11 +-
.../function/docvalues/IntDocValues.java | 5 +-
.../function/docvalues/LongDocValues.java | 5 +-
.../function/valuesource/EnumFieldSource.java | 5 +-
.../function/valuesource/MultiFunction.java | 4 +-
.../surround/query/BooleanQueryTst.java | 10 +-
.../document/FloatPointNearestNeighbor.java | 2 +-
.../org/apache/lucene/document/LatLonShape.java | 13 +-
.../document/LatLonShapeBoundingBoxQuery.java | 420 ++----
.../document/LatLonShapePolygonQuery.java | 301 +---
.../lucene/document/LatLonShapeQuery.java | 394 ++++++
.../java/org/apache/lucene/geo/Tessellator.java | 101 +-
.../org/apache/lucene/search/CoveringQuery.java | 2 +-
.../apache/lucene/search/CoveringScorer.java | 6 +-
.../apache/lucene/search/NearestNeighbor.java | 2 +-
.../intervals/ConjunctionIntervalsSource.java | 113 +-
.../intervals/DifferenceIntervalsSource.java | 23 +-
.../intervals/DisjunctionIntervalsSource.java | 14 +
.../lucene/search/intervals/IntervalFilter.java | 2 +-
.../search/intervals/IntervalFunction.java | 4 +-
.../search/intervals/IntervalIterator.java | 5 +
.../search/intervals/IntervalMatches.java | 156 +++
.../lucene/search/intervals/IntervalQuery.java | 20 +
.../lucene/search/intervals/Intervals.java | 4 +-
.../search/intervals/IntervalsSource.java | 13 +
.../intervals/LowpassIntervalsSource.java | 16 +
.../MinimizingConjunctionIntervalsSource.java | 236 ++++
.../search/intervals/TermIntervalsSource.java | 66 +
.../document/BaseLatLonShapeTestCase.java | 46 +-
.../document/TestFloatPointNearestNeighbor.java | 2 +-
.../lucene/document/TestHalfFloatPoint.java | 4 +-
.../document/TestLatLonLineShapeQueries.java | 40 +-
.../document/TestLatLonPointShapeQueries.java | 20 +-
.../document/TestLatLonPolygonShapeQueries.java | 38 +-
.../apache/lucene/document/TestLatLonShape.java | 26 +-
.../org/apache/lucene/geo/TestTessellator.java | 22 +
.../org/apache/lucene/search/TestNearest.java | 2 +-
.../lucene/search/intervals/TestIntervals.java | 232 ++-
.../prefix/BytesRefIteratorTokenStream.java | 2 +-
.../spatial/prefix/PrefixTreeStrategy.java | 17 +
.../Geo3dShapeWGS84ModelRectRelationTest.java | 2 +-
.../spatial3d/Geo3DPointDistanceComparator.java | 4 +-
.../Geo3DPointOutsideDistanceComparator.java | 4 +-
.../spatial3d/geom/GeoComplexPolygon.java | 115 +-
.../spatial3d/geom/GeoLongitudeSlice.java | 17 +-
.../spatial3d/geom/GeoNorthRectangle.java | 18 +-
.../spatial3d/geom/GeoPolygonFactory.java | 48 +-
.../lucene/spatial3d/geom/GeoRectangle.java | 12 +-
.../spatial3d/geom/GeoSouthRectangle.java | 16 +-
.../lucene/spatial3d/geom/SidedPlane.java | 16 +
.../apache/lucene/spatial3d/TestGeo3DPoint.java | 10 +-
.../lucene/spatial3d/geom/GeoPolygonTest.java | 40 +
.../lucene/spatial3d/geom/XYZSolidTest.java | 19 +
.../analyzing/AnalyzingInfixSuggester.java | 2 +-
.../analyzing/BlendedInfixSuggester.java | 7 +-
.../suggest/analyzing/FreeTextSuggester.java | 2 +-
.../suggest/document/CompletionAnalyzer.java | 2 +-
.../document/TopSuggestDocsCollector.java | 2 +-
.../analyzing/AnalyzingSuggesterTest.java | 365 ++---
.../analyzing/BlendedInfixSuggesterTest.java | 73 +-
.../suggest/analyzing/FuzzySuggesterTest.java | 159 +--
.../suggest/document/TestSuggestField.java | 4 +-
.../analysis/CannedBinaryTokenStream.java | 2 +-
.../lucene/analysis/CannedTokenStream.java | 8 +-
.../apache/lucene/geo/BaseGeoPointTestCase.java | 2 +-
.../lucene/index/AssertingLeafReader.java | 10 +-
.../lucene/index/BasePointsFormatTestCase.java | 28 +-
.../apache/lucene/index/PointsStackTracker.java | 6 +-
.../lucene/search/AssertingBulkScorer.java | 4 +-
.../lucene/search/AssertingCollector.java | 11 +-
.../lucene/search/AssertingIndexSearcher.java | 2 +-
.../lucene/search/AssertingLeafCollector.java | 13 +-
.../apache/lucene/search/AssertingScorable.java | 64 +
.../apache/lucene/search/AssertingScorer.java | 6 +-
.../lucene/search/BulkScorerWrapperScorer.java | 4 +-
.../org/apache/lucene/search/CheckHits.java | 6 +-
.../org/apache/lucene/search/QueryUtils.java | 14 +-
.../lucene/search/RandomApproximationQuery.java | 10 +-
.../org/apache/lucene/util/LuceneTestCase.java | 2 +
.../util/TestRuleSetupAndRestoreClassEnv.java | 30 +-
.../java/org/apache/lucene/util/TestUtil.java | 4 +-
.../src/groovy/check-source-patterns.groovy | 9 +-
solr/CHANGES.txt | 230 ++-
solr/bin/solr.cmd | 4 +-
solr/build.xml | 12 +-
solr/common-build.xml | 6 +-
.../stream/AnalyticsShardRequestManager.java | 2 +-
.../handler/dataimport/MailEntityProcessor.java | 74 +-
.../handler/dataimport/BinURLDataSource.java | 10 +-
.../handler/dataimport/DataImportHandler.java | 6 +-
.../solr/handler/dataimport/DataImporter.java | 24 +-
.../dataimport/DateFormatTransformer.java | 4 +-
.../solr/handler/dataimport/DocBuilder.java | 34 +-
.../dataimport/FieldReaderDataSource.java | 6 +-
.../dataimport/FieldStreamDataSource.java | 4 +-
.../solr/handler/dataimport/FileDataSource.java | 8 +-
.../solr/handler/dataimport/JdbcDataSource.java | 20 +-
.../solr/handler/dataimport/LogTransformer.java | 22 +-
.../handler/dataimport/RegexTransformer.java | 4 +-
.../handler/dataimport/SolrEntityProcessor.java | 6 +-
.../handler/dataimport/SqlEntityProcessor.java | 8 +-
.../handler/dataimport/TemplateTransformer.java | 4 +-
.../solr/handler/dataimport/URLDataSource.java | 10 +-
.../dataimport/XPathEntityProcessor.java | 24 +-
.../handler/dataimport/XPathRecordReader.java | 6 +-
.../dataimport/config/DIHConfiguration.java | 6 +-
.../TestSolrEntityProcessorEndToEnd.java | 20 +-
.../extraction/solr/collection1/conf/schema.xml | 15 -
.../solr/collection1/conf/solrconfig.xml | 19 +
.../ExtractingRequestHandlerTest.java | 10 +-
.../org/apache/solr/ltr/LTRScoringQuery.java | 14 +-
.../org/apache/solr/ltr/TestLTROnSolrCloud.java | 3 +-
.../solr/ltr/TestLTRReRankingPipeline.java | 6 +-
solr/core/ivy.xml | 2 +-
.../client/solrj/embedded/JettySolrRunner.java | 6 +-
.../org/apache/solr/cloud/ActionThrottle.java | 2 +-
.../java/org/apache/solr/cloud/LockTree.java | 6 +-
.../java/org/apache/solr/cloud/Overseer.java | 5 +
.../cloud/OverseerConfigSetMessageHandler.java | 30 +-
.../solr/cloud/OverseerTaskProcessor.java | 5 +
.../apache/solr/cloud/OverseerTaskQueue.java | 14 +-
.../org/apache/solr/cloud/RecoveryStrategy.java | 172 +--
.../apache/solr/cloud/ReplicateFromLeader.java | 6 +-
.../org/apache/solr/cloud/SolrZkServer.java | 4 +-
.../apache/solr/cloud/ZkDistributedQueue.java | 6 +-
.../cloud/api/collections/AddReplicaCmd.java | 334 +++--
.../solr/cloud/api/collections/Assign.java | 56 +-
.../solr/cloud/api/collections/BackupCmd.java | 2 +-
.../api/collections/CreateCollectionCmd.java | 23 +-
.../cloud/api/collections/CreateShardCmd.java | 157 +--
.../cloud/api/collections/DeleteNodeCmd.java | 4 -
.../api/collections/MaintainRoutedAliasCmd.java | 7 +-
.../cloud/api/collections/MoveReplicaCmd.java | 15 +-
.../OverseerCollectionMessageHandler.java | 2 +-
.../cloud/api/collections/ReplaceNodeCmd.java | 2 +-
.../cloud/api/collections/TimeRoutedAlias.java | 19 +
.../autoscaling/AutoAddReplicasPlanAction.java | 2 +-
.../cloud/autoscaling/AutoScalingHandler.java | 13 +-
.../cloud/autoscaling/ComputePlanAction.java | 82 +-
.../cloud/autoscaling/HttpTriggerListener.java | 4 +-
.../cloud/autoscaling/IndexSizeTrigger.java | 3 +
.../solr/cloud/autoscaling/LoggingListener.java | 4 +-
.../cloud/autoscaling/NodeAddedTrigger.java | 30 +-
.../solr/cloud/autoscaling/NodeLostTrigger.java | 31 +-
.../cloud/autoscaling/ScheduledTriggers.java | 7 +-
.../cloud/autoscaling/SearchRateTrigger.java | 173 ++-
.../autoscaling/TriggerActionException.java | 33 +
.../solr/cloud/autoscaling/TriggerBase.java | 8 +-
.../solr/cloud/autoscaling/TriggerEvent.java | 81 +-
.../cloud/autoscaling/TriggerEventQueue.java | 24 +-
.../apache/solr/core/HdfsDirectoryFactory.java | 50 +-
.../solr/core/IndexDeletionPolicyWrapper.java | 4 +-
.../apache/solr/core/SchemaCodecFactory.java | 4 +-
.../src/java/org/apache/solr/core/SolrCore.java | 4 +-
.../org/apache/solr/core/SolrXmlConfig.java | 9 +-
.../repository/BackupRepositoryFactory.java | 6 +-
.../solr/handler/HaversineMetersEvaluator.java | 59 +
.../org/apache/solr/handler/IndexFetcher.java | 142 +-
.../apache/solr/handler/ReplicationHandler.java | 68 +-
.../org/apache/solr/handler/SnapShooter.java | 16 +-
.../solr/handler/SolrDefaultStreamFactory.java | 1 +
.../org/apache/solr/handler/StreamHandler.java | 4 +
.../admin/AutoscalingHistoryHandler.java | 4 +-
.../apache/solr/handler/admin/BackupCoreOp.java | 4 +-
.../solr/handler/admin/CollectionsHandler.java | 9 +-
.../solr/handler/admin/ConfigSetsHandler.java | 20 +-
.../handler/admin/MetricsHistoryHandler.java | 8 +-
.../solr/handler/component/ExpandComponent.java | 6 +-
.../component/HttpShardHandlerFactory.java | 8 +-
.../PhrasesIdentificationComponent.java | 1129 +++++++++++++++
.../solr/handler/component/QueryComponent.java | 35 +-
.../handler/component/SpellCheckComponent.java | 24 +-
.../solr/handler/component/StatsField.java | 4 +-
.../handler/component/SuggestComponent.java | 26 +-
.../handler/component/TermVectorComponent.java | 41 +-
.../solr/handler/export/BoolFieldWriter.java | 23 +-
.../solr/handler/export/DateFieldWriter.java | 22 +-
.../solr/handler/export/DoubleFieldWriter.java | 27 +-
.../apache/solr/handler/export/DoubleValue.java | 20 +
.../solr/handler/export/DoubleValueSortDoc.java | 102 ++
.../solr/handler/export/ExportWriter.java | 15 +-
.../apache/solr/handler/export/FieldWriter.java | 2 +-
.../solr/handler/export/FloatFieldWriter.java | 27 +-
.../apache/solr/handler/export/FloatValue.java | 20 +
.../solr/handler/export/IntFieldWriter.java | 22 +-
.../apache/solr/handler/export/IntValue.java | 25 +-
.../solr/handler/export/LongFieldWriter.java | 20 +-
.../apache/solr/handler/export/LongValue.java | 20 +
.../solr/handler/export/MultiFieldWriter.java | 6 +-
.../solr/handler/export/QuadValueSortDoc.java | 139 ++
.../solr/handler/export/SingleValueSortDoc.java | 89 ++
.../org/apache/solr/handler/export/SortDoc.java | 17 +-
.../apache/solr/handler/export/SortValue.java | 8 +
.../solr/handler/export/StringFieldWriter.java | 24 +-
.../apache/solr/handler/export/StringValue.java | 24 +-
.../solr/handler/export/TripleValueSortDoc.java | 121 ++
.../org/apache/solr/handler/sql/SolrSchema.java | 4 +
.../metrics/reporters/ReporterClientCache.java | 6 +-
.../reporters/jmx/JmxMetricsReporter.java | 68 +-
.../reporters/solr/SolrShardReporter.java | 2 +-
.../org/apache/solr/request/SimpleFacets.java | 4 +-
.../solr/response/BinaryResponseWriter.java | 4 +-
.../org/apache/solr/response/DocsStreamer.java | 26 +-
.../solr/response/RetrieveFieldsOptimizer.java | 130 --
.../response/transform/ChildDocTransformer.java | 253 ++++
.../transform/ChildDocTransformerFactory.java | 211 ++-
.../solr/response/transform/DocTransformer.java | 23 +
.../transform/RawValueTransformerFactory.java | 20 +-
.../AbstractSpatialPrefixTreeFieldType.java | 35 +-
.../apache/solr/schema/CurrencyFieldType.java | 8 +-
.../java/org/apache/solr/schema/FieldType.java | 4 +-
.../org/apache/solr/schema/IndexSchema.java | 2 +-
.../solr/schema/JsonPreAnalyzedParser.java | 12 +-
.../apache/solr/schema/ManagedIndexSchema.java | 4 +-
.../apache/solr/schema/PreAnalyzedField.java | 27 +-
.../solr/search/CollapsingQParserPlugin.java | 64 +-
.../apache/solr/search/DelegatingCollector.java | 8 +-
.../org/apache/solr/search/DocSetCollector.java | 4 +-
.../apache/solr/search/ExportQParserPlugin.java | 4 +-
.../src/java/org/apache/solr/search/Filter.java | 2 +-
.../apache/solr/search/FunctionRangeQuery.java | 12 +-
.../solr/search/GraphTermsQParserPlugin.java | 6 +-
.../apache/solr/search/HashQParserPlugin.java | 30 +-
.../apache/solr/search/MaxScoreCollector.java | 6 +-
.../apache/solr/search/SolrDocumentFetcher.java | 198 ++-
.../apache/solr/search/SolrIndexSearcher.java | 8 +-
.../apache/solr/search/SolrReturnFields.java | 31 +
.../solr/search/SurroundQParserPlugin.java | 2 +-
.../search/function/ValueSourceRangeFilter.java | 9 +-
.../search/join/ScoreJoinQParserPlugin.java | 2 +-
.../search/stats/ExactSharedStatsCache.java | 6 +-
.../solr/search/stats/ExactStatsCache.java | 28 +-
.../apache/solr/search/stats/LRUStatsCache.java | 10 +-
.../solr/search/stats/LocalStatsCache.java | 18 +-
.../org/apache/solr/search/stats/StatsUtil.java | 22 +-
.../solr/servlet/CheckLoggingConfiguration.java | 4 +-
.../org/apache/solr/servlet/HttpSolrCall.java | 35 +-
.../solr/spelling/DirectSolrSpellChecker.java | 6 +-
.../solr/spelling/SpellCheckCollator.java | 10 +-
.../solr/spelling/suggest/SolrSuggester.java | 34 +-
.../apache/solr/spelling/suggest/Suggester.java | 26 +-
.../suggest/jaspell/JaspellLookupFactory.java | 4 +-
.../solr/store/blockcache/BlockDirectory.java | 8 +-
.../apache/solr/store/hdfs/HdfsDirectory.java | 16 +-
.../org/apache/solr/update/CommitTracker.java | 13 +-
.../java/org/apache/solr/update/PeerSync.java | 2 +-
.../apache/solr/update/PeerSyncWithLeader.java | 6 +-
.../apache/solr/update/SolrCmdDistributor.java | 50 +-
.../apache/solr/update/UpdateShardHandler.java | 4 +-
.../solr/update/UpdateShardHandlerConfig.java | 10 +-
.../AddSchemaFieldsUpdateProcessorFactory.java | 36 +-
.../processor/AtomicUpdateDocumentMerger.java | 4 +-
.../CloneFieldUpdateProcessorFactory.java | 4 +-
.../processor/DistributedUpdateProcessor.java | 6 +-
.../DistributedUpdateProcessorFactory.java | 2 +-
.../DocExpirationUpdateProcessorFactory.java | 9 +-
.../ParseDateFieldUpdateProcessorFactory.java | 36 +-
.../TimeRoutedAliasUpdateProcessor.java | 362 +++--
.../TolerantUpdateProcessorFactory.java | 2 +-
.../org/apache/solr/util/stats/MetricUtils.java | 6 +-
.../collection1/conf/schema-copyfield-test.xml | 14 -
.../solr/collection1/conf/schema-folding.xml | 3 +-
.../solr/collection1/conf/schema-hash.xml | 13 -
.../solr/collection1/conf/schema-nest.xml | 65 +
.../conf/schema-phrases-identification.xml | 97 ++
.../collection1/conf/schema-required-fields.xml | 14 -
.../solr/collection1/conf/schema-rest.xml | 9 +-
.../solr/collection1/conf/schema-sql.xml | 40 +-
.../collection1/conf/schema-tokenizer-test.xml | 11 +-
.../test-files/solr/collection1/conf/schema.xml | 15 +-
.../solr/collection1/conf/schema12.xml | 9 +-
.../solr/collection1/conf/schema15.xml | 17 -
.../solr/collection1/conf/schemasurround.xml | 14 -
...dd-schema-fields-update-processor-chains.xml | 8 +-
...lrconfig-parsing-update-processor-chains.xml | 20 +-
.../conf/solrconfig-phrases-identification.xml | 53 +
.../collection1/conf/solrconfig-schemaless.xml | 8 +-
.../conf/solrconfig-update-processor-chains.xml | 2 +-
.../configsets/_default/conf/managed-schema | 34 +
.../configsets/_default/conf/solrconfig.xml | 8 +-
.../org/apache/solr/BasicFunctionalityTest.java | 160 +--
.../test/org/apache/solr/CursorPagingTest.java | 10 +-
.../solr/TestCursorMarkWithoutUniqueKey.java | 9 +-
.../org/apache/solr/TestDistributedSearch.java | 47 +-
.../org/apache/solr/TestTolerantSearch.java | 18 +-
.../apache/solr/cloud/ActionThrottleTest.java | 2 +-
.../org/apache/solr/cloud/AddReplicaTest.java | 90 +-
.../cloud/AssignBackwardCompatibilityTest.java | 1 +
.../solr/cloud/BasicDistributedZk2Test.java | 30 +-
.../solr/cloud/BasicDistributedZkTest.java | 19 +-
.../test/org/apache/solr/cloud/BasicZkTest.java | 14 +-
.../org/apache/solr/cloud/CloudTestUtils.java | 29 +-
.../solr/cloud/CollectionsAPISolrJTest.java | 46 +-
.../apache/solr/cloud/DeleteReplicaTest.java | 28 +-
.../org/apache/solr/cloud/DeleteShardTest.java | 1 +
.../solr/cloud/DistribCursorPagingTest.java | 1 +
.../solr/cloud/DocValuesNotIndexedTest.java | 3 +-
.../org/apache/solr/cloud/ForceLeaderTest.java | 10 +-
.../cloud/FullSolrCloudDistribCmdsTest.java | 3 +-
.../solr/cloud/LIROnShardRestartTest.java | 4 +-
.../solr/cloud/LIRRollingUpdatesTest.java | 7 +-
.../cloud/LeaderElectionIntegrationTest.java | 3 +-
.../solr/cloud/LeaderVoteWaitTimeoutTest.java | 19 +-
.../solr/cloud/LegacyCloudClusterPropTest.java | 1 +
.../apache/solr/cloud/MoveReplicaHDFSTest.java | 6 +-
.../org/apache/solr/cloud/MoveReplicaTest.java | 17 +-
.../apache/solr/cloud/MultiThreadedOCPTest.java | 1 +
.../apache/solr/cloud/OverseerRolesTest.java | 1 +
.../apache/solr/cloud/OverseerStatusTest.java | 17 +-
.../solr/cloud/SaslZkACLProviderTest.java | 3 +-
.../cloud/SharedFSAutoReplicaFailoverTest.java | 2 +-
.../org/apache/solr/cloud/SolrXmlInZkTest.java | 10 +-
.../solr/cloud/TestAuthenticationFramework.java | 10 +-
.../apache/solr/cloud/TestCloudConsistency.java | 5 +-
.../solr/cloud/TestCloudDeleteByQuery.java | 11 +-
.../apache/solr/cloud/TestCloudInspectUtil.java | 19 +-
.../cloud/TestCloudJSONFacetJoinDomain.java | 8 +-
.../solr/cloud/TestCloudJSONFacetSKG.java | 4 +-
...TestCloudPhrasesIdentificationComponent.java | 200 +++
.../apache/solr/cloud/TestCloudRecovery.java | 2 +-
.../solr/cloud/TestClusterProperties.java | 25 +-
.../apache/solr/cloud/TestConfigSetsAPI.java | 25 +-
.../solr/cloud/TestConfigSetsAPIZkFailure.java | 14 +-
.../solr/cloud/TestDownShardTolerantSearch.java | 17 +-
.../TestLeaderInitiatedRecoveryThread.java | 67 +-
.../org/apache/solr/cloud/TestPullReplica.java | 18 +-
.../cloud/TestPullReplicaErrorHandling.java | 27 +-
.../solr/cloud/TestSkipOverseerOperations.java | 3 +
.../TestSolrCloudWithDelegationTokens.java | 26 +-
.../TestSolrCloudWithSecureImpersonation.java | 101 +-
.../TestStressCloudBlindAtomicUpdates.java | 2 +-
.../org/apache/solr/cloud/TestTlogReplica.java | 13 +-
.../cloud/TestTolerantUpdateProcessorCloud.java | 238 ++--
.../apache/solr/cloud/TestWithCollection.java | 20 +-
.../org/apache/solr/cloud/TestZkChroot.java | 23 +-
.../solr/cloud/UnloadDistributedZkTest.java | 1 +
.../test/org/apache/solr/cloud/ZkCLITest.java | 18 +-
.../org/apache/solr/cloud/ZkShardTermsTest.java | 1 +
.../org/apache/solr/cloud/ZkSolrClientTest.java | 59 +-
.../CollectionTooManyReplicasTest.java | 2 +-
.../CollectionsAPIAsyncDistributedZkTest.java | 6 +-
.../CollectionsAPIDistributedZkTest.java | 1 +
.../api/collections/CustomCollectionTest.java | 1 +
.../HdfsCollectionsAPIDistributedZkTest.java | 3 +-
.../cloud/api/collections/ShardSplitTest.java | 379 ++---
.../TestCollectionsAPIViaSolrCloudCluster.java | 2 +-
.../collections/TestHdfsCloudBackupRestore.java | 12 +-
.../TestLocalFSCloudBackupRestore.java | 13 +-
.../AutoAddReplicasIntegrationTest.java | 3 +-
.../AutoAddReplicasPlanActionTest.java | 2 +-
.../autoscaling/AutoScalingHandlerTest.java | 44 +-
.../solr/cloud/autoscaling/CapturedEvent.java | 2 +
.../autoscaling/ComputePlanActionTest.java | 187 ++-
.../autoscaling/ExecutePlanActionTest.java | 2 +-
.../HdfsAutoAddReplicasIntegrationTest.java | 2 +-
.../cloud/autoscaling/IndexSizeTriggerTest.java | 68 +-
.../MetricTriggerIntegrationTest.java | 11 +-
.../ScheduledMaintenanceTriggerTest.java | 23 +-
.../ScheduledTriggerIntegrationTest.java | 3 +-
.../cloud/autoscaling/ScheduledTriggerTest.java | 3 +-
.../SearchRateTriggerIntegrationTest.java | 44 +-
.../autoscaling/SearchRateTriggerTest.java | 14 +-
.../solr/cloud/autoscaling/TestPolicyCloud.java | 40 +
.../autoscaling/TriggerEventQueueTest.java | 98 ++
.../autoscaling/TriggerIntegrationTest.java | 40 +-
.../sim/GenericDistributedQueue.java | 6 +-
.../cloud/autoscaling/sim/SimCloudManager.java | 18 +-
.../sim/SimClusterStateProvider.java | 273 ++--
.../autoscaling/sim/SimDistribStateManager.java | 2 +-
.../sim/SimDistributedQueueFactory.java | 4 +-
.../autoscaling/sim/SimNodeStateProvider.java | 26 +-
.../sim/TestClusterStateProvider.java | 225 ---
.../autoscaling/sim/TestComputePlanAction.java | 359 -----
.../sim/TestDistribStateManager.java | 342 -----
.../autoscaling/sim/TestExecutePlanAction.java | 207 ---
.../sim/TestGenericDistributedQueue.java | 35 -
.../cloud/autoscaling/sim/TestLargeCluster.java | 680 ---------
.../autoscaling/sim/TestNodeAddedTrigger.java | 327 -----
.../autoscaling/sim/TestNodeLostTrigger.java | 346 -----
.../cloud/autoscaling/sim/TestPolicyCloud.java | 366 -----
.../sim/TestSimClusterStateProvider.java | 225 +++
.../sim/TestSimComputePlanAction.java | 358 +++++
.../sim/TestSimDistribStateManager.java | 342 +++++
.../sim/TestSimExecutePlanAction.java | 209 +++
.../sim/TestSimGenericDistributedQueue.java | 38 +
.../autoscaling/sim/TestSimLargeCluster.java | 728 ++++++++++
.../sim/TestSimNodeAddedTrigger.java | 327 +++++
.../autoscaling/sim/TestSimNodeLostTrigger.java | 346 +++++
.../autoscaling/sim/TestSimPolicyCloud.java | 368 +++++
.../sim/TestSimTriggerIntegration.java | 1325 ++++++++++++++++++
.../autoscaling/sim/TestTriggerIntegration.java | 1262 -----------------
.../solr/cloud/cdcr/CdcrBootstrapTest.java | 4 +-
.../cloud/cdcr/CdcrOpsAndBoundariesTest.java | 321 +++++
.../cdcr/CdcrReplicationDistributedZkTest.java | 681 ---------
.../apache/solr/cloud/cdcr/CdcrTestsUtil.java | 132 +-
.../cloud/cdcr/CdcrWithNodesRestartsTest.java | 343 +++++
.../cloud/hdfs/HdfsBasicDistributedZk2Test.java | 2 +
.../apache/solr/cloud/hdfs/StressHdfsTest.java | 1 +
.../solr/cloud/rule/ImplicitSnitchTest.java | 2 +
.../apache/solr/core/TestDynamicLoading.java | 2 +-
.../FieldAnalysisRequestHandlerTest.java | 2 +-
.../apache/solr/handler/RequestLoggingTest.java | 6 +-
.../solr/handler/TestReplicationHandler.java | 5 +-
.../org/apache/solr/handler/TestSQLHandler.java | 244 +++-
.../TestSolrConfigHandlerConcurrent.java | 38 +-
.../solr/handler/admin/MetricsHandlerTest.java | 4 +-
.../admin/MetricsHistoryHandlerTest.java | 1 +
.../admin/SegmentsInfoRequestHandlerTest.java | 59 +-
.../admin/ZookeeperStatusHandlerTest.java | 1 +
.../DistributedDebugComponentTest.java | 4 +-
.../component/DistributedMLTComponentTest.java | 3 +-
.../PhrasesIdentificationComponentTest.java | 796 +++++++++++
.../handler/component/StatsComponentTest.java | 10 +-
.../solr/handler/export/TestExportWriter.java | 49 +
.../solr/metrics/SolrMetricReporterTest.java | 4 +-
.../reporters/solr/SolrCloudReportersTest.java | 5 +-
.../metrics/rrd/SolrRrdBackendFactoryTest.java | 3 +-
.../apache/solr/request/SimpleFacetsTest.java | 2 +-
.../response/TestRetrieveFieldsOptimizer.java | 642 ++++++++-
.../transform/TestChildDocTransformer.java | 58 +-
.../TestChildDocTransformerHierarchy.java | 387 +++++
.../solr/rest/TestManagedResourceStorage.java | 3 +-
.../schema/TestFieldCollectionResource.java | 10 +-
.../solr/rest/schema/TestFieldTypeResource.java | 3 +-
.../solr/schema/CurrencyFieldTypeTest.java | 2 +-
.../solr/schema/SchemaApiFailureTest.java | 1 +
.../org/apache/solr/schema/TestPointFields.java | 2 +-
.../solr/schema/TestSortableTextField.java | 4 +-
.../search/CurrencyRangeFacetCloudTest.java | 4 +-
.../apache/solr/search/QueryEqualityTest.java | 2 +-
.../solr/search/TestCollapseQParserPlugin.java | 18 +-
.../solr/search/TestHashQParserPlugin.java | 35 +-
.../org/apache/solr/search/TestRangeQuery.java | 2 +-
.../apache/solr/search/TestRankQueryPlugin.java | 39 +-
.../apache/solr/search/TestStressRecovery.java | 3 +
.../solr/search/facet/RangeFacetCloudTest.java | 2 +-
.../search/function/SortByFunctionTest.java | 8 +-
.../solr/search/stats/TestDistribIDF.java | 3 +-
.../solr/security/BasicAuthIntegrationTest.java | 2 +-
.../hadoop/TestDelegationWithHadoopAuth.java | 3 +-
.../solr/servlet/HttpSolrCallGetCoreTest.java | 3 +-
.../solr/store/hdfs/HdfsDirectoryTest.java | 7 +-
.../TestDocTermOrdsUninvertLimit.java | 2 +-
.../solr/update/MaxSizeAutoCommitTest.java | 268 +---
.../apache/solr/update/TestHdfsUpdateLog.java | 2 +
.../solr/update/TestInPlaceUpdatesDistrib.java | 3 +-
.../solr/update/TestNestedUpdateProcessor.java | 14 +-
...dSchemaFieldsUpdateProcessorFactoryTest.java | 15 +
.../ParsingFieldUpdateProcessorsTest.java | 145 +-
.../processor/TestNamedUpdateProcessors.java | 2 +-
.../TimeRoutedAliasUpdateProcessorTest.java | 237 +++-
.../TrackingUpdateProcessorFactory.java | 136 +-
.../apache/solr/util/DateMathParserTest.java | 4 +-
.../solr/util/TestMaxTokenLenTokenizer.java | 20 +-
.../example-DIH/solr/db/conf/managed-schema | 34 +
.../example-DIH/solr/mail/conf/managed-schema | 34 +
.../example-DIH/solr/solr/conf/managed-schema | 34 +
solr/example/files/conf/managed-schema | 9 +
solr/example/files/conf/solrconfig.xml | 8 +-
solr/licenses/commons-compress-1.16.1.jar.sha1 | 1 -
solr/licenses/commons-compress-1.18.jar.sha1 | 1 +
solr/licenses/junit4-ant-2.6.0.jar.sha1 | 1 -
solr/licenses/junit4-ant-2.6.4.jar.sha1 | 1 +
.../randomizedtesting-runner-2.6.0.jar.sha1 | 1 -
.../randomizedtesting-runner-2.6.4.jar.sha1 | 1 +
.../configsets/_default/conf/managed-schema | 34 +
.../configsets/_default/conf/solrconfig.xml | 8 +-
.../conf/managed-schema | 34 +
solr/solr-ref-guide/build.xml | 18 +-
solr/solr-ref-guide/src/_layouts/page.html | 2 +-
solr/solr-ref-guide/src/analytics.adoc | 2 +-
.../src/basic-authentication-plugin.adoc | 4 +-
solr/solr-ref-guide/src/cloud-screens.adoc | 12 +-
solr/solr-ref-guide/src/collections-api.adoc | 92 +-
.../src/colocating-collections.adoc | 26 +-
.../src/common-query-parameters.adoc | 6 +-
solr/solr-ref-guide/src/configsets-api.adoc | 2 +-
.../src/configuring-solrconfig-xml.adoc | 4 +-
solr/solr-ref-guide/src/coreadmin-api.adoc | 8 +-
solr/solr-ref-guide/src/css/ref-guide.css | 5 +
solr/solr-ref-guide/src/css/theme-solr.css | 21 +-
solr/solr-ref-guide/src/curve-fitting.adoc | 166 ++-
.../detecting-languages-during-indexing.adoc | 2 +-
.../src/distributed-requests.adoc | 4 +-
solr/solr-ref-guide/src/docvalues.adoc | 22 +-
solr/solr-ref-guide/src/dsp.adoc | 74 +-
.../solr-ref-guide/src/filter-descriptions.adoc | 8 +-
solr/solr-ref-guide/src/format-of-solr-xml.adoc | 4 +-
solr/solr-ref-guide/src/index.adoc | 19 +-
.../src/indexconfig-in-solrconfig.adoc | 14 +-
.../src/initparams-in-solrconfig.adoc | 2 +-
solr/solr-ref-guide/src/json-facet-api.adoc | 123 +-
solr/solr-ref-guide/src/language-analysis.adoc | 45 +-
solr/solr-ref-guide/src/learning-to-rank.adoc | 2 +-
.../src/lib-directives-in-solrconfig.adoc | 38 -
.../src/local-parameters-in-queries.adoc | 2 +-
solr/solr-ref-guide/src/machine-learning.adoc | 406 ++++--
.../src/making-and-restoring-backups.adoc | 2 +
solr/solr-ref-guide/src/math-expressions.adoc | 30 +-
solr/solr-ref-guide/src/matrix-math.adoc | 20 +-
solr/solr-ref-guide/src/metrics-reporting.adoc | 6 +-
solr/solr-ref-guide/src/numerical-analysis.adoc | 114 +-
solr/solr-ref-guide/src/other-parsers.adoc | 6 +-
.../src/other-schema-elements.adoc | 2 +-
.../src/pagination-of-results.adoc | 2 +-
.../src/probability-distributions.adoc | 100 +-
solr/solr-ref-guide/src/regression.adoc | 77 +-
.../src/resource-and-plugin-loading.adoc | 86 ++
.../src/rule-based-replica-placement.adoc | 2 +-
solr/solr-ref-guide/src/scalar-math.adoc | 4 +-
solr/solr-ref-guide/src/schemaless-mode.adoc | 8 +-
solr/solr-ref-guide/src/searching.adoc | 2 -
solr/solr-ref-guide/src/simulations.adoc | 122 +-
solr/solr-ref-guide/src/solr-upgrade-notes.adoc | 73 +-
...solrcloud-autoscaling-auto-add-replicas.adoc | 6 +-
.../src/solrcloud-autoscaling-overview.adoc | 25 +-
...olrcloud-autoscaling-policy-preferences.adoc | 316 +++--
.../src/solrcloud-autoscaling-triggers.adoc | 391 ++++--
...rcloud-query-routing-and-read-tolerance.adoc | 60 +-
solr/solr-ref-guide/src/spell-checking.adoc | 2 +-
.../src/statistical-programming.adoc | 741 ----------
solr/solr-ref-guide/src/statistics.adoc | 58 +-
.../src/stream-decorator-reference.adoc | 160 ++-
.../src/stream-evaluator-reference.adoc | 4 +-
.../src/stream-source-reference.adoc | 36 +-
.../src/streaming-expressions.adoc | 2 +-
solr/solr-ref-guide/src/suggester.adoc | 8 +-
solr/solr-ref-guide/src/term-vectors.adoc | 91 +-
solr/solr-ref-guide/src/time-series.adoc | 14 +-
solr/solr-ref-guide/src/tokenizers.adoc | 2 +-
.../transforming-and-indexing-custom-json.adoc | 2 +-
.../src/transforming-result-documents.adoc | 65 +-
.../src/update-request-processors.adoc | 4 +-
.../src/uploading-data-with-index-handlers.adoc | 83 +-
...store-data-with-the-data-import-handler.adoc | 33 +-
solr/solr-ref-guide/src/variables.adoc | 197 ++-
solr/solr-ref-guide/src/vector-math.adoc | 50 +-
solr/solr-ref-guide/src/vectorization.adoc | 108 +-
.../tools/CheckLinksAndAnchors.java | 2 +-
.../cloud/autoscaling/AddReplicaSuggester.java | 10 +-
.../cloud/autoscaling/AutoScalingConfig.java | 44 +-
.../client/solrj/cloud/autoscaling/Clause.java | 270 ++--
.../solrj/cloud/autoscaling/Condition.java | 18 +-
.../solrj/cloud/autoscaling/CoresVariable.java | 8 +-
.../cloud/autoscaling/FreeDiskVariable.java | 40 +-
.../cloud/autoscaling/MoveReplicaSuggester.java | 3 +-
.../solrj/cloud/autoscaling/NodeVariable.java | 5 +-
.../client/solrj/cloud/autoscaling/Operand.java | 1 +
.../client/solrj/cloud/autoscaling/Policy.java | 32 +-
.../solrj/cloud/autoscaling/PolicyHelper.java | 70 +-
.../solrj/cloud/autoscaling/RangeVal.java | 10 +-
.../solrj/cloud/autoscaling/ReplicaCount.java | 54 +-
.../solrj/cloud/autoscaling/ReplicaInfo.java | 45 +-
.../cloud/autoscaling/ReplicaVariable.java | 19 +-
.../client/solrj/cloud/autoscaling/Row.java | 35 +-
.../solrj/cloud/autoscaling/Suggester.java | 14 +-
.../solrj/cloud/autoscaling/Suggestion.java | 43 +-
.../solrj/cloud/autoscaling/Variable.java | 31 +-
.../solrj/cloud/autoscaling/VariableBase.java | 31 +-
.../solrj/cloud/autoscaling/Violation.java | 39 +-
.../autoscaling/WithCollectionVariable.java | 3 +-
.../solr/client/solrj/impl/CloudSolrClient.java | 13 +-
.../solr/client/solrj/impl/HttpClientUtil.java | 14 +-
.../solrj/impl/Krb5HttpClientBuilder.java | 12 +-
.../solrj/impl/SolrClientNodeStateProvider.java | 2 +-
.../org/apache/solr/client/solrj/io/Lang.java | 10 +
.../client/solrj/io/eval/GaussFitEvaluator.java | 91 ++
.../client/solrj/io/eval/GetCacheEvaluator.java | 57 +
.../solr/client/solrj/io/eval/KnnEvaluator.java | 22 +-
.../solrj/io/eval/KnnRegressionEvaluator.java | 238 ++++
.../solrj/io/eval/LatLonVectorsEvaluator.java | 115 ++
.../solrj/io/eval/ListCacheEvaluator.java | 73 +
.../solrj/io/eval/MinMaxScaleEvaluator.java | 2 +-
.../client/solrj/io/eval/OutliersEvaluator.java | 138 ++
.../client/solrj/io/eval/PredictEvaluator.java | 34 +-
.../client/solrj/io/eval/PutCacheEvaluator.java | 61 +
.../solrj/io/eval/RemoveCacheEvaluator.java | 57 +
.../solr/client/solrj/io/sql/StatementImpl.java | 2 +-
.../client/solrj/io/stream/CloudSolrStream.java | 10 +-
.../client/solrj/io/stream/CommitStream.java | 4 +-
.../client/solrj/io/stream/DaemonStream.java | 14 +-
.../client/solrj/io/stream/ExecutorStream.java | 8 +-
.../client/solrj/io/stream/FacetStream.java | 7 +-
.../io/stream/FeaturesSelectionStream.java | 2 +-
.../solr/client/solrj/io/stream/SolrStream.java | 6 +-
.../client/solrj/io/stream/StreamContext.java | 10 +
.../client/solrj/io/stream/TextLogitStream.java | 2 +-
.../solrj/io/stream/TimeSeriesStream.java | 2 +
.../client/solrj/io/stream/TopicStream.java | 6 +-
.../client/solrj/io/stream/TupleStream.java | 2 +-
.../client/solrj/io/stream/UpdateStream.java | 6 +-
.../solrj/request/CollectionAdminRequest.java | 72 +
.../solrj/request/ConfigSetAdminRequest.java | 5 +-
.../solr/client/solrj/request/V2Request.java | 2 +-
.../solrj/request/schema/SchemaRequest.java | 2 +-
.../solr/common/ConditionalMapWriter.java | 82 ++
.../java/org/apache/solr/common/MapWriter.java | 6 +
.../org/apache/solr/common/SolrDocument.java | 4 +-
.../solr/common/cloud/ClusterProperties.java | 23 +-
.../solr/common/cloud/ClusterStateUtil.java | 4 +-
.../solr/common/cloud/CompositeIdRouter.java | 2 +-
.../apache/solr/common/cloud/DocCollection.java | 9 +
.../solr/common/cloud/HashBasedRouter.java | 3 +-
.../solr/common/cloud/ZkConfigManager.java | 4 +-
.../apache/solr/common/cloud/ZkStateReader.java | 140 +-
.../org/apache/solr/common/util/IOUtils.java | 4 +-
.../java/org/apache/solr/common/util/Utils.java | 56 +-
.../apispec/cluster.configs.Commands.json | 2 +-
.../resources/apispec/collections.Commands.json | 4 +
.../testAutoScalingHandlerFailure.json | 141 ++
.../testScheduledTriggerFailure.json | 52 +
.../solrj/solr/autoscaling/testSortError.json | 225 +++
.../autoscaling/testSysPropSuggestions.json | 119 ++
.../autoscaling/testUtilizeNodeFailure.json | 69 +
.../autoscaling/testUtilizeNodeFailure2.json | 66 +
.../solrj/solr/collection1/conf/schema-sql.xml | 13 -
.../solrj/solr/collection1/conf/schema.xml | 13 -
.../solr/configsets/streaming/conf/schema.xml | 11 -
.../solr/client/solrj/SolrExampleTests.java | 4 +-
.../solr/client/solrj/SolrExceptionTest.java | 3 +
.../solrj/beans/TestDocumentObjectBinder.java | 4 +
.../solrj/cloud/autoscaling/TestPolicy.java | 611 +-------
.../solrj/cloud/autoscaling/TestPolicy2.java | 111 +-
.../solrj/embedded/LargeVolumeJettyTest.java | 3 +-
.../solrj/impl/CloudSolrClientBuilderTest.java | 6 +
.../CloudSolrClientMultiConstructorTest.java | 3 +
.../solrj/impl/CloudSolrClientRetryTest.java | 79 ++
.../client/solrj/impl/CloudSolrClientTest.java | 5 +-
.../ConcurrentUpdateSolrClientBuilderTest.java | 1 +
.../client/solrj/impl/HttpClientUtilTest.java | 6 +-
.../client/solrj/impl/LBHttpSolrClientTest.java | 2 +
.../apache/solr/client/solrj/io/TestLang.java | 3 +-
.../solrj/io/graph/GraphExpressionTest.java | 2 +-
.../solr/client/solrj/io/graph/GraphTest.java | 2 +-
.../solrj/io/stream/MathExpressionTest.java | 334 ++++-
.../solrj/io/stream/StreamDecoratorTest.java | 29 +-
.../solrj/io/stream/StreamExpressionTest.java | 18 +-
.../stream/StreamExpressionToExpessionTest.java | 2 +
.../StreamExpressionToExplanationTest.java | 2 +
.../client/solrj/io/stream/StreamingTest.java | 68 +
.../request/TestCollectionAdminRequest.java | 5 +
.../request/TestConfigSetAdminRequest.java | 2 -
.../solrj/request/TestUpdateRequestCodec.java | 5 +-
.../solrj/request/TestV1toV2ApiMapper.java | 11 +-
.../solrj/response/QueryResponseTest.java | 6 +-
.../response/TestDelegationTokenResponse.java | 2 +
.../solr/common/TestToleratedUpdateError.java | 5 +-
.../cloud/TestCloudCollectionsListeners.java | 3 +
.../solr/common/params/ShardParamsTest.java | 5 +-
.../apache/solr/common/util/NamedListTest.java | 7 +-
.../solr/common/util/TestFastInputStream.java | 1 +
.../solr/common/util/TestNamedListCodec.java | 11 +-
.../solr/BaseDistributedSearchTestCase.java | 2 +-
.../apache/solr/cloud/MiniSolrCloudCluster.java | 9 +-
.../apache/solr/cloud/SolrCloudTestCase.java | 88 +-
.../java/org/apache/solr/util/TestHarness.java | 5 +-
solr/webapp/web/WEB-INF/web.xml | 101 +-
solr/webapp/web/js/angular/controllers/cloud.js | 9 +-
934 files changed, 31484 insertions(+), 15805 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/08f7e670/solr/CHANGES.txt
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/08f7e670/solr/webapp/web/WEB-INF/web.xml
----------------------------------------------------------------------
[04/27] lucene-solr:solr7896-login-page: WIP add login page with
bootstrap
Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/libs/bootstrap.min.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/libs/bootstrap.min.js b/solr/webapp/web/libs/bootstrap.min.js
new file mode 100644
index 0000000..1a6258e
--- /dev/null
+++ b/solr/webapp/web/libs/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert"
)),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b
=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.
options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this
.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeC
lass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data(
)),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.remov
eClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTra
nsitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function
(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled
")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this
.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&
!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.rem
ove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal
",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigg
er:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefau
lts();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade")
;var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a
,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transitio
n&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeo
f c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tool
tip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getConte
nt=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.of
fsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarge
t=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.
find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [d
ata-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unp
in&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery);
\ No newline at end of file
[17/27] lucene-solr:solr7896-login-page: WIP - login screen now works,
but static always require login.
Posted by ja...@apache.org.
WIP - login screen now works, but static always require login.
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/90dcf6ed
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/90dcf6ed
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/90dcf6ed
Branch: refs/heads/solr7896-login-page
Commit: 90dcf6eda70610eb32652ba7257b9f3656558f82
Parents: 5bb585c
Author: Jan Høydahl <ja...@apache.org>
Authored: Tue Sep 25 00:40:33 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Tue Sep 25 00:40:33 2018 +0200
----------------------------------------------------------------------
solr/webapp/web/index.html | 2 +-
solr/webapp/web/js/angular/app.js | 5 +++++
solr/webapp/web/js/angular/controllers/login.js | 21 +++++++++++---------
solr/webapp/web/js/angular/services.js | 16 +++++++--------
solr/webapp/web/partials/login.html | 10 ++++------
5 files changed, 30 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/90dcf6ed/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index f36dc13..d832155 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -23,7 +23,7 @@ limitations under the License.
<link rel="icon" type="image/x-icon" href="img/favicon.ico?_=${version}">
<link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico?_=${version}">
- <link rel="stylesheet" type="text/css" href="css/bootstrap-3.3/bootstrap.min.css?_=${version}">
+ <!--<link rel="stylesheet" type="text/css" href="css/bootstrap-3.3/bootstrap.min.css?_=${version}">-->
<link rel="stylesheet" type="text/css" href="css/angular/common.css?_=${version}">
<link rel="stylesheet" type="text/css" href="css/angular/analysis.css?_=${version}">
<link rel="stylesheet" type="text/css" href="css/angular/cloud.css?_=${version}">
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/90dcf6ed/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index a0bc4ab..71dd98b 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -410,10 +410,13 @@ solrAdminApp.config([
// so that the browser will not interfer with the login dialogue
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
})
+
+
// NOCOMMIT: just for testing
.run(['$rootScope', '$location', '$cookieStore', '$http',
function ($rootScope, $location, $cookieStore, $http) {
// keep user logged in after page refresh
+ // Replace with interceptor
$rootScope.globals = $cookieStore.get('globals') || {};
if ($rootScope.globals.currentUser) {
$http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
@@ -426,6 +429,8 @@ solrAdminApp.config([
}
});
}])
+
+
.directive('fileModel', function ($parse) {
return {
restrict: 'A',
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/90dcf6ed/solr/webapp/web/js/angular/controllers/login.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/controllers/login.js b/solr/webapp/web/js/angular/controllers/login.js
index b0b7096..653ca14 100644
--- a/solr/webapp/web/js/angular/controllers/login.js
+++ b/solr/webapp/web/js/angular/controllers/login.js
@@ -23,14 +23,17 @@ solrAdminApp.controller('LoginController',
$scope.login = function () {
$scope.dataLoading = true;
- AuthenticationService.Login($scope.username, $scope.password, function (response) {
- if (response.success) {
- AuthenticationService.SetCredentials($scope.username, $scope.password);
- $location.path('/');
- } else {
- $scope.error = response.message;
- $scope.dataLoading = false;
- }
- });
+ AuthenticationService.SetCredentials($scope.username, $scope.password);
+ $location.path('/');
+ // TODO: "login" by hitting the failing URL again
+ // AuthenticationService.Login($scope.username, $scope.password, function (response) {
+ // if (response.success) {
+ // AuthenticationService.SetCredentials($scope.username, $scope.password);
+ // $location.path('/');
+ // } else {
+ // $scope.error = response.message;
+ // $scope.dataLoading = false;
+ // }
+ // });
};
}]);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/90dcf6ed/solr/webapp/web/js/angular/services.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/services.js b/solr/webapp/web/js/angular/services.js
index ffd7135..b6df864 100644
--- a/solr/webapp/web/js/angular/services.js
+++ b/solr/webapp/web/js/angular/services.js
@@ -272,18 +272,18 @@ solrAdminServices.factory('System',
/* NOCOMMIT Dummy authentication for testing, uses $timeout to simulate api call
----------------------------------------------*/
- $timeout(function () {
- var response = { success: username === 'test' && password === 'test' };
- if (!response.success) {
- response.message = 'Username or password is incorrect';
- }
- callback(response);
- }, 1000);
+ // $timeout(function () {
+ // var response = { success: username === 'test' && password === 'test' };
+ // if (!response.success) {
+ // response.message = 'Username or password is incorrect';
+ // }
+ // callback(response);
+ // }, 1000);
/* Use this for real authentication
----------------------------------------------*/
- //$http.post('/api/authenticate', { username: username, password: password })
+ // $http.post('/api/authenticate', { username: username, password: password })
// .success(function (response) {
// callback(response);
// });
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/90dcf6ed/solr/webapp/web/partials/login.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/partials/login.html b/solr/webapp/web/partials/login.html
index cae1cc8..65be563 100644
--- a/solr/webapp/web/partials/login.html
+++ b/solr/webapp/web/partials/login.html
@@ -14,13 +14,11 @@ 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.
-->
-<div id="login" class="jumbotron">
-
+<div id="login">
<div class="col-xs-offset-2 col-xs-8">
- <div class="alert alert-info">
- Username: test<br />
- Password: test
- </div>
+ <h1>Please log in</h1>
+ Basic Authentication
+
<div ng-show="error" class="alert alert-danger">{{error}}</div>
<form name="form" ng-submit="login()" role="form">
<div class="form-group">
[12/27] lucene-solr:solr7896-login-page: Add RefGuide section
Posted by ja...@apache.org.
Add RefGuide section
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/c31d8df7
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/c31d8df7
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/c31d8df7
Branch: refs/heads/solr7896-login-page
Commit: c31d8df715b0aec025aca2eaa3cadefc89204e89
Parents: 08f7e67
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Sep 24 14:43:50 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Sep 24 14:43:50 2018 +0200
----------------------------------------------------------------------
solr/CHANGES.txt | 2 +-
.../src/authentication-and-authorization-plugins.adoc | 10 ++++++++++
solr/webapp/web/js/angular/app.js | 2 +-
3 files changed, 12 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c31d8df7/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 3e22b42..500da1b 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -529,7 +529,7 @@ New Features
* SOLR-11913: SolrJ SolrParams now implements Iterable<Map.Entry<String, String[]>> and also has a stream() method
using it for convenience. (David Smiley, Tapan Vaishnav)
-* SOLR-7896: Add a login page to Admin UI (janhoy)
+* SOLR-7896: Add a login page to Admin UI, with initial support for Basic Auth (janhoy)
* SOLR-11924: Added the ability to listen to changes in the set of active collections in a cloud
in the ZkStateReader, through the CloudCollectionsListener. (Houston Putman, Dennis Gove)
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c31d8df7/solr/solr-ref-guide/src/authentication-and-authorization-plugins.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/authentication-and-authorization-plugins.adoc b/solr/solr-ref-guide/src/authentication-and-authorization-plugins.adoc
index 971dbcd..dabd869 100644
--- a/solr/solr-ref-guide/src/authentication-and-authorization-plugins.adoc
+++ b/solr/solr-ref-guide/src/authentication-and-authorization-plugins.adoc
@@ -157,6 +157,16 @@ Solr has one implementation of an authorization plugin:
* <<rule-based-authorization-plugin.adoc#rule-based-authorization-plugin,Rule-Based Authorization Plugin>>
+== Authenticating in the Admin UI
+
+Whenever an authentication plugin is enabled, authentication is also required for all or some operations in the Admin UI. The Admin UI is an AngularJS application running inside your browser, and is treated as any other external client by Solr.
+
+When authentication is required the Admin UI will presented you with a login dialogue. The authentication plugins currently supported by the Admin UI are:
+
+* `BasicAuthPlugin`
+
+If your plugin of choice is not supported, you will have to interact with Solr sending HTTP requests instead of through the graphical user interface of the Admin UI. All operations supported by Admin UI can be performed through Solr's RESTful APIs.
+
== Securing Inter-Node Requests
There are a lot of requests that originate from the Solr nodes itself. For example, requests from overseer to nodes, recovery threads, etc. Each Authentication plugin declares whether it is capable of securing inter-node requests or not. If not, Solr will fall back to using a special internode authentication mechanism where each Solr node is a super user and is fully trusted by other Solr nodes, described below.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c31d8df7/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index 3f781cd..fe686fe 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -402,7 +402,7 @@ solrAdminApp.config([
$httpProvider.interceptors.push("httpInterceptor");
$httpProvider.interceptors.push("authInterceptor");
// Tell the BasicAuth plugin that we are Admin UI so it can serve us a 'Authorization: xBasic xxxx' header
- // so that the browser will not intercept the login dialogue
+ // so that the browser will not interfer with the login dialogue
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
})
.directive('fileModel', function ($parse) {
[07/27] lucene-solr:solr7896-login-page: WIP add login page with
bootstrap
Posted by ja...@apache.org.
WIP add login page with bootstrap
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/5728c9be
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/5728c9be
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/5728c9be
Branch: refs/heads/solr7896-login-page
Commit: 5728c9be70a4decb0747080b9f3fc4ebc10e0d6c
Parents: 2ac10e4
Author: Jan Høydahl <ja...@apache.org>
Authored: Fri Apr 20 13:43:14 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Fri Apr 20 13:43:14 2018 +0200
----------------------------------------------------------------------
solr/webapp/templates/loginDialog.html | 30 +
solr/webapp/templates/logoutLink.html | 1 +
solr/webapp/web/WEB-INF/web.xml | 2 +-
solr/webapp/web/css/bootstrap.min.css | 7 +
solr/webapp/web/index.html | 3 +
solr/webapp/web/js/angular/app.js | 2 +-
solr/webapp/web/js/angular/directives.js | 68 +
.../web/js/angular/http-auth-interceptor.js | 122 ++
solr/webapp/web/js/angular/login-controllers.js | 37 +
solr/webapp/web/libs/bootstrap.js | 2006 ++++++++++++++++++
solr/webapp/web/libs/bootstrap.min.js | 7 +
11 files changed, 2283 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/templates/loginDialog.html
----------------------------------------------------------------------
diff --git a/solr/webapp/templates/loginDialog.html b/solr/webapp/templates/loginDialog.html
new file mode 100644
index 0000000..a217daa
--- /dev/null
+++ b/solr/webapp/templates/loginDialog.html
@@ -0,0 +1,30 @@
+<div class="modal fade" id="loginModal" tabindex="-1" role="dialog" aria-labelledby="loginModalLabel" aria-hidden="true" data-backdrop="static">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <form ng-submit="submit()" name="loginCredentialsForm" role="form">
+ <div class="modal-header">
+ <h4 class="modal-title" id="loginModalLabel">Enter credentials</h4>
+ </div>
+ <div class="modal-body">
+ <div class="form-horizontal">
+ <div class="form-group">
+ <label class="col-lg-4 control-label" for="userName">User name</label>
+ <div class="col-lg-4">
+ <input type="text" class="form-control" ng-model="credentials.userName" id="userName" placeholder="User name">
+ </div>
+ </div>
+ <div class="form-group">
+ <label class="col-lg-4 control-label" for="password">Password</label>
+ <div class="col-lg-4">
+ <input type="password" class="form-control" ng-model="credentials.password" id="password" placeholder="Password">
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <input type="submit" class="btn btn-primary" value="Log in"></input>
+ </div>
+ </form>
+ </div>
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/templates/logoutLink.html
----------------------------------------------------------------------
diff --git a/solr/webapp/templates/logoutLink.html b/solr/webapp/templates/logoutLink.html
new file mode 100644
index 0000000..0796ed9
--- /dev/null
+++ b/solr/webapp/templates/logoutLink.html
@@ -0,0 +1 @@
+<p ng-show="isLoggedIn()" class="navbar-text navbar-right"><a href="" ng-click="logOut()">Log out</a></p>
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/solr/webapp/web/WEB-INF/web.xml b/solr/webapp/web/WEB-INF/web.xml
index 22082c8..d3ec13e 100644
--- a/solr/webapp/web/WEB-INF/web.xml
+++ b/solr/webapp/web/WEB-INF/web.xml
@@ -56,7 +56,7 @@
-->
<init-param>
<param-name>excludePatterns</param-name>
- <param-value>/partials/.+,/libs/.+,/css/.+,/js/.+,/img/.+</param-value>
+ <param-value>/partials/.+,/libs/.+,/css/.+,/js/.+,/img/.+,/templates/.+</param-value>
</init-param>
</filter>
[25/27] lucene-solr:solr7896-login-page: Working for basic auth
Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css
----------------------------------------------------------------------
diff --git a/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css b/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css
deleted file mode 100644
index ed3905e..0000000
--- a/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;fo
nt-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}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{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;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-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:
auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!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:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px so
lid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.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:bef
ore{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:b
efore{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:befo
re{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{con
tent:"\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-bu
llhorn: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{co
ntent:"\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"}.gly
phicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}
.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\
e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hambu
rger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon
-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6
px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.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;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weigh
t:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,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,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-c
apitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px
;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height
:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#3
33;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;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{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{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{rig
ht:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6
{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{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.33
333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offs
et-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-
push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.666666
67%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667
%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{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>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;di
splay:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{bac
kground-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>t
d,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin
-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr
>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{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[ty
pe=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.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-p
laceholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-g
roup-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disable
d],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .f
orm-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-con
trol-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{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;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color
:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{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;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error
.radio-inline label{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;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-
inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-ali
gn:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-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;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-def
ault:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggl
e.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;bo
rder-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.b
tn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;
border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning
:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-dang
er.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm
{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;wid
th:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{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;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;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)}.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:focus,.dropdown-menu>li>a:hover{color:#262626;text-deco
ration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bott
om:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last
-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.b
tn-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-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-chi
ld){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle
=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.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}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn: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=checkbox],.input-group-addon input[type=radio]{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-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-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:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:no
t(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-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:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-dec
oration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.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-ta
bs.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:focus,.nav-tabs.nav-justified>.active>a:hover{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:focus,.nav-tabs.nav-justified>.active>a:hover{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:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.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:focus,.nav-tabs-justified>.active>a:hover{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:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-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{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent
;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;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-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.
container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{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-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{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;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;bord
er-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;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15
px;margin-bottom:8px;margin-left:-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)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .rad
io label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left
;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{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:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd
}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{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:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:f
ocus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>
.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{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:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .na
vbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color
:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pag
ination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3p
x;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.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:focus,.pager li>a:hover{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:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.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}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{posit
ion:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-
1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;paddin
g:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9ed
f7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.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}}@-o-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{height:20px;margin-bottom:20px;overflow:hidden;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:ce
nter;background-color:#337ab7;-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;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.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:-o-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);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:prog
ress-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:-o-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-i
mage:-o-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:-o-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-dang
er{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:-o-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{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{ver
tical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:non
<TRUNCATED>
[26/27] lucene-solr:solr7896-login-page: Working for basic auth
Posted by ja...@apache.org.
Working for basic auth
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/54dfca9a
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/54dfca9a
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/54dfca9a
Branch: refs/heads/solr7896-login-page
Commit: 54dfca9a7243debff2b6b8ccaa19ae3ab78cceff
Parents: 44fa134
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Oct 8 16:14:20 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Oct 8 16:14:20 2018 +0200
----------------------------------------------------------------------
.../web/css/bootstrap-3.3/bootstrap.min.css | 6 -
solr/webapp/web/index.html | 1 -
solr/webapp/web/js/angular/app.js | 22 +-
solr/webapp/web/js/angular/controllers/login.js | 116 +-
solr/webapp/web/js/angular/services.js | 6 +-
solr/webapp/web/libs/bootstrap.js | 2006 ------------------
solr/webapp/web/libs/bootstrap.min.js | 7 -
solr/webapp/web/partials/login.html | 12 +-
8 files changed, 121 insertions(+), 2055 deletions(-)
----------------------------------------------------------------------
[27/27] lucene-solr:solr7896-login-page: Styled the login page
Conditional show login/logout xxx menu, with icon
Posted by ja...@apache.org.
Styled the login page
Conditional show login/logout xxx menu, with icon
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/954cbf12
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/954cbf12
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/954cbf12
Branch: refs/heads/solr7896-login-page
Commit: 954cbf1273992213e9048b62507719c168f58ea5
Parents: 54dfca9
Author: Jan Høydahl <ja...@apache.org>
Authored: Tue Oct 9 11:08:42 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Tue Oct 9 11:08:42 2018 +0200
----------------------------------------------------------------------
solr/webapp/web/css/angular/login.css | 95 ++++++++++++++++++++
solr/webapp/web/css/angular/menu.css | 2 +
solr/webapp/web/index.html | 3 +-
solr/webapp/web/js/angular/app.js | 8 ++
solr/webapp/web/js/angular/controllers/login.js | 7 +-
solr/webapp/web/js/angular/services.js | 31 +------
solr/webapp/web/partials/login.html | 70 ++++++++-------
7 files changed, 154 insertions(+), 62 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/css/angular/login.css
----------------------------------------------------------------------
diff --git a/solr/webapp/web/css/angular/login.css b/solr/webapp/web/css/angular/login.css
new file mode 100644
index 0000000..43cd715
--- /dev/null
+++ b/solr/webapp/web/css/angular/login.css
@@ -0,0 +1,95 @@
+/*
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+
+*/
+
+#content #login
+{
+ background-position: 0 50%;
+ padding-left: 21px;
+ vertical-align: center;
+ horiz-align: center;
+}
+
+#content #login h1,
+#content #login .h1 {
+ font-size: 2.5rem;
+}
+
+#content #login h2,
+#content #login .h2 {
+ font-size: 2rem;
+}
+
+#content #login p
+{
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+#content #login button {
+ border-radius: 0;
+}
+
+#content #login button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+}
+
+#content #login .btn {
+ display: inline-block;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: middle;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ border: 1px solid transparent;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ line-height: 1.5;
+ border-radius: 0.25rem;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+#content #login .form-inline .form-group {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -ms-flex-align: center;
+ align-items: center;
+ margin-bottom: 0;
+}
+
+#content #login .form-control {
+ display: block;
+ width: 80%;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ line-height: 1.5;
+ color: #495057;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ced4da;
+ border-radius: 0.25rem;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/css/angular/menu.css
----------------------------------------------------------------------
diff --git a/solr/webapp/web/css/angular/menu.css b/solr/webapp/web/css/angular/menu.css
index f4e04c1..67041e5 100644
--- a/solr/webapp/web/css/angular/menu.css
+++ b/solr/webapp/web/css/angular/menu.css
@@ -247,6 +247,8 @@ limitations under the License.
#menu #index.global p a { background-image: url( ../../img/ico/dashboard.png ); }
+#menu #login.global p a { background-image: url( ../../img/ico/users.png ); }
+
#menu #logging.global p a { background-image: url( ../../img/ico/inbox-document-text.png ); }
#menu #logging.global .level a { background-image: url( ../../img/ico/gear.png ); }
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index 3729aaf..9b36814 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -34,6 +34,7 @@ limitations under the License.
<link rel="stylesheet" type="text/css" href="css/angular/index.css?_=${version}">
<link rel="stylesheet" type="text/css" href="css/angular/java-properties.css?_=${version}">
<link rel="stylesheet" type="text/css" href="css/angular/logging.css?_=${version}">
+ <link rel="stylesheet" type="text/css" href="css/angular/login.css?_=${version}">
<link rel="stylesheet" type="text/css" href="css/angular/menu.css?_=${version}">
<link rel="stylesheet" type="text/css" href="css/angular/plugins.css?_=${version}">
<link rel="stylesheet" type="text/css" href="css/angular/documents.css?_=${version}">
@@ -140,7 +141,7 @@ limitations under the License.
<div>
<ul id="menu">
- <li id="login" class="global" ng-class="{active:page=='login'}"><p><a href="#/login">Login {{$root.globals.currentUser.username}} {{$root.globals}}</a></p></li>
+ <li id="login" class="global" ng-class="{active:page=='login'}" ng-show="http401 || currentUser"><p><a href="#/login">{{http401 ? "Login" : "Logout " + currentUser}}</a></p></li>
<li id="index" class="global" ng-class="{active:page=='index'}"><p><a href="#/">Dashboard</a></p></li>
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index e7fb0b2..d38f914 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -384,6 +384,10 @@ solrAdminApp.config([
};
var ended = function(response) {
+ sessionStorage.removeItem("auth.statusText");
+ if ($location.path() !== '/login') {
+ sessionStorage.removeItem("http401");
+ }
return response || $q.when(response);
};
@@ -392,6 +396,7 @@ solrAdminApp.config([
var headers = rejection.headers();
var wwwAuthHeader = headers['www-authenticate'];
sessionStorage.setItem("auth.wwwAuthHeader", wwwAuthHeader);
+ sessionStorage.setItem("auth.statusText", rejection.statusText);
var authDataHeader = headers['X-Solr-AuthData'];
if (authDataHeader !== null) {
sessionStorage.setItem("auth.config", authDataHeader);
@@ -401,6 +406,7 @@ solrAdminApp.config([
} else {
sessionStorage.setItem("auth.location", $location.path());
}
+ sessionStorage.setItem("http401", "true");
sessionStorage.removeItem("auth.scheme");
sessionStorage.removeItem("auth.realm");
sessionStorage.removeItem("auth.username");
@@ -489,6 +495,8 @@ solrAdminApp.controller('MainController', function($scope, $route, $rootScope, $
$scope.showingLogging = page.lastIndexOf("logging", 0) === 0;
$scope.showingCloud = page.lastIndexOf("cloud", 0) === 0;
$scope.page = page;
+ $scope.currentUser = sessionStorage.getItem("auth.username");
+ $scope.http401 = sessionStorage.getItem("http401");
};
$scope.ping = function() {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/js/angular/controllers/login.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/controllers/login.js b/solr/webapp/web/js/angular/controllers/login.js
index 0c983d0..403f175 100644
--- a/solr/webapp/web/js/angular/controllers/login.js
+++ b/solr/webapp/web/js/angular/controllers/login.js
@@ -16,8 +16,10 @@
*/
solrAdminApp.controller('LoginController',
- ['$scope', '$routeParams', '$rootScope', '$location', 'AuthenticationService',
- function ($scope, $routeParams, $rootScope, $location, AuthenticationService) {
+ ['$scope', '$routeParams', '$rootScope', '$location', 'AuthenticationService', 'Constants',
+ function ($scope, $routeParams, $rootScope, $location, AuthenticationService, Constants) {
+ $scope.resetMenu("login", Constants.IS_ROOT_PAGE);
+
// Session variables set in app.js 401 interceptor
var wwwAuthHeader = sessionStorage.getItem("auth.wwwAuthHeader");
var authDataHeader = sessionStorage.getItem("auth.config");
@@ -45,6 +47,7 @@ solrAdminApp.controller('LoginController',
$scope.authScheme = sessionStorage.getItem("auth.scheme");
$scope.wwwAuthHeader = sessionStorage.getItem("auth.wwwAuthHeader");
+ $scope.statusText = sessionStorage.getItem("auth.statusText");
$scope.authConfig = sessionStorage.getItem("auth.config");
$scope.authLocation = sessionStorage.getItem("auth.location");
$scope.authLoggedinUser = sessionStorage.getItem("auth.username");
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/js/angular/services.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/services.js b/solr/webapp/web/js/angular/services.js
index a055c4b..7f27198 100644
--- a/solr/webapp/web/js/angular/services.js
+++ b/solr/webapp/web/js/angular/services.js
@@ -268,28 +268,6 @@ solrAdminServices.factory('System',
function (Base64, $http, $rootScope, $timeout) {
var service = {};
- service.Login = function (username, password, callback) {
-
- /* NOCOMMIT Dummy authentication for testing, uses $timeout to simulate api call
- ----------------------------------------------*/
- // $timeout(function () {
- // var response = { success: username === 'test' && password === 'test' };
- // if (!response.success) {
- // response.message = 'Username or password is incorrect';
- // }
- // callback(response);
- // }, 1000);
-
-
- /* Use this for real authentication
- ----------------------------------------------*/
- // $http.post('/api/authenticate', { username: username, password: password })
- // .success(function (response) {
- // callback(response);
- // });
-
- };
-
service.SetCredentials = function (username, password) {
var authdata = Base64.encode(username + ':' + password);
@@ -300,22 +278,21 @@ solrAdminServices.factory('System',
// }
// };
//
- sessionStorage.setItem('globals', $rootScope.globals);
+ // sessionStorage.setItem('globals', $rootScope.globals);
sessionStorage.setItem("auth.header", "Basic " + authdata);
sessionStorage.setItem("auth.username", username);
- // $http.defaults.headers.common.Authorization = "Basic " + authdata;
console.log("Stored auth data on session storage");
};
service.ClearCredentials = function () {
- $rootScope.globals = {};
- sessionStorage.removeItem('globals');
+ // $rootScope.globals = {};
+ // sessionStorage.removeItem('globals');
sessionStorage.removeItem("auth.header");
sessionStorage.removeItem("auth.scheme");
sessionStorage.removeItem("auth.realm");
sessionStorage.removeItem("auth.username");
sessionStorage.removeItem("auth.wwwAuthHeader");
- // $http.defaults.headers.common.Authorization = null;
+ sessionStorage.removeItem("auth.statusText");
console.log("Cleared stored auth data");
};
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/partials/login.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/partials/login.html b/solr/webapp/web/partials/login.html
index 89dd427..348eb1f 100644
--- a/solr/webapp/web/partials/login.html
+++ b/solr/webapp/web/partials/login.html
@@ -17,53 +17,59 @@ limitations under the License.
<div id="login" class="clearfix">
<div ng-show="authScheme === 'Basic'">
- <h1>Basic Authentication</h1>
-
- <p>Scheme: {{authScheme}}</p>
- <p>Realm: {{authRealm}}</p>
- <p>WWW-Header: {{wwwAuthHeader}}</p>
- <p>Config: {{authConfig}}</p>
- <p>Redirect: {{authLocation}}</p>
- <p>LoggedinUser: {{authLoggedinUser}}</p>
- <p>AuthHeader: {{authHeader}}</p>
-
- <div ng-show="error" class="alert alert-danger">{{error}}</div>
- <form name="form" ng-submit="login()" role="form" ng-show="!isLoggedIn()">
+ <h1>Basic Authentication</h1>
+ <div ng-show="statusText !== 'require authentication'">
+ <b>{{statusText}}</b>
+ </div>
+ <div ng-show="!isLoggedIn()">
+ <p>
+ Solr requires authentication for resource {{authLocation === '/' ? 'Dashboard' : authLocation}}.<br/>
+ Please log in with your username and password for realm {{authRealm}}.
+ </p>
+ <br/>
+ <div ng-show="error" class="alert alert-danger">{{error}}</div>
+ <form name="form" ng-submit="login()" role="form">
<div class="form-group">
- <label for="username">Username</label>
- <i class="fa fa-key"></i>
- <input type="text" name="username" id="username" class="form-control" ng-model="username" required />
- <span ng-show="form.username.$dirty && form.username.$error.required" class="help-block">Username is required</span>
+ <label for="username">Username</label>
+ <input type="text" name="username" id="username" class="form-control" ng-model="username" required />
+ <span ng-show="form.username.$dirty && form.username.$error.required" class="help-block">Username is required</span>
</div>
<div class="form-group">
- <label for="password">Password</label>
- <i class="fa fa-lock"></i>
- <input type="password" name="password" id="password" class="form-control" ng-model="password" required />
- <span ng-show="form.password.$dirty && form.password.$error.required" class="help-block">Password is required</span>
+ <label for="password">Password</label>
+ <input type="password" name="password" id="password" class="form-control" ng-model="password" required />
+ <span ng-show="form.password.$dirty && form.password.$error.required" class="help-block">Password is required</span>
</div>
+ <br/>
<div class="form-actions">
- <button type="submit" ng-disabled="form.$invalid || dataLoading" class="btn btn-danger">Login</button>
- <img ng-if="dataLoading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
+ <button type="submit" ng-disabled="form.$invalid" class="btn btn-danger">Login</button>
</div>
- </form>
- <form name="logoutForm" ng-submit="logout()" role="form" ng-show="isLoggedIn()">
+ </form>
+ </div>
+
+ <div ng-show="isLoggedIn()">
+ <p>
+ Logged in as user {{authLoggedinUser}}. Realm={{authRealm}}.<br/>
+ </p>
+ <br/>
+ <form name="logoutForm" ng-submit="logout()" role="form" ng-show="isLoggedIn()">
<div class="form-actions">
- <button type="submit" class="btn btn-danger">Logout</button>
+ <button type="submit" class="btn btn-danger">Logout</button>
</div>
- </form>
-
+ </form>
+ </div>
+
</div>
-
-
+
+
<div ng-show="authScheme === 'unknown'">
- <h1>Authentication type not supported</h1>
-
+ <h1>Authentication type not supported</h1>
+
<p>Type: {{authScheme}}</p>
<p>WWW-Header: {{wwwAuthHeader}}</p>
<p>Config: {{authConfig}}</p>
<p>Redirect: {{authLocation}}</p>
<p>LoggedinUser: {{authLoggedinUser}}</p>
- You cannot use Solr's Admin UI for this operation. Please use another client that supports this type.
+ You cannot use Solr's Admin UI for this operation. Please use another client that supports this type.
</div>
</div>
[05/27] lucene-solr:solr7896-login-page: WIP add login page with
bootstrap
Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index 0f9ff84..779f672 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -60,6 +60,9 @@ limitations under the License.
<script src="libs/d3.js"></script>
<script src="js/angular/app.js"></script>
<script src="js/angular/services.js"></script>
+ <script src="js/angular/directives.js"></script>
+ <script src="js/angular/http-auth-interceptor.js"></script>
+ <script src="js/angular/login-controllers.js"></script>
<script src="js/angular/controllers/index.js"></script>
<script src="js/angular/controllers/logging.js"></script>
<script src="js/angular/controllers/cloud.js"></script>
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index 3a2009a..9be1ee5 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -398,7 +398,7 @@ solrAdminApp.config([
})
.config(function($httpProvider) {
$httpProvider.interceptors.push("httpInterceptor");
- $httpProvider.interceptors.push("authInterceptor");
+ //$httpProvider.interceptors.push("authInterceptor");
// Tell the BasicAuth plugin that we are Admin UI so it can serve us a 'Authorization: xBasic xxxx' header
// so that the browser will not intercept the login dialogue
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/js/angular/directives.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/directives.js b/solr/webapp/web/js/angular/directives.js
new file mode 100644
index 0000000..ba6e701
--- /dev/null
+++ b/solr/webapp/web/js/angular/directives.js
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+'use strict';
+
+angular.module('loginDirectives', []).
+directive('loginDialog', function($timeout) {
+ return {
+ templateUrl: '/templates/loginDialog.html',
+ restrict: 'E',
+ replace: true,
+ controller: CredentialsController,
+ link: function(scope, element, attributes, controller) {
+ var isShowing = false;
+
+ element.on('shown.bs.modal', function(e) {
+ element.find('#userName').focus();
+ });
+
+ scope.$on('event:auth-loginRequired', function() {
+ if (isShowing) {
+ return;
+ }
+
+ // If we're in the process of hiding the modal, we need to wait for
+ // all CSS animations to complete before showing the modal again.
+ // Otherwise, we might end up with an invisible modal, making the whole
+ // view rather unusable. I've been unable to control the transitions
+ // between "showing", "shown", "hiding", and "hidden" tightly using
+ // JQuery notifications without collecting more and more modal backdrops
+ // in the DOM, so the dirty solution here is to simply wait a second
+ // before showing the log-in dialog.
+ isShowing = true;
+ $timeout(function() {
+ element.modal('show');
+ isShowing = false;
+ }, 1000);
+ });
+
+ scope.$on('event:auth-loginConfirmed', function() {
+ element.modal('hide');
+ scope.credentials.password = '';
+ });
+ }
+ }
+}).
+directive('logoutLink', function() {
+ return {
+ templateUrl: '/templates/logoutLink.html',
+ restrict: 'E',
+ replace: true,
+ controller: LoginController
+ }
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/js/angular/http-auth-interceptor.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/http-auth-interceptor.js b/solr/webapp/web/js/angular/http-auth-interceptor.js
new file mode 100644
index 0000000..2f34861
--- /dev/null
+++ b/solr/webapp/web/js/angular/http-auth-interceptor.js
@@ -0,0 +1,122 @@
+/*global angular:true, browser:true */
+
+/**
+ * @license HTTP Auth Interceptor Module for AngularJS
+ * (c) 2012 Witold Szczerba
+ * License: MIT
+ */
+(function () {
+ 'use strict';
+
+ angular.module('http-auth-interceptor', ['http-auth-interceptor-buffer'])
+
+ .factory('authService', ['$rootScope','httpBuffer', function($rootScope, httpBuffer) {
+ return {
+ /**
+ * Call this function to indicate that authentication was successfull and trigger a
+ * retry of all deferred requests.
+ * @param data an optional argument to pass on to $broadcast which may be useful for
+ * example if you need to pass through details of the user that was logged in
+ */
+ loginConfirmed: function(data, configUpdater) {
+ var updater = configUpdater || function(config) {return config;};
+ $rootScope.$broadcast('event:auth-loginConfirmed', data);
+ httpBuffer.retryAll(updater);
+ },
+
+ /**
+ * Call this function to indicate that authentication should not proceed.
+ * All deferred requests will be abandoned or rejected (if reason is provided).
+ * @param data an optional argument to pass on to $broadcast.
+ * @param reason if provided, the requests are rejected; abandoned otherwise.
+ */
+ loginCancelled: function(data, reason) {
+ httpBuffer.rejectAll(reason);
+ $rootScope.$broadcast('event:auth-loginCancelled', data);
+ }
+ };
+ }])
+
+ /**
+ * $http interceptor.
+ * On 401 response (without 'ignoreAuthModule' option) stores the request
+ * and broadcasts 'event:angular-auth-loginRequired'.
+ */
+ .config(['$httpProvider', function($httpProvider) {
+ $httpProvider.interceptors.push(['$rootScope', '$q', 'httpBuffer', function($rootScope, $q, httpBuffer) {
+ return {
+ responseError: function(rejection) {
+ if (rejection.status === 401 && !rejection.config.ignoreAuthModule) {
+ var deferred = $q.defer();
+ httpBuffer.append(rejection.config, deferred);
+ $rootScope.$broadcast('event:auth-loginRequired', rejection);
+ return deferred.promise;
+ }
+ // otherwise, default behaviour
+ return $q.reject(rejection);
+ }
+ };
+ }]);
+ }]);
+
+ /**
+ * Private module, a utility, required internally by 'http-auth-interceptor'.
+ */
+ angular.module('http-auth-interceptor-buffer', [])
+
+ .factory('httpBuffer', ['$injector', function($injector) {
+ /** Holds all the requests, so they can be re-requested in future. */
+ var buffer = [];
+
+ /** Service initialized later because of circular dependency problem. */
+ var $http;
+
+ function retryHttpRequest(config, deferred) {
+ // Make room for new 'Authenticate' header value
+ delete config.headers['Authorization'];
+
+ function successCallback(response) {
+ deferred.resolve(response);
+ }
+ function errorCallback(response) {
+ deferred.reject(response);
+ }
+ $http = $http || $injector.get('$http');
+ $http(config).then(successCallback, errorCallback);
+ }
+
+ return {
+ /**
+ * Appends HTTP request configuration object with deferred response attached to buffer.
+ */
+ append: function(config, deferred) {
+ buffer.push({
+ config: config,
+ deferred: deferred
+ });
+ },
+
+ /**
+ * Abandon or reject (if reason provided) all the buffered requests.
+ */
+ rejectAll: function(reason) {
+ if (reason) {
+ for (var i = 0; i < buffer.length; ++i) {
+ buffer[i].deferred.reject(reason);
+ }
+ }
+ buffer = [];
+ },
+
+ /**
+ * Retries all the buffered requests clears the buffer.
+ */
+ retryAll: function(updater) {
+ for (var i = 0; i < buffer.length; ++i) {
+ retryHttpRequest(updater(buffer[i].config), buffer[i].deferred);
+ }
+ buffer = [];
+ }
+ };
+ }]);
+})();
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/js/angular/login-controllers.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/login-controllers.js b/solr/webapp/web/js/angular/login-controllers.js
new file mode 100644
index 0000000..819ccb3
--- /dev/null
+++ b/solr/webapp/web/js/angular/login-controllers.js
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+'use strict';
+
+function CredentialsController($scope, loginService) {
+ $scope.credentials = { userName: '', password: '' };
+
+ $scope.submit = function() {
+ loginService.setUserNameAndPassword($scope.credentials.userName, $scope.credentials.password);
+ }
+}
+
+function LoginController($scope, $location, loginService) {
+ $scope.isLoggedIn = function() {
+ return loginService.isLoggedIn();
+ }
+
+ $scope.logOut = function() {
+ loginService.logOut();
+ $location.path('/about');
+ }
+}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/libs/bootstrap.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/libs/bootstrap.js b/solr/webapp/web/libs/bootstrap.js
new file mode 100644
index 0000000..850e6e5
--- /dev/null
+++ b/solr/webapp/web/libs/bootstrap.js
@@ -0,0 +1,2006 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") }
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.0.3
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================================== */
+
+
++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] }
+ }
+ }
+ }
+
+ // 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.0.3
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================================== */
+
+
++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.0.3
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // BUTTON PUBLIC CLASS DEFINITION
+ // ==============================
+
+ var Button = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Button.DEFAULTS, options)
+ }
+
+ 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(function () {
+ state == 'loadingText' ?
+ $el.addClass(d).attr(d, d) :
+ $el.removeClass(d).removeAttr(d);
+ }, 0)
+ }
+
+ Button.prototype.toggle = function () {
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
+ var changed = true
+
+ if ($parent.length) {
+ var $input = this.$element.find('input')
+ if ($input.prop('type') === 'radio') {
+ // see if clicking on current one
+ 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.0.3
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================================== */
+
+
++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.end) {
+ 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]()
+ }
+
+ this.sliding = true
+
+ isCycling && this.pause()
+
+ var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
+
+ if ($next.hasClass('active')) return
+
+ 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')) {
+ this.$element.trigger(e)
+ if (e.isDefaultPrevented()) return
+ $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(600)
+ } else {
+ this.$element.trigger(e)
+ if (e.isDefaultPrevented()) return
+ $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.0.3
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================================== */
+
+
++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('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) $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.0.3
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================================== */
+
+
++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
+ $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
+ }
+
+ $parent.trigger(e = $.Event('show.bs.dropdown'))
+
+ if (e.isDefaultPrevented()) return
+
+ $parent
+ .toggleClass('open')
+ .trigger('shown.bs.dropdown')
+
+ $this.focus()
+ }
+
+ return false
+ }
+
+ Dropdown.prototype.keydown = function (e) {
+ if (!/(38|40|27)/.test(e.keyCode)) return
+
+ var $this = $(this)
+
+ e.preventDefault()
+ e.stopPropagation()
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ if (!isActive || (isActive && e.keyCode == 27)) {
+ if (e.which == 27) $parent.find(toggle).focus()
+ return $this.click()
+ }
+
+ var $items = $('[role=menu] li:not(.divider):visible a', $parent)
+
+ if (!$items.length) return
+
+ var index = $items.index($items.filter(':focus'))
+
+ if (e.keyCode == 38 && index > 0) index-- // up
+ if (e.keyCode == 40 && index < $items.length - 1) index++ // down
+ if (!~index) index=0
+
+ $items.eq(index).focus()
+ }
+
+ function clearMenus() {
+ $(backdrop).remove()
+ $(toggle).each(function (e) {
+ var $parent = getParent($(this))
+ if (!$parent.hasClass('open')) return
+ $parent.trigger(e = $.Event('hide.bs.dropdown'))
+ if (e.isDefaultPrevented()) return
+ $parent.removeClass('open').trigger('hidden.bs.dropdown')
+ })
+ }
+
+ function getParent($this) {
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
+
+ var $parent = selector && $(selector)
+
+ return $parent && $parent.length ? $parent : $this.parent()
+ }
+
+
+ // DROPDOWN PLUGIN DEFINITION
+ // ==========================
+
+ var old = $.fn.dropdown
+
+ $.fn.dropdown = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.dropdown')
+
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ $.fn.dropdown.Constructor = Dropdown
+
+
+ // DROPDOWN NO CONFLICT
+ // ====================
+
+ $.fn.dropdown.noConflict = function () {
+ $.fn.dropdown = old
+ return this
+ }
+
+
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
+ // ===================================
+
+ $(document)
+ .on('click.bs.dropdown.data-api', clearMenus)
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+ .on('click.bs.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
+ .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.0.3
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // MODAL CLASS DEFINITION
+ // ======================
+
+ var Modal = function (element, options) {
+ this.options = options
+ this.$element = $(element)
+ this.$backdrop =
+ this.isShown = null
+
+ if (this.options.remote) this.$element.load(this.options.remote)
+ }
+
+ Modal.DEFAULTS = {
+ backdrop: true
+ , keyboard: true
+ , show: true
+ }
+
+ Modal.prototype.toggle = function (_relatedTarget) {
+ return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
+ }
+
+ Modal.prototype.show = function (_relatedTarget) {
+ var that = this
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+ this.$element.trigger(e)
+
+ if (this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = true
+
+ this.escape()
+
+ this.$element.on('click.dismiss.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+ this.backdrop(function () {
+ var transition = $.support.transition && that.$element.hasClass('fade')
+
+ if (!that.$element.parent().length) {
+ that.$element.appendTo(document.body) // don't move modals dom position
+ }
+
+ that.$element.show()
+
+ if (transition) {
+ that.$element[0].offsetWidth // force reflow
+ }
+
+ that.$element
+ .addClass('in')
+ .attr('aria-hidden', false)
+
+ that.enforceFocus()
+
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+ transition ?
+ that.$element.find('.modal-dialog') // wait for modal to slide in
+ .one($.support.transition.end, function () {
+ that.$element.focus().trigger(e)
+ })
+ .emulateTransitionEnd(300) :
+ that.$element.focus().trigger(e)
+ })
+ }
+
+ Modal.prototype.hide = function (e) {
+ if (e) e.preventDefault()
+
+ e = $.Event('hide.bs.modal')
+
+ this.$element.trigger(e)
+
+ if (!this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = false
+
+ this.escape()
+
+ $(document).off('focusin.bs.modal')
+
+ this.$element
+ .removeClass('in')
+ .attr('aria-hidden', true)
+ .off('click.dismiss.modal')
+
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$element
+ .one($.support.transition.end, $.proxy(this.hideModal, this))
+ .emulateTransitionEnd(300) :
+ this.hideModal()
+ }
+
+ Modal.prototype.enforceFocus = function () {
+ $(document)
+ .off('focusin.bs.modal') // guard against infinite focus loop
+ .on('focusin.bs.modal', $.proxy(function (e) {
+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
+ this.$element.focus()
+ }
+ }, this))
+ }
+
+ Modal.prototype.escape = function () {
+ if (this.isShown && this.options.keyboard) {
+ this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
+ e.which == 27 && this.hide()
+ }, this))
+ } else if (!this.isShown) {
+ this.$element.off('keyup.dismiss.bs.modal')
+ }
+ }
+
+ Modal.prototype.hideModal = function () {
+ var that = this
+ this.$element.hide()
+ this.backdrop(function () {
+ that.removeBackdrop()
+ that.$element.trigger('hidden.bs.modal')
+ })
+ }
+
+ Modal.prototype.removeBackdrop = function () {
+ this.$backdrop && this.$backdrop.remove()
+ this.$backdrop = null
+ }
+
+ Modal.prototype.backdrop = function (callback) {
+ var that = this
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+ if (this.isShown && this.options.backdrop) {
+ var doAnimate = $.support.transition && animate
+
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+ .appendTo(document.body)
+
+ this.$element.on('click.dismiss.modal', $.proxy(function (e) {
+ if (e.target !== e.currentTarget) return
+ this.options.backdrop == 'static'
+ ? this.$element[0].focus.call(this.$element[0])
+ : this.hide.call(this)
+ }, this))
+
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+ this.$backdrop.addClass('in')
+
+ if (!callback) return
+
+ doAnimate ?
+ this.$backdrop
+ .one($.support.transition.end, callback)
+ .emulateTransitionEnd(150) :
+ callback()
+
+ } else if (!this.isShown && this.$backdrop) {
+ this.$backdrop.removeClass('in')
+
+ $.support.transition && this.$element.hasClass('fade')?
+ this.$backdrop
+ .one($.support.transition.end, callback)
+ .emulateTransitionEnd(150) :
+ callback()
+
+ } else if (callback) {
+ callback()
+ }
+ }
+
+
+ // MODAL PLUGIN DEFINITION
+ // =======================
+
+ var old = $.fn.modal
+
+ $.fn.modal = function (option, _relatedTarget) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.modal')
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+ if (typeof option == 'string') data[option](_relatedTarget)
+ else if (options.show) data.show(_relatedTarget)
+ })
+ }
+
+ $.fn.modal.Constructor = Modal
+
+
+ // MODAL NO CONFLICT
+ // =================
+
+ $.fn.modal.noConflict = function () {
+ $.fn.modal = old
+ return this
+ }
+
+
+ // MODAL DATA-API
+ // ==============
+
+ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+ var $this = $(this)
+ var href = $this.attr('href')
+ var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
+ var option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+ e.preventDefault()
+
+ $target
+ .modal(option, this)
+ .one('hide', function () {
+ $this.is(':visible') && $this.focus()
+ })
+ })
+
+ $(document)
+ .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
+ .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.0.3
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // TOOLTIP PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Tooltip = function (element, options) {
+ this.type =
+ this.options =
+ this.enabled =
+ this.timeout =
+ this.hoverState =
+ this.$element = null
+
+ this.init('tooltip', element, options)
+ }
+
+ Tooltip.DEFAULTS = {
+ animation: true
+ , placement: 'top'
+ , selector: false
+ , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
+ , trigger: 'hover focus'
+ , title: ''
+ , delay: 0
+ , html: false
+ , container: false
+ }
+
+ Tooltip.prototype.init = function (type, element, options) {
+ this.enabled = true
+ this.type = type
+ this.$element = $(element)
+ this.options = this.getOptions(options)
+
+ var triggers = this.options.trigger.split(' ')
+
+ for (var i = triggers.length; i--;) {
+ var trigger = triggers[i]
+
+ if (trigger == 'click') {
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+ } else if (trigger != 'manual') {
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
+
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+ }
+ }
+
+ this.options.selector ?
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+ this.fixTitle()
+ }
+
+ Tooltip.prototype.getDefaults = function () {
+ return Tooltip.DEFAULTS
+ }
+
+ Tooltip.prototype.getOptions = function (options) {
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+ if (options.delay && typeof options.delay == 'number') {
+ options.delay = {
+ show: options.delay
+ , hide: options.delay
+ }
+ }
+
+ return options
+ }
+
+ Tooltip.prototype.getDelegateOptions = function () {
+ var options = {}
+ var defaults = this.getDefaults()
+
+ this._options && $.each(this._options, function (key, value) {
+ if (defaults[key] != value) options[key] = value
+ })
+
+ return options
+ }
+
+ Tooltip.prototype.enter = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'in'
+
+ if (!self.options.delay || !self.options.delay.show) return self.show()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'in') self.show()
+ }, self.options.delay.show)
+ }
+
+ Tooltip.prototype.leave = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'out'
+
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'out') self.hide()
+ }, self.options.delay.hide)
+ }
+
+ Tooltip.prototype.show = function () {
+ var e = $.Event('show.bs.'+ this.type)
+
+ if (this.hasContent() && this.enabled) {
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ var $tip = this.tip()
+
+ this.setContent()
+
+ if (this.options.animation) $tip.addClass('fade')
+
+ var placement = typeof this.options.placement == 'function' ?
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
+ this.options.placement
+
+ var autoToken = /\s?auto?\s?/i
+ var autoPlace = autoToken.test(placement)
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+ $tip
+ .detach()
+ .css({ top: 0, left: 0, display: 'block' })
+ .addClass(placement)
+
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+ var pos = this.getPosition()
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (autoPlace) {
+ var $parent = this.$element.parent()
+
+ var orgPlacement = placement
+ var docScroll = document.documentElement.scrollTop || document.body.scrollTop
+ var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()
+ var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
+ var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
+
+ placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
+ placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
+ placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
+ placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
+ placement
+
+ $tip
+ .removeClass(orgPlacement)
+ .addClass(placement)
+ }
+
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+ this.applyPlacement(calculatedOffset, placement)
+ this.$element.trigger('shown.bs.' + this.type)
+ }
+ }
+
+ Tooltip.prototype.applyPlacement = function(offset, placement) {
+ var replace
+ var $tip = this.tip()
+ var width = $tip[0].offsetWidth
+ var height = $tip[0].offsetHeight
+
+ // manually read margins because getBoundingClientRect includes difference
+ var marginTop = parseInt($tip.css('margin-top'), 10)
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+ // we must check for NaN for ie 8/9
+ if (isNaN(marginTop)) marginTop = 0
+ if (isNaN(marginLeft)) marginLeft = 0
+
+ offset.top = offset.top + marginTop
+ offset.left = offset.left + marginLeft
+
+ $tip
+ .offset(offset)
+ .addClass('in')
+
+ // check to see if placing tip in new offset caused the tip to resize itself
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (placement == 'top' && actualHeight != height) {
+ replace = true
+ offset.top = offset.top + height - actualHeight
+ }
+
+ if (/bottom|top/.test(placement)) {
+ var delta = 0
+
+ if (offset.left < 0) {
+ delta = offset.left * -2
+ offset.left = 0
+
+ $tip.offset(offset)
+
+ actualWidth = $tip[0].offsetWidth
+ actualHeight = $tip[0].offsetHeight
+ }
+
+ this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
+ } else {
+ this.replaceArrow(actualHeight - height, actualHeight, 'top')
+ }
+
+ if (replace) $tip.offset(offset)
+ }
+
+ Tooltip.prototype.replaceArrow = function(delta, dimension, position) {
+ this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
+ }
+
+ Tooltip.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+ $tip.removeClass('fade in top bottom left right')
+ }
+
+ Tooltip.prototype.hide = function () {
+ var that = this
+ var $tip = this.tip()
+ var e = $.Event('hide.bs.' + this.type)
+
+ function complete() {
+ if (that.hoverState != 'in') $tip.detach()
+ }
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ $tip.removeClass('in')
+
+ $.support.transition && this.$tip.hasClass('fade') ?
+ $tip
+ .one($.support.transition.end, complete)
+ .emulateTransitionEnd(150) :
+ complete()
+
+ this.$element.trigger('hidden.bs.' + this.type)
+
+ return this
+ }
+
+ Tooltip.prototype.fixTitle = function () {
+ var $e = this.$element
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+ }
+ }
+
+ Tooltip.prototype.hasContent = function () {
+ return this.getTitle()
+ }
+
+ Tooltip.prototype.getPosition = function () {
+ var el = this.$element[0]
+ return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
+ width: el.offsetWidth
+ , height: el.offsetHeight
+ }, this.$element.offset())
+ }
+
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+ }
+
+ Tooltip.prototype.getTitle = function () {
+ var title
+ var $e = this.$element
+ var o = this.options
+
+ title = $e.attr('data-original-title')
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
+
+ return title
+ }
+
+ Tooltip.prototype.tip = function () {
+ return this.$tip = this.$tip || $(this.options.template)
+ }
+
+ Tooltip.prototype.arrow = function () {
+ return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
+ }
+
+ Tooltip.prototype.validate = function () {
+ if (!this.$element[0].parentNode) {
+ this.hide()
+ this.$element = null
+ this.options = null
+ }
+ }
+
+ Tooltip.prototype.enable = function () {
+ this.enabled = true
+ }
+
+ Tooltip.prototype.disable = function () {
+ this.enabled = false
+ }
+
+ Tooltip.prototype.toggleEnabled = function () {
+ this.enabled = !this.enabled
+ }
+
+ Tooltip.prototype.toggle = function (e) {
+ var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+ }
+
+ Tooltip.prototype.destroy = function () {
+ this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
+ }
+
+
+ // TOOLTIP PLUGIN DEFINITION
+ // =========================
+
+ var old = $.fn.tooltip
+
+ $.fn.tooltip = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tooltip')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.tooltip.Constructor = Tooltip
+
+
+ // TOOLTIP NO CONFLICT
+ // ===================
+
+ $.fn.tooltip.noConflict = function () {
+ $.fn.tooltip = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.0.3
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // POPOVER PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Popover = function (element, options) {
+ this.init('popover', element, options)
+ }
+
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+ Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {
+ placement: 'right'
+ , trigger: 'click'
+ , content: ''
+ , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+ })
+
+
+ // NOTE: POPOVER EXTENDS tooltip.js
+ // ================================
+
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+ Popover.prototype.constructor = Popover
+
+ Popover.prototype.getDefaults = function () {
+ return Popover.DEFAULTS
+ }
+
+ Popover.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+ var content = this.getContent()
+
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+ $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
+
+ $tip.removeClass('fade top bottom left right in')
+
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+ // this manually by checking the contents.
+ if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+ }
+
+ Popover.prototype.hasContent = function () {
+ return this.getTitle() || this.getContent()
+ }
+
+ Popover.prototype.getContent = function () {
+ var $e = this.$element
+ var o = this.options
+
+ return $e.attr('data-content')
+ || (typeof o.content == 'function' ?
+ o.content.call($e[0]) :
+ o.content)
+ }
+
+ Popover.prototype.arrow = function () {
+ return this.$arrow = this.$arrow || this.tip().find('.arrow')
+ }
+
+ Popover.prototype.tip = function () {
+ if (!this.$tip) this.$tip = $(this.options.template)
+ return this.$tip
+ }
+
+
+ // POPOVER PLUGIN DEFINITION
+ // =========================
+
+ var old = $.fn.popover
+
+ $.fn.popover = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.popover')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.popover.Constructor = Popover
+
+
+ // POPOVER NO CONFLICT
+ // ===================
+
+ $.fn.popover.noConflict = function () {
+ $.fn.popover = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.0.3
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // SCROLLSPY CLASS DEFINITION
+ // ==========================
+
+ function ScrollSpy(element, options) {
+ var href
+ var process = $.proxy(this.process, this)
+
+ this.$element = $(element).is('body') ? $(window) : $(element)
+ this.$body = $('body')
+ this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
+ this.selector = (this.options.target
+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+ || '') + ' .nav li > a'
+ this.offsets = $([])
+ this.targets = $([])
+ this.activeTarget = null
+
+ this.refresh()
+ this.process()
+ }
+
+ ScrollSpy.DEFAULTS = {
+ offset: 10
+ }
+
+ ScrollSpy.prototype.refresh = function () {
+ var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
+
+ this.offsets = $([])
+ this.targets = $([])
+
+ var self = this
+ var $targets = this.$body
+ .find(this.selector)
+ .map(function () {
+ var $el = $(this)
+ var href = $el.data('target') || $el.attr('href')
+ var $href = /^#\w/.test(href) && $(href)
+
+ return ($href
+ && $href.length
+ && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
+ })
+ .sort(function (a, b) { return a[0] - b[0] })
+ .each(function () {
+ self.offsets.push(this[0])
+ self.targets.push(this[1])
+ })
+ }
+
+ ScrollSpy.prototype.process = function () {
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+ var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
+ var maxScroll = scrollHeight - this.$scrollElement.height()
+ var offsets = this.offsets
+ var targets = this.targets
+ var activeTarget = this.activeTarget
+ var i
+
+ if (scrollTop >= maxScroll) {
+ return activeTarget != (i = targets.last()[0]) && this.activate(i)
+ }
+
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+ && this.activate( targets[i] )
+ }
+ }
+
+ ScrollSpy.prototype.activate = function (target) {
+ this.activeTarget = target
+
+ $(this.selector)
+ .parents('.active')
+ .removeClass('active')
+
+ var selector = this.selector
+ + '[data-target="' + target + '"],'
+ + this.selector + '[href="' + target + '"]'
+
+ var active = $(selector)
+ .parents('li')
+ .addClass('active')
+
+ if (active.parent('.dropdown-menu').length) {
+ active = active
+ .closest('li.dropdown')
+ .addClass('active')
+ }
+
+ active.trigger('activate.bs.scrollspy')
+ }
+
+
+ // SCROLLSPY PLUGIN DEFINITION
+ // ===========================
+
+ var old = $.fn.scrollspy
+
+ $.fn.scrollspy = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.scrollspy')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.scrollspy.Constructor = ScrollSpy
+
+
+ // SCROLLSPY NO CONFLICT
+ // =====================
+
+ $.fn.scrollspy.noConflict = function () {
+ $.fn.scrollspy = old
+ return this
+ }
+
+
+ // SCROLLSPY DATA-API
+ // ==================
+
+ $(window).on('load', function () {
+ $('[data-spy="scroll"]').each(function () {
+ var $spy = $(this)
+ $spy.scrollspy($spy.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.0.3
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // TAB CLASS DEFINITION
+ // ====================
+
+ var Tab = function (element) {
+ this.element = $(element)
+ }
+
+ Tab.prototype.show = function () {
+ var $this = this.element
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
+ var selector = $this.data('target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
+
+ if ($this.parent('li').hasClass('active')) return
+
+ var previous = $ul.find('.active:last a')[0]
+ var e = $.Event('show.bs.tab', {
+ relatedTarget: previous
+ })
+
+ $this.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ var $target = $(selector)
+
+ this.activate($this.parent('li'), $ul)
+ this.activate($target, $target.parent(), function () {
+ $this.trigger({
+ type: 'shown.bs.tab'
+ , relatedTarget: previous
+ })
+ })
+ }
+
+ Tab.prototype.activate = function (element, container, callback) {
+ var $active = container.find('> .active')
+ var transition = callback
+ && $.support.transition
+ && $active.hasClass('fade')
+
+ function next() {
+ $active
+ .removeClass('active')
+ .find('> .dropdown-menu > .active')
+ .removeClass('active')
+
+ element.addClass('active')
+
+ if (transition) {
+ element[0].offsetWidth // reflow for transition
+ element.addClass('in')
+ } else {
+ element.removeClass('fade')
+ }
+
+ if (element.parent('.dropdown-menu')) {
+ element.closest('li.dropdown').addClass('active')
+ }
+
+ callback && callback()
+ }
+
+ transition ?
+ $active
+ .one($.support.transition.end, next)
+ .emulateTransitionEnd(150) :
+ next()
+
+ $active.removeClass('in')
+ }
+
+
+ // TAB PLUGIN DEFINITION
+ // =====================
+
+ var old = $.fn.tab
+
+ $.fn.tab = function ( option ) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tab')
+
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.tab.Constructor = Tab
+
+
+ // TAB NO CONFLICT
+ // ===============
+
+ $.fn.tab.noConflict = function () {
+ $.fn.tab = old
+ return this
+ }
+
+
+ // TAB DATA-API
+ // ============
+
+ $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+ e.preventDefault()
+ $(this).tab('show')
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.0.3
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+ // AFFIX CLASS DEFINITION
+ // ======================
+
+ var Affix = function (element, options) {
+ this.options = $.extend({}, Affix.DEFAULTS, options)
+ this.$window = $(window)
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
+
+ this.$element = $(element)
+ this.affixed =
+ this.unpin = null
+
+ this.checkPosition()
+ }
+
+ Affix.RESET = 'affix affix-top affix-bottom'
+
+ Affix.DEFAULTS = {
+ offset: 0
+ }
+
+ Affix.prototype.checkPositionWithEventLoop = function () {
+ setTimeout($.proxy(this.checkPosition, this), 1)
+ }
+
+ Affix.prototype.checkPosition = function () {
+ if (!this.$element.is(':visible')) return
+
+ var scrollHeight = $(document).height()
+ var scrollTop = this.$window.scrollTop()
+ var position = this.$element.offset()
+ var offset = this.options.offset
+ var offsetTop = offset.top
+ var offsetBottom = offset.bottom
+
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
+ if (typeof offsetTop == 'function') offsetTop = offset.top()
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
+
+ var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
+ offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
+ offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
+
+ if (this.affixed === affix) return
+ if (this.unpin) this.$element.css('top', '')
+
+ this.affixed = affix
+ this.unpin = affix == 'bottom' ? position.top - scrollTop : null
+
+ this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))
+
+ if (affix == 'bottom') {
+ this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })
+ }
+ }
+
+
+ // AFFIX PLUGIN DEFINITION
+ // =======================
+
+ var old = $.fn.affix
+
+ $.fn.affix = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.affix')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.affix.Constructor = Affix
+
+
+ // AFFIX NO CONFLICT
+ // =================
+
+ $.fn.affix.noConflict = function () {
+ $.fn.affix = old
+ return this
+ }
+
+
+ // AFFIX DATA-API
+ // ==============
+
+ $(window).on('load', function () {
+ $('[data-spy="affix"]').each(function () {
+ var $spy = $(this)
+ var data = $spy.data()
+
+ data.offset = data.offset || {}
+
+ if (data.offsetBottom) data.offset.bottom = data.offsetBottom
+ if (data.offsetTop) data.offset.top = data.offsetTop
+
+ $spy.affix(data)
+ })
+ })
+
+}(jQuery);
[14/27] lucene-solr:solr7896-login-page: Testing new approach
Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/css/bootstrap.min.css
----------------------------------------------------------------------
diff --git a/solr/webapp/web/css/bootstrap.min.css b/solr/webapp/web/css/bootstrap.min.css
deleted file mode 100644
index c547283..0000000
--- a/solr/webapp/web/css/bootstrap.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Bootstrap v3.0.3 (http://getbootstrap.com)
- * Copyright 2013 Twitter, Inc.
- * Licensed under http://www.apache.org/licenses/LICENSE-2.0
- */
-
-/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{paddi
ng:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!impo
rtant}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}@page{margin:2cm .5cm}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}}*,*: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.428571429;
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}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.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;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;co
lor:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .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-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-
danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.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}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizon
tal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}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;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:aft
er{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;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{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970p
x}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.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-right:15px;padding-left: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.66666666666666%}.col-x
s-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-
5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.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.66666666666666%}.col-sm-10{width:83.33333333333334%}.c
ol-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-s
m-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.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.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{wid
th:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333
%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.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.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-
7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col
-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.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.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;bord
er-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;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table
>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-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-respon
sive>.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}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:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}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}input[type="n
umber"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;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,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-inp
ut-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}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{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;font-weight:normal;vertical-align:middle;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{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{height:auto}.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,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#665
12c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-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,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.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,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.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}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .che
ckbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-use
r-select:none;user-select:none}.btn: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{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;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:#fff}.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,.b
tn-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-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:#d9
534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;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{colo
r:#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-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webk
it-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{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left: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';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.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-do
wnload: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-tex
t-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"}.gl
yphicon-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{conten
t:"\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;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px
rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding
:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left: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{right:0;left: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-grou
p .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-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-top-right-radius:0;border-bottom-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>.dropdo
wn-toggle{border-top-right-radius:0;border-bottom-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-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-grou
p-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:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.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-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-rad
ius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;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-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-gro
up-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{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{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-c
hild),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-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>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.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:hov
er,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.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.428571429;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;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-j
ustified>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{margin-bottom:5px;text-align:center}.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}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border
-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.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-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margi
n-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.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{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;pa
dding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border: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-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.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-right:15px;margin-left: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;backg
round-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:#ccc}.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{color:#555;background-colo
r:#e7e7e7}@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;backgrou
nd-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{color:#fff;background-color:#
080808}@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{padding:0 5px;color:#ccc;content:"/\00a0"}.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;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.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-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagi
nation>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.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-top-right-radius:6px;border-bottom-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-top-right-radius:3p
x;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.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;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.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:#808080}.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:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{dis
play:none}.btn .badge{position:relative;top:-1px}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;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.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-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;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{display:
block;height:auto;max-width:100%;margin-right:auto;margin-left: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:bold}.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{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.aler
t-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.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{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,2
55,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-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,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.1
5) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.
15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.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{padding-left:0;margin-bottom:20px}.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-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;cont
ent:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody: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>.ta
ble-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-c
hild,.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:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.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,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.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{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.d
ropdown .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-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{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-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}.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}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.c
lose{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.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;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;le
ft:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.too
ltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.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-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5p
x 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-co
lor:#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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin
-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;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%}.car
ousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opa
<TRUNCATED>
[21/27] lucene-solr:solr7896-login-page: WIP
Posted by ja...@apache.org.
WIP
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/7c964580
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/7c964580
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/7c964580
Branch: refs/heads/solr7896-login-page
Commit: 7c964580de6a1407d0371febdd709a8d7884bc8d
Parents: 9012e40
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Oct 8 12:48:45 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Oct 8 12:48:45 2018 +0200
----------------------------------------------------------------------
solr/webapp/web/index.html | 2 +-
solr/webapp/web/js/angular/app.js | 50 ++++++--------------
solr/webapp/web/js/angular/controllers/login.js | 11 -----
solr/webapp/web/js/angular/services.js | 27 +++++------
4 files changed, 28 insertions(+), 62 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7c964580/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index 4b83533..0f1478f 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -141,7 +141,7 @@ limitations under the License.
<div>
<ul id="menu">
- <li id="login" class="global" ng-class="{active:page=='login'}"><p><a href="#/login">Logout {{username}}</a></p></li>
+ <li id="login" class="global" ng-class="{active:page=='login'}"><p><a href="#/login">Login {{$root.globals.currentUser.username}} {{$root.globals}}</a></p></li>
<li id="index" class="global" ng-class="{active:page=='index'}"><p><a href="#/">Dashboard</a></p></li>
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7c964580/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index 36dd07c..3c29fc4 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -376,21 +376,18 @@ solrAdminApp.config([
// NOCOMMIT First iteration
.factory('authInterceptor', function($q, $rootScope, $location, $timeout, $injector) {
var started = function(config) {
- console.log("Request config: " + JSON.stringify(config, undefined, 2));
- // var ah = "Basic c29scjpyb2Nrcw=="; // solr / SolrRocks
- // config.headers['Authorization'] = ah;
- // console.log("Added authorization header " + ah);
- if (sessionStorage.getItem("auth.header") !== null) {
- if (config.headers['Authorization'] === null) {
- config.headers['Authorization'] = sessionStorage.getItem("auth.header");
- console.log("We have a logged in user with header " + sessionStorage.getItem("auth.username") + ", appending header");
- }
+ console.log("Request config headers: " + JSON.stringify(config.headers, undefined, 2));
+ if (sessionStorage.getItem("auth.header") && !config.headers['Authorization']) {
+ config.headers['Authorization'] = sessionStorage.getItem("auth.header");
+ console.log("We have a logged in user with header " + sessionStorage.getItem("auth.username") + ", appending header " + sessionStorage.getItem("auth.header"));
+ } else {
+ console.log("Not adding headers. Have auth.username=" + sessionStorage.getItem("auth.username") + ", auth.header=" + sessionStorage.getItem("auth.header") + ", config.headers=" + config.headers['Authorization']);
}
return config || $q.when(config);
};
var ended = function(response) {
- console.log("Response headers: " + JSON.stringify(response.headers(), undefined, 2));
+ // console.log("Response headers: " + JSON.stringify(response.headers(), undefined, 2));
return response || $q.when(response);
};
@@ -410,15 +407,19 @@ solrAdminApp.config([
var authType = wwwAuthHeader.split(" ")[0];
console.log("AuthType is: " + authType);
sessionStorage.setItem("auth.type", authType);
- sessionStorage.setItem("auth.location", $location.path());
+ if ($location.path() === '/login') {
+ sessionStorage.setItem("auth.location", "/");
+ } else {
+ sessionStorage.setItem("auth.location", $location.path());
+ }
sessionStorage.removeItem("auth.username");
sessionStorage.removeItem("auth.header");
+ // $http.defaults.headers.common.Authorization = null;
$location.path('/login');
} else {
console.log("Rejection status is " + rejection.status)
- }
- $rootScope.$broadcast('loadingStatusInactive');
- return $q.reject(rejection);
+ $rootScope.$broadcast('loadingStatusInactive');
+ return $q.reject(rejection); }
};
return {request: started, response: ended, responseError: failed};
@@ -429,27 +430,6 @@ solrAdminApp.config([
// Force BasicAuth plugin to serve us a 'Authorization: xBasic xxxx' header so browser will not pop up login dialogue
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
})
-
-
-// NOCOMMIT: just for testing
-// .run(['$rootScope', '$location', '$cookieStore', '$http',
-// function ($rootScope, $location, $cookieStore, $http) {
-// // keep user logged in after page refresh
-// // Replace with interceptor
-// $rootScope.globals = $cookieStore.get('globals') || {};
-// if ($rootScope.globals.currentUser) {
-// $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
-// }
-//
-// // $rootScope.$on('$locationChangeStart', function (event, next, current) {
-// // // redirect to login page if not logged in
-// // if ($location.path() !== '/login' && !$rootScope.globals.currentUser) {
-// // $location.path('/login');
-// // }
-// // });
-// }])
-
-
.directive('fileModel', function ($parse) {
return {
restrict: 'A',
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7c964580/solr/webapp/web/js/angular/controllers/login.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/controllers/login.js b/solr/webapp/web/js/angular/controllers/login.js
index a67119c8..174a491 100644
--- a/solr/webapp/web/js/angular/controllers/login.js
+++ b/solr/webapp/web/js/angular/controllers/login.js
@@ -37,17 +37,6 @@ solrAdminApp.controller('LoginController',
AuthenticationService.SetCredentials($scope.username, $scope.password);
console.log("Redirecting back to " + $scope.authLocation);
$location.path($scope.authLocation); // Redirect to the location that caused the login prompt
-
- // TODO: "login" by hitting the failing URL again
- // AuthenticationService.Login($scope.username, $scope.password, function (response) {
- // if (response.success) {
- // AuthenticationService.SetCredentials($scope.username, $scope.password);
- // $location.path('/');
- // } else {
- // $scope.error = response.message;
- // $scope.dataLoading = false;
- // }
- // });
};
$scope.logout = function() {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7c964580/solr/webapp/web/js/angular/services.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/services.js b/solr/webapp/web/js/angular/services.js
index 323bc8e..8f2d443 100644
--- a/solr/webapp/web/js/angular/services.js
+++ b/solr/webapp/web/js/angular/services.js
@@ -293,30 +293,27 @@ solrAdminServices.factory('System',
service.SetCredentials = function (username, password) {
var authdata = Base64.encode(username + ':' + password);
- sessionStorage.setItem("auth.username", username);
- $rootScope.username = username;
-
- $rootScope.globals = {
- currentUser: {
- username: username,
- authdata: authdata
- }
- };
-
- // $http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; // jshint ignore:line
- $http.defaults.headers.common.Authorization = 'Basic ' + authdata;
- // sessionStorage.setItem('globals', $rootScope.globals);
+ // $rootScope.globals = {
+ // currentUser: {
+ // username: username,
+ // authdata: authdata
+ // }
+ // };
+ //
+ sessionStorage.setItem('globals', $rootScope.globals);
sessionStorage.setItem("auth.header", authdata);
+ sessionStorage.setItem("auth.username", username);
+ // $http.defaults.headers.common.Authorization = authdata;
console.log("Stored auth data on session storage");
};
service.ClearCredentials = function () {
$rootScope.globals = {};
- // sessionStorage.removeItem('globals');
+ sessionStorage.removeItem('globals');
sessionStorage.removeItem("auth.header");
sessionStorage.removeItem("auth.username");
sessionStorage.removeItem("auth.wwwAuthHeader");
- $http.defaults.headers.common.Authorization = null;
+ // $http.defaults.headers.common.Authorization = null;
console.log("Cleared stored auth data");
};