<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="chrome=1" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <title>talk slides</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <!-- General and theme style sheets --> <link rel="stylesheet" href="http://cdn.jsdelivr.net/reveal.js/3.0.0/css/reveal.css"> <link rel="stylesheet" href="http://cdn.jsdelivr.net/reveal.js/3.0.0/css/theme/simple.css" id="theme"> <!-- If the query includes 'print-pdf', include the PDF print sheet --> <script> if( window.location.search.match( /print-pdf/gi ) ) { var link = document.createElement( 'link' ); link.rel = 'stylesheet'; link.type = 'text/css'; link.href = 'http://cdn.jsdelivr.net/reveal.js/3.0.0/css/print/pdf.css'; document.getElementsByTagName( 'head' )[0].appendChild( link ); } </script> <!--[if lt IE 9]> <script src="http://cdn.jsdelivr.net/reveal.js/3.0.0/lib/js/html5shiv.js"></script> <![endif]--> <!-- Loading the mathjax macro --> <!-- Load mathjax --> <script src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script> <!-- MathJax configuration --> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [ ['$','$'], ["\\(","\\)"] ], displayMath: [ ['$$','$$'], ["\\[","\\]"] ], processEscapes: true, processEnvironments: true }, // Center justify equations in code and markdown cells. Elsewhere // we use CSS to left justify single line equations in code cells. displayAlign: 'center', "HTML-CSS": { styles: {'.MathJax_Display': {"margin": 0}}, linebreaks: { automatic: true } } }); </script> <!-- End of mathjax configuration --> <!-- Get Font-awesome from cdn --> <link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.css"> <style type="text/css"> /*! * * Twitter Bootstrap * */ /*! * Bootstrap v3.3.6 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ html { font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } audio, canvas, progress, video { display: inline-block; vertical-align: baseline; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } a { background-color: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { font-size: 2em; margin: 0.67em 0; } mark { background: #ff0; color: #000; } small { font-size: 80%; } sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { box-sizing: content-box; height: 0; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { color: inherit; font: inherit; margin: 0; } button { overflow: visible; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } button[disabled], html input[disabled] { cursor: default; } button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } input { line-height: normal; } input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-appearance: textfield; box-sizing: content-box; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } legend { border: 0; padding: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-collapse: collapse; border-spacing: 0; } td, th { padding: 0; } /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { *, *:before, *:after { background: transparent !important; color: #000 !important; box-shadow: none !important; text-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="#"]:after, a[href^="javascript:"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .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 th, .table-bordered td { border: 1px solid #ddd !important; } } @font-face { font-family: 'Glyphicons Halflings'; src: url('../components/bootstrap/fonts/glyphicons-halflings-regular.eot'); src: url('../components/bootstrap/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../components/bootstrap/fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../components/bootstrap/fonts/glyphicons-halflings-regular.woff') format('woff'), url('../components/bootstrap/fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../components/bootstrap/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: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\002a"; } .glyphicon-plus:before { content: "\002b"; } .glyphicon-euro:before, .glyphicon-eur: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-bitcoin:before { content: "\e227"; } .glyphicon-btc:before { content: "\e227"; } .glyphicon-xbt:before { content: "\e227"; } .glyphicon-yen:before { content: "\00a5"; } .glyphicon-jpy:before { content: "\00a5"; } .glyphicon-ruble:before { content: "\20bd"; } .glyphicon-rub:before { content: "\20bd"; } .glyphicon-scale:before { content: "\e230"; } .glyphicon-ice-lolly:before { content: "\e231"; } .glyphicon-ice-lolly-tasted:before { content: "\e232"; } .glyphicon-education:before { content: "\e233"; } .glyphicon-option-horizontal:before { content: "\e234"; } .glyphicon-option-vertical:before { content: "\e235"; } .glyphicon-menu-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"; } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 10px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; line-height: 1.42857143; color: #000; background-color: #fff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #337ab7; text-decoration: none; } a:hover, a:focus { color: #23527c; text-decoration: underline; } a:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 3px; } .img-thumbnail { padding: 4px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 2px; -webkit-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; display: inline-block; max-width: 100%; height: auto; } .img-circle { border-radius: 50%; } hr { margin-top: 18px; margin-bottom: 18px; border: 0; border-top: 1px solid #eeeeee; } .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } [role="button"] { cursor: pointer; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: inherit; font-weight: 500; line-height: 1.1; color: inherit; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: normal; line-height: 1; color: #777777; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 18px; margin-bottom: 9px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 9px; margin-bottom: 9px; } 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: 33px; } h2, .h2 { font-size: 27px; } h3, .h3 { font-size: 23px; } h4, .h4 { font-size: 17px; } h5, .h5 { font-size: 13px; } h6, .h6 { font-size: 12px; } p { margin: 0 0 9px; } .lead { margin-bottom: 18px; font-size: 14px; font-weight: 300; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 19.5px; } } small, .small { font-size: 92%; } mark, .mark { background-color: #fcf8e3; padding: .2em; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-nowrap { white-space: nowrap; } .text-lowercase { text-transform: lowercase; } .text-uppercase { text-transform: uppercase; } .text-capitalize { text-transform: capitalize; } .text-muted { color: #777777; } .text-primary { color: #337ab7; } a.text-primary:hover, a.text-primary:focus { color: #286090; } .text-success { color: #3c763d; } a.text-success:hover, a.text-success:focus { color: #2b542c; } .text-info { color: #31708f; } a.text-info:hover, a.text-info:focus { color: #245269; } .text-warning { color: #8a6d3b; } a.text-warning:hover, a.text-warning:focus { color: #66512c; } .text-danger { color: #a94442; } a.text-danger:hover, a.text-danger:focus { color: #843534; } .bg-primary { color: #fff; background-color: #337ab7; } a.bg-primary:hover, a.bg-primary:focus { background-color: #286090; } .bg-success { background-color: #dff0d8; } a.bg-success:hover, a.bg-success:focus { background-color: #c1e2b3; } .bg-info { background-color: #d9edf7; } a.bg-info:hover, a.bg-info:focus { background-color: #afd9ee; } .bg-warning { background-color: #fcf8e3; } a.bg-warning:hover, a.bg-warning:focus { background-color: #f7ecb5; } .bg-danger { background-color: #f2dede; } a.bg-danger:hover, a.bg-danger:focus { background-color: #e4b9b9; } .page-header { padding-bottom: 8px; margin: 36px 0 18px; border-bottom: 1px solid #eeeeee; } ul, ol { margin-top: 0; margin-bottom: 9px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; margin-left: -5px; } .list-inline > li { display: inline-block; padding-left: 5px; padding-right: 5px; } dl { margin-top: 0; margin-bottom: 18px; } dt, dd { line-height: 1.42857143; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 541px) { .dl-horizontal dt { float: left; width: 160px; clear: left; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #777777; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 9px 18px; margin: 0 0 18px; font-size: inherit; border-left: 5px solid #eeeeee; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.42857143; color: #777777; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: '\2014 \00A0'; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #eeeeee; border-left: 0; text-align: right; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ''; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } address { margin-bottom: 18px; font-style: normal; line-height: 1.42857143; } code, kbd, pre, samp { font-family: monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 2px; } kbd { padding: 2px 4px; font-size: 90%; color: #888; background-color: transparent; border-radius: 1px; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } kbd kbd { padding: 0; font-size: 100%; font-weight: bold; box-shadow: none; } pre { display: block; padding: 8.5px; margin: 0 0 9px; font-size: 12px; line-height: 1.42857143; word-break: break-all; word-wrap: break-word; color: #333333; background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 2px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { margin-right: auto; margin-left: auto; padding-left: 0px; padding-right: 0px; } @media (min-width: 768px) { .container { width: 768px; } } @media (min-width: 992px) { .container { width: 940px; } } @media (min-width: 1200px) { .container { width: 1140px; } } .container-fluid { margin-right: auto; margin-left: auto; padding-left: 0px; padding-right: 0px; } .row { margin-left: 0px; margin-right: 0px; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-left: 0px; padding-right: 0px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: auto; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: auto; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0%; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: 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%; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: auto; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: auto; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0%; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: auto; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: auto; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0%; } } table { background-color: transparent; } caption { padding-top: 8px; padding-bottom: 8px; color: #777777; text-align: left; } th { text-align: left; } .table { width: 100%; max-width: 100%; margin-bottom: 18px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #ddd; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #ddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #ddd; } .table .table { background-color: #fff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-of-type(odd) { background-color: #f9f9f9; } .table-hover > tbody > tr:hover { background-color: #f5f5f5; } table col[class*="col-"] { position: static; float: none; display: table-column; } table td[class*="col-"], table th[class*="col-"] { position: static; float: none; display: table-cell; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { background-color: #e8e8e8; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { background-color: #d0e9c6; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #d9edf7; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { background-color: #c4e3f3; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { background-color: #faf2cc; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; } .table-responsive { overflow-x: auto; min-height: 0.01%; } @media screen and (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 13.5px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #ddd; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { padding: 0; margin: 0; border: 0; min-width: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 18px; font-size: 19.5px; line-height: inherit; color: #333333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; max-width: 100%; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; line-height: normal; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 7px; font-size: 13px; line-height: 1.42857143; color: #555555; } .form-control { display: block; width: 100%; height: 32px; padding: 6px 12px; font-size: 13px; line-height: 1.42857143; color: #555555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 2px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control::-moz-placeholder { color: #999; opacity: 1; } .form-control:-ms-input-placeholder { color: #999; } .form-control::-webkit-input-placeholder { color: #999; } .form-control::-ms-expand { border: 0; background-color: transparent; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #eeeeee; opacity: 1; } .form-control[disabled], fieldset[disabled] .form-control { cursor: not-allowed; } textarea.form-control { height: auto; } input[type="search"] { -webkit-appearance: none; } @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="date"].form-control, input[type="time"].form-control, input[type="datetime-local"].form-control, input[type="month"].form-control { line-height: 32px; } input[type="date"].input-sm, input[type="time"].input-sm, input[type="datetime-local"].input-sm, input[type="month"].input-sm, .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"] { line-height: 30px; } input[type="date"].input-lg, input[type="time"].input-lg, input[type="datetime-local"].input-lg, input[type="month"].input-lg, .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"] { line-height: 45px; } } .form-group { margin-bottom: 15px; } .radio, .checkbox { position: relative; display: block; margin-top: 10px; margin-bottom: 10px; } .radio label, .checkbox label { min-height: 18px; padding-left: 20px; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { position: absolute; margin-left: -20px; margin-top: 4px \9; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0; vertical-align: middle; font-weight: normal; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"].disabled, input[type="checkbox"].disabled, fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"] { cursor: not-allowed; } .radio-inline.disabled, .checkbox-inline.disabled, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .radio.disabled label, .checkbox.disabled label, fieldset[disabled] .radio label, fieldset[disabled] .checkbox label { cursor: not-allowed; } .form-control-static { padding-top: 7px; padding-bottom: 7px; margin-bottom: 0; min-height: 31px; } .form-control-static.input-lg, .form-control-static.input-sm { padding-left: 0; padding-right: 0; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 1px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 1px; } .form-group-sm select.form-control { height: 30px; line-height: 30px; } .form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; min-height: 30px; padding: 6px 10px; font-size: 12px; line-height: 1.5; } .input-lg { height: 45px; padding: 10px 16px; font-size: 17px; line-height: 1.3333333; border-radius: 3px; } select.input-lg { height: 45px; line-height: 45px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .form-group-lg .form-control { height: 45px; padding: 10px 16px; font-size: 17px; line-height: 1.3333333; border-radius: 3px; } .form-group-lg select.form-control { height: 45px; line-height: 45px; } .form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { height: auto; } .form-group-lg .form-control-static { height: 45px; min-height: 35px; padding: 11px 16px; font-size: 17px; line-height: 1.3333333; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 40px; } .form-control-feedback { position: absolute; top: 0; right: 0; z-index: 2; display: block; width: 32px; height: 32px; line-height: 32px; text-align: center; pointer-events: none; } .input-lg + .form-control-feedback, .input-group-lg + .form-control-feedback, .form-group-lg .form-control + .form-control-feedback { width: 45px; height: 45px; line-height: 45px; } .input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { color: #3c763d; } .has-success .form-control { border-color: #3c763d; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #2b542c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; } .has-success .input-group-addon { color: #3c763d; border-color: #3c763d; background-color: #dff0d8; } .has-success .form-control-feedback { color: #3c763d; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { color: #8a6d3b; } .has-warning .form-control { border-color: #8a6d3b; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #66512c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; } .has-warning .input-group-addon { color: #8a6d3b; border-color: #8a6d3b; background-color: #fcf8e3; } .has-warning .form-control-feedback { color: #8a6d3b; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { color: #a94442; } .has-error .form-control { border-color: #a94442; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #843534; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; } .has-error .input-group-addon { color: #a94442; border-color: #a94442; background-color: #f2dede; } .has-error .form-control-feedback { color: #a94442; } .has-feedback label ~ .form-control-feedback { top: 23px; } .has-feedback label.sr-only ~ .form-control-feedback { top: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #404040; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .form-control-static { display: inline-block; } .form-inline .input-group { display: inline-table; vertical-align: middle; } .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn, .form-inline .input-group .form-control { width: auto; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .form-inline .radio label, .form-inline .checkbox label { padding-left: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { margin-top: 0; margin-bottom: 0; padding-top: 7px; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 25px; } .form-horizontal .form-group { margin-left: 0px; margin-right: 0px; } @media (min-width: 768px) { .form-horizontal .control-label { text-align: right; margin-bottom: 0; padding-top: 7px; } } .form-horizontal .has-feedback .form-control-feedback { right: 0px; } @media (min-width: 768px) { .form-horizontal .form-group-lg .control-label { padding-top: 11px; font-size: 17px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; } } .btn { display: inline-block; margin-bottom: 0; font-weight: normal; text-align: center; vertical-align: middle; touch-action: manipulation; cursor: pointer; background-image: none; border: 1px solid transparent; white-space: nowrap; padding: 6px 12px; font-size: 13px; line-height: 1.42857143; border-radius: 2px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus, .btn.focus { color: #333; text-decoration: none; } .btn:active, .btn.active { outline: 0; background-image: none; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; } .btn-default { color: #333; background-color: #fff; border-color: #ccc; } .btn-default:focus, .btn-default.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active:hover, .btn-default.active:hover, .open > .dropdown-toggle.btn-default:hover, .btn-default:active:focus, .btn-default.active:focus, .open > .dropdown-toggle.btn-default:focus, .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus { background-color: #fff; border-color: #ccc; } .btn-default .badge { color: #fff; background-color: #333; } .btn-primary { color: #fff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { color: #fff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active:hover, .btn-primary.active:hover, .open > .dropdown-toggle.btn-primary:hover, .btn-primary:active:focus, .btn-primary.active:focus, .open > .dropdown-toggle.btn-primary:focus, .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { color: #fff; background-color: #204d74; border-color: #122b40; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus { background-color: #337ab7; border-color: #2e6da4; } .btn-primary .badge { color: #337ab7; background-color: #fff; } .btn-success { color: #fff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { color: #fff; background-color: #449d44; border-color: #255625; } .btn-success:hover { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active:hover, .btn-success.active:hover, .open > .dropdown-toggle.btn-success:hover, .btn-success:active:focus, .btn-success.active:focus, .open > .dropdown-toggle.btn-success:focus, .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { color: #fff; background-color: #398439; border-color: #255625; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus { 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; border-color: #269abc; } .btn-info:active:hover, .btn-info.active:hover, .open > .dropdown-toggle.btn-info:hover, .btn-info:active:focus, .btn-info.active:focus, .open > .dropdown-toggle.btn-info:focus, .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { color: #fff; background-color: #269abc; border-color: #1b6d85; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus { background-color: #5bc0de; border-color: #46b8da; } .btn-info .badge { color: #5bc0de; background-color: #fff; } .btn-warning { color: #fff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { color: #fff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active:hover, .btn-warning.active:hover, .open > .dropdown-toggle.btn-warning:hover, .btn-warning:active:focus, .btn-warning.active:focus, .open > .dropdown-toggle.btn-warning:focus, .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { color: #fff; background-color: #d58512; border-color: #985f0d; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus { background-color: #f0ad4e; border-color: #eea236; } .btn-warning .badge { color: #f0ad4e; background-color: #fff; } .btn-danger { color: #fff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { color: #fff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active:hover, .btn-danger.active:hover, .open > .dropdown-toggle.btn-danger:hover, .btn-danger:active:focus, .btn-danger.active:focus, .open > .dropdown-toggle.btn-danger:focus, .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { color: #fff; background-color: #ac2925; border-color: #761c19; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus { background-color: #d9534f; border-color: #d43f3a; } .btn-danger .badge { color: #d9534f; background-color: #fff; } .btn-link { color: #337ab7; font-weight: normal; 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:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #23527c; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #777777; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 10px 16px; font-size: 17px; line-height: 1.3333333; border-radius: 3px; } .btn-sm, .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 1px; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 1px; } .btn-block { display: block; width: 100%; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; -o-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition-property: height, visibility; transition-property: height, visibility; -webkit-transition-duration: 0.35s; transition-duration: 0.35s; -webkit-transition-timing-function: ease; transition-timing-function: ease; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px dashed; border-top: 4px solid \9; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropup, .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; list-style: none; font-size: 13px; text-align: left; background-color: #fff; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 2px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); background-clip: padding-box; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 8px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.42857143; color: #333333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { text-decoration: none; color: #262626; background-color: #f5f5f5; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #fff; text-decoration: none; outline: 0; background-color: #337ab7; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #777777; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); cursor: not-allowed; } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { left: auto; right: 0; } .dropdown-menu-left { left: 0; right: auto; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.42857143; color: #777777; white-space: nowrap; } .dropdown-backdrop { position: fixed; left: 0; right: 0; bottom: 0; top: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0; border-bottom: 4px dashed; border-bottom: 4px solid \9; content: ""; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } @media (min-width: 541px) { .navbar-right .dropdown-menu { left: auto; right: 0; } .navbar-right .dropdown-menu-left { left: 0; right: auto; } } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-left: 8px; padding-right: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-left: 12px; padding-right: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 2px; border-top-left-radius: 2px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-right-radius: 0; border-top-left-radius: 0; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { float: none; display: table-cell; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } .btn-group-justified > .btn-group .dropdown-menu { left: auto; } [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { 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-left: 0; padding-right: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group .form-control:focus { z-index: 3; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 45px; padding: 10px 16px; font-size: 17px; line-height: 1.3333333; border-radius: 3px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 45px; line-height: 45px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 1px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 13px; font-weight: normal; line-height: 1; color: #555555; text-align: center; background-color: #eeeeee; border: 1px solid #ccc; border-radius: 2px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 1px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 17px; border-radius: 3px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-bottom-right-radius: 0; border-top-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-bottom-left-radius: 0; border-top-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; } .nav { margin-bottom: 0; padding-left: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eeeeee; } .nav > li.disabled > a { color: #777777; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #777777; text-decoration: none; background-color: transparent; cursor: not-allowed; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eeeeee; border-color: #337ab7; } .nav .nav-divider { height: 1px; margin: 8px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #ddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.42857143; border: 1px solid transparent; border-radius: 2px 2px 0 0; } .nav-tabs > li > a:hover { border-color: #eeeeee #eeeeee #ddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; background-color: #fff; border: 1px solid #ddd; border-bottom-color: transparent; cursor: default; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { text-align: center; margin-bottom: 5px; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 2px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 2px 2px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #fff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 2px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #fff; background-color: #337ab7; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { text-align: center; margin-bottom: 5px; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 2px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 2px 2px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #fff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar { position: relative; min-height: 30px; margin-bottom: 18px; border: 1px solid transparent; } @media (min-width: 541px) { .navbar { border-radius: 2px; } } @media (min-width: 541px) { .navbar-header { float: left; } } .navbar-collapse { overflow-x: visible; padding-right: 0px; padding-left: 0px; border-top: 1px solid transparent; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 541px) { .navbar-collapse { width: auto; border-top: 0; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-left: 0; padding-right: 0; } } .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 340px; } @media (max-device-width: 540px) and (orientation: landscape) { .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; } } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0px; margin-left: 0px; } @media (min-width: 541px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 541px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } @media (min-width: 541px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .navbar-brand { float: left; padding: 6px 0px; font-size: 17px; line-height: 18px; height: 30px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } .navbar-brand > img { display: block; } @media (min-width: 541px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: 0px; } } .navbar-toggle { position: relative; float: right; margin-right: 0px; padding: 9px 10px; margin-top: -2px; margin-bottom: -2px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 2px; } .navbar-toggle:focus { outline: 0; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 541px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 3px 0px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 18px; } @media (max-width: 540px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 18px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 541px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 6px; padding-bottom: 6px; } } .navbar-form { margin-left: 0px; margin-right: 0px; padding: 10px 0px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); margin-top: -1px; margin-bottom: -1px; } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .form-control-static { display: inline-block; } .navbar-form .input-group { display: inline-table; vertical-align: middle; } .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn, .navbar-form .input-group .form-control { width: auto; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .navbar-form .radio label, .navbar-form .checkbox label { padding-left: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 540px) { .navbar-form .form-group { margin-bottom: 5px; } .navbar-form .form-group:last-child { margin-bottom: 0; } } @media (min-width: 541px) { .navbar-form { width: auto; border: 0; margin-left: 0; margin-right: 0; padding-top: 0; padding-bottom: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { margin-bottom: 0; border-top-right-radius: 2px; border-top-left-radius: 2px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: -1px; margin-bottom: -1px; } .navbar-btn.btn-sm { margin-top: 0px; margin-bottom: 0px; } .navbar-btn.btn-xs { margin-top: 4px; margin-bottom: 4px; } .navbar-text { margin-top: 6px; margin-bottom: 6px; } @media (min-width: 541px) { .navbar-text { float: left; margin-left: 0px; margin-right: 0px; } } @media (min-width: 541px) { .navbar-left { float: left !important; float: left; } .navbar-right { float: right !important; float: right; margin-right: 0px; } .navbar-right ~ .navbar-right { margin-right: 0; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777; } .navbar-default .navbar-nav > li > a { color: #777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #ccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #ddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #ddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e7e7e7; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { background-color: #e7e7e7; color: #555; } @media (max-width: 540px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #ccc; background-color: transparent; } } .navbar-default .navbar-link { color: #777; } .navbar-default .navbar-link:hover { color: #333; } .navbar-default .btn-link { color: #777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { color: #333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { color: #ccc; } .navbar-inverse { background-color: #222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #9d9d9d; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-text { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #fff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { background-color: #080808; color: #fff; } @media (max-width: 540px) { .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:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444; background-color: transparent; } } .navbar-inverse .navbar-link { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { color: #fff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { color: #fff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { color: #444; } .breadcrumb { padding: 8px 15px; margin-bottom: 18px; list-style: none; background-color: #f5f5f5; border-radius: 2px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { content: "/\00a0"; padding: 0 5px; color: #5e5e5e; } .breadcrumb > .active { color: #777777; } .pagination { display: inline-block; padding-left: 0; margin: 18px 0; border-radius: 2px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; line-height: 1.42857143; text-decoration: none; color: #337ab7; background-color: #fff; border: 1px solid #ddd; margin-left: -1px; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-bottom-left-radius: 2px; border-top-left-radius: 2px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-bottom-right-radius: 2px; border-top-right-radius: 2px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { z-index: 2; color: #23527c; background-color: #eeeeee; border-color: #ddd; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 3; color: #fff; background-color: #337ab7; border-color: #337ab7; cursor: default; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777777; background-color: #fff; border-color: #ddd; cursor: not-allowed; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 17px; line-height: 1.3333333; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-bottom-right-radius: 3px; border-top-right-radius: 3px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; line-height: 1.5; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-bottom-left-radius: 1px; border-top-left-radius: 1px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-bottom-right-radius: 1px; border-top-right-radius: 1px; } .pager { padding-left: 0; margin: 18px 0; list-style: none; text-align: center; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #fff; border: 1px solid #ddd; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eeeeee; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #777777; background-color: #fff; cursor: not-allowed; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } a.label:hover, a.label:focus { color: #fff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #777777; } .label-default[href]:hover, .label-default[href]:focus { background-color: #5e5e5e; } .label-primary { background-color: #337ab7; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #286090; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; color: #fff; line-height: 1; vertical-align: middle; white-space: nowrap; text-align: center; background-color: #777777; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge, .btn-group-xs > .btn .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #fff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; background-color: #fff; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding-top: 30px; padding-bottom: 30px; margin-bottom: 30px; color: inherit; background-color: #eeeeee; } .jumbotron h1, .jumbotron .h1 { color: inherit; } .jumbotron p { margin-bottom: 15px; font-size: 20px; font-weight: 200; } .jumbotron > hr { border-top-color: #d5d5d5; } .container .jumbotron, .container-fluid .jumbotron { border-radius: 3px; padding-left: 0px; padding-right: 0px; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron, .container-fluid .jumbotron { padding-left: 60px; padding-right: 60px; } .jumbotron h1, .jumbotron .h1 { font-size: 59px; } } .thumbnail { display: block; padding: 4px; margin-bottom: 18px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 2px; -webkit-transition: border 0.2s ease-in-out; -o-transition: border 0.2s ease-in-out; transition: border 0.2s ease-in-out; } .thumbnail > img, .thumbnail a > img { margin-left: auto; margin-right: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #337ab7; } .thumbnail .caption { padding: 9px; color: #000; } .alert { padding: 15px; margin-bottom: 18px; border: 1px solid transparent; border-radius: 2px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable, .alert-dismissible { padding-right: 35px; } .alert-dismissable .close, .alert-dismissible .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { background-color: #dff0d8; border-color: #d6e9c6; color: #3c763d; } .alert-success hr { border-top-color: #c9e2b3; } .alert-success .alert-link { color: #2b542c; } .alert-info { background-color: #d9edf7; border-color: #bce8f1; color: #31708f; } .alert-info hr { border-top-color: #a6e1ec; } .alert-info .alert-link { color: #245269; } .alert-warning { background-color: #fcf8e3; border-color: #faebcc; color: #8a6d3b; } .alert-warning hr { border-top-color: #f7e1b5; } .alert-warning .alert-link { color: #66512c; } .alert-danger { background-color: #f2dede; border-color: #ebccd1; color: #a94442; } .alert-danger hr { border-top-color: #e4b9c0; } .alert-danger .alert-link { color: #843534; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { overflow: hidden; height: 18px; margin-bottom: 18px; background-color: #f5f5f5; border-radius: 2px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .progress-bar { float: left; width: 0%; height: 100%; font-size: 12px; line-height: 18px; color: #fff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; -o-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar, .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 40px 40px; } .progress.active .progress-bar, .progress-bar.active { -webkit-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #5cb85c; } .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #5bc0de; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #f0ad4e; } .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #d9534f; } .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media, .media-body { zoom: 1; overflow: hidden; } .media-body { width: 10000px; } .media-object { display: block; } .media-object.img-thumbnail { max-width: none; } .media-right, .media > .pull-right { padding-left: 10px; } .media-left, .media > .pull-left { padding-right: 10px; } .media-left, .media-right, .media-body { display: table-cell; vertical-align: top; } .media-middle { vertical-align: middle; } .media-bottom { vertical-align: bottom; } .media-heading { margin-top: 0; margin-bottom: 5px; } .media-list { padding-left: 0; list-style: none; } .list-group { margin-bottom: 20px; padding-left: 0; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #fff; border: 1px solid #ddd; } .list-group-item:first-child { border-top-right-radius: 2px; border-top-left-radius: 2px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; } a.list-group-item, button.list-group-item { color: #555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { color: #333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { text-decoration: none; color: #555; background-color: #f5f5f5; } button.list-group-item { width: 100%; text-align: left; } .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { background-color: #eeeeee; color: #777777; cursor: not-allowed; } .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { color: inherit; } .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { color: #777777; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #fff; background-color: #337ab7; border-color: #337ab7; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #c7ddef; } .list-group-item-success { color: #3c763d; background-color: #dff0d8; } a.list-group-item-success, button.list-group-item-success { color: #3c763d; } a.list-group-item-success .list-group-item-heading, button.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, button.list-group-item-success:hover, a.list-group-item-success:focus, button.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; } a.list-group-item-success.active, button.list-group-item-success.active, a.list-group-item-success.active:hover, button.list-group-item-success.active:hover, a.list-group-item-success.active:focus, button.list-group-item-success.active:focus { color: #fff; background-color: #3c763d; border-color: #3c763d; } .list-group-item-info { color: #31708f; background-color: #d9edf7; } a.list-group-item-info, button.list-group-item-info { color: #31708f; } a.list-group-item-info .list-group-item-heading, button.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, button.list-group-item-info:hover, a.list-group-item-info:focus, button.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; } a.list-group-item-info.active, button.list-group-item-info.active, a.list-group-item-info.active:hover, button.list-group-item-info.active:hover, a.list-group-item-info.active:focus, button.list-group-item-info.active:focus { color: #fff; background-color: #31708f; border-color: #31708f; } .list-group-item-warning { color: #8a6d3b; background-color: #fcf8e3; } a.list-group-item-warning, button.list-group-item-warning { color: #8a6d3b; } a.list-group-item-warning .list-group-item-heading, button.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, button.list-group-item-warning:hover, a.list-group-item-warning:focus, button.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; } a.list-group-item-warning.active, button.list-group-item-warning.active, a.list-group-item-warning.active:hover, button.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, button.list-group-item-warning.active:focus { color: #fff; background-color: #8a6d3b; border-color: #8a6d3b; } .list-group-item-danger { color: #a94442; background-color: #f2dede; } a.list-group-item-danger, button.list-group-item-danger { color: #a94442; } a.list-group-item-danger .list-group-item-heading, button.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, button.list-group-item-danger:hover, a.list-group-item-danger:focus, button.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; } a.list-group-item-danger.active, button.list-group-item-danger.active, a.list-group-item-danger.active:hover, button.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, button.list-group-item-danger.active:focus { color: #fff; background-color: #a94442; border-color: #a94442; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 18px; background-color: #fff; border: 1px solid transparent; border-radius: 2px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: 1px; border-top-left-radius: 1px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 15px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #ddd; border-bottom-right-radius: 1px; border-bottom-left-radius: 1px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 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-right-radius: 1px; border-top-left-radius: 1px; } .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: 1px; border-bottom-left-radius: 1px; } .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-left: 15px; padding-right: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-right-radius: 1px; border-top-left-radius: 1px; } .panel > .table:first-child > thead: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-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 1px; border-top-right-radius: 1px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 1px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 1px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 1px; border-bottom-left-radius: 1px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-left-radius: 1px; border-bottom-right-radius: 1px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 1px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 1px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { border: 0; margin-bottom: 0; } .panel-group { margin-bottom: 18px; } .panel-group .panel { margin-bottom: 0; border-radius: 2px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #ddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #ddd; } .panel-default { border-color: #ddd; } .panel-default > .panel-heading { color: #333333; 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: #333333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ddd; } .panel-primary { border-color: #337ab7; } .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-heading .badge { color: #337ab7; background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-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 { color: #31708f; background-color: #d9edf7; 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 { color: #8a6d3b; background-color: #fcf8e3; 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 { color: #a94442; background-color: #f2dede; 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; padding: 0; overflow: hidden; } .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video { position: absolute; top: 0; left: 0; bottom: 0; height: 100%; width: 100%; border: 0; } .embed-responsive-16by9 { padding-bottom: 56.25%; } .embed-responsive-4by3 { padding-bottom: 75%; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 2px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-lg { padding: 24px; border-radius: 3px; } .well-sm { padding: 9px; border-radius: 1px; } .close { float: right; font-size: 19.5px; font-weight: bold; line-height: 1; color: #000; text-shadow: 0 1px 0 #fff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { color: #000; text-decoration: none; cursor: pointer; opacity: 0.5; filter: alpha(opacity=50); } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .modal-open { overflow: hidden; } .modal { display: none; overflow: hidden; position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); -o-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -moz-transition: -moz-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .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; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 3px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); background-clip: padding-box; outline: 0; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000; } .modal-backdrop.fade { opacity: 0; filter: alpha(opacity=0); } .modal-backdrop.in { opacity: 0.5; filter: alpha(opacity=50); } .modal-header { padding: 15px; border-bottom: 1px solid #e5e5e5; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 15px; } .modal-footer { padding: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer .btn + .btn { margin-left: 5px; margin-bottom: 0; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } .modal-sm { width: 300px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } .tooltip { position: absolute; z-index: 1070; display: block; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-style: normal; font-weight: normal; letter-spacing: normal; line-break: auto; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; white-space: normal; word-break: normal; word-spacing: normal; word-wrap: normal; font-size: 12px; opacity: 0; filter: alpha(opacity=0); } .tooltip.in { opacity: 0.9; filter: alpha(opacity=90); } .tooltip.top { margin-top: -3px; padding: 5px 0; } .tooltip.right { margin-left: 3px; padding: 0 5px; } .tooltip.bottom { margin-top: 3px; padding: 5px 0; } .tooltip.left { margin-left: -3px; padding: 0 5px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #fff; text-align: center; background-color: #000; border-radius: 2px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-left .tooltip-arrow { bottom: 0; right: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: #000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: #000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .popover { position: absolute; top: 0; left: 0; z-index: 1060; display: none; max-width: 276px; padding: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-style: normal; font-weight: normal; letter-spacing: normal; line-break: auto; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; white-space: normal; word-break: normal; word-spacing: normal; word-wrap: normal; font-size: 13px; background-color: #fff; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 3px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { margin: 0; padding: 8px 14px; font-size: 13px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 2px 2px 0 0; } .popover-content { padding: 9px 14px; } .popover > .arrow, .popover > .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover > .arrow { border-width: 11px; } .popover > .arrow:after { border-width: 10px; content: ""; } .popover.top > .arrow { left: 50%; margin-left: -11px; border-bottom-width: 0; border-top-color: #999999; border-top-color: rgba(0, 0, 0, 0.25); bottom: -11px; } .popover.top > .arrow:after { content: " "; bottom: 1px; margin-left: -10px; border-bottom-width: 0; border-top-color: #fff; } .popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-left-width: 0; border-right-color: #999999; border-right-color: rgba(0, 0, 0, 0.25); } .popover.right > .arrow:after { content: " "; left: 1px; bottom: -10px; border-left-width: 0; border-right-color: #fff; } .popover.bottom > .arrow { left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999999; border-bottom-color: rgba(0, 0, 0, 0.25); top: -11px; } .popover.bottom > .arrow:after { content: " "; top: 1px; margin-left: -10px; border-top-width: 0; border-bottom-color: #fff; } .popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999999; border-left-color: rgba(0, 0, 0, 0.25); } .popover.left > .arrow:after { content: " "; right: 1px; border-right-width: 0; border-left-color: #fff; bottom: -10px; } .carousel { position: relative; } .carousel-inner { position: relative; overflow: hidden; width: 100%; } .carousel-inner > .item { display: none; position: relative; -webkit-transition: 0.6s ease-in-out left; -o-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { line-height: 1; } @media all and (transform-3d), (-webkit-transform-3d) { .carousel-inner > .item { -webkit-transition: -webkit-transform 0.6s ease-in-out; -moz-transition: -moz-transform 0.6s ease-in-out; -o-transition: -o-transform 0.6s ease-in-out; transition: transform 0.6s ease-in-out; -webkit-backface-visibility: hidden; -moz-backface-visibility: hidden; backface-visibility: hidden; -webkit-perspective: 1000px; -moz-perspective: 1000px; perspective: 1000px; } .carousel-inner > .item.next, .carousel-inner > .item.active.right { -webkit-transform: translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0); left: 0; } .carousel-inner > .item.prev, .carousel-inner > .item.active.left { -webkit-transform: translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0); left: 0; } .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); left: 0; } } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; left: 0; bottom: 0; width: 15%; opacity: 0.5; filter: alpha(opacity=50); font-size: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); background-color: rgba(0, 0, 0, 0); } .carousel-control.left { background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { left: auto; right: 0; background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control:hover, .carousel-control:focus { outline: 0; color: #fff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; margin-top: -10px; z-index: 5; display: inline-block; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; margin-left: -10px; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; margin-right: -10px; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; line-height: 1; font-family: serif; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; margin-left: -30%; padding-left: 0; list-style: none; text-align: center; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; border: 1px solid #fff; border-radius: 10px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); } .carousel-indicators .active { margin: 0; width: 12px; height: 12px; background-color: #fff; } .carousel-caption { position: absolute; left: 15%; right: 15%; bottom: 20px; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -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 { left: 20%; right: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-header:before, .modal-header:after, .modal-footer:before, .modal-footer:after, .item_buttons:before, .item_buttons:after { content: " "; display: table; } .clearfix:after, .dl-horizontal dd:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-header:after, .modal-footer:after, .item_buttons:after { clear: both; } .center-block { display: block; margin-left: auto; margin-right: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (max-width: 767px) { .visible-xs-block { display: block !important; } } @media (max-width: 767px) { .visible-xs-inline { display: inline !important; } } @media (max-width: 767px) { .visible-xs-inline-block { display: inline-block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-block { display: block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline { display: inline !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline-block { display: inline-block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-block { display: block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline { display: inline !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline-block { display: inline-block !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg-block { display: block !important; } } @media (min-width: 1200px) { .visible-lg-inline { display: inline !important; } } @media (min-width: 1200px) { .visible-lg-inline-block { display: inline-block !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } .visible-print-block { display: none !important; } @media print { .visible-print-block { display: block !important; } } .visible-print-inline { display: none !important; } @media print { .visible-print-inline { display: inline !important; } } .visible-print-inline-block { display: none !important; } @media print { .visible-print-inline-block { display: inline-block !important; } } @media print { .hidden-print { display: none !important; } } /*! * * Font Awesome * */ /*! * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('../components/font-awesome/fonts/fontawesome-webfont.eot?v=4.2.0'); src: url('../components/font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), url('../components/font-awesome/fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'), url('../components/font-awesome/fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'), url('../components/font-awesome/fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg'); font-weight: normal; font-style: normal; } .fa { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* makes the font 33% larger relative to the icon container */ .fa-lg { font-size: 1.33333333em; line-height: 0.75em; vertical-align: -15%; } .fa-2x { font-size: 2em; } .fa-3x { font-size: 3em; } .fa-4x { font-size: 4em; } .fa-5x { font-size: 5em; } .fa-fw { width: 1.28571429em; text-align: center; } .fa-ul { padding-left: 0; margin-left: 2.14285714em; list-style-type: none; } .fa-ul > li { position: relative; } .fa-li { position: absolute; left: -2.14285714em; width: 2.14285714em; top: 0.14285714em; text-align: center; } .fa-li.fa-lg { left: -1.85714286em; } .fa-border { padding: .2em .25em .15em; border: solid 0.08em #eee; border-radius: .1em; } .pull-right { float: right; } .pull-left { float: left; } .fa.pull-left { margin-right: .3em; } .fa.pull-right { margin-left: .3em; } .fa-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } .fa-rotate-90 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); -webkit-transform: scale(-1, 1); -ms-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); -webkit-transform: scale(1, -1); -ms-transform: scale(1, -1); transform: scale(1, -1); } :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical { filter: none; } .fa-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .fa-stack-1x, .fa-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .fa-stack-1x { line-height: inherit; } .fa-stack-2x { font-size: 2em; } .fa-inverse { color: #fff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-glass:before { content: "\f000"; } .fa-music:before { content: "\f001"; } .fa-search:before { content: "\f002"; } .fa-envelope-o:before { content: "\f003"; } .fa-heart:before { content: "\f004"; } .fa-star:before { content: "\f005"; } .fa-star-o:before { content: "\f006"; } .fa-user:before { content: "\f007"; } .fa-film:before { content: "\f008"; } .fa-th-large:before { content: "\f009"; } .fa-th:before { content: "\f00a"; } .fa-th-list:before { content: "\f00b"; } .fa-check:before { content: "\f00c"; } .fa-remove:before, .fa-close:before, .fa-times:before { content: "\f00d"; } .fa-search-plus:before { content: "\f00e"; } .fa-search-minus:before { content: "\f010"; } .fa-power-off:before { content: "\f011"; } .fa-signal:before { content: "\f012"; } .fa-gear:before, .fa-cog:before { content: "\f013"; } .fa-trash-o:before { content: "\f014"; } .fa-home:before { content: "\f015"; } .fa-file-o:before { content: "\f016"; } .fa-clock-o:before { content: "\f017"; } .fa-road:before { content: "\f018"; } .fa-download:before { content: "\f019"; } .fa-arrow-circle-o-down:before { content: "\f01a"; } .fa-arrow-circle-o-up:before { content: "\f01b"; } .fa-inbox:before { content: "\f01c"; } .fa-play-circle-o:before { content: "\f01d"; } .fa-rotate-right:before, .fa-repeat:before { content: "\f01e"; } .fa-refresh:before { content: "\f021"; } .fa-list-alt:before { content: "\f022"; } .fa-lock:before { content: "\f023"; } .fa-flag:before { content: "\f024"; } .fa-headphones:before { content: "\f025"; } .fa-volume-off:before { content: "\f026"; } .fa-volume-down:before { content: "\f027"; } .fa-volume-up:before { content: "\f028"; } .fa-qrcode:before { content: "\f029"; } .fa-barcode:before { content: "\f02a"; } .fa-tag:before { content: "\f02b"; } .fa-tags:before { content: "\f02c"; } .fa-book:before { content: "\f02d"; } .fa-bookmark:before { content: "\f02e"; } .fa-print:before { content: "\f02f"; } .fa-camera:before { content: "\f030"; } .fa-font:before { content: "\f031"; } .fa-bold:before { content: "\f032"; } .fa-italic:before { content: "\f033"; } .fa-text-height:before { content: "\f034"; } .fa-text-width:before { content: "\f035"; } .fa-align-left:before { content: "\f036"; } .fa-align-center:before { content: "\f037"; } .fa-align-right:before { content: "\f038"; } .fa-align-justify:before { content: "\f039"; } .fa-list:before { content: "\f03a"; } .fa-dedent:before, .fa-outdent:before { content: "\f03b"; } .fa-indent:before { content: "\f03c"; } .fa-video-camera:before { content: "\f03d"; } .fa-photo:before, .fa-image:before, .fa-picture-o:before { content: "\f03e"; } .fa-pencil:before { content: "\f040"; } .fa-map-marker:before { content: "\f041"; } .fa-adjust:before { content: "\f042"; } .fa-tint:before { content: "\f043"; } .fa-edit:before, .fa-pencil-square-o:before { content: "\f044"; } .fa-share-square-o:before { content: "\f045"; } .fa-check-square-o:before { content: "\f046"; } .fa-arrows:before { content: "\f047"; } .fa-step-backward:before { content: "\f048"; } .fa-fast-backward:before { content: "\f049"; } .fa-backward:before { content: "\f04a"; } .fa-play:before { content: "\f04b"; } .fa-pause:before { content: "\f04c"; } .fa-stop:before { content: "\f04d"; } .fa-forward:before { content: "\f04e"; } .fa-fast-forward:before { content: "\f050"; } .fa-step-forward:before { content: "\f051"; } .fa-eject:before { content: "\f052"; } .fa-chevron-left:before { content: "\f053"; } .fa-chevron-right:before { content: "\f054"; } .fa-plus-circle:before { content: "\f055"; } .fa-minus-circle:before { content: "\f056"; } .fa-times-circle:before { content: "\f057"; } .fa-check-circle:before { content: "\f058"; } .fa-question-circle:before { content: "\f059"; } .fa-info-circle:before { content: "\f05a"; } .fa-crosshairs:before { content: "\f05b"; } .fa-times-circle-o:before { content: "\f05c"; } .fa-check-circle-o:before { content: "\f05d"; } .fa-ban:before { content: "\f05e"; } .fa-arrow-left:before { content: "\f060"; } .fa-arrow-right:before { content: "\f061"; } .fa-arrow-up:before { content: "\f062"; } .fa-arrow-down:before { content: "\f063"; } .fa-mail-forward:before, .fa-share:before { content: "\f064"; } .fa-expand:before { content: "\f065"; } .fa-compress:before { content: "\f066"; } .fa-plus:before { content: "\f067"; } .fa-minus:before { content: "\f068"; } .fa-asterisk:before { content: "\f069"; } .fa-exclamation-circle:before { content: "\f06a"; } .fa-gift:before { content: "\f06b"; } .fa-leaf:before { content: "\f06c"; } .fa-fire:before { content: "\f06d"; } .fa-eye:before { content: "\f06e"; } .fa-eye-slash:before { content: "\f070"; } .fa-warning:before, .fa-exclamation-triangle:before { content: "\f071"; } .fa-plane:before { content: "\f072"; } .fa-calendar:before { content: "\f073"; } .fa-random:before { content: "\f074"; } .fa-comment:before { content: "\f075"; } .fa-magnet:before { content: "\f076"; } .fa-chevron-up:before { content: "\f077"; } .fa-chevron-down:before { content: "\f078"; } .fa-retweet:before { content: "\f079"; } .fa-shopping-cart:before { content: "\f07a"; } .fa-folder:before { content: "\f07b"; } .fa-folder-open:before { content: "\f07c"; } .fa-arrows-v:before { content: "\f07d"; } .fa-arrows-h:before { content: "\f07e"; } .fa-bar-chart-o:before, .fa-bar-chart:before { content: "\f080"; } .fa-twitter-square:before { content: "\f081"; } .fa-facebook-square:before { content: "\f082"; } .fa-camera-retro:before { content: "\f083"; } .fa-key:before { content: "\f084"; } .fa-gears:before, .fa-cogs:before { content: "\f085"; } .fa-comments:before { content: "\f086"; } .fa-thumbs-o-up:before { content: "\f087"; } .fa-thumbs-o-down:before { content: "\f088"; } .fa-star-half:before { content: "\f089"; } .fa-heart-o:before { content: "\f08a"; } .fa-sign-out:before { content: "\f08b"; } .fa-linkedin-square:before { content: "\f08c"; } .fa-thumb-tack:before { content: "\f08d"; } .fa-external-link:before { content: "\f08e"; } .fa-sign-in:before { content: "\f090"; } .fa-trophy:before { content: "\f091"; } .fa-github-square:before { content: "\f092"; } .fa-upload:before { content: "\f093"; } .fa-lemon-o:before { content: "\f094"; } .fa-phone:before { content: "\f095"; } .fa-square-o:before { content: "\f096"; } .fa-bookmark-o:before { content: "\f097"; } .fa-phone-square:before { content: "\f098"; } .fa-twitter:before { content: "\f099"; } .fa-facebook:before { content: "\f09a"; } .fa-github:before { content: "\f09b"; } .fa-unlock:before { content: "\f09c"; } .fa-credit-card:before { content: "\f09d"; } .fa-rss:before { content: "\f09e"; } .fa-hdd-o:before { content: "\f0a0"; } .fa-bullhorn:before { content: "\f0a1"; } .fa-bell:before { content: "\f0f3"; } .fa-certificate:before { content: "\f0a3"; } .fa-hand-o-right:before { content: "\f0a4"; } .fa-hand-o-left:before { content: "\f0a5"; } .fa-hand-o-up:before { content: "\f0a6"; } .fa-hand-o-down:before { content: "\f0a7"; } .fa-arrow-circle-left:before { content: "\f0a8"; } .fa-arrow-circle-right:before { content: "\f0a9"; } .fa-arrow-circle-up:before { content: "\f0aa"; } .fa-arrow-circle-down:before { content: "\f0ab"; } .fa-globe:before { content: "\f0ac"; } .fa-wrench:before { content: "\f0ad"; } .fa-tasks:before { content: "\f0ae"; } .fa-filter:before { content: "\f0b0"; } .fa-briefcase:before { content: "\f0b1"; } .fa-arrows-alt:before { content: "\f0b2"; } .fa-group:before, .fa-users:before { content: "\f0c0"; } .fa-chain:before, .fa-link:before { content: "\f0c1"; } .fa-cloud:before { content: "\f0c2"; } .fa-flask:before { content: "\f0c3"; } .fa-cut:before, .fa-scissors:before { content: "\f0c4"; } .fa-copy:before, .fa-files-o:before { content: "\f0c5"; } .fa-paperclip:before { content: "\f0c6"; } .fa-save:before, .fa-floppy-o:before { content: "\f0c7"; } .fa-square:before { content: "\f0c8"; } .fa-navicon:before, .fa-reorder:before, .fa-bars:before { content: "\f0c9"; } .fa-list-ul:before { content: "\f0ca"; } .fa-list-ol:before { content: "\f0cb"; } .fa-strikethrough:before { content: "\f0cc"; } .fa-underline:before { content: "\f0cd"; } .fa-table:before { content: "\f0ce"; } .fa-magic:before { content: "\f0d0"; } .fa-truck:before { content: "\f0d1"; } .fa-pinterest:before { content: "\f0d2"; } .fa-pinterest-square:before { content: "\f0d3"; } .fa-google-plus-square:before { content: "\f0d4"; } .fa-google-plus:before { content: "\f0d5"; } .fa-money:before { content: "\f0d6"; } .fa-caret-down:before { content: "\f0d7"; } .fa-caret-up:before { content: "\f0d8"; } .fa-caret-left:before { content: "\f0d9"; } .fa-caret-right:before { content: "\f0da"; } .fa-columns:before { content: "\f0db"; } .fa-unsorted:before, .fa-sort:before { content: "\f0dc"; } .fa-sort-down:before, .fa-sort-desc:before { content: "\f0dd"; } .fa-sort-up:before, .fa-sort-asc:before { content: "\f0de"; } .fa-envelope:before { content: "\f0e0"; } .fa-linkedin:before { content: "\f0e1"; } .fa-rotate-left:before, .fa-undo:before { content: "\f0e2"; } .fa-legal:before, .fa-gavel:before { content: "\f0e3"; } .fa-dashboard:before, .fa-tachometer:before { content: "\f0e4"; } .fa-comment-o:before { content: "\f0e5"; } .fa-comments-o:before { content: "\f0e6"; } .fa-flash:before, .fa-bolt:before { content: "\f0e7"; } .fa-sitemap:before { content: "\f0e8"; } .fa-umbrella:before { content: "\f0e9"; } .fa-paste:before, .fa-clipboard:before { content: "\f0ea"; } .fa-lightbulb-o:before { content: "\f0eb"; } .fa-exchange:before { content: "\f0ec"; } .fa-cloud-download:before { content: "\f0ed"; } .fa-cloud-upload:before { content: "\f0ee"; } .fa-user-md:before { content: "\f0f0"; } .fa-stethoscope:before { content: "\f0f1"; } .fa-suitcase:before { content: "\f0f2"; } .fa-bell-o:before { content: "\f0a2"; } .fa-coffee:before { content: "\f0f4"; } .fa-cutlery:before { content: "\f0f5"; } .fa-file-text-o:before { content: "\f0f6"; } .fa-building-o:before { content: "\f0f7"; } .fa-hospital-o:before { content: "\f0f8"; } .fa-ambulance:before { content: "\f0f9"; } .fa-medkit:before { content: "\f0fa"; } .fa-fighter-jet:before { content: "\f0fb"; } .fa-beer:before { content: "\f0fc"; } .fa-h-square:before { content: "\f0fd"; } .fa-plus-square:before { content: "\f0fe"; } .fa-angle-double-left:before { content: "\f100"; } .fa-angle-double-right:before { content: "\f101"; } .fa-angle-double-up:before { content: "\f102"; } .fa-angle-double-down:before { content: "\f103"; } .fa-angle-left:before { content: "\f104"; } .fa-angle-right:before { content: "\f105"; } .fa-angle-up:before { content: "\f106"; } .fa-angle-down:before { content: "\f107"; } .fa-desktop:before { content: "\f108"; } .fa-laptop:before { content: "\f109"; } .fa-tablet:before { content: "\f10a"; } .fa-mobile-phone:before, .fa-mobile:before { content: "\f10b"; } .fa-circle-o:before { content: "\f10c"; } .fa-quote-left:before { content: "\f10d"; } .fa-quote-right:before { content: "\f10e"; } .fa-spinner:before { content: "\f110"; } .fa-circle:before { content: "\f111"; } .fa-mail-reply:before, .fa-reply:before { content: "\f112"; } .fa-github-alt:before { content: "\f113"; } .fa-folder-o:before { content: "\f114"; } .fa-folder-open-o:before { content: "\f115"; } .fa-smile-o:before { content: "\f118"; } .fa-frown-o:before { content: "\f119"; } .fa-meh-o:before { content: "\f11a"; } .fa-gamepad:before { content: "\f11b"; } .fa-keyboard-o:before { content: "\f11c"; } .fa-flag-o:before { content: "\f11d"; } .fa-flag-checkered:before { content: "\f11e"; } .fa-terminal:before { content: "\f120"; } .fa-code:before { content: "\f121"; } .fa-mail-reply-all:before, .fa-reply-all:before { content: "\f122"; } .fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before { content: "\f123"; } .fa-location-arrow:before { content: "\f124"; } .fa-crop:before { content: "\f125"; } .fa-code-fork:before { content: "\f126"; } .fa-unlink:before, .fa-chain-broken:before { content: "\f127"; } .fa-question:before { content: "\f128"; } .fa-info:before { content: "\f129"; } .fa-exclamation:before { content: "\f12a"; } .fa-superscript:before { content: "\f12b"; } .fa-subscript:before { content: "\f12c"; } .fa-eraser:before { content: "\f12d"; } .fa-puzzle-piece:before { content: "\f12e"; } .fa-microphone:before { content: "\f130"; } .fa-microphone-slash:before { content: "\f131"; } .fa-shield:before { content: "\f132"; } .fa-calendar-o:before { content: "\f133"; } .fa-fire-extinguisher:before { content: "\f134"; } .fa-rocket:before { content: "\f135"; } .fa-maxcdn:before { content: "\f136"; } .fa-chevron-circle-left:before { content: "\f137"; } .fa-chevron-circle-right:before { content: "\f138"; } .fa-chevron-circle-up:before { content: "\f139"; } .fa-chevron-circle-down:before { content: "\f13a"; } .fa-html5:before { content: "\f13b"; } .fa-css3:before { content: "\f13c"; } .fa-anchor:before { content: "\f13d"; } .fa-unlock-alt:before { content: "\f13e"; } .fa-bullseye:before { content: "\f140"; } .fa-ellipsis-h:before { content: "\f141"; } .fa-ellipsis-v:before { content: "\f142"; } .fa-rss-square:before { content: "\f143"; } .fa-play-circle:before { content: "\f144"; } .fa-ticket:before { content: "\f145"; } .fa-minus-square:before { content: "\f146"; } .fa-minus-square-o:before { content: "\f147"; } .fa-level-up:before { content: "\f148"; } .fa-level-down:before { content: "\f149"; } .fa-check-square:before { content: "\f14a"; } .fa-pencil-square:before { content: "\f14b"; } .fa-external-link-square:before { content: "\f14c"; } .fa-share-square:before { content: "\f14d"; } .fa-compass:before { content: "\f14e"; } .fa-toggle-down:before, .fa-caret-square-o-down:before { content: "\f150"; } .fa-toggle-up:before, .fa-caret-square-o-up:before { content: "\f151"; } .fa-toggle-right:before, .fa-caret-square-o-right:before { content: "\f152"; } .fa-euro:before, .fa-eur:before { content: "\f153"; } .fa-gbp:before { content: "\f154"; } .fa-dollar:before, .fa-usd:before { content: "\f155"; } .fa-rupee:before, .fa-inr:before { content: "\f156"; } .fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before { content: "\f157"; } .fa-ruble:before, .fa-rouble:before, .fa-rub:before { content: "\f158"; } .fa-won:before, .fa-krw:before { content: "\f159"; } .fa-bitcoin:before, .fa-btc:before { content: "\f15a"; } .fa-file:before { content: "\f15b"; } .fa-file-text:before { content: "\f15c"; } .fa-sort-alpha-asc:before { content: "\f15d"; } .fa-sort-alpha-desc:before { content: "\f15e"; } .fa-sort-amount-asc:before { content: "\f160"; } .fa-sort-amount-desc:before { content: "\f161"; } .fa-sort-numeric-asc:before { content: "\f162"; } .fa-sort-numeric-desc:before { content: "\f163"; } .fa-thumbs-up:before { content: "\f164"; } .fa-thumbs-down:before { content: "\f165"; } .fa-youtube-square:before { content: "\f166"; } .fa-youtube:before { content: "\f167"; } .fa-xing:before { content: "\f168"; } .fa-xing-square:before { content: "\f169"; } .fa-youtube-play:before { content: "\f16a"; } .fa-dropbox:before { content: "\f16b"; } .fa-stack-overflow:before { content: "\f16c"; } .fa-instagram:before { content: "\f16d"; } .fa-flickr:before { content: "\f16e"; } .fa-adn:before { content: "\f170"; } .fa-bitbucket:before { content: "\f171"; } .fa-bitbucket-square:before { content: "\f172"; } .fa-tumblr:before { content: "\f173"; } .fa-tumblr-square:before { content: "\f174"; } .fa-long-arrow-down:before { content: "\f175"; } .fa-long-arrow-up:before { content: "\f176"; } .fa-long-arrow-left:before { content: "\f177"; } .fa-long-arrow-right:before { content: "\f178"; } .fa-apple:before { content: "\f179"; } .fa-windows:before { content: "\f17a"; } .fa-android:before { content: "\f17b"; } .fa-linux:before { content: "\f17c"; } .fa-dribbble:before { content: "\f17d"; } .fa-skype:before { content: "\f17e"; } .fa-foursquare:before { content: "\f180"; } .fa-trello:before { content: "\f181"; } .fa-female:before { content: "\f182"; } .fa-male:before { content: "\f183"; } .fa-gittip:before { content: "\f184"; } .fa-sun-o:before { content: "\f185"; } .fa-moon-o:before { content: "\f186"; } .fa-archive:before { content: "\f187"; } .fa-bug:before { content: "\f188"; } .fa-vk:before { content: "\f189"; } .fa-weibo:before { content: "\f18a"; } .fa-renren:before { content: "\f18b"; } .fa-pagelines:before { content: "\f18c"; } .fa-stack-exchange:before { content: "\f18d"; } .fa-arrow-circle-o-right:before { content: "\f18e"; } .fa-arrow-circle-o-left:before { content: "\f190"; } .fa-toggle-left:before, .fa-caret-square-o-left:before { content: "\f191"; } .fa-dot-circle-o:before { content: "\f192"; } .fa-wheelchair:before { content: "\f193"; } .fa-vimeo-square:before { content: "\f194"; } .fa-turkish-lira:before, .fa-try:before { content: "\f195"; } .fa-plus-square-o:before { content: "\f196"; } .fa-space-shuttle:before { content: "\f197"; } .fa-slack:before { content: "\f198"; } .fa-envelope-square:before { content: "\f199"; } .fa-wordpress:before { content: "\f19a"; } .fa-openid:before { content: "\f19b"; } .fa-institution:before, .fa-bank:before, .fa-university:before { content: "\f19c"; } .fa-mortar-board:before, .fa-graduation-cap:before { content: "\f19d"; } .fa-yahoo:before { content: "\f19e"; } .fa-google:before { content: "\f1a0"; } .fa-reddit:before { content: "\f1a1"; } .fa-reddit-square:before { content: "\f1a2"; } .fa-stumbleupon-circle:before { content: "\f1a3"; } .fa-stumbleupon:before { content: "\f1a4"; } .fa-delicious:before { content: "\f1a5"; } .fa-digg:before { content: "\f1a6"; } .fa-pied-piper:before { content: "\f1a7"; } .fa-pied-piper-alt:before { content: "\f1a8"; } .fa-drupal:before { content: "\f1a9"; } .fa-joomla:before { content: "\f1aa"; } .fa-language:before { content: "\f1ab"; } .fa-fax:before { content: "\f1ac"; } .fa-building:before { content: "\f1ad"; } .fa-child:before { content: "\f1ae"; } .fa-paw:before { content: "\f1b0"; } .fa-spoon:before { content: "\f1b1"; } .fa-cube:before { content: "\f1b2"; } .fa-cubes:before { content: "\f1b3"; } .fa-behance:before { content: "\f1b4"; } .fa-behance-square:before { content: "\f1b5"; } .fa-steam:before { content: "\f1b6"; } .fa-steam-square:before { content: "\f1b7"; } .fa-recycle:before { content: "\f1b8"; } .fa-automobile:before, .fa-car:before { content: "\f1b9"; } .fa-cab:before, .fa-taxi:before { content: "\f1ba"; } .fa-tree:before { content: "\f1bb"; } .fa-spotify:before { content: "\f1bc"; } .fa-deviantart:before { content: "\f1bd"; } .fa-soundcloud:before { content: "\f1be"; } .fa-database:before { content: "\f1c0"; } .fa-file-pdf-o:before { content: "\f1c1"; } .fa-file-word-o:before { content: "\f1c2"; } .fa-file-excel-o:before { content: "\f1c3"; } .fa-file-powerpoint-o:before { content: "\f1c4"; } .fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before { content: "\f1c5"; } .fa-file-zip-o:before, .fa-file-archive-o:before { content: "\f1c6"; } .fa-file-sound-o:before, .fa-file-audio-o:before { content: "\f1c7"; } .fa-file-movie-o:before, .fa-file-video-o:before { content: "\f1c8"; } .fa-file-code-o:before { content: "\f1c9"; } .fa-vine:before { content: "\f1ca"; } .fa-codepen:before { content: "\f1cb"; } .fa-jsfiddle:before { content: "\f1cc"; } .fa-life-bouy:before, .fa-life-buoy:before, .fa-life-saver:before, .fa-support:before, .fa-life-ring:before { content: "\f1cd"; } .fa-circle-o-notch:before { content: "\f1ce"; } .fa-ra:before, .fa-rebel:before { content: "\f1d0"; } .fa-ge:before, .fa-empire:before { content: "\f1d1"; } .fa-git-square:before { content: "\f1d2"; } .fa-git:before { content: "\f1d3"; } .fa-hacker-news:before { content: "\f1d4"; } .fa-tencent-weibo:before { content: "\f1d5"; } .fa-qq:before { content: "\f1d6"; } .fa-wechat:before, .fa-weixin:before { content: "\f1d7"; } .fa-send:before, .fa-paper-plane:before { content: "\f1d8"; } .fa-send-o:before, .fa-paper-plane-o:before { content: "\f1d9"; } .fa-history:before { content: "\f1da"; } .fa-circle-thin:before { content: "\f1db"; } .fa-header:before { content: "\f1dc"; } .fa-paragraph:before { content: "\f1dd"; } .fa-sliders:before { content: "\f1de"; } .fa-share-alt:before { content: "\f1e0"; } .fa-share-alt-square:before { content: "\f1e1"; } .fa-bomb:before { content: "\f1e2"; } .fa-soccer-ball-o:before, .fa-futbol-o:before { content: "\f1e3"; } .fa-tty:before { content: "\f1e4"; } .fa-binoculars:before { content: "\f1e5"; } .fa-plug:before { content: "\f1e6"; } .fa-slideshare:before { content: "\f1e7"; } .fa-twitch:before { content: "\f1e8"; } .fa-yelp:before { content: "\f1e9"; } .fa-newspaper-o:before { content: "\f1ea"; } .fa-wifi:before { content: "\f1eb"; } .fa-calculator:before { content: "\f1ec"; } .fa-paypal:before { content: "\f1ed"; } .fa-google-wallet:before { content: "\f1ee"; } .fa-cc-visa:before { content: "\f1f0"; } .fa-cc-mastercard:before { content: "\f1f1"; } .fa-cc-discover:before { content: "\f1f2"; } .fa-cc-amex:before { content: "\f1f3"; } .fa-cc-paypal:before { content: "\f1f4"; } .fa-cc-stripe:before { content: "\f1f5"; } .fa-bell-slash:before { content: "\f1f6"; } .fa-bell-slash-o:before { content: "\f1f7"; } .fa-trash:before { content: "\f1f8"; } .fa-copyright:before { content: "\f1f9"; } .fa-at:before { content: "\f1fa"; } .fa-eyedropper:before { content: "\f1fb"; } .fa-paint-brush:before { content: "\f1fc"; } .fa-birthday-cake:before { content: "\f1fd"; } .fa-area-chart:before { content: "\f1fe"; } .fa-pie-chart:before { content: "\f200"; } .fa-line-chart:before { content: "\f201"; } .fa-lastfm:before { content: "\f202"; } .fa-lastfm-square:before { content: "\f203"; } .fa-toggle-off:before { content: "\f204"; } .fa-toggle-on:before { content: "\f205"; } .fa-bicycle:before { content: "\f206"; } .fa-bus:before { content: "\f207"; } .fa-ioxhost:before { content: "\f208"; } .fa-angellist:before { content: "\f209"; } .fa-cc:before { content: "\f20a"; } .fa-shekel:before, .fa-sheqel:before, .fa-ils:before { content: "\f20b"; } .fa-meanpath:before { content: "\f20c"; } /*! * * IPython base * */ .modal.fade .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } code { color: #000; } pre { font-size: inherit; line-height: inherit; } label { font-weight: normal; } /* Make the page background atleast 100% the height of the view port */ /* Make the page itself atleast 70% the height of the view port */ .border-box-sizing { box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } .corner-all { border-radius: 2px; } .no-padding { padding: 0px; } /* Flexible box model classes */ /* Taken from Alex Russell http://infrequently.org/2009/08/css-3-progress/ */ /* This file is a compatability layer. It allows the usage of flexible box model layouts accross multiple browsers, including older browsers. The newest, universal implementation of the flexible box model is used when available (see `Modern browsers` comments below). Browsers that are known to implement this new spec completely include: Firefox 28.0+ Chrome 29.0+ Internet Explorer 11+ Opera 17.0+ Browsers not listed, including Safari, are supported via the styling under the `Old browsers` comments below. */ .hbox { /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; } .hbox > * { /* Old browsers */ -webkit-box-flex: 0; -moz-box-flex: 0; box-flex: 0; /* Modern browsers */ flex: none; } .vbox { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; } .vbox > * { /* Old browsers */ -webkit-box-flex: 0; -moz-box-flex: 0; box-flex: 0; /* Modern browsers */ flex: none; } .hbox.reverse, .vbox.reverse, .reverse { /* Old browsers */ -webkit-box-direction: reverse; -moz-box-direction: reverse; box-direction: reverse; /* Modern browsers */ flex-direction: row-reverse; } .hbox.box-flex0, .vbox.box-flex0, .box-flex0 { /* Old browsers */ -webkit-box-flex: 0; -moz-box-flex: 0; box-flex: 0; /* Modern browsers */ flex: none; width: auto; } .hbox.box-flex1, .vbox.box-flex1, .box-flex1 { /* Old browsers */ -webkit-box-flex: 1; -moz-box-flex: 1; box-flex: 1; /* Modern browsers */ flex: 1; } .hbox.box-flex, .vbox.box-flex, .box-flex { /* Old browsers */ /* Old browsers */ -webkit-box-flex: 1; -moz-box-flex: 1; box-flex: 1; /* Modern browsers */ flex: 1; } .hbox.box-flex2, .vbox.box-flex2, .box-flex2 { /* Old browsers */ -webkit-box-flex: 2; -moz-box-flex: 2; box-flex: 2; /* Modern browsers */ flex: 2; } .box-group1 { /* Deprecated */ -webkit-box-flex-group: 1; -moz-box-flex-group: 1; box-flex-group: 1; } .box-group2 { /* Deprecated */ -webkit-box-flex-group: 2; -moz-box-flex-group: 2; box-flex-group: 2; } .hbox.start, .vbox.start, .start { /* Old browsers */ -webkit-box-pack: start; -moz-box-pack: start; box-pack: start; /* Modern browsers */ justify-content: flex-start; } .hbox.end, .vbox.end, .end { /* Old browsers */ -webkit-box-pack: end; -moz-box-pack: end; box-pack: end; /* Modern browsers */ justify-content: flex-end; } .hbox.center, .vbox.center, .center { /* Old browsers */ -webkit-box-pack: center; -moz-box-pack: center; box-pack: center; /* Modern browsers */ justify-content: center; } .hbox.baseline, .vbox.baseline, .baseline { /* Old browsers */ -webkit-box-pack: baseline; -moz-box-pack: baseline; box-pack: baseline; /* Modern browsers */ justify-content: baseline; } .hbox.stretch, .vbox.stretch, .stretch { /* Old browsers */ -webkit-box-pack: stretch; -moz-box-pack: stretch; box-pack: stretch; /* Modern browsers */ justify-content: stretch; } .hbox.align-start, .vbox.align-start, .align-start { /* Old browsers */ -webkit-box-align: start; -moz-box-align: start; box-align: start; /* Modern browsers */ align-items: flex-start; } .hbox.align-end, .vbox.align-end, .align-end { /* Old browsers */ -webkit-box-align: end; -moz-box-align: end; box-align: end; /* Modern browsers */ align-items: flex-end; } .hbox.align-center, .vbox.align-center, .align-center { /* Old browsers */ -webkit-box-align: center; -moz-box-align: center; box-align: center; /* Modern browsers */ align-items: center; } .hbox.align-baseline, .vbox.align-baseline, .align-baseline { /* Old browsers */ -webkit-box-align: baseline; -moz-box-align: baseline; box-align: baseline; /* Modern browsers */ align-items: baseline; } .hbox.align-stretch, .vbox.align-stretch, .align-stretch { /* Old browsers */ -webkit-box-align: stretch; -moz-box-align: stretch; box-align: stretch; /* Modern browsers */ align-items: stretch; } div.error { margin: 2em; text-align: center; } div.error > h1 { font-size: 500%; line-height: normal; } div.error > p { font-size: 200%; line-height: normal; } div.traceback-wrapper { text-align: left; max-width: 800px; margin: auto; } /** * Primary styles * * Author: Jupyter Development Team */ body { background-color: #fff; /* This makes sure that the body covers the entire window and needs to be in a different element than the display: box in wrapper below */ position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; overflow: visible; } body > #header { /* Initially hidden to prevent FLOUC */ display: none; background-color: #fff; /* Display over codemirror */ position: relative; z-index: 100; } body > #header #header-container { padding-bottom: 5px; padding-top: 5px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } body > #header .header-bar { width: 100%; height: 1px; background: #e7e7e7; margin-bottom: -1px; } @media print { body > #header { display: none !important; } } #header-spacer { width: 100%; visibility: hidden; } @media print { #header-spacer { display: none; } } #ipython_notebook { padding-left: 0px; padding-top: 1px; padding-bottom: 1px; } @media (max-width: 991px) { #ipython_notebook { margin-left: 10px; } } #noscript { width: auto; padding-top: 16px; padding-bottom: 16px; text-align: center; font-size: 22px; color: red; font-weight: bold; } #ipython_notebook img { height: 28px; } #site { width: 100%; display: none; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; overflow: auto; } @media print { #site { height: auto !important; } } /* Smaller buttons */ .ui-button .ui-button-text { padding: 0.2em 0.8em; font-size: 77%; } input.ui-button { padding: 0.3em 0.9em; } span#login_widget { float: right; } span#login_widget > .button, #logout { color: #333; background-color: #fff; border-color: #ccc; } span#login_widget > .button:focus, #logout:focus, span#login_widget > .button.focus, #logout.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } span#login_widget > .button:hover, #logout:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } span#login_widget > .button:active, #logout:active, span#login_widget > .button.active, #logout.active, .open > .dropdown-togglespan#login_widget > .button, .open > .dropdown-toggle#logout { color: #333; background-color: #e6e6e6; border-color: #adadad; } span#login_widget > .button:active:hover, #logout:active:hover, span#login_widget > .button.active:hover, #logout.active:hover, .open > .dropdown-togglespan#login_widget > .button:hover, .open > .dropdown-toggle#logout:hover, span#login_widget > .button:active:focus, #logout:active:focus, span#login_widget > .button.active:focus, #logout.active:focus, .open > .dropdown-togglespan#login_widget > .button:focus, .open > .dropdown-toggle#logout:focus, span#login_widget > .button:active.focus, #logout:active.focus, span#login_widget > .button.active.focus, #logout.active.focus, .open > .dropdown-togglespan#login_widget > .button.focus, .open > .dropdown-toggle#logout.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } span#login_widget > .button:active, #logout:active, span#login_widget > .button.active, #logout.active, .open > .dropdown-togglespan#login_widget > .button, .open > .dropdown-toggle#logout { background-image: none; } span#login_widget > .button.disabled:hover, #logout.disabled:hover, span#login_widget > .button[disabled]:hover, #logout[disabled]:hover, fieldset[disabled] span#login_widget > .button:hover, fieldset[disabled] #logout:hover, span#login_widget > .button.disabled:focus, #logout.disabled:focus, span#login_widget > .button[disabled]:focus, #logout[disabled]:focus, fieldset[disabled] span#login_widget > .button:focus, fieldset[disabled] #logout:focus, span#login_widget > .button.disabled.focus, #logout.disabled.focus, span#login_widget > .button[disabled].focus, #logout[disabled].focus, fieldset[disabled] span#login_widget > .button.focus, fieldset[disabled] #logout.focus { background-color: #fff; border-color: #ccc; } span#login_widget > .button .badge, #logout .badge { color: #fff; background-color: #333; } .nav-header { text-transform: none; } #header > span { margin-top: 10px; } .modal_stretch .modal-dialog { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; min-height: 80vh; } .modal_stretch .modal-dialog .modal-body { max-height: calc(100vh - 200px); overflow: auto; flex: 1; } @media (min-width: 768px) { .modal .modal-dialog { width: 700px; } } @media (min-width: 768px) { select.form-control { margin-left: 12px; margin-right: 12px; } } /*! * * IPython auth * */ .center-nav { display: inline-block; margin-bottom: -4px; } /*! * * IPython tree view * */ /* We need an invisible input field on top of the sentense*/ /* "Drag file onto the list ..." */ .alternate_upload { background-color: none; display: inline; } .alternate_upload.form { padding: 0; margin: 0; } .alternate_upload input.fileinput { text-align: center; vertical-align: middle; display: inline; opacity: 0; z-index: 2; width: 12ex; margin-right: -12ex; } .alternate_upload .btn-upload { height: 22px; } /** * Primary styles * * Author: Jupyter Development Team */ ul#tabs { margin-bottom: 4px; } ul#tabs a { padding-top: 6px; padding-bottom: 4px; } ul.breadcrumb a:focus, ul.breadcrumb a:hover { text-decoration: none; } ul.breadcrumb i.icon-home { font-size: 16px; margin-right: 4px; } ul.breadcrumb span { color: #5e5e5e; } .list_toolbar { padding: 4px 0 4px 0; vertical-align: middle; } .list_toolbar .tree-buttons { padding-top: 1px; } .dynamic-buttons { padding-top: 3px; display: inline-block; } .list_toolbar [class*="span"] { min-height: 24px; } .list_header { font-weight: bold; background-color: #EEE; } .list_placeholder { font-weight: bold; padding-top: 4px; padding-bottom: 4px; padding-left: 7px; padding-right: 7px; } .list_container { margin-top: 4px; margin-bottom: 20px; border: 1px solid #ddd; border-radius: 2px; } .list_container > div { border-bottom: 1px solid #ddd; } .list_container > div:hover .list-item { background-color: red; } .list_container > div:last-child { border: none; } .list_item:hover .list_item { background-color: #ddd; } .list_item a { text-decoration: none; } .list_item:hover { background-color: #fafafa; } .list_header > div, .list_item > div { padding-top: 4px; padding-bottom: 4px; padding-left: 7px; padding-right: 7px; line-height: 22px; } .list_header > div input, .list_item > div input { margin-right: 7px; margin-left: 14px; vertical-align: baseline; line-height: 22px; position: relative; top: -1px; } .list_header > div .item_link, .list_item > div .item_link { margin-left: -1px; vertical-align: baseline; line-height: 22px; } .new-file input[type=checkbox] { visibility: hidden; } .item_name { line-height: 22px; height: 24px; } .item_icon { font-size: 14px; color: #5e5e5e; margin-right: 7px; margin-left: 7px; line-height: 22px; vertical-align: baseline; } .item_buttons { line-height: 1em; margin-left: -5px; } .item_buttons .btn, .item_buttons .btn-group, .item_buttons .input-group { float: left; } .item_buttons > .btn, .item_buttons > .btn-group, .item_buttons > .input-group { margin-left: 5px; } .item_buttons .btn { min-width: 13ex; } .item_buttons .running-indicator { padding-top: 4px; color: #5cb85c; } .item_buttons .kernel-name { padding-top: 4px; color: #5bc0de; margin-right: 7px; float: left; } .toolbar_info { height: 24px; line-height: 24px; } .list_item input:not([type=checkbox]) { padding-top: 3px; padding-bottom: 3px; height: 22px; line-height: 14px; margin: 0px; } .highlight_text { color: blue; } #project_name { display: inline-block; padding-left: 7px; margin-left: -2px; } #project_name > .breadcrumb { padding: 0px; margin-bottom: 0px; background-color: transparent; font-weight: bold; } #tree-selector { padding-right: 0px; } #button-select-all { min-width: 50px; } #select-all { margin-left: 7px; margin-right: 2px; } .menu_icon { margin-right: 2px; } .tab-content .row { margin-left: 0px; margin-right: 0px; } .folder_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f114"; } .folder_icon:before.pull-left { margin-right: .3em; } .folder_icon:before.pull-right { margin-left: .3em; } .notebook_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f02d"; position: relative; top: -1px; } .notebook_icon:before.pull-left { margin-right: .3em; } .notebook_icon:before.pull-right { margin-left: .3em; } .running_notebook_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f02d"; position: relative; top: -1px; color: #5cb85c; } .running_notebook_icon:before.pull-left { margin-right: .3em; } .running_notebook_icon:before.pull-right { margin-left: .3em; } .file_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f016"; position: relative; top: -2px; } .file_icon:before.pull-left { margin-right: .3em; } .file_icon:before.pull-right { margin-left: .3em; } #notebook_toolbar .pull-right { padding-top: 0px; margin-right: -1px; } ul#new-menu { left: auto; right: 0; } .kernel-menu-icon { padding-right: 12px; width: 24px; content: "\f096"; } .kernel-menu-icon:before { content: "\f096"; } .kernel-menu-icon-current:before { content: "\f00c"; } #tab_content { padding-top: 20px; } #running .panel-group .panel { margin-top: 3px; margin-bottom: 1em; } #running .panel-group .panel .panel-heading { background-color: #EEE; padding-top: 4px; padding-bottom: 4px; padding-left: 7px; padding-right: 7px; line-height: 22px; } #running .panel-group .panel .panel-heading a:focus, #running .panel-group .panel .panel-heading a:hover { text-decoration: none; } #running .panel-group .panel .panel-body { padding: 0px; } #running .panel-group .panel .panel-body .list_container { margin-top: 0px; margin-bottom: 0px; border: 0px; border-radius: 0px; } #running .panel-group .panel .panel-body .list_container .list_item { border-bottom: 1px solid #ddd; } #running .panel-group .panel .panel-body .list_container .list_item:last-child { border-bottom: 0px; } .delete-button { display: none; } .duplicate-button { display: none; } .rename-button { display: none; } .shutdown-button { display: none; } .dynamic-instructions { display: inline-block; padding-top: 4px; } /*! * * IPython text editor webapp * */ .selected-keymap i.fa { padding: 0px 5px; } .selected-keymap i.fa:before { content: "\f00c"; } #mode-menu { overflow: auto; max-height: 20em; } .edit_app #header { -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); } .edit_app #menubar .navbar { /* Use a negative 1 bottom margin, so the border overlaps the border of the header */ margin-bottom: -1px; } .dirty-indicator { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; width: 20px; } .dirty-indicator.pull-left { margin-right: .3em; } .dirty-indicator.pull-right { margin-left: .3em; } .dirty-indicator-dirty { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; width: 20px; } .dirty-indicator-dirty.pull-left { margin-right: .3em; } .dirty-indicator-dirty.pull-right { margin-left: .3em; } .dirty-indicator-clean { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; width: 20px; } .dirty-indicator-clean.pull-left { margin-right: .3em; } .dirty-indicator-clean.pull-right { margin-left: .3em; } .dirty-indicator-clean:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f00c"; } .dirty-indicator-clean:before.pull-left { margin-right: .3em; } .dirty-indicator-clean:before.pull-right { margin-left: .3em; } #filename { font-size: 16pt; display: table; padding: 0px 5px; } #current-mode { padding-left: 5px; padding-right: 5px; } #texteditor-backdrop { padding-top: 20px; padding-bottom: 20px; } @media not print { #texteditor-backdrop { background-color: #EEE; } } @media print { #texteditor-backdrop #texteditor-container .CodeMirror-gutter, #texteditor-backdrop #texteditor-container .CodeMirror-gutters { background-color: #fff; } } @media not print { #texteditor-backdrop #texteditor-container .CodeMirror-gutter, #texteditor-backdrop #texteditor-container .CodeMirror-gutters { background-color: #fff; } } @media not print { #texteditor-backdrop #texteditor-container { padding: 0px; background-color: #fff; -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); } } /*! * * IPython notebook * */ /* CSS font colors for translated ANSI colors. */ .ansibold { font-weight: bold; } /* use dark versions for foreground, to improve visibility */ .ansiblack { color: black; } .ansired { color: darkred; } .ansigreen { color: darkgreen; } .ansiyellow { color: #c4a000; } .ansiblue { color: darkblue; } .ansipurple { color: darkviolet; } .ansicyan { color: steelblue; } .ansigray { color: gray; } /* and light for background, for the same reason */ .ansibgblack { background-color: black; } .ansibgred { background-color: red; } .ansibggreen { background-color: green; } .ansibgyellow { background-color: yellow; } .ansibgblue { background-color: blue; } .ansibgpurple { background-color: magenta; } .ansibgcyan { background-color: cyan; } .ansibggray { background-color: gray; } div.cell { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; border-radius: 2px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; border-width: 1px; border-style: solid; border-color: transparent; width: 100%; padding: 5px; /* This acts as a spacer between cells, that is outside the border */ margin: 0px; outline: none; border-left-width: 1px; padding-left: 5px; background: linear-gradient(to right, transparent -40px, transparent 1px, transparent 1px, transparent 100%); } div.cell.jupyter-soft-selected { border-left-color: #90CAF9; border-left-color: #E3F2FD; border-left-width: 1px; padding-left: 5px; border-right-color: #E3F2FD; border-right-width: 1px; background: #E3F2FD; } @media print { div.cell.jupyter-soft-selected { border-color: transparent; } } div.cell.selected { border-color: #ababab; border-left-width: 0px; padding-left: 6px; background: linear-gradient(to right, #42A5F5 -40px, #42A5F5 5px, transparent 5px, transparent 100%); } @media print { div.cell.selected { border-color: transparent; } } div.cell.selected.jupyter-soft-selected { border-left-width: 0; padding-left: 6px; background: linear-gradient(to right, #42A5F5 -40px, #42A5F5 7px, #E3F2FD 7px, #E3F2FD 100%); } .edit_mode div.cell.selected { border-color: #66BB6A; border-left-width: 0px; padding-left: 6px; background: linear-gradient(to right, #66BB6A -40px, #66BB6A 5px, transparent 5px, transparent 100%); } @media print { .edit_mode div.cell.selected { border-color: transparent; } } .prompt { /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */ min-width: 14ex; /* This padding is tuned to match the padding on the CodeMirror editor. */ padding: 0.4em; margin: 0px; font-family: monospace; text-align: right; /* This has to match that of the the CodeMirror class line-height below */ line-height: 1.21429em; /* Don't highlight prompt number selection */ -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; /* Use default cursor */ cursor: default; } @media (max-width: 540px) { .prompt { text-align: left; } } div.inner_cell { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; /* Old browsers */ -webkit-box-flex: 1; -moz-box-flex: 1; box-flex: 1; /* Modern browsers */ flex: 1; } @-moz-document url-prefix() { div.inner_cell { overflow-x: hidden; } } /* input_area and input_prompt must match in top border and margin for alignment */ div.input_area { border: 1px solid #cfcfcf; border-radius: 2px; background: #f7f7f7; line-height: 1.21429em; } /* This is needed so that empty prompt areas can collapse to zero height when there is no content in the output_subarea and the prompt. The main purpose of this is to make sure that empty JavaScript output_subareas have no height. */ div.prompt:empty { padding-top: 0; padding-bottom: 0; } div.unrecognized_cell { padding: 5px 5px 5px 0px; /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; } div.unrecognized_cell .inner_cell { border-radius: 2px; padding: 5px; font-weight: bold; color: red; border: 1px solid #cfcfcf; background: #eaeaea; } div.unrecognized_cell .inner_cell a { color: inherit; text-decoration: none; } div.unrecognized_cell .inner_cell a:hover { color: inherit; text-decoration: none; } @media (max-width: 540px) { div.unrecognized_cell > div.prompt { display: none; } } div.code_cell { /* avoid page breaking on code cells when printing */ } @media print { div.code_cell { page-break-inside: avoid; } } /* any special styling for code cells that are currently running goes here */ div.input { page-break-inside: avoid; /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; } @media (max-width: 540px) { div.input { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; } } /* input_area and input_prompt must match in top border and margin for alignment */ div.input_prompt { color: #303F9F; border-top: 1px solid transparent; } div.input_area > div.highlight { margin: 0.4em; border: none; padding: 0px; background-color: transparent; } div.input_area > div.highlight > pre { margin: 0px; border: none; padding: 0px; background-color: transparent; } /* The following gets added to the <head> if it is detected that the user has a * monospace font with inconsistent normal/bold/italic height. See * notebookmain.js. Such fonts will have keywords vertically offset with * respect to the rest of the text. The user should select a better font. * See: https://github.com/ipython/ipython/issues/1503 * * .CodeMirror span { * vertical-align: bottom; * } */ .CodeMirror { line-height: 1.21429em; /* Changed from 1em to our global default */ font-size: 14px; height: auto; /* Changed to auto to autogrow */ background: none; /* Changed from white to allow our bg to show through */ } .CodeMirror-scroll { /* The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/ /* We have found that if it is visible, vertical scrollbars appear with font size changes.*/ overflow-y: hidden; overflow-x: auto; } .CodeMirror-lines { /* In CM2, this used to be 0.4em, but in CM3 it went to 4px. We need the em value because */ /* we have set a different line-height and want this to scale with that. */ padding: 0.4em; } .CodeMirror-linenumber { padding: 0 8px 0 4px; } .CodeMirror-gutters { border-bottom-left-radius: 2px; border-top-left-radius: 2px; } .CodeMirror pre { /* In CM3 this went to 4px from 0 in CM2. We need the 0 value because of how we size */ /* .CodeMirror-lines */ padding: 0; border: 0; border-radius: 0; } /* Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org> Adapted from GitHub theme */ .highlight-base { color: #000; } .highlight-variable { color: #000; } .highlight-variable-2 { color: #1a1a1a; } .highlight-variable-3 { color: #333333; } .highlight-string { color: #BA2121; } .highlight-comment { color: #408080; font-style: italic; } .highlight-number { color: #080; } .highlight-atom { color: #88F; } .highlight-keyword { color: #008000; font-weight: bold; } .highlight-builtin { color: #008000; } .highlight-error { color: #f00; } .highlight-operator { color: #AA22FF; font-weight: bold; } .highlight-meta { color: #AA22FF; } /* previously not defined, copying from default codemirror */ .highlight-def { color: #00f; } .highlight-string-2 { color: #f50; } .highlight-qualifier { color: #555; } .highlight-bracket { color: #997; } .highlight-tag { color: #170; } .highlight-attribute { color: #00c; } .highlight-header { color: blue; } .highlight-quote { color: #090; } .highlight-link { color: #00c; } /* apply the same style to codemirror */ .cm-s-ipython span.cm-keyword { color: #008000; font-weight: bold; } .cm-s-ipython span.cm-atom { color: #88F; } .cm-s-ipython span.cm-number { color: #080; } .cm-s-ipython span.cm-def { color: #00f; } .cm-s-ipython span.cm-variable { color: #000; } .cm-s-ipython span.cm-operator { color: #AA22FF; font-weight: bold; } .cm-s-ipython span.cm-variable-2 { color: #1a1a1a; } .cm-s-ipython span.cm-variable-3 { color: #333333; } .cm-s-ipython span.cm-comment { color: #408080; font-style: italic; } .cm-s-ipython span.cm-string { color: #BA2121; } .cm-s-ipython span.cm-string-2 { color: #f50; } .cm-s-ipython span.cm-meta { color: #AA22FF; } .cm-s-ipython span.cm-qualifier { color: #555; } .cm-s-ipython span.cm-builtin { color: #008000; } .cm-s-ipython span.cm-bracket { color: #997; } .cm-s-ipython span.cm-tag { color: #170; } .cm-s-ipython span.cm-attribute { color: #00c; } .cm-s-ipython span.cm-header { color: blue; } .cm-s-ipython span.cm-quote { color: #090; } .cm-s-ipython span.cm-link { color: #00c; } .cm-s-ipython span.cm-error { color: #f00; } .cm-s-ipython span.cm-tab { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=); background-position: right; background-repeat: no-repeat; } div.output_wrapper { /* this position must be relative to enable descendents to be absolute within it */ position: relative; /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; z-index: 1; } /* class for the output area when it should be height-limited */ div.output_scroll { /* ideally, this would be max-height, but FF barfs all over that */ height: 24em; /* FF needs this *and the wrapper* to specify full width, or it will shrinkwrap */ width: 100%; overflow: auto; border-radius: 2px; -webkit-box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8); box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8); display: block; } /* output div while it is collapsed */ div.output_collapsed { margin: 0px; padding: 0px; /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; } div.out_prompt_overlay { height: 100%; padding: 0px 0.4em; position: absolute; border-radius: 2px; } div.out_prompt_overlay:hover { /* use inner shadow to get border that is computed the same on WebKit/FF */ -webkit-box-shadow: inset 0 0 1px #000; box-shadow: inset 0 0 1px #000; background: rgba(240, 240, 240, 0.5); } div.output_prompt { color: #D84315; } /* This class is the outer container of all output sections. */ div.output_area { padding: 0px; page-break-inside: avoid; /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; } div.output_area .MathJax_Display { text-align: left !important; } div.output_area .rendered_html table { margin-left: 0; margin-right: 0; } div.output_area .rendered_html img { margin-left: 0; margin-right: 0; } div.output_area img, div.output_area svg { max-width: 100%; height: auto; } div.output_area img.unconfined, div.output_area svg.unconfined { max-width: none; } /* This is needed to protect the pre formating from global settings such as that of bootstrap */ .output { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; } @media (max-width: 540px) { div.output_area { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; } } div.output_area pre { margin: 0; padding: 0; border: 0; vertical-align: baseline; color: black; background-color: transparent; border-radius: 0; } /* This class is for the output subarea inside the output_area and after the prompt div. */ div.output_subarea { overflow-x: auto; padding: 0.4em; /* Old browsers */ -webkit-box-flex: 1; -moz-box-flex: 1; box-flex: 1; /* Modern browsers */ flex: 1; max-width: calc(100% - 14ex); } div.output_scroll div.output_subarea { overflow-x: visible; } /* The rest of the output_* classes are for special styling of the different output types */ /* all text output has this class: */ div.output_text { text-align: left; color: #000; /* This has to match that of the the CodeMirror class line-height below */ line-height: 1.21429em; } /* stdout/stderr are 'text' as well as 'stream', but execute_result/error are *not* streams */ div.output_stderr { background: #fdd; /* very light red background for stderr */ } div.output_latex { text-align: left; } /* Empty output_javascript divs should have no height */ div.output_javascript:empty { padding: 0; } .js-error { color: darkred; } /* raw_input styles */ div.raw_input_container { line-height: 1.21429em; padding-top: 5px; } pre.raw_input_prompt { /* nothing needed here. */ } input.raw_input { font-family: monospace; font-size: inherit; color: inherit; width: auto; /* make sure input baseline aligns with prompt */ vertical-align: baseline; /* padding + margin = 0.5em between prompt and cursor */ padding: 0em 0.25em; margin: 0em 0.25em; } input.raw_input:focus { box-shadow: none; } p.p-space { margin-bottom: 10px; } div.output_unrecognized { padding: 5px; font-weight: bold; color: red; } div.output_unrecognized a { color: inherit; text-decoration: none; } div.output_unrecognized a:hover { color: inherit; text-decoration: none; } .rendered_html { color: #000; /* any extras will just be numbers: */ } .rendered_html em { font-style: italic; } .rendered_html strong { font-weight: bold; } .rendered_html u { text-decoration: underline; } .rendered_html :link { text-decoration: underline; } .rendered_html :visited { text-decoration: underline; } .rendered_html h1 { font-size: 185.7%; margin: 1.08em 0 0 0; font-weight: bold; line-height: 1.0; } .rendered_html h2 { font-size: 157.1%; margin: 1.27em 0 0 0; font-weight: bold; line-height: 1.0; } .rendered_html h3 { font-size: 128.6%; margin: 1.55em 0 0 0; font-weight: bold; line-height: 1.0; } .rendered_html h4 { font-size: 100%; margin: 2em 0 0 0; font-weight: bold; line-height: 1.0; } .rendered_html h5 { font-size: 100%; margin: 2em 0 0 0; font-weight: bold; line-height: 1.0; font-style: italic; } .rendered_html h6 { font-size: 100%; margin: 2em 0 0 0; font-weight: bold; line-height: 1.0; font-style: italic; } .rendered_html h1:first-child { margin-top: 0.538em; } .rendered_html h2:first-child { margin-top: 0.636em; } .rendered_html h3:first-child { margin-top: 0.777em; } .rendered_html h4:first-child { margin-top: 1em; } .rendered_html h5:first-child { margin-top: 1em; } .rendered_html h6:first-child { margin-top: 1em; } .rendered_html ul { list-style: disc; margin: 0em 2em; padding-left: 0px; } .rendered_html ul ul { list-style: square; margin: 0em 2em; } .rendered_html ul ul ul { list-style: circle; margin: 0em 2em; } .rendered_html ol { list-style: decimal; margin: 0em 2em; padding-left: 0px; } .rendered_html ol ol { list-style: upper-alpha; margin: 0em 2em; } .rendered_html ol ol ol { list-style: lower-alpha; margin: 0em 2em; } .rendered_html ol ol ol ol { list-style: lower-roman; margin: 0em 2em; } .rendered_html ol ol ol ol ol { list-style: decimal; margin: 0em 2em; } .rendered_html * + ul { margin-top: 1em; } .rendered_html * + ol { margin-top: 1em; } .rendered_html hr { color: black; background-color: black; } .rendered_html pre { margin: 1em 2em; } .rendered_html pre, .rendered_html code { border: 0; background-color: #fff; color: #000; font-size: 100%; padding: 0px; } .rendered_html blockquote { margin: 1em 2em; } .rendered_html table { margin-left: auto; margin-right: auto; border: 1px solid black; border-collapse: collapse; } .rendered_html tr, .rendered_html th, .rendered_html td { border: 1px solid black; border-collapse: collapse; margin: 1em 2em; } .rendered_html td, .rendered_html th { text-align: left; vertical-align: middle; padding: 4px; } .rendered_html th { font-weight: bold; } .rendered_html * + table { margin-top: 1em; } .rendered_html p { text-align: left; } .rendered_html * + p { margin-top: 1em; } .rendered_html img { display: block; margin-left: auto; margin-right: auto; } .rendered_html * + img { margin-top: 1em; } .rendered_html img, .rendered_html svg { max-width: 100%; height: auto; } .rendered_html img.unconfined, .rendered_html svg.unconfined { max-width: none; } div.text_cell { /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; } @media (max-width: 540px) { div.text_cell > div.prompt { display: none; } } div.text_cell_render { /*font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;*/ outline: none; resize: none; width: inherit; border-style: none; padding: 0.5em 0.5em 0.5em 0.4em; color: #000; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } a.anchor-link:link { text-decoration: none; padding: 0px 20px; visibility: hidden; } h1:hover .anchor-link, h2:hover .anchor-link, h3:hover .anchor-link, h4:hover .anchor-link, h5:hover .anchor-link, h6:hover .anchor-link { visibility: visible; } .text_cell.rendered .input_area { display: none; } .text_cell.rendered .rendered_html { overflow-x: auto; overflow-y: hidden; } .text_cell.unrendered .text_cell_render { display: none; } .cm-header-1, .cm-header-2, .cm-header-3, .cm-header-4, .cm-header-5, .cm-header-6 { font-weight: bold; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } .cm-header-1 { font-size: 185.7%; } .cm-header-2 { font-size: 157.1%; } .cm-header-3 { font-size: 128.6%; } .cm-header-4 { font-size: 110%; } .cm-header-5 { font-size: 100%; font-style: italic; } .cm-header-6 { font-size: 100%; font-style: italic; } /*! * * IPython notebook webapp * */ @media (max-width: 767px) { .notebook_app { padding-left: 0px; padding-right: 0px; } } #ipython-main-app { box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; height: 100%; } div#notebook_panel { margin: 0px; padding: 0px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; height: 100%; } div#notebook { font-size: 14px; line-height: 20px; overflow-y: hidden; overflow-x: auto; width: 100%; /* This spaces the page away from the edge of the notebook area */ padding-top: 20px; margin: 0px; outline: none; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; min-height: 100%; } @media not print { #notebook-container { padding: 15px; background-color: #fff; min-height: 0; -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); } } @media print { #notebook-container { width: 100%; } } div.ui-widget-content { border: 1px solid #ababab; outline: none; } pre.dialog { background-color: #f7f7f7; border: 1px solid #ddd; border-radius: 2px; padding: 0.4em; padding-left: 2em; } p.dialog { padding: 0.2em; } /* Word-wrap output correctly. This is the CSS3 spelling, though Firefox seems to not honor it correctly. Webkit browsers (Chrome, rekonq, Safari) do. */ pre, code, kbd, samp { white-space: pre-wrap; } #fonttest { font-family: monospace; } p { margin-bottom: 0; } .end_space { min-height: 100px; transition: height .2s ease; } .notebook_app > #header { -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); } @media not print { .notebook_app { background-color: #EEE; } } kbd { border-style: solid; border-width: 1px; box-shadow: none; margin: 2px; padding-left: 2px; padding-right: 2px; padding-top: 1px; padding-bottom: 1px; } /* CSS for the cell toolbar */ .celltoolbar { border: thin solid #CFCFCF; border-bottom: none; background: #EEE; border-radius: 2px 2px 0px 0px; width: 100%; height: 29px; padding-right: 4px; /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; /* Old browsers */ -webkit-box-pack: end; -moz-box-pack: end; box-pack: end; /* Modern browsers */ justify-content: flex-end; display: -webkit-flex; } @media print { .celltoolbar { display: none; } } .ctb_hideshow { display: none; vertical-align: bottom; } /* ctb_show is added to the ctb_hideshow div to show the cell toolbar. Cell toolbars are only shown when the ctb_global_show class is also set. */ .ctb_global_show .ctb_show.ctb_hideshow { display: block; } .ctb_global_show .ctb_show + .input_area, .ctb_global_show .ctb_show + div.text_cell_input, .ctb_global_show .ctb_show ~ div.text_cell_render { border-top-right-radius: 0px; border-top-left-radius: 0px; } .ctb_global_show .ctb_show ~ div.text_cell_render { border: 1px solid #cfcfcf; } .celltoolbar { font-size: 87%; padding-top: 3px; } .celltoolbar select { display: block; width: 100%; height: 32px; padding: 6px 12px; font-size: 13px; line-height: 1.42857143; color: #555555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 2px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -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; height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 1px; width: inherit; font-size: inherit; height: 22px; padding: 0px; display: inline-block; } .celltoolbar select:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); } .celltoolbar select::-moz-placeholder { color: #999; opacity: 1; } .celltoolbar select:-ms-input-placeholder { color: #999; } .celltoolbar select::-webkit-input-placeholder { color: #999; } .celltoolbar select::-ms-expand { border: 0; background-color: transparent; } .celltoolbar select[disabled], .celltoolbar select[readonly], fieldset[disabled] .celltoolbar select { background-color: #eeeeee; opacity: 1; } .celltoolbar select[disabled], fieldset[disabled] .celltoolbar select { cursor: not-allowed; } textarea.celltoolbar select { height: auto; } select.celltoolbar select { height: 30px; line-height: 30px; } textarea.celltoolbar select, select[multiple].celltoolbar select { height: auto; } .celltoolbar label { margin-left: 5px; margin-right: 5px; } .completions { position: absolute; z-index: 110; overflow: hidden; border: 1px solid #ababab; border-radius: 2px; -webkit-box-shadow: 0px 6px 10px -1px #adadad; box-shadow: 0px 6px 10px -1px #adadad; line-height: 1; } .completions select { background: white; outline: none; border: none; padding: 0px; margin: 0px; overflow: auto; font-family: monospace; font-size: 110%; color: #000; width: auto; } .completions select option.context { color: #286090; } #kernel_logo_widget { float: right !important; float: right; } #kernel_logo_widget .current_kernel_logo { display: none; margin-top: -1px; margin-bottom: -1px; width: 32px; height: 32px; } #menubar { box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; margin-top: 1px; } #menubar .navbar { border-top: 1px; border-radius: 0px 0px 2px 2px; margin-bottom: 0px; } #menubar .navbar-toggle { float: left; padding-top: 7px; padding-bottom: 7px; border: none; } #menubar .navbar-collapse { clear: left; } .nav-wrapper { border-bottom: 1px solid #e7e7e7; } i.menu-icon { padding-top: 4px; } ul#help_menu li a { overflow: hidden; padding-right: 2.2em; } ul#help_menu li a i { margin-right: -1.2em; } .dropdown-submenu { position: relative; } .dropdown-submenu > .dropdown-menu { top: 0; left: 100%; margin-top: -6px; margin-left: -1px; } .dropdown-submenu:hover > .dropdown-menu { display: block; } .dropdown-submenu > a:after { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; display: block; content: "\f0da"; float: right; color: #333333; margin-top: 2px; margin-right: -10px; } .dropdown-submenu > a:after.pull-left { margin-right: .3em; } .dropdown-submenu > a:after.pull-right { margin-left: .3em; } .dropdown-submenu:hover > a:after { color: #262626; } .dropdown-submenu.pull-left { float: none; } .dropdown-submenu.pull-left > .dropdown-menu { left: -100%; margin-left: 10px; } #notification_area { float: right !important; float: right; z-index: 10; } .indicator_area { float: right !important; float: right; color: #777; margin-left: 5px; margin-right: 5px; width: 11px; z-index: 10; text-align: center; width: auto; } #kernel_indicator { float: right !important; float: right; color: #777; margin-left: 5px; margin-right: 5px; width: 11px; z-index: 10; text-align: center; width: auto; border-left: 1px solid; } #kernel_indicator .kernel_indicator_name { padding-left: 5px; padding-right: 5px; } #modal_indicator { float: right !important; float: right; color: #777; margin-left: 5px; margin-right: 5px; width: 11px; z-index: 10; text-align: center; width: auto; } #readonly-indicator { float: right !important; float: right; color: #777; margin-left: 5px; margin-right: 5px; width: 11px; z-index: 10; text-align: center; width: auto; margin-top: 2px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; display: none; } .modal_indicator:before { width: 1.28571429em; text-align: center; } .edit_mode .modal_indicator:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f040"; } .edit_mode .modal_indicator:before.pull-left { margin-right: .3em; } .edit_mode .modal_indicator:before.pull-right { margin-left: .3em; } .command_mode .modal_indicator:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: ' '; } .command_mode .modal_indicator:before.pull-left { margin-right: .3em; } .command_mode .modal_indicator:before.pull-right { margin-left: .3em; } .kernel_idle_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f10c"; } .kernel_idle_icon:before.pull-left { margin-right: .3em; } .kernel_idle_icon:before.pull-right { margin-left: .3em; } .kernel_busy_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f111"; } .kernel_busy_icon:before.pull-left { margin-right: .3em; } .kernel_busy_icon:before.pull-right { margin-left: .3em; } .kernel_dead_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f1e2"; } .kernel_dead_icon:before.pull-left { margin-right: .3em; } .kernel_dead_icon:before.pull-right { margin-left: .3em; } .kernel_disconnected_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f127"; } .kernel_disconnected_icon:before.pull-left { margin-right: .3em; } .kernel_disconnected_icon:before.pull-right { margin-left: .3em; } .notification_widget { color: #777; z-index: 10; background: rgba(240, 240, 240, 0.5); margin-right: 4px; color: #333; background-color: #fff; border-color: #ccc; } .notification_widget:focus, .notification_widget.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } .notification_widget:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } .notification_widget:active, .notification_widget.active, .open > .dropdown-toggle.notification_widget { color: #333; background-color: #e6e6e6; border-color: #adadad; } .notification_widget:active:hover, .notification_widget.active:hover, .open > .dropdown-toggle.notification_widget:hover, .notification_widget:active:focus, .notification_widget.active:focus, .open > .dropdown-toggle.notification_widget:focus, .notification_widget:active.focus, .notification_widget.active.focus, .open > .dropdown-toggle.notification_widget.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } .notification_widget:active, .notification_widget.active, .open > .dropdown-toggle.notification_widget { background-image: none; } .notification_widget.disabled:hover, .notification_widget[disabled]:hover, fieldset[disabled] .notification_widget:hover, .notification_widget.disabled:focus, .notification_widget[disabled]:focus, fieldset[disabled] .notification_widget:focus, .notification_widget.disabled.focus, .notification_widget[disabled].focus, fieldset[disabled] .notification_widget.focus { background-color: #fff; border-color: #ccc; } .notification_widget .badge { color: #fff; background-color: #333; } .notification_widget.warning { color: #fff; background-color: #f0ad4e; border-color: #eea236; } .notification_widget.warning:focus, .notification_widget.warning.focus { color: #fff; background-color: #ec971f; border-color: #985f0d; } .notification_widget.warning:hover { color: #fff; background-color: #ec971f; border-color: #d58512; } .notification_widget.warning:active, .notification_widget.warning.active, .open > .dropdown-toggle.notification_widget.warning { color: #fff; background-color: #ec971f; border-color: #d58512; } .notification_widget.warning:active:hover, .notification_widget.warning.active:hover, .open > .dropdown-toggle.notification_widget.warning:hover, .notification_widget.warning:active:focus, .notification_widget.warning.active:focus, .open > .dropdown-toggle.notification_widget.warning:focus, .notification_widget.warning:active.focus, .notification_widget.warning.active.focus, .open > .dropdown-toggle.notification_widget.warning.focus { color: #fff; background-color: #d58512; border-color: #985f0d; } .notification_widget.warning:active, .notification_widget.warning.active, .open > .dropdown-toggle.notification_widget.warning { background-image: none; } .notification_widget.warning.disabled:hover, .notification_widget.warning[disabled]:hover, fieldset[disabled] .notification_widget.warning:hover, .notification_widget.warning.disabled:focus, .notification_widget.warning[disabled]:focus, fieldset[disabled] .notification_widget.warning:focus, .notification_widget.warning.disabled.focus, .notification_widget.warning[disabled].focus, fieldset[disabled] .notification_widget.warning.focus { background-color: #f0ad4e; border-color: #eea236; } .notification_widget.warning .badge { color: #f0ad4e; background-color: #fff; } .notification_widget.success { color: #fff; background-color: #5cb85c; border-color: #4cae4c; } .notification_widget.success:focus, .notification_widget.success.focus { color: #fff; background-color: #449d44; border-color: #255625; } .notification_widget.success:hover { color: #fff; background-color: #449d44; border-color: #398439; } .notification_widget.success:active, .notification_widget.success.active, .open > .dropdown-toggle.notification_widget.success { color: #fff; background-color: #449d44; border-color: #398439; } .notification_widget.success:active:hover, .notification_widget.success.active:hover, .open > .dropdown-toggle.notification_widget.success:hover, .notification_widget.success:active:focus, .notification_widget.success.active:focus, .open > .dropdown-toggle.notification_widget.success:focus, .notification_widget.success:active.focus, .notification_widget.success.active.focus, .open > .dropdown-toggle.notification_widget.success.focus { color: #fff; background-color: #398439; border-color: #255625; } .notification_widget.success:active, .notification_widget.success.active, .open > .dropdown-toggle.notification_widget.success { background-image: none; } .notification_widget.success.disabled:hover, .notification_widget.success[disabled]:hover, fieldset[disabled] .notification_widget.success:hover, .notification_widget.success.disabled:focus, .notification_widget.success[disabled]:focus, fieldset[disabled] .notification_widget.success:focus, .notification_widget.success.disabled.focus, .notification_widget.success[disabled].focus, fieldset[disabled] .notification_widget.success.focus { background-color: #5cb85c; border-color: #4cae4c; } .notification_widget.success .badge { color: #5cb85c; background-color: #fff; } .notification_widget.info { color: #fff; background-color: #5bc0de; border-color: #46b8da; } .notification_widget.info:focus, .notification_widget.info.focus { color: #fff; background-color: #31b0d5; border-color: #1b6d85; } .notification_widget.info:hover { color: #fff; background-color: #31b0d5; border-color: #269abc; } .notification_widget.info:active, .notification_widget.info.active, .open > .dropdown-toggle.notification_widget.info { color: #fff; background-color: #31b0d5; border-color: #269abc; } .notification_widget.info:active:hover, .notification_widget.info.active:hover, .open > .dropdown-toggle.notification_widget.info:hover, .notification_widget.info:active:focus, .notification_widget.info.active:focus, .open > .dropdown-toggle.notification_widget.info:focus, .notification_widget.info:active.focus, .notification_widget.info.active.focus, .open > .dropdown-toggle.notification_widget.info.focus { color: #fff; background-color: #269abc; border-color: #1b6d85; } .notification_widget.info:active, .notification_widget.info.active, .open > .dropdown-toggle.notification_widget.info { background-image: none; } .notification_widget.info.disabled:hover, .notification_widget.info[disabled]:hover, fieldset[disabled] .notification_widget.info:hover, .notification_widget.info.disabled:focus, .notification_widget.info[disabled]:focus, fieldset[disabled] .notification_widget.info:focus, .notification_widget.info.disabled.focus, .notification_widget.info[disabled].focus, fieldset[disabled] .notification_widget.info.focus { background-color: #5bc0de; border-color: #46b8da; } .notification_widget.info .badge { color: #5bc0de; background-color: #fff; } .notification_widget.danger { color: #fff; background-color: #d9534f; border-color: #d43f3a; } .notification_widget.danger:focus, .notification_widget.danger.focus { color: #fff; background-color: #c9302c; border-color: #761c19; } .notification_widget.danger:hover { color: #fff; background-color: #c9302c; border-color: #ac2925; } .notification_widget.danger:active, .notification_widget.danger.active, .open > .dropdown-toggle.notification_widget.danger { color: #fff; background-color: #c9302c; border-color: #ac2925; } .notification_widget.danger:active:hover, .notification_widget.danger.active:hover, .open > .dropdown-toggle.notification_widget.danger:hover, .notification_widget.danger:active:focus, .notification_widget.danger.active:focus, .open > .dropdown-toggle.notification_widget.danger:focus, .notification_widget.danger:active.focus, .notification_widget.danger.active.focus, .open > .dropdown-toggle.notification_widget.danger.focus { color: #fff; background-color: #ac2925; border-color: #761c19; } .notification_widget.danger:active, .notification_widget.danger.active, .open > .dropdown-toggle.notification_widget.danger { background-image: none; } .notification_widget.danger.disabled:hover, .notification_widget.danger[disabled]:hover, fieldset[disabled] .notification_widget.danger:hover, .notification_widget.danger.disabled:focus, .notification_widget.danger[disabled]:focus, fieldset[disabled] .notification_widget.danger:focus, .notification_widget.danger.disabled.focus, .notification_widget.danger[disabled].focus, fieldset[disabled] .notification_widget.danger.focus { background-color: #d9534f; border-color: #d43f3a; } .notification_widget.danger .badge { color: #d9534f; background-color: #fff; } div#pager { background-color: #fff; font-size: 14px; line-height: 20px; overflow: hidden; display: none; position: fixed; bottom: 0px; width: 100%; max-height: 50%; padding-top: 8px; -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); /* Display over codemirror */ z-index: 100; /* Hack which prevents jquery ui resizable from changing top. */ top: auto !important; } div#pager pre { line-height: 1.21429em; color: #000; background-color: #f7f7f7; padding: 0.4em; } div#pager #pager-button-area { position: absolute; top: 8px; right: 20px; } div#pager #pager-contents { position: relative; overflow: auto; width: 100%; height: 100%; } div#pager #pager-contents #pager-container { position: relative; padding: 15px 0px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } div#pager .ui-resizable-handle { top: 0px; height: 8px; background: #f7f7f7; border-top: 1px solid #cfcfcf; border-bottom: 1px solid #cfcfcf; /* This injects handle bars (a short, wide = symbol) for the resize handle. */ } div#pager .ui-resizable-handle::after { content: ''; top: 2px; left: 50%; height: 3px; width: 30px; margin-left: -15px; position: absolute; border-top: 1px solid #cfcfcf; } .quickhelp { /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; line-height: 1.8em; } .shortcut_key { display: inline-block; width: 20ex; text-align: right; font-family: monospace; } .shortcut_descr { display: inline-block; /* Old browsers */ -webkit-box-flex: 1; -moz-box-flex: 1; box-flex: 1; /* Modern browsers */ flex: 1; } span.save_widget { margin-top: 6px; } span.save_widget span.filename { height: 1em; line-height: 1em; padding: 3px; margin-left: 16px; border: none; font-size: 146.5%; border-radius: 2px; } span.save_widget span.filename:hover { background-color: #e6e6e6; } span.checkpoint_status, span.autosave_status { font-size: small; } @media (max-width: 767px) { span.save_widget { font-size: small; } span.checkpoint_status, span.autosave_status { display: none; } } @media (min-width: 768px) and (max-width: 991px) { span.checkpoint_status { display: none; } span.autosave_status { font-size: x-small; } } .toolbar { padding: 0px; margin-left: -5px; margin-top: 2px; margin-bottom: 5px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } .toolbar select, .toolbar label { width: auto; vertical-align: middle; margin-right: 2px; margin-bottom: 0px; display: inline; font-size: 92%; margin-left: 0.3em; margin-right: 0.3em; padding: 0px; padding-top: 3px; } .toolbar .btn { padding: 2px 8px; } .toolbar .btn-group { margin-top: 0px; margin-left: 5px; } #maintoolbar { margin-bottom: -3px; margin-top: -8px; border: 0px; min-height: 27px; margin-left: 0px; padding-top: 11px; padding-bottom: 3px; } #maintoolbar .navbar-text { float: none; vertical-align: middle; text-align: right; margin-left: 5px; margin-right: 0px; margin-top: 0px; } .select-xs { height: 24px; } .pulse, .dropdown-menu > li > a.pulse, li.pulse > a.dropdown-toggle, li.pulse.open > a.dropdown-toggle { background-color: #F37626; color: white; } /** * Primary styles * * Author: Jupyter Development Team */ /** WARNING IF YOU ARE EDITTING THIS FILE, if this is a .css file, It has a lot * of chance of beeing generated from the ../less/[samename].less file, you can * try to get back the less file by reverting somme commit in history **/ /* * We'll try to get something pretty, so we * have some strange css to have the scroll bar on * the left with fix button on the top right of the tooltip */ @-moz-keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } @-webkit-keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } @-moz-keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @-webkit-keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /*properties of tooltip after "expand"*/ .bigtooltip { overflow: auto; height: 200px; -webkit-transition-property: height; -webkit-transition-duration: 500ms; -moz-transition-property: height; -moz-transition-duration: 500ms; transition-property: height; transition-duration: 500ms; } /*properties of tooltip before "expand"*/ .smalltooltip { -webkit-transition-property: height; -webkit-transition-duration: 500ms; -moz-transition-property: height; -moz-transition-duration: 500ms; transition-property: height; transition-duration: 500ms; text-overflow: ellipsis; overflow: hidden; height: 80px; } .tooltipbuttons { position: absolute; padding-right: 15px; top: 0px; right: 0px; } .tooltiptext { /*avoid the button to overlap on some docstring*/ padding-right: 30px; } .ipython_tooltip { max-width: 700px; /*fade-in animation when inserted*/ -webkit-animation: fadeOut 400ms; -moz-animation: fadeOut 400ms; animation: fadeOut 400ms; -webkit-animation: fadeIn 400ms; -moz-animation: fadeIn 400ms; animation: fadeIn 400ms; vertical-align: middle; background-color: #f7f7f7; overflow: visible; border: #ababab 1px solid; outline: none; padding: 3px; margin: 0px; padding-left: 7px; font-family: monospace; min-height: 50px; -moz-box-shadow: 0px 6px 10px -1px #adadad; -webkit-box-shadow: 0px 6px 10px -1px #adadad; box-shadow: 0px 6px 10px -1px #adadad; border-radius: 2px; position: absolute; z-index: 1000; } .ipython_tooltip a { float: right; } .ipython_tooltip .tooltiptext pre { border: 0; border-radius: 0; font-size: 100%; background-color: #f7f7f7; } .pretooltiparrow { left: 0px; margin: 0px; top: -16px; width: 40px; height: 16px; overflow: hidden; position: absolute; } .pretooltiparrow:before { background-color: #f7f7f7; border: 1px #ababab solid; z-index: 11; content: ""; position: absolute; left: 15px; top: 10px; width: 25px; height: 25px; -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -ms-transform: rotate(45deg); -o-transform: rotate(45deg); } ul.typeahead-list i { margin-left: -10px; width: 18px; } ul.typeahead-list { max-height: 80vh; overflow: auto; } ul.typeahead-list > li > a { /** Firefox bug **/ /* see https://github.com/jupyter/notebook/issues/559 */ white-space: normal; } .cmd-palette .modal-body { padding: 7px; } .cmd-palette form { background: white; } .cmd-palette input { outline: none; } .no-shortcut { display: none; } .command-shortcut:before { content: "(command)"; padding-right: 3px; color: #777777; } .edit-shortcut:before { content: "(edit)"; padding-right: 3px; color: #777777; } #find-and-replace #replace-preview .match, #find-and-replace #replace-preview .insert { background-color: #BBDEFB; border-color: #90CAF9; border-style: solid; border-width: 1px; border-radius: 0px; } #find-and-replace #replace-preview .replace .match { background-color: #FFCDD2; border-color: #EF9A9A; border-radius: 0px; } #find-and-replace #replace-preview .replace .insert { background-color: #C8E6C9; border-color: #A5D6A7; border-radius: 0px; } #find-and-replace #replace-preview { max-height: 60vh; overflow: auto; } #find-and-replace #replace-preview pre { padding: 5px 10px; } .terminal-app { background: #EEE; } .terminal-app #header { background: #fff; -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); } .terminal-app .terminal { float: left; font-family: monospace; color: white; background: black; padding: 0.4em; border-radius: 2px; -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.4); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.4); } .terminal-app .terminal, .terminal-app .terminal dummy-screen { line-height: 1em; font-size: 14px; } .terminal-app .terminal-cursor { color: black; background: white; } .terminal-app #terminado-container { margin-top: 20px; } /*# sourceMappingURL=style.min.css.map */ </style> <style type="text/css"> .highlight .hll { background-color: #ffffcc } .highlight { background: #f8f8f8; } .highlight .c { color: #408080; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #FF0000 } /* Error */ .highlight .k { color: #008000; font-weight: bold } /* Keyword */ .highlight .o { color: #666666 } /* Operator */ .highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */ .highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #BC7A00 } /* Comment.Preproc */ .highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */ .highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */ .highlight .cs { color: #408080; font-style: italic } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #FF0000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .highlight .gt { color: #0044DD } /* Generic.Traceback */ .highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008000 } /* Keyword.Pseudo */ .highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #B00040 } /* Keyword.Type */ .highlight .m { color: #666666 } /* Literal.Number */ .highlight .s { color: #BA2121 } /* Literal.String */ .highlight .na { color: #7D9029 } /* Name.Attribute */ .highlight .nb { color: #008000 } /* Name.Builtin */ .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ .highlight .no { color: #880000 } /* Name.Constant */ .highlight .nd { color: #AA22FF } /* Name.Decorator */ .highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ .highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0000FF } /* Name.Function */ .highlight .nl { color: #A0A000 } /* Name.Label */ .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #19177C } /* Name.Variable */ .highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #666666 } /* Literal.Number.Bin */ .highlight .mf { color: #666666 } /* Literal.Number.Float */ .highlight .mh { color: #666666 } /* Literal.Number.Hex */ .highlight .mi { color: #666666 } /* Literal.Number.Integer */ .highlight .mo { color: #666666 } /* Literal.Number.Oct */ .highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ .highlight .sc { color: #BA2121 } /* Literal.String.Char */ .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #BA2121 } /* Literal.String.Double */ .highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ .highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ .highlight .sx { color: #008000 } /* Literal.String.Other */ .highlight .sr { color: #BB6688 } /* Literal.String.Regex */ .highlight .s1 { color: #BA2121 } /* Literal.String.Single */ .highlight .ss { color: #19177C } /* Literal.String.Symbol */ .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ .highlight .vc { color: #19177C } /* Name.Variable.Class */ .highlight .vg { color: #19177C } /* Name.Variable.Global */ .highlight .vi { color: #19177C } /* Name.Variable.Instance */ .highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ </style> <style type="text/css"> /* Temporary definitions which will become obsolete with Notebook release 5.0 */ .ansi-black-fg { color: #3E424D; } .ansi-black-bg { background-color: #3E424D; } .ansi-black-intense-fg { color: #282C36; } .ansi-black-intense-bg { background-color: #282C36; } .ansi-red-fg { color: #E75C58; } .ansi-red-bg { background-color: #E75C58; } .ansi-red-intense-fg { color: #B22B31; } .ansi-red-intense-bg { background-color: #B22B31; } .ansi-green-fg { color: #00A250; } .ansi-green-bg { background-color: #00A250; } .ansi-green-intense-fg { color: #007427; } .ansi-green-intense-bg { background-color: #007427; } .ansi-yellow-fg { color: #DDB62B; } .ansi-yellow-bg { background-color: #DDB62B; } .ansi-yellow-intense-fg { color: #B27D12; } .ansi-yellow-intense-bg { background-color: #B27D12; } .ansi-blue-fg { color: #208FFB; } .ansi-blue-bg { background-color: #208FFB; } .ansi-blue-intense-fg { color: #0065CA; } .ansi-blue-intense-bg { background-color: #0065CA; } .ansi-magenta-fg { color: #D160C4; } .ansi-magenta-bg { background-color: #D160C4; } .ansi-magenta-intense-fg { color: #A03196; } .ansi-magenta-intense-bg { background-color: #A03196; } .ansi-cyan-fg { color: #60C6C8; } .ansi-cyan-bg { background-color: #60C6C8; } .ansi-cyan-intense-fg { color: #258F8F; } .ansi-cyan-intense-bg { background-color: #258F8F; } .ansi-white-fg { color: #C5C1B4; } .ansi-white-bg { background-color: #C5C1B4; } .ansi-white-intense-fg { color: #A1A6B2; } .ansi-white-intense-bg { background-color: #A1A6B2; } .ansi-bold { font-weight: bold; } </style> <style type="text/css"> /* Overrides of notebook CSS for static HTML export */ .reveal { font-size: 160%; overflow-y: scroll; } .reveal pre { width: inherit; padding: 0.4em; margin: 0px; font-family: monospace, sans-serif; font-size: 80%; box-shadow: 0px 0px 0px rgba(0, 0, 0, 0); } .reveal pre code { padding: 0px; } .reveal section img { border: 0px solid black; box-shadow: 0 0 10px rgba(0, 0, 0, 0); } .reveal i { font-style: normal; font-family: FontAwesome; font-size: 2em; } .reveal .slides { text-align: left; } .reveal.fade { opacity: 1; } .reveal .progress { position: static; } div.input_area { padding: 0.06em; } div.code_cell { background-color: transparent; } div.prompt { width: 11ex; padding: 0.4em; margin: 0px; font-family: monospace, sans-serif; font-size: 80%; text-align: right; } div.output_area pre { font-family: monospace, sans-serif; font-size: 80%; } div.output_prompt { /* 5px right shift to account for margin in parent container */ margin: 5px 5px 0 0; } div.text_cell.rendered .rendered_html { /* The H1 height seems miscalculated, we are just hidding the scrollbar */ overflow-y: hidden; } a.anchor-link { /* There is still an anchor, we are only hidding it */ display: none; } .rendered_html p { text-align: inherit; } </style> <!-- Custom stylesheet, it must be in the same directory as the html file --> <link rel="stylesheet" href="custom.css"> </head> <body> <div class="reveal"> <div class="slides"> <section><section> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="7-Reasons-Why-I-<3-Python">7 Reasons Why I <3 Python<a class="anchor-link" href="#7-Reasons-Why-I-<3-Python">¶</a></h1><p><img src="assets/8324418418_fd96aa2a4d_z.jpg"/> <!-- https://www.flickr.com/photos/46990836@N03/8324418418/in/photolist-dFAPzu-84UDhW-5GLqRK-5GLmmH-5GQPgy-dHWLKu-nko93Q-ssYxi-iTzLxq-eFFN1v-9BiGdV-rnkoGd-nkoP4z-5MazPG-6xS62e-nvGUoC-kE4q4E-anVJs5-5GQFnq-nkowMh-qTy55d-8kFagv-nkonHf-puxpDp-5GLnzc-3LV5nd-pXGaMS-5GQDKL-Jvujy-netUoC-5GLoUZ-6TnLfc-dABayk-bW2VvT-23GScN-bGyDM-5WwnHr-5BBcoR-csNGwL-e8TK7k-5GQEJs-9pnCNb-nkohSJ-dFvpe6-9kiSMS-7jnd94-7iPM12-5pstA5-j8TwuU-5GLzbr --></p> <h2 id="Keith-Maull-/-Sep.-14,-2016-/-Galvanize-gSchool-Boulder">Keith Maull / Sep. 14, 2016 / Galvanize gSchool Boulder<a class="anchor-link" href="#Keith-Maull-/-Sep.-14,-2016-/-Galvanize-gSchool-Boulder">¶</a></h2> </div> </div> </div></section></section><section><section> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="1.-It-is-beautiful,-clean-and-precise">1. It is beautiful, clean and precise<a class="anchor-link" href="#1.-It-is-beautiful,-clean-and-precise">¶</a></h1><p><img src="assets/3717019943_7e6637b322_z.jpg"/> <!-- https://www.flickr.com/photos/noodlefish/3717019943/in/photolist-fCfsFK-8skXjU-nAUYLu-7MVBXq-6poidm-8MMFdC-PMWrY-JMkZD-fCfsJP-2NKdk6-2Vft6H-af65YT-4SaCFj-5zx1T8-9W5SpL-JMm14-6h4SR1-qFsmnC-4R4PwH-5KvWdE-addunC-48RV8J-d2P53q-2gptSR-JMkZB-hDuYtP-8FsTtq-dWVKso-JMm12-f4iCPs-6EsGwK-32PBax-f6W9iS-6EsFHi-f6mxBd-fCfsFH-f67gX6-8QjEFY-6Hsb4o-6EwSXQ-JMiD6-5FtQ8z-2gucC1-2gpjV6-2gptUX-3cAS3L-f67gpg-5b4bYW-nRmMYh-nVbCtZ --></p> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [1]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">gcd</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">):</span> <span class="k">while</span> <span class="n">b</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="o">%</span><span class="k">b</span> <span class="k">return</span> <span class="n">a</span> <span class="n">tests</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">216</span><span class="p">,</span><span class="mi">846</span><span class="p">),</span> <span class="p">(</span><span class="mi">1071</span><span class="p">,</span><span class="mi">462</span><span class="p">),</span> <span class="p">(</span><span class="mi">1024</span><span class="p">,</span><span class="mi">768</span><span class="p">)]</span> <span class="k">for</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">tests</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s2">"The gcd of {} and {} is {}."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">gcd</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)))</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt"></div> <div class="output_subarea output_stream output_stdout output_text"> <pre>The gcd of 216 and 846 is 18. The gcd of 1071 and 462 is 21. The gcd of 1024 and 768 is 256. </pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [2]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="k">if</span> <span class="mi">1</span> <span class="ow">and</span> <span class="bp">True</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s2">"1 and True is True"</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span><span class="p">(</span><span class="mi">0</span> <span class="ow">or</span> <span class="bp">False</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="s2">"0 or False is False"</span><span class="p">)</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt"></div> <div class="output_subarea output_stream output_stdout output_text"> <pre>1 and True is True 0 or False is False </pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [3]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">outer</span><span class="p">(</span><span class="n">v1</span><span class="p">,</span> <span class="n">v2</span><span class="p">):</span> <span class="c1"># defining a nested function</span> <span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="n">iv1</span><span class="p">,</span> <span class="n">iv2</span><span class="p">):</span> <span class="k">print</span><span class="p">(</span><span class="s2">"Outer v1={}, Outer v2={}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">v1</span><span class="p">,</span> <span class="n">v2</span><span class="p">))</span> <span class="k">print</span><span class="p">(</span><span class="s2">"Outer iv1={}, Outer iv2={}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">iv1</span><span class="p">,</span> <span class="n">iv2</span><span class="p">))</span> <span class="n">inner</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span> <span class="n">outer</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt"></div> <div class="output_subarea output_stream output_stdout output_text"> <pre>Outer v1=1, Outer v2=2 Outer iv1=3, Outer iv2=4 </pre> </div> </div> </div> </div> </div></section></section><section><section> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="2.-Text-and-Strings-are-a-joy-to-work-with!">2. Text and Strings are a joy to work with!<a class="anchor-link" href="#2.-Text-and-Strings-are-a-joy-to-work-with!">¶</a></h1><p><img src="assets/157789902_ee3c6092b7_z.jpg"/> <!-- https://www.flickr.com/photos/76283671@N00/157789902/in/photolist-eWHry-3p5xPR-9KvWoj-8EPNse-8hHfXJ-aDGD5X-74VGBk-5EA2Gw-8SUDFg-63S4Gn-8W6FV-8yXuVZ-8z1zM5-cQiWxu-8acKHx-avHUv6-FSeczR-aXRjnp-a66RN5-9wVi9p-Am2g-avLxeY-9o3Q7f-2YEhMQ-9fCbAN-4CkWu8-bXiwuY-92VoHu-bCbYXP-CaK6BB-mEpxvX-6Ctruz-axKSdr-3dBZ3f-52LLAo-52JqBR-s57ww-9WqcpG-2BM7qe-6mVdFd-bDKMrc-7eV4Lm-UMkAg-5ULJBL-ad2qsh-ayHw4M-a4weRB-aXTXwD-4Cqfzd-fBmx4 --></p> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [4]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">lorem_text</span> <span class="o">=</span> <span class="s2">"""</span> <span class="s2">Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed iaculis sapien, vitae vestibulum nunc. Vivamus pharetra risus neque, ut iaculis elit porta non. Vivamus ullamcorper dolor sit amet sollicitudin vehicula. Aliquam quis tristique nibh, eget malesuada purus. Proin varius sollicitudin turpis, fermentum mollis elit cursus vel. Suspendisse vehicula enim ac magna consequat ultricies. Pellentesque in leo et nulla porta faucibus. Quisque tincidunt in erat ut commodo. Quisque id augue a nisl mollis pulvinar id at nulla. Morbi a augue erat. Sed pharetra molestie mauris nec ultricies. Pellentesque efficitur blandit mauris, sed vulputate ante bibendum eu. Nulla facilisi. Sed porta massa eu ligula tristique, nec hendrerit elit euismod. Phasellus luctus placerat facilisis.</span> <span class="s2">"""</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">lorem_text</span><span class="o">.</span><span class="n">split</span><span class="p">():</span> <span class="k">print</span> <span class="n">t</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt"></div> <div class="output_subarea output_stream output_stdout output_text"> <pre>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed iaculis sapien, vitae vestibulum nunc. Vivamus pharetra risus neque, ut iaculis elit porta non. Vivamus ullamcorper dolor sit amet sollicitudin vehicula. Aliquam quis tristique nibh, eget malesuada purus. Proin varius sollicitudin turpis, fermentum mollis elit cursus vel. Suspendisse vehicula enim ac magna consequat ultricies. Pellentesque in leo et nulla porta faucibus. Quisque tincidunt in erat ut commodo. Quisque id augue a nisl mollis pulvinar id at nulla. Morbi a augue erat. Sed pharetra molestie mauris nec ultricies. Pellentesque efficitur blandit mauris, sed vulputate ante bibendum eu. Nulla facilisi. Sed porta massa eu ligula tristique, nec hendrerit elit euismod. Phasellus luctus placerat facilisis. </pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [5]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">lorem_text</span><span class="o">.</span><span class="n">split</span><span class="p">():</span> <span class="k">if</span> <span class="n">w</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">','</span><span class="p">,</span> <span class="s2">"."</span><span class="p">]:</span> <span class="k">print</span> <span class="n">w</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">print</span> <span class="n">w</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt"></div> <div class="output_subarea output_stream output_stdout output_text"> <pre>Lorem ipsum dolor sit amet consectetur adipiscing elit In sed iaculis sapien vitae vestibulum nunc Vivamus pharetra risus neque ut iaculis elit porta non Vivamus ullamcorper dolor sit amet sollicitudin vehicula Aliquam quis tristique nibh eget malesuada purus Proin varius sollicitudin turpis fermentum mollis elit cursus vel Suspendisse vehicula enim ac magna consequat ultricies Pellentesque in leo et nulla porta faucibus Quisque tincidunt in erat ut commodo Quisque id augue a nisl mollis pulvinar id at nulla Morbi a augue erat Sed pharetra molestie mauris nec ultricies Pellentesque efficitur blandit mauris sed vulputate ante bibendum eu Nulla facilisi Sed porta massa eu ligula tristique nec hendrerit elit euismod Phasellus luctus placerat facilisis </pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [6]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">lorem_text</span><span class="o">.</span><span class="n">split</span><span class="p">()[:</span><span class="mi">5</span><span class="p">]:</span> <span class="k">if</span> <span class="n">w</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">','</span><span class="p">,</span> <span class="s2">"."</span><span class="p">]:</span> <span class="k">print</span> <span class="n">w</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">else</span><span class="p">:</span> <span class="k">print</span> <span class="n">w</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt"></div> <div class="output_subarea output_stream output_stdout output_text"> <pre>lorem ipsum dolor sit amet </pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [7]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">lorem_text</span><span class="o">.</span><span class="n">split</span><span class="p">()[:</span><span class="mi">5</span><span class="p">]):</span> <span class="k">print</span> <span class="n">w</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt"></div> <div class="output_subarea output_stream output_stdout output_text"> <pre>amet, sit dolor ipsum Lorem </pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [8]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">e_word_count</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">lorem_text</span><span class="o">.</span><span class="n">split</span><span class="p">():</span> <span class="k">if</span> <span class="s1">'e'</span> <span class="ow">in</span> <span class="n">w</span><span class="p">:</span> <span class="n">e_word_count</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">print</span> <span class="n">e_word_count</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt"></div> <div class="output_subarea output_stream output_stdout output_text"> <pre>55 </pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [9]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="k">def</span> <span class="nf">lorem_clean_sample</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span> <span class="n">sample</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">lorem_text</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="n">start</span><span class="p">:</span><span class="n">end</span><span class="p">]:</span> <span class="k">if</span> <span class="n">w</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">','</span><span class="p">,</span> <span class="s2">"."</span><span class="p">]:</span> <span class="n">sample</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">w</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span> <span class="k">else</span><span class="p">:</span> <span class="n">sample</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">w</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span> <span class="k">return</span> <span class="n">sample</span> </pre></div> </div> </div> </div> </div></section></section><section><section> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="3.-There-are-just-enough-data-types-to-get-started-...">3. There are just enough data types to get started ...<a class="anchor-link" href="#3.-There-are-just-enough-data-types-to-get-started-...">¶</a></h1><p><img src="assets/5009171128_22a32d98a1_z.jpg"/> <!-- https://www.flickr.com/photos/mfatic/5009171128/in/photolist-8CDj4s-sv2cN-cHqD9-H82d2J-ee998U-bEg1kD-9objQt-7VXmyG-cAJyP-7Y7fTE-jDQKGR-HD7PEu-bSZHYz-8Am1VT-oRXevU-kzA4Gf-8kQchz-3omu6m-agcavR-6sBGoq-pHA4Hi-6FxhWP-dwp8YN-aiLJvD-fB7Kkw-ncoPxB-dp25WU-6pVCtc-m7vJRb-HZRrD9-cxJDVf-bu3h8-bdMe2V-ktakv4-dipJP9-cGTzWC-naBhMm-eKtpXn-6L69ux-fkNEmY-2jiSJA-HMK37d-yZAzzm-8VUF5f-wNAJr-9o6Q1M-8wRXZ7-dipLfC-8AYxxx-aEPqLh --></p> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [10]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="c1"># dictionaries / maps</span> <span class="n">d</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"a"</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span> <span class="c1"># tuples (immutable "lists")</span> <span class="n">tup</span> <span class="o">=</span> <span class="p">(</span><span class="s2">"b"</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="c1"># lists [1, 2, 3]</span> <span class="n">lis</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"c"</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> </pre></div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="...-and-they-play-well-together">... and they play well together<a class="anchor-link" href="#...-and-they-play-well-together">¶</a></h1> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [11]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">list</span><span class="p">(</span><span class="n">tup</span><span class="p">)</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[11]:</div> <div class="output_text output_subarea output_execute_result"> <pre>['b', 2]</pre> </div> </div> </div> </div> </div><div class="fragment"> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [12]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">tuple</span><span class="p">(</span><span class="n">lis</span><span class="p">)</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[12]:</div> <div class="output_text output_subarea output_execute_result"> <pre>('c', 1)</pre> </div> </div> </div> </div> </div></div><div class="fragment"> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [13]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">dict</span><span class="p">([</span><span class="nb">tuple</span><span class="p">(</span><span class="n">lis</span><span class="p">)])</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[13]:</div> <div class="output_text output_subarea output_execute_result"> <pre>{'c': 1}</pre> </div> </div> </div> </div> </div></div><div class="fragment"> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [14]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">dict</span><span class="p">([</span><span class="n">tup</span><span class="p">])</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[14]:</div> <div class="output_text output_subarea output_execute_result"> <pre>{'b': 2}</pre> </div> </div> </div> </div> </div></div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [15]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">dict</span><span class="o">.</span><span class="n">fromkeys</span><span class="p">([</span><span class="s2">"a"</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">,</span> <span class="s2">"c"</span><span class="p">])</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[15]:</div> <div class="output_text output_subarea output_execute_result"> <pre>{'a': None, 'b': None, 'c': None}</pre> </div> </div> </div> </div> </div><div class="fragment"> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [16]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="nb">dict</span><span class="o">.</span><span class="n">fromkeys</span><span class="p">((</span><span class="s2">"a"</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">,</span> <span class="s2">"c"</span><span class="p">))</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[16]:</div> <div class="output_text output_subarea output_execute_result"> <pre>{'a': None, 'b': None, 'c': None}</pre> </div> </div> </div> </div> </div></div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [17]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">d</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">fromkeys</span><span class="p">([</span><span class="s2">"a"</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">,</span> <span class="s2">"c"</span><span class="p">])</span> <span class="n">d</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[17]:</div> <div class="output_text output_subarea output_execute_result"> <pre>{'a': None, 'b': None, 'c': None}</pre> </div> </div> </div> </div> </div><div class="fragment"> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [18]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">d</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="nb">dict</span><span class="p">([</span><span class="nb">tuple</span><span class="p">(</span><span class="n">lis</span><span class="p">)]))</span> </pre></div> </div> </div> </div> </div></div><div class="fragment"> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [19]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">d</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[19]:</div> <div class="output_text output_subarea output_execute_result"> <pre>{'a': None, 'b': None, 'c': 1}</pre> </div> </div> </div> </div> </div></div><div class="fragment"> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [20]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">d</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="nb">dict</span><span class="p">([(</span><span class="s1">'a'</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">lis</span><span class="p">),</span> <span class="n">tup</span><span class="p">]))</span> </pre></div> </div> </div> </div> </div></div><div class="fragment"> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [21]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">d</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[21]:</div> <div class="output_text output_subarea output_execute_result"> <pre>{'a': 1, 'b': 2, 'c': 1}</pre> </div> </div> </div> </div> </div></div></section></section><section><section> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="4.-And-there-are-some-nice-short-cuts-...">4. And there are some nice short cuts ...<a class="anchor-link" href="#4.-And-there-are-some-nice-short-cuts-...">¶</a></h1><p><img src="assets/13563527335_7282ccd926_o.jpg"/> <!-- https://www.flickr.com/photos/penguinandfish/13563527335/in/photolist-mEyC8z-xokZe-cvG6i-cvG6f-78pQcU-687d5B-J8JY5t-6PrzZ9-77x4pd-oYgqzQ-dNLFAw-8ZGhsA-5yAQGL-pfJj19-iqW4gY-6Dn5in-99oXCd-8WipvU-4gMDBd-9uYt1L-xokZj-ayxHqU-4S6ukZ-5B2cX4-7tUS2M-4pc9m2-sjqz2E-6MJPeL-xokfd-7tUSfT-az5QPT-7dy1no-f4wS42-xokZk-xokfa-5Re3Dz-6vGHki-9qBB8c-4gcyjN-xokeZ-f9EGpb-ah5B12-h4hW4Y-az5QUt-9mznbJ-sjqzfW-7dxZT1-s2ZpHS-FRcxry-3zGaoU --></p> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [22]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="c1"># list comprehensions</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">16</span><span class="p">)]</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[22]:</div> <div class="output_text output_subarea output_execute_result"> <pre>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]</pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [23]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">16</span><span class="p">)</span> <span class="k">if</span> <span class="n">i</span><span class="o">%</span><span class="k">2</span>] # say what??? </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[23]:</div> <div class="output_text output_subarea output_execute_result"> <pre>[1, 3, 5, 7, 9, 11, 13, 15]</pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [24]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">16</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">i</span><span class="o">%</span><span class="k">2</span>] # aha!!! </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[24]:</div> <div class="output_text output_subarea output_execute_result"> <pre>[2, 4, 6, 8, 10, 12, 14]</pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [25]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="c1"># dictionary comprehensions</span> <span class="n">lorem_wlen</span> <span class="o">=</span> <span class="p">{</span><span class="n">key</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">lorem_clean_sample</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">)}</span> <span class="n">lorem_wlen</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[25]:</div> <div class="output_text output_subarea output_execute_result"> <pre>{'adipiscing': 10, 'amet': 4, 'consectetur': 11, 'dolor': 5, 'elit': 4, 'in': 2, 'ipsum': 5, 'lorem': 5, 'sed': 3, 'sit': 3}</pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [26]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">lorem_cnt_e</span> <span class="o">=</span> <span class="p">{</span><span class="n">key</span><span class="p">:</span> <span class="n">key</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s2">"e"</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">lorem_clean_sample</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">)}</span> <span class="n">lorem_cnt_e</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[26]:</div> <div class="output_text output_subarea output_execute_result"> <pre>{'adipiscing': 0, 'amet': 1, 'consectetur': 2, 'dolor': 0, 'elit': 1, 'in': 0, 'ipsum': 0, 'lorem': 1, 'sed': 1, 'sit': 0}</pre> </div> </div> </div> </div> </div></section></section><section><section> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="5.-Batteries-included-....">5. Batteries included ....<a class="anchor-link" href="#5.-Batteries-included-....">¶</a></h1><p><img src="assets/13610718405_c247cc2925_z.jpg" /> <!-- https://www.flickr.com/photos/vintuitive/13610718405/in/photolist-mJJuoH-67y58t-pVuSW4-askYpe-nZfcyQ-2ZXjk4-9dh1gK-6QVJJT-9kixy9-91VEbQ-aBm9AH-arTTuE-r19JmA-37LN9W-cvvasy-aH15vp-5pgu3M-d77zoG-62epCR-4Js3Ki-BrNHkh-3VbqeB-7bzvtv-cKwNwE-3kGb35-9K4bGg-nMScWf-e9XLkL-nfRyBD-9DEb2v-5FkYhQ-qbYryC-5u18Ud-ovqtVt-oBnzvF-abfaWh-o54g8R-7yjvs1-5PHjgc-6J8QnF-p1bz4C-Jo61wp-9pGc6S-5FbjF8-cj1FNE-qpmBrn-pCQJAN-cRYEyC-hBpyoD-4X3LvS --></p> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [27]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="kn">import</span> <span class="nn">requests</span> <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"http://www2.ed.gov/data.json"</span><span class="p">)</span> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span> <span class="n">payload_dict</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span> <span class="c1"># loading the data into a dict via the json() just works!</span> <span class="k">else</span><span class="p">:</span> <span class="k">print</span> <span class="s2">"Could not load the data at this endpoint."</span> </pre></div> </div> </div> </div> </div><div class="fragment"> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [28]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">payload_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[28]:</div> <div class="output_text output_subarea output_execute_result"> <pre>[u'conformsTo', u'dataset', u'describedBy', u'@context', u'@id', u'@type']</pre> </div> </div> </div> </div> </div></div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [29]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">arra_data</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">dataset</span> <span class="ow">in</span> <span class="n">payload_dict</span><span class="p">[</span><span class="s1">'dataset'</span><span class="p">]:</span> <span class="k">if</span> <span class="s2">"ARRA"</span> <span class="ow">in</span> <span class="n">dataset</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]:</span> <span class="n">dsid</span> <span class="o">=</span> <span class="n">dataset</span><span class="p">[</span><span class="s1">'identifier'</span><span class="p">]</span> <span class="n">desc</span> <span class="o">=</span> <span class="n">dataset</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="n">title</span> <span class="o">=</span> <span class="n">dataset</span><span class="p">[</span><span class="s1">'title'</span><span class="p">]</span> <span class="n">arra_data</span><span class="p">[</span><span class="n">dsid</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'description'</span><span class="p">:</span> <span class="n">desc</span><span class="p">,</span> <span class="s1">'title'</span><span class="p">:</span> <span class="n">title</span><span class="p">}</span> </pre></div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [30]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">arra_data</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[30]:</div> <div class="output_text output_subarea output_execute_result"> <pre>{u'ED-2485': {'description': u'The Investing in Innovation (i3) Fund website depicts and allows downloading of general information on the i3 applicants received, grantees awarded and project locations. The Investing in Innovation Fund, established under section 14007 of the American Recovery and Reinvestment Act of 2009 (ARRA), provides funding to support (1) local educational agencies (LEAs), and (2) nonprofit organizations in partnership with (a) one or more LEAs or (b) a consortium of schools. The purpose of the i3 program is to provide competitive grants to applicants with a record of improving student achievement and attainment in order to expand the implementation of, and investment in, innovative practices that are demonstrated to have an impact on improving student achievement or student growth, closing achievement gaps, decreasing dropout rates, increasing high school graduation rates, or increasing college enrollment and completion rates. These grants will (1) allow eligible entities to expand and develop innovative practices that can serve as models of best practices, (2) allow eligible entities to work in partnership with the private sector and the philanthropic community, and (3) identify and document best practices that can be shared and taken to scale based on demonstrated success.', 'title': u'ED Grants: Investing in Innovation (i3) Fund 2010'}, u'ED-5562': {'description': u'The Investing in Innovation (i3) Fund website depicts and allows downloading of general information on the i3 applicants received, grantees awarded and project locations. The Investing in Innovation Fund, established under section 14007 of the American Recovery and Reinvestment Act of 2009 (ARRA), provides funding to support (1) local educational agencies (LEAs), and (2) nonprofit organizations in partnership with (a) one or more LEAs or (b) a consortium of schools. The purpose of the i3 program is to provide competitive grants to applicants with a record of improving student achievement and attainment in order to expand the implementation of, and investment in, innovative practices that are demonstrated to have an impact on improving student achievement or student growth, closing achievement gaps, decreasing dropout rates, increasing high school graduation rates, or increasing college enrollment and completion rates. These grants will (1) allow eligible entities to expand and develop innovative practices that can serve as models of best practices, (2) allow eligible entities to work in partnership with the private sector and the philanthropic community, and (3) identify and document best practices that can be shared and taken to scale based on demonstrated success.', 'title': u'ED Grants: Investing in Innovation (i3) Fund 2011'}}</pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [31]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">arra_data_dc</span> <span class="o">=</span> <span class="p">{</span> <span class="n">dataset</span><span class="p">[</span><span class="s1">'identifier'</span><span class="p">]</span> <span class="p">:</span> <span class="p">{</span><span class="s1">'description'</span><span class="p">:</span> <span class="n">dataset</span><span class="p">[</span><span class="s1">'description'</span><span class="p">],</span> <span class="s1">'title'</span><span class="p">:</span> <span class="n">dataset</span><span class="p">[</span><span class="s1">'title'</span><span class="p">]}</span> <span class="k">for</span> <span class="n">dataset</span> <span class="ow">in</span> <span class="n">payload_dict</span><span class="p">[</span><span class="s1">'dataset'</span><span class="p">]</span> <span class="k">if</span> <span class="s2">"ARRA"</span> <span class="ow">in</span> <span class="n">dataset</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span> <span class="p">}</span> </pre></div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [32]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">arra_data_dc</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[32]:</div> <div class="output_text output_subarea output_execute_result"> <pre>{u'ED-2485': {'description': u'The Investing in Innovation (i3) Fund website depicts and allows downloading of general information on the i3 applicants received, grantees awarded and project locations. The Investing in Innovation Fund, established under section 14007 of the American Recovery and Reinvestment Act of 2009 (ARRA), provides funding to support (1) local educational agencies (LEAs), and (2) nonprofit organizations in partnership with (a) one or more LEAs or (b) a consortium of schools. The purpose of the i3 program is to provide competitive grants to applicants with a record of improving student achievement and attainment in order to expand the implementation of, and investment in, innovative practices that are demonstrated to have an impact on improving student achievement or student growth, closing achievement gaps, decreasing dropout rates, increasing high school graduation rates, or increasing college enrollment and completion rates. These grants will (1) allow eligible entities to expand and develop innovative practices that can serve as models of best practices, (2) allow eligible entities to work in partnership with the private sector and the philanthropic community, and (3) identify and document best practices that can be shared and taken to scale based on demonstrated success.', 'title': u'ED Grants: Investing in Innovation (i3) Fund 2010'}, u'ED-5562': {'description': u'The Investing in Innovation (i3) Fund website depicts and allows downloading of general information on the i3 applicants received, grantees awarded and project locations. The Investing in Innovation Fund, established under section 14007 of the American Recovery and Reinvestment Act of 2009 (ARRA), provides funding to support (1) local educational agencies (LEAs), and (2) nonprofit organizations in partnership with (a) one or more LEAs or (b) a consortium of schools. The purpose of the i3 program is to provide competitive grants to applicants with a record of improving student achievement and attainment in order to expand the implementation of, and investment in, innovative practices that are demonstrated to have an impact on improving student achievement or student growth, closing achievement gaps, decreasing dropout rates, increasing high school graduation rates, or increasing college enrollment and completion rates. These grants will (1) allow eligible entities to expand and develop innovative practices that can serve as models of best practices, (2) allow eligible entities to work in partnership with the private sector and the philanthropic community, and (3) identify and document best practices that can be shared and taken to scale based on demonstrated success.', 'title': u'ED Grants: Investing in Innovation (i3) Fund 2011'}}</pre> </div> </div> </div> </div> </div></section></section><section><section> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="6.-Juptyer-Notebooks">6. Juptyer Notebooks<a class="anchor-link" href="#6.-Juptyer-Notebooks">¶</a></h1><p><img src="assets/jupyter_logo.jpg" /> <!-- http://jupyter.org --></p> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [33]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="kn">import</span> <span class="nn">csv</span> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"Export.csv"</span><span class="p">)</span> <span class="k">as</span> <span class="n">fi</span><span class="p">:</span> <span class="n">csv_fi</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">DictReader</span><span class="p">(</span><span class="n">fi</span><span class="p">)</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">csv_fi</span><span class="p">:</span> <span class="k">print</span> <span class="n">row</span><span class="p">[</span><span class="s1">'MarketName'</span><span class="p">],</span> <span class="n">row</span><span class="p">[</span><span class="s1">'x'</span><span class="p">],</span> <span class="n">row</span><span class="p">[</span><span class="s1">'y'</span><span class="p">]</span> <span class="k">break</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt"></div> <div class="output_subarea output_stream output_stdout output_text"> <pre> Caledonia Farmers Market Association - Danville -72.140305 44.411013 </pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [34]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">map_data_objects</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"Export.csv"</span><span class="p">)</span> <span class="k">as</span> <span class="n">fi</span><span class="p">:</span> <span class="n">csv_fi</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">DictReader</span><span class="p">(</span><span class="n">fi</span><span class="p">)</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">csv_fi</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">map_data_objects</span><span class="p">[</span><span class="n">row</span><span class="p">[</span><span class="s1">'FMID'</span><span class="p">]]</span> <span class="o">=</span> <span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s1">'MarketName'</span><span class="p">],</span> <span class="nb">float</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s1">'x'</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()),</span> <span class="nb">float</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s1">'y'</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()))</span> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s2">"Count not convert row for FMID: {}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s1">'FMID'</span><span class="p">]))</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt"></div> <div class="output_subarea output_stream output_stdout output_text"> <pre>Count not convert row for FMID: 2000001 Count not convert row for FMID: 1011689 Count not convert row for FMID: 2000002 Count not convert row for FMID: 1002854 Count not convert row for FMID: 2000004 Count not convert row for FMID: 2000005 Count not convert row for FMID: 2000006 Count not convert row for FMID: 2000007 Count not convert row for FMID: 2000008 Count not convert row for FMID: 2000009 Count not convert row for FMID: 2000010 Count not convert row for FMID: 2000011 Count not convert row for FMID: 2000012 Count not convert row for FMID: 2000013 Count not convert row for FMID: 2000014 Count not convert row for FMID: 2000016 Count not convert row for FMID: 2000017 Count not convert row for FMID: 2000019 Count not convert row for FMID: 2000020 Count not convert row for FMID: 2000021 Count not convert row for FMID: 2000022 Count not convert row for FMID: 2000026 Count not convert row for FMID: 2000028 Count not convert row for FMID: 2000030 Count not convert row for FMID: 2000032 Count not convert row for FMID: 2000033 Count not convert row for FMID: 2000034 Count not convert row for FMID: 2000035 Count not convert row for FMID: 2000036 </pre> </div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [35]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="kn">import</span> <span class="nn">folium</span> <span class="n">us_fm_map</span> <span class="o">=</span> <span class="n">folium</span><span class="o">.</span><span class="n">Map</span><span class="p">(</span><span class="n">location</span><span class="o">=</span><span class="p">[</span><span class="mf">39.232253</span><span class="p">,</span> <span class="o">-</span><span class="mf">97.910156</span><span class="p">],</span> <span class="n">zoom_start</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">tiles</span><span class="o">=</span><span class="s1">'Stamen Terrain'</span><span class="p">)</span> <span class="k">for</span> <span class="n">fmid</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">map_data_objects</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span> <span class="n">name</span><span class="p">,</span> <span class="n">lon</span><span class="p">,</span> <span class="n">lat</span> <span class="o">=</span> <span class="n">v</span> <span class="k">if</span> <span class="p">(</span><span class="n">lon</span> <span class="o"><</span> <span class="o">-</span><span class="mi">104</span> <span class="ow">and</span> <span class="n">lon</span> <span class="o">></span> <span class="o">-</span><span class="mi">106</span><span class="p">)</span> \ <span class="ow">and</span> \ <span class="p">(</span><span class="n">lat</span> <span class="o"><</span> <span class="mi">43</span> <span class="ow">and</span> <span class="n">lat</span> <span class="o">></span> <span class="mi">30</span><span class="p">):</span> <span class="n">folium</span><span class="o">.</span><span class="n">Marker</span><span class="p">([</span><span class="n">lat</span><span class="p">,</span> <span class="n">lon</span><span class="p">],</span> <span class="n">popup</span><span class="o">=</span><span class="nb">unicode</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'utf-8'</span><span class="p">))</span> <span class="p">)</span><span class="o">.</span><span class="n">add_to</span><span class="p">(</span><span class="n">us_fm_map</span><span class="p">)</span> </pre></div> </div> </div> </div> </div></section><section> <div class="cell border-box-sizing code_cell rendered"> <div class="input"> <div class="prompt input_prompt">In [36]:</div> <div class="inner_cell"> <div class="input_area"> <div class=" highlight hl-ipython2"><pre><span></span><span class="n">us_fm_map</span> </pre></div> </div> </div> </div> <div class="output_wrapper"> <div class="output"> <div class="output_area"><div class="prompt output_prompt">Out[36]:</div> <div class="output_html rendered_html output_subarea output_execute_result"> <div style="width:100%;"><div style="position:relative;width:100%;height:0;padding-bottom:60%;"><iframe src="data:text/html;base64,CiAgICAgICAgPCFET0NUWVBFIGh0bWw+CiAgICAgICAgPGhlYWQ+CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4KICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0LzAuNy4zL2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuMTEuMS9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5taW4uanMiPjwvc2NyaXB0PgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8wLjQuMC9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXItc3JjLmpzIj48L3NjcmlwdD4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMC40LjAvbGVhZmxldC5tYXJrZXJjbHVzdGVyLmpzIj48L3NjcmlwdD4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC8wLjcuMy9sZWFmbGV0LmNzcyIgLz4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiAvPgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiIC8+CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuMS4wL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgLz4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuY3NzIiAvPgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMC40LjAvTWFya2VyQ2x1c3Rlci5EZWZhdWx0LmNzcyIgLz4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzAuNC4wL01hcmtlckNsdXN0ZXIuY3NzIiAvPgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIiAvPgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHN0eWxlPgoKICAgICAgICAgICAgaHRtbCwgYm9keSB7CiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAjbWFwIHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgICAgICAgICAgICAgdG9wOjA7CiAgICAgICAgICAgICAgICBib3R0b206MDsKICAgICAgICAgICAgICAgIHJpZ2h0OjA7CiAgICAgICAgICAgICAgICBsZWZ0OjA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHN0eWxlPiAjbWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjIHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uIDogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICB3aWR0aCA6IDEwMC4wJTsKICAgICAgICAgICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICA8L2hlYWQ+CiAgICAgICAgPGJvZHk+CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyIgPjwvZGl2PgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIDwvYm9keT4KICAgICAgICA8c2NyaXB0PgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgc291dGhXZXN0ID0gTC5sYXRMbmcoLTkwLCAtMTgwKTsKICAgICAgICAgICAgdmFyIG5vcnRoRWFzdCA9IEwubGF0TG5nKDkwLCAxODApOwogICAgICAgICAgICB2YXIgYm91bmRzID0gTC5sYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpOwoKICAgICAgICAgICAgdmFyIG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyA9IEwubWFwKCdtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXI6WzM5LjIzMjI1MywtOTcuOTEwMTU2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNzY2Mjg4OGFiZTU2NDg3NWIzNzc4NjA1OTU4MWU2YWEgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3N0YW1lbi10aWxlcy17c30uYS5zc2wuZmFzdGx5Lm5ldC90ZXJyYWluL3t6fS97eH0ve3l9LmpwZycsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbWF4Wm9vbTogMTgsCiAgICAgICAgICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbjogJ01hcCB0aWxlcyBieSA8YSBocmVmPSJodHRwOi8vc3RhbWVuLmNvbSI+U3RhbWVuIERlc2lnbjwvYT4sIHVuZGVyIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMCI+Q0MgQlkgMy4wPC9hPi4gRGF0YSBieSA8YSBocmVmPSJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmciPk9wZW5TdHJlZXRNYXA8L2E+LCB1bmRlciA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8zLjAiPkNDIEJZIFNBPC9hPi4nLAogICAgICAgICAgICAgICAgICAgIGRldGVjdFJldGluYTogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CgogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDRkMDllMDViZmYyNDZiMmIwNjliYjY0NjQzNDM2YzAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS42ODg0NTYsLTEwNC45ODA0N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmVhMjQ3ODg4NDA4NGJmYmFhN2UxYmY0MDdlNjUzMjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjBlYTkwYTMzYjdmNGU2ODljNWQwMzdhMDE2MjRhYmYgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzYwZWE5MGEzM2I3ZjRlNjg5YzVkMDM3YTAxNjI0YWJmIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBTb3V0aCBQZWFybCBTdHJlZXQgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZWEyNDc4ODg0MDg0YmZiYWE3ZTFiZjQwN2U2NTMyMy5zZXRDb250ZW50KGh0bWxfNjBlYTkwYTMzYjdmNGU2ODljNWQwMzdhMDE2MjRhYmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80NGQwOWUwNWJmZjI0NmIyYjA2OWJiNjQ2NDM0MzZjMC5iaW5kUG9wdXAocG9wdXBfYmVhMjQ3ODg4NDA4NGJmYmFhN2UxYmY0MDdlNjUzMjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNzVkZWRjZDE5YWU0Zjc5ODNlMWY2MTJiYjRmNmFmMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjI3MDQsLTEwNC42Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTVmN2ExMjJlYzFhNDMzMTlmYTNkYjYzNWU3NzAwNTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjVmZWMxMThlNzAzNDIyNjg0ZTM2OTBhYjFiMTY0N2QgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2I1ZmVjMTE4ZTcwMzQyMjY4NGUzNjkwYWIxYjE2NDdkIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBQdWVibG8gRmFybWVycyYjMzk7IE1hcmtldGVlcnM8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTVmN2ExMjJlYzFhNDMzMTlmYTNkYjYzNWU3NzAwNTguc2V0Q29udGVudChodG1sX2I1ZmVjMTE4ZTcwMzQyMjY4NGUzNjkwYWIxYjE2NDdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjc1ZGVkY2QxOWFlNGY3OTgzZTFmNjEyYmI0ZjZhZjIuYmluZFBvcHVwKHBvcHVwX2E1ZjdhMTIyZWMxYTQzMzE5ZmEzZGI2MzVlNzcwMDU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTE3MjFmM2IyYzA2NDVlNjljYzAzODNiZWZmMmMxYWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi4wNDU1LC0xMDQuMTQ1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZTQyMGI1MzljMTg0YWU2ODJjNDA0MzExYjAzNTUxNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZTI0NDMzMzYzYjY0ODAwOGI0NjVkYjg5YTJjY2FlZSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfN2UyNDQzMzM2M2I2NDgwMDhiNDY1ZGI4OWEyY2NhZWUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFRodXJzZGF5IEFmdGVybm9vbiBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZTQyMGI1MzljMTg0YWU2ODJjNDA0MzExYjAzNTUxNC5zZXRDb250ZW50KGh0bWxfN2UyNDQzMzM2M2I2NDgwMDhiNDY1ZGI4OWEyY2NhZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lMTcyMWYzYjJjMDY0NWU2OWNjMDM4M2JlZmYyYzFhYy5iaW5kUG9wdXAocG9wdXBfOGU0MjBiNTM5YzE4NGFlNjgyYzQwNDMxMWIwMzU1MTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mZmI5YWYwNDliNjE0ZTA3YThjMzhmOWM4YjRjNTNkYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUwMTUsLTEwNS4wOTddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQxMTVlZjI4ZWIxNTQxMTRhNGE4NzBjMjhjZGU1MmE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgzNDE0MzMyMTI4YTQ2MjU4Yjg1NzYxMDVmYWRlODRhID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF84MzQxNDMzMjEyOGE0NjI1OGI4NTc2MTA1ZmFkZTg0YSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgR3VsbGV5IEdyZWVuaG91c2UgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MTE1ZWYyOGViMTU0MTE0YTRhODcwYzI4Y2RlNTJhNC5zZXRDb250ZW50KGh0bWxfODM0MTQzMzIxMjhhNDYyNThiODU3NjEwNWZhZGU4NGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mZmI5YWYwNDliNjE0ZTA3YThjMzhmOWM4YjRjNTNkYS5iaW5kUG9wdXAocG9wdXBfNDExNWVmMjhlYjE1NDExNGE0YTg3MGMyOGNkZTUyYTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iNzc5M2JkMWZkNTg0YmVhOTgxMjg0N2M1ZTdkNjlkZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5Ljk3ODM4MzYsLTEwNS4xMzA2Nzk1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mOTUwYzMzZGZkMTU0ODFjOGVkZGJiYjk3ZjBkYmI3MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZjYyN2UyYWQ0NDY0Mjk5ODk3ZDU2ZjMyMDg1MjhjOCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOGY2MjdlMmFkNDQ2NDI5OTg5N2Q1NmYzMjA4NTI4YzgiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIExvdWlzdmlsbGUgRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjk1MGMzM2RmZDE1NDgxYzhlZGRiYmI5N2YwZGJiNzMuc2V0Q29udGVudChodG1sXzhmNjI3ZTJhZDQ0NjQyOTk4OTdkNTZmMzIwODUyOGM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjc3OTNiZDFmZDU4NGJlYTk4MTI4NDdjNWU3ZDY5ZGYuYmluZFBvcHVwKHBvcHVwX2Y5NTBjMzNkZmQxNTQ4MWM4ZWRkYmJiOTdmMGRiYjczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTU1YzQ0ODJiOGI5NDEyZTgzNWRjYjk0YWVhMWFmMWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS45ODcxODIsLTEwNS4wOTM5N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDUyZjg3MWY3ODVjNDk4MmI3ODA2M2NkNjYxMDQzN2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzI5N2Q1NDUyYzI4NDMxNDkxYWZjMWJjMmNlYmJiNmQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzMyOTdkNTQ1MmMyODQzMTQ5MWFmYzFiYzJjZWJiYjZkIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBMYWZheWV0dGUgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNTJmODcxZjc4NWM0OTgyYjc4MDYzY2Q2NjEwNDM3Zi5zZXRDb250ZW50KGh0bWxfMzI5N2Q1NDUyYzI4NDMxNDkxYWZjMWJjMmNlYmJiNmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85NTVjNDQ4MmI4Yjk0MTJlODM1ZGNiOTRhZWExYWYxZS5iaW5kUG9wdXAocG9wdXBfMDUyZjg3MWY3ODVjNDk4MmI3ODA2M2NkNjYxMDQzN2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80Mzk3MTJiNjM0YTk0MDRjOTNkNTE0YjZiNTllMmY3NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjQxMDcsLTEwNS42NzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhYzkzZTE4Yzk2MzQ4ZGJhZTliMTBmMDAwNGY0ZjdkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1ZGNlNGZjNTFhNjQxODc5YWMyNDMyN2ZiNzUzNDRmID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF80NWRjZTRmYzUxYTY0MTg3OWFjMjQzMjdmYjc1MzQ0ZiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgTGlvbiYjMzk7cyBQYXJrIGFuZCBNaWRsYW5kIFNwdXIgUmQuPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RhYzkzZTE4Yzk2MzQ4ZGJhZTliMTBmMDAwNGY0ZjdkLnNldENvbnRlbnQoaHRtbF80NWRjZTRmYzUxYTY0MTg3OWFjMjQzMjdmYjc1MzQ0Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQzOTcxMmI2MzRhOTQwNGM5M2Q1MTRiNmI1OWUyZjc0LmJpbmRQb3B1cChwb3B1cF9kYWM5M2UxOGM5NjM0OGRiYWU5YjEwZjAwMDRmNGY3ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JmNjJkODQzNDJiYTRlZTM5MzRlOTI0NGIyYTk3OGQwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNTkxNDA5LC0xMDQuOTg5MTY4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jN2VjNzZiMTc4NTE0MTYyYmJhYTk2OThmMmM4YmVhYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYjc4Mjk4ZWEzNDc0YjQ2OGE0ZjUyMDI2MjgzZThiMSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfY2I3ODI5OGVhMzQ3NGI0NjhhNGY1MjAyNjI4M2U4YjEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIE1ldHJvIERlbnZlciBGYXJtZXJzJiMzOTsgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M3ZWM3NmIxNzg1MTQxNjJiYmFhOTY5OGYyYzhiZWFiLnNldENvbnRlbnQoaHRtbF9jYjc4Mjk4ZWEzNDc0YjQ2OGE0ZjUyMDI2MjgzZThiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JmNjJkODQzNDJiYTRlZTM5MzRlOTI0NGIyYTk3OGQwLmJpbmRQb3B1cChwb3B1cF9jN2VjNzZiMTc4NTE0MTYyYmJhYTk2OThmMmM4YmVhYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzIxMTI1NTM0YmQwMjRjMmM5M2FkNDFhZTI2OTAwMzFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNzU4NTQsLTEwNS4wMTEyM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWYwNGM5ZGQ0YjA2NGNmYzlhYWQ4MjVlMTZjNDViNzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTFhZDViOWQ0NTUzNDFlMmI3MzQ4NzRlNWU1OGYxYTkgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2UxYWQ1YjlkNDU1MzQxZTJiNzM0ODc0ZTVlNThmMWE5IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBIaWdobGFuZCBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZjA0YzlkZDRiMDY0Y2ZjOWFhZDgyNWUxNmM0NWI3OS5zZXRDb250ZW50KGh0bWxfZTFhZDViOWQ0NTUzNDFlMmI3MzQ4NzRlNWU1OGYxYTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yMTEyNTUzNGJkMDI0YzJjOTNhZDQxYWUyNjkwMDMxYS5iaW5kUG9wdXAocG9wdXBfZWYwNGM5ZGQ0YjA2NGNmYzlhYWQ4MjVlMTZjNDViNzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iM2ZjNDEwMTg2MjM0OTgwYTg4ZWZhMGM5N2E4M2RhYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjE1MzQ4MTcsLTEwNS4xMjg2NTYzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNTlhOWViNmU2ZTc0Mzc4OTBmN2NkNGE4ZTkzOTc3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iN2U1ODk2YWU0NzU0ODg4YTBjMjgzODE1MmFkMGU3YSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYjdlNTg5NmFlNDc1NDg4OGEwYzI4MzgxNTJhZDBlN2EiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEJvdWxkZXIgQ291bnR5IEZhcm1lcnMmIzM5OyBNYXJrZXQgLSBMb25nbW9udCAmYW1wOyBCb3VsZGVyPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1OWE5ZWI2ZTZlNzQzNzg5MGY3Y2Q0YThlOTM5NzdkLnNldENvbnRlbnQoaHRtbF9iN2U1ODk2YWU0NzU0ODg4YTBjMjgzODE1MmFkMGU3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IzZmM0MTAxODYyMzQ5ODBhODhlZmEwYzk3YTgzZGFjLmJpbmRQb3B1cChwb3B1cF9kNTlhOWViNmU2ZTc0Mzc4OTBmN2NkNGE4ZTkzOTc3ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2I1NTIyNjI5YzEzZTQ3ZGZhZjBlMzk2OTFkNDc1ZTlmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuNjk4LC0xMDUuNjAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNTY1N2YxZTE1ODI0ZTBlYjQxNjhlNzBjYjZjMjVmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNWRmMjgyOGUzMzI0ZGMxOGIyYTg3MDRjNjI4MzNjZSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMDVkZjI4MjhlMzMyNGRjMThiMmE4NzA0YzYyODMzY2UiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFF1ZXN0YSBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNTY1N2YxZTE1ODI0ZTBlYjQxNjhlNzBjYjZjMjVmNi5zZXRDb250ZW50KGh0bWxfMDVkZjI4MjhlMzMyNGRjMThiMmE4NzA0YzYyODMzY2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iNTUyMjYyOWMxM2U0N2RmYWYwZTM5NjkxZDQ3NWU5Zi5iaW5kUG9wdXAocG9wdXBfZDU2NTdmMWUxNTgyNGUwZWI0MTY4ZTcwY2I2YzI1ZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mYTZjODcxOTMwZTU0MTc0OTA1MWU3YmRkYzZkZDJhMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMyLjg5OTQ3NzEsLTEwNS45NTkzMzg0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNDIyMGJjNTVkNmY0ZDJmYjk4MGIyODU4MDg4ZWExZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMjBkMDIxOTk0MmU0YzQxOWRhYjQ5MWIwMTBhZTkzNCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMzIwZDAyMTk5NDJlNGM0MTlkYWI0OTFiMDEwYWU5MzQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEFsYW1vZ29yZG8gRmFybWVycyYjMzk7IE1hcmtldCAtRG93bnRvd248L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTQyMjBiYzU1ZDZmNGQyZmI5ODBiMjg1ODA4OGVhMWUuc2V0Q29udGVudChodG1sXzMyMGQwMjE5OTQyZTRjNDE5ZGFiNDkxYjAxMGFlOTM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmE2Yzg3MTkzMGU1NDE3NDkwNTFlN2JkZGM2ZGQyYTAuYmluZFBvcHVwKHBvcHVwX2U0MjIwYmM1NWQ2ZjRkMmZiOTgwYjI4NTgwODhlYTFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjU2M2UzMWVhYjM4NDM5ZjhjZTgzZmExZDE5NjQ2YTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC41MzQ5MjA5LC0xMDQuNjc0NzgwN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQ2YjY0NGZhYTc3NDA4YmI0YjY3NTRkZjY4ZmM2YTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjQzYzYxNzM4N2RlNGM2NzhhMzFkMWRiYmZlMjcwZjcgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2Y0M2M2MTczODdkZTRjNjc4YTMxZDFkYmJmZTI3MGY3IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBSYW5jaG8gRmFybSAmYW1wOyBBcnQgbWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0NmI2NDRmYWE3NzQwOGJiNGI2NzU0ZGY2OGZjNmE3LnNldENvbnRlbnQoaHRtbF9mNDNjNjE3Mzg3ZGU0YzY3OGEzMWQxZGJiZmUyNzBmNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I1NjNlMzFlYWIzODQzOWY4Y2U4M2ZhMWQxOTY0NmE2LmJpbmRQb3B1cChwb3B1cF85NDZiNjQ0ZmFhNzc0MDhiYjRiNjc1NGRmNjhmYzZhNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhiZDllZTVjMDZhOTRkNTVhZDIwMWE0ZTM0YjIzOWJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNjIzNjkwNCwtMTA0Ljc4MDg5OThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzY2JhMDJlOWRhMjRlOTU4ZTJiY2M1ZWNkMDgxZmNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA2YWM0NmFkNTNlNDRmYjJhMWU2NzU3YWFmNjQxMGRhID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8wNmFjNDZhZDUzZTQ0ZmIyYTFlNjc1N2FhZjY0MTBkYSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgV2Fsc2VuYnVyZyBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80M2NiYTAyZTlkYTI0ZTk1OGUyYmNjNWVjZDA4MWZjZi5zZXRDb250ZW50KGh0bWxfMDZhYzQ2YWQ1M2U0NGZiMmExZTY3NTdhYWY2NDEwZGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84YmQ5ZWU1YzA2YTk0ZDU1YWQyMDFhNGUzNGIyMzliZi5iaW5kUG9wdXAocG9wdXBfNDNjYmEwMmU5ZGEyNGU5NThlMmJjYzVlY2QwODFmY2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZTJmZWQxMTk5YTk0OTkyODEzNzRhOWM0ZjEzYWRmYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjA1NDU1MjEsLTEwNC45NTMyNTY5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMWIwODZjODRhNjY0OGU5YjRhYjZlOGY3YjNjMDk5MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMTFjNzQ3ZTQ2N2E0YzBiOWVmNDQxZjkxNWYwNWE4ZCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZjExYzc0N2U0NjdhNGMwYjllZjQ0MWY5MTVmMDVhOGQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFdoZWF0bGFuZCBGYXJtZXJzJiMzOTsgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxYjA4NmM4NGE2NjQ4ZTliNGFiNmU4ZjdiM2MwOTkxLnNldENvbnRlbnQoaHRtbF9mMTFjNzQ3ZTQ2N2E0YzBiOWVmNDQxZjkxNWYwNWE4ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzVlMmZlZDExOTlhOTQ5OTI4MTM3NGE5YzRmMTNhZGZiLmJpbmRQb3B1cChwb3B1cF9iMWIwODZjODRhNjY0OGU5YjRhYjZlOGY3YjNjMDk5MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2QzMDIyNzM0NTBkMzQwZmU5OTFjNDNjMmJiYzc2YjUxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNDc5NzExLC0xMDQuOTA0MTA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNDMxNGZkYjNjYzk0NjE5YmUxMmNlYTRhMmVhZjNkNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYzEyNzViODJiMjg0OTM1OTdhNTgzYmMxMzFjZGI5MSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZWMxMjc1YjgyYjI4NDkzNTk3YTU4M2JjMTMxY2RiOTEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFdpbmRzb3IgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNDMxNGZkYjNjYzk0NjE5YmUxMmNlYTRhMmVhZjNkNS5zZXRDb250ZW50KGh0bWxfZWMxMjc1YjgyYjI4NDkzNTk3YTU4M2JjMTMxY2RiOTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kMzAyMjczNDUwZDM0MGZlOTkxYzQzYzJiYmM3NmI1MS5iaW5kUG9wdXAocG9wdXBfMTQzMTRmZGIzY2M5NDYxOWJlMTJjZWE0YTJlYWYzZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMzM4OWNlYWYzOTE0ZTBkYjNmMzNiZjE3MmI1MWYyNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4NzgyNzUsLTEwNS4wNzc1ODU2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81Njc4NmFkZWU3ZjY0ZjcxOTlhMTA5MTY1ZGYzNjNjYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZmFlOGQ0Y2MwNTA0MDIxYWUzOGZkZjgxODM3N2U5NSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZmZhZThkNGNjMDUwNDAyMWFlMzhmZGY4MTgzNzdlOTUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIE5vQ28gRm9vZCBDbHVzdGVyIFdpbnRlciBGYXJtZXJzJiMzOTsgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU2Nzg2YWRlZTdmNjRmNzE5OWExMDkxNjVkZjM2M2NiLnNldENvbnRlbnQoaHRtbF9mZmFlOGQ0Y2MwNTA0MDIxYWUzOGZkZjgxODM3N2U5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IzMzg5Y2VhZjM5MTRlMGRiM2YzM2JmMTcyYjUxZjI2LmJpbmRQb3B1cChwb3B1cF81Njc4NmFkZWU3ZjY0ZjcxOTlhMTA5MTY1ZGYzNjNjYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzBmMDUzNmQ1ZjUxOTQ2MGNhZDcyZjQ1YmVlZjEwZGNkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNjE3NTE4LC0xMDQuODk5ODcxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZWEwMTEyMDQzZTM0Y2I0YmVjNDc4MGY2YTFkYTU2ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZjE2YzYzYzczMTg0N2RiYTAyZmUzZWIwMDk1NzM1YyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfN2YxNmM2M2M3MzE4NDdkYmEwMmZlM2ViMDA5NTczNWMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIExhbmRtYXJrIEdyZWVud29vZCBWaWxsYWdlIEZyZXNoIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZWEwMTEyMDQzZTM0Y2I0YmVjNDc4MGY2YTFkYTU2ZC5zZXRDb250ZW50KGh0bWxfN2YxNmM2M2M3MzE4NDdkYmEwMmZlM2ViMDA5NTczNWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wZjA1MzZkNWY1MTk0NjBjYWQ3MmY0NWJlZWYxMGRjZC5iaW5kUG9wdXAocG9wdXBfNGVhMDExMjA0M2UzNGNiNGJlYzQ3ODBmNmExZGE1NmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMTI0ZjJiZjEzMzE0OWEyOTZhNjBlYTk5MDhiZDI2MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5Ljc0MDg3LC0xMDQuOTU2ODYzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NmZjMjQxOTg5ZDc0ZjlkYjhmZTU0ZWM4YzJjYjI5OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYTQyMjg5Mjk4NjI0MzU0YjM4NzU2Nzk2MzNjMTI2OCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfY2E0MjI4OTI5ODYyNDM1NGIzODc1Njc5NjMzYzEyNjgiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENpdHkgUGFyayBFc3BsYW5hZGUgRnJlc2ggTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU2ZmMyNDE5ODlkNzRmOWRiOGZlNTRlYzhjMmNiMjk5LnNldENvbnRlbnQoaHRtbF9jYTQyMjg5Mjk4NjI0MzU0YjM4NzU2Nzk2MzNjMTI2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMxMjRmMmJmMTMzMTQ5YTI5NmE2MGVhOTkwOGJkMjYwLmJpbmRQb3B1cChwb3B1cF81NmZjMjQxOTg5ZDc0ZjlkYjhmZTU0ZWM4YzJjYjI5OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzk2NmVlYWZhNjEwZTQxYjQ5NmE2M2Y4NzQyYzQ1MDJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNzU4MDQzLC0xMDQuODk5NzQzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMjI3MmNkODFkOGQ0ZDZjYTcyZjdhYzE0NWFkODRlMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YjE3N2FhZDY1YWI0ZTdkOTQ2ZmE3NTllZTMxOGMzZCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNWIxNzdhYWQ2NWFiNGU3ZDk0NmZhNzU5ZWUzMThjM2QiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFN0YXBsZXRvbiBGcmVzaCBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTIyNzJjZDgxZDhkNGQ2Y2E3MmY3YWMxNDVhZDg0ZTMuc2V0Q29udGVudChodG1sXzViMTc3YWFkNjVhYjRlN2Q5NDZmYTc1OWVlMzE4YzNkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTY2ZWVhZmE2MTBlNDFiNDk2YTYzZjg3NDJjNDUwMmYuYmluZFBvcHVwKHBvcHVwXzEyMjcyY2Q4MWQ4ZDRkNmNhNzJmN2FjMTQ1YWQ4NGUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGZmNDQ4MGZhZTI2NDVhNjlhMTlmZTgzNTZmMjhjODggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS42MiwtMTA1LjI0MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWYwNGE4YzQxN2U2NDlmMDlmZDkxMzJiOGJkOGJhYzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDQ1NDA4ZmNhMTY0NGRhY2FmOWRiMTE4MzU1NzZlMzIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2Q0NTQwOGZjYTE2NDRkYWNhZjlkYjExODM1NTc2ZTMyIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBJbmRpYW4gSGlsbHMgRmFybWVyJiMzOTtzIE1hcmtldCA8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWYwNGE4YzQxN2U2NDlmMDlmZDkxMzJiOGJkOGJhYzMuc2V0Q29udGVudChodG1sX2Q0NTQwOGZjYTE2NDRkYWNhZjlkYjExODM1NTc2ZTMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGZmNDQ4MGZhZTI2NDVhNjlhMTlmZTgzNTZmMjhjODguYmluZFBvcHVwKHBvcHVwXzlmMDRhOGM0MTdlNjQ5ZjA5ZmQ5MTMyYjhiZDhiYWMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjA1N2YwMDZmMDlkNDQxNDhjYTgyMzdmZjU3YjU1NDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS43NTkwMjUsLTEwNC40MzMzNTVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyOWVhZmZlNTYyMTQwOTQ5ZmU0Mzc2YjIxN2EyYmM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZiMzNlMDUxMGM2ZDRlMDdhYWMzZWU4MzhmNGIwZDk1ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF82YjMzZTA1MTBjNmQ0ZTA3YWFjM2VlODM4ZjRiMGQ5NSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgRmFybWVycyAmYW1wOyBBcnRpc2FucyBDb21tdW5pdHkgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgyOWVhZmZlNTYyMTQwOTQ5ZmU0Mzc2YjIxN2EyYmM0LnNldENvbnRlbnQoaHRtbF82YjMzZTA1MTBjNmQ0ZTA3YWFjM2VlODM4ZjRiMGQ5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IwNTdmMDA2ZjA5ZDQ0MTQ4Y2E4MjM3ZmY1N2I1NTQyLmJpbmRQb3B1cChwb3B1cF84MjllYWZmZTU2MjE0MDk0OWZlNDM3NmIyMTdhMmJjNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JkOWM0MTdiZDNhNjQ1ZTk4OWI1NDcxYjFlYzliOThhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguNDM3NDc4LC0xMDUuMjQzNDQxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNzZmY2JlYmFiMjA0ZTQ4OWVkZWVhNTYzNDcwOTAwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NjM0YjQzYzlkMjE0YmU0OTM3ODY0YzFlMmNlYjQ3NiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfODYzNGI0M2M5ZDIxNGJlNDkzNzg2NGMxZTJjZWI0NzYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENDRkEgRmFybWVycyBNYXJrZXQgQ2Fub24gQ2l0eTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNzZmY2JlYmFiMjA0ZTQ4OWVkZWVhNTYzNDcwOTAwMy5zZXRDb250ZW50KGh0bWxfODYzNGI0M2M5ZDIxNGJlNDkzNzg2NGMxZTJjZWI0NzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iZDljNDE3YmQzYTY0NWU5ODliNTQ3MWIxZWM5Yjk4YS5iaW5kUG9wdXAocG9wdXBfZTc2ZmNiZWJhYjIwNGU0ODllZGVlYTU2MzQ3MDkwMDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83MTI3OGNmM2VlZmE0ODA4ODZhODFjNmM4YTRhMmY5OSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjUzMjY1NywtMTA1Ljk5NDEyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ODgxNDAyOTliYjk0YjZlYjc0MjgxNzdjYjNiM2Q2MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MGZiMjY2NGU5NjE0OTYwOWQwYzk4MTc2MjJlZDU2YSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOTBmYjI2NjRlOTYxNDk2MDlkMGM5ODE3NjIyZWQ1NmEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENDRkEgU2FsaWRhIEZhcm1lcnMgTWFya2V0IDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ODgxNDAyOTliYjk0YjZlYjc0MjgxNzdjYjNiM2Q2MC5zZXRDb250ZW50KGh0bWxfOTBmYjI2NjRlOTYxNDk2MDlkMGM5ODE3NjIyZWQ1NmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83MTI3OGNmM2VlZmE0ODA4ODZhODFjNmM4YTRhMmY5OS5iaW5kUG9wdXAocG9wdXBfNTg4MTQwMjk5YmI5NGI2ZWI3NDI4MTc3Y2IzYjNkNjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kNDczZTg4MzI1OTg0NGQxYWQyOTU0OTc4YmU2ODQ2MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjkyODQzLC0xMDUuMDg5OTMzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ODZjYWZkMDk3ZGY0MGM5OWVjZDE5OTE3N2VkN2M3NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMDRjODY1ZWMwYTI0OTQwODhjMWNmZWM1ZGY1NzBhYiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZjA0Yzg2NWVjMGEyNDk0MDg4YzFjZmVjNWRmNTcwYWIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEJyb29tZmllbGQgRmFybWVycyYjMzk7IE1hcmtldCBhdCBIb2x5IENvbWZvcnRlciBFcGlzY29wYWwgQ2h1cmNoPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc4NmNhZmQwOTdkZjQwYzk5ZWNkMTk5MTc3ZWQ3Yzc3LnNldENvbnRlbnQoaHRtbF9mMDRjODY1ZWMwYTI0OTQwODhjMWNmZWM1ZGY1NzBhYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q0NzNlODgzMjU5ODQ0ZDFhZDI5NTQ5NzhiZTY4NDYxLmJpbmRQb3B1cChwb3B1cF83ODZjYWZkMDk3ZGY0MGM5OWVjZDE5OTE3N2VkN2M3Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2I2OGJhZWQzOTFjNzQ5NzQ4ZTRmOTMxZGFmODBiM2FlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuOTI1MDA1MiwtMTA1Ljc4NjQ3NjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I1NmFlYTNhZGM5OTQ0YThhZjkyM2U0ODU2MDQ5MGE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlZWFiZGEwNWFmODRkOWRiYWI0YTBlZTdmMjg5YjRhID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jZWVhYmRhMDVhZjg0ZDlkYmFiNGEwZWU3ZjI4OWI0YSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgV2ludGVyIFBhcmsgRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjU2YWVhM2FkYzk5NDRhOGFmOTIzZTQ4NTYwNDkwYTguc2V0Q29udGVudChodG1sX2NlZWFiZGEwNWFmODRkOWRiYWI0YTBlZTdmMjg5YjRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjY4YmFlZDM5MWM3NDk3NDhlNGY5MzFkYWY4MGIzYWUuYmluZFBvcHVwKHBvcHVwX2I1NmFlYTNhZGM5OTQ0YThhZjkyM2U0ODU2MDQ5MGE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTM1ZTYxM2I0MGE3NDQ1Mjk2YTI3Njk0MDQxZjA5ZGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi4wNjUzNywtMTA0LjE4NDM5NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWFmYWRmNjdjMWNlNGFjZTg0M2EzOTJkZTkwYjYyNDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDZiYjEwNGEzMzdiNDE5MWJmZTQwNmM0ODIzMzgyNTggPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzQ2YmIxMDRhMzM3YjQxOTFiZmU0MDZjNDgyMzM4MjU4IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBUb3JyaW5ndG9uIEZhcm1lciYjMzk7cyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWFmYWRmNjdjMWNlNGFjZTg0M2EzOTJkZTkwYjYyNDguc2V0Q29udGVudChodG1sXzQ2YmIxMDRhMzM3YjQxOTFiZmU0MDZjNDgyMzM4MjU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTM1ZTYxM2I0MGE3NDQ1Mjk2YTI3Njk0MDQxZjA5ZGIuYmluZFBvcHVwKHBvcHVwXzVhZmFkZjY3YzFjZTRhY2U4NDNhMzkyZGU5MGI2MjQ4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmY2M2JhOTJkMDc2NDM4M2FkNjUxZTVmNDhkNDNiMjQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS44ODkxNTUsLTEwNC45OTExODJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJlNTYwNWRlN2JjYTRhZjE5NDY3MjhjNmJkMDYyOWViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVjMWFjZjNiYTdmMjRiYzE4ZjgxZGE3MWRhNzQ5YWI5ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF81YzFhY2YzYmE3ZjI0YmMxOGY4MWRhNzFkYTc0OWFiOSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgTm9ydGhnbGVubiBNYWxsIEZhcm1lcnMgbWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJlNTYwNWRlN2JjYTRhZjE5NDY3MjhjNmJkMDYyOWViLnNldENvbnRlbnQoaHRtbF81YzFhY2YzYmE3ZjI0YmMxOGY4MWRhNzFkYTc0OWFiOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzJmNjNiYTkyZDA3NjQzODNhZDY1MWU1ZjQ4ZDQzYjI0LmJpbmRQb3B1cChwb3B1cF8yZTU2MDVkZTdiY2E0YWYxOTQ2NzI4YzZiZDA2MjllYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzlmNzNjMGMwNWExMjQ4MzFiZTdlZTI0NmEyNWNlYWZiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNjAxODQ3LC0xMDQuOTU4MDc3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZDFlMjU1MzE0OTk0NDQ1OTExYmNhZTdlMTJiZTU2MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMzA5NmFiYWMwYjI0NTI5OTBiZTUzMDk0YzdlMTNlOSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZDMwOTZhYmFjMGIyNDUyOTkwYmU1MzA5NGM3ZTEzZTkiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFRoZSBWaWN0b3J5IE1hcmtldCBvbiBTb3V0aCBVbml2ZXJzaXR5IDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZDFlMjU1MzE0OTk0NDQ1OTExYmNhZTdlMTJiZTU2MC5zZXRDb250ZW50KGh0bWxfZDMwOTZhYmFjMGIyNDUyOTkwYmU1MzA5NGM3ZTEzZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ZjczYzBjMDVhMTI0ODMxYmU3ZWUyNDZhMjVjZWFmYi5iaW5kUG9wdXAocG9wdXBfNGQxZTI1NTMxNDk5NDQ0NTkxMWJjYWU3ZTEyYmU1NjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNzNlN2ZjMGRlMDc0ZDU2ODBhM2I3NTJlYjk3MTA2NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjA4NDksLTEwNS45MzddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4YWY4OGE3NjUzMTQ1MTZiNzM1NzNiY2VkMzQ2NjE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZhMTc5Yzc3ZDlhZDRlNzk4YTI0NzQ0OTk5YjAwMzhkID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF82YTE3OWM3N2Q5YWQ0ZTc5OGEyNDc0NDk5OWIwMDM4ZCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgR3JhbmJ5IEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U4YWY4OGE3NjUzMTQ1MTZiNzM1NzNiY2VkMzQ2NjE1LnNldENvbnRlbnQoaHRtbF82YTE3OWM3N2Q5YWQ0ZTc5OGEyNDc0NDk5OWIwMDM4ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E3M2U3ZmMwZGUwNzRkNTY4MGEzYjc1MmViOTcxMDY3LmJpbmRQb3B1cChwb3B1cF9lOGFmODhhNzY1MzE0NTE2YjczNTczYmNlZDM0NjYxNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzdjMDQ2MzdlYTQ2NTRiNDFhNjQ3ZGFmYjE3YTY0ZjAyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNTE4NiwtMTA0Ljc2MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTllMTBmMDBiM2IzNDYzZTk5YzhiYWFjYzkyZjg0ZDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGI5YTViMThkZjIzNDc3NmJjZTY5OWRiZWM0MzkyMTQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzRiOWE1YjE4ZGYyMzQ3NzZiY2U2OTlkYmVjNDM5MjE0IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBQYXJrZXJmZXN0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5ZTEwZjAwYjNiMzQ2M2U5OWM4YmFhY2M5MmY4NGQ4LnNldENvbnRlbnQoaHRtbF80YjlhNWIxOGRmMjM0Nzc2YmNlNjk5ZGJlYzQzOTIxNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdjMDQ2MzdlYTQ2NTRiNDFhNjQ3ZGFmYjE3YTY0ZjAyLmJpbmRQb3B1cChwb3B1cF85OWUxMGYwMGIzYjM0NjNlOTljOGJhYWNjOTJmODRkOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2M2OTgxZjI2ZTkzYTRjOWI5OGQ2YzdkMDc0ZjYyZDBiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNTQ1MzgzLC0xMDUuNTczMTg0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MWFhODZkOTk5NDU0MGNkODYwNGUyZWJmMzdkNTRlYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYThlMzA3NzU5MGU0YTZjOTgxMzhiYTIzOTI5NjAyMCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYWE4ZTMwNzc1OTBlNGE2Yzk4MTM4YmEyMzkyOTYwMjAiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhcGl0YW4gRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MWFhODZkOTk5NDU0MGNkODYwNGUyZWJmMzdkNTRlYy5zZXRDb250ZW50KGh0bWxfYWE4ZTMwNzc1OTBlNGE2Yzk4MTM4YmEyMzkyOTYwMjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jNjk4MWYyNmU5M2E0YzliOThkNmM3ZDA3NGY2MmQwYi5iaW5kUG9wdXAocG9wdXBfODFhYTg2ZDk5OTQ1NDBjZDg2MDRlMmViZjM3ZDU0ZWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZDdhN2ZjODMwMmE0NDBhYjY4MDkyZDcyMzg3MGNiYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjI2OCwtMTA0LjYxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMWQ2NWNhZTRhYWM0ZTMwYWNjOTc0YmYzNWRlNDllZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMjlkZmJjYmRjODU0N2M0OTk2YjgxY2IwMGE3N2E2MSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZDI5ZGZiY2JkYzg1NDdjNDk5NmI4MWNiMDBhNzdhNjEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFRoZSBNYWluIEV2ZW50IGFuZCBGYXJtZXJzJiMzOTsgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAxZDY1Y2FlNGFhYzRlMzBhY2M5NzRiZjM1ZGU0OWVmLnNldENvbnRlbnQoaHRtbF9kMjlkZmJjYmRjODU0N2M0OTk2YjgxY2IwMGE3N2E2MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZkN2E3ZmM4MzAyYTQ0MGFiNjgwOTJkNzIzODcwY2JiLmJpbmRQb3B1cChwb3B1cF8wMWQ2NWNhZTRhYWM0ZTMwYWNjOTc0YmYzNWRlNDllZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZiZTMyZmRmMTc0MTQyMTI4NDRhMDRlMGE5ODk5NzE0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguODMwNTQzLC0xMDQuODIyMzA5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZjgyMzAyMmY4NDc0MWIyOTVkZTdhMzM5YTIyM2UzZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85N2M1MDRlMGQzZDI0OWE1OGZlOTdhOWQ0NzMxOTc4OSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOTdjNTA0ZTBkM2QyNDlhNThmZTk3YTlkNDczMTk3ODkiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENvbG9yYWRvIEZhcm0gYW5kIEFydCBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWY4MjMwMjJmODQ3NDFiMjk1ZGU3YTMzOWEyMjNlM2Quc2V0Q29udGVudChodG1sXzk3YzUwNGUwZDNkMjQ5YTU4ZmU5N2E5ZDQ3MzE5Nzg5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmJlMzJmZGYxNzQxNDIxMjg0NGEwNGUwYTk4OTk3MTQuYmluZFBvcHVwKHBvcHVwX2VmODIzMDIyZjg0NzQxYjI5NWRlN2EzMzlhMjIzZTNkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzJhNDM5M2Q5Mjk1NDJmYmFjNGNkNGE4MzVjMjhiMzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS41NTQ3LC0xMDQuODg1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83M2MyZTA4OWRmNGM0MjNhOWM4NmM3Y2E1M2YxNjc2NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZmJmYTBkNThkMmE0NDA1YjZhYTBlNmQyY2M3Yjk3ZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMmZiZmEwZDU4ZDJhNDQwNWI2YWEwZTZkMmNjN2I5N2YiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIExvbmV0cmVlIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzczYzJlMDg5ZGY0YzQyM2E5Yzg2YzdjYTUzZjE2NzY3LnNldENvbnRlbnQoaHRtbF8yZmJmYTBkNThkMmE0NDA1YjZhYTBlNmQyY2M3Yjk3Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzcyYTQzOTNkOTI5NTQyZmJhYzRjZDRhODM1YzI4YjM1LmJpbmRQb3B1cChwb3B1cF83M2MyZTA4OWRmNGM0MjNhOWM4NmM3Y2E1M2YxNjc2Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzBhMDUwMTViNDY3YTQ3NzI5NjIwZWM5ZDQ4NDk1YmNlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNTM1NSwtMTA0Ljc4NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2I2MzcwMDhkMDBkNGZkMmFhMGYzMGNiOTI5Y2FiYjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2UwMGI0YjFkMmQ1NGZiMWEzZDQ4NTk4MTMwYzVhYzEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2NlMDBiNGIxZDJkNTRmYjFhM2Q0ODU5ODEzMGM1YWMxIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBQYXJrZXIgRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2I2MzcwMDhkMDBkNGZkMmFhMGYzMGNiOTI5Y2FiYjkuc2V0Q29udGVudChodG1sX2NlMDBiNGIxZDJkNTRmYjFhM2Q0ODU5ODEzMGM1YWMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGEwNTAxNWI0NjdhNDc3Mjk2MjBlYzlkNDg0OTViY2UuYmluZFBvcHVwKHBvcHVwXzNiNjM3MDA4ZDAwZDRmZDJhYTBmMzBjYjkyOWNhYmI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDM2MzhjMTgzYjdjNGZiOTkxMzFjZTA1N2RjZTNiMDggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC45Mzc3MTYsLTEwNC44MTQ2ODhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlYzg5MzA4M2QzNjQ3Y2Y5Y2U5YzU3ZTk1MGFhZDA2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IyY2RmZTdkNTVmNjQxZmJiNmU0OTZmMmZiNDA1OGNjID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9iMmNkZmU3ZDU1ZjY0MWZiYjZlNDk2ZjJmYjQwNThjYyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ29sb3JhZG8gRmFybSBhbmQgQXJ0IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZWM4OTMwODNkMzY0N2NmOWNlOWM1N2U5NTBhYWQwNi5zZXRDb250ZW50KGh0bWxfYjJjZGZlN2Q1NWY2NDFmYmI2ZTQ5NmYyZmI0MDU4Y2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80MzYzOGMxODNiN2M0ZmI5OTEzMWNlMDU3ZGNlM2IwOC5iaW5kUG9wdXAocG9wdXBfMWVjODkzMDgzZDM2NDdjZjljZTljNTdlOTUwYWFkMDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85ZWZkZGNiNGFjNTI0ZTdjODE4OTM5NzNlOTFlMWIzZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjU0NzA4MiwtMTA0Ljk5OTY0OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGZkNzI4OWQ4MDYwNDgxNWIyOGYxODc2Mjc2N2M5N2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmM5MTIwMmJhMWI5NDM0OGE0MDUzNWI5ODdjNmM0YTIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzJjOTEyMDJiYTFiOTQzNDhhNDA1MzViOTg3YzZjNGEyIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBIaWdobGFuZHMgUmFuY2ggRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZmQ3Mjg5ZDgwNjA0ODE1YjI4ZjE4NzYyNzY3Yzk3Yy5zZXRDb250ZW50KGh0bWxfMmM5MTIwMmJhMWI5NDM0OGE0MDUzNWI5ODdjNmM0YTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ZWZkZGNiNGFjNTI0ZTdjODE4OTM5NzNlOTFlMWIzZi5iaW5kUG9wdXAocG9wdXBfZGZkNzI4OWQ4MDYwNDgxNWIyOGYxODc2Mjc2N2M5N2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZmRmMjBjY2YxYzA0Y2ZiODNhMmY0N2JmODhmMzhmOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjYxMDg1NiwtMTA1LjA5MjY3MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGEwY2E3MGVmMDZiNDU0NDlhOTBjNzcxMTJmYTM0OTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjliOWZjODNkM2E2NDUwNWE5MjQ4ODExZTM0NGU1Y2MgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2Y5YjlmYzgzZDNhNjQ1MDVhOTI0ODgxMWUzNDRlNWNjIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBTb3V0aHdlc3QgUGxhemEgRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGEwY2E3MGVmMDZiNDU0NDlhOTBjNzcxMTJmYTM0OTIuc2V0Q29udGVudChodG1sX2Y5YjlmYzgzZDNhNjQ1MDVhOTI0ODgxMWUzNDRlNWNjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGZkZjIwY2NmMWMwNGNmYjgzYTJmNDdiZjg4ZjM4ZjkuYmluZFBvcHVwKHBvcHVwXzBhMGNhNzBlZjA2YjQ1NDQ5YTkwYzc3MTEyZmEzNDkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTlhOThjMGRiZmJlNDgyZWIwMWI0MGQxMTUzNWM5MmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS43MDY5LC0xMDUuNjk3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZWNkNzRiNzQ2ZDk0MWJkYjNjYTU1YTJkOGFjZmU0ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZDEyNWYzNDM2Yjc0YTc4OWEyOTI3YTI1NmQ3ZDE0OCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMGQxMjVmMzQzNmI3NGE3ODlhMjkyN2EyNTZkN2QxNDgiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEdlb3JnZXRvd24gRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGVjZDc0Yjc0NmQ5NDFiZGIzY2E1NWEyZDhhY2ZlNGQuc2V0Q29udGVudChodG1sXzBkMTI1ZjM0MzZiNzRhNzg5YTI5MjdhMjU2ZDdkMTQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTlhOThjMGRiZmJlNDgyZWIwMWI0MGQxMTUzNWM5MmIuYmluZFBvcHVwKHBvcHVwXzBlY2Q3NGI3NDZkOTQxYmRiM2NhNTVhMmQ4YWNmZTRkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTNjMTY0Mzg4OTI4NDk2Y2I2NTkzOGE1YmU3YWNlOTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS43MzI4LC0xMDUuMDA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZGFmYTIzMGZhYmQ0MmUzOTI2YmJkYWZmMmU2ODFhNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNWE0OTgzOTQyYzA0ZmRjYmEzOTk5ODE0ZjM0ZjVlYSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMDVhNDk4Mzk0MmMwNGZkY2JhMzk5OTgxNGYzNGY1ZWEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFRoZSBPc2FnZSBNZXJjYWRvPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NkYWZhMjMwZmFiZDQyZTM5MjZiYmRhZmYyZTY4MWE2LnNldENvbnRlbnQoaHRtbF8wNWE0OTgzOTQyYzA0ZmRjYmEzOTk5ODE0ZjM0ZjVlYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2EzYzE2NDM4ODkyODQ5NmNiNjU5MzhhNWJlN2FjZTkyLmJpbmRQb3B1cChwb3B1cF9jZGFmYTIzMGZhYmQ0MmUzOTI2YmJkYWZmMmU2ODFhNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzAxMTBiMWRjYmVlMzQ5MDdhOGNjM2VhZDM3NmI0MmU4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNzExMTAwNywtMTA1LjA4MTM1NTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjMmFhN2RmY2JmMzQwOTM4MTBkMTBiNWRiMGI5N2EyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNjYzQ4MTY1MDJiODQwNGZiMjRhZjE2ZDkxMWQwMjVjID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8zY2M0ODE2NTAyYjg0MDRmYjI0YWYxNmQ5MTFkMDI1YyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQmVsbWFyIEZyZXNoIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YzJhYTdkZmNiZjM0MDkzODEwZDEwYjVkYjBiOTdhMi5zZXRDb250ZW50KGh0bWxfM2NjNDgxNjUwMmI4NDA0ZmIyNGFmMTZkOTExZDAyNWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wMTEwYjFkY2JlZTM0OTA3YThjYzNlYWQzNzZiNDJlOC5iaW5kUG9wdXAocG9wdXBfN2MyYWE3ZGZjYmYzNDA5MzgxMGQxMGI1ZGIwYjk3YTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80MDQyNmQwMjYzNjc0ZjhmYmFlMjNiOTRlMzc2OThiMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5Ljc2OTkwNCwtMTA1LjA3NTI0NzFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRkMzFlYmZmZGM3ODQyNzQ4MjM2NmY5YWVjMGFlY2EyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E3YmJhYjUwNDg4YzQwYzNiMTdjNjdiMjNlYzY0Y2UxID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9hN2JiYWI1MDQ4OGM0MGMzYjE3YzY3YjIzZWM2NGNlMSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgRm91ciBTZWFzb25zIEZhcm1lcnMgYW5kIEFydGlzYW5zIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZDMxZWJmZmRjNzg0Mjc0ODIzNjZmOWFlYzBhZWNhMi5zZXRDb250ZW50KGh0bWxfYTdiYmFiNTA0ODhjNDBjM2IxN2M2N2IyM2VjNjRjZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80MDQyNmQwMjYzNjc0ZjhmYmFlMjNiOTRlMzc2OThiMS5iaW5kUG9wdXAocG9wdXBfNGQzMWViZmZkYzc4NDI3NDgyMzY2ZjlhZWMwYWVjYTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85MzJhOGEyNDIwMDk0YWYxOTJiMTQwYWQyZDI0ZDgwZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjc1ODg4LC0xMDUuMzg0NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzUzMzlkODAwYjQ2NDJmMGJkZjgwN2NiNmIxODI1NDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWRjZTBkOWExNDA3NGYzYzhkZThhNTg4YzZiZmQ2ZTkgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2VkY2UwZDlhMTQwNzRmM2M4ZGU4YTU4OGM2YmZkNmU5IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBKYWNrYWxvcGUgU3F1YXJlIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1MzM5ZDgwMGI0NjQyZjBiZGY4MDdjYjZiMTgyNTQ2LnNldENvbnRlbnQoaHRtbF9lZGNlMGQ5YTE0MDc0ZjNjOGRlOGE1ODhjNmJmZDZlOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkzMmE4YTI0MjAwOTRhZjE5MmIxNDBhZDJkMjRkODBlLmJpbmRQb3B1cChwb3B1cF83NTMzOWQ4MDBiNDY0MmYwYmRmODA3Y2I2YjE4MjU0Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzgzZGU5OTRjMTI3YjRhYzg4M2ZmZGZlNTI4MjFhMmE3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuMzYxMTk1LC0xMDQuNTk1NTUxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YjQ1NDkwZjY1ZGM0ODFmOWM1NWNjNDRlMDI4OWRlOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYTUzMTQ2ZGE4ODI0Mzc3OGQ1NTYyZGY0MjliYTc1YiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZGE1MzE0NmRhODgyNDM3NzhkNTU2MmRmNDI5YmE3NWIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEVsaXphYmV0aCBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YjQ1NDkwZjY1ZGM0ODFmOWM1NWNjNDRlMDI4OWRlOC5zZXRDb250ZW50KGh0bWxfZGE1MzE0NmRhODgyNDM3NzhkNTU2MmRmNDI5YmE3NWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84M2RlOTk0YzEyN2I0YWM4ODNmZmRmZTUyODIxYTJhNy5iaW5kUG9wdXAocG9wdXBfNGI0NTQ5MGY2NWRjNDgxZjljNTVjYzQ0ZTAyODlkZTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NjZhNzQ5OTAyNzk0MjUzYjFhMGI2ZDM0ODY3NGJhNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjU5MzAxMywtMTA1LjIyNzU0Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjgwMWE3OWNmOTk4NGQ4YWJhZDZiMWNlN2UyNzI0ZjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODJmZjUyZjAzMDZkNDI3OWIwNWIwNmU4NTZhYzQ3ZTIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzgyZmY1MmYwMzA2ZDQyNzliMDViMDZlODU2YWM0N2UyIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBMYXMgVmVnYXM6IFRyaS1Db3VudHkgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iODAxYTc5Y2Y5OTg0ZDhhYmFkNmIxY2U3ZTI3MjRmNi5zZXRDb250ZW50KGh0bWxfODJmZjUyZjAzMDZkNDI3OWIwNWIwNmU4NTZhYzQ3ZTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NjZhNzQ5OTAyNzk0MjUzYjFhMGI2ZDM0ODY3NGJhNS5iaW5kUG9wdXAocG9wdXBfYjgwMWE3OWNmOTk4NGQ4YWJhZDZiMWNlN2UyNzI0ZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZTQyMmM5NzRiODg0Yzk4OTYxZmU2MjJjNTM1ZThlMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjM5NjY5NCwtMTA0LjUyMTM5NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmQ3Mjc0MmY2NDQxNDRmYzhkZGYxZDk4MTdkZDBmYzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTBhMmNhMjhhNjY2NGU3MThmNjIyNWE1Mzc0NWM4NzggPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2UwYTJjYTI4YTY2NjRlNzE4ZjYyMjVhNTM3NDVjODc4IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBNYWluIFN0cmVldCBSb3N3ZWxsIEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmQ3Mjc0MmY2NDQxNDRmYzhkZGYxZDk4MTdkZDBmYzQuc2V0Q29udGVudChodG1sX2UwYTJjYTI4YTY2NjRlNzE4ZjYyMjVhNTM3NDVjODc4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGU0MjJjOTc0Yjg4NGM5ODk2MWZlNjIyYzUzNWU4ZTIuYmluZFBvcHVwKHBvcHVwX2JkNzI3NDJmNjQ0MTQ0ZmM4ZGRmMWQ5ODE3ZGQwZmM0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGJkODZjMTZkNjY4NDQwZDkzZDM1OWY0Y2FhMTEyMWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi41NTI3NDEsLTEwNS4yNzExNjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4ZTAwM2I3ZjY2NDQzZDE4ZDdhNDEwMTUxZDc2YmY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUzOWZkYTZhMzgyZDQ0ZjQ4NzVlMTkwMmY3OGUzM2FhID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF81MzlmZGE2YTM4MmQ0NGY0ODc1ZTE5MDJmNzhlMzNhYSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgTW9yZW5vIFZhbGxleSBGYXJtZXJzJiMzOTsgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4ZTAwM2I3ZjY2NDQzZDE4ZDdhNDEwMTUxZDc2YmY1LnNldENvbnRlbnQoaHRtbF81MzlmZGE2YTM4MmQ0NGY0ODc1ZTE5MDJmNzhlMzNhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBiZDg2YzE2ZDY2ODQ0MGQ5M2QzNTlmNGNhYTExMjFhLmJpbmRQb3B1cChwb3B1cF9jOGUwMDNiN2Y2NjQ0M2QxOGQ3YTQxMDE1MWQ3NmJmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E4N2ZmYjc0MTkwNTRjYjRiNWZhMGZmMjJiN2UyYmY5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuMDQ5MTc0MSwtMTA1LjA0NzQyMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YwZTgzMTE5YjU3MzQ1NzRhYzIwNTFlZDlmN2ZkY2IwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1NjRlOWQxNDNiYTQxNmE5MGUyOGI0NmU3YWQ1ODg3ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF80NTY0ZTlkMTQzYmE0MTZhOTBlMjhiNDZlN2FkNTg4NyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgRXJpZSBGYXJtZXJzJiMzOTsgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YwZTgzMTE5YjU3MzQ1NzRhYzIwNTFlZDlmN2ZkY2IwLnNldENvbnRlbnQoaHRtbF80NTY0ZTlkMTQzYmE0MTZhOTBlMjhiNDZlN2FkNTg4Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E4N2ZmYjc0MTkwNTRjYjRiNWZhMGZmMjJiN2UyYmY5LmJpbmRQb3B1cChwb3B1cF9mMGU4MzExOWI1NzM0NTc0YWMyMDUxZWQ5ZjdmZGNiMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzJjYjJiMmM3YjkyYjQ2YzE4NWZiNzcxMTE4YmE5N2U4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzIuOTI2NDksLTEwNS45NjA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jODY1Nzk2ZWFjMjc0OTY2OWQ4MzkyODE2MzM1NzkxMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNzYwYmJlZWIzZmU0NzMwODg1MjJkMWQzNjc0YWZlYyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZDc2MGJiZWViM2ZlNDczMDg4NTIyZDFkMzY3NGFmZWMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEFsYW1vZ29yZG8gT3Rlcm8gQ291bnR5IEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzg2NTc5NmVhYzI3NDk2NjlkODM5MjgxNjMzNTc5MTIuc2V0Q29udGVudChodG1sX2Q3NjBiYmVlYjNmZTQ3MzA4ODUyMmQxZDM2NzRhZmVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmNiMmIyYzdiOTJiNDZjMTg1ZmI3NzExMThiYTk3ZTguYmluZFBvcHVwKHBvcHVwX2M4NjU3OTZlYWMyNzQ5NjY5ZDgzOTI4MTYzMzU3OTEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGQ4ZWY0YzU1NDcyNDc1N2JmNDhmZjM4MWQ1MTA0ZjQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC4xMDExLC0xMDUuMTY5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMWVmZWFkZGE5ZjY0ODY3YmQ5YTZkNGU5ZGM1ODhlNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZGZjYTdhMDBjZTU0MDljODk3ZjEyOTBmMjdiNzRkZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMWRmY2E3YTAwY2U1NDA5Yzg5N2YxMjkwZjI3Yjc0ZGYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIE5pd290IEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxZWZlYWRkYTlmNjQ4NjdiZDlhNmQ0ZTlkYzU4OGU0LnNldENvbnRlbnQoaHRtbF8xZGZjYTdhMDBjZTU0MDljODk3ZjEyOTBmMjdiNzRkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RkOGVmNGM1NTQ3MjQ3NTdiZjQ4ZmYzODFkNTEwNGY0LmJpbmRQb3B1cChwb3B1cF9iMWVmZWFkZGE5ZjY0ODY3YmQ5YTZkNGU5ZGM1ODhlNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2FiODNjZjg5MWM5YTQwNDE4ZDE3NGNlMGYxMmUyYjNkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuNDA3MTUyLC0xMDUuNTc0NjA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZjY3MGUzMTk3NjQ0NmI0YWRjNWY2NGE5NzAyZWY2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZDQ5NzBkZjk4ZTE0NzVhYmRhZTQxNDdmMjMxNzBjMyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOWQ0OTcwZGY5OGUxNDc1YWJkYWU0MTQ3ZjIzMTcwYzMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFRhb3MgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZjY3MGUzMTk3NjQ0NmI0YWRjNWY2NGE5NzAyZWY2ZS5zZXRDb250ZW50KGh0bWxfOWQ0OTcwZGY5OGUxNDc1YWJkYWU0MTQ3ZjIzMTcwYzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hYjgzY2Y4OTFjOWE0MDQxOGQxNzRjZTBmMTJlMmIzZC5iaW5kUG9wdXAocG9wdXBfZWY2NzBlMzE5NzY0NDZiNGFkYzVmNjRhOTcwMmVmNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hYzAzYjdkOGUzYTI0YTA0ODcwNTg3YzlhMzJhZTM1NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjIzNzI5MywtMTA0Ljk5OTQ4OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzc4NTRiMTA1YmQ5NDE5MDk3YTZmY2M5Nzc3ODUyYmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWMyMjBjMWIwYWZlNDliMWE3NmNmNTE5ZGY1YThmZGUgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2VjMjIwYzFiMGFmZTQ5YjFhNzZjZjUxOWRmNWE4ZmRlIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBEb3dudG93biBNZWFkIEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzc4NTRiMTA1YmQ5NDE5MDk3YTZmY2M5Nzc3ODUyYmMuc2V0Q29udGVudChodG1sX2VjMjIwYzFiMGFmZTQ5YjFhNzZjZjUxOWRmNWE4ZmRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWMwM2I3ZDhlM2EyNGEwNDg3MDU4N2M5YTMyYWUzNTYuYmluZFBvcHVwKHBvcHVwXzM3ODU0YjEwNWJkOTQxOTA5N2E2ZmNjOTc3Nzg1MmJjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzkwNjNlNjE1NjVhNDRiNmFiNTVlOWJiNzNlYTUxNzMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC40MjMxMzgsLTEwNC42ODg1NDddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM5NGQxNGRmNjZmYTQxNGY5ZTBiMDIzZWY0ODgzM2I2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3YWJlZjU0OTQyMTQ1YmQ5MTdlNjBhMDU1ZDQ2MGQ0ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF83N2FiZWY1NDk0MjE0NWJkOTE3ZTYwYTA1NWQ0NjBkNCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgR3JlZWxleSBGYXJtZXJzIE1hcmtldCA8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzk0ZDE0ZGY2NmZhNDE0ZjllMGIwMjNlZjQ4ODMzYjYuc2V0Q29udGVudChodG1sXzc3YWJlZjU0OTQyMTQ1YmQ5MTdlNjBhMDU1ZDQ2MGQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzkwNjNlNjE1NjVhNDRiNmFiNTVlOWJiNzNlYTUxNzMuYmluZFBvcHVwKHBvcHVwXzM5NGQxNGRmNjZmYTQxNGY5ZTBiMDIzZWY0ODgzM2I2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjk4YWIyNzkyYjRiNGY0MGIyN2RjNDE5NjY4ZThkNDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC44NTgzMjIsLTEwNC45MTI4MTNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JmNzRjMzhkMThlZjQ5ZWJhN2I3MzhjNmM3MWU0NjNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RjZTcxYmQxYTNlMzQ3NTc4ZTgzNjA5NDA1ZTEwMzJiID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9kY2U3MWJkMWEzZTM0NzU3OGU4MzYwOTQwNWUxMDMyYiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgTWFuaXRvdSBDb21tdW5pdHkgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JmNzRjMzhkMThlZjQ5ZWJhN2I3MzhjNmM3MWU0NjNlLnNldENvbnRlbnQoaHRtbF9kY2U3MWJkMWEzZTM0NzU3OGU4MzYwOTQwNWUxMDMyYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y5OGFiMjc5MmI0YjRmNDBiMjdkYzQxOTY2OGU4ZDQ2LmJpbmRQb3B1cChwb3B1cF9iZjc0YzM4ZDE4ZWY0OWViYTdiNzM4YzZjNzFlNDYzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzE3ZTdmM2RlYTQ5YzQ1M2M5ZjJhNjYyMzAzNGE1OWMyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNjMzMzIxMywtMTA1LjMxNzIxNDZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2MjNmNzM0ZTMzZjQ3ZmRhNDQ4MGIzMTUzNmEzNTM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhZjQ5Yjc0YmE0ODRlYmViNzJlNDEyM2Q5NmViYzM3ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8wYWY0OWI3NGJhNDg0ZWJlYjcyZTQxMjNkOTZlYmMzNyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgRXZlcmdyZWVuIEZhcm1lcnMgTWFya2V0IGF0IEJlcmdlbiBWaWxsYWdlPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU2MjNmNzM0ZTMzZjQ3ZmRhNDQ4MGIzMTUzNmEzNTM4LnNldENvbnRlbnQoaHRtbF8wYWY0OWI3NGJhNDg0ZWJlYjcyZTQxMjNkOTZlYmMzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE3ZTdmM2RlYTQ5YzQ1M2M5ZjJhNjYyMzAzNGE1OWMyLmJpbmRQb3B1cChwb3B1cF81NjIzZjczNGUzM2Y0N2ZkYTQ0ODBiMzE1MzZhMzUzOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzJiNTU4M2Y5YjgzNTRiMDM4NTA5YWZjMzYwYWJkNmVmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMDU1OTUzLC0xMDQuOTUzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMGVmY2E0Mzc4ZWQ0MjA0YjllOGEyMDQzNjVhYWRmZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OTE5NmNhOGZlZTI0MDQ3YmI1MTk4MWM0YTM4YmM5NyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNDkxOTZjYThmZWUyNDA0N2JiNTE5ODFjNGEzOGJjOTciICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFBsYXR0ZSBDb3VudHkgRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjBlZmNhNDM3OGVkNDIwNGI5ZThhMjA0MzY1YWFkZmUuc2V0Q29udGVudChodG1sXzQ5MTk2Y2E4ZmVlMjQwNDdiYjUxOTgxYzRhMzhiYzk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmI1NTgzZjliODM1NGIwMzg1MDlhZmMzNjBhYmQ2ZWYuYmluZFBvcHVwKHBvcHVwX2IwZWZjYTQzNzhlZDQyMDRiOWU4YTIwNDM2NWFhZGZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDdjMzgxZmE0OWQ5NDZkZGFmOGI0MjQ3ZGJhMDE0Y2EgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MjIzMDksLTEwNS4wNTk2OTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QwZjAxZDMwOTc2ODRhNzA5OWQ3NTBiMzk3ZTYzMmMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4OGNhOTVhN2M1NDQ5MjA5YTdkMGQwNjAxNDExYzM5ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF82ODhjYTk1YTdjNTQ0OTIwOWE3ZDBkMDYwMTQxMWMzOSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgRm9ydCBDb2xsaW5zIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QwZjAxZDMwOTc2ODRhNzA5OWQ3NTBiMzk3ZTYzMmMyLnNldENvbnRlbnQoaHRtbF82ODhjYTk1YTdjNTQ0OTIwOWE3ZDBkMDYwMTQxMWMzOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q3YzM4MWZhNDlkOTQ2ZGRhZjhiNDI0N2RiYTAxNGNhLmJpbmRQb3B1cChwb3B1cF9kMGYwMWQzMDk3Njg0YTcwOTlkNzUwYjM5N2U2MzJjMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA0ZDk1YjdhZjcyZjRlMGJhMjhmNmNiODBiNzk5MWIzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNDI1MjY2OCwtMTA1LjA3OTIyNDVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IxNzg2MzgwMWRmYTRiNzRiNjczOTVhZWFkZTBmNmJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4OTQ1Zjc0YjlmYjRjOTNhYjU3MGEzMTg5YTRmNWViID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF81ODk0NWY3NGI5ZmI0YzkzYWI1NzBhMzE4OWE0ZjVlYiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgTG92ZWxhbmQgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMTc4NjM4MDFkZmE0Yjc0YjY3Mzk1YWVhZGUwZjZiZS5zZXRDb250ZW50KGh0bWxfNTg5NDVmNzRiOWZiNGM5M2FiNTcwYTMxODlhNGY1ZWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wNGQ5NWI3YWY3MmY0ZTBiYTI4ZjZjYjgwYjc5OTFiMy5iaW5kUG9wdXAocG9wdXBfYjE3ODYzODAxZGZhNGI3NGI2NzM5NWFlYWRlMGY2YmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wYjdhZmQ3NTJjYWY0ZmNjOTEzNDUxNDA2YTk1OTc4NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjI3MjEsLTEwNC42MjFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViNDIyZjdmYmVjNDQzNjZhM2YyMTcxMmZkNDQ0ODk4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1MmFlZjVjMzNhZjRhZTNhZjkyODU0YmEyZTA5YWI2ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9lNTJhZWY1YzMzYWY0YWUzYWY5Mjg1NGJhMmUwOWFiNiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgRmFybWVycyBNYXJrZXQgb2YgUHVlYmxvPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ViNDIyZjdmYmVjNDQzNjZhM2YyMTcxMmZkNDQ0ODk4LnNldENvbnRlbnQoaHRtbF9lNTJhZWY1YzMzYWY0YWUzYWY5Mjg1NGJhMmUwOWFiNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBiN2FmZDc1MmNhZjRmY2M5MTM0NTE0MDZhOTU5Nzg0LmJpbmRQb3B1cChwb3B1cF9lYjQyMmY3ZmJlYzQ0MzY2YTNmMjE3MTJmZDQ0NDg5OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2YwYzY4ZjI0ZmIyYzRjYzA5ZWI3YmVkMmJhNTEzZTYwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNzg5NywtMTA1LjFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxYTNlMmI2MjUxNjQxZTU5MDkwMTlmOTMzMmQzYjA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhmM2QwNTFmZmU4NDQwNGJiYzdhYjdhYmNhYTQxNmMzID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF84ZjNkMDUxZmZlODQ0MDRiYmM3YWI3YWJjYWE0MTZjMyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgTWFya2V0IGF0IEVjaHRlcuKAmXMgR2FyZGVuIENlbnRlcjwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MWEzZTJiNjI1MTY0MWU1OTA5MDE5ZjkzMzJkM2IwOC5zZXRDb250ZW50KGh0bWxfOGYzZDA1MWZmZTg0NDA0YmJjN2FiN2FiY2FhNDE2YzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mMGM2OGYyNGZiMmM0Y2MwOWViN2JlZDJiYTUxM2U2MC5iaW5kUG9wdXAocG9wdXBfOTFhM2UyYjYyNTE2NDFlNTkwOTAxOWY5MzMyZDNiMDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jMjBkYWUzYjM3YjU0NzFkYWRiMGNiZjY4NDFhOGMyMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1Ljk3MzkyMiwtMTA1LjMzMDIxOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTMyMWJkMmQ1YTNhNDNmMTg2NzY1YzczNjMwMzNjZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzAyY2VkYjgzMmRmNDE4MmE0ZDFjMDY2YTM0OWRiMjUgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzMwMmNlZGI4MzJkZjQxODJhNGQxYzA2NmEzNDlkYjI1IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBNb3JhIFZhbGxleSBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMzIxYmQyZDVhM2E0M2YxODY3NjVjNzM2MzAzM2NkMi5zZXRDb250ZW50KGh0bWxfMzAyY2VkYjgzMmRmNDE4MmE0ZDFjMDY2YTM0OWRiMjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jMjBkYWUzYjM3YjU0NzFkYWRiMGNiZjY4NDFhOGMyMS5iaW5kUG9wdXAocG9wdXBfZTMyMWJkMmQ1YTNhNDNmMTg2NzY1YzczNjMwMzNjZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82Zjc2YzU2ZDI4Mjc0Y2E5OWEzZjNiYWRlZDFhYjc3OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUzMDEsLTEwNC43MTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkY2MzNTdhZDlhMTQ1ZGM4NTkwYTM5ZGRmYzI3ZjNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I0NTNiY2VhZDQ4MTQ4NDhiNTg4YTQxMzg3MTVmYjUwID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9iNDUzYmNlYWQ0ODE0ODQ4YjU4OGE0MTM4NzE1ZmI1MCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgR2FyZGVuIG9mIEVhdG9uIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhkY2MzNTdhZDlhMTQ1ZGM4NTkwYTM5ZGRmYzI3ZjNiLnNldENvbnRlbnQoaHRtbF9iNDUzYmNlYWQ0ODE0ODQ4YjU4OGE0MTM4NzE1ZmI1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZmNzZjNTZkMjgyNzRjYTk5YTNmM2JhZGVkMWFiNzc4LmJpbmRQb3B1cChwb3B1cF84ZGNjMzU3YWQ5YTE0NWRjODU5MGEzOWRkZmMyN2YzYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzAxYTVjMzk4YjQyMjQ3NTNiNzEyMzczNmE0YWM1YzA3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNzU1NCwtMTA1LjIyNl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjE0YWYwMWQzMmU1NDM5M2FlZThlNWM3M2MwMDJlZDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjM2NDlmNTMxZTk2NGJlMThhMzJmMzcyMjhiMjI3NWEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2IzNjQ5ZjUzMWU5NjRiZTE4YTMyZjM3MjI4YjIyNzVhIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBHb2xkZW4gRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjE0YWYwMWQzMmU1NDM5M2FlZThlNWM3M2MwMDJlZDYuc2V0Q29udGVudChodG1sX2IzNjQ5ZjUzMWU5NjRiZTE4YTMyZjM3MjI4YjIyNzVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDFhNWMzOThiNDIyNDc1M2I3MTIzNzM2YTRhYzVjMDcuYmluZFBvcHVwKHBvcHVwXzIxNGFmMDFkMzJlNTQzOTNhZWU4ZTVjNzNjMDAyZWQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODNjYzZkNWI2ZDUzNDA0ZWEzZDhlNjFiOTdjMzExOTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODMzMzk3LC0xMDUuMTY1NTU0Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2ViZWJlMjI4OWQzNDdmNWIxMzRmMmU4NmVlZmI2OTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzZmNWUxNzMxOGY1NDY0NWE1OTQ5N2RjOWMyZmQ4ZjkgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2M2ZjVlMTczMThmNTQ2NDVhNTk0OTdkYzljMmZkOGY5IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBHYXJkbmVyIEZhcm1lciAmYW1wOyBDcmFmdCBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2ViZWJlMjI4OWQzNDdmNWIxMzRmMmU4NmVlZmI2OTguc2V0Q29udGVudChodG1sX2M2ZjVlMTczMThmNTQ2NDVhNTk0OTdkYzljMmZkOGY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODNjYzZkNWI2ZDUzNDA0ZWEzZDhlNjFiOTdjMzExOTAuYmluZFBvcHVwKHBvcHVwX2NlYmViZTIyODlkMzQ3ZjViMTM0ZjJlODZlZWZiNjk4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmRmNzdhOTk0ODEwNDA2OWFmYTdlZDA2OThhYmQ3OGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC45NDU0LC0xMDQuNzk2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYTgzODc3MzUyOTM0MzJhOTk4MWY4OTcxZjk3OGQ0ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84OGUwZjIyYWQwNzA0M2NlYjViODcwOWFhNjMwZmQ2ZCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfODhlMGYyMmFkMDcwNDNjZWI1Yjg3MDlhYTYzMGZkNmQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENoYXBlbCBIaWxsIE1hbGwgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYTgzODc3MzUyOTM0MzJhOTk4MWY4OTcxZjk3OGQ0ZC5zZXRDb250ZW50KGh0bWxfODhlMGYyMmFkMDcwNDNjZWI1Yjg3MDlhYTYzMGZkNmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iZGY3N2E5OTQ4MTA0MDY5YWZhN2VkMDY5OGFiZDc4ZC5iaW5kUG9wdXAocG9wdXBfZGE4Mzg3NzM1MjkzNDMyYTk5ODFmODk3MWY5NzhkNGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84YTEzY2E5NTRkYzQ0NTkwYjMwZDRkYmFhZDA0ODQyNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5Ljk4NjksLTEwNS4wOTRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2Y2IwZGYwZWRhNzRlMTI4MDAwMzQ4ZDU1NjAzZjhjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhmNDhjOTg5MGMzMTQyNTM4NTdiYTlmZTYxNDhmNzBkID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF84ZjQ4Yzk4OTBjMzE0MjUzODU3YmE5ZmU2MTQ4ZjcwZCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgSmF4IEZhcm1lciYjMzk7cyBNYXJrZXQgaW4gTGFmYXlldHRlIDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NmNiMGRmMGVkYTc0ZTEyODAwMDM0OGQ1NTYwM2Y4Yy5zZXRDb250ZW50KGh0bWxfOGY0OGM5ODkwYzMxNDI1Mzg1N2JhOWZlNjE0OGY3MGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84YTEzY2E5NTRkYzQ0NTkwYjMwZDRkYmFhZDA0ODQyNC5iaW5kUG9wdXAocG9wdXBfNzZjYjBkZjBlZGE3NGUxMjgwMDAzNDhkNTU2MDNmOGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81NmU3NDQ4YjVjYTU0MmY3YjQ4NGEwOTMxYTBhYzE4ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjM3MjgsLTEwNS42ODJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQwZjdiOTY0NGYxYjQ3Mjg4MTYwYTAxZTQyMTdlMjE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1ODk5MmZiNDViMTQ4NWViZWNmMGU1NTM0ZGExMDMyID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9iNTg5OTJmYjQ1YjE0ODVlYmVjZjBlNTUzNGRhMTAzMiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ290b3BheGkgRmFybWVycyBNYXJrZXQgPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQwZjdiOTY0NGYxYjQ3Mjg4MTYwYTAxZTQyMTdlMjE3LnNldENvbnRlbnQoaHRtbF9iNTg5OTJmYjQ1YjE0ODVlYmVjZjBlNTUzNGRhMTAzMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU2ZTc0NDhiNWNhNTQyZjdiNDg0YTA5MzFhMGFjMThlLmJpbmRQb3B1cChwb3B1cF80MGY3Yjk2NDRmMWI0NzI4ODE2MGEwMWU0MjE3ZTIxNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzlhNjZkMjVmMmIwOTQzNmNhOWRiNThiMzcxZTRhY2Y0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuODQ4OCwtMTA1LjE1NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWViNjM4M2Y3Y2UxNGNjZDgzYjQ1ZDI5OWUyNWE2YjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDgzMDczZDM3NGIzNDA3MDg3YzNkZGVmMDlhNzkyOWYgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzQ4MzA3M2QzNzRiMzQwNzA4N2MzZGRlZjA5YTc5MjlmIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBBcnZhZGEgRml2ZSBQYXJrcyBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZWI2MzgzZjdjZTE0Y2NkODNiNDVkMjk5ZTI1YTZiNS5zZXRDb250ZW50KGh0bWxfNDgzMDczZDM3NGIzNDA3MDg3YzNkZGVmMDlhNzkyOWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85YTY2ZDI1ZjJiMDk0MzZjYTlkYjU4YjM3MWU0YWNmNC5iaW5kUG9wdXAocG9wdXBfNWViNjM4M2Y3Y2UxNGNjZDgzYjQ1ZDI5OWUyNWE2YjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83MmY3Mzg4OWFlY2M0Y2YyODFiMzE4MGUwOGExNjc5OSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjM4NzUzNiwtMTA1LjA3ODQ5MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODQzMGZlMTUyZjA5NDczZjg4MWU3YzMzZjNiODRmYWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzNjMTY1MTIyNTBlNDhjN2EzNDQxZTkyNDllYjk5OTMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzMzYzE2NTEyMjUwZTQ4YzdhMzQ0MWU5MjQ5ZWI5OTkzIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDaXR5IG9mIExvdmVsYW5kIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg0MzBmZTE1MmYwOTQ3M2Y4ODFlN2MzM2YzYjg0ZmFkLnNldENvbnRlbnQoaHRtbF8zM2MxNjUxMjI1MGU0OGM3YTM0NDFlOTI0OWViOTk5Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzcyZjczODg5YWVjYzRjZjI4MWIzMTgwZTA4YTE2Nzk5LmJpbmRQb3B1cChwb3B1cF84NDMwZmUxNTJmMDk0NzNmODgxZTdjMzNmM2I4NGZhZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzNjMTRlNDFmYTVlNDQ0OTViMDk0YTkyNzIyODc0OGE0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguMTM2MDU0LC0xMDUuNDY3MDI3NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjBhNzM2NTRkZTQ3NGExNmJjNTQzOWFlZGU0OGU3NTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDY4ZDdkZjQwMzU5NGMxMThmYWVhMjRjYTA4ZGY1MWIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzQ2OGQ3ZGY0MDM1OTRjMTE4ZmFlYTI0Y2EwOGRmNTFiIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBXZXN0Y2xpZmZlIEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjBhNzM2NTRkZTQ3NGExNmJjNTQzOWFlZGU0OGU3NTEuc2V0Q29udGVudChodG1sXzQ2OGQ3ZGY0MDM1OTRjMTE4ZmFlYTI0Y2EwOGRmNTFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2MxNGU0MWZhNWU0NDQ5NWIwOTRhOTI3MjI4NzQ4YTQuYmluZFBvcHVwKHBvcHVwXzYwYTczNjU0ZGU0NzRhMTZiYzU0MzlhZWRlNDhlNzUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzkxZTNjYTVjOWU5NDZmZWExZDQxZWJlNTBlYWQyMmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS43MzQxNDcsLTEwNS4wMjE1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU4MjQ4OTNiMzA2MTQ5YjI5Y2ExNjMyOTJjYmZjMjUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1OWNjYmI2OTRjMTQwMTViMDMzNDY5MjYxY2ExYjk4ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9lNTljY2JiNjk0YzE0MDE1YjAzMzQ2OTI2MWNhMWI5OCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgRmFpcnZpZXcgRWxlbWVudGFyeSBZb3V0aCBGYXJtZXJzJiMzOTsgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4MjQ4OTNiMzA2MTQ5YjI5Y2ExNjMyOTJjYmZjMjUyLnNldENvbnRlbnQoaHRtbF9lNTljY2JiNjk0YzE0MDE1YjAzMzQ2OTI2MWNhMWI5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzc5MWUzY2E1YzllOTQ2ZmVhMWQ0MWViZTUwZWFkMjJkLmJpbmRQb3B1cChwb3B1cF81ODI0ODkzYjMwNjE0OWIyOWNhMTYzMjkyY2JmYzI1Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzBjN2UyYWQyOTQ5ZjQzZDRiZWM1N2I0MDNiYTlhNTAxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNzE5NTQ5LC0xMDQuOTk4Mjg3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNjg4NmY4YmRmN2M0Yzc4YmIzMjVhMjhjYjFkY2I4OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MjQxNWFhZDUzNWQ0YTU4YTUwZGNjMDM4NTA3NDBhMyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOTI0MTVhYWQ1MzVkNGE1OGE1MGRjYzAzODUwNzQwYTMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIERlbnZlciBVcmJhbiBIb21lc3RlYWRpbmcgRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTY4ODZmOGJkZjdjNGM3OGJiMzI1YTI4Y2IxZGNiODkuc2V0Q29udGVudChodG1sXzkyNDE1YWFkNTM1ZDRhNThhNTBkY2MwMzg1MDc0MGEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGM3ZTJhZDI5NDlmNDNkNGJlYzU3YjQwM2JhOWE1MDEuYmluZFBvcHVwKHBvcHVwXzE2ODg2ZjhiZGY3YzRjNzhiYjMyNWEyOGNiMWRjYjg5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWIyMGZjM2RhMjA3NDUzYmJkZDc1NDNiOGQ2Y2ZiZDggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC4zNzE2LC0xMDUuNTAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZGM2ODI1YWNlOTY0NzI1YTcwOTM2Zjg0YzI0NGMxMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MTQ1OWMxNjRkOWI0ODdmYjQ3OWFjMDVlYjFmZDljNyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfODE0NTljMTY0ZDliNDg3ZmI0NzlhYzA1ZWIxZmQ5YzciICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEVzdGVzIFZhbGxleSBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZGM2ODI1YWNlOTY0NzI1YTcwOTM2Zjg0YzI0NGMxMi5zZXRDb250ZW50KGh0bWxfODE0NTljMTY0ZDliNDg3ZmI0NzlhYzA1ZWIxZmQ5YzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hYjIwZmMzZGEyMDc0NTNiYmRkNzU0M2I4ZDZjZmJkOC5iaW5kUG9wdXAocG9wdXBfYWRjNjgyNWFjZTk2NDcyNWE3MDkzNmY4NGMyNDRjMTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jOWMyNTZjYTg3OGE0NjE3YjMzNzYxMDhjMzlkOTZlYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5Ljc0MDIsLTEwNC45MDNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAzNmE2NDVlZTQzZTQyZjM4NDc1NTZiOWYzMTRlOThlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwY2YzOTJiODJjNDQ5NDlhYzJmMDIwN2MwYTU2MDM1ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jMGNmMzkyYjgyYzQ0OTQ5YWMyZjAyMDdjMGE1NjAzNSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgTm9ydGhmaWVsZCBGYXJtZXJzJiMzOTsgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAzNmE2NDVlZTQzZTQyZjM4NDc1NTZiOWYzMTRlOThlLnNldENvbnRlbnQoaHRtbF9jMGNmMzkyYjgyYzQ0OTQ5YWMyZjAyMDdjMGE1NjAzNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2M5YzI1NmNhODc4YTQ2MTdiMzM3NjEwOGMzOWQ5NmViLmJpbmRQb3B1cChwb3B1cF8wMzZhNjQ1ZWU0M2U0MmYzODQ3NTU2YjlmMzE0ZTk4ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzg3N2MzZTNmYmU4YzQ1ODg5ZWJhZWYzMzg4YmYzY2ViID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuOTU2OSwtMTA0Ljk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWQ4ZjFkOTM1YTY5NGM2YmEwODM2ODhkNDA2NjNiYjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmU2OTMyMDNjZWY4NGZjMjgwYTkwYmMyOTBlZWVhZjIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2JlNjkzMjAzY2VmODRmYzI4MGE5MGJjMjkwZWVlYWYyIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBUaGUgT3JjaGFyZHMgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZDhmMWQ5MzVhNjk0YzZiYTA4MzY4OGQ0MDY2M2JiMC5zZXRDb250ZW50KGh0bWxfYmU2OTMyMDNjZWY4NGZjMjgwYTkwYmMyOTBlZWVhZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84NzdjM2UzZmJlOGM0NTg4OWViYWVmMzM4OGJmM2NlYi5iaW5kUG9wdXAocG9wdXBfNWQ4ZjFkOTM1YTY5NGM2YmEwODM2ODhkNDA2NjNiYjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iZmM2Y2JmMDYyZTA0MmZlYjE5ODgxNzVjMmFlYzhkZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU1Mjk4OCwtMTA1LjA5MTA0NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTdhOThiOGU2NTQ0NDZhOTkzYmYwZTc5MDViNGYyZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2JiOTI4NTExMDhjNDU1NGJiYmMxZjI5MmU3ZWVlZGMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzNiYjkyODUxMTA4YzQ1NTRiYmJjMWYyOTJlN2VlZWRjIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBEcmFrZSBSb2FkIEZhcm1lcnMmIzM5OyBNYXJrZXQsIExMQzwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lN2E5OGI4ZTY1NDQ0NmE5OTNiZjBlNzkwNWI0ZjJmMC5zZXRDb250ZW50KGh0bWxfM2JiOTI4NTExMDhjNDU1NGJiYmMxZjI5MmU3ZWVlZGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iZmM2Y2JmMDYyZTA0MmZlYjE5ODgxNzVjMmFlYzhkZC5iaW5kUG9wdXAocG9wdXBfZTdhOThiOGU2NTQ0NDZhOTkzYmYwZTc5MDViNGYyZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hZGZiMTE5NmY4ZDk0OWI1YTY0NWY0M2U4ZjUxYWRmNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjM5NTQsLTEwNS4wNzNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkNzYyOTE5ZDg2NDRmODdiNDVlODllZWZiZWI2OWMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBmMGY4ZDAzODRhNjQwYmNhOWJiOWZhYzRjMTYzYWIxID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8wZjBmOGQwMzg0YTY0MGJjYTliYjlmYWM0YzE2M2FiMSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgNHRoIFN0cmVldCBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZDc2MjkxOWQ4NjQ0Zjg3YjQ1ZTg5ZWVmYmViNjljMy5zZXRDb250ZW50KGh0bWxfMGYwZjhkMDM4NGE2NDBiY2E5YmI5ZmFjNGMxNjNhYjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hZGZiMTE5NmY4ZDk0OWI1YTY0NWY0M2U4ZjUxYWRmNS5iaW5kUG9wdXAocG9wdXBfZmQ3NjI5MTlkODY0NGY4N2I0NWU4OWVlZmJlYjY5YzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jYmYxZWYyZDZjYzE0YWI5OTljMTQ2ZTFhMjBhZjk5NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjA3OTU5OCwtMTA0LjIyMzQ5NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmM5NzE4ZWE5ZjJlNGRhMTg3YzhkZmRmOGQ4MDdhZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDhiOGE0MzdlM2RlNGZiYWEzYzAzMjE3MTY4NjdjZTAgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzA4YjhhNDM3ZTNkZTRmYmFhM2MwMzIxNzE2ODY3Y2UwIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBUb3JyaW5ndG9uIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZjOTcxOGVhOWYyZTRkYTE4N2M4ZGZkZjhkODA3YWVhLnNldENvbnRlbnQoaHRtbF8wOGI4YTQzN2UzZGU0ZmJhYTNjMDMyMTcxNjg2N2NlMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NiZjFlZjJkNmNjMTRhYjk5OWMxNDZlMWEyMGFmOTk3LmJpbmRQb3B1cChwb3B1cF82Yzk3MThlYTlmMmU0ZGExODdjOGRmZGY4ZDgwN2FlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzU0MTY1ODJlYTAxYjQ0MDE4MmY0NzVlZDkzZWYyMWZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuMTMyMjE3LC0xMDQuODE0NDMzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YjQ4ODMyNDM2OWY0MjYwODM2MTk3MDE0ZTFiZjhlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMjU0ZDBhNDM3MjY0ZjlmOTRmNzI4ZjhkZWUwZWY3YyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMjI1NGQwYTQzNzI2NGY5Zjk0ZjcyOGY4ZGVlMGVmN2MiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENoZXllbm5lIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzViNDg4MzI0MzY5ZjQyNjA4MzYxOTcwMTRlMWJmOGViLnNldENvbnRlbnQoaHRtbF8yMjU0ZDBhNDM3MjY0ZjlmOTRmNzI4ZjhkZWUwZWY3Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU0MTY1ODJlYTAxYjQ0MDE4MmY0NzVlZDkzZWYyMWZlLmJpbmRQb3B1cChwb3B1cF81YjQ4ODMyNDM2OWY0MjYwODM2MTk3MDE0ZTFiZjhlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzE1MGJiMTQ5NTA1OTRjZWI4M2M2MzhjZmEzYjA4YTVkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuODU4OSwtMTA0LjkwNDQ5NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWVjNzU2NDg0MTE4NDkyNmJkMzdkZDc1MmVjY2I0MjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmNjZGNiMjUyZmNhNDU0NDhmNGViMmFkM2VlYjMwYjUgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzZjY2RjYjI1MmZjYTQ1NDQ4ZjRlYjJhZDNlZWIzMGI1IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBNaWxlIEhpZ2ggRmxlYSBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWVjNzU2NDg0MTE4NDkyNmJkMzdkZDc1MmVjY2I0Mjcuc2V0Q29udGVudChodG1sXzZjY2RjYjI1MmZjYTQ1NDQ4ZjRlYjJhZDNlZWIzMGI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTUwYmIxNDk1MDU5NGNlYjgzYzYzOGNmYTNiMDhhNWQuYmluZFBvcHVwKHBvcHVwXzllYzc1NjQ4NDExODQ5MjZiZDM3ZGQ3NTJlY2NiNDI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjY1OTdkYTMyNzgzNGFmYWEzNGE1MjI0ZTliNDQ4OWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC4wMTUyNDUsLTEwNS4yNzc2MzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRkYjc4ZWFhYzNkZDQxMDBiM2EzNWU4NDFlZGEyODY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzM2JjMmE2MmJhZDRjMGViNGQ3MmRmNzdhNzRjMDA3ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8wMzNiYzJhNjJiYWQ0YzBlYjRkNzJkZjc3YTc0YzAwNyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQm91bGRlciBGYXJtZXJzIE1hcmtldCA8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGRiNzhlYWFjM2RkNDEwMGIzYTM1ZTg0MWVkYTI4Njcuc2V0Q29udGVudChodG1sXzAzM2JjMmE2MmJhZDRjMGViNGQ3MmRmNzdhNzRjMDA3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjY1OTdkYTMyNzgzNGFmYWEzNGE1MjI0ZTliNDQ4OWMuYmluZFBvcHVwKHBvcHVwXzRkYjc4ZWFhYzNkZDQxMDBiM2EzNWU4NDFlZGEyODY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDIxZGI5ZTg0YWFmNDVmMDhlOTFhMzBkZTI1NjBjZDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMi45NTczNTYsLTEwNS43NDA1OTVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U2OWY5MWUzYWUxNTRhNGU5NWRhYzJhY2Y0YzhlZTRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiMmI2OWE1YTA1NDQ3MTY4NDlkMDFiZWQ2ZjE3ZDkyID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8wYjJiNjlhNWEwNTQ0NzE2ODQ5ZDAxYmVkNmYxN2Q5MiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2xvdWRjcm9mdCBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNjlmOTFlM2FlMTU0YTRlOTVkYWMyYWNmNGM4ZWU0ZC5zZXRDb250ZW50KGh0bWxfMGIyYjY5YTVhMDU0NDcxNjg0OWQwMWJlZDZmMTdkOTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80MjFkYjllODRhYWY0NWYwOGU5MWEzMGRlMjU2MGNkOS5iaW5kUG9wdXAocG9wdXBfZTY5ZjkxZTNhZTE1NGE0ZTk1ZGFjMmFjZjRjOGVlNGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85ZGZhYTMzMzNjYTA0YmU1OGY1NTk2MmU3ZjlmNmQ3ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4Ljk5NzcsLTEwNC43MDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkZGY0Y2JiZWUyODRiZGFiMzA1N2MxMmMzM2UxZTQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RhYTMyZTRlMGE5YzRhODlhZWNlNmE4YmU1N2I0MDU1ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9kYWEzMmU0ZTBhOWM0YTg5YWVjZTZhOGJlNTdiNDA1NSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQmxhY2sgRm9yZXN0IEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNkZGY0Y2JiZWUyODRiZGFiMzA1N2MxMmMzM2UxZTQ3LnNldENvbnRlbnQoaHRtbF9kYWEzMmU0ZTBhOWM0YTg5YWVjZTZhOGJlNTdiNDA1NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzlkZmFhMzMzM2NhMDRiZTU4ZjU1OTYyZTdmOWY2ZDdlLmJpbmRQb3B1cChwb3B1cF8zZGRmNGNiYmVlMjg0YmRhYjMwNTdjMTJjMzNlMWU0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQwM2FjYTU3MzA5ZjRkYWQ5ZGViMTFmYTBlMGIwMTBlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg3OCwtMTA1LjA3OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmZjNjVkYmEwNjdiNGJmNzg2NWM0MDExZjEwMWY1ODggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmY1MjYzMTg1ZWY5NDVjMzg4MjEyZTNmOThiMzc2YzcgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzZmNTI2MzE4NWVmOTQ1YzM4ODIxMmUzZjk4YjM3NmM3IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBCZSBMb2NhbCBXaW50ZXIgRmFybWVyJiMzOTtzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZmM2NWRiYTA2N2I0YmY3ODY1YzQwMTFmMTAxZjU4OC5zZXRDb250ZW50KGh0bWxfNmY1MjYzMTg1ZWY5NDVjMzg4MjEyZTNmOThiMzc2YzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80MDNhY2E1NzMwOWY0ZGFkOWRlYjExZmEwZTBiMDEwZS5iaW5kUG9wdXAocG9wdXBfYmZjNjVkYmEwNjdiNGJmNzg2NWM0MDExZjEwMWY1ODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZTBkMGYxMDAzNTY0NDY3OTcyYWEzM2MyODU3OGRmOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjU0NDU2MjQsLTEwNS4yODcyNDM1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOGFjZmMyYTk3MGI0NjM2YTAwOTVmMGU0OGY2MjY4YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZWZhZGYwZDBmNmU0NDFkYWQ0MmYwNzNiZTlhNzYwYSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZWVmYWRmMGQwZjZlNDQxZGFkNDJmMDczYmU5YTc2MGEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENvbmlmZXIgRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMThhY2ZjMmE5NzBiNDYzNmEwMDk1ZjBlNDhmNjI2OGMuc2V0Q29udGVudChodG1sX2VlZmFkZjBkMGY2ZTQ0MWRhZDQyZjA3M2JlOWE3NjBhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2UwZDBmMTAwMzU2NDQ2Nzk3MmFhMzNjMjg1NzhkZjkuYmluZFBvcHVwKHBvcHVwXzE4YWNmYzJhOTcwYjQ2MzZhMDA5NWYwZTQ4ZjYyNjhjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmFhMjA2ZjZjZTA1NGVkMGJkYjIwYTJkNTc5ZWMwOWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS4zMDQxNDg2LC0xMDUuNTg5MDUxOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjhmNDkyNjc4MDEyNGI3Yjk2NmNiYmYwYTcyZDllNzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Y5OWEyMjc0OWUzNDlhOGEwYjc4ZmUyNjJiNzIxNzIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2NmOTlhMjI3NDllMzQ5YThhMGI3OGZlMjYyYjcyMTcyIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBMYXJhbWllIExvY2FsIENvbW11bml0eSBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjhmNDkyNjc4MDEyNGI3Yjk2NmNiYmYwYTcyZDllNzYuc2V0Q29udGVudChodG1sX2NmOTlhMjI3NDllMzQ5YThhMGI3OGZlMjYyYjcyMTcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmFhMjA2ZjZjZTA1NGVkMGJkYjIwYTJkNTc5ZWMwOWIuYmluZFBvcHVwKHBvcHVwX2I4ZjQ5MjY3ODAxMjRiN2I5NjZjYmJmMGE3MmQ5ZTc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTA4MDg3NTliMTNlNGE3N2JkMGRiMzRhMTE1M2JlNzMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDQ2ODUsLTEwNS4wMDQ4MzFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3ZTdkMjgxZGY5ZTQzMzE5ZjVmN2M2MzM2YTZhMjk2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4MTFhNDEyM2EzNjRhZDc5MjJmMTdjODNmYzU0MGM2ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8zODExYTQxMjNhMzY0YWQ3OTIyZjE3YzgzZmM1NDBjNiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgV2VsbGluZ3RvbiBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84N2U3ZDI4MWRmOWU0MzMxOWY1ZjdjNjMzNmE2YTI5Ni5zZXRDb250ZW50KGh0bWxfMzgxMWE0MTIzYTM2NGFkNzkyMmYxN2M4M2ZjNTQwYzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81MDgwODc1OWIxM2U0YTc3YmQwZGIzNGExMTUzYmU3My5iaW5kUG9wdXAocG9wdXBfODdlN2QyODFkZjllNDMzMTlmNWY3YzYzMzZhNmEyOTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZDUzZGMxMDllNGE0ZTEzYTNkYWE3YWJkMTIzNDkwOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMyLjg5MDE0NSwtMTA1LjQ3NzkxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MzRiOWJiOTJlYzc0ZmYxYjY4ZjA0MTA0N2EzN2Y2NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZTJhNDY1OWU0Yzc0NjM0ODk5NGE2MWVlMTllMzRiZCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNWUyYTQ2NTllNGM3NDYzNDg5OTRhNjFlZTE5ZTM0YmQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIE1heWhpbGwgRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTM0YjliYjkyZWM3NGZmMWI2OGYwNDEwNDdhMzdmNjUuc2V0Q29udGVudChodG1sXzVlMmE0NjU5ZTRjNzQ2MzQ4OTk0YTYxZWUxOWUzNGJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGQ1M2RjMTA5ZTRhNGUxM2EzZGFhN2FiZDEyMzQ5MDguYmluZFBvcHVwKHBvcHVwXzUzNGI5YmI5MmVjNzRmZjFiNjhmMDQxMDQ3YTM3ZjY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODViZTI5YjBlNjc1NGRiZThlZWFlZTI3MjFmNDgzMzggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODU3OCwtMTA1LjA3OThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ5ZGZiMjJiOThiNTRmYTg5NGRkNTAwZjkwYWQzYmIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlZmE2ZTZkYmFiYjQzOThiZWQzYmRhM2E5OTNiNTBkID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jZWZhNmU2ZGJhYmI0Mzk4YmVkM2JkYTNhOTkzYjUwZCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgTGFyaW1lciBDb3VudHkgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80OWRmYjIyYjk4YjU0ZmE4OTRkZDUwMGY5MGFkM2JiMC5zZXRDb250ZW50KGh0bWxfY2VmYTZlNmRiYWJiNDM5OGJlZDNiZGEzYTk5M2I1MGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84NWJlMjliMGU2NzU0ZGJlOGVlYWVlMjcyMWY0ODMzOC5iaW5kUG9wdXAocG9wdXBfNDlkZmIyMmI5OGI1NGZhODk0ZGQ1MDBmOTBhZDNiYjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84Y2FiNzMzOTE3M2I0MWFiODQ3OWQ4YTEzMDI3YmIxMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjcyMjYsLTEwNC45ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5YTg4OWYxYWJhNzRiNTI5NTY2YzM0NzNlM2E5ZjEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JiMWYwNzg5ZjE4OTQxNzhiZjYwMGI2ZmQyYjgzMzExID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9iYjFmMDc4OWYxODk0MTc4YmY2MDBiNmZkMmI4MzMxMSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgVk5BIEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTlhODg5ZjFhYmE3NGI1Mjk1NjZjMzQ3M2UzYTlmMTMuc2V0Q29udGVudChodG1sX2JiMWYwNzg5ZjE4OTQxNzhiZjYwMGI2ZmQyYjgzMzExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGNhYjczMzkxNzNiNDFhYjg0NzlkOGExMzAyN2JiMTMuYmluZFBvcHVwKHBvcHVwX2E5YTg4OWYxYWJhNzRiNTI5NTY2YzM0NzNlM2E5ZjEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjBmYjgwODlkYzkyNDVkZTg3NzlkNjYyNDJiY2VkYWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC4zNzYzNzAxLC0xMDQuNjkyMTg3NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjNhNGY3MTAzZmU1NGRmMWJlNWEwYjRjZDAzNzI5ZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGI2MGY4YTc1OGMxNGJjZWEzZjc4ZGI4MDA2YWIwZjcgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzRiNjBmOGE3NThjMTRiY2VhM2Y3OGRiODAwNmFiMGY3IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDaXR5IG9mIEV2YW5zIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IzYTRmNzEwM2ZlNTRkZjFiZTVhMGI0Y2QwMzcyOWRiLnNldENvbnRlbnQoaHRtbF80YjYwZjhhNzU4YzE0YmNlYTNmNzhkYjgwMDZhYjBmNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzYwZmI4MDg5ZGM5MjQ1ZGU4Nzc5ZDY2MjQyYmNlZGFjLmJpbmRQb3B1cChwb3B1cF9iM2E0ZjcxMDNmZTU0ZGYxYmU1YTBiNGNkMDM3MjlkYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2UwNmEzZTBlNzdhYTQ2M2M4ZTU2ZWZlYTE1YmM5MDllID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuNzYxOSwtMTA0LjQ1M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmI3MTE3NzYyN2YyNGFkYjk3ZmIyZDA4N2QyZjU3NzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNThiMDc3ODMzZGE1NGJiZTg2ZTY1YzZhYmM3NzIyZjQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzU4YjA3NzgzM2RhNTRiYmU4NmU2NWM2YWJjNzcyMmY0IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBMdXNrIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiNzExNzc2MjdmMjRhZGI5N2ZiMmQwODdkMmY1Nzc4LnNldENvbnRlbnQoaHRtbF81OGIwNzc4MzNkYTU0YmJlODZlNjVjNmFiYzc3MjJmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2UwNmEzZTBlNzdhYTQ2M2M4ZTU2ZWZlYTE1YmM5MDllLmJpbmRQb3B1cChwb3B1cF9iYjcxMTc3NjI3ZjI0YWRiOTdmYjJkMDg3ZDJmNTc3OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzM4ZmM3ZjU3NGYzYjQ1NzI4ZTI1YjczMmYzZjI5ZTBjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguODgwNjM5LC0xMDQuNzE4OTEzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNzZjM2ZlMGQ4ZTI0Yjk4OWZjYjhiMDYyNTRmMzg3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMzFiMzZjYTYyZTc0YWQwYmYyMjA2OWVhNGVmYWFiNyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYzMxYjM2Y2E2MmU3NGFkMGJmMjIwNjllYTRlZmFhYjciICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEZpcnN0ICZhbXA7IE1haW4gVG93biBDZW50ZXIgTWFsbCBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNzZjM2ZlMGQ4ZTI0Yjk4OWZjYjhiMDYyNTRmMzg3ZC5zZXRDb250ZW50KGh0bWxfYzMxYjM2Y2E2MmU3NGFkMGJmMjIwNjllYTRlZmFhYjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zOGZjN2Y1NzRmM2I0NTcyOGUyNWI3MzJmM2YyOWUwYy5iaW5kUG9wdXAocG9wdXBfMTc2YzNmZTBkOGUyNGI5ODlmY2I4YjA2MjU0ZjM4N2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZmVhMGRkNzZmNDY0NDlmODY2N2M3NjdmZDJiZmY2NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjcyMiwtMTA0Ljg5N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTM3MjhhNWY3ZTkyNDgzMGJmMDU1Njc5ZDk3ODllNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWY2NGM5OGRlNWMzNDViYzkyOWMwZGEwNTFiMDlkNzAgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2FmNjRjOThkZTVjMzQ1YmM5MjljMGRhMDUxYjA5ZDcwIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBMb3dlcnkgSGFuZ2VyIDIgRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTM3MjhhNWY3ZTkyNDgzMGJmMDU1Njc5ZDk3ODllNmQuc2V0Q29udGVudChodG1sX2FmNjRjOThkZTVjMzQ1YmM5MjljMGRhMDUxYjA5ZDcwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGZlYTBkZDc2ZjQ2NDQ5Zjg2NjdjNzY3ZmQyYmZmNjYuYmluZFBvcHVwKHBvcHVwXzUzNzI4YTVmN2U5MjQ4MzBiZjA1NTY3OWQ5Nzg5ZTZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWY2MzFkZWY4MWIzNGEyZjhlMGExOGE1OGE3OTZhM2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC4zMzAxMzIyLC0xMDQuODU0NDg1N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjNlYmQ3Njc2MDA4NGRhODhiZTkyMWU0OTFlYzk0NTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzVkYTJhN2RkODc4NGFmZWIwZTFkZGIzNzkwZjk3ZDUgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzc1ZGEyYTdkZDg3ODRhZmViMGUxZGRiMzc5MGY5N2Q1IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBKb2huc3Rvd24gTWlsbGlrZW4gRmFybWVyJiMzOTtzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82M2ViZDc2NzYwMDg0ZGE4OGJlOTIxZTQ5MWVjOTQ1NS5zZXRDb250ZW50KGh0bWxfNzVkYTJhN2RkODc4NGFmZWIwZTFkZGIzNzkwZjk3ZDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xZjYzMWRlZjgxYjM0YTJmOGUwYTE4YTU4YTc5NmEzZS5iaW5kUG9wdXAocG9wdXBfNjNlYmQ3Njc2MDA4NGRhODhiZTkyMWU0OTFlYzk0NTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zOGMyYWIzMzY0OWQ0YjBlYWQ0MzlhNjNiMjY1YTNiOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4Ljg0NjMsLTEwNC44NjFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MxOTA5NDUzYTg5NzRlYjZiN2MyZGM0MDlhZjRhY2FmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzExY2QyMDI5M2MzNjQ3NTQ4Y2UzYzYyOTYyYTRiNzFkID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8xMWNkMjAyOTNjMzY0NzU0OGNlM2M2Mjk2MmE0YjcxZCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgT2xkIENvbG9yYWRvIENpdHkgRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzE5MDk0NTNhODk3NGViNmI3YzJkYzQwOWFmNGFjYWYuc2V0Q29udGVudChodG1sXzExY2QyMDI5M2MzNjQ3NTQ4Y2UzYzYyOTYyYTRiNzFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzhjMmFiMzM2NDlkNGIwZWFkNDM5YTYzYjI2NWEzYjkuYmluZFBvcHVwKHBvcHVwX2MxOTA5NDUzYTg5NzRlYjZiN2MyZGM0MDlhZjRhY2FmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGE3MjhlNDdjZjJhNDQ1MWE2NGRiYmVmMmM2ZDllY2MgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC44MzMsLTEwNC43OTVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljYjYyMThkNWQ0NjQwNzc5MzUzNjlmY2JkZGQzODM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5ZWFmMzYxMDNjODQxYmQ4NTMzNGZmYzU5Y2ZjZWUwID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF82OWVhZjM2MTAzYzg0MWJkODUzMzRmZmM1OWNmY2VlMCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgTWVtb3JpYWwgUGFyayBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85Y2I2MjE4ZDVkNDY0MDc3OTM1MzY5ZmNiZGRkMzgzOS5zZXRDb250ZW50KGh0bWxfNjllYWYzNjEwM2M4NDFiZDg1MzM0ZmZjNTljZmNlZTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84YTcyOGU0N2NmMmE0NDUxYTY0ZGJiZWYyYzZkOWVjYy5iaW5kUG9wdXAocG9wdXBfOWNiNjIxOGQ1ZDQ2NDA3NzkzNTM2OWZjYmRkZDM4MzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84ZjZmOTliODgzMzY0NWMyODA2NDM5NTA4NDE5YTQyNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4Ljg5NDYsLTEwNC43NDRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2NzE4ODUzYzEzOTQ4YTc5MDY2YzYzMzliZWE1ZGM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ3ZjJjNDBjNjBhZjQyYzhhNDExYTFlOTIwOWQ1NDI2ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF80N2YyYzQwYzYwYWY0MmM4YTQxMWExZTkyMDlkNTQyNiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgRG9oZXJ0eSBIaWdoIFNjaG9vbCBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNjcxODg1M2MxMzk0OGE3OTA2NmM2MzM5YmVhNWRjNS5zZXRDb250ZW50KGh0bWxfNDdmMmM0MGM2MGFmNDJjOGE0MTFhMWU5MjA5ZDU0MjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84ZjZmOTliODgzMzY0NWMyODA2NDM5NTA4NDE5YTQyNS5iaW5kUG9wdXAocG9wdXBfMTY3MTg4NTNjMTM5NDhhNzkwNjZjNjMzOWJlYTVkYzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xYWYyODlhZjBiOTU0YWMwYTU1MjViMmJlMGUzZTM0MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjMzMTQwNywtMTA1LjU5MDk2NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjNhMmI1NTk4MGZmNGJjYTgyMzYwOTcwMWZhY2ZkMGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWUyZGIzOTZlNTkyNDI5OWI3YmFhMjE2YzIwZWU1MGMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzllMmRiMzk2ZTU5MjQyOTliN2JhYTIxNmMyMGVlNTBjIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBSdWlkb3NvIERvd25zIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYzYTJiNTU5ODBmZjRiY2E4MjM2MDk3MDFmYWNmZDBlLnNldENvbnRlbnQoaHRtbF85ZTJkYjM5NmU1OTI0Mjk5YjdiYWEyMTZjMjBlZTUwYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFhZjI4OWFmMGI5NTRhYzBhNTUyNWIyYmUwZTNlMzQxLmJpbmRQb3B1cChwb3B1cF82M2EyYjU1OTgwZmY0YmNhODIzNjA5NzAxZmFjZmQwZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2I5MTU4YTAxYjc5NjRiNjg4MjkxM2VlZTllYmZiN2U3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNjk4OSwtMTA0Ljk4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85Mzg0OGQyNTE5ZTI0MzAwYmVkOTQ0YTgwZDVhOWRkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNWViNzUyNTFkZmM0YWFlYWEyY2VlNzNkYWU1NGIyYSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZTVlYjc1MjUxZGZjNGFhZWFhMmNlZTczZGFlNTRiMmEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEhpZ2hsYW5kIFVuaXRlZCBOZWlnaGJvcnMgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85Mzg0OGQyNTE5ZTI0MzAwYmVkOTQ0YTgwZDVhOWRkZC5zZXRDb250ZW50KGh0bWxfZTVlYjc1MjUxZGZjNGFhZWFhMmNlZTczZGFlNTRiMmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iOTE1OGEwMWI3OTY0YjY4ODI5MTNlZWU5ZWJmYjdlNy5iaW5kUG9wdXAocG9wdXBfOTM4NDhkMjUxOWUyNDMwMGJlZDk0NGE4MGQ1YTlkZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iY2IzZTRjMDMxNzQ0YjliOTExZDExNWUwZDcyZWI0NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjY4MjcsLTEwNC43MDAzNjddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmMTUyZmZhNDNhMDQ5MzY5MTJlNmU3MjAwNjc1Njc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkMTdmZjczNjQ2ZDRjMmY4MWM2N2I3ODgyNzNjYWFiID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8yZDE3ZmY3MzY0NmQ0YzJmODFjNjdiNzg4MjczY2FhYiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgRm91bnRhaW4gRmFybWVycyBNYXJrZXQgLSBDaXR5IEhhbGw8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWYxNTJmZmE0M2EwNDkzNjkxMmU2ZTcyMDA2NzU2NzYuc2V0Q29udGVudChodG1sXzJkMTdmZjczNjQ2ZDRjMmY4MWM2N2I3ODgyNzNjYWFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmNiM2U0YzAzMTc0NGI5YjkxMWQxMTVlMGQ3MmViNDQuYmluZFBvcHVwKHBvcHVwX2FmMTUyZmZhNDNhMDQ5MzY5MTJlNmU3MjAwNjc1Njc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzAwNmZjZmE5ZTE2NDRmNDg1NTkyMmE3MDg0ZjFhNjEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS4xNjE2MTIsLTEwNC44MDg1N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWY5NGU3MDRiOWRkNDU1OGEzM2FiMmM2MWVjMTgzZTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDhiM2U5Y2I5YjMzNDVkZDhlYWQ0ZjdmMTc3OTQzNDEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2Q4YjNlOWNiOWIzMzQ1ZGQ4ZWFkNGY3ZjE3Nzk0MzQxIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDaGV5ZW5uZSBUdWVzZGF5IEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWY5NGU3MDRiOWRkNDU1OGEzM2FiMmM2MWVjMTgzZTAuc2V0Q29udGVudChodG1sX2Q4YjNlOWNiOWIzMzQ1ZGQ4ZWFkNGY3ZjE3Nzk0MzQxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzAwNmZjZmE5ZTE2NDRmNDg1NTkyMmE3MDg0ZjFhNjEuYmluZFBvcHVwKHBvcHVwX2FmOTRlNzA0YjlkZDQ1NThhMzNhYjJjNjFlYzE4M2UwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTIwM2I2Zjk3NmU0NDZlMGJmMzg0NzEwNWE5Y2MzODIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC40MzY5MTcsLTEwNS4yNDMxNDRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc1NzYyZDAyNTljMzRkYTRiMWVlNDI4ZGE3NzFjZTQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0NzM1NWM5NTExNDQxY2E5ZTMzNTczZGQxMWM2ZmVjID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF84NDczNTVjOTUxMTQ0MWNhOWUzMzU3M2RkMTFjNmZlYyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2Fub24gQ2l0eSBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NTc2MmQwMjU5YzM0ZGE0YjFlZTQyOGRhNzcxY2U0MC5zZXRDb250ZW50KGh0bWxfODQ3MzU1Yzk1MTE0NDFjYTllMzM1NzNkZDExYzZmZWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85MjAzYjZmOTc2ZTQ0NmUwYmYzODQ3MTA1YTljYzM4Mi5iaW5kUG9wdXAocG9wdXBfNzU3NjJkMDI1OWMzNGRhNGIxZWU0MjhkYTc3MWNlNDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NjNhMmEzOWU3MTU0M2M0YWE0YTE3ZGVhMzA4NmI1OSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5Ljc0NDMsLTEwNC45OTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiNTYwNWRkZDY5NjQ0Mjg4NmZkNDhkNTU4ZmU0NGE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5ZWU0MThmMmY3NjQyN2ZiNDM3YWQxNjk4N2UxZDY4ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF83OWVlNDE4ZjJmNzY0MjdmYjQzN2FkMTY5ODdlMWQ2OCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgVGlyaSYjMzk7cyBHYXJkZW4gRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYjU2MDVkZGQ2OTY0NDI4ODZmZDQ4ZDU1OGZlNDRhOC5zZXRDb250ZW50KGh0bWxfNzllZTQxOGYyZjc2NDI3ZmI0MzdhZDE2OTg3ZTFkNjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NjNhMmEzOWU3MTU0M2M0YWE0YTE3ZGVhMzA4NmI1OS5iaW5kUG9wdXAocG9wdXBfY2I1NjA1ZGRkNjk2NDQyODg2ZmQ0OGQ1NThmZTQ0YTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kY2U3NzhlMmNkMzM0YjQxYTdjOWUxMjQzZmRjYmNjZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjE2NTY5NDUsLTEwNC41MDQ3NjE0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMDg4OGEzMjllNTc0ZDFkOGJmMmVhZjM5NTA4N2NlMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MzIyY2I0YTQ5MDM0MDBhODAzNzU5YmU1OWJkYTcxYiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNDMyMmNiNGE0OTAzNDAwYTgwMzc1OWJlNTliZGE3MWIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFRyaW5pZGFkIENvbW11bml0eSBGYXJtZXJzIE1hcmtldCA8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDA4ODhhMzI5ZTU3NGQxZDhiZjJlYWYzOTUwODdjZTEuc2V0Q29udGVudChodG1sXzQzMjJjYjRhNDkwMzQwMGE4MDM3NTliZTU5YmRhNzFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGNlNzc4ZTJjZDMzNGI0MWE3YzllMTI0M2ZkY2JjY2UuYmluZFBvcHVwKHBvcHVwX2QwODg4YTMyOWU1NzRkMWQ4YmYyZWFmMzk1MDg3Y2UxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzQ2ZmIzNjBiYzczNDExMzg0NmNkYTc5OGU2ZTg5ZmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC45OTczLC0xMDUuNTQ4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NmY5MWVjZDUwODM0YTQxYjRkYzBlM2Q2ZDFmMTZjMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMGNkM2YwNDQ4MTA0ODYzYTdjNjdmZjIyZjVmZmQzNyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZjBjZDNmMDQ0ODEwNDg2M2E3YzY3ZmYyMmY1ZmZkMzciICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIERpbGxvbiBGYXJtZXJzJiMzOTsgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2ZjkxZWNkNTA4MzRhNDFiNGRjMGUzZDZkMWYxNmMwLnNldENvbnRlbnQoaHRtbF9mMGNkM2YwNDQ4MTA0ODYzYTdjNjdmZjIyZjVmZmQzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM0NmZiMzYwYmM3MzQxMTM4NDZjZGE3OThlNmU4OWZmLmJpbmRQb3B1cChwb3B1cF82NmY5MWVjZDUwODM0YTQxYjRkYzBlM2Q2ZDFmMTZjMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzJhNzQzZTJkY2E0NTQzODI4NTllN2VkMDgzZjYzMjEyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNTg1NTA1LC0xMDUuMDI1MjE5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZDBjMTFhYzk5ODk0OGQxYjYwZjYxNTlmNDYxNDRiMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMmM0Zjg4MDc5NTA0ZWYyOTBlNTMwYzNhYTM2OWZjNSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZjJjNGY4ODA3OTUwNGVmMjkwZTUzMGMzYWEzNjlmYzUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEFzcGVuIEdyb3ZlIEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGQwYzExYWM5OTg5NDhkMWI2MGY2MTU5ZjQ2MTQ0YjEuc2V0Q29udGVudChodG1sX2YyYzRmODgwNzk1MDRlZjI5MGU1MzBjM2FhMzY5ZmM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmE3NDNlMmRjYTQ1NDM4Mjg1OWU3ZWQwODNmNjMyMTIuYmluZFBvcHVwKHBvcHVwXzRkMGMxMWFjOTk4OTQ4ZDFiNjBmNjE1OWY0NjE0NGIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGQ3MGUyNzRmMjQ1NDZjY2FjMmQxNjNiODIwMWY3ZjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS43NDI4LC0xMDUuNTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmNWFlY2JmOTNjNTRhMmM5ZDg3ZTg3NzZkZDNhNTZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhYTI4ZjNhNTM1ODQ0NWM4MWFhZGEwYjdiMDgzZjUyID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8zYWEyOGYzYTUzNTg0NDVjODFhYWRhMGI3YjA4M2Y1MiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgSWRhaG8gU3ByaW5ncyBDaGFtYmVyIE9mIENvbW1lcmNlIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlmNWFlY2JmOTNjNTRhMmM5ZDg3ZTg3NzZkZDNhNTZkLnNldENvbnRlbnQoaHRtbF8zYWEyOGYzYTUzNTg0NDVjODFhYWRhMGI3YjA4M2Y1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBkNzBlMjc0ZjI0NTQ2Y2NhYzJkMTYzYjgyMDFmN2YzLmJpbmRQb3B1cChwb3B1cF85ZjVhZWNiZjkzYzU0YTJjOWQ4N2U4Nzc2ZGQzYTU2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzcyNDJkMjA5YzZjMjQ1OWI4NDU1MDFhODg3NzY4NjMxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuMzExMDc2NCwtMTA1LjU5NDQxNTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY3NmEyODIyYmVkYTRjMjY5OWI0NjVjZDk5ZWU4OTE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzViZWQ4YzZlZGFlZjRiNzVhZWNjMmExMjE3NzU4OGM0ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF81YmVkOGM2ZWRhZWY0Yjc1YWVjYzJhMTIxNzc1ODhjNCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgRG93bnRvd24gTGFyYW1pZSBGYXJtZXImIzM5O3MgbWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3NmEyODIyYmVkYTRjMjY5OWI0NjVjZDk5ZWU4OTE2LnNldENvbnRlbnQoaHRtbF81YmVkOGM2ZWRhZWY0Yjc1YWVjYzJhMTIxNzc1ODhjNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzcyNDJkMjA5YzZjMjQ1OWI4NDU1MDFhODg3NzY4NjMxLmJpbmRQb3B1cChwb3B1cF82NzZhMjgyMmJlZGE0YzI2OTliNDY1Y2Q5OWVlODkxNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzJmMzNkZDM1NmY4ODQwYTNiZDJhM2YxYjYwM2RlNDMyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuMDk4NjY1MywtMTA0Ljk0MTI4MTNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RiOTU1ZDIzMDc2MTQ5NmZhN2ExZTNmOTQ4NzkwZDNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZhMDk4YzM4OTQ0MjQzYjlhODI4MjhlNTIzNTQyMDRkID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9mYTA5OGMzODk0NDI0M2I5YTgyODI4ZTUyMzU0MjA0ZCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgRnJlZGVyaWNrIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYjk1NWQyMzA3NjE0OTZmYTdhMWUzZjk0ODc5MGQzYi5zZXRDb250ZW50KGh0bWxfZmEwOThjMzg5NDQyNDNiOWE4MjgyOGU1MjM1NDIwNGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yZjMzZGQzNTZmODg0MGEzYmQyYTNmMWI2MDNkZTQzMi5iaW5kUG9wdXAocG9wdXBfZGI5NTVkMjMwNzYxNDk2ZmE3YTFlM2Y5NDg3OTBkM2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lYmMwZGY1OWJhNTc0ODQ2YmIyYjllMTQ1Mzg4YmU1OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjMzMDEzMjIsLTEwNC44NTQ0ODU3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMjZiNjgyMzQ2NzE0NThlYjkzYmU4N2MzZTQwMjQ0ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYTdiNWEwNWYyZmM0Y2E2YTcwOWJkYTA0ODUyZWZmZSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfY2E3YjVhMDVmMmZjNGNhNmE3MDliZGEwNDg1MmVmZmUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEpvaG5zdG93biBNaWxsaWtlbiBGYXJtZXImIzM5O3MgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyNmI2ODIzNDY3MTQ1OGViOTNiZTg3YzNlNDAyNDRlLnNldENvbnRlbnQoaHRtbF9jYTdiNWEwNWYyZmM0Y2E2YTcwOWJkYTA0ODUyZWZmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ViYzBkZjU5YmE1NzQ4NDZiYjJiOWUxNDUzODhiZTU4LmJpbmRQb3B1cChwb3B1cF8zMjZiNjgyMzQ2NzE0NThlYjkzYmU4N2MzZTQwMjQ0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2QzYmEzOWUxZGJmMDQyNjdhMGI4MmY2N2NkNzJiOTMyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuNjgyMTMzOCwtMTA1Ljk0OTA5MDhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZhMzBkNTc2OTZmMDRhZWRiMDgyOWJkMzI5Mjk5YzZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE1NzBlYzVmYjA1NjRkYjhhZGY2YTNlZWYyYzE1YTllID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8xNTcwZWM1ZmIwNTY0ZGI4YWRmNmEzZWVmMmMxNWE5ZSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgU2FudGEgRmUgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YTMwZDU3Njk2ZjA0YWVkYjA4MjliZDMyOTI5OWM2Yy5zZXRDb250ZW50KGh0bWxfMTU3MGVjNWZiMDU2NGRiOGFkZjZhM2VlZjJjMTVhOWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kM2JhMzllMWRiZjA0MjY3YTBiODJmNjdjZDcyYjkzMi5iaW5kUG9wdXAocG9wdXBfNmEzMGQ1NzY5NmYwNGFlZGIwODI5YmQzMjkyOTljNmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMWMyNzczYjYwZWM0NjA5YmIwYjU3MTIwZjEwOGU1MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM2LjM5NzUsLTEwNS41NzRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc4MDllM2E5YTNiNjRmNzhhY2IwNTJkYzE5ZWM3N2ZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU5OWE4YzRkZGYxYjQ0NzI4ZDMwNzRlYjExY2JlNDVjID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF81OTlhOGM0ZGRmMWI0NDcyOGQzMDc0ZWIxMWNiZTQ1YyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgVGFvcyBQdWVibG8gLSBSZWQgV2lsbG93IEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzgwOWUzYTlhM2I2NGY3OGFjYjA1MmRjMTllYzc3ZmQuc2V0Q29udGVudChodG1sXzU5OWE4YzRkZGYxYjQ0NzI4ZDMwNzRlYjExY2JlNDVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzFjMjc3M2I2MGVjNDYwOWJiMGI1NzEyMGYxMDhlNTEuYmluZFBvcHVwKHBvcHVwXzc4MDllM2E5YTNiNjRmNzhhY2IwNTJkYzE5ZWM3N2ZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWE0OGRlZGI5NzgxNDY3NmI1MTIxOTI4NjE0ZGU5MjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS4wOTcsLTEwNC44NjFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU5M2U2YTM3NGZhNTRiNmQ4Yjg2OTgwNzE0MWY3YTc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y5MjU4YzFlOTNlYTQ1NzRiM2EwZjE3MzZkZTk1OWE5ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9mOTI1OGMxZTkzZWE0NTc0YjNhMGYxNzM2ZGU5NTlhOSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgVGhlIE1hcmtldCBhdCBTdW5kYW5jZSBNb3VudGFpbiBMb2RnZTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81OTNlNmEzNzRmYTU0YjZkOGI4Njk4MDcxNDFmN2E3Ni5zZXRDb250ZW50KGh0bWxfZjkyNThjMWU5M2VhNDU3NGIzYTBmMTczNmRlOTU5YTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lYTQ4ZGVkYjk3ODE0Njc2YjUxMjE5Mjg2MTRkZTkyOC5iaW5kUG9wdXAocG9wdXBfNTkzZTZhMzc0ZmE1NGI2ZDhiODY5ODA3MTQxZjdhNzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNGZhYjUxMjUzYTc0YTJkYjg5NjdiOTNjMjllZjJlMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjA5OTMsLTEwNC44NzddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JiMWJjMTY0NjFmMTQzZWZhMDkzMDYwYTg4OWYxOTJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkyMTY4MDgzZWYwZDQzZTU5MTdiODI2NGY5NDg5ZDM3ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF85MjE2ODA4M2VmMGQ0M2U1OTE3YjgyNjRmOTQ4OWQzNyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgUGFsbWVyIExha2UgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYjFiYzE2NDYxZjE0M2VmYTA5MzA2MGE4ODlmMTkyYS5zZXRDb250ZW50KGh0bWxfOTIxNjgwODNlZjBkNDNlNTkxN2I4MjY0Zjk0ODlkMzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hNGZhYjUxMjUzYTc0YTJkYjg5NjdiOTNjMjllZjJlMS5iaW5kUG9wdXAocG9wdXBfYmIxYmMxNjQ2MWYxNDNlZmEwOTMwNjBhODg5ZjE5MmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83ZDRlNDY5ZDkxZGE0MWQyOTVkN2FjZTQ5ZTJhNjgwZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjAwNDQsLTEwNC43OTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI2NDNlMmEwYzYyMzQ1NTg5OWMxZTdmOGZiMWZiNTE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M3ZTk4NGI2MTQxZDRmMDdhYjMxNGFkZjZjMDQ1YzdjID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jN2U5ODRiNjE0MWQ0ZjA3YWIzMTRhZGY2YzA0NWM3YyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgTGliZXJ0eSBIZWlnaHRzIEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjY0M2UyYTBjNjIzNDU1ODk5YzFlN2Y4ZmIxZmI1MTUuc2V0Q29udGVudChodG1sX2M3ZTk4NGI2MTQxZDRmMDdhYjMxNGFkZjZjMDQ1YzdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfN2Q0ZTQ2OWQ5MWRhNDFkMjk1ZDdhY2U0OWUyYTY4MGUuYmluZFBvcHVwKHBvcHVwXzI2NDNlMmEwYzYyMzQ1NTg5OWMxZTdmOGZiMWZiNTE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjlkMWIyNmIyYTU3NDI0YjgzOTI5YmIwZTMzODBjMDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC4zOTI0ODEsLTEwNS4xMTY1NDRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M5NmQxYmJlMjRiYTRhYTc4ZDE4OTkzOTc3ODc5ZDA3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3NmQ4OWJiYzFjNjQ2YTI4OTE2YjM3MTg0YmYwMWFjID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9lNzZkODliYmMxYzY0NmEyODkxNmIzNzE4NGJmMDFhYyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgRmxvcmVuY2UgRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzk2ZDFiYmUyNGJhNGFhNzhkMTg5OTM5Nzc4NzlkMDcuc2V0Q29udGVudChodG1sX2U3NmQ4OWJiYzFjNjQ2YTI4OTE2YjM3MTg0YmYwMWFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjlkMWIyNmIyYTU3NDI0YjgzOTI5YmIwZTMzODBjMDAuYmluZFBvcHVwKHBvcHVwX2M5NmQxYmJlMjRiYTRhYTc4ZDE4OTkzOTc3ODc5ZDA3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGMxMDE3NGU2ZGMwNDVlNGJjMDI3OWI5YzlkYTgwNjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC4yNjUxLC0xMDQuNjEzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMTM2Y2I3NGIzMTI0MjFhODc5ZTUwMjk1ZWI3MTQxNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZDQ2MGU0ZjgzNWY0ODRiODdjZTBkYmYyOGUzN2UwNiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfN2Q0NjBlNGY4MzVmNDg0Yjg3Y2UwZGJmMjhlMzdlMDYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEV2ZW5pbmcgRmFybWVyJiMzOTtzIE1hcmtldCBvbiB0aGUgUml2ZXJ3YWxrPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxMzZjYjc0YjMxMjQyMWE4NzllNTAyOTVlYjcxNDE1LnNldENvbnRlbnQoaHRtbF83ZDQ2MGU0ZjgzNWY0ODRiODdjZTBkYmYyOGUzN2UwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRjMTAxNzRlNmRjMDQ1ZTRiYzAyNzliOWM5ZGE4MDYzLmJpbmRQb3B1cChwb3B1cF9iMTM2Y2I3NGIzMTI0MjFhODc5ZTUwMjk1ZWI3MTQxNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZkOTYyMDAyY2U5YTQ4M2VhZmY3MTkxNGQ1MGVhZTUyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguNzk0NjEyNiwtMTA0LjgzMzYxODZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0NzRjNGZkOGRmZDRkOWU4OTgwMWU4OWQ2ZDhmYjI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiNDNlY2JhYWNkNTQyMDY4N2UzMWI4ZDJiZDIxMmFiID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8wYjQzZWNiYWFjZDU0MjA2ODdlMzFiOGQyYmQyMTJhYiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQnJvYWRtb29yIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0NzRjNGZkOGRmZDRkOWU4OTgwMWU4OWQ2ZDhmYjI5LnNldENvbnRlbnQoaHRtbF8wYjQzZWNiYWFjZDU0MjA2ODdlMzFiOGQyYmQyMTJhYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZkOTYyMDAyY2U5YTQ4M2VhZmY3MTkxNGQ1MGVhZTUyLmJpbmRQb3B1cChwb3B1cF85NDc0YzRmZDhkZmQ0ZDllODk4MDFlODlkNmQ4ZmIyOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2MyYWVkZGYzNjhiYzQ2NzI5ODVlYjE0MjRkMmUyYmZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguODI0NjczLC0xMDQuODQwODU2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYmNlMDU5MGNjN2Y0OTkyOTdiMzY3MDEwNzYwZWFiYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYTUxMjM2ZTI5ZmE0MWM5YmI4NDA0OTdhYzczMzU2ZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYWE1MTIzNmUyOWZhNDFjOWJiODQwNDk3YWM3MzM1NmYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEJyaWFyZ2F0ZSBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYmNlMDU5MGNjN2Y0OTkyOTdiMzY3MDEwNzYwZWFiYS5zZXRDb250ZW50KGh0bWxfYWE1MTIzNmUyOWZhNDFjOWJiODQwNDk3YWM3MzM1NmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jMmFlZGRmMzY4YmM0NjcyOTg1ZWIxNDI0ZDJlMmJmZS5iaW5kUG9wdXAocG9wdXBfMWJjZTA1OTBjYzdmNDk5Mjk3YjM2NzAxMDc2MGVhYmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84NGZiZjg3Y2Q2NjM0ZjNlYjYwODlmOTBiMjNjYjVhZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjgyNDY3MywtMTA0Ljg0MDg1Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTZlMDJjNWE0Yjc2NGQyOTg0MTE3NjFmZWQwZWJjZTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTY1Mjc3ZjNlZmRjNDk3NzlkZGZhYTJhMjgyZGJkYzcgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzE2NTI3N2YzZWZkYzQ5Nzc5ZGRmYWEyYTI4MmRiZGM3IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBNb251bWVudCBIaWxsIEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTZlMDJjNWE0Yjc2NGQyOTg0MTE3NjFmZWQwZWJjZTYuc2V0Q29udGVudChodG1sXzE2NTI3N2YzZWZkYzQ5Nzc5ZGRmYWEyYTI4MmRiZGM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODRmYmY4N2NkNjYzNGYzZWI2MDg5ZjkwYjIzY2I1YWYuYmluZFBvcHVwKHBvcHVwXzE2ZTAyYzVhNGI3NjRkMjk4NDExNzYxZmVkMGViY2U2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWY4MzA1YmU2OGY4NDhjZjg4MDc0NzNiMTgxZTBhMTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi45MDIwNDgyLC0xMDQuNDM4MjI4MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjBkNWIyZTM0MWJlNGZkNGE2YzhjYzRiMTBkMGQwMzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzZkMWRhZWM5MzE4NGJmOGE2MmJjNWRmZDU1YmU1YzAgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzM2ZDFkYWVjOTMxODRiZjhhNjJiYzVkZmQ1NWJlNWMwIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBGaXJzdCBTdHJlZXQgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YwZDViMmUzNDFiZTRmZDRhNmM4Y2M0YjEwZDBkMDMzLnNldENvbnRlbnQoaHRtbF8zNmQxZGFlYzkzMTg0YmY4YTYyYmM1ZGZkNTViZTVjMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzlmODMwNWJlNjhmODQ4Y2Y4ODA3NDczYjE4MWUwYTExLmJpbmRQb3B1cChwb3B1cF9mMGQ1YjJlMzQxYmU0ZmQ0YTZjOGNjNGIxMGQwZDAzMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzRiNzRlMWVmNWU4NjRlMDA5MzljMjUzNTRjMmJiOThjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMzc0MTI3LC0xMDUuNDUwMTI1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NjhkYzU3NDZiOTc0YmRmOWY4NDUyODlkMWFkZGMyOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZDM2OTNlYTkwZTY0ZjU1YjA4OGY3OWQ5NGYyYzAwYSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYmQzNjkzZWE5MGU2NGY1NWIwODhmNzlkOTRmMmMwMGEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEVsIFZhbGxlIEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTY4ZGM1NzQ2Yjk3NGJkZjlmODQ1Mjg5ZDFhZGRjMjkuc2V0Q29udGVudChodG1sX2JkMzY5M2VhOTBlNjRmNTViMDg4Zjc5ZDk0ZjJjMDBhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGI3NGUxZWY1ZTg2NGUwMDkzOWMyNTM1NGMyYmI5OGMuYmluZFBvcHVwKHBvcHVwXzk2OGRjNTc0NmI5NzRiZGY5Zjg0NTI4OWQxYWRkYzI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjU0NmNiODJhNGJhNDk4ZGFlMmFjNTQxNGY0ODNmNDQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS45ODc5LC0xMDQuODIxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYzMyYjU3OWY3M2U0ZDE2OWZjMWMxNjRlNTBkMzE5OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMDg4YTgwMjczZmY0NGNlOGM2NDM2YmExZTcxMzE4NyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMjA4OGE4MDI3M2ZmNDRjZThjNjQzNmJhMWU3MTMxODciICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEJyaWdodG9uIERvd250b3duIFNhdHVyZGF5IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYzMyYjU3OWY3M2U0ZDE2OWZjMWMxNjRlNTBkMzE5OC5zZXRDb250ZW50KGh0bWxfMjA4OGE4MDI3M2ZmNDRjZThjNjQzNmJhMWU3MTMxODcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yNTQ2Y2I4MmE0YmE0OThkYWUyYWM1NDE0ZjQ4M2Y0NC5iaW5kUG9wdXAocG9wdXBfZGMzMmI1NzlmNzNlNGQxNjlmYzFjMTY0ZTUwZDMxOTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zNTZmY2QyMDNmZTE0NTgxOTVhMTdmODNlZmFhMTk5MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjkwNjE2MywtMTA0LjgxNzI3NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDI5NWNhMDI0NTcxNDk4NWJlZDRmY2Y3NTlhMmRlMGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWYwNjg5ZjQ3NzdjNDM0YmJlNWM1YzM1YTk1N2FiOTMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2FmMDY4OWY0Nzc3YzQzNGJiZTVjNWMzNWE5NTdhYjkzIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IFZpbGxhZ2UgQ29sb3JhZG8gRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDI5NWNhMDI0NTcxNDk4NWJlZDRmY2Y3NTlhMmRlMGMuc2V0Q29udGVudChodG1sX2FmMDY4OWY0Nzc3YzQzNGJiZTVjNWMzNWE5NTdhYjkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzU2ZmNkMjAzZmUxNDU4MTk1YTE3ZjgzZWZhYTE5OTEuYmluZFBvcHVwKHBvcHVwXzQyOTVjYTAyNDU3MTQ5ODViZWQ0ZmNmNzU5YTJkZTBjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzcxZmIwMzNlMjRkNGUzNmI5ZTcxYTVmNjgzNWU0MTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS43MTkwMjY5LC0xMDQuODk2OTUzNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWYwY2RmYzJkMTRjNDU5MDllNmZlNGVlM2VkOWE3ZDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2EwZmEyOGQyYmQzNGI2ODhkNTM1OTRjOTg0Y2Y4ZWYgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzdhMGZhMjhkMmJkMzRiNjg4ZDUzNTk0Yzk4NGNmOGVmIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBMb3dyeSBGYXJtZXJzJiMzOTsgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFmMGNkZmMyZDE0YzQ1OTA5ZTZmZTRlZTNlZDlhN2QwLnNldENvbnRlbnQoaHRtbF83YTBmYTI4ZDJiZDM0YjY4OGQ1MzU5NGM5ODRjZjhlZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM3MWZiMDMzZTI0ZDRlMzZiOWU3MWE1ZjY4MzVlNDEzLmJpbmRQb3B1cChwb3B1cF8xZjBjZGZjMmQxNGM0NTkwOWU2ZmU0ZWUzZWQ5YTdkMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzIxNWExNjgyYTNlMjQxOWRhNTNkYzAyZWRjYWUwNDA2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNjE4NSwtMTA0Ljc3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YzZmNTM4ZWQ0NjA0ODljOGI1YzJlNDMzYWI0MDUwNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMDkxZjc5ZDBkMjE0NTc5YWIwMzBmMzQxMTE3NzNmNiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMDA5MWY3OWQwZDIxNDU3OWFiMDMwZjM0MTExNzczZjYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFNvdXRobGFuZHMgRmFybWVyJiMzOTtzIE1hcmtldCA8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2M2ZjUzOGVkNDYwNDg5YzhiNWMyZTQzM2FiNDA1MDQuc2V0Q29udGVudChodG1sXzAwOTFmNzlkMGQyMTQ1NzlhYjAzMGYzNDExMTc3M2Y2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjE1YTE2ODJhM2UyNDE5ZGE1M2RjMDJlZGNhZTA0MDYuYmluZFBvcHVwKHBvcHVwXzdjNmY1MzhlZDQ2MDQ4OWM4YjVjMmU0MzNhYjQwNTA0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2ViYzZmZmUxYmIxNDBmNzlmMjJjN2ZiMzFkN2Q5MDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMy43NDc5LC0xMDUuNzM2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NGExMTQwZmM0MjM0N2U2Yjg0OGM2MDg1ZWFjZGExNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMmNkZWEyMTc5ZTI0NTdjYWZjY2RlODQzZjlmNWYxMCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZDJjZGVhMjE3OWUyNDU3Y2FmY2NkZTg0M2Y5ZjVmMTAiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFJhc2NhbCBGYWlyL1doaXRlIE9ha3MgQ29tbXVuaXR5IE1hcmtldCA8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDRhMTE0MGZjNDIzNDdlNmI4NDhjNjA4NWVhY2RhMTUuc2V0Q29udGVudChodG1sX2QyY2RlYTIxNzllMjQ1N2NhZmNjZGU4NDNmOWY1ZjEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2ViYzZmZmUxYmIxNDBmNzlmMjJjN2ZiMzFkN2Q5MDUuYmluZFBvcHVwKHBvcHVwXzQ0YTExNDBmYzQyMzQ3ZTZiODQ4YzYwODVlYWNkYTE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjdiODAyZWM2MDIwNGMwMTgwMGQwMmZhODgxNjAzZjQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMy41NDU1LC0xMDUuNTczXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNjNmMjczY2EwZTA0Yzk0YTk1MTI4ODIwM2E3M2Q0MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xODg1YjllZGE2ZDI0ZThmOWI5ZjkxMGMyNDcxZTNmZSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMTg4NWI5ZWRhNmQyNGU4ZjliOWY5MTBjMjQ3MWUzZmUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEFUQUNzIENhcGl0YW4gRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDYzZjI3M2NhMGUwNGM5NGE5NTEyODgyMDNhNzNkNDIuc2V0Q29udGVudChodG1sXzE4ODViOWVkYTZkMjRlOGY5YjlmOTEwYzI0NzFlM2ZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjdiODAyZWM2MDIwNGMwMTgwMGQwMmZhODgxNjAzZjQuYmluZFBvcHVwKHBvcHVwXzA2M2YyNzNjYTBlMDRjOTRhOTUxMjg4MjAzYTczZDQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjg5Zjk0ZjNkZTUyNDhhOWJkMDI3NGJhMGRhYWZmM2YgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS4zNzIyNzU1LC0xMDQuODYwMDI5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjM3NTBiNDI3ZWUyNDc1MjgxZmM3NGU2YTg0M2FkOTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzBiMDBiNzAzYWM5NGMwZDljZGEyNjhkZmQzYzgzZWUgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzMwYjAwYjcwM2FjOTRjMGQ5Y2RhMjY4ZGZkM2M4M2VlIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYXN0bGUgUm9jayBGYXJtZXJzIE1hcmtldCwgYWthIFBsdW0gQ3JlZWsgVmFsbGV5IEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YzNzUwYjQyN2VlMjQ3NTI4MWZjNzRlNmE4NDNhZDkyLnNldENvbnRlbnQoaHRtbF8zMGIwMGI3MDNhYzk0YzBkOWNkYTI2OGRmZDNjODNlZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI4OWY5NGYzZGU1MjQ4YTliZDAyNzRiYTBkYWFmZjNmLmJpbmRQb3B1cChwb3B1cF9mMzc1MGI0MjdlZTI0NzUyODFmYzc0ZTZhODQzYWQ5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2QyMTdmNjBhMGY3NTRkYTI5NzcxOGJjMTQyYzZjZWY1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuMTk3NDg3LC0xMDUuODg3MzQzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMDdiZmMwYzZmMGI0YmIxOWNlZjBlNTFkZjQ1MzM5NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jOTA1ZjYwOGM1MDU0OWIzOGEyNWEwYzUxNzMyOTRhYyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYzkwNWY2MDhjNTA1NDliMzhhMjVhMGM1MTczMjk0YWMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIERpeG9uIEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTA3YmZjMGM2ZjBiNGJiMTljZWYwZTUxZGY0NTMzOTQuc2V0Q29udGVudChodG1sX2M5MDVmNjA4YzUwNTQ5YjM4YTI1YTBjNTE3MzI5NGFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDIxN2Y2MGEwZjc1NGRhMjk3NzE4YmMxNDJjNmNlZjUuYmluZFBvcHVwKHBvcHVwX2UwN2JmYzBjNmYwYjRiYjE5Y2VmMGU1MWRmNDUzMzk0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2VlM2QyMDg0YThiNDNkN2FkMWU4Nzg0YzBhNDRjMjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMi40MjAyMzUsLTEwNC4yMjg0NTRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk1N2YwYzg5MmY3NDQ3NzM5NjA4ZTBkNGU1MWZjM2EyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxNWViNTU4ZGQ5ZTQxZTJiZGU4OTY0OTY3NjE2MjNlID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF80MTVlYjU1OGRkOWU0MWUyYmRlODk2NDk2NzYxNjIzZSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FybHNiYWQgRG93bnRvd24gRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NTdmMGM4OTJmNzQ0NzczOTYwOGUwZDRlNTFmYzNhMi5zZXRDb250ZW50KGh0bWxfNDE1ZWI1NThkZDllNDFlMmJkZTg5NjQ5Njc2MTYyM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZWUzZDIwODRhOGI0M2Q3YWQxZTg3ODRjMGE0NGMyOC5iaW5kUG9wdXAocG9wdXBfOTU3ZjBjODkyZjc0NDc3Mzk2MDhlMGQ0ZTUxZmMzYTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wNjA0MTZhYzI0ZGY0YWRmYjQ3MjI2ODZjNWJjYmQ5NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjUzNjEyLC0xMDUuODkwNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmU5ZGRiY2RmOTdkNGUyNzk1OWNhMjFlMWU0YWVlMzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjhiNWVjNjQ5YmU1NDQ2M2E3ZWE5MDcxMTQwYzgwYjkgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzI4YjVlYzY0OWJlNTQ0NjNhN2VhOTA3MTE0MGM4MGI5IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBFbGRvcmFkbyBGYXJtZXJzJiMzOTsgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJlOWRkYmNkZjk3ZDRlMjc5NTljYTIxZTFlNGFlZTMzLnNldENvbnRlbnQoaHRtbF8yOGI1ZWM2NDliZTU0NDYzYTdlYTkwNzExNDBjODBiOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA2MDQxNmFjMjRkZjRhZGZiNDcyMjY4NmM1YmNiZDk0LmJpbmRQb3B1cChwb3B1cF8yZTlkZGJjZGY5N2Q0ZTI3OTU5Y2EyMWUxZTRhZWUzMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzEyNjg2YjRhNGM0NzQ5YWE4MmFhYzAxZjFjMjZlYWU4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguOTkzNDgzLC0xMDUuMDU2OTE2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mODY2Mzk4MDIwZjY0Mjc5YjI3ZGIwZmVkZTY5ZGJhMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMzhjYmYyNWJlMzI0MGJhYTkyNzI3NTM5OTE3M2IyYiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZTM4Y2JmMjViZTMyNDBiYWE5MjcyNzUzOTkxNzNiMmIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFdvb2RsYW5kIFBhcmsgRmFybWVycyYjMzk7IE1hcmtldCAtIFN1bW1lcjwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mODY2Mzk4MDIwZjY0Mjc5YjI3ZGIwZmVkZTY5ZGJhMi5zZXRDb250ZW50KGh0bWxfZTM4Y2JmMjViZTMyNDBiYWE5MjcyNzUzOTkxNzNiMmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xMjY4NmI0YTRjNDc0OWFhODJhYWMwMWYxYzI2ZWFlOC5iaW5kUG9wdXAocG9wdXBfZjg2NjM5ODAyMGY2NDI3OWIyN2RiMGZlZGU2OWRiYTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82MzUxYTI3MjMwMTE0NmQ1YjQ5NzdlN2VlMjk5ZGY3NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjQyMjcxNSwtMTA0LjY4OTkyN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGJiODY4ZTA4NTgyNDc1MzgxZGI3N2I4OGIzNzIxOTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGY5OGJmNWNiYjVkNDFlZWEzNTg4MTAwOWNiZTdlNWEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzBmOThiZjVjYmI1ZDQxZWVhMzU4ODEwMDljYmU3ZTVhIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBHcmVlbGV5IFdpbnRlciBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGJiODY4ZTA4NTgyNDc1MzgxZGI3N2I4OGIzNzIxOTEuc2V0Q29udGVudChodG1sXzBmOThiZjVjYmI1ZDQxZWVhMzU4ODEwMDljYmU3ZTVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjM1MWEyNzIzMDExNDZkNWI0OTc3ZTdlZTI5OWRmNzUuYmluZFBvcHVwKHBvcHVwXzRiYjg2OGUwODU4MjQ3NTM4MWRiNzdiODhiMzcyMTkxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzI3ODM2ZjliYTNhNGFmYWEyNWZiZTM5Yzg3NmRmMTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi40Mzg2LC0xMDUuNTQ0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMGZjMWQzYTA4YWI0ZjNhYTA1Yzg4YmRmZTQzM2Y5YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNTJhMTI3ZmRhYzY0NTgxOWM0MmYwNjM4YzVhOTc4NiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZTUyYTEyN2ZkYWM2NDU4MTljNDJmMDYzOGM1YTk3ODYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFJlZCBXaWxsb3cgRmFybWVycyBNYXJrZXQgPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IwZmMxZDNhMDhhYjRmM2FhMDVjODhiZGZlNDMzZjliLnNldENvbnRlbnQoaHRtbF9lNTJhMTI3ZmRhYzY0NTgxOWM0MmYwNjM4YzVhOTc4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzcyNzgzNmY5YmEzYTRhZmFhMjVmYmUzOWM4NzZkZjE2LmJpbmRQb3B1cChwb3B1cF9iMGZjMWQzYTA4YWI0ZjNhYTA1Yzg4YmRmZTQzM2Y5Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E1YWU2OTg5MjE4OTQ5OTg5NjRlN2E0NTkyZWJlNjJlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuMzA1MzI5LC0xMDUuMDgyNjM2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NjhmZGMwNWMwZGU0MTFkODgwOTJiZjdlMzYxNDVmNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYzgwN2JkMmJhOWI0NDMyODNlYmNkOTgwYzI1YzE1ZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMmM4MDdiZDJiYTliNDQzMjgzZWJjZDk4MGMyNWMxNWYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEJlcnRob3VkIExvY2FsIEZhcm1lcnMgTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU2OGZkYzA1YzBkZTQxMWQ4ODA5MmJmN2UzNjE0NWY3LnNldENvbnRlbnQoaHRtbF8yYzgwN2JkMmJhOWI0NDMyODNlYmNkOTgwYzI1YzE1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E1YWU2OTg5MjE4OTQ5OTg5NjRlN2E0NTkyZWJlNjJlLmJpbmRQb3B1cChwb3B1cF81NjhmZGMwNWMwZGU0MTFkODgwOTJiZjdlMzYxNDVmNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzNiMWM3ZGQ1MWVkYjRjYWE4OTlhZTYzNmU2MWQ0ZDBjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguOTk0NzMzLC0xMDUuMDUxNTUxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfZjJhNGEwOWZmMjcxNGQ1ZDgyOWJkZGY2M2Q2MDYwZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZDhjOGUzYjQwNTg0YWNlOTI3OTg0MDc4NTZkYjc4ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85OWE1N2NkM2FjNDA0YTU3ODExYmY0YWY5NDkwNTk5YiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOTlhNTdjZDNhYzQwNGE1NzgxMWJmNGFmOTQ5MDU5OWIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFdvb2RsYW5kIFBhcmsgRmFybWVycyYjMzk7IE1hcmtldCAtIFdpbnRlcjwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZDhjOGUzYjQwNTg0YWNlOTI3OTg0MDc4NTZkYjc4ZC5zZXRDb250ZW50KGh0bWxfOTlhNTdjZDNhYzQwNGE1NzgxMWJmNGFmOTQ5MDU5OWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zYjFjN2RkNTFlZGI0Y2FhODk5YWU2MzZlNjFkNGQwYy5iaW5kUG9wdXAocG9wdXBfNWQ4YzhlM2I0MDU4NGFjZTkyNzk4NDA3ODU2ZGI3OGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81MTk0NDZmMDNiZWI0YjUyYjUwMmVhNDdkMTVkOThiNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjgwMDEzOCwtMTA1LjA4MTQ1NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWZmZDc1NWEzMjY5NGRiMjgyZGYxYmQ0ZDZmZWZkMGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDU0ZDM4ZmJiODJiNDIyN2I0NmE1MDJmYTc3M2JkMGIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2Q1NGQzOGZiYjgyYjQyMjdiNDZhNTAyZmE3NzNiZDBiIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBBcnZhZGEgRmFybWVycyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWZmZDc1NWEzMjY5NGRiMjgyZGYxYmQ0ZDZmZWZkMGUuc2V0Q29udGVudChodG1sX2Q1NGQzOGZiYjgyYjQyMjdiNDZhNTAyZmE3NzNiZDBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTE5NDQ2ZjAzYmViNGI1MmI1MDJlYTQ3ZDE1ZDk4YjcuYmluZFBvcHVwKHBvcHVwXzlmZmQ3NTVhMzI2OTRkYjI4MmRmMWJkNGQ2ZmVmZDBlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODhlZTBmNDJiMDcwNDgwY2FlNzRkMTgwZTExZjVkZmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS45MzAxLC0xMDUuNzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwZjU1Y2I1ZjZlZjQ1OGQ5NDhjYWJhN2ZkZTdkODFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JhOTBlODZlZjNlZDQzZWJiZGIyYzA0NmM1NGI2MDlkID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9iYTkwZTg2ZWYzZWQ0M2ViYmRiMmMwNDZjNTRiNjA5ZCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgR3JhbmQgUGFyayBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MGY1NWNiNWY2ZWY0NThkOTQ4Y2FiYTdmZGU3ZDgxZC5zZXRDb250ZW50KGh0bWxfYmE5MGU4NmVmM2VkNDNlYmJkYjJjMDQ2YzU0YjYwOWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84OGVlMGY0MmIwNzA0ODBjYWU3NGQxODBlMTFmNWRmZi5iaW5kUG9wdXAocG9wdXBfNTBmNTVjYjVmNmVmNDU4ZDk0OGNhYmE3ZmRlN2Q4MWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xN2Y2MWU0NzYwMDI0MzQ0OTAzMjA0ZGE0YmVjMTRjZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjcxMTQyOSwtMTA1LjA5OTQ5Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjE4MDM3YTY2MmFmNDM1YTg2NWU1MjQyMjg1NjQ0NTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODAxZmU1ZTZlY2NjNDljZGEwMzhjNGRkMjBhODI3M2EgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzgwMWZlNWU2ZWNjYzQ5Y2RhMDM4YzRkZDIwYTgyNzNhIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBMYWtld29vZCBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMTgwMzdhNjYyYWY0MzVhODY1ZTUyNDIyODU2NDQ1NS5zZXRDb250ZW50KGh0bWxfODAxZmU1ZTZlY2NjNDljZGEwMzhjNGRkMjBhODI3M2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xN2Y2MWU0NzYwMDI0MzQ0OTAzMjA0ZGE0YmVjMTRjZC5iaW5kUG9wdXAocG9wdXBfZjE4MDM3YTY2MmFmNDM1YTg2NWU1MjQyMjg1NjQ0NTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80MjhhZmVhNzM4MTg0YjUyODBiMjM2Y2Y4NDZmMTYwYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjcxNzcwOCwtMTA0Ljk1ODgyN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjBmNTJmMjgwYzczNDM2YTliZGUzNDNkYzdjM2IwMGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGVlZGNlZDc5YjQ0NGY1YWE3YjY4MTY2MjYyMmY4ZjEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2RlZWRjZWQ3OWI0NDRmNWFhN2I2ODE2NjI2MjJmOGYxIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDaGVycnkgQ3JlZWsgRnJlc2ggTWFya2V0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIwZjUyZjI4MGM3MzQzNmE5YmRlMzQzZGM3YzNiMDBhLnNldENvbnRlbnQoaHRtbF9kZWVkY2VkNzliNDQ0ZjVhYTdiNjgxNjYyNjIyZjhmMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQyOGFmZWE3MzgxODRiNTI4MGIyMzZjZjg0NmYxNjBjLmJpbmRQb3B1cChwb3B1cF8yMGY1MmYyODBjNzM0MzZhOWJkZTM0M2RjN2MzYjAwYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzg1MGRhMTFlYzU1YjQ2MjRhYjkwMTE3MjNiYTUxODE3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuMTMxOTc4LC0xMDQuODE0MjJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZjMDgyOWNhYjI2MzQzZTI5NjIxNGYyNDI2OGY4NjE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NjNjEyNTJhZGNhMDQwYjI5NTIxZGI1MDk3NjBhNDRkID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jYzYxMjUyYWRjYTA0MGIyOTUyMWRiNTA5NzYwYTQ0ZCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2hleWVubmUgV2ludGVyIEZhcm1lcnMmIzM5OyBNYXJrZXQ8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmMwODI5Y2FiMjYzNDNlMjk2MjE0ZjI0MjY4Zjg2MTUuc2V0Q29udGVudChodG1sX2NjNjEyNTJhZGNhMDQwYjI5NTIxZGI1MDk3NjBhNDRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODUwZGExMWVjNTViNDYyNGFiOTAxMTcyM2JhNTE4MTcuYmluZFBvcHVwKHBvcHVwXzZjMDgyOWNhYjI2MzQzZTI5NjIxNGYyNDI2OGY4NjE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDEyN2Y3ZGUwYjc3NDZlMDlmOTQzMmVhOWZmZWM2ZGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy40NjgzNTksLTEwNS44NjUyMzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9mMmE0YTA5ZmYyNzE0ZDVkODI5YmRkZjYzZDYwNjBlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VhYWQ4YTE3NDMwNDQ1Mzc5YjJkZmMwMjQzMzQ2YWJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjZWEwZTQ5ZmQ0ZjRhMzI5YTJkNjVkMDI4ZmY0ZWQzID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9hY2VhMGU0OWZkNGY0YTMyOWEyZDY1ZDAyOGZmNGVkMyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQWxhbW9zYSBGYXJtZXJzIE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYWFkOGExNzQzMDQ0NTM3OWIyZGZjMDI0MzM0NmFiYS5zZXRDb250ZW50KGh0bWxfYWNlYTBlNDlmZDRmNGEzMjlhMmQ2NWQwMjhmZjRlZDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wMTI3ZjdkZTBiNzc0NmUwOWY5NDMyZWE5ZmZlYzZkYS5iaW5kUG9wdXAocG9wdXBfZWFhZDhhMTc0MzA0NDUzNzliMmRmYzAyNDMzNDZhYmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NTc3YjBmMTNlNTM0MTM5OTExY2U4NzY5YzY2YTg4MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5Ljg2OCwtMTA0Ljk3Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2YyYTRhMDlmZjI3MTRkNWQ4MjliZGRmNjNkNjA2MGVjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDZiY2VjM2VkMTgwNGFhNDlkMzUzNWZlMTQ5MGVhNTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzdhYTdjZTM4YzM1NGI4ZmI4ZjE4ZDQ0MjcwZTEwZWEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2M3YWE3Y2UzOGMzNTRiOGZiOGYxOGQ0NDI3MGUxMGVhIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBMYXJrcmlkZ2UgRmFybWVycyYjMzk7IE1hcmtldDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNmJjZWMzZWQxODA0YWE0OWQzNTM1ZmUxNDkwZWE1Ni5zZXRDb250ZW50KGh0bWxfYzdhYTdjZTM4YzM1NGI4ZmI4ZjE4ZDQ0MjcwZTEwZWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NTc3YjBmMTNlNTM0MTM5OTExY2U4NzY5YzY2YTg4MC5iaW5kUG9wdXAocG9wdXBfZDZiY2VjM2VkMTgwNGFhNDlkMzUzNWZlMTQ5MGVhNTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAg" style="position:absolute;width:100%;height:100%;left:0;top:0;"></iframe></div></div> </div> </div> </div> </div> </div></section></section><section><section> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="7.-The-community-...">7. The community ...<a class="anchor-link" href="#7.-The-community-...">¶</a></h1><p><img src="assets/pycommunity.png"/></p> </div> </div> </div></section></section><section><section> <div class="cell border-box-sizing text_cell rendered"> <div class="prompt input_prompt"> </div> <div class="inner_cell"> <div class="text_cell_render border-box-sizing rendered_html"> <h1 id="Now-go-play-...">Now go play ...<a class="anchor-link" href="#Now-go-play-...">¶</a></h1><p><img src="assets/8569018622_93efb5cd7e_z.jpg"/> <!-- https://www.flickr.com/photos/46990836@N03/8569018622/in/photolist-e4dsGo-e4drbm-ag5WKD-4caGzy-7eTkzp-e4drTN-6kZ1AA-67Fq7C-4qvUeL-dFvk86-dFvkLz-p8N5aV-dx8z1d-62VbU4-dFALqN-4u1EWE-dFvmhk-dFALQS-dFALm5-hUL8ph-7cLTsy-9dGKeF-dFvkuP-dFALJ9-avVtdr-dFvjAv-dtR8k8-5QLb27-dFvkTe-8fpxyQ-4hTwhD-pMuBbQ-9qVf2B-9hgixi-peV9SM-ikEv1x-j1bLt-7u5Hi4-6mPrUi-aq5Hkg-dFAK8y-bSyrsR-dFAKML-7cLTsC-54ruRw-o2iGon-4jQBiE-5W7z2-ooTY-b9sTqZ --></p> </div> </div> </div></section></section> </div> </div> <script> require( { // it makes sense to wait a little bit when you are loading // reveal from a cdn in a slow connection environment waitSeconds: 15 }, [ "http://cdn.jsdelivr.net/reveal.js/3.0.0/lib/js/head.min.js", "http://cdn.jsdelivr.net/reveal.js/3.0.0/js/reveal.js" ], function(head, Reveal){ // Full list of configuration options available here: https://github.com/hakimel/reveal.js#configuration Reveal.initialize({ controls: true, progress: true, history: true, theme: Reveal.getQueryHash().theme, // available themes are in /css/theme transition: Reveal.getQueryHash().transition || 'linear', // default/cube/page/concave/zoom/linear/none // Optional libraries used to extend on reveal.js dependencies: [ { src: "http://cdn.jsdelivr.net/reveal.js/3.0.0/lib/js/classList.js", condition: function() { return !document.body.classList; } }, { src: "http://cdn.jsdelivr.net/reveal.js/3.0.0/plugin/notes/notes.js", async: true, condition: function() { return !!document.body.classList; } } ] }); var update = function(event){ if(MathJax.Hub.getAllJax(Reveal.getCurrentSlide())){ MathJax.Hub.Rerender(Reveal.getCurrentSlide()); } }; Reveal.addEventListener('slidechanged', update); var update_scroll = function(event){ $(".reveal").scrollTop(0); }; Reveal.addEventListener('slidechanged', update_scroll); } ); </script> </body> </html>