From df65a40e85b92f4c0a25630c78abac71810a49b1 Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Fri, 25 Aug 2017 16:02:22 -0400 Subject: [PATCH 1/5] Create reprounzip-vis package --- reprounzip-vis/LICENSE.txt | 27 ++++++++++++++ reprounzip-vis/MANIFEST.in | 2 ++ reprounzip-vis/README.rst | 26 ++++++++++++++ reprounzip-vis/reprounzip_vis/__init__.py | 18 ++++++++++ reprounzip-vis/setup.cfg | 2 ++ reprounzip-vis/setup.py | 44 +++++++++++++++++++++++ 6 files changed, 119 insertions(+) create mode 100644 reprounzip-vis/LICENSE.txt create mode 100644 reprounzip-vis/MANIFEST.in create mode 100644 reprounzip-vis/README.rst create mode 100644 reprounzip-vis/reprounzip_vis/__init__.py create mode 100644 reprounzip-vis/setup.cfg create mode 100644 reprounzip-vis/setup.py diff --git a/reprounzip-vis/LICENSE.txt b/reprounzip-vis/LICENSE.txt new file mode 100644 index 000000000..719b95437 --- /dev/null +++ b/reprounzip-vis/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (C) 2014-2017, New York University +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/reprounzip-vis/MANIFEST.in b/reprounzip-vis/MANIFEST.in new file mode 100644 index 000000000..926cc7b14 --- /dev/null +++ b/reprounzip-vis/MANIFEST.in @@ -0,0 +1,2 @@ +include README.rst +include LICENSE.txt diff --git a/reprounzip-vis/README.rst b/reprounzip-vis/README.rst new file mode 100644 index 000000000..2efe01248 --- /dev/null +++ b/reprounzip-vis/README.rst @@ -0,0 +1,26 @@ +ReproZip +======== + +`ReproZip `__ is a tool aimed at simplifying the process of creating reproducible experiments from command-line executions, a frequently-used common denominator in computational science. It tracks operating system calls and creates a package that contains all the binaries, files and dependencies required to run a given command on the author's computational environment (packing step). A reviewer can then extract the experiment in his environment to reproduce the results (unpacking step). + +reprounzip +---------- + +This is the component responsible for the unpacking step on Linux distributions. + +Please refer to `reprozip `__, `reprounzip-vagrant `_, and `reprounzip-docker `_ for other components and plugins. + +A GUI is available at `reprounzip-qt `_. + +Additional Information +---------------------- + +For more detailed information, please refer to our `website `_, as well as to our `documentation `_. + +ReproZip is currently being developed at `NYU `_. The team includes: + +* `Fernando Chirigati `_ +* `Juliana Freire `_ +* `Remi Rampin `_ +* `Dennis Shasha `_ +* `Vicky Steeves `_ diff --git a/reprounzip-vis/reprounzip_vis/__init__.py b/reprounzip-vis/reprounzip_vis/__init__.py new file mode 100644 index 000000000..1a3867d21 --- /dev/null +++ b/reprounzip-vis/reprounzip_vis/__init__.py @@ -0,0 +1,18 @@ +import argparse + +from reprounzip.unpackers.common import COMPAT_OK + + +def show_vis(args): + TODO + + +def setup_vis(parser, **kwargs): + """Visualizes the provenance of a package as a D3 graph in the browser. + """ + parser.add_argument( + 'pack', nargs=argparse.OPTIONAL, + help="Pack to visualize") + parser.set_defaults(func=show_vis) + + return {'test_compatibility': COMPAT_OK} diff --git a/reprounzip-vis/setup.cfg b/reprounzip-vis/setup.cfg new file mode 100644 index 000000000..2a9acf13d --- /dev/null +++ b/reprounzip-vis/setup.cfg @@ -0,0 +1,2 @@ +[bdist_wheel] +universal = 1 diff --git a/reprounzip-vis/setup.py b/reprounzip-vis/setup.py new file mode 100644 index 000000000..6758468fe --- /dev/null +++ b/reprounzip-vis/setup.py @@ -0,0 +1,44 @@ +import io +import os +from setuptools import setup + + +# pip workaround +os.chdir(os.path.abspath(os.path.dirname(__file__))) + + +# Need to specify encoding for PY3, which has the worst unicode handling ever +with io.open('README.rst', encoding='utf-8') as fp: + description = fp.read() +req = [ + 'PyYAML', + 'rpaths>=0.8', + 'usagestats>=0.3', + 'requests'] +setup(name='reprounzip-vis', + version='0.1', + packages=['reprounzip_vis'], + entry_points={ + 'reprounzip.unpackers': [ + 'vis = reprounzip_vis:setup_vis']}, + description="Provenance visualization tool for ReproZip packages", + author="Remi Rampin, Zhongheng Li", + author_email='reprozip-users@vgc.poly.edu', + maintainer="Remi Rampin", + maintainer_email='remirampin@gmail.com', + url='http://vida-nyu.github.io/reprozip/', + long_description=description, + license='BSD-3-Clause', + keywords=['reprozip', 'reprounzip', 'reproducibility', 'provenance', + 'visualization', 'vida', 'nyu'], + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Science/Research', + 'License :: OSI Approved :: BSD License', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Topic :: Scientific/Engineering', + 'Topic :: System :: Archiving']) From 2d70760a253dca85f2cbd540540b4d2899bf2a46 Mon Sep 17 00:00:00 2001 From: heng2j Date: Fri, 25 Aug 2017 16:04:36 -0400 Subject: [PATCH 2/5] Add Heng's files --- .../static/css/bootstrap.min.css | 6025 +++++++++++++++++ .../reprounzip_vis/static/css/style.css | 361 + .../reprounzip_vis/static/index.html | 301 + .../static/js/NYT_SVGCrowbar.js | 258 + .../static/js/d3_Visualization.js | 2572 +++++++ .../static/js/gantt-chart-d3.js | 226 + .../reprounzip_vis/static/js/index.js | 28 + .../reprounzip_vis/static/js/sideBar.js | 225 + .../reprounzip_vis/static/style.css | 234 + 9 files changed, 10230 insertions(+) create mode 100644 reprounzip-vis/reprounzip_vis/static/css/bootstrap.min.css create mode 100644 reprounzip-vis/reprounzip_vis/static/css/style.css create mode 100644 reprounzip-vis/reprounzip_vis/static/index.html create mode 100644 reprounzip-vis/reprounzip_vis/static/js/NYT_SVGCrowbar.js create mode 100644 reprounzip-vis/reprounzip_vis/static/js/d3_Visualization.js create mode 100644 reprounzip-vis/reprounzip_vis/static/js/gantt-chart-d3.js create mode 100644 reprounzip-vis/reprounzip_vis/static/js/index.js create mode 100644 reprounzip-vis/reprounzip_vis/static/js/sideBar.js create mode 100644 reprounzip-vis/reprounzip_vis/static/style.css diff --git a/reprounzip-vis/reprounzip_vis/static/css/bootstrap.min.css b/reprounzip-vis/reprounzip_vis/static/css/bootstrap.min.css new file mode 100644 index 000000000..cf84cdda6 --- /dev/null +++ b/reprounzip-vis/reprounzip_vis/static/css/bootstrap.min.css @@ -0,0 +1,6025 @@ +html { + font-family:sans-serif; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100%; + 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; + margin:0; +} + +audio,canvas,progress,video { + display:inline-block; + vertical-align:baseline; +} + +audio:not([controls]) { + display:none; + height:0; +} + +a { + background-color:transparent; + color:#337ab7; + text-decoration:none; +} + +abbr[title] { + border-bottom:1px dotted; +} + +dfn { + font-style:italic; +} + +h1 { + font-size:2em; + margin:.67em 0; +} + +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; + vertical-align:middle; +} + +figure { + margin:0; +} + +hr { + height:0; + -webkit-box-sizing:content-box; + -moz-box-sizing:content-box; + box-sizing:content-box; + margin-top:20px; + margin-bottom:20px; + border:0; + border-top:1px solid #eee; +} + +pre { + overflow:auto; + display:block; + 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; + margin:0 0 10px; + padding:9.5px; +} + +code,kbd,pre,samp { + font-size:1em; + font-family:Menlo,Monaco,Consolas,"Courier New",monospace; +} + +button,input,optgroup,select,textarea { + font:inherit; + color:inherit; + margin:0; +} + +button { + overflow:visible; +} + +button,select { + text-transform:none; +} + +button,html input[type=button],input[type=reset],input[type=submit] { + -webkit-appearance:button; + cursor:pointer; +} + +button[disabled],html input[disabled] { + cursor:default; +} + +button::-moz-focus-inner,input::-moz-focus-inner { + border:0; + padding:0; +} + +input { + line-height:normal; +} + +input[type=checkbox],input[type=radio] { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + line-height:normal; + margin:1px 0 0; + padding:0; +} + +input[type=search] { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + -webkit-appearance:none; +} + +input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration { + -webkit-appearance:none; +} + +fieldset { + min-width:0; + border:0; + margin:0; + padding:0; +} + +legend { + display:block; + width:100%; + margin-bottom:20px; + font-size:21px; + line-height:inherit; + color:#333; + border:0; + border-bottom:1px solid #e5e5e5; + padding:0; +} + +textarea { + overflow:auto; +} + +table { + border-spacing:0; + border-collapse:collapse; + background-color:transparent; +} + +td,th { + padding:0; +} + +@font-face { + font-family:'Glyphicons Halflings'; + 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:before { + content:"\e026"; +} + +.glyphicon-upload:before { + content:"\e027"; +} + +.glyphicon-inbox:before { + content:"\e028"; +} + +.glyphicon-play-circle:before { + content:"\e029"; +} + +.glyphicon-repeat:before { + content:"\e030"; +} + +.glyphicon-refresh:before { + content:"\e031"; +} + +.glyphicon-list-alt:before { + content:"\e032"; +} + +.glyphicon-lock:before { + content:"\e033"; +} + +.glyphicon-flag:before { + content:"\e034"; +} + +.glyphicon-headphones:before { + content:"\e035"; +} + +.glyphicon-volume-off:before { + content:"\e036"; +} + +.glyphicon-volume-down:before { + content:"\e037"; +} + +.glyphicon-volume-up:before { + content:"\e038"; +} + +.glyphicon-qrcode:before { + content:"\e039"; +} + +.glyphicon-barcode:before { + content:"\e040"; +} + +.glyphicon-tag:before { + content:"\e041"; +} + +.glyphicon-tags:before { + content:"\e042"; +} + +.glyphicon-book:before { + content:"\e043"; +} + +.glyphicon-bookmark:before { + content:"\e044"; +} + +.glyphicon-print:before { + content:"\e045"; +} + +.glyphicon-camera:before { + content:"\e046"; +} + +.glyphicon-font:before { + content:"\e047"; +} + +.glyphicon-bold:before { + content:"\e048"; +} + +.glyphicon-italic:before { + content:"\e049"; +} + +.glyphicon-text-height:before { + content:"\e050"; +} + +.glyphicon-text-width:before { + content:"\e051"; +} + +.glyphicon-align-left:before { + content:"\e052"; +} + +.glyphicon-align-center:before { + content:"\e053"; +} + +.glyphicon-align-right:before { + content:"\e054"; +} + +.glyphicon-align-justify:before { + content:"\e055"; +} + +.glyphicon-list:before { + content:"\e056"; +} + +.glyphicon-indent-left:before { + content:"\e057"; +} + +.glyphicon-indent-right:before { + content:"\e058"; +} + +.glyphicon-facetime-video:before { + content:"\e059"; +} + +.glyphicon-picture:before { + content:"\e060"; +} + +.glyphicon-map-marker:before { + content:"\e062"; +} + +.glyphicon-adjust:before { + content:"\e063"; +} + +.glyphicon-tint:before { + content:"\e064"; +} + +.glyphicon-edit:before { + content:"\e065"; +} + +.glyphicon-share:before { + content:"\e066"; +} + +.glyphicon-check:before { + content:"\e067"; +} + +.glyphicon-move:before { + content:"\e068"; +} + +.glyphicon-step-backward:before { + content:"\e069"; +} + +.glyphicon-fast-backward:before { + content:"\e070"; +} + +.glyphicon-backward:before { + content:"\e071"; +} + +.glyphicon-play:before { + content:"\e072"; +} + +.glyphicon-pause:before { + content:"\e073"; +} + +.glyphicon-stop:before { + content:"\e074"; +} + +.glyphicon-forward:before { + content:"\e075"; +} + +.glyphicon-fast-forward:before { + content:"\e076"; +} + +.glyphicon-step-forward:before { + content:"\e077"; +} + +.glyphicon-eject:before { + content:"\e078"; +} + +.glyphicon-chevron-left:before { + content:"\e079"; +} + +.glyphicon-chevron-right:before { + content:"\e080"; +} + +.glyphicon-plus-sign:before { + content:"\e081"; +} + +.glyphicon-minus-sign:before { + content:"\e082"; +} + +.glyphicon-remove-sign:before { + content:"\e083"; +} + +.glyphicon-ok-sign:before { + content:"\e084"; +} + +.glyphicon-question-sign:before { + content:"\e085"; +} + +.glyphicon-info-sign:before { + content:"\e086"; +} + +.glyphicon-screenshot:before { + content:"\e087"; +} + +.glyphicon-remove-circle:before { + content:"\e088"; +} + +.glyphicon-ok-circle:before { + content:"\e089"; +} + +.glyphicon-ban-circle:before { + content:"\e090"; +} + +.glyphicon-arrow-left:before { + content:"\e091"; +} + +.glyphicon-arrow-right:before { + content:"\e092"; +} + +.glyphicon-arrow-up:before { + content:"\e093"; +} + +.glyphicon-arrow-down:before { + content:"\e094"; +} + +.glyphicon-share-alt:before { + content:"\e095"; +} + +.glyphicon-resize-full:before { + content:"\e096"; +} + +.glyphicon-resize-small:before { + content:"\e097"; +} + +.glyphicon-exclamation-sign:before { + content:"\e101"; +} + +.glyphicon-gift:before { + content:"\e102"; +} + +.glyphicon-leaf:before { + content:"\e103"; +} + +.glyphicon-fire:before { + content:"\e104"; +} + +.glyphicon-eye-open:before { + content:"\e105"; +} + +.glyphicon-eye-close:before { + content:"\e106"; +} + +.glyphicon-warning-sign:before { + content:"\e107"; +} + +.glyphicon-plane:before { + content:"\e108"; +} + +.glyphicon-calendar:before { + content:"\e109"; +} + +.glyphicon-random:before { + content:"\e110"; +} + +.glyphicon-comment:before { + content:"\e111"; +} + +.glyphicon-magnet:before { + content:"\e112"; +} + +.glyphicon-chevron-up:before { + content:"\e113"; +} + +.glyphicon-chevron-down:before { + content:"\e114"; +} + +.glyphicon-retweet:before { + content:"\e115"; +} + +.glyphicon-shopping-cart:before { + content:"\e116"; +} + +.glyphicon-folder-close:before { + content:"\e117"; +} + +.glyphicon-folder-open:before { + content:"\e118"; +} + +.glyphicon-resize-vertical:before { + content:"\e119"; +} + +.glyphicon-resize-horizontal:before { + content:"\e120"; +} + +.glyphicon-hdd:before { + content:"\e121"; +} + +.glyphicon-bullhorn:before { + content:"\e122"; +} + +.glyphicon-bell:before { + content:"\e123"; +} + +.glyphicon-certificate:before { + content:"\e124"; +} + +.glyphicon-thumbs-up:before { + content:"\e125"; +} + +.glyphicon-thumbs-down:before { + content:"\e126"; +} + +.glyphicon-hand-right:before { + content:"\e127"; +} + +.glyphicon-hand-left:before { + content:"\e128"; +} + +.glyphicon-hand-up:before { + content:"\e129"; +} + +.glyphicon-hand-down:before { + content:"\e130"; +} + +.glyphicon-circle-arrow-right:before { + content:"\e131"; +} + +.glyphicon-circle-arrow-left:before { + content:"\e132"; +} + +.glyphicon-circle-arrow-up:before { + content:"\e133"; +} + +.glyphicon-circle-arrow-down:before { + content:"\e134"; +} + +.glyphicon-globe:before { + content:"\e135"; +} + +.glyphicon-wrench:before { + content:"\e136"; +} + +.glyphicon-tasks:before { + content:"\e137"; +} + +.glyphicon-filter:before { + content:"\e138"; +} + +.glyphicon-briefcase:before { + content:"\e139"; +} + +.glyphicon-fullscreen:before { + content:"\e140"; +} + +.glyphicon-dashboard:before { + content:"\e141"; +} + +.glyphicon-paperclip:before { + content:"\e142"; +} + +.glyphicon-heart-empty:before { + content:"\e143"; +} + +.glyphicon-link:before { + content:"\e144"; +} + +.glyphicon-phone:before { + content:"\e145"; +} + +.glyphicon-pushpin:before { + content:"\e146"; +} + +.glyphicon-usd:before { + content:"\e148"; +} + +.glyphicon-gbp:before { + content:"\e149"; +} + +.glyphicon-sort:before { + content:"\e150"; +} + +.glyphicon-sort-by-alphabet:before { + content:"\e151"; +} + +.glyphicon-sort-by-alphabet-alt:before { + content:"\e152"; +} + +.glyphicon-sort-by-order:before { + content:"\e153"; +} + +.glyphicon-sort-by-order-alt:before { + content:"\e154"; +} + +.glyphicon-sort-by-attributes:before { + content:"\e155"; +} + +.glyphicon-sort-by-attributes-alt:before { + content:"\e156"; +} + +.glyphicon-unchecked:before { + content:"\e157"; +} + +.glyphicon-expand:before { + content:"\e158"; +} + +.glyphicon-collapse-down:before { + content:"\e159"; +} + +.glyphicon-collapse-up:before { + content:"\e160"; +} + +.glyphicon-log-in:before { + content:"\e161"; +} + +.glyphicon-flash:before { + content:"\e162"; +} + +.glyphicon-log-out:before { + content:"\e163"; +} + +.glyphicon-new-window:before { + content:"\e164"; +} + +.glyphicon-record:before { + content:"\e165"; +} + +.glyphicon-save:before { + content:"\e166"; +} + +.glyphicon-open:before { + content:"\e167"; +} + +.glyphicon-saved:before { + content:"\e168"; +} + +.glyphicon-import:before { + content:"\e169"; +} + +.glyphicon-export:before { + content:"\e170"; +} + +.glyphicon-send:before { + content:"\e171"; +} + +.glyphicon-floppy-disk:before { + content:"\e172"; +} + +.glyphicon-floppy-saved:before { + content:"\e173"; +} + +.glyphicon-floppy-remove:before { + content:"\e174"; +} + +.glyphicon-floppy-save:before { + content:"\e175"; +} + +.glyphicon-floppy-open:before { + content:"\e176"; +} + +.glyphicon-credit-card:before { + content:"\e177"; +} + +.glyphicon-transfer:before { + content:"\e178"; +} + +.glyphicon-cutlery:before { + content:"\e179"; +} + +.glyphicon-header:before { + content:"\e180"; +} + +.glyphicon-compressed:before { + content:"\e181"; +} + +.glyphicon-earphone:before { + content:"\e182"; +} + +.glyphicon-phone-alt:before { + content:"\e183"; +} + +.glyphicon-tower:before { + content:"\e184"; +} + +.glyphicon-stats:before { + content:"\e185"; +} + +.glyphicon-sd-video:before { + content:"\e186"; +} + +.glyphicon-hd-video:before { + content:"\e187"; +} + +.glyphicon-subtitles:before { + content:"\e188"; +} + +.glyphicon-sound-stereo:before { + content:"\e189"; +} + +.glyphicon-sound-dolby:before { + content:"\e190"; +} + +.glyphicon-sound-5-1:before { + content:"\e191"; +} + +.glyphicon-sound-6-1:before { + content:"\e192"; +} + +.glyphicon-sound-7-1:before { + content:"\e193"; +} + +.glyphicon-copyright-mark:before { + content:"\e194"; +} + +.glyphicon-registration-mark:before { + content:"\e195"; +} + +.glyphicon-cloud-download:before { + content:"\e197"; +} + +.glyphicon-cloud-upload:before { + content:"\e198"; +} + +.glyphicon-tree-conifer:before { + content:"\e199"; +} + +.glyphicon-tree-deciduous:before { + content:"\e200"; +} + +.glyphicon-cd:before { + content:"\e201"; +} + +.glyphicon-save-file:before { + content:"\e202"; +} + +.glyphicon-open-file:before { + content:"\e203"; +} + +.glyphicon-level-up:before { + content:"\e204"; +} + +.glyphicon-copy:before { + content:"\e205"; +} + +.glyphicon-paste:before { + content:"\e206"; +} + +.glyphicon-alert:before { + content:"\e209"; +} + +.glyphicon-equalizer:before { + content:"\e210"; +} + +.glyphicon-king:before { + content:"\e211"; +} + +.glyphicon-queen:before { + content:"\e212"; +} + +.glyphicon-pawn:before { + content:"\e213"; +} + +.glyphicon-bishop:before { + content:"\e214"; +} + +.glyphicon-knight:before { + content:"\e215"; +} + +.glyphicon-baby-formula:before { + content:"\e216"; +} + +.glyphicon-tent:before { + content:"\26fa"; +} + +.glyphicon-blackboard:before { + content:"\e218"; +} + +.glyphicon-bed:before { + content:"\e219"; +} + +.glyphicon-apple:before { + content:"\f8ff"; +} + +.glyphicon-erase:before { + content:"\e221"; +} + +.glyphicon-hourglass:before { + content:"\231b"; +} + +.glyphicon-lamp:before { + content:"\e223"; +} + +.glyphicon-duplicate:before { + content:"\e224"; +} + +.glyphicon-piggy-bank:before { + content:"\e225"; +} + +.glyphicon-scissors:before { + content:"\e226"; +} + +.glyphicon-scale:before { + content:"\e230"; +} + +.glyphicon-ice-lolly:before { + content:"\e231"; +} + +.glyphicon-ice-lolly-tasted:before { + content:"\e232"; +} + +.glyphicon-education:before { + content:"\e233"; +} + +.glyphicon-option-horizontal:before { + content:"\e234"; +} + +.glyphicon-option-vertical:before { + content:"\e235"; +} + +.glyphicon-menu-hamburger:before { + content:"\e236"; +} + +.glyphicon-modal-window:before { + content:"\e237"; +} + +.glyphicon-oil:before { + content:"\e238"; +} + +.glyphicon-grain:before { + content:"\e239"; +} + +.glyphicon-sunglasses:before { + content:"\e240"; +} + +.glyphicon-text-size:before { + content:"\e241"; +} + +.glyphicon-text-color:before { + content:"\e242"; +} + +.glyphicon-text-background:before { + content:"\e243"; +} + +.glyphicon-object-align-top:before { + content:"\e244"; +} + +.glyphicon-object-align-bottom:before { + content:"\e245"; +} + +.glyphicon-object-align-horizontal:before { + content:"\e246"; +} + +.glyphicon-object-align-left:before { + content:"\e247"; +} + +.glyphicon-object-align-vertical:before { + content:"\e248"; +} + +.glyphicon-object-align-right:before { + content:"\e249"; +} + +.glyphicon-triangle-right:before { + content:"\e250"; +} + +.glyphicon-triangle-left:before { + content:"\e251"; +} + +.glyphicon-triangle-bottom:before { + content:"\e252"; +} + +.glyphicon-triangle-top:before { + content:"\e253"; +} + +.glyphicon-console:before { + content:"\e254"; +} + +.glyphicon-superscript:before { + content:"\e255"; +} + +.glyphicon-subscript:before { + content:"\e256"; +} + +.glyphicon-menu-left:before { + content:"\e257"; +} + +.glyphicon-menu-right:before { + content:"\e258"; +} + +.glyphicon-menu-down:before { + content:"\e259"; +} + +.glyphicon-menu-up:before { + content:"\e260"; +} + +button,input,select,textarea { + font-family:inherit; + font-size:inherit; + line-height:inherit; +} + +a:focus,a:hover { + color:#23527c; + text-decoration:underline; +} + +.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:6px; +} + +.img-thumbnail { + display:inline-block; + max-width:100%; + height:auto; + 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; + padding:4px; +} + +.img-circle { + border-radius:50%; +} + +.sr-only { + position:absolute; + width:1px; + height:1px; + overflow:hidden; + clip:rect(0,0,0,0); + border:0; + margin:-1px; + padding:0; +} + +.sr-only-focusable:active,.sr-only-focusable:focus { + position:static; + width:auto; + height:auto; + overflow:visible; + clip:auto; + margin:0; +} + +[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-weight: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 .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; +} + +.small,small { + font-size:85%; +} + +.mark,mark { + background-color:#fcf8e3; + padding:.2em; +} + +.text-right { + text-align:right; +} + +.text-center { + text-align:center; +} + +.text-justify { + text-align:justify; +} + +.text-nowrap { + white-space:nowrap; +} + +.text-lowercase { + text-transform:lowercase; +} + +.text-uppercase { + text-transform:uppercase; +} + +.text-capitalize { + text-transform:capitalize; +} + +.text-primary { + color:#337ab7; +} + +a.text-primary:focus,a.text-primary:hover { + color:#286090; +} + +a.bg-success:focus,a.bg-success:hover { + background-color:#c1e2b3; +} + +a.bg-info:focus,a.bg-info:hover { + background-color:#afd9ee; +} + +a.bg-warning:focus,a.bg-warning:hover { + background-color:#f7ecb5; +} + +a.bg-danger:focus,a.bg-danger:hover { + background-color:#e4b9b9; +} + +.page-header { + padding-bottom:9px; + border-bottom:1px solid #eee; + margin:40px 0 20px; +} + +ol,ul { + margin-top:0; + margin-bottom:10px; +} + +.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; +} + +abbr[data-original-title],abbr[title] { + cursor:help; + border-bottom:1px dotted #777; +} + +.initialism { + font-size:90%; + text-transform:uppercase; +} + +blockquote { + font-size:17.5px; + border-left:5px solid #eee; + margin:0 0 20px; + padding:10px 20px; +} + +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 { + font-size:90%; + color:#c7254e; + background-color:#f9f2f4; + border-radius:4px; + padding:2px 4px; +} + +kbd { + font-size:90%; + color:#fff; + background-color:#333; + 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); + padding:2px 4px; +} + +kbd kbd { + font-size:100%; + font-weight:700; + -webkit-box-shadow:none; + box-shadow:none; + padding:0; +} + +pre code { + font-size:inherit; + color:inherit; + white-space:pre-wrap; + background-color:transparent; + border-radius:0; + padding:0; +} + +.pre-scrollable { + max-height:340px; + overflow-y:scroll; +} + +.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-11 { + width:91.66666667%; +} + +.col-xs-10 { + width:83.33333333%; +} + +.col-xs-9 { + width:75%; +} + +.col-xs-8 { + width:66.66666667%; +} + +.col-xs-7 { + width:58.33333333%; +} + +.col-xs-6 { + width:50%; +} + +.col-xs-5 { + width:41.66666667%; +} + +.col-xs-4 { + width:33.33333333%; +} + +.col-xs-3 { + width:25%; +} + +.col-xs-2 { + width:16.66666667%; +} + +.col-xs-1 { + width:8.33333333%; +} + +.col-xs-pull-12 { + right:100%; +} + +.col-xs-pull-11 { + right:91.66666667%; +} + +.col-xs-pull-10 { + right:83.33333333%; +} + +.col-xs-pull-9 { + right:75%; +} + +.col-xs-pull-8 { + right:66.66666667%; +} + +.col-xs-pull-7 { + right:58.33333333%; +} + +.col-xs-pull-6 { + right:50%; +} + +.col-xs-pull-5 { + right:41.66666667%; +} + +.col-xs-pull-4 { + right:33.33333333%; +} + +.col-xs-pull-3 { + right:25%; +} + +.col-xs-pull-2 { + right:16.66666667%; +} + +.col-xs-pull-1 { + right:8.33333333%; +} + +.col-xs-pull-0 { + right:auto; +} + +.col-xs-push-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-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%; +} + +caption { + padding-top:8px; + padding-bottom:8px; + color:#777; + 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 { + line-height:1.42857143; + vertical-align:top; + border-top:1px solid #ddd; + padding:8px; +} + +.table>thead>tr>th { + vertical-align:bottom; + border-bottom:2px solid #ddd; +} + +.table>tbody+tbody { + border-top:2px solid #ddd; +} + +.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>thead>tr>td,.table-bordered>thead>tr>th { + border-bottom-width:2px; +} + +.table-striped>tbody>tr:nth-of-type(odd) { + background-color:#f9f9f9; +} + +table col[class*=col-] { + position:static; + display:table-column; + float:none; +} + +table td[class*=col-],table th[class*=col-] { + position:static; + display:table-cell; + float:none; +} + +.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-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-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-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-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; +} + +label { + display:inline-block; + max-width:100%; + margin-bottom:5px; + font-weight:700; +} + +output { + display:block; + padding-top:7px; + font-size:14px; + line-height:1.42857143; + color:#555; +} + +.form-control { + display:block; + width:100%; + height:34px; + 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; + padding:6px 12px; +} + +.form-control:focus { + 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); + border-color:#66afe9; +} + +.form-control::-moz-placeholder { + color:#999; + opacity:1; +} + +.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-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; + 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; +} + +.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; +} + +.form-group-sm .form-control-static { + height:30px; + min-height:32px; + font-size:12px; + line-height:1.5; + padding:6px 10px; +} + +.form-group-lg .form-control-static { + height:46px; + min-height:38px; + font-size:18px; + line-height:1.3333333; + padding:11px 16px; +} + +.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-control-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 .form-control { + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075); + box-shadow:inset 0 1px 1px rgba(0,0,0,.075); + border-color:#3c763d; +} + +.has-success .form-control:focus { + -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; + border-color:#2b542c; +} + +.has-success .input-group-addon { + color:#3c763d; + background-color:#dff0d8; + border-color:#3c763d; +} + +.has-warning .form-control { + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075); + box-shadow:inset 0 1px 1px rgba(0,0,0,.075); + border-color:#8a6d3b; +} + +.has-warning .form-control:focus { + -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; + border-color:#66512c; +} + +.has-warning .input-group-addon { + color:#8a6d3b; + background-color:#fcf8e3; + border-color:#8a6d3b; +} + +.has-error .form-control { + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075); + box-shadow:inset 0 1px 1px rgba(0,0,0,.075); + border-color:#a94442; +} + +.has-error .form-control:focus { + -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; + border-color:#843534; +} + +.has-error .input-group-addon { + color:#a94442; + background-color:#f2dede; + border-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; +} + +.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 .has-feedback .form-control-feedback { + right:15px; +} + +.btn { + display:inline-block; + 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; + padding:6px 12px; +} + +.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; + background-image:none; + 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.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:#402d5c; + +} + +.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; + background-image:none; + 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-toggle.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.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-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; + background-image:none; + border-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.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; +} + +.btn-info:hover { + color:#fff; + background-color:#31b0d5; + border-color:#269abc; +} + +.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info { + color:#fff; + background-color:#31b0d5; + background-image:none; + 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.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; + background-image:none; + 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.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; + background-image:none; + 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.disabled.focus,.btn-danger.disabled:focus,.btn-danger.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 { + font-size:18px; + line-height:1.3333333; + border-radius:6px; + padding:10px 16px; +} + +.btn-group-sm>.btn,.btn-sm { + font-size:12px; + line-height:1.5; + border-radius:3px; + padding:5px 10px; +} + +.btn-group-xs>.btn,.btn-xs { + font-size:12px; + line-height:1.5; + border-radius:3px; + padding:1px 5px; +} + +.fade { + opacity:0; + -webkit-transition:opacity .15s linear; + -o-transition:opacity .15s linear; + transition:opacity .15s linear; +} + +.fade.in { + opacity:1; +} + +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; + width:0; + height:0; + margin-left:2px; + vertical-align:middle; + border-top:4px solid\9; + border-right:4px solid transparent; + border-left:4px solid transparent; +} + +.dropdown-menu { + position:absolute; + top:100%; + left:0; + z-index:1000; + display:none; + float:left; + min-width:160px; + font-size:14px; + text-align:left; + list-style:none; + background-color:#fff; + -webkit-background-clip:padding-box; + background-clip:padding-box; + 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); + margin:2px 0 0; + padding:5px 0; +} + +.dropdown-menu>li>a { + display:block; + clear:both; + font-weight:400; + line-height:1.42857143; + color:#333; + white-space:nowrap; + padding:3px 20px; +} + +.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover { + color:#262626; + text-decoration: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: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); +} + +.dropdown-menu-left { + right:auto; + left:0; +} + +.dropdown-header { + display:block; + font-size:12px; + line-height:1.42857143; + color:#777; + white-space:nowrap; + padding:3px 20px; +} + +.dropdown-backdrop { + position:fixed; + top:0; + right:0; + bottom:0; + left:0; + z-index:990; +} + +.dropup .caret,.navbar-fixed-bottom .dropdown .caret { + content:""; + border-top:0; + border-bottom:4px solid\9; +} + +.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu { + top:auto; + bottom:100%; + margin-bottom:2px; +} + +.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-toolbar { + margin-left:-5px; +} + +.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group { + margin-left:5px; +} + +.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,.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-lg .caret { + border-width:5px 5px 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+.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: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-child) { + 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: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-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%; +} + +[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 .form-control,.input-group-addon,.input-group-btn { + display:table-cell; +} + +.input-group-addon,.input-group-btn { + width:1%; + white-space:nowrap; + vertical-align:middle; +} + +.input-group-addon { + font-size:14px; + font-weight:400; + line-height:1; + color:#555; + text-align:center; + background-color:#eee; + border:1px solid #ccc; + border-radius:4px; + padding:6px 12px; +} + +.input-group-addon.input-sm { + font-size:12px; + border-radius:3px; + padding:5px 10px; +} + +.input-group-addon.input-lg { + font-size:18px; + border-radius:6px; + padding:10px 16px; +} + +.input-group-btn { + position:relative; + font-size:0; + white-space:nowrap; +} + +.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.disabled>a:focus,.nav>li.disabled>a:hover { + color:#777; + text-decoration: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-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>a { + margin-bottom:5px; + text-align:center; + margin-right:0; + border-radius:4px; +} + +.nav-pills>li>a { + border-radius:4px; +} + +.nav-pills>li+li { + margin-left:2px; +} + +.nav-stacked>li+li { + margin-top:2px; + margin-left:0; +} + +.nav-justified>li>a { + margin-bottom:5px; + text-align:center; +} + +.nav-tabs-justified>li>a { + margin-right:0; + border-radius:4px; +} + +.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; +} + +.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; +} + +.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse { + max-height:340px; +} + +.navbar-static-top { + z-index:1000; + border-width:0 0 1px; +} + +.navbar-fixed-bottom,.navbar-fixed-top { + position:fixed; + right:0; + left:0; + z-index:1030; +} + +.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; + font-size:18px; + line-height:20px; + padding:15px; +} + +.navbar-brand:focus,.navbar-brand:hover { + text-decoration:none; +} + +.navbar-toggle { + position:relative; + float:right; + margin-top:8px; + margin-right:15px; + margin-bottom:8px; + background-color:transparent; + background-image:none; + border:1px solid transparent; + border-radius:4px; + padding:9px 10px; +} + +.navbar-toggle .icon-bar { + display:block; + width:22px; + height:2px; + border-radius:1px; +} + +.navbar-toggle .icon-bar+.icon-bar { + margin-top:4px; +} + +.navbar-nav { + margin:7.5px -15px; +} + +.navbar-nav>li>a { + padding-top:10px; + padding-bottom:10px; + line-height:20px; +} + +.navbar-form { + border-top:1px solid transparent; + border-bottom:1px solid transparent; + -webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1); + box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1); + margin:8px -15px; + padding:10px 15px; +} + +.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-xs { + margin-top:14px; + margin-bottom:14px; +} + +.navbar-text { + margin-top:15px; + margin-bottom:15px; +} + +.navbar-default { + background-color:#f8f8f8; + border-color:#e7e7e7; +} + +.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover { + color:#5e5e5e; + background-color:transparent; +} + +.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover { + color:#333; + background-color:transparent; +} + +.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: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 .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-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-collapse,.navbar-inverse .navbar-form { + border-color:#101010; +} + +.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 { + margin-bottom:20px; + list-style:none; + background-color:#f5f5f5; + border-radius:4px; + padding:8px 15px; +} + +.breadcrumb>li { + display:inline-block; +} + +.breadcrumb>li+li:before { + color:#ccc; + content:"/\00a0"; + padding:0 5px; +} + +.pagination { + display:inline-block; + padding-left:0; + border-radius:4px; + margin:20px 0; +} + +.pagination>li>a,.pagination>li>span { + position:relative; + float:left; + margin-left:-1px; + line-height:1.42857143; + color:#337ab7; + text-decoration:none; + background-color:#fff; + border:1px solid #ddd; + padding:6px 12px; +} + +.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,.pagination>.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 { + font-size:18px; + line-height:1.3333333; + padding:10px 16px; +} + +.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 { + font-size:12px; + line-height:1.5; + padding:5px 10px; +} + +.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span { + border-top-left-radius:3px; + 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; + text-align:center; + list-style:none; + margin:20px 0; +} + +.pager li>a,.pager li>span { + display:inline-block; + background-color:#fff; + border:1px solid #ddd; + border-radius:15px; + padding:5px 14px; +} + +.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; + font-size:75%; + font-weight:700; + line-height:1; + color:#fff; + text-align:center; + white-space:nowrap; + vertical-align:baseline; + border-radius:.25em; + padding:.2em .6em .3em; +} + +.label-default { + background-color:#777; +} + +.label-default[href]:focus,.label-default[href]:hover { + background-color:#5e5e5e; +} + +.label-primary { + background-color:#337ab7; +} + +.label-success[href]:focus,.label-success[href]:hover { + background-color:#449d44; +} + +.label-info[href]:focus,.label-info[href]:hover { + background-color:#31b0d5; +} + +.label-warning[href]:focus,.label-warning[href]:hover { + background-color:#ec971f; +} + +.label-danger[href]:focus,.label-danger[href]:hover { + background-color:#c9302c; +} + +.badge { + display:inline-block; + min-width:10px; + 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; + padding:3px 7px; +} + +.btn-group-xs>.btn .badge,.btn-xs .badge { + top:0; + padding:1px 5px; +} + +.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 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%; +} + +.thumbnail { + display:block; + 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; + padding:4px; +} + +.thumbnail a>img,.thumbnail>img { + margin-right:auto; + margin-left:auto; +} + +.thumbnail .caption { + color:#333; + padding:9px; +} + +.alert { + margin-bottom:20px; + border:1px solid transparent; + border-radius:4px; + padding:15px; +} + +.alert h4 { + margin-top:0; + color:inherit; +} + +.alert-dismissable,.alert-dismissible { + padding-right:35px; +} + +.alert-dismissable .close,.alert-dismissible .close { + position:relative; + top:-2px; + right:-21px; + color:inherit; +} + +.alert-success hr { + border-top-color:#c9e2b3; +} + +.alert-info hr { + border-top-color:#a6e1ec; +} + +.alert-warning hr { + border-top-color:#f7e1b5; +} + +.alert-danger hr { + border-top-color:#e4b9c0; +} + +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:center; + 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:linear-gradient(45deg,rgba(255,255,255,.15) 25% 25% 50% 50% 75% 75%; + -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:progress-bar-stripes 2s linear infinite; + animation:progress-bar-stripes 2s linear infinite; +} + +.media { + margin-top:15px; +} + +.media,.media-body { + overflow:hidden; + zoom:1; +} + +.media-body { + width:10000px; +} + +.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 { + vertical-align:middle; +} + +.media-bottom { + vertical-align:bottom; +} + +.list-group { + padding-left:0; + margin-bottom:20px; +} + +.list-group-item { + position:relative; + display:block; + margin-bottom:-1px; + background-color:#fff; + border:1px solid #ddd; + padding:10px 15px; +} + +.list-group-item:first-child { + border-top-left-radius:4px; + border-top-right-radius:4px; +} + +.list-group-item:last-child { + margin-bottom:0; + border-bottom-right-radius:4px; + border-bottom-left-radius:4px; +} + +a.list-group-item,button.list-group-item { + color:#555; +} + +a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover { + color:#555; + text-decoration:none; + background-color:#f5f5f5; +} + +button.list-group-item { + width:100%; + text-align:left; +} + +.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover { + color:#777; + cursor:not-allowed; + background-color:#eee; +} + +.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover { + z-index:2; + color:#fff; + background-color:#337ab7; + border-color:#337ab7; +} + +.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text { + color:#c7ddef; +} + +.list-group-item-success { + color:#3c763d; + background-color:#dff0d8; +} + +a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover { + color:#3c763d; + background-color:#d0e9c6; +} + +a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover { + color:#fff; + background-color:#3c763d; + border-color:#3c763d; +} + +.list-group-item-info { + color:#31708f; + background-color:#d9edf7; +} + +a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover { + color:#31708f; + background-color:#c4e3f3; +} + +a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover { + color:#fff; + background-color:#31708f; + border-color:#31708f; +} + +.list-group-item-warning { + color:#8a6d3b; + background-color:#fcf8e3; +} + +a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover { + color:#8a6d3b; + background-color:#faf2cc; +} + +a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover { + color:#fff; + background-color:#8a6d3b; + border-color:#8a6d3b; +} + +.list-group-item-danger { + color:#a94442; + background-color:#f2dede; +} + +a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover { + color:#a94442; + background-color:#ebcccc; +} + +a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover { + color:#fff; + background-color:#a94442; + border-color:#a94442; +} + +.list-group-item-text { + margin-bottom:0; + line-height:1.3; +} + +.panel { + margin-bottom:20px; + background-color:#fff; + border:1px solid transparent; + border-radius:4px; + -webkit-box-shadow:0 1px 1px rgba(0,0,0,.05); + box-shadow:0 1px 1px rgba(0,0,0,.05); +} + +.panel-body { + padding:15px; +} + +.panel-heading { + border-bottom:1px solid transparent; + border-top-left-radius:3px; + border-top-right-radius:3px; + padding:10px 15px; +} + +.panel-title { + margin-top:0; + margin-bottom:0; + font-size:16px; + color:inherit; +} + +.panel-footer { + background-color:#f5f5f5; + border-top:1px solid #ddd; + border-bottom-right-radius:3px; + border-bottom-left-radius:3px; + padding:10px 15px; +} + +.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item { + border-radius:0; + border-width:1px 0; +} + +.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child { + border-top:0; + border-top-left-radius:3px; + border-top-right-radius:3px; +} + +.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child { + border-bottom:0; + border-bottom-right-radius:3px; + border-bottom-left-radius:3px; +} + +.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption { + padding-right:15px; + padding-left:15px; +} + +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child { + border-top-left-radius:3px; +} + +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child { + border-top-right-radius:3px; +} + +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child { + border-bottom-left-radius:3px; +} + +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child { + border-bottom-right-radius:3px; +} + +.panel>.table-bordered,.panel>.table-responsive>.table-bordered { + border:0; +} + +.panel>.table-responsive { + margin-bottom:0; + border:0; +} + +.panel-group { + margin-bottom:20px; +} + +.panel-group .panel { + margin-bottom:0; + border-radius:4px; +} + +.panel-default>.panel-heading { + color:#333; + background-color:#f5f5f5; + border-color:#ddd; +} + +.panel-default>.panel-heading+.panel-collapse>.panel-body { + border-top-color:#ddd; +} + +.panel-default>.panel-heading .badge { + color:#f5f5f5; + background-color:#333; +} + +.panel-default>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color:#ddd; +} + +.panel-primary>.panel-heading { + color:#fff; + background-color:#337ab7; + border-color:#337ab7; +} + +.panel-primary>.panel-heading+.panel-collapse>.panel-body { + border-top-color:#337ab7; +} + +.panel-primary>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color:#337ab7; +} + +.panel-success { + border-color:#d6e9c6; +} + +.panel-success>.panel-heading+.panel-collapse>.panel-body { + border-top-color:#d6e9c6; +} + +.panel-success>.panel-heading .badge { + color:#dff0d8; + background-color:#3c763d; +} + +.panel-success>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color:#d6e9c6; +} + +.panel-info { + border-color:#bce8f1; +} + +.panel-info>.panel-heading+.panel-collapse>.panel-body { + border-top-color:#bce8f1; +} + +.panel-info>.panel-heading .badge { + color:#d9edf7; + background-color:#31708f; +} + +.panel-info>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color:#bce8f1; +} + +.panel-warning { + border-color:#faebcc; +} + +.panel-warning>.panel-heading+.panel-collapse>.panel-body { + border-top-color:#faebcc; +} + +.panel-warning>.panel-heading .badge { + color:#fcf8e3; + background-color:#8a6d3b; +} + +.panel-warning>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color:#faebcc; +} + +.panel-danger { + border-color:#ebccd1; +} + +.panel-danger>.panel-heading+.panel-collapse>.panel-body { + border-top-color:#ebccd1; +} + +.panel-danger>.panel-heading .badge { + color:#f2dede; + background-color:#a94442; +} + +.panel-danger>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color:#ebccd1; +} + +.embed-responsive { + position:relative; + display:block; + height:0; + overflow:hidden; + padding:0; +} + +.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video { + position:absolute; + top:0; + bottom:0; + left:0; + width:100%; + height:100%; + border:0; +} + +.embed-responsive-16by9 { + padding-bottom:56.25%; +} + +.embed-responsive-4by3 { + padding-bottom:75%; +} + +.well { + min-height:20px; + margin-bottom:20px; + background-color:#f5f5f5; + border:1px solid #e3e3e3; + border-radius:4px; + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05); + box-shadow:inset 0 1px 1px rgba(0,0,0,.05); + padding:19px; +} + +.well blockquote { + border-color:rgba(0,0,0,.15); +} + +.well-lg { + border-radius:6px; + padding:24px; +} + +.well-sm { + border-radius:3px; + padding:9px; +} + +.close { + float:right; + font-size:21px; + font-weight:700; + line-height:1; + color:#000; + text-shadow:0 1px 0 #fff; + filter:alpha(opacity=20); + opacity:.2; +} + +.close:focus,.close:hover { + color:#000; + text-decoration:none; + cursor:pointer; + filter:alpha(opacity=50); + opacity:.5; +} + +button.close { + -webkit-appearance:none; + cursor:pointer; + background:0 0; + border:0; + padding:0; +} + +.modal { + position:fixed; + top:0; + right:0; + bottom:0; + left:0; + z-index:1050; + display:none; + overflow:hidden; + -webkit-overflow-scrolling:touch; + outline:0; +} + +.modal.fade .modal-dialog { + -webkit-transition:0 .3s ease-out; + -o-transition:0 .3s ease-out; + transition:transform .3s ease-out; + -webkit-transform:translate(0,-25%); + -ms-transform:translate(0,-25%); + -o-transform:translate(0,-25%); + transform:translate(0,-25%); +} + +.modal.in .modal-dialog { + -webkit-transform:translate(0,0); + -ms-transform:translate(0,0); + -o-transform:translate(0,0); + transform:translate(0,0); +} + +.modal-open .modal { + overflow-x:hidden; + overflow-y:auto; +} + +.modal-dialog { + position:relative; + width:auto; + margin:10px; +} + +.modal-content { + position:relative; + background-color:#fff; + -webkit-background-clip:padding-box; + background-clip:padding-box; + border:1px solid rgba(0,0,0,.2); + border-radius:6px; + outline:0; + -webkit-box-shadow:0 3px 9px rgba(0,0,0,.5); + box-shadow:0 3px 9px rgba(0,0,0,.5); +} + +.modal-backdrop { + position:fixed; + top:0; + right:0; + bottom:0; + left:0; + z-index:1040; + background-color:#000; +} + +.modal-backdrop.fade { + filter:alpha(opacity=0); + opacity:0; +} + +.modal-backdrop.in { + filter:alpha(opacity=50); + opacity:.5; +} + +.modal-header { + border-bottom:1px solid #e5e5e5; + padding:15px; +} + +.modal-header .close { + margin-top:-2px; +} + +.modal-title { + line-height:1.42857143; + margin:0; +} + +.modal-body { + position:relative; + padding:15px; +} + +.modal-footer { + text-align:right; + border-top:1px solid #e5e5e5; + padding:15px; +} + +.modal-footer .btn+.btn { + margin-bottom:0; + margin-left:5px; +} + +.modal-scrollbar-measure { + position:absolute; + top:-9999px; + width:50px; + height:50px; + overflow:scroll; +} + +.tooltip { + position:absolute; + z-index:1070; + display:block; + font-family:"Helvetica Neue",Helvetica,Arial,sans-serif; + font-size:12px; + font-style:normal; + font-weight:400; + line-height:1.42857143; + text-align:start; + text-decoration:none; + text-shadow:none; + text-transform:none; + letter-spacing:normal; + word-break:normal; + word-spacing:normal; + word-wrap:normal; + white-space:normal; + filter:alpha(opacity=0); + opacity:0; + line-break:auto; +} + +.tooltip.in { + filter:alpha(opacity=90); + opacity:.9; +} + +.tooltip.top { + margin-top:-3px; + padding:5px 0; +} + +.tooltip.right { + margin-left:3px; + padding:0 5px; +} + +.tooltip.bottom { + margin-top:3px; + padding:5px 0; +} + +.tooltip.left { + margin-left:-3px; + padding:0 5px; +} + +.tooltip-inner { + max-width:200px; + color:#fff; + text-align:center; + background-color:#000; + border-radius:4px; + padding:3px 8px; +} + +.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 { + right:5px; + bottom:0; + margin-bottom:-5px; + border-top-color:#000; + border-width:5px 5px 0; +} + +.tooltip.top-right .tooltip-arrow { + bottom:0; + left:5px; + margin-bottom:-5px; + 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 5px 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; + right:5px; + margin-top:-5px; + border-bottom-color:#000; + border-width:0 5px 5px; +} + +.tooltip.bottom-right .tooltip-arrow { + top:0; + left:5px; + margin-top:-5px; + border-bottom-color:#000; + border-width:0 5px 5px; +} + +.popover { + position:absolute; + top:0; + left:0; + z-index:1060; + display:none; + max-width:276px; + font-family:"Helvetica Neue",Helvetica,Arial,sans-serif; + font-size:14px; + font-style:normal; + font-weight:400; + line-height:1.42857143; + text-align:start; + text-decoration:none; + text-shadow:none; + text-transform:none; + letter-spacing:normal; + word-break:normal; + word-spacing:normal; + word-wrap:normal; + white-space:normal; + background-color:#fff; + -webkit-background-clip:padding-box; + background-clip:padding-box; + border:1px solid rgba(0,0,0,.2); + border-radius:6px; + -webkit-box-shadow:0 5px 10px rgba(0,0,0,.2); + box-shadow:0 5px 10px rgba(0,0,0,.2); + line-break:auto; + padding:1px; +} + +.popover.top { + margin-top:-10px; +} + +.popover.right { + margin-left:10px; +} + +.popover.bottom { + margin-top:10px; +} + +.popover.left { + margin-left:-10px; +} + +.popover-title { + font-size:14px; + background-color:#f7f7f7; + border-bottom:1px solid #ebebeb; + border-radius:5px 5px 0 0; + margin:0; + padding:8px 14px; +} + +.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 { + content:""; + border-width:10px; +} + +.popover.top>.arrow { + bottom:-11px; + left:50%; + margin-left:-11px; + border-top-color:rgba(0,0,0,.25); + border-bottom-width:0; +} + +.popover.top>.arrow:after { + bottom:1px; + margin-left:-10px; + content:" "; + border-top-color:#fff; + border-bottom-width:0; +} + +.popover.right>.arrow { + top:50%; + left:-11px; + margin-top:-11px; + border-right-color:rgba(0,0,0,.25); + border-left-width:0; +} + +.popover.right>.arrow:after { + bottom:-10px; + left:1px; + content:" "; + border-right-color:#fff; + border-left-width:0; +} + +.popover.bottom>.arrow { + top:-11px; + left:50%; + margin-left:-11px; + border-top-width:0; + border-bottom-color:rgba(0,0,0,.25); +} + +.popover.bottom>.arrow:after { + top:1px; + margin-left:-10px; + content:" "; + border-top-width:0; + border-bottom-color:#fff; +} + +.popover.left>.arrow { + top:50%; + right:-11px; + margin-top:-11px; + border-right-width:0; + border-left-color:rgba(0,0,0,.25); +} + +.popover.left>.arrow:after { + right:1px; + bottom:-10px; + content:" "; + border-right-width:0; + border-left-color:#fff; +} + +.carousel-inner { + position:relative; + width:100%; + overflow:hidden; +} + +.carousel-inner>.item { + position:relative; + display:none; + -webkit-transition:.6s ease-in-out left; + -o-transition:.6s ease-in-out left; + transition:.6s ease-in-out left; +} + +.carousel-inner>.item>a>img,.carousel-inner>.item>img { + line-height:1; +} + +.carousel-inner>.next,.carousel-inner>.prev { + position:absolute; + top:0; + width: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,.6); + background-color:rgba(0,0,0,0); + filter:alpha(opacity=50); + opacity:.5; +} + +.carousel-control.left { + background-image:linear-gradient(toright,rgba(0,0,0,.5) 0 100%; + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1); + background-repeat:repeat-x; +} + +.carousel-control.right { + right:0; + left:auto; + background-image:linear-gradient(toright,rgba(0,0,0,.0001) 0 100%; + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1); + background-repeat:repeat-x; +} + +.carousel-control:focus,.carousel-control:hover { + color:#fff; + text-decoration:none; + filter:alpha(opacity=90); + outline:0; + opacity:.9; +} + +.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev { + position:absolute; + top:50%; + z-index:5; + display:inline-block; + margin-top:-10px; +} + +.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev { + left:50%; + margin-left:-10px; +} + +.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next { + right:50%; + margin-right:-10px; +} + +.carousel-control .icon-next,.carousel-control .icon-prev { + width:20px; + height:20px; + font-family:serif; + line-height:1; +} + +.carousel-control .icon-prev:before { + content:'\2039'; +} + +.carousel-control .icon-next:before { + content:'\203a'; +} + +.carousel-indicators { + position:absolute; + bottom:10px; + left:50%; + z-index:15; + width:60%; + padding-left:0; + margin-left:-30%; + text-align:center; + list-style:none; +} + +.carousel-indicators li { + display:inline-block; + width:10px; + height:10px; + text-indent:-999px; + cursor:pointer; + background-color:rgba(0,0,0,0); + border:1px solid #fff; + border-radius:10px; + margin:1px; +} + +.carousel-indicators .active { + width:12px; + height:12px; + background-color:#fff; + margin:0; +} + +.carousel-caption { + position:absolute; + right:15%; + bottom:20px; + left:15%; + z-index:10; + padding-top:20px; + padding-bottom:20px; + color:#fff; + text-align:center; + text-shadow:0 1px 2px rgba(0,0,0,.6); +} + +.carousel-caption .btn { + text-shadow:none; +} + +.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before { + display:table; + content:" "; +} + +.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after { + clear:both; +} + +.center-block { + display:block; + margin-right:auto; + margin-left:auto; +} + +.pull-right { + float:right!important; +} + +.pull-left { + float:left!important; +} + +.show { + display:block!important; +} + +.invisible { + visibility:hidden; +} + +.text-hide { + font:0/0 a; + color:transparent; + text-shadow:none; + background-color:transparent; + border:0; +} + +.affix { + position:fixed; +} + +article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary,input[type=file],.collapse.in,.open>.dropdown-menu,.tab-content>.active,.navbar-brand>img,.media-object,.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev { + display:block; +} + +[hidden],template,.collapse,.tab-content>.tab-pane,.label:empty,.badge:empty { + display:none; +} + +a:active,a:hover,.dropdown-toggle:focus,.open>a,.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle,.navbar-toggle:focus { + outline:0; +} + +b,strong,optgroup,dt,.alert .alert-link { + font-weight:700; +} + +svg:not(:root),.modal-open { + overflow:hidden; +} + +input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button,select[multiple],select[size],textarea.form-control,select[multiple].input-sm,textarea.input-sm,.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control,select[multiple].input-lg,textarea.input-lg,.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control,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,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; +} + +.glyphicon-bitcoin:before,.glyphicon-btc:before,.glyphicon-xbt:before { + content:"\e227"; +} + +.glyphicon-yen:before,.glyphicon-jpy:before { + content:"\00a5"; +} + +.glyphicon-ruble:before,.glyphicon-rub:before { + content:"\20bd"; +} + +*,:after,:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; +} + +a:focus,input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus,.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus { + outline:5px auto 0; + outline-offset:-2px; +} + +.h4,.h5,.h6,h4,h5,h6,.navbar-btn.btn-sm { + margin-top:10px; + margin-bottom:10px; +} + +.text-left,th { + text-align:left; +} + +.text-muted,.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.nav>li.disabled>a,.navbar-default .navbar-brand,.navbar-default .navbar-text,.navbar-default .navbar-nav>li>a,.navbar-default .navbar-link,.navbar-default .btn-link,.breadcrumb>.active,.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text { + color:#777; +} + +.text-success,.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,.has-success .form-control-feedback,a.list-group-item-success,button.list-group-item-success { + color:#3c763d; +} + +a.text-success:focus,a.text-success:hover,.alert-success .alert-link { + color:#2b542c; +} + +.text-info,a.list-group-item-info,button.list-group-item-info { + color:#31708f; +} + +a.text-info:focus,a.text-info:hover,.alert-info .alert-link { + color:#245269; +} + +.text-warning,.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,.has-warning .form-control-feedback,a.list-group-item-warning,button.list-group-item-warning { + color:#8a6d3b; +} + +a.text-warning:focus,a.text-warning:hover,.alert-warning .alert-link { + color:#66512c; +} + +.text-danger,.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,.has-error .form-control-feedback,a.list-group-item-danger,button.list-group-item-danger { + color:#a94442; +} + +a.text-danger:focus,a.text-danger:hover,.alert-danger .alert-link { + color:#843534; +} + +.bg-primary,.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover { + color:#fff; + background-color:#337ab7; +} + +a.bg-primary:focus,a.bg-primary:hover,.label-primary[href]:focus,.label-primary[href]:hover { + background-color:#286090; +} + +.bg-success,.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 { + background-color:#dff0d8; +} + +.bg-info,.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; +} + +.bg-warning,.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>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning { + background-color:#fcf8e3; +} + +.bg-danger,.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; +} + +ol ol,ol ul,ul ol,ul ul,blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,.alert>p,.alert>ul,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table { + margin-bottom:0; +} + +.list-unstyled,.media-list { + padding-left:0; + list-style:none; +} + +dd,.col-xs-offset-0,.btn-group>.btn:first-child,.btn .caret,.modal-footer .btn-block+.btn-block { + margin-left:0; +} + +.container,.container-fluid { + padding-right:15px; + padding-left:15px; + margin-right:auto; + margin-left:auto; +} + +.row,.form-horizontal .form-group,.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header { + margin-right:-15px; + margin-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,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.btn-group>.btn-group,.nav-pills>li,.pager .previous>a,.pager .previous>span { + float:left; +} + +.col-xs-12,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block,.btn-group-justified>.btn-group .btn,.nav-justified { + width:100%; +} + +.col-xs-push-12,.carousel-inner>.next,.carousel-inner>.active.right { + left:100%; +} + +.col-xs-push-0,.btn-group-justified>.btn-group .dropdown-menu { + left:auto; +} + +.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,.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th,.panel-group .panel-footer { + border-top:0; +} + +.table .table,.navbar-inverse .navbar-toggle .icon-bar { + background-color:#fff; +} + +.table-bordered,.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,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover { + border:1px solid #ddd; +} + +.table-hover>tbody>tr:hover,.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; +} + +input[type=range],.btn-block { + display:block; + width:100%; +} + +.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder { + color:#999; +} + +.form-control[disabled],fieldset[disabled] .form-control,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled],.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline,.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label { + cursor:not-allowed; +} + +.input-sm,.form-group-sm .form-control,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn { + height:30px; + font-size:12px; + line-height:1.5; + border-radius:3px; + padding:5px 10px; +} + +select.input-sm,.form-group-sm select.form-control,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; +} + +.input-lg,.form-group-lg .form-control,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn { + height:46px; + font-size:18px; + line-height:1.3333333; + border-radius:6px; + padding:10px 16px; +} + +select.input-lg,.form-group-lg select.form-control,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; +} + +.has-feedback,.dropdown,.dropup,.input-group-btn>.btn,.carousel { + position:relative; +} + +.btn-primary .badge,.list-group-item.active>.badge,.nav-pills>.active>a>.badge,.panel-primary>.panel-heading .badge { + color:#337ab7; + background-color:#fff; +} + +.btn-block+.btn-block,.alert>p+p,.panel-group .panel+.panel { + margin-top:5px; +} + +.dropdown-menu.pull-right,.dropdown-menu-right,.pull-right>.dropdown-menu { + right:0; + left:auto; +} + +.dropdown-menu .divider,.nav .nav-divider { + height:1px; + overflow:hidden; + background-color:#e5e5e5; + margin:9px 0; +} + +.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,.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.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,.input-group-btn>.btn+.btn,.modal-footer .btn-group .btn+.btn { + margin-left:-1px; +} + +.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,.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; +} + +.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.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; +} + +.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child),.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.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:not(: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; +} + +.btn-group-vertical>.btn-group>.btn,.nav-tabs.nav-justified>li,.nav-stacked>li,.nav-justified>li { + float:none; +} + +.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child,.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child { + border-top-left-radius:0; + border-top-right-radius:0; +} + +.input-group-addon input[type=checkbox],.input-group-addon input[type=radio],.media:first-child { + margin-top:0; +} + +.input-group-addon:first-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child { + border-right:0; +} + +.input-group-addon:last-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child { + border-left:0; +} + +.nav>li>a:focus,.nav>li>a:hover,.pager li>a:focus,.pager li>a:hover { + text-decoration:none; + background-color:#eee; +} + +.nav>li>a>img,.media-object.img-thumbnail { + max-width:none; +} + +.nav-tabs,.panel-group .panel-footer+.panel-collapse .panel-body { + border-bottom:1px solid #ddd; +} + +.nav-tabs.nav-justified>.dropdown .dropdown-menu,.nav-justified>.dropdown .dropdown-menu { + top:auto; + left:auto; +} + +.nav-tabs-justified,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel-group .panel-heading { + border-bottom:0; +} + +.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover,.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; +} + +.navbar-default .navbar-toggle,.panel-default { + border-color:#ddd; +} + +.navbar-default .navbar-link:hover,.navbar-default .btn-link:focus,.navbar-default .btn-link:hover,a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading { + color:#333; +} + +.navbar-inverse .navbar-brand,.navbar-inverse .navbar-text,.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-link,.navbar-inverse .btn-link { + color:#9d9d9d; +} + +.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover,.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,.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; +} + +.navbar-inverse .navbar-link:hover,.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover { + color:#fff; +} + +.pagination>li,.pager li { + display:inline; +} + +.pager .next>a,.pager .next>span,.list-group-item>.badge { + float:right; +} + +a.label:focus,a.label:hover,a.badge:focus,a.badge:hover { + color:#fff; + text-decoration:none; + cursor:pointer; +} + +.btn .label,.btn .badge { + position:relative; + top:-1px; +} + +.label-success,.progress-bar-success { + background-color:#5cb85c; +} + +.label-info,.progress-bar-info { + background-color:#5bc0de; +} + +.label-warning,.progress-bar-warning { + background-color:#f0ad4e; +} + +.label-danger,.progress-bar-danger { + background-color:#d9534f; +} + +.jumbotron .h1,.jumbotron h1,.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small,a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading,a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading,a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading,a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading,.panel-heading>.dropdown .dropdown-toggle,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a { + color:inherit; +} + +a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover,.panel-primary { + border-color:#337ab7; +} + +.alert-success,.panel-success>.panel-heading { + color:#3c763d; + background-color:#dff0d8; + border-color:#d6e9c6; +} + +.alert-info,.panel-info>.panel-heading { + color:#31708f; + background-color:#d9edf7; + border-color:#bce8f1; +} + +.alert-warning,.panel-warning>.panel-heading { + color:#8a6d3b; + background-color:#fcf8e3; + border-color:#faebcc; +} + +.alert-danger,.panel-danger>.panel-heading { + color:#a94442; + background-color:#f2dede; + border-color:#ebccd1; +} + +.progress-striped .progress-bar-success,.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning,.progress-striped .progress-bar-danger { + background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25% 25% 50% 50% 75% 75%; +} + +.media-heading,.list-group-item-heading { + margin-top:0; + margin-bottom:5px; +} + +.panel-heading+.list-group .list-group-item:first-child,.list-group+.panel-footer { + border-top-width:0; +} + +.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child { + border-top-left-radius:3px; + border-top-right-radius:3px; +} + +.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child { + border-bottom-right-radius:3px; + border-bottom-left-radius:3px; +} + +.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body { + border-top:1px solid #ddd; +} + +.carousel-inner>.active,.carousel-inner>.next.left,.carousel-inner>.prev.right { + left:0; +} + +.carousel-inner>.prev,.carousel-inner>.active.left { + left:-100%; +} + +.hide,.hidden,.visible-lg,.visible-md,.visible-sm,.visible-xs,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-print,.visible-print-block,.visible-print-inline,.visible-print-inline-block { + display:none!important; +} + +@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 solid #ddd!important; + } + + table.visible-print { + display:table!important; + } + + tr.visible-print { + display:table-row!important; + } + + td.visible-print,th.visible-print { + display:table-cell!important; + } + + .visible-print-inline { + display:inline!important; + } + + .visible-print-inline-block { + display:inline-block!important; + } + + .hidden-print { + display:none!important; + } + + .visible-print,.visible-print-block { + display:block!important; + } +} + +@media min-width768px{ + .lead { + font-size:21px; + } + + .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; + } + + .container { + width:750px; + } + + .col-sm-11 { + width:91.66666667%; + } + + .col-sm-10 { + width:83.33333333%; + } + + .col-sm-9 { + width:75%; + } + + .col-sm-8 { + width:66.66666667%; + } + + .col-sm-7 { + width:58.33333333%; + } + + .col-sm-6 { + width:50%; + } + + .col-sm-5 { + width:41.66666667%; + } + + .col-sm-4 { + width:33.33333333%; + } + + .col-sm-3 { + width:25%; + } + + .col-sm-2 { + width:16.66666667%; + } + + .col-sm-1 { + width:8.33333333%; + } + + .col-sm-pull-12 { + right:100%; + } + + .col-sm-pull-11 { + right:91.66666667%; + } + + .col-sm-pull-10 { + right:83.33333333%; + } + + .col-sm-pull-9 { + right:75%; + } + + .col-sm-pull-8 { + right:66.66666667%; + } + + .col-sm-pull-7 { + right:58.33333333%; + } + + .col-sm-pull-6 { + right:50%; + } + + .col-sm-pull-5 { + right:41.66666667%; + } + + .col-sm-pull-4 { + right:33.33333333%; + } + + .col-sm-pull-3 { + right:25%; + } + + .col-sm-pull-2 { + right:16.66666667%; + } + + .col-sm-pull-1 { + right:8.33333333%; + } + + .col-sm-pull-0 { + right:auto; + } + + .col-sm-push-12 { + left:100%; + } + + .col-sm-push-11 { + left:91.66666667%; + } + + .col-sm-push-10 { + left:83.33333333%; + } + + .col-sm-push-9 { + left:75%; + } + + .col-sm-push-8 { + left:66.66666667%; + } + + .col-sm-push-7 { + left:58.33333333%; + } + + .col-sm-push-6 { + left:50%; + } + + .col-sm-push-5 { + left:41.66666667%; + } + + .col-sm-push-4 { + left:33.33333333%; + } + + .col-sm-push-3 { + left:25%; + } + + .col-sm-push-2 { + left:16.66666667%; + } + + .col-sm-push-1 { + left:8.33333333%; + } + + .col-sm-push-0 { + left:auto; + } + + .col-sm-offset-12 { + margin-left:100%; + } + + .col-sm-offset-11 { + margin-left:91.66666667%; + } + + .col-sm-offset-10 { + margin-left:83.33333333%; + } + + .col-sm-offset-9 { + margin-left:75%; + } + + .col-sm-offset-8 { + margin-left:66.66666667%; + } + + .col-sm-offset-7 { + margin-left:58.33333333%; + } + + .col-sm-offset-6 { + margin-left:50%; + } + + .col-sm-offset-5 { + margin-left:41.66666667%; + } + + .col-sm-offset-4 { + margin-left:33.33333333%; + } + + .col-sm-offset-3 { + margin-left:25%; + } + + .col-sm-offset-2 { + margin-left:16.66666667%; + } + + .col-sm-offset-1 { + margin-left:8.33333333%; + } + + .col-sm-offset-0 { + margin-left:0; + } + + .form-horizontal .control-label { + padding-top:7px; + margin-bottom:0; + text-align:right; + } + + .form-horizontal .form-group-lg .control-label { + padding-top:11px; + font-size:18px; + } + + .form-horizontal .form-group-sm .control-label { + padding-top:6px; + font-size:12px; + } + + .navbar-right .dropdown-menu { + right:0; + left:auto; + } + + .navbar-right .dropdown-menu-left { + right:auto; + left:0; + } + + .nav-tabs.nav-justified>li>a { + margin-bottom:0; + border-bottom:1px solid #ddd; + border-radius:4px 4px 0 0; + } + + .nav-justified>li>a { + margin-bottom:0; + } + + .nav-tabs-justified>li>a { + border-bottom:1px solid #ddd; + border-radius:4px 4px 0 0; + } + + .navbar { + border-radius:4px; + } + + .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; + } + + .container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header { + margin-right:0; + margin-left:0; + } + + .navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand { + margin-left:-15px; + } + + .navbar-toggle { + display:none; + } + + .navbar-nav { + float:left; + margin:0; + } + + .navbar-nav>li>a { + padding-top:15px; + padding-bottom:15px; + } + + .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-text { + float:left; + margin-right:15px; + margin-left:15px; + } + + .navbar-left { + float:left!important; + } + + .navbar-right { + float:right!important; + margin-right:-15px; + } + + .navbar-right~.navbar-right { + margin-right:0; + } + + .modal-dialog { + width:600px; + margin:30px auto; + } + + .modal-content { + -webkit-box-shadow:0 5px 15px rgba(0,0,0,.5); + box-shadow:0 5px 15px rgba(0,0,0,.5); + } + + .modal-sm { + width:300px; + } + + .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,.navbar-header,.navbar-nav>li { + float:left; + } + + .col-sm-12,.form-inline .input-group>.form-control,.navbar-form .input-group>.form-control { + width:100%; + } + + .form-inline .form-group,.navbar-form .form-group { + display:inline-block; + margin-bottom:0; + vertical-align:middle; + } + + .form-inline .form-control,.navbar-form .form-control { + display:inline-block; + width:auto; + vertical-align:middle; + } + + .form-inline .form-control-static,.navbar-form .form-control-static { + display:inline-block; + } + + .form-inline .input-group,.navbar-form .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,.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn { + width:auto; + } + + .form-inline .control-label,.navbar-form .control-label { + margin-bottom:0; + vertical-align:middle; + } + + .form-inline .checkbox,.form-inline .radio,.navbar-form .checkbox,.navbar-form .radio { + display:inline-block; + margin-top:0; + margin-bottom:0; + vertical-align:middle; + } + + .form-inline .checkbox label,.form-inline .radio label,.navbar-form .checkbox label,.navbar-form .radio label { + padding-left:0; + } + + .form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio],.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio] { + position:relative; + margin-left:0; + } + + .form-inline .has-feedback .form-control-feedback,.navbar-form .has-feedback .form-control-feedback { + top:0; + } + + .nav-tabs.nav-justified>li,.nav-justified>li { + display:table-cell; + width:1%; + } + + .nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover { + border-bottom-color:#fff; + } + + .navbar-static-top,.navbar-fixed-bottom,.navbar-fixed-top { + border-radius:0; + } +} + +@media min-width992px{ + .container { + width:970px; + } + + .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; + } + + .modal-lg { + width:900px; + } +} + +@media min-width1200px{ + .container { + width:1170px; + } + + .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.66666667%; + } + + .col-lg-10 { + width:83.33333333%; + } + + .col-lg-9 { + width:75%; + } + + .col-lg-8 { + width:66.66666667%; + } + + .col-lg-7 { + width:58.33333333%; + } + + .col-lg-6 { + width:50%; + } + + .col-lg-5 { + width:41.66666667%; + } + + .col-lg-4 { + width:33.33333333%; + } + + .col-lg-3 { + width:25%; + } + + .col-lg-2 { + width:16.66666667%; + } + + .col-lg-1 { + width:8.33333333%; + } + + .col-lg-pull-12 { + right:100%; + } + + .col-lg-pull-11 { + right:91.66666667%; + } + + .col-lg-pull-10 { + right:83.33333333%; + } + + .col-lg-pull-9 { + right:75%; + } + + .col-lg-pull-8 { + right:66.66666667%; + } + + .col-lg-pull-7 { + right:58.33333333%; + } + + .col-lg-pull-6 { + right:50%; + } + + .col-lg-pull-5 { + right:41.66666667%; + } + + .col-lg-pull-4 { + right:33.33333333%; + } + + .col-lg-pull-3 { + right:25%; + } + + .col-lg-pull-2 { + right:16.66666667%; + } + + .col-lg-pull-1 { + right:8.33333333%; + } + + .col-lg-pull-0 { + right:auto; + } + + .col-lg-push-12 { + left:100%; + } + + .col-lg-push-11 { + left:91.66666667%; + } + + .col-lg-push-10 { + left:83.33333333%; + } + + .col-lg-push-9 { + left:75%; + } + + .col-lg-push-8 { + left:66.66666667%; + } + + .col-lg-push-7 { + left:58.33333333%; + } + + .col-lg-push-6 { + left:50%; + } + + .col-lg-push-5 { + left:41.66666667%; + } + + .col-lg-push-4 { + left:33.33333333%; + } + + .col-lg-push-3 { + left:25%; + } + + .col-lg-push-2 { + left:16.66666667%; + } + + .col-lg-push-1 { + left:8.33333333%; + } + + .col-lg-push-0 { + left:auto; + } + + .col-lg-offset-12 { + margin-left:100%; + } + + .col-lg-offset-11 { + margin-left:91.66666667%; + } + + .col-lg-offset-10 { + margin-left:83.33333333%; + } + + .col-lg-offset-9 { + margin-left:75%; + } + + .col-lg-offset-8 { + margin-left:66.66666667%; + } + + .col-lg-offset-7 { + margin-left:58.33333333%; + } + + .col-lg-offset-6 { + margin-left:50%; + } + + .col-lg-offset-5 { + margin-left:41.66666667%; + } + + .col-lg-offset-4 { + margin-left:33.33333333%; + } + + .col-lg-offset-3 { + margin-left:25%; + } + + .col-lg-offset-2 { + margin-left:16.66666667%; + } + + .col-lg-offset-1 { + margin-left:8.33333333%; + } + + .col-lg-offset-0 { + margin-left:0; + } + + table.visible-lg { + display:table!important; + } + + tr.visible-lg { + display:table-row!important; + } + + td.visible-lg,th.visible-lg { + display:table-cell!important; + } + + .visible-lg-inline { + display:inline!important; + } + + .visible-lg-inline-block { + display:inline-block!important; + } + + .hidden-lg { + display:none!important; + } + + .visible-lg,.visible-lg-block { + display:block!important; + } +} + +@media screen and max-width767px{ + .table-responsive { + width:100%; + margin-bottom:15px; + overflow-y:hidden; + -ms-overflow-style:0; + 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; + } +} + +@media screen and -webkit-min-device-pixel-ratio0{ + 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-group-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; + } +} + +@media max-device-width480px and orientationlandscape{ + .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse { + max-height:200px; + } +} + +@media max-width767px{ + .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; + } + + .navbar-form .form-group { + margin-bottom:5px; + } + + .navbar-form .form-group:last-child { + margin-bottom:0; + } + + .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:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover { + color:#ccc; + background-color:transparent; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header { + border-color:#080808; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color:#080808; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a { + color:#9d9d9d; + } + + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a: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; + } + + table.visible-xs { + display:table!important; + } + + tr.visible-xs { + display:table-row!important; + } + + td.visible-xs,th.visible-xs { + display:table-cell!important; + } + + .visible-xs-inline { + display:inline!important; + } + + .visible-xs-inline-block { + display:inline-block!important; + } + + .hidden-xs { + display:none!important; + } + + .visible-xs,.visible-xs-block { + display:block!important; + } +} + +@media screen and min-width768px{ + .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; + } + + .carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev { + width:30px; + height:30px; + margin-top:-10px; + font-size:30px; + } + + .carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev { + margin-left:-10px; + } + + .carousel-control .glyphicon-chevron-right,.carousel-control .icon-next { + margin-right:-10px; + } + + .carousel-caption { + right:20%; + left:20%; + padding-bottom:30px; + } + + .carousel-indicators { + bottom:20px; + } +} + +@media all and transform-3d,-webkit-transform-3d{ + .carousel-inner>.item { + -webkit-transition:0 .6s ease-in-out; + -o-transition:0 .6s ease-in-out; + transition:transform .6s ease-in-out; + -webkit-backface-visibility:hidden; + backface-visibility:hidden; + -webkit-perspective:1000px; + perspective:1000px; + } + + .carousel-inner>.item.active.right,.carousel-inner>.item.next { + left:0; + -webkit-transform:translate3d(100%,0,0); + transform:translate3d(100%,0,0); + } + + .carousel-inner>.item.active.left,.carousel-inner>.item.prev { + left:0; + -webkit-transform:translate3d(-100%,0,0); + transform:translate3d(-100%,0,0); + } + + .carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right { + left:0; + -webkit-transform:translate3d(0,0,0); + transform:translate3d(0,0,0); + } +} + +@media min-width768px and max-width991px{ + table.visible-sm { + display:table!important; + } + + tr.visible-sm { + display:table-row!important; + } + + td.visible-sm,th.visible-sm { + display:table-cell!important; + } + + .visible-sm-inline { + display:inline!important; + } + + .visible-sm-inline-block { + display:inline-block!important; + } + + .hidden-sm { + display:none!important; + } + + .visible-sm,.visible-sm-block { + display:block!important; + } +} + +@media min-width992px and max-width1199px{ + table.visible-md { + display:table!important; + } + + tr.visible-md { + display:table-row!important; + } + + td.visible-md,th.visible-md { + display:table-cell!important; + } + + .visible-md-inline { + display:inline!important; + } + + .visible-md-inline-block { + display:inline-block!important; + } + + .hidden-md { + display:none!important; + } + + .visible-md,.visible-md-block { + display:block!important; + } +} \ No newline at end of file diff --git a/reprounzip-vis/reprounzip_vis/static/css/style.css b/reprounzip-vis/reprounzip_vis/static/css/style.css new file mode 100644 index 000000000..1ca0877e7 --- /dev/null +++ b/reprounzip-vis/reprounzip_vis/static/css/style.css @@ -0,0 +1,361 @@ +@import "https://designmodo.github.io/Flat-UI/dist/css/flat-ui.min.css"; +@import "https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"; +@import "https://daneden.github.io/animate.css/animate.min.css"; +/*-------------------------------*/ +/* VARIABLES */ +/*-------------------------------*/ +body { + position: relative; + overflow-x: hidden; +} +body, +html { + height: 100%; + background-color: #583e7e; +} +.nav .open > a { + background-color: transparent; +} +.nav .open > a:hover { + background-color: transparent; +} +.nav .open > a:focus { + background-color: transparent; +} +.navbar { + + height: 100%; + overflow-x: hidden; +} + +/*-------------------------------*/ +/* Wrappers */ +/*-------------------------------*/ +#wrapper { + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + -webkit-transition: all 0.5s ease; + padding-left: 0; + transition: all 0.5s ease; +} +#wrapper.toggled { + padding-left: 320px; +} +#wrapper.toggled #sidebar-wrapper { + width: 320px; +} +#wrapper.toggled #page-content-wrapper { + margin-right: -320px; + position: absolute; +} +#sidebar-wrapper { + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + -webkit-transition: all 0.5s ease; + background: #1a1a1a; + height: 100%; + left: 320px; + margin-left: -320px; + overflow-x: hidden; + overflow-y: auto; + transition: all 0.5s ease; + width: 0; + z-index: 1000; +} +#sidebar-wrapper::-webkit-scrollbar { + display: none; +} +#page-content-wrapper { + padding-top: 70px; + width: 100%; +} +/*-------------------------------*/ +/* Sidebar nav styles */ +/*-------------------------------*/ +.sidebar-nav { + list-style: none; + margin: 0; + padding: 0; + position: absolute; + top: 0; + width: 320px; +} +.sidebar-nav li { + display: inline-block; + line-height: 20px; + position: relative; + width: 100%; +} +.sidebar-nav li:before { + background-color: #1c1c1c; + content: ''; + height: 100%; + left: 0; + position: absolute; + top: 0; + -webkit-transition: width 0.2s ease-in; + transition: width 0.2s ease-in; + width: 3px; + z-index: -1; +} +.sidebar-nav li:first-child a { + background-color: #1a1a1a; + color: #ffffff; +} + +.sidebar-nav li:nth-child(2):before { + background-color: #402d5c; +} +.sidebar-nav li:nth-child(3):before { + background-color: #4c366d; +} +.sidebar-nav li:nth-child(4):before { + background-color: #583e7e; +} +.sidebar-nav li:nth-child(5):before { + background-color: #64468f; +} +.sidebar-nav li:nth-child(6):before { + background-color: #704fa0; +} +.sidebar-nav li:nth-child(7):before { + background-color: #7c5aae; +} +.sidebar-nav li:nth-child(8):before { + background-color: #8a6cb6; +} +.sidebar-nav li:nth-child(9):before { + background-color: #987dbf; +} +.sidebar-nav li:hover:before { + -webkit-transition: width 0.2s ease-in; + transition: width 0.2s ease-in; + width: 100%; +} + + +.sidebar-nav li a { + color: #dddddd; + display: block; + padding: 10px 15px 10px 30px; + text-decoration: none; +} +.sidebar-nav li.open:hover before { + -webkit-transition: width 0.2s ease-in; + transition: width 0.2s ease-in; + width: 100%; +} +.sidebar-nav .dropdown-menu { + background-color: #222222; + border-radius: 0; + border: none; + box-shadow: none; + margin: 0; + padding: 0; + position: relative; + width: 100%; +} +.sidebar-nav li a:hover, +.sidebar-nav li a:active, +.sidebar-nav li a:focus, +.sidebar-nav li.open a:hover, +.sidebar-nav li.open a:active, +.sidebar-nav li.open a:focus { + background-color: transparent; + color: #ffffff; + text-decoration: none; +} +.sidebar-nav > .sidebar-brand { + font-size: 20px; + height: 65px; + line-height: 44px; +} +/*-------------------------------*/ +/* Hamburger-Cross */ +/*-------------------------------*/ +.hamburger { + background: transparent; + border: none; + display: block; + height: 32px; + margin-left: 15px; + position: fixed; + top: 20px; + width: 32px; + z-index: 999; +} +.hamburger:hover { + outline: none; +} +.hamburger:focus { + outline: none; +} +.hamburger:active { + outline: none; +} +.hamburger.is-closed:before { + -webkit-transform: translate3d(0, 0, 0); + -webkit-transition: all 0.35s ease-in-out; + color: #000000; + content: ''; + display: block; + font-size: 14px; + line-height: 32px; + opacity: 0; + text-align: center; + width: 100px; +} +.hamburger.is-open:before { + -webkit-transform: translate3d(0, 0, 0); + -webkit-transition: all 0.35s ease-in-out; + color: #000000; + content: ''; + display: block; + font-size: 14px; + line-height: 32px; + opacity: 0; + text-align: center; + width: 100px; +} +.hamburger.is-open:hover before { + -webkit-transform: translate3d(-100px, 0, 0); + -webkit-transition: all 0.35s ease-in-out; + display: block; + opacity: 1; +} +.hamburger.is-open:hover .hamb-top { + -webkit-transition: all 0.35s ease-in-out; + top: 0; +} +.hamburger.is-open:hover .hamb-bottom { + -webkit-transition: all 0.35s ease-in-out; + bottom: 0; +} +.hamburger.is-open .hamb-top { + -webkit-transition: all 0.35s ease-in-out; + background-color: rgba(000, 000, 000, 0.7); + top: 5px; +} +.hamburger.is-open .hamb-middle { + background-color: rgba(000, 000, 000, 0.7); + margin-top: -2px; + top: 50%; +} +.hamburger.is-open .hamb-bottom { + -webkit-transition: all 0.35s ease-in-out; + background-color: rgba(000, 000, 000, 0.7); + bottom: 5px; +} +.hamburger.is-open .hamb-top, +.hamburger.is-open .hamb-middle, +.hamburger.is-open .hamb-bottom, + + + +.hamburger.is-closed .hamb-top, +.hamburger.is-closed .hamb-middle, +.hamburger.is-closed .hamb-bottom { + height: 4px; + left: 0; + position: absolute; + width: 100%; +} +.hamburger.is-closed .hamb-top { + -webkit-transform: rotate(45deg); + -webkit-transition: -webkit-transform 0.2s cubic-bezier(0.73, 1, 0.28, 0.08); + background-color: #6b7279; + margin-top: -2px; + top: 50%; +} +.hamburger.is-closed .hamb-middle { + background-color: #6b7279; + display: none; +} +.hamburger.is-closed .hamb-bottom { + -webkit-transform: rotate(-45deg); + -webkit-transition: -webkit-transform 0.2s cubic-bezier(0.73, 1, 0.28, 0.08); + background-color: #6b7279; + margin-top: -2px; + top: 50%; +} +.hamburger.is-closed:before { + -webkit-transform: translate3d(0, 0, 0); + -webkit-transition: all 0.35s ease-in-out; + color: #000; + content: ''; + display: block; + font-size: 14px; + line-height: 32px; + opacity: 0; + text-align: center; + width: 100px; +} +.hamburger.is-closed:hover before { + -webkit-transform: translate3d(-100px, 0, 0); + -webkit-transition: all 0.35s ease-in-out; + display: block; + opacity: 1; +} +/*!*-------------------------------*!*/ +/*!* Dark Overlay *!*/ +/*!*-------------------------------*!*/ +/*.overlay {*/ +/*position: fixed;*/ +/*display: none;*/ +/*width: 100%;*/ +/*height: 100%;*/ +/*top: 0;*/ +/*left: 0;*/ +/*right: 0;*/ +/*bottom: 0;*/ +/*!*------------- background-color: rgba(0, 0, 0, 0.4);------------------*!*/ + +/*z-index: 1;*/ +/*}*/ +/* SOME DEMO STYLES - NOT REQUIRED */ +body, +html { + background-color: #ffffff /* #583e7e; --*/ +} +body h1, +body h2, +body h3, +body h4 { + color: rgba(255, 255, 255, 0.9); +} +body p, +body blockquote { + color: rgba(255, 255, 255, 0.7); +} +body a { + color: rgba(255, 255, 255, 0.8); + text-decoration: underline; +} +body a:hover { + color: #fff; +} + + + +.sidebar-nav .noBeforeContent::before{ + + content: none; +} + + +.btn-primary { + color: #fff; + background-color: #1abc9c; +} + + +.collapsible a:hover:before { + -webkit-transition: width 0.2s ease-in; + transition: width 0.2s ease-in; + width: 100%; + background-color: #402d5c; +} + +.collapsible:before { + background-color: #402d5c; +} \ No newline at end of file diff --git a/reprounzip-vis/reprounzip_vis/static/index.html b/reprounzip-vis/reprounzip_vis/static/index.html new file mode 100644 index 000000000..328fcfe8f --- /dev/null +++ b/reprounzip-vis/reprounzip_vis/static/index.html @@ -0,0 +1,301 @@ + + + + + ReproZip Provenance Graph + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reprounzip-vis/reprounzip_vis/static/js/NYT_SVGCrowbar.js b/reprounzip-vis/reprounzip_vis/static/js/NYT_SVGCrowbar.js new file mode 100644 index 000000000..c9c39f976 --- /dev/null +++ b/reprounzip-vis/reprounzip_vis/static/js/NYT_SVGCrowbar.js @@ -0,0 +1,258 @@ +/*-- Modified code from New York Times SVG Crowbar to save the current visualization as SVG file. The modification is allowed according to MIT License that New York Times SVG Crowbar licensed under with --*/ + +d3.select("#generate") + .on("click", writeDownloadLink); + +function writeDownloadLink(){ + + + (function() { + var doctype = ''; + + window.URL = (window.URL || window.webkitURL); + + var body = document.body; + + var prefix = { + xmlns: "http://www.w3.org/2000/xmlns/", + xlink: "http://www.w3.org/1999/xlink", + svg: "http://www.w3.org/2000/svg" + }; + + initialize(); + + function initialize() { + var documents = [window.document], + SVGSources = []; + iframes = document.querySelectorAll("iframe"), + objects = document.querySelectorAll("object"); + + [].forEach.call(iframes, function(el) { + try { + if (el.contentDocument) { + documents.push(el.contentDocument); + } + } catch(err) { + console.log(err) + } + }); + + [].forEach.call(objects, function(el) { + try { + if (el.contentDocument) { + documents.push(el.contentDocument); + } + } catch(err) { + console.log(err) + } + }); + + documents.forEach(function(doc) { + var styles = getStyles(doc); + var newSources = getSources(doc, styles); + for (var i = 0; i < newSources.length; i++) { + SVGSources.push(newSources[i]); + }; + }); + + if (SVGSources.length > 1) { + createPopover(SVGSources); + } else if (SVGSources.length > 0) { + download(SVGSources[0]); + } else { + alert("The Crowbar couldn’t find any SVG nodes."); + } + } + + function createPopover(sources) { + cleanup(); + + sources.forEach(function(s1) { + sources.forEach(function(s2) { + if (s1 !== s2) { + if ((Math.abs(s1.top - s2.top) < 38) && (Math.abs(s1.left - s2.left) < 38)) { + s2.top += 38; + s2.left += 38; + } + } + }) + }); + + var buttonsContainer = document.createElement("div"); + body.appendChild(buttonsContainer); + + buttonsContainer.setAttribute("class", "svg-crowbar"); + buttonsContainer.style["z-index"] = 1e7; + buttonsContainer.style["position"] = "absolute"; + buttonsContainer.style["top"] = 0; + buttonsContainer.style["left"] = 0; + + + + var background = document.createElement("div"); + body.appendChild(background); + + background.setAttribute("class", "svg-crowbar"); + background.style["background"] = "rgba(255, 255, 255, 0.7)"; + background.style["position"] = "fixed"; + background.style["left"] = 0; + background.style["top"] = 0; + background.style["width"] = "100%"; + background.style["height"] = "100%"; + + sources.forEach(function(d, i) { + var buttonWrapper = document.createElement("div"); + buttonsContainer.appendChild(buttonWrapper); + buttonWrapper.setAttribute("class", "svg-crowbar"); + buttonWrapper.style["position"] = "absolute"; + buttonWrapper.style["top"] = (d.top + document.body.scrollTop) + "px"; + buttonWrapper.style["left"] = (document.body.scrollLeft + d.left) + "px"; + buttonWrapper.style["padding"] = "4px"; + buttonWrapper.style["border-radius"] = "3px"; + buttonWrapper.style["color"] = "white"; + buttonWrapper.style["text-align"] = "center"; + buttonWrapper.style["font-family"] = "'Helvetica Neue'"; + buttonWrapper.style["background"] = "rgba(0, 0, 0, 0.8)"; + buttonWrapper.style["box-shadow"] = "0px 4px 18px rgba(0, 0, 0, 0.4)"; + buttonWrapper.style["cursor"] = "move"; + buttonWrapper.textContent = "SVG #" + i + ": " + (d.id ? "#" + d.id : "") + (d.class ? "." + d.class : ""); + + var button = document.createElement("button"); + buttonWrapper.appendChild(button); + button.setAttribute("data-source-id", i) + button.style["width"] = "150px"; + button.style["font-size"] = "12px"; + button.style["line-height"] = "1.4em"; + button.style["margin"] = "5px 0 0 0"; + button.textContent = "Download"; + + button.onclick = function(el) { + // console.log(el, d, i, sources) + download(d); + }; + + }); + + } + + function cleanup() { + var crowbarElements = document.querySelectorAll(".svg-crowbar"); + + [].forEach.call(crowbarElements, function(el) { + el.parentNode.removeChild(el); + }); + } + + + function getSources(doc, styles) { + var svgInfo = [], + svgs = doc.querySelectorAll("svg"); + + styles = (styles === undefined) ? "" : styles; + + [].forEach.call(svgs, function (svg) { + + svg.setAttribute("version", "1.1"); + + var defsEl = document.createElement("defs"); + svg.insertBefore(defsEl, svg.firstChild); //TODO .insert("defs", ":first-child") + // defsEl.setAttribute("class", "svg-crowbar"); + + var styleEl = document.createElement("style") + defsEl.appendChild(styleEl); + styleEl.setAttribute("type", "text/css"); + + + // removing attributes so they aren't doubled up + svg.removeAttribute("xmlns"); + svg.removeAttribute("xlink"); + + // These are needed for the svg + if (!svg.hasAttributeNS(prefix.xmlns, "xmlns")) { + svg.setAttributeNS(prefix.xmlns, "xmlns", prefix.svg); + } + + if (!svg.hasAttributeNS(prefix.xmlns, "xmlns:xlink")) { + svg.setAttributeNS(prefix.xmlns, "xmlns:xlink", prefix.xlink); + } + + var source = (new XMLSerializer()).serializeToString(svg).replace('', ''); + var rect = svg.getBoundingClientRect(); + svgInfo.push({ + top: rect.top, + left: rect.left, + width: rect.width, + height: rect.height, + class: svg.getAttribute("class"), + id: svg.getAttribute("id"), + childElementCount: svg.childElementCount, + source: [doctype + source] + }); + }); + return svgInfo; + } + + function download(source) { + var filename = "untitled"; + + if (source.id) { + filename = source.id; + } else if (source.class) { + filename = source.class; + } else if (window.document.title) { + filename = window.document.title.replace(/[^a-z0-9]/gi, '-').toLowerCase(); + } + + var url = window.URL.createObjectURL(new Blob(source.source, { "type" : "text\/xml" })); + + var a = document.createElement("a"); + body.appendChild(a); + a.setAttribute("class", "svg-crowbar"); + a.setAttribute("download", filename + ".svg"); + a.setAttribute("href", url); + a.style["display"] = "none"; + a.click(); + + setTimeout(function() { + window.URL.revokeObjectURL(url); + }, 10); + } + + function getStyles(doc) { + var styles = "", + styleSheets = doc.styleSheets; + + if (styleSheets) { + for (var i = 0; i < styleSheets.length; i++) { + processStyleSheet(styleSheets[i]); + } + } + + function processStyleSheet(ss) { + if (ss.cssRules) { + for (var i = 0; i < ss.cssRules.length; i++) { + var rule = ss.cssRules[i]; + if (rule.type === 3) { + // Import Rule + processStyleSheet(rule.styleSheet); + } else { + // hack for illustrator crashing on descendent selectors + if (rule.selectorText) { + if (rule.selectorText.indexOf(">") === -1) { + styles += "\n" + rule.cssText; + } + } + } + } + } + } + return styles; + } + + })(); + + + + +}; + diff --git a/reprounzip-vis/reprounzip_vis/static/js/d3_Visualization.js b/reprounzip-vis/reprounzip_vis/static/js/d3_Visualization.js new file mode 100644 index 000000000..e65e3067f --- /dev/null +++ b/reprounzip-vis/reprounzip_vis/static/js/d3_Visualization.js @@ -0,0 +1,2572 @@ +/*-- Functions for d3 visualization --*/ + + +let DELAY = 200, clicks = 0, timer = null; + +//-- Click any empty space within the svg body to reset the location for the packages and detached the links between the packages and processes +d3.select("body").on("click",function(){ + + clicks++; + + if(clicks ===1){ + + timer = setTimeout(function() { + + clicks = 0; + + }, DELAY); + + + } else { + + clearTimeout(timer); + + if (d3.event.target.toString().includes("SVGSVGElement")) { + + console.log('clicked an empty space!'); + + resetPackagesPosition(); + + }; + + clicks = 0; + + }; + + + + + +}); + + + + +// update Tree function +function update(source) { + + + + + // Compute the new tree layout. + let nodes = tree.nodes(root).reverse(), + links = tree.links(nodes); + + console.log('source.x: ', source.x); + console.log('source.y: ', source.y); + + + // Normalize for fixed-depth. + nodes.forEach(function(d) { d.y = d.depth * 400; + + }); + + + + // Update the nodes… + let node = svg.selectAll("g.node") + .data(nodes, function(d) { return d.id || (d.id = ++nodeId_Index);}); + + + + + let DELAY = 200, clicks = 0, timer = null; + + // Enter any new nodes at the parent's previous position. + let nodeEnter = node.enter().append("g") + .attr("class", "node") + .attr("transform", function(d) { return "translate(" + source.y0 + "," + source.x0 + ")"; }) + //.on("dblclick", dblclickProcess) + .on("click", + + function(d){ + + //clickProcess + + clicks++; //count clicks + + if(clicks === 1) { + + timer = setTimeout(function() { + + clickProcess(d); //perform single-click action + clicks = 0; //after action performed, reset counter + + }, DELAY); + + } else { + + clearTimeout(timer); //prevent single-click action + dblclickProcess(d); //perform double-click action + clicks = 0; //after action performed, reset counter + }; + + + + } + + ) + .on("mousedown", function(d){ + + // d3.select("body").transition().style("background-color", "#1c1c1c"); + + + + // auto-show item content when show results reduces to single + + // ;( function( $, window, document, undefined ) + // { + // let $container = $( '.viz' ); + // + // + // if( !$container.length ) return true; + // + // let $packages = $container.find( '.package' ), + // $package = $(); + // + // $input.on( 'keyup', function() + // { + // $item = $items.not( '.is-hidden' ); + // if( $item.length === 1 ) + // $item.addClass( 'js--autoshown is-active' ); + // else + // $items.filter( '.js--autoshown' ).removeClass( 'js--autoshown is-active' ); + // }); + // })( jQuery, window, document ); + + }) + .on("mouseup", function(d){ + + console.log("mouseUP"); + d3.select("body").transition().style("background-color", "white"); + + }) + .on("mouseover", function(d) { + + tooltip.transition() + .duration(200) + .style("opacity", .8); + tooltip .html( + d.description + ) + .style("left", (d3.event.pageX) + "px") + .style("top", (d3.event.pageY - 38) + "px"); + }) + .on("mouseout", function(d) { + tooltip.transition() + .duration(500) + .style("opacity", 0); + }); + + + + + nodeEnter.append("circle") + .attr("r", 1e-6) + .attr("class", "process") + .attr("id", function(d) { return "process_" + d.name.replace(/[ ()]/g,''); }) + .style("fill", function(d) { return d._children ? "lightsteelblue" : "#fff"; }); + + nodeEnter.append("text") + .attr("class", "processLabel") + .attr("id", function(d) { return "processLabel_" + d.name.replace(/[ ()]/g,''); }) + .attr("x", function(d) { return d.children || d._children ? -10 : 10; }) + .attr("dy", ".35em") + .attr("text-anchor", function(d) { return d.children || d._children ? "end" : "start"; }) + .text(function(d) { return d.name; }) + .style("fill-opacity", 1e-6); + + + + // Transition nodes to their new position. + let nodeUpdate = node.transition() + .duration(duration) + .attr("transform", function(d) { + + + + return "translate(" + d.y + "," + d.x + ")"; }); + + nodeUpdate.select("circle") + .attr("r", 8) + .style("fill", function(d) { return d._children ? "lightsteelblue" : "#fff"; }); + + nodeUpdate.select("text") + .style("fill-opacity", 1); + + + + // Transition exiting nodes to the parent's new position. + let nodeExit = node.exit().transition() + .duration(duration) + .attr("transform", function(d) { return "translate(" + source.y + "," + source.x + ")"; }) + .remove(); + + + nodeExit.select("circle") + .attr("r", 1e-6); + + nodeExit.select("text") + .style("fill-opacity", 1e-6); + + // Update the links… + let link = svg.selectAll("path.link") + .data(links, function(d) { return d.target.id; }); + + // Enter any new links at the parent's previous position. + link.enter().insert("path", "g") + .attr("class", "link") + .attr("d", function(d) { + let o = {x: source.x0, y: source.y0}; + return diagonal({source: o, target: o}); + }); + + + // Transition links to their new position. + link.transition() + .duration(duration) + .attr("d", diagonal); + + + // Transition exiting nodes to the parent's new position. + link.exit().transition() + .duration(duration) + .attr("d", function(d) { + let o = {x: source.x, y: source.y}; + return diagonal({source: o, target: o}); + }) + .remove(); + + + // Update the link text + let linktext = svg.selectAll("g.link") + .data(links, function (d) { + return d.target.id; + }); + + + + linktext.enter() + .insert("g") + .attr("class", "link") + .attr("transform", function(d) { return "translate(" + d.source.y + "," + d.source.x + ")"; }) + .append("text") + .attr("dy", ".35em") + .attr("text-anchor", "middle") + .style("font-size", 15) + .text(function (d) { + return d.target.rule; + }); + + // Transition link text to their new positions + + linktext.transition() + .duration(duration) + .attr("transform", function (d) { + return "translate(" + ((d.source.y + d.target.y) / 2) + "," + ((d.source.x + d.target.x) / 2) + ")"; + }) + + + + //Transition exiting link text to the parent's new position. + linktext.exit().transition() + .remove(); + + + + + + // Stash the old positions for transition. + nodes.forEach(function(d) { + d.x0 = d.x; + d.y0 = d.y ; + + }); + + + + currentDisplayingNodes = nodes; + console.log("currentDisplayingNodes: ", currentDisplayingNodes); + + + + // svg.append('use').attr('xlink:href','#package'); + + +}; + +// Toggle children on click. +function dblclickProcess(d) { + + + + let links = force.links(); + + links = []; + + edge = svg.selectAll(".edge").data(links); + + //Empty edges. + edge.exit().remove(); + svg.selectAll("circle"); + + + forceLinks = links; + + force.links(links); + + restart(); + + let isOpen = false; + + let newTimelineDuration; + + if (d.children) { + + + d._children = d.children; + d.children = null; + + decreaseTimeLineLen(d.y ); + + console.log('Close'); + + newTimelineDuration = (d.start_time - rootStartTime) / 1000000; + + + } else { + + + d.children = d._children; + d._children = null; + + console.log('Open'); + + isOpen = true; + + newTimelineDuration = (d.exit_time - rootStartTime) / 1000000; + + // let tempDuration = 0; + // + // + // if (d.children != null){ + // + // d.children.forEach(function(node) { + // + // if ((node.start_time - rootStartTime) > tempDuration) { + // + // tempDuration = node.start_time - rootStartTime; + // }; + // + // + // }); + // } + // else{ + // tempDuration = d.exit_time - rootStartTime; + // + // } + // + // + // newTimelineDuration = tempDuration / 1000000; //d.children[0].start_time - rootStartTime; + + + } + + timeLineLen = timeLineLen_Total * (newTimelineDuration / duration_total_ms); + + console.log('timeLineLen:', timeLineLen); + + // let durationLabel = "Took " + (duration / 1000000).toFixed(2) + " milliseconds"; + + if(newTimelineDuration > 0 && isOpen == true){ + + updateTimeLine(timeLineLen, getTimeLineLabel(newTimelineDuration,'took') + d.name + " is done."); + } + + else if(newTimelineDuration > 0 && isOpen == false){ + + updateTimeLine(timeLineLen , getTimeLineLabel(newTimelineDuration,'took') + d.name + " is started."); + } + else if(newTimelineDuration === 0){ + + + + updateTimeLine(timeLineLen , d.name + " is the initial process"); + + } + else { + + updateTimeLine(0); + + } + + console.log('tree.size(): ',tree.size()); + console.log('timeLineLen_Total: ', timeLineLen_Total); + + + update(d); + + updatedProcessDetails(d); + + +} + + +// Toggle tree on click. +function clickProcess(d) { + + + console.log('single click'); + + console.log('This D: ', d); + + console.log('This this: ', this); + + + let otherSVG = d3.selectAll(".process, .processLabel, .package, .edge, .packageLabel, .link"); + + if(inFocus === true){ + + + otherSVG.style("opacity", 0.3); + + } + else otherSVG.style("opacity", 1); + + + currentSelectedNode = d; + + + + if (thisNodeCircle != null && thisNodeCircleLabel != null){ + + + thisNodeCircle.transition().attr("r", 8); + thisNodeCircleLabel.transition().style("font", "15px sans-serif").attr("x", function(d) { return d.children || d._children ? -10 : 10; }); + + + } + + + + thisNodeCircle = d3.select("#process_"+ d.name.replace(/[ ()]/g,'')); // d3.select("id","#process_" + d.name.replace(/[ ()]/g,'')); + thisNodeCircleLabel = d3.select("#processLabel_"+ d.name.replace(/[ ()]/g,'')); // d3.select("id","#process_" + d.name.replace(/[ ()]/g,'')); + + + thisNodeCircle.transition().attr("r", 20).style("opacity", 1); + thisNodeCircleLabel + .transition() + .style("font", "20px sans-serif") + .style("opacity", 1) + .attr("x", function(d) { return d.children || d._children ? -30 : 30; }); + + + + let links = force.links(); + + links = []; + + edge = svg.selectAll(".edge").data(links); + + + let edgeExit = edge.exit().remove(); + + if(forceNodes.length > packagesNumber){ + + forceNodes.pop(); + + } + + // add links to any nearby nodes + + let node = {}; + node.x = d.y; + node.y = d.x; + node.px = d.y; + node.py = d.x; + node.weight = 10; + node.radius = 20; + node.fixed = true; + + + + let thisNode = forceNodes.push(node); + + + let circles = svg.selectAll("circle"); + + + + forceNodes.forEach(function(target) { + + d.packages.reads.forEach(function (readFile) { + + if(target.name === readFile){ + + + + d3.select(".package_" + readFile.replace(/[.,\/#!$%&;:+{}=\-_`~()]/g,"")).style("opacity", 1); + d3.select("#packageLabel_" + readFile.replace(/[.,\/#!$%&;:+{}=\-_`~()]/g,"")).style("opacity", 1); + + links.push({source: node, target: target}); + + } + + }) + + + + }); + + + + forceLinks = links; + + + let label = svg.selectAll(".forceLabel") + .data(force.nodes()); + + label.attr("x", function(d){ return d.x; }) + .attr("y", function (d) {return d.y - 30; }); + + force.links(links); + //force.nodes(thisNode); + + + + restart(); + + updatedProcessDetails(d); + + + + +} + +function updatedProcessDetails(d){ + + + + // Delete the current processDetails section to prepare + // for new information. + + processDetails.selectAll('*').remove(); + + + + // Extract and prepare the commands message for this selected process + let commands = ''; + + if(d.argv != null){ + + d.argv.forEach(function(argv){ + + commands += argv;//.concat(argv.toString()); + commands += ' '; + + }); + } + else{ + + commands = 'No argument for this process' + } + + + let runtime = ''; //new moment.duration((d.exit_time/1000000) - (d.start_time / 1000000)); + + // runtime = runtime.asMilliseconds().toFixed(2) + " milliseconds"; + + if (d.start_time >= 0){ + runtime = getTimeLineLabel((d.exit_time/1000000) - (d.start_time / 1000000)); + } + else runtime = 'Runtime data is not available.'; + + + // Fill in the processDetails section with informationm + // from the node. Because we want to transition + // this to match the transitions on the graph, + // we first set it's opacity to 0. + processDetails.style({'opacity': 0}); + + + // Now add the processDetails content. + let fileNames = d.reads.sort().concat(d.writes.sort()); + let uniqFileNames = [...new Set(fileNames)]; + + + // let readFromDivHeader = processDetails.append('div').attr("id", "readFromDivHeader").attr("class", "panel-heading"); + processDetails.append('h3').text("Process:").attr("href", "#ProcessName").style({'padding-left': 0, 'text-decoration': 'none' ,'color':'white' , 'font-size': '20px' }); + processDetails.append('h5').text(d.name).attr("id", "ProcessName" ).attr("class", "panel-collapse ").style({'padding-left': 0, 'text-decoration': 'none', 'font-size': '15px' }); + + processDetails.append('h3').attr("class", "collapsible").append('a').text("Runtime:").attr("href", "#Runtime").attr("data-toggle", "collapse").style({'padding-left': 0, 'text-decoration': 'none' ,'color':'white' , 'font-size': '20px' }); + processDetails.append('h5').text(runtime).attr("id", "Runtime" ).attr("class", "panel-collapse ").style({'padding-left': 0, 'text-decoration': 'none', 'font-size': '15px' }); + + processDetails.append('h3').attr("class", "collapsible").append('a').text("Commands:").attr("href", "#Commands").attr("data-toggle", "collapse").style({'padding-left': 0, 'text-decoration': 'none' ,'color':'white' , 'font-size': '20px' }); + processDetails.append('h5').text(commands).attr("id", "Commands" ).attr("class", "panel-collapse ").style({'padding-left': 0, 'text-decoration': 'none', 'font-size': '15px' }); + + processDetails.append('h3').text("Associated Files:").style({'padding-left': 0, 'text-decoration': 'none' ,'color':'white' , 'font-size': '20px' }); + processDetails.append('h6').text(uniqFileNames.length + " files").style({'padding-left': 0, 'text-decoration': 'none', 'font-size': '15px' }); + processDetails.append('input').attr("type", "search").attr("class", "fileSearch_input").attr("placeholder", "Search for listing files") + .style("margin-left", "10px;"); + + searchFilesInfoDiv = processDetails.append('div').attr("class", "searchFilesInfoDiv"); + + searchFilesList = processDetails.append('div').attr("class", "searchFilesList"); + + + let filesList = []; + + let fileNamesList = d.reads.sort().concat(d.writes.sort()); + + fileNamesList.forEach(function(file){ + + + let keyName = "\"" + file + "\""; + + if(keyName in fileDict){ + + + let thisFile = fileDict[keyName]; + + filesList.push(thisFile); + + } + + + }); + + + + let filelistUL = searchFilesList.append('ul'); + let fileCount = 1; + + filesList.forEach(function(file){ + + let id = "faq-" + fileCount; + let href = "#" + id; + + let fileLi = filelistUL.append('li').attr("id",id ).attr("class", "noBeforeContent"); + + let fileH2 = fileLi.append('h4');//.text(file.name); + fileH2.append('a').attr("href", href).text(file.name); + + let fileDiv = fileLi.append('div'); + + + let proccess_Read = ""; + let proccess_Write = ""; + + + if(file.reads.length != 0){ + file.reads.forEach(function(process){ + proccess_Read += process + "
" + + }); + } + else { + + proccess_Read = "Not read by any process." + } + + if(file.writes.length != 0){ + file.writes.forEach(function(process){ + proccess_Write += process + "
" + + }); + } + else { + + proccess_Write = "Not written by any process." + } + + fileDiv.html( + "
" + + "
From Package: " + file.package+ "
" + + + "
Read By:
" + + proccess_Read + + + "
" + + + "
Written By:
" + + proccess_Write + + ) + + + + fileCount++; + + }); + + + searchFilesList.append('div').attr("class", "searchFilesList__notfound").html( + "

No matches were found… Try “bash”.

" + + ); + + + // associationString: "reads" or "writes + createFileTooTip(searchFilesInfoDiv,d,"reads"); + createFileTooTip(searchFilesInfoDiv,d,"writes"); + + + + let packageNames = d.packages.reads.sort().concat(d.packages.writes.sort()); + let uniqPackageNames = [...new Set(packageNames)]; + + + + searchFilesInfoDiv.append('h3').text("Associated Packages:").style({'padding-left': 0, 'text-decoration': 'none' ,'color':'white' , 'font-size': '20px' }); + searchFilesInfoDiv.append('h6').text(uniqPackageNames.length + " packages").style({'padding-left': 0, 'text-decoration': 'none', 'font-size': '15px' }); + + createPackageTooTip(searchFilesInfoDiv,d); + + + + // With the content in place, transition + // the opacity to make it visible. + + processDetails.transition().style({'opacity': 1}); + + + // 'use strict'; + + + // search & highlight + ;( function( $, window, document, undefined ) + { + let $container = $( '.fileSearch' ); + let $searchFilesListContainer = $container.find( '.searchFilesList' ); + + if( !$container.length ) return true; + + + let $input = $container.find( '.fileSearch_input' ), + $notfound = $searchFilesListContainer.find( '.searchFilesList__notfound' ), + $items = $searchFilesListContainer.find( '> ul > li' ), + $item = $(), + itemsIndexed = []; + + console.log("searchFilesListContainer:", $searchFilesListContainer); + + + $items.each( function() + { + itemsIndexed.push( $( this ).text().replace( /\s{2,}/g, ' ' ).toLowerCase() ); + }); + + $input.on( 'keyup', function( e ) + { + console.log('keyup : '); + + $(".searchFilesInfoDiv").hide(); + $(".searchFilesList").show(); + + + if( e.keyCode === 13 ) // enter + { + + $input.trigger( 'blur' ); + return true; + } + + $items.each( function() + { + $item = $( this ); + $item.html( $item.html().replace( /([^<]+)<\/span>/gi, '$1' ) ); + }); + + let searchVal = $.trim( $input.val() ).toLowerCase(); + if( searchVal.length ) + { + for( let i in itemsIndexed ) + { + $item = $items.eq( i ); + if( itemsIndexed[ i ].indexOf( searchVal ) != -1 ) + $item.removeClass( 'is-hidden' ).html( $item.html().replace( new RegExp( searchVal+'(?!([^<]+)?>)', 'gi' ), '$&' ) ); + else + $item.addClass( 'is-hidden' ); + } + } + else { + $items.removeClass('is-hidden'); + + $(".searchFilesInfoDiv").show(); + $(".searchFilesList").hide(); + + } + + $notfound.toggleClass( 'is-visible', $items.not( '.is-hidden' ).length === 0 ); + }); + })( jQuery, window, document ); + + + // toggling items on title press + + ;( function( $, window, document, undefined ) + { + $( document ).on( 'click', '.searchFilesList h4 a', function( e ) + { + e.preventDefault(); + $( this ).parents( 'li' ).toggleClass( 'is-active' ); + }); + })( jQuery, window, document ); + + + // auto-show item content when show results reduces to single + + ;( function( $, window, document, undefined ) + { + let $container = $( '.fileSearch' ); + let $searchFilesListContainer = $container.find( '.searchFilesList' ); + + if( !$container.length ) return true; + + let $input = $container.find( '.fileSearch_input' ), + $items = $searchFilesListContainer.find( '> ul > li' ), + $item = $(); + + $input.on( 'keyup', function() + { + $item = $items.not( '.is-hidden' ); + if( $item.length === 1 ) + $item.addClass( 'js--autoshown is-active' ); + else + $items.filter( '.js--autoshown' ).removeClass( 'js--autoshown is-active' ); + }); + })( jQuery, window, document ); + +}; + + +function createFileTooTip(notesDiv,source, associationString){ + + + let readsList; + let idString; + let idString_href; + let text_String ; + + if(associationString === 'reads'){ + + idString = "readsToDiv"; + idString_href = "#readsToDiv"; + text_String = "Reads from:"; + readsList = source.reads.sort(); + } + else if (associationString === 'writes'){ + + idString = "writesToDiv"; + idString_href = "#writesToDiv"; + text_String = "Writes to:"; + readsList = source.writes.sort(); + + } + + + + notesDiv.append('h5').attr("class", "panel-title").append('a').attr("data-toggle", "collapse").attr("href", idString_href).text(text_String).style({'padding-left': 0, 'text-decoration': 'none', 'font': '8 px sans-serif' }); + + let readsFromDiv = notesDiv.append('div').attr("id", idString ).attr("class", "panel-collapse "); + + // let readsList = source.writes.sort(); + let packagePath = ''; + let newDetails ; + let currentUL ; + + + if(readsList.length !=0){ + + for (let i = 0; i < readsList.length; i++ ){ + + packagePath = setPackagePath(readsList, i , i + 1).replace('/',''); + newDetails = readsFromDiv.append('details'); + + newDetails.append('summary').text(packagePath); + + currentUL = newDetails.append('ul'); + + while(readsList[i].includes(packagePath) ){ + + + let thisReadArray = ["\"" + readsList[i] + "\""]; + + let fileName = readsList[i].replace(packagePath,""); + + currentUL.append('li') + .data(thisReadArray) + .attr("class", 'noBeforeContent') + .on("mouseover", function(d) { + + + let thisFile = fileDict[d]; + + let proccess_Read = ""; + let proccess_Write = ""; + + + if(thisFile.reads.length != 0){ + thisFile.reads.forEach(function(process){ + proccess_Read += process + "
" + + }); + } + else { + + proccess_Read = "Not read by any process." + } + + if(thisFile.writes.length != 0){ + thisFile.writes.forEach(function(process){ + proccess_Write += process + "
" + + }); + } + else { + + proccess_Write = "Not written by any process." + } + + tooltip.transition() + .duration(200) + .style("opacity", .8); + tooltip.html( + "
" + thisFile.name + "
" + + "
From Package: " + thisFile.package+ "
" + + + "
Read By:
" + + proccess_Read + + + "
" + + + "
Written By:
" + + proccess_Write + + ) + .style("left", (d3.event.pageX) + "px") + .style("top", (d3.event.pageY - 28) + "px"); + + }) + .on("mouseout", function(d) { + tooltip.transition() + .duration(500) + .style("opacity", 0); + }) + .text(fileName.replace('//','')); + + if(readsList[i+1] == null){ + + break; + } + + if(readsList[i+1].includes(packagePath) == false ){ + + + break; + + + } + i++; + + } + + + } + + } + else { + readsFromDiv.append('details').append('summary').text("No associated file."); + + } + + +} + + + + +function createPackageTooTip(processDetails_Div,source){ + + + console.log('createPackageTooTip source', source); + + let idString = "package_Div"; + + let packageNames = source.packages.reads.sort().concat(source.packages.writes.sort()); + let packages = {}; + + + packageNames.forEach(function (thisPackage) { + + packages[thisPackage] = {["version"]:"", ["files"]:[]}; + + forceData.packages.forEach(function(forceDataPackage){ + + if(forceDataPackage.name === thisPackage && forceDataPackage.name != "other_files" ){ + + packages[thisPackage].version = "Version: " + forceDataPackage.version; + } + }) + + + }); + + + + let fileList = source.reads.sort().concat(source.writes.sort()); + + fileList.forEach(function(file){ + + + let keyName = "\"" + file + "\""; + + if(keyName in fileDict){ + + + let thisFile = fileDict[keyName]; + + packages[thisFile.package].files.push(thisFile); + + + } + + + }); + + + + let readsFromDiv = processDetails_Div.append('div').attr("id", idString ).attr("class", "panel-collapse "); + + + let newDetails ; + let newSummary; + let currentUL ; + let container; + + + if(Object.keys(packages).length !=0){ + + + Object.keys(packages).forEach(function(key) { + + + let summaryText = ""; + if(packages[key].files.length > 1){ + + summaryText = key + " (" + packages[key].files.length + " files)"; + } + else { + + summaryText = key + " (" + packages[key].files.length + " file)"; + } + + + container = readsFromDiv.append('div'); + + // + // let checkBox = container.append("foreignObject") + // .attr("width", 100) + // .attr("height", 100) + // .style("float", 'left') + // .style("margin-left", 30) + // .append("xhtml:body") + // .html("
") + // .on("click", function(d, i){ + // + // console.log(" theck box d:", d); + // console.log(" the source:", source); + // // console.log(svg.select("#check").node().checked); + // + // + // }); + + + newDetails = container.append('details'); + newSummary = newDetails.append('summary').text(summaryText); + + newSummary.on("mouseover", function(d) { + + + tooltip.transition() + .duration(200) + .style("opacity", .8); + tooltip.html( + "
" + packages[key].version + "
" + + ).style("left", (d3.event.pageX) + "px") + .style("top", (d3.event.pageY - 28) + "px"); + + + + }).on("mouseout", function(d) { + tooltip.transition() + .duration(500) + .style("opacity", 0); + }); + + + currentUL = newDetails.append('ul'); + + packages[key].files.forEach(function (file) { + + currentUL.append('li') + .attr("class", 'noBeforeContent') + .text(file.name); + + }) + + }); + + + } + else { + readsFromDiv.append('details').append('summary').text("No associated package."); + + } + + +}; + +function createAllPackageList(packages){ + + // let packages = {}; + + + let allPackageListDiv = d3.selectAll(".All_Packages"); + let mainContainer; + + + allPackageListDiv.append('h3').text("All Packages:").attr("id", "AllPackagesDiv" ).attr("href", "#AllPackages").attr("data-toggle", "collapse").style({'padding-left': 0, 'text-decoration': 'none' ,'color':'white' , 'font-size': '20px' }); + // let readsFromDiv = processDetails.append('div').attr("id", idString ).attr("class", "panel-collapse "); + mainContainer = allPackageListDiv.append('div').attr("id", "AllPackages" ).attr("class", "panel-collapse "); + + mainContainer.append('h6').text(packages.length + " packages").style({'padding-left': 0, 'text-decoration': 'none' ,'color':'#778899' , 'font-size': '15px' }); + + let newDetails ; + let newSummary; + let currentUL ; + let subContainer; + + + + packages.forEach(function(thisPackage){ + + // packages[thisPackage.name] = {["version"]: thisPackage.version, ["files"]:thisPackage.files}; + + let summaryText = ""; + + if(thisPackage.files.length > 1){ + + summaryText = thisPackage.name + " (" + thisPackage.files.length + " files)"; + } + else { + + summaryText = thisPackage.name + " (" + thisPackage.files.length + " file)"; + } + + subContainer = mainContainer.append('div'); + + subContainer.append("input") + .attr("type", "checkbox") + .attr("width", 100) + .attr("height", 100) + .attr("checked", true) + .style("float", 'left') + .style("padding-left", 50) + .style("margin", '1px 10px 1px 1px') + .on("click", function(d, i){ + + + let selectedPackage = d3.select(".package_" + thisPackage.name.replace(/[.,\/#!$%\^&\*;:+{}=\-_`~()]/g,"")); + let thisEdge = d3.select("#edge_" +thisPackage.name.replace(/[.,\/#!$%\^&\*;:+{}=\-_`~()]/g,"")); + let thisPackageLabel = d3.select("#packageLabel_" +thisPackage.name.replace(/[.,\/#!$%\^&\*;:+{}=\-_`~()]/g,"")); + + + + if(!d3.select(this).node().checked){ + + + selectedPackage.style({ + "opacity": 0 + + }); + + thisPackageLabel.style({ + "opacity": 0 + + }); + + thisEdge.style({ + "opacity": 0 + + }); + + + + } + else{ + + selectedPackage.style({ + "opacity": 1 + + }); + + thisPackageLabel.style({ + "opacity": 1 + + }); + + thisEdge.style({ + "opacity": 1 + + }); + + + } + + + + }); + + + newDetails = subContainer.append('details'); + newSummary = newDetails.append('summary').text(summaryText); + + newSummary.on("mouseover", function(d) { + + tooltip.transition() + .duration(200) + .style("opacity", .8); + tooltip.html( + "
" + "Version: " + thisPackage.version + "
" + + ).style("left", (d3.event.pageX) + "px") + .style("top", (d3.event.pageY - 28) + "px"); + + + }).on("mouseout", function(d) { + tooltip.transition() + .duration(500) + .style("opacity", 0); + }); + + + currentUL = newDetails.append('ul'); + + thisPackage.files.forEach(function (file) { + + currentUL.append('li') + .attr("class", 'noBeforeContent') + .text(file.name); + + }) + + + }) + + + + +}; + + +function treeDraw(currentJson){ + + + + + // d3.json block + d3.json(currentJson, function(error, data){ + + + if (error) throw error; + + let tempMaxRunTime = 0; + + + + data.packages.forEach(function (thisPackage) { + + thisPackage.files.forEach(function (file) { + + let keyName = "\"" + file + "\""; + + let fileInfo = []; + fileInfo["reads"] =[]; + fileInfo["writes"] =[]; + fileInfo["package"] = thisPackage.name; + fileInfo["name"] = file; + + fileDict[keyName] = fileInfo; + + + + }) + }); + + + data.other_files.forEach(function (file) { + + + let keyName = "\"" + file + "\""; + + let fileInfo = []; + fileInfo["reads"] =[]; + fileInfo["writes"] =[]; + fileInfo["package"] ='other_files'; + fileInfo["name"] = file; + + fileDict[keyName] = fileInfo; + + + }); + + + + data.runs.forEach(function (run) { + + run.processes.forEach(function(_process) { + + //preparing data for timeline + taskNames.push(_process.long_name); + + generateProcessesForTimeLine(_process); + + + + + if(_process.reads != null){ + + _process.reads.forEach(function(file){ + + let keyName = "\"" + file + "\""; + + + + if( keyName in fileDict){ + + //console.log('filesDict[file]:', filesDict[keyName]); + + fileDict[keyName].reads.push(_process.long_name); + + } + + }); + + }; + + + if (_process.writes != null){ + _process.writes.forEach(function(file){ + + + + let keyName = "\"" + file + "\""; + + if(keyName in fileDict){ + + + fileDict[keyName].writes.push(_process.long_name); + + } + + + }); + } + + + }) + + + }); + + console.log('processes: ', processes); + + + let tempPackageX = 0; + let tempPackageY = -100; + let isAlternativeOn = 0; + let sections = []; + + //Handle Packages to create force data + data.packages.forEach(function (thisPackage) { + + + let newPackage = {["name"]: thisPackage.name, ["version"]: thisPackage.version, ["section"] : thisPackage.section, ["files"] : [] , ["cx"]: 0, ["cy"]: tempPackageY , ["OGy"]: tempPackageY, ["color"]: "" , ["radius"] : maxRadius}; + + thisPackage.files.forEach(function (file) { + + + let keyName = "\"" + file + "\""; + + let thisFile = fileDict[keyName]; + newPackage.files.push(thisFile); + + // forceNodes.nodes.push(thisFile); + + }); + + + newPackage.cx = tempPackageX; + newPackage.OGX = tempPackageX; + + //Dynamically set the distances between nodes by number of packages + if(data.packages.length > 15 && data.packages.length < 30 ){ + + tempPackageX = tempPackageX + ((width /3) / data.packages.length); // 200; + } + else if(data.packages.length > 30){ + + tempPackageX = tempPackageX + ((width /1.8) / data.packages.length); // 200; + } + else { + + tempPackageX = tempPackageX + (width / 4 / data.packages.length); // 200; + } + + + //push this package's section to local sections + sections.push(newPackage.section); + + //push this package to the forceData + forceData.packages.push(newPackage); + + //increase packagesNumber to keep the over package number in record + packagesNumber++; + + // set alternative Y position for force nodes + if(isAlternativeOn === 0 && data.packages.length > 15){ + + tempPackageY = -60; + + isAlternativeOn = 1; + } + else if (isAlternativeOn === 1){ + + tempPackageY = -100; + isAlternativeOn = 0; + + } + + + + + }); + + console.log('forceData:' , forceData); + + + //Set sections colors for packages from local sections + setSectionsColors(sections); + + + + + //Create the all package list on the overview section on sidebar + createAllPackageList(forceData.packages); + + + + //Handle runs + data.runs.forEach(function(run){ + + console.log('run.name: ', run.name); + + runNames.push(run.name); + + rawData[run.name] = []; + treeData[run.name] = []; + + run.processes.forEach(function(_process){ + + let packages = {["reads"]:[], ["writes"]: []}; + let packagesName = []; + + if(_process.parent == null){ + + let node = {["name"]: _process.long_name, ["parent"]: "null", ["rule"] : "null", ["description"]: _process.description, ["reads"]: _process.reads , ["writes"]: _process.writes ,["argv"]: _process.argv , ["start_time"] : _process.start_time , ["exit_time"] : _process.exit_time}; + + + if(_process.reads != null){ + + _process.reads.forEach(function(file){ + + let keyName = "\"" + file + "\""; + + if( keyName in fileDict){ + + packages.reads.push(fileDict[keyName].package); + packagesName.push(fileDict[keyName].package); + + } + + }); + + let uniq = [...new Set(packages.reads)]; + packages.reads = uniq; + }; + + + + if (_process.writes != null){ + _process.writes.forEach(function(file){ + + + + let keyName = "\"" + file + "\""; + + if(keyName in fileDict){ + + packages.writes.push(fileDict[keyName].package); + packagesName.push(fileDict[keyName].package); + + } + + + }); + + let uniq = [...new Set(packages.writes)]; + packages.writes = uniq; + } + + node.packages = packages; + + let uniq = [...new Set(packagesName)]; + node.packageNames = uniq; + + + if(_process.exit_time > tempMaxRunTime ){ + + tempMaxRunTime = _process.exit_time; + } + + rawData[run.name].push(node); + + } + else { + + let parentProcess = run.processes[ ( _process.parent[0] ) ]; + + let node = {["name"]: _process.long_name, ["parent"]: parentProcess.long_name, ["rule"] : _process.parent[1], ["description"]: _process.description , ["reads"]: _process.reads , ["writes"]: _process.writes ,["argv"]: _process.argv , ["start_time"] : _process.start_time , ["exit_time"] : _process.exit_time}; + + + // let filesDict = {} ; + + if(_process.reads != null){ + + _process.reads.forEach(function(file){ + + let keyName = "\"" + file + "\""; + + //console.log('Inner keyName:', fileDict[keyName]); + //console.log('keyName:', keyName); + + if( keyName in fileDict){ + + // console.log('filesDict[file] package Name:', fileDict[keyName].package); + + packages.reads.push(fileDict[keyName].package); + packagesName.push(fileDict[keyName].package); + //filesDict[keyName].reads.push(_process.long_name); + + } + + }); + + let uniq = [...new Set(packages.reads)]; + packages.reads = uniq; + }; + + + + if (_process.writes != null){ + _process.writes.forEach(function(file){ + + + + let keyName = "\"" + file + "\""; + + if(keyName in fileDict){ + + packages.writes.push(fileDict[keyName].package); + packagesName.push(fileDict[keyName].package); + + } + + }); + + let uniq = [...new Set(packages.writes)]; + packages.writes = uniq; + } + + node.packages = packages; + + let uniq = [...new Set(packagesName)]; + node.packageNames = uniq; + + + if(_process.exit_time > tempMaxRunTime ){ + + tempMaxRunTime = _process.exit_time; + } + + rawData[run.name].push(node); + + + } + + + }); + + console.log('rawData:', rawData[run.name]); + + /*-- create treeData --*/ + let dataMap = rawData[run.name].reduce(function(map, node) { + map[node.name] = node; + return map; + }, {}); + + + rawData[run.name].forEach(function(node) { + // add to parent + let parent = dataMap[node.parent]; + if (parent) { + // create child array if it doesn't exist + (parent.children || (parent.children = [])) + // add node to child array + .push(node); + } else { + // parent is null or missing + treeData[run.name].push(node); + } + }); + + + console.log('treeData:', treeData[run.name]); + + + }); + + + + // function collapse(d) { + // + // if (d.children) { + // + // // Set default timeline length for root Check for the tree node size instead of double counting length + // if(!isTreeRedrawn){ + // timeLineLen_Total = timeLineLen_Total + 400;// (root.x0 / 2); + // + // } + // + // + // d._children = d.children; + // d._children.forEach(collapse); + // d.children = null; + // } + // + // + // } + + + // timeLineLen_Total = tree.size()[1]; + + + + + let runNametDiv = d3.select("#thisRunName"); + + runNametDiv.append('h3').text("Run Name:").attr("href", "#thisRunName").attr("data-toggle", "collapse").style({'padding-left': 0, 'text-decoration': 'none' ,'color':'white' , 'font-size': '20px' }); + + runNametDiv.append('h5').text(runNames[0]).attr("id", "thisRunName" ).attr("class", "panel-collapse ").style({'padding-left': 0, 'text-decoration': 'none', 'font-size': '15px' }); + + + + root = treeData[runNames[0]][0]; + root.x0 = height; // / 2; + root.y0 = 1000; + root.y = 1000; + + + console.log('height: ', height); + console.log('root.y0: ', root.y0); + + console.log('root: ', root); + + + + + //Time line code block + + // rootStartTime = root.start_time; + rootStartTime = treeData[runNames[0]][0].start_time; + + console.log('rootStartTime:', rootStartTime); + + let duration_ms = 0; + + let duration; + + let durationLabel = ''; + + duration_total_ms = 0 ; + + let durationLabel_total = 'No timeline data available for this experiment'; + + timeLineLen_Total = 0; + + + // timeLineLen = root.x0 / 2; + + + if(root.children!=null){ + + root.children.forEach(collapse); + } + + console.log('maxcCountCollapse: ', maxcCountCollapse); + + + + if (rootStartTime >= 0 && root.children!=null){ + + + duration_ms = (root.children[0].start_time - rootStartTime) / 1000000; + + duration = new moment.duration(duration_ms); + + durationLabel = "Cumulatively took " + duration.asMilliseconds().toFixed(2) + " milliseconds" + " when " + root.children[0].name + " is started."; + + duration_total_ms = (tempMaxRunTime - rootStartTime) / 1000000 ; + + durationLabel_total = getTimeLineLabel(duration_total_ms,"total"); + + timeLineLen_Total = (maxcCountCollapse + 1) * 400; + + + + } + + + + + + console.log('countCollapse: ', countCollapse); + console.log('maxcCountCollapse: ', maxcCountCollapse); + + + console.log('timeLineLen_Total: ', timeLineLen_Total); + + timeLineLen = timeLineLen_Total * (duration_ms / duration_total_ms); + + console.log('timeLineLen: ', timeLineLen); + + if(!isTreeRedrawn){ + + + totalTimeLineDraw(timeLineLen_Total , durationLabel_total); + timeLineDraw(timeLineLen , durationLabel); + + + } + else{ + + updateTimeLine(timeLineLen,durationLabel); + + } + + + update(root); + + //Call Force Draw function + forceDraw(forceData); + + // createPackageTooTip(searchFilesInfoDiv,d); + + console.log('tree.size(): ',tree.size()); + + //[1103, 6336] + + + }) + +}; + + + +//Need to fix the diplay of time + +function getTimeLineLabel(duration_ms, isTotalString){ + + let duration_total = new moment.duration(duration_ms); + + let durationLabel_total = ''; + + + + if(duration_total.asMilliseconds() < 1000){ + + durationLabel_total = duration_total.asMilliseconds().toFixed(2) + " milliseconds"; + + } + if (duration_total._data.seconds > 0){ + + durationLabel_total = duration_total._data.seconds + " seconds and " + duration_total._data.milliseconds.toFixed(2) + " milliseconds"; + + } + + if (duration_total._data.minutes > 0 ){ + + durationLabel_total = duration_total._data.minutes + " minutes and " + duration_total._data.seconds + "." + duration_total._data.milliseconds.toFixed(0) + " seconds"; + + } + if ( duration_total._data.hours > 0){ + + durationLabel_total = duration_total._data.hours + " hours and " + duration_total._data.minutes + " minutes" ; + + + } + if (duration_total._data.days > 0){ + + durationLabel_total = duration_total._data.days + " days and " + duration_total._data.hours + " hours" ; + + } + + if (isTotalString === "total"){ + + durationLabel_total = "Total " + durationLabel_total; + }else if (isTotalString === "took"){ + + durationLabel_total = "Cumulatively took " + durationLabel_total + " when " ; + } + else{ + + + } + + return durationLabel_total; + + +}; + +function timeLineDraw(length, durationLabel){ + + // Draw the timeline for currentduration + svg.append("g") + .attr("class", "timeLineGroup") + .append("line") + .attr("class", "timeLine") + .attr("x1", 0) + .attr("y1", height ) + .attr("x2", length) + .attr("y2", height ) + .attr("stroke-width", 5) + .attr("stroke", "#dbbd5a"); + + + + // Update the link text + svg.selectAll(".timeLineGroup").append("text") + .attr("y", height + 20)//magic number here + .attr("x", (length / 2) + margin.left) + .attr('text-anchor', 'middle') + .attr("class", "timeLineText")//easy to style with CSS + .text(durationLabel); + + + +}; + +function totalTimeLineDraw(length, durationLabel){ + + // Draw the timeline for total duration. + svg.append("g") + .attr("class", "TotalTimeLineGroup") + .append("line") + .attr("class", "timeLine_Total") + .attr("x1", 0) + .attr("y1", height ) + .attr("x2", length) + .attr("y2", height ) + .attr("stroke-width", 5) + .attr("stroke", "#5adbbd"); + + + + // Update the link text + svg.selectAll(".TotalTimeLineGroup").append("text") + .attr("y", height + 20)//magic number here + .attr("x", length ) + .attr('text-anchor', 'middle') + .attr("class", "totalTimeLineText")//easy to style with CSS + .text(durationLabel); + + + +}; + +function removeSvg(){ + + console.log('svg: ', svg); + + svg.remove(); +}; + + + +function renderGanttChart(){ + + svg.remove(); + + // let viz = svg.selectAll(".package"); + // + // let forcePackages = svg.selectAll(".package"); + // let label = svg.selectAll(".forceLabel"); + // let edge = svg.selectAll(".edge"); + // + // + // + // let node = svg.selectAll("g.node"); + // let link = svg.selectAll("path.link"); + // let linktext = svg.selectAll("g.link"); + // let timeLineText = d3.selectAll(".timeLineText"); + // + // let timeline = svg.selectAll(".timeLine"); + // + // + // let timeLine_Total = d3.selectAll(".timeLine_Total"); + // let totalTimeLineText = d3.selectAll(".totalTimeLineText"); + // + // + // forcePackages.remove(); + // label.remove(); + // edge.remove(); + // + // node.remove(); + // link.remove(); + // linktext.remove(); + // timeLineText.remove(); + // timeline.remove(); + // timeLine_Total.remove(); + // totalTimeLineText.remove(); + // + // + // + // forceData = {"packages": []}; + // packagesNumber = 0; + // sectionsInPackages = {}; + // + // + // force.nodes = null; + // force.links = null; + + // forceNodes = force.nodes; + // forceLinks = force.links(); + + // treeDraw(currentJsonFile); + + + processes.sort(function(a, b) { + return a.endDate - b.endDate; + }); + + + var maxDate = processes[processes.length - 1].endDate; + + + + processes.sort(function(a, b) { + return a.startDate - b.startDate; + }); + + var minDate = processes[0].startDate; + + console.log( 'maxDate - minDate: ', maxDate - minDate); + + + let format = ".%Lms"; + + if(( maxDate - minDate) > 1000){ + + format = ":%Ss"; + }; + + + var gantt = d3.gantt().taskTypes(taskNames).taskStatus(taskStatus).tickFormat(format); + gantt(processes); + + +} + + + +function generateProcessesForTimeLine(_process){ + + + + + var startDate = _process.start_time/1000000; + + // console.log( '_process.start_time: ', _process.start_time / 1000000); + // + // console.log( 'startDate: ', startDate.toString("MMM dd")); + + + var endDate = _process.exit_time/1000000; + + // console.log( '_process.exit_time: ', _process.exit_time / 1000000); + // console.log( 'endDate: ', endDate); + + let timeLineProcess = {['startDate']: new Date(startDate),['endDate']: new Date(endDate), ['taskName']: _process.long_name , "status":"RUNNING" }; + + // + // //let timeLineProcess = {['startDate']: new Date(_process.start_time/1000000),['endDate']: new Date(_process.exit_time/1000000), ['taskName']: _process.long_name , "status":"RUNNING" }; + // + // console.log('timeLineProcess.endDate - timeLineProcess.endDate.startDate: ', timeLineProcess.endDate ); + + processes.push(timeLineProcess); + + + // console.log( '_process.start_time: ', _process.start_time / 1000000); + +}; + + +function restart() { + + + edge = edge.data(forceLinks); + + edge.enter().insert("line", ".package") + .attr("class", "edge") + .attr("id", function(d){ + return "edge_" + d.target.name}) + .attr("x1", function(d){ return d.source.x; + }) + .attr("y1", function(d){ return d.source.y; }) + .attr("x2", function(d){ return d.target.x; }) + .attr("y2", function(d){ return d.target.y; }); + + // + // forcePackages = forcePackages.data(forceNodes); + // forcePackages + // .attr("cx", function (d) { + // + // console.log(("d.x: " , d.x)); + // return d.x; + // }) + // .attr("cy", function (d) { + // return d.y; + // }); + + + + // label = label.data(forceNodes); + // label.attr("x", function(d){ return d.x; }) + // .attr("y", function (d) {return d.y - 30; }); + + force.start(); +}; + + +function restart2() { + + + edge = edge.data(forceLinks); + + edge.enter().insert("line", ".package") + .attr("class", "edge") + .attr("id", function(d){ + return "edge_" + d.target.name}) + .attr("x1", function(d){ return d.source.y; + }) + .attr("y1", function(d){ return d.source.x; }) + .attr("x2", function(d){ return d.target.y; }) + .attr("y2", function(d){ return d.target.x; }); + + // + // forcePackages = forcePackages.data(forceNodes); + // forcePackages + // .attr("cx", function (d) { + // + // console.log(("d.x: " , d.x)); + // return d.x; + // }) + // .attr("cy", function (d) { + // return d.y; + // }); + + + + // label = label.data(forceNodes); + // label.attr("x", function(d){ return d.x; }) + // .attr("y", function (d) {return d.y - 30; }); + + force.start(); +}; + + +// Move nodes toward cluster focus. +function gravity(alpha) { + return function (d) { + d.y += (d.cy - d.y) * alpha; + d.x += (d.cx - d.x) * alpha; + }; +}; + + +// Resolve collisions between nodes. +function collide(alpha) { + let quadtree = d3.geom.quadtree(forceNodes); + return function (d) { + let r = d.radius + maxRadius + padding, + nx1 = d.x - r, + nx2 = d.x + r, + ny1 = d.y - r, + ny2 = d.y + r; + quadtree.visit(function (quad, x1, y1, x2, y2) { + if (quad.point && (quad.point !== d)) { + let x = d.x - quad.point.x, + y = d.y - quad.point.y, + l = Math.sqrt(x * x + y * y), + r = d.radius + quad.point.radius + (d.color !== quad.point.color) * padding; + if (l < r) { + l = (l - r) / l * alpha; + d.x -= x *= l; + d.y -= y *= l; + quad.point.x += x; + quad.point.y += y; + } + } + return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1; + }); + }; + +}; + + +function tick(e) { + + edge.attr("x1", function(d){ + + //console.log("mapping link"); + return d.source.x; + }) + .attr("y1", function(d){ return d.source.y; }) + .attr("x2", function(d){ return d.target.x; }) + .attr("y2", function(d){ return d.target.y; }); + + + forcePackages + .each(gravity(0.15 * e.alpha)) + .each(collide(0.2)) + .attr("cx", function (d) { + + // console.log(("d.x: " , d.x)); + return d.x; + }) + .attr("cy", function (d) { + return d.y; + }); + + + label.attr("x", function(d){ return d.x; }) + .attr("y", function (d) {return d.y - 30; }); +}; + +function forceDraw(data) { + + + let nodes = data.packages; + + + force = d3.layout.force() + .nodes(nodes) + .size([ width, height]) + .linkDistance(300) + .linkStrength(0.5) + .gravity(0) + .charge(-100) + .on("tick", tick); + + + forceNodes = force.nodes(); + forceLinks = force.links(); + + console.log("forceNodes: ", forceNodes ); + + // let forceGroup = svg.append("g").attr("id", "forceGroup").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); + + + // forcePackages + forcePackages = forcePackages + .data(forceNodes) + .enter().append("circle") + .attr("class", 'package') + .attr("class", function(d){ + return "package package_"+ d.name.replace(/[.,\/#!$%\^&\*;:+{}=\-_`~()]/g,""); + + }) + .attr("id", function(d){ + return "package" // return "package_"+ d.name.replace(/[.,\/#!$%\^&\*;:+{}=\-_`~()]/g,""); + + }) + .attr("r", function (d) { + return d.radius; + }) + .style("fill",function(d) { + + + if(d.section === sectionsInPackages[d.section].name){ + + return sectionsInPackages[d.section].color; + } + + return "#4c366d" ; // reutn default ReproZip Color + }) + .on("click", function(d) { + + + + + let links = force.links(); + + links = []; + + + edge = svg.selectAll(".edge").data(links); + + + let edgeExit = edge.exit().remove(); + + + if(forceNodes.length > packagesNumber){ + + forceNodes.pop(); + + + } + + + let associatedProcesses = []; + // + // if (d.name != "other_files"){ + // + // + // + // + // } + + // + d.files.forEach(function(file){ + + + file.reads.forEach(function(process){ + + associatedProcesses.push(process); + + }) + + }); + + + console.log( "Before " + d.name + " associatedProcesses", associatedProcesses); + + + + let uniq = [...new Set(associatedProcesses)]; + associatedProcesses = uniq; + + + console.log( d.name + " associatedProcesses", associatedProcesses); + + + // let currentDisplayingNodes = tree.nodes(root).reverse(); + + + console.log("currentDisplayingNodes", currentDisplayingNodes); + + currentDisplayingNodes.forEach(function(process){ + + associatedProcesses.forEach(function(processName){ + + if(process.name === processName){ + + console.log("Same process: ", processName); + + console.log("The process: ", process); + + console.log("The d: ", d); + + process.fixed = true; + + + let node = {}; + node.x = process.y; + node.y = process.x; + node.px = process.y; + node.py = process.x; + node.weight = 10; + node.fixed = true; + + let thisNode = forceNodes.push(node); + + + links.push({source: d , target: node}); + + } + + }) + + }); + + + forceLinks = links; + + let label = svg.selectAll(".forceLabel") + .data(force.nodes()); + + label.attr("x", function(d){ return d.x; }) + .attr("y", function (d) {return d.y - 30; }); + + force.links(links); + + + restart2(); + + }) + .on("mouseover", function(d) { + + tooltip.transition() + .duration(200) + .style("opacity", .8); + tooltip .html( + d.name + "
" + "section: "+ d.section + "
" + "version: " + d.version + ) + .style("left", (d3.event.pageX) + "px") + .style("top", (d3.event.pageY - 38) + "px"); + }) + .on("mouseout", function(d) { + tooltip.transition() + .duration(500) + .style("opacity", 0); + }) + .call(force.drag); + + + //forceGroup.append(forcePackages); + + + + label = label + .data(forceNodes) + .enter() + .append("text") + .text(function (d) { return d.name; }) + .attr("class", "packageLabel") + .attr("id", function (d) { return "packageLabel_" + d.name.replace(/[.,\/#!$%\^&\*;:+{}=\-_`~()]/g,""); }) + .style("text-anchor", "middle") + .style("fill", "#555") + .style("font-family", "Arial") + .style("font-size", 15); + + + restart(); + +}; + + + + +function updateTimeLine(length, durationLabel){ + + let timeline = svg.selectAll(".timeLine"); + + timeline.transition() + .attr("x2", length); + + + let timeLineText = d3.selectAll(".timeLineText") + .transition() + .attr("x", (timeLineLen / 2) + 50) + .attr('text-anchor', 'middle') + .attr("class", "timeLineText")//easy to style with CSS + + .text(durationLabel); + +}; + + +function decreaseTimeLineLen(length){ + + if((timeLineLen - ( length) >= 0)) { + + timeLineLen = length //timeLineLen - ( length); + } + +}; + +function setPackagePath (fileList, index, nextIndex){ + + // console.log('nextIndex: ', nextIndex); + + let TestingPackagePath = ''; + + if(fileList[nextIndex] != null){ + + + a1_Len = fileList[index].length; + let i = 0; + + while(i < a1_Len && fileList[index].charAt(i)===fileList[nextIndex].charAt(i)){ + + i++ + } + + if (fileList[index].substring(0,i) === '/'){ + + + // console.log('different character: ',fileList[index].substring(0,i)); + + TestingPackagePath = fileList[index].substring(0, fileList[index].lastIndexOf('/')); + // console.log('TestingPackagePath: ',TestingPackagePath); + + } + else { + + + TestingPackagePath = fileList[index].substring(0,i); + TestingPackagePath = TestingPackagePath.substring(0, TestingPackagePath.lastIndexOf('/')); + // console.log('TestingPackagePath: ',TestingPackagePath); + + } + + + } + else { + + TestingPackagePath = fileList[index].substring(0, fileList[index].lastIndexOf('/')); + + } + + return TestingPackagePath; + +}; + + +function resetPackagesPosition(){ + + + if (thisNodeCircle != null && thisNodeCircleLabel != null){ + + + thisNodeCircle.transition().attr("r", 8); + thisNodeCircleLabel.transition().style("font", "15px sans-serif").attr("x", function(d) { return d.children || d._children ? -10 : 10; }); + + + } + + links = []; + + edge = svg.selectAll(".edge").data(links); + + let edgeExit = edge.exit().remove(); + let circles = svg.selectAll("circle"); + + forceLinks = links; + + force.links(links); + + restart(); +}; + +function setSectionsColors(sections){ + + //make the sections as unique set + let uniq = [...new Set(sections)]; + sections = uniq; + + let linearScale = d3.scale.linear().domain([0, sections.length]).range([0,400]); + + let i = 0; + + sections.forEach(function(section){ + + + let thisSection = []; + thisSection["name"] = section; + thisSection["color"] = "hsl(" + linearScale(i) + ",60%,80%)"; + + sectionsInPackages[section] = thisSection; + + i++; + + }); +}; + + + +let countCollapse = 0; +let maxcCountCollapse = 0; + + +function collapse(d) { + + if (d.children) { + + // Set default timeline length for root + // if(!isTreeRedrawn){ + // timeLineLen_Total = timeLineLen_Total + 400;// (root.x0 / 2); //timeLineLen_Total + (root.x0 / 2); + // + // } + + countCollapse++; + + d._children = d.children; + d._children.forEach(collapse); + d.children = null; + } + + + if (countCollapse > maxcCountCollapse){ + + maxcCountCollapse = countCollapse; + + countCollapse = 0; + } + + +}; + + +function expand(d){ + let children = (d.children)?d.children:d._children; + if (d._children) { + d.children = d._children; + d._children = null; + } + if(children) + children.forEach(expand); +}; + +function expandAll(){ + + resetPackagesPosition(); + + expand(root); + update(root); +} + +function collapseAll(){ + + + resetPackagesPosition(); + + root.children.forEach(collapse); + collapse(root); + update(root); +}; + + + diff --git a/reprounzip-vis/reprounzip_vis/static/js/gantt-chart-d3.js b/reprounzip-vis/reprounzip_vis/static/js/gantt-chart-d3.js new file mode 100644 index 000000000..f60133663 --- /dev/null +++ b/reprounzip-vis/reprounzip_vis/static/js/gantt-chart-d3.js @@ -0,0 +1,226 @@ +/** + * @author Dimitry Kudrayvtsev + * @version 2.1 + */ + +d3.gantt = function() { + var FIT_TIME_DOMAIN_MODE = "fit"; + var FIXED_TIME_DOMAIN_MODE = "fixed"; + + var margin = { + top : 20, + right : 40, + bottom : 20, + left : 150 + }; + var selector = '.chart'; + var timeDomainStart = d3.time.day.offset(new Date(),-3); + var timeDomainEnd = d3.time.hour.offset(new Date(),+3); + var timeDomainMode = FIT_TIME_DOMAIN_MODE;// fixed or fit + var taskTypes = []; + var taskStatus = []; + var height = document.body.clientHeight + document.body.clientHeight * 0.2 ;// - margin.top; //- margin.bottom-5;// ((document.body.clientHeight) * .025 * processes.length) - margin.top - margin.bottom-5; + var width = document.body.clientWidth + document.body.clientWidth * 0.1; + + // var height = $(window).resize().outerHeight()* 0.03 * packagesNumber; // $(window).resize().outerHeight(); //document.body.clientHeight - margin.top - margin.bottom-5; + // var width = ($(window).resize().outerWidth() * 3.5 - margin.right - margin.left) * 0.3;//document.body.clientWidth - margin.right - margin.left-5; + + var tickFormat = "%H:%M"; + + var keyFunction = function(d) { + return d.startDate + d.taskName + d.endDate; + }; + + var rectTransform = function(d) { + return "translate(" + x(d.startDate) + "," + y(d.taskName) + ")"; + }; + + var x = d3.time.scale().domain([ timeDomainStart, timeDomainEnd ]).range([ 0, width ]).clamp(true); + + var y = d3.scale.ordinal().domain(taskTypes).rangeRoundBands([ 0, height - margin.top - margin.bottom ], .1); + + var xAxis = d3.svg.axis().scale(x).orient("bottom").tickFormat(d3.time.format(tickFormat)).tickSubdivide(true) + .tickSize(8).tickPadding(8); + + var yAxis = d3.svg.axis().scale(y).orient("left").tickSize(0); + + var initTimeDomain = function(tasks) { + if (timeDomainMode === FIT_TIME_DOMAIN_MODE) { + if (tasks === undefined || tasks.length < 1) { + timeDomainStart = d3.time.day.offset(new Date(), -3); + timeDomainEnd = d3.time.hour.offset(new Date(), +3); + return; + } + tasks.sort(function(a, b) { + return a.endDate - b.endDate; + }); + timeDomainEnd = tasks[tasks.length - 1].endDate; + tasks.sort(function(a, b) { + return a.startDate - b.startDate; + }); + timeDomainStart = tasks[0].startDate; + } + }; + + var initAxis = function() { + x = d3.time.scale().domain([ timeDomainStart, timeDomainEnd ]).range([ 0, width ]).clamp(true); + y = d3.scale.ordinal().domain(taskTypes).rangeRoundBands([ 0, height - margin.top - margin.bottom ], .1); + xAxis = d3.svg.axis().scale(x).orient("bottom").tickFormat(d3.time.format(tickFormat)).tickSubdivide(true) + .tickSize(8).tickPadding(8); + + yAxis = d3.svg.axis().scale(y).orient("left").tickSize(0); + }; + + function gantt(tasks) { + + initTimeDomain(tasks); + initAxis(); + + var ganttViz = d3.select(selector) + .append("g") + .attr("class", "gantt-chart") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .attr("transform", "translate(" + margin.left + ", " + margin.top + ")"); + + ganttViz.selectAll(".chart") + .data(tasks, keyFunction).enter() + .append("rect") + .attr("rx", 5) + .attr("ry", 5) + .attr("class", function(d){ + if(taskStatus[d.status] == null){ return "bar";} + return taskStatus[d.status]; + }) + .attr("y", 0) + .attr("transform", rectTransform) + .attr("height", function(d) { return y.rangeBand(); }) + .attr("width", function(d) { + return Math.max(1,(x(d.endDate) - x(d.startDate))); + }); + + + ganttViz.append("g") + .attr("class", "x axis") + .attr("transform", "translate(0, " + (height - margin.top - margin.bottom) + ")") + .transition() + .call(xAxis); + + ganttViz.append("g").attr("class", "y axis").transition().call(yAxis); + + return gantt; + + }; + + gantt.redraw = function(tasks) { + + initTimeDomain(tasks); + initAxis(); + + var ganttViz = d3.select(".chart"); + + var ganttChartGroup = ganttViz.select(".gantt-chart"); + var rect = ganttChartGroup.selectAll("rect").data(tasks, keyFunction); + + rect.enter() + .insert("rect",":first-child") + .attr("rx", 5) + .attr("ry", 5) + .attr("class", function(d){ + if(taskStatus[d.status] == null){ return "bar";} + return taskStatus[d.status]; + }) + .transition() + .attr("y", 0) + .attr("transform", rectTransform) + .attr("height", function(d) { return y.rangeBand(); }) + .attr("width", function(d) { + return Math.max(1,(x(d.endDate) - x(d.startDate))); + }); + + rect.transition() + .attr("transform", rectTransform) + .attr("height", function(d) { return y.rangeBand(); }) + .attr("width", function(d) { + return Math.max(1,(x(d.endDate) - x(d.startDate))); + }); + + rect.exit().remove(); + + ganttViz.select(".x").transition().call(xAxis); + ganttViz.select(".y").transition().call(yAxis); + + return gantt; + }; + + gantt.margin = function(value) { + if (!arguments.length) + return margin; + margin = value; + return gantt; + }; + + gantt.timeDomain = function(value) { + if (!arguments.length) + return [ timeDomainStart, timeDomainEnd ]; + timeDomainStart = +value[0], timeDomainEnd = +value[1]; + return gantt; + }; + + /** + * @param {string} + * vale The value can be "fit" - the domain fits the data or + * "fixed" - fixed domain. + */ + gantt.timeDomainMode = function(value) { + if (!arguments.length) + return timeDomainMode; + timeDomainMode = value; + return gantt; + + }; + + gantt.taskTypes = function(value) { + if (!arguments.length) + return taskTypes; + taskTypes = value; + return gantt; + }; + + gantt.taskStatus = function(value) { + if (!arguments.length) + return taskStatus; + taskStatus = value; + return gantt; + }; + + gantt.width = function(value) { + if (!arguments.length) + return width; + width = +value; + return gantt; + }; + + gantt.height = function(value) { + if (!arguments.length) + return height; + height = +value; + return gantt; + }; + + gantt.tickFormat = function(value) { + if (!arguments.length) + return tickFormat; + tickFormat = value; + return gantt; + }; + + gantt.selector = function(value) { + if (!arguments.length) + return selector; + selector = value; + return gantt; + }; + + return gantt; +}; diff --git a/reprounzip-vis/reprounzip_vis/static/js/index.js b/reprounzip-vis/reprounzip_vis/static/js/index.js new file mode 100644 index 000000000..4abd22601 --- /dev/null +++ b/reprounzip-vis/reprounzip_vis/static/js/index.js @@ -0,0 +1,28 @@ +$(document).ready(function () { + let trigger = $('.hamburger'), + overlay = $('.overlay'), + isClosed = false; + + trigger.click(function () { + hamburger_cross(); + }); + + function hamburger_cross() { + + if (isClosed === true) { + overlay.hide(); + trigger.removeClass('is-open'); + trigger.addClass('is-closed'); + isClosed = false; + } else { + overlay.show(); + trigger.removeClass('is-closed'); + trigger.addClass('is-open'); + isClosed = true; + } + } + + $('[data-toggle="offcanvas"]').click(function () { + $('#wrapper').toggleClass('toggled'); + }); +}); \ No newline at end of file diff --git a/reprounzip-vis/reprounzip_vis/static/js/sideBar.js b/reprounzip-vis/reprounzip_vis/static/js/sideBar.js new file mode 100644 index 000000000..0615afc9b --- /dev/null +++ b/reprounzip-vis/reprounzip_vis/static/js/sideBar.js @@ -0,0 +1,225 @@ + +/*-- GLobal sidebar variables --*/ + +let searchFilesInfoDiv; +let searchFilesList; + +// SideBar Process Details - Select the container for the processDetails and set the dimensions. +const processDetails = d3.select('#processDetails') + .style({ + 'width': 620-width + 'px', + 'height': height + 'px', + 'margin-top' : 0 + 'px' + }); + + + + + + + +/*-- Bootstrap buttons events handler in Sidebar "Overview" section --*/ + +$(function() { + + /*-- Handel toggle button for focusing selected process and associated packages --*/ + $('#toggle-inFocus').change(function() { + + inFocus = $(this).prop('checked'); + + if(!inFocus){ + let otherSVG = d3.selectAll(".process, .processLabel, .package, .edge, .packageLabel, .link"); + + otherSVG.transition().style("opacity", 1); + + } + else{ + let otherSVG = d3.selectAll(".process, .processLabel, .package, .edge, .packageLabel, .link"); + + otherSVG.transition().style("opacity", 0.3); + + thisNodeCircle.transition().attr("r", 20).style("opacity", 1); + thisNodeCircleLabel + .transition() + .style("font", "20px sans-serif") + .style("opacity", 1) + .attr("x", function(d) { return d.children || d._children ? -30 : 30; }); + + + forceNodes.forEach(function(target) { + + currentSelectedNode.packages.reads.forEach(function (readFile) { + + { + if(target.name === readFile) + console.log("d3.select:",d3.select("#package_" + readFile.replace(/[.,\/#!$%\^&\*;:+{}=\-_`~()]/g,"")).style("opacity", 1)); + + d3.select("#package_" + readFile.replace(/[.,\/#!$%\^&\*;:+{}=\-_`~()]/g,"")).style("opacity", 1); + d3.select("#packageLabel_" + readFile.replace(/[.,\/#!$%\^&\*;:+{}=\-_`~()]/g,"")).style("opacity", 1); + + + } + }) + }); + + } + }); + + + $('#packages_ConnectAll').on("click", function (e) { + + + let links = force.links(); + + links = []; + + + edge = svg.selectAll(".edge").data(links); + + + let edgeExit = edge.exit().remove(); + + + while(forceNodes.length > packagesNumber){ + + forceNodes.pop(); + + + }; + + let associatedProcesses = []; + // + // if (d.name != "other_files"){ + // + // + // + // + // } + + // + + + forceNodes.forEach(function(thisPackage){ + + associatedProcesses = []; + + thisPackage.files.forEach(function(file){ + + + file.reads.forEach(function(process){ + + associatedProcesses.push(process); + + }); + + + }); + + + + let uniq = [...new Set(associatedProcesses)]; + associatedProcesses = uniq; + + + + currentDisplayingNodes.forEach(function(process){ + + associatedProcesses.forEach(function(processName){ + + if(process.name === processName){ + + + process.fixed = true; + + + let node = {}; + node.x = process.y; + node.y = process.x; + node.px = process.y; + node.py = process.x; + node.weight = 10; + node.fixed = true; + + forceNodes.push(node); + + + links.push({source: thisPackage , target: node}); + + } + + }) + + }); + + }); + +// console.log("associatedProcesses", associatedProcesses); +// +// console.log("currentDisplayingNodes", currentDisplayingNodes); +// + + + forceLinks = links; + + let label = svg.selectAll(".forceLabel") + .data(force.nodes()); + + label.attr("x", function(d){ return d.x; }) + .attr("y", function (d) {return d.y - 30; }); + + force.links(links); + + + restart2(); + + + + + }); + + + + + + + + /*-- Handel buttons for collapsing or expanding all nodes for the network tree --*/ + $('#tree_CloseAll').on("click", function (e) { + + collapseAll(); + + }); + + $('#tree_ExpandAll').on("click", function (e) { + + expandAll(); + + }); + + + $('#timeLineShow').on("click", function (e) { + + console.log('graphShow'); + + renderGanttChart(); + + }); + + + $('#graphShow').on("click", function (e) { + + + //removeSvg(); + location.reload(); + + // let timeline = svg.selectAll(".chart"); + // timeline.remove(); + + + + //treeDraw(currentJsonFile); + + }); + + +}); diff --git a/reprounzip-vis/reprounzip_vis/static/style.css b/reprounzip-vis/reprounzip_vis/static/style.css new file mode 100644 index 000000000..001edaf26 --- /dev/null +++ b/reprounzip-vis/reprounzip_vis/static/style.css @@ -0,0 +1,234 @@ + +body { + font-family: "Lato", sans-serif; +} + +.node { + cursor: pointer; +} + + +.searchFilesList{ + + display: none; + +} + +.searchFilesList input +{ + width: 100%; + height: 60px; + font-size: 20px; + background-color: #fff; + box-shadow: 0px 2px 4px rgba( 52, 67, 75, .2 ); + display: block; + padding: 0 20px; + margin-bottom: 40px; + + -webkit-transition: box-shadow .1s linear; + transition: box-shadow .1s linear; +} +.searchFilesList input::-webkit-input-placeholder { color: #a1bdcb !important; } +.searchFilesList input::-moz-placeholder { color: #a1bdcb !important; } +.searchFilesList input:-ms-input-placeholder { color: #a1bdcb !important; } +.searchFilesList input:focus +{ + box-shadow: 0px 4px 8px rgba( 52, 67, 75, .4 ); +} +.searchFilesList .highlight +{ + background-color: #fffd77; +} +.searchFilesList > ul +{ + margin-left: -50px; + +} +.searchFilesList > ul > li +{ + list-style: none; + margin-left: 10px; + +} +.searchFilesList > ul > li:not( :first-child ) +{ + border-top: 1px solid #dcebed; + margin-top: 20px; + padding-top: 20px; +} +.searchFilesList > ul > li.is-hidden +{ + display: none; +} +.searchFilesList > ul > li h4 +{ + font-size: 14px; + font-weight: 700; + margin-left: -30px; + +} +.searchFilesList > ul > li h4:hover, +.searchFilesList > ul > li h4:focus, +.searchFilesList > ul > li.is-active h4, +.searchFilesList > ul > li:target h4 +{ + color: #a664b7; +} +.searchFilesList > ul > li > div +{ + display: none; +} +.searchFilesList > ul > li.is-active > div, +.searchFilesList > ul > li:target > div +{ + display: block; + margin-top: 10px; +} + +.searchFilesList__notfound +{ + font-size: 20px; + font-style: italic; + display: none; +} +.searchFilesList__notfound.is-visible +{ + display: block; +} + +div.tooltip { + position: absolute; + text-align: left; + flex: auto; + + padding: 2px; + color: white; + font: 12px sans-serif; + background: black; + border: 0px; + border-radius: 4px; + pointer-events: none; +} + +.node circle { + fill: #fff; + stroke: steelblue; + stroke-width: 2.5px; + opacity: 1; +} + +.node text { + font: 15px sans-serif; + fill: #555; + opacity: 1; +} + +.link { + fill: none; + stroke: #ccc; + stroke-width: 1.5px; + opacity:1 ; + +} + +.link text { + font: 11px sans-serif; + fill: #555; + stroke-width: 0.5px; + opacity: 1; + + +} + +.is-focus { + + opacity: 1; +} + +.is-fade { + + opacity: 0.4; +} + +.timeLineText , .totalTimeLineText { + + fill: #555; + font-size: 15px; + +} + +.edge { + stroke: #999; + stroke-width: 3px; + position: relative; + z-index: 999; + +} + + +#processDetails { + float: left; + height: auto; + margin-left: 20px; + position: absolute; + display: block; + color: lightslategrey; + font: 13px sans-serif; + +} +#container, +#viz-graph { + + transition: margin-left .5s; + padding: 16px; + + +} + +#viz-graph { + + overflow: scroll; + zoom: 65% +} + + +.toggle.ios, .toggle-on.ios, .toggle-off.ios { border-radius: 20px; } +.toggle.ios .toggle-handle { border-radius: 20px; } + + + + + + + +.chart { + font-family: Arial, sans-serif; + +} + +.axis path,.axis line { + fill: none; + stroke: #000; + shape-rendering: crispEdges; +} + +.bar { + fill: #8a6cb6; +} + +.bar-failed { + fill: #CC0000; +} + +.bar-running { + fill: #8a6cb6; +} + +.bar-succeeded { + fill: #33b5e5; +} + +.bar-killed { + fill: #ffbb33; +} + From f5259d32ce979bb00219ff7cf86441f27bdb5990 Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Fri, 25 Aug 2017 16:27:42 -0400 Subject: [PATCH 3/5] Serve Heng's visualization from reprounzip --- reprounzip-vis/reprounzip_vis/__init__.py | 56 ++++++++++++++++++- .../reprounzip_vis/static/index.html | 3 +- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/reprounzip-vis/reprounzip_vis/__init__.py b/reprounzip-vis/reprounzip_vis/__init__.py index 1a3867d21..c7fcc0d49 100644 --- a/reprounzip-vis/reprounzip_vis/__init__.py +++ b/reprounzip-vis/reprounzip_vis/__init__.py @@ -1,10 +1,64 @@ import argparse +import BaseHTTPServer +import SocketServer +import mimetypes +import shutil +import webbrowser + +import pkg_resources from reprounzip.unpackers.common import COMPAT_OK +__version__ = '0.1' + + +class VisHTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): + server_version = 'ReproUnzip/' + __version__ + + def do_GET(self): + print("Serving %s" % self.path) + if self.path == '/provenance.json': + self.send_response(200) + self.send_header('Content-Type', 'application/json') + self.wfile.write(self.provenance_json) + else: + try: + f = pkg_resources.resource_stream('reprounzip_vis', + 'static/' + self.path) + except IOError: + self.send_response(404) + else: + self.send_response(200) + if self.path == '/': + ctype = 'text/html' + else: + ctype = mimetypes.guess_type(self.path)[0] + self.send_header('Content-Type', ctype) + shutil.copyfileobj(f, self.wfile) + f.close() + + def show_vis(args): - TODO + # Extract JSON from package + VisHTTPHandler.provenance_json = '{}' # TODO + + # Serve static files and JSON document to browser + port = 8003 + + httpd = SocketServer.TCPServer(('', port), VisHTTPHandler) + print("serving at port %d" % port) + + # Open web browser + webbrowser.open('http://localhost:%d/index.html' % port) + + # Serve until killed + try: + httpd.serve_forever() + except KeyboardInterrupt: + pass + finally: + httpd.server_close() def setup_vis(parser, **kwargs): diff --git a/reprounzip-vis/reprounzip_vis/static/index.html b/reprounzip-vis/reprounzip_vis/static/index.html index 328fcfe8f..7fd5fccdb 100644 --- a/reprounzip-vis/reprounzip_vis/static/index.html +++ b/reprounzip-vis/reprounzip_vis/static/index.html @@ -193,7 +193,8 @@ /*-- define the current data set for the visualization --*/ - const currentJsonFile = "bash-count.json"; + const currentJsonFile = "provenance.json"; + //const currentJsonFile = "bash-count.json"; //const currentJsonFile = "stacked-up-website.json"; //const currentJsonFile = "stacked-up-website_og.json"; //const currentJsonFile = "ache.json"; From 3a07882133515045ca8373975c9166af14e98eb9 Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Fri, 25 Aug 2017 16:37:06 -0400 Subject: [PATCH 4/5] Integrated --- reprounzip-vis/reprounzip_vis/__init__.py | 56 +++++++++++++++-------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/reprounzip-vis/reprounzip_vis/__init__.py b/reprounzip-vis/reprounzip_vis/__init__.py index c7fcc0d49..ac3f7d092 100644 --- a/reprounzip-vis/reprounzip_vis/__init__.py +++ b/reprounzip-vis/reprounzip_vis/__init__.py @@ -2,13 +2,16 @@ import BaseHTTPServer import SocketServer import mimetypes +import os +import pkg_resources +from rpaths import Path import shutil +import tempfile import webbrowser -import pkg_resources - +from reprounzip.common import RPZPack from reprounzip.unpackers.common import COMPAT_OK - +from reprounzip.unpackers.graph import generate __version__ = '0.1' @@ -21,7 +24,9 @@ def do_GET(self): if self.path == '/provenance.json': self.send_response(200) self.send_header('Content-Type', 'application/json') - self.wfile.write(self.provenance_json) + self.end_headers() + with open(self.provenance_json, 'rb') as f: + shutil.copyfileobj(f, self.wfile) else: try: f = pkg_resources.resource_stream('reprounzip_vis', @@ -35,30 +40,41 @@ def do_GET(self): else: ctype = mimetypes.guess_type(self.path)[0] self.send_header('Content-Type', ctype) + self.end_headers() shutil.copyfileobj(f, self.wfile) f.close() def show_vis(args): # Extract JSON from package - VisHTTPHandler.provenance_json = '{}' # TODO - - # Serve static files and JSON document to browser - port = 8003 - - httpd = SocketServer.TCPServer(('', port), VisHTTPHandler) - print("serving at port %d" % port) - - # Open web browser - webbrowser.open('http://localhost:%d/index.html' % port) - - # Serve until killed + fd, json_file = tempfile.mkstemp(prefix='reprounzip_vis_', suffix='.json') try: - httpd.serve_forever() - except KeyboardInterrupt: - pass + rpz_pack = RPZPack(args.pack) + with rpz_pack.with_config() as config: + with rpz_pack.with_trace() as trace: + generate(Path(json_file), config, trace, graph_format='json') + os.close(fd) + + VisHTTPHandler.provenance_json = json_file + + # Serve static files and JSON document to browser + port = 8002 + + httpd = SocketServer.TCPServer(('', port), VisHTTPHandler) + print("serving at port %d" % port) + + # Open web browser + webbrowser.open('http://localhost:%d/index.html' % port) + + # Serve until killed + try: + httpd.serve_forever() + except KeyboardInterrupt: + pass + finally: + httpd.server_close() finally: - httpd.server_close() + os.remove(json_file) def setup_vis(parser, **kwargs): From 047729c483a1f1c266c4ac3b6af5c3c2ae44c135 Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Fri, 25 Aug 2017 16:52:36 -0400 Subject: [PATCH 5/5] Add the Vis to the Qt GUI as well --- reprounzip-qt/reprounzip_qt/gui/unpack.py | 6 ++++++ reprounzip-qt/reprounzip_qt/reprounzip_interface.py | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/reprounzip-qt/reprounzip_qt/gui/unpack.py b/reprounzip-qt/reprounzip_qt/gui/unpack.py index a8b6608f1..ed3dbbf46 100644 --- a/reprounzip-qt/reprounzip_qt/gui/unpack.py +++ b/reprounzip-qt/reprounzip_qt/gui/unpack.py @@ -259,6 +259,9 @@ def __init__(self, package='', **kwargs): buttons = QtGui.QHBoxLayout() buttons.addStretch(1) + vis = QtGui.QPushButton("Show provenance") + vis.clicked.connect(self._show_vis) + buttons.addWidget(vis) self.unpack_widget = QtGui.QPushButton("Unpack experiment", enabled=False) self.unpack_widget.clicked.connect(self._unpack) @@ -318,3 +321,6 @@ def _unpack(self): options.get('root')) else: error_msg(self, "No unpacker selected", 'warning') + + def _show_vis(self): + handle_error(self, reprounzip.show_vis(self.package_widget.text())) diff --git a/reprounzip-qt/reprounzip_qt/reprounzip_interface.py b/reprounzip-qt/reprounzip_qt/reprounzip_interface.py index 6a9882d8f..6596cae67 100644 --- a/reprounzip-qt/reprounzip_qt/reprounzip_interface.py +++ b/reprounzip-qt/reprounzip_qt/reprounzip_interface.py @@ -301,6 +301,17 @@ def download(directory, name, path, unpacker=None, root=None): return code == 0 +def show_vis(package): + reprounzip = find_command('reprounzip') + if reprounzip is None: + return ("Couldn't find reprounzip command -- is reprounzip installed?", + 'critical') + + run_in_builtin_terminal([reprounzip, 'vis', package], {}, + text="Running provenance visualization") + return True + + def run_in_builtin_terminal_maybe(cmd, root, env={}, **kwargs): if root is None: code = run_in_builtin_terminal(cmd, env, **kwargs)