`_.
+
+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..ac3f7d092
--- /dev/null
+++ b/reprounzip-vis/reprounzip_vis/__init__.py
@@ -0,0 +1,88 @@
+import argparse
+import BaseHTTPServer
+import SocketServer
+import mimetypes
+import os
+import pkg_resources
+from rpaths import Path
+import shutil
+import tempfile
+import webbrowser
+
+from reprounzip.common import RPZPack
+from reprounzip.unpackers.common import COMPAT_OK
+from reprounzip.unpackers.graph import generate
+
+__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.end_headers()
+ with open(self.provenance_json, 'rb') as f:
+ shutil.copyfileobj(f, self.wfile)
+ 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)
+ self.end_headers()
+ shutil.copyfileobj(f, self.wfile)
+ f.close()
+
+
+def show_vis(args):
+ # Extract JSON from package
+ fd, json_file = tempfile.mkstemp(prefix='reprounzip_vis_', suffix='.json')
+ try:
+ 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:
+ os.remove(json_file)
+
+
+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/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..7fd5fccdb
--- /dev/null
+++ b/reprounzip-vis/reprounzip_vis/static/index.html
@@ -0,0 +1,302 @@
+
+
+
+
+ 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;
+}
+
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'])